Onlinevorhersagen abrufen

Die Onlinevorhersage von AI Platform ist ein Dienst, der dahingehend optimiert ist, Ihre Daten mit so wenig Latenz wie möglich durch gehostete Modelle zu verarbeiten. Sie senden kleinere Mengen von Daten an den Dienst und dieser gibt in der Antwort Ihre Vorhersagen zurück.

Informationen dazu finden Sie unter Onlinevorhersage im Vergleich mit Batchvorhersage und Vorhersageüberblick.

Vorbereitung

Für die Anforderung von Vorhersagen müssen Sie zuerst folgende Schritte ausführen:

Regionen

Die Onlinevorhersage mit AI Platform ist derzeit in folgenden Regionen verfügbar:

  • us-central1
  • us-east1
  • us-east4
  • asia-northeast1
  • europe-west1

Compute Engine-Maschinentypen (N1) für die Onlinevorhersage (Beta) sind nur in us-central1 verfügbar.

Ausführliche Informationen zu den verfügbaren Regionen für die Trainings- und Vorhersagedienste von AI Platform finden Sie unter Regionen.

Modelle und Versionen erstellen

Beachten Sie, dass Sie die Art und Weise, in der Onlinevorhersagen ausgeführt werden, nur bei der Erstellung der Modell- und Versionsressourcen festlegen können:

Erstellte Ressource Einstellungen bei der Ressourcenerstellung
Modell Region für die Ausführung von Vorhersagen
Modell Logging von Onlinevorhersagen aktivieren
Version Zu verwendende Laufzeitversion
Version Benötigte Python-Version
Version Benötigter Maschinentyp für die Onlinevorhersage

Nachdem Sie das Modell oder die Version erstellt haben, können Sie die oben aufgeführten Einstellungen nicht mehr ändern. Wenn Sie die Einstellungen ändern möchten, müssen Sie ein neues Modell oder eine neue Versionsressource mit den neuen Einstellungen erstellen und Ihr Modell noch einmal bereitstellen.

Verfügbare Maschinentypen für die Onlinevorhersage

Bei der Erstellung einer Version können Sie den Typ der virtuellen Maschine auswählen, den AI Platform Prediction für Knoten zur Onlinevorhersage verwenden soll. Weitere Informationen finden Sie auf der Seite zur Auswahl von Maschinentypen.

Logs für Onlinevorhersageanfragen anfordern

Der AI Platform-Vorhersagedienst protokolliert standardmäßig keine Informationen zu Anfragen, da Logs kostenpflichtig sind. Onlinevorhersagen mit einer hohen Abfragerate pro Sekunde können zu einer erheblichen Anzahl von Logs führen, für die Stackdriver-Preise oder BigQuery-Preise berechnet werden.

Wenn Sie das Onlinevorhersage-Logging aktivieren möchten, müssen Sie es bei der Erstellung einer Modellressource oder bei der Erstellung einer Modellversionsressource konfigurierén, je nachdem, welche Art von Logging verwendet werden soll. Es gibt drei Logging-Arten, die Sie unabhängig voneinander aktivieren können:

  • Zugriffs-Logging: Erfasst Loginformationen wie Zeitstempel und Latenz für jede Anfrage an Stackdriver Logging.

    Sie können das Zugriffs-Logging beim Erstellen einer Modellressource aktivieren.

  • Stream-Logging: Protokolliert die stderr- und stdout-Streams von Ihren Vorhersageknoten in Stackdriver Logging. Dies kann für die Fehlerbehebung hilfreich sein. Diese Art des Loggings befindet sich in der Betaphase und wird nicht von Compute Engine-Maschinentypen {N1) unterstützt.

    Sie können das Stream-Logging beim Erstellen einer Modellressource aktivieren.

  • Anfrage-/Antwort-Logging: Protokolliert eine Stichprobe von Onlinevorhersageanfragen und -antworten in einer BigQuery-Tabelle. Diese Art des Loggings befindet sich in der Betaphase.

    Sie können das Anfrage-/Antwort-Logging beim Erstellen einer Modellversionsressource aktivieren.

gcloud

Zur Aktivierung des Zugriffs-Loggings fügen Sie bei der Erstellung Ihres Modells mit dem Befehl gcloud ai-platform models create das Flag --enable-logging hinzu. Beispiel:

gcloud ai-platform models create model_name \
  --regions us-central1 \
  --enable-logging

Zur Aktivierung des Stream-Loggings (Beta) verwenden Sie die Komponente gcloud beta und fügen Sie das Flag --enable-console-logging hinzu. Beispiel:

gcloud components install beta

gcloud beta ai-platform models create model_name \
  --regions us-central1 \
  --enable-console-logging

Das Anfrage-/Antwort-Logging (Beta) kann derzeit nicht mit dem gcloud-Tool aktiviert werden. Sie können diese Art des Loggings nur durch Senden einer projects.models.versions.create-Anfrage an die REST API aktivieren.

REST API

Zur Aktivierung des Zugriffs-Loggings legen Sie in der Modellressource für onlinePredictionLogging den Wert True fest, wenn Sie Ihr Modell mit projects.models.create erstellen.

Zur Aktivierung des Stream-Loggins (Beta) legen Sie in der Modellressource für das Feld onlinePredictionConsoleLogging den Wert True fest.

Anfrage-/Antwort-Logging

Im Gegensatz zu den anderen Arten des Loggings können Sie das Anfrage-/Antwort-Logging nicht beim Erstellen eines Modells aktivieren. Stattdessen haben Sie die Möglichkeit, es beim Erstellen einer Version (projects.models.versions.create) zu aktivieren.

Für die Aktivierung des Anfrage-/Antwort-Loggings müssen Sie in das Feld requestLoggingConfig der Versionsressource Folgendes eintragen:

  • samplingPercentage: Eine Zahl zwischen 0 oder 1, die den Anteil der zu protokollierenden Anfragen definiert. Legen Sie dafür beispielsweise den Wert 1 fest, um alle Anfragen zu protokollieren, oder den Wert 0.1, um 10 % der Anfragen zu protokollieren.
  • bigqueryTableName: Der vollqualifizierte Name (project_id.dataset_name.table_name) der BigQuery-Tabelle, in der die Anfragen und Antworten protokolliert werden sollen. Die Tabelle muss mit dem folgenden Schema bereits vorhanden sein:

    FeldnameTypModus
    modelSTRINGERFORDERLICH
    model_versionSTRINGERFORDERLICH
    timeZEITSTEMPELERFORDERLICH
    raw_dataSTRINGERFORDERLICH
    raw_predictionSTRINGNULLWERTE ZULÄSSIG
    groundtruthSTRINGNULLWERTE ZULÄSSIG

    Weitere Informationen zum Erstellen einer BigQuery-Tabelle finden Sie unter Tabelle erstellen und verwenden.

Modelle mit dem What-If-Tool prüfen

Sie können mit dem What-If-Tool (WIT) in Notebook-Umgebungen die AI Platform-Modelle über ein interaktives Dashboard prüfen. Das What-If-Tool ist in TensorBoard, Jupyter-Notebooks, Colab-Notebooks und JupyterHub enthalten. Außerdem ist es auf TensorFlow-Instanzen von AI -Platform-Notebooks vorinstalliert.

Informationen zur Anwendung des What-If-Tools mit AI Platform erhalten Sie unter What-If-Tool verwenden.

Eingabe für Onlinevorhersagen formatieren

Instanzen als JSON-Strings formatieren

Das Basisformat für Onlinevorhersagen ist eine Liste mit Dateninstanzen. Es kann sich dabei um eine einfache Werteliste oder Elemente eines JSON-Objekts handeln. Dies hängt davon ab, wie Sie die Eingaben in der Trainingsanwendung konfiguriert haben: TensorFlow-Modelle und benutzerdefinierte Vorhersageroutinen können komplexere Eingaben akzeptieren. Die meisten Scikit-Learn- und XGBoost-Modelle erwarten hingegeben eine Liste von Zahlen als Eingabe.

Dieses Beispiel zeigt einen Eingabetensor und einen Instanzschlüssel für ein TensorFlow-Modell:

{"values": [1, 2, 3, 4], "key": 1}

Die Zusammensetzung des JSON-Strings kann komplex sein. Es müssen aber folgende Regeln beachtet werden:

  • Die oberste Ebene der Instanzdaten muss ein JSON-Objekt sein – ein Wörterbuch aus Schlüssel/Wert-Paaren.

  • Einzelne Werte in einem Instanzobjekt können Strings, Zahlen oder Listen sein. JSON-Objekte können nicht eingebettet werden.

  • Listen dürfen nur Elemente des gleichen Typs (einschließlich anderer Listen) enthalten. Strings und numerische Werte dürfen nicht kombiniert werden.

Sie übergeben Eingabeinstanzen für Onlinevorhersagen als Nachrichtentext für den Aufruf von projects.predict. Weitere Informationen zu den Formatierungsanforderungen des Anfragetextes finden Sie unter Predict-Anfragedetails.

gcloud

  1. Beachten Sie, dass die Eingabedatei eine durch Zeilenumbruch getrennte JSON-Datei sein muss, in der jede Instanz ein JSON-Objekt ist und in einer eigenen Zeile steht.

    {"values": [1, 2, 3, 4], "key": 1}
    {"values": [5, 6, 7, 8], "key": 2}
    

REST API

  1. Nehmen Sie jede Instanz als Element in eine Liste auf und benennen Sie das Listenmitglied mit instances.

    {"instances": [
      {"values": [1, 2, 3, 4], "key": 1},
      {"values": [5, 6, 7, 8], "key": 2}
    ]}
    

Binärdaten in der Vorhersageeingabe

Binärdaten können nicht als von JSON unterstützte UTF-8-codierte Strings formatiert werden. Wenn Sie Binärdaten in Ihren Eingaben verwenden, müssen Sie für deren Darstellung die base64-Codierung verwenden. Es sind folgende spezielle Formatierungen erforderlich:

  • Ihre codierte Zeichenfolge muss als JSON-Objekt mit einem einzelnen Schlüssel namens b64 formatiert sein. Im folgenden Python 2.7-Beispiel wird ein Puffer aus JPEG-Rohdaten mithilfe der base64-Bibliothek codiert, um eine Instanz zu erstellen:

    {"image_bytes": {"b64": base64.b64encode(jpeg_data)}}
    

    In Python 3.5 gibt die Base64-Codierung eine Byte-Sequenz aus. Diese müssen Sie in einen String konvertieren, um die Serialisierung in JSON zu ermöglichen:

    {'image_bytes': {'b64': base64.b64encode(jpeg_data).decode()}}
    
  • Die Namen der Aliase für die binären Ein- und Ausgabetensoren in Ihrem TensorFlow-Modellcode müssen mit "_bytes" enden.

Vorhersagen anfordern

Wenn Sie eine Onlinevorhersage anfordern möchten, senden Sie die Instanzen Ihrer Eingabedaten als JSON-String in einer Vorhersageanfrage. Informationen zum Formatieren des Anfrage- und Antworttextes finden Sie unter Details zur Vorhersageanfrage

Wenn Sie keine Modellversion angeben, verwendet die Vorhersageanfrage die Standardversion des Modells.

gcloud

  1. Erstellen Sie Umgebungsvariablen für die Parameter und verwenden Sie dabei auch einen Versionswert, wenn Sie eine bestimmte Modellversion festlegen möchten:

    MODEL_NAME="[YOUR-MODEL-NAME]"
    INPUT_DATA_FILE="instances.json"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    
  2. Verwenden Sie gcloud ai-platform predict, um Instanzen an ein bereitgestelltes Modell zu senden. --version ist optional.

    gcloud ai-platform predict --model $MODEL_NAME  \
                       --version $VERSION_NAME \
                       --json-instances $INPUT_DATA_FILE
    
  3. Das gcloud-Tool parst die Antwort und gibt die Vorhersagen in einem für Menschen lesbaren Format an Ihr Terminal aus. Wenn Sie ein anderes Ausgabeformat wie etwa JSON oder CSV festlegen möchten, fügen Sie Ihrem Vorhersagebefehl das Flag "--format" hinzu. Weitere Informationen erhalten Sie unter den verfügbaren Ausgabeformaten.

Python

Sie können mit der Google APIs-Clientbibliothek für Python die AI Platform Training and Prediction API aufrufen, ohne manuell HTTP-Anforderungen erstellen zu müssen. Vor der Ausführung des folgenden Codebeispiels müssen Sie die Authentifizierung einrichten.

def predict_json(project, model, instances, version=None):
    """Send json data to a deployed model for prediction.

    Args:
        project (str): project where the AI Platform Model is deployed.
        model (str): model name.
        instances ([Mapping[str: Any]]): Keys should be the names of Tensors
            your deployed model expects as inputs. Values should be datatypes
            convertible to Tensors, or (potentially nested) lists of datatypes
            convertible to tensors.
        version: str, version of the model to target.
    Returns:
        Mapping[str: any]: dictionary of prediction results defined by the
            model.
    """
    # Create the AI Platform service object.
    # To authenticate set the environment variable
    # GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file>
    service = googleapiclient.discovery.build('ml', 'v1')
    name = 'projects/{}/models/{}'.format(project, model)

    if version is not None:
        name += '/versions/{}'.format(version)

    response = service.projects().predict(
        name=name,
        body={'instances': instances}
    ).execute()

    if 'error' in response:
        raise RuntimeError(response['error'])

    return response['predictions']

Java

Mit der Google API-Clientbibliothek für Java können Sie die AI Platform Training and Prediction API aufrufen, ohne manuell HTTP-Anfragen erstellen zu müssen. Vor der Ausführung der folgende Codebeispiels müssen Sie die Authentifizierung einrichten.

/*
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpContent;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.UriTemplate;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.discovery.Discovery;
import com.google.api.services.discovery.model.JsonSchema;
import com.google.api.services.discovery.model.RestDescription;
import com.google.api.services.discovery.model.RestMethod;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/*
 * Sample code for sending an online prediction request to Cloud Machine Learning Engine.
 */

public class OnlinePredictionSample {
  public static void main(String[] args) throws Exception {
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    Discovery discovery = new Discovery.Builder(httpTransport, jsonFactory, null).build();

    RestDescription api = discovery.apis().getRest("ml", "v1").execute();
    RestMethod method = api.getResources().get("projects").getMethods().get("predict");

    JsonSchema param = new JsonSchema();
    String projectId = "YOUR_PROJECT_ID";
    // You should have already deployed a model and a version.
    // For reference, see https://cloud.google.com/ml-engine/docs/deploying-models.
    String modelId = "YOUR_MODEL_ID";
    String versionId = "YOUR_VERSION_ID";
    param.set(
        "name", String.format("projects/%s/models/%s/versions/%s", projectId, modelId, versionId));

    GenericUrl url =
        new GenericUrl(UriTemplate.expand(api.getBaseUrl() + method.getPath(), param, true));
    System.out.println(url);

    String contentType = "application/json";
    File requestBodyFile = new File("input.txt");
    HttpContent content = new FileContent(contentType, requestBodyFile);
    System.out.println(content.getLength());

    List<String> scopes = new ArrayList<>();
    scopes.add("https://www.googleapis.com/auth/cloud-platform");

    GoogleCredential credential = GoogleCredential.getApplicationDefault().createScoped(scopes);
    HttpRequestFactory requestFactory = httpTransport.createRequestFactory(credential);
    HttpRequest request = requestFactory.buildRequest(method.getHttpMethod(), url, content);

    String response = request.execute().parseAsString();
    System.out.println(response);
  }
}

Fehlerbehebung bei Onlinevorhersagen

Bei Onlinevorhersagen treten mitunter folgende Fehler auf:

  • Unzureichender Speicherplatz
  • Falsch formatierte Eingabedaten

Versuchen Sie, die Größe des Modells zu reduzieren, bevor Sie es für die Vorhersage in AI Platform bereitstellen.

Ausführliche Informationen finden Sie unter Fehlerbehebung bei Onlinevorhersagen.

Weitere Informationen