Onlinevorhersagen abrufen

Die Onlinevorhersage von AI Platform Prediction ist ein Dienst, der für die Verarbeitung Ihrer Daten durch gehostete Modelle optimiert ist – und zwar mit so wenig Latenz wie möglich. Sie senden kleine Mengen von Daten an den Dienst und dieser gibt Ihre Vorhersagen in der Antwort zurück.

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

Vorbereitung

Sie müssen zuerst folgende Schritte ausführen, um Vorhersagen anzufordern:

Regionen

Die Onlinevorhersage ist in bestimmten Regionen verfügbar. Darüber hinaus sind in jeder Region unterschiedliche Maschinentypen verfügbar. Weitere Informationen zur Verfügbarkeit von Onlinevorhersagen in den einzelnen Regionen finden Sie im Leitfaden für Regionen.

Modelle und Versionen erstellen

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

Erstellte Ressource Bei der Ressourcenerstellung festzulegende Einstellungen
Modell Region, in der Vorhersagen ausgeführt werden sollen
Modell Logging von Onlinevorhersagen aktivieren
Version Zu verwendende Laufzeitversion
Version Zu verwendende Python-Version
Version Für die Onlinevorhersage zu verwendender Maschinentyp

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.

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 Prediction-Vorhersagedienst protokolliert standardmäßig keine Informationen zu Anfragen, da Logs kostenpflichtig sind. Onlinevorhersagen mit einer hohen Rate von Abfragen pro Sekunde können zu einer erheblichen Anzahl von Logs führen, die Cloud Logging-Preisen oder BigQuery-Preisen unterliegen.

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

  • Zugriffs-Logging, das Informationen wie Zeitstempel und Latenz für jede Anfrage an Cloud Logging protokolliert.

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

  • Console-Logging, das die stderr- und stdout-Streams von Ihren Vorhersageknoten in Cloud Logging protokolliert und für die Fehlerbehebung nützlich sein kann. Diese Art des Loggings befindet sich in der Vorschau für Compute Engine-Maschinentypen (N1) und ist allgemein für Legacy-Maschinentypen (MLS1) verfügbar.

    Sie können das Console-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 aktivieren. Dazu erstellen Sie eine Modellversionsressource und aktualisieren dann diese Version.

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 \
  --region=us-central1 \
  --enable-logging

Zur Aktivierung des Console-Loggings (Vorschau) 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 \
  --region=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.patch-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 Console-Loggings (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 können Sie es dadurch aktivieren, dass Sie die Methode projects.models.versions.patch für eine vorhandene Modellversion verwenden. (Sie müssen zuerst die Modellversion mit der Google Cloud Console, dem gcloud-Tool oder der REST API erstellen.)

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 voll qualifizierte Name (project_id.dataset_name.table_name) der BigQuery-Tabelle, in der Sie Anfragen und Antworten protokollieren möchten. Die Tabelle muss mit dem folgenden Schema bereits vorhanden sein:

    FeldnameTypModus
    modelSTRINGERFORDERLICH
    model_versionSTRINGERFORDERLICH
    timeZEITSTEMPELERFORDERLICH
    raw_dataSTRINGERFORDERLICH
    raw_predictionSTRINGNULLWERTE ZULÄSSIG
    groundtruthSTRINGNULLABLE

    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 das What-If-Tool (WIT) in Notebook-Umgebungen verwenden, um AI Platform Prediction-Modelle über ein interaktives Dashboard zu prüfen. Das What-If-Tool lässt sich in TensorBoard, Jupyter-Notebooks, Colab-Notebooks und JupyterHub einbinden. 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 Grundformat 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, solange diese Regeln eingehalten 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 die Eingabeinstanzen für die Onlinevorhersage als Nachrichtentext für den projects.predict-Aufruf. Weitere Informationen zu den Formatierungsanforderungen des Anfragetextes finden Sie hier.

gcloud

Je nachdem, wie Sie die Vorhersageanfrage senden möchten, haben Sie zwei Möglichkeiten, die Eingabe zu formatieren. Wir empfehlen die Verwendung des Flags --json-request des gcloud ai-platform predict-Befehls. Alternativ können Sie das Flag --json-instances mit durch Zeilenumbruch getrennten JSON-Daten verwenden.

Für --json-request

Nehmen Sie jede Instanz als Element in ein JSON-Array auf und geben Sie das Array als instances-Feld einer JSON-Datei an. Beispiel:

instances.json

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

Für --json-instances

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. Beispiel:

instances.jsonl

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

REST API

Nehmen Sie jede Instanz als Element in ein JSON-Array auf und geben Sie das Array als instances-Feld eines JSON-Objekts an. Beispiel:

{"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. Folgende besondere Formatierungen sind 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()}}
    
  • Benennen Sie die Aliase für die binären Ein- und Ausgabetensoren in Ihrem TensorFlow-Modellcode so, dass sie auf "_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 schließen Sie einen Versionswert ein, wenn Sie eine bestimmte Modellversion angeben 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-request=$INPUT_DATA_FILE \
      --region=REGION
    

    Ersetzen Sie REGION durch die Region des regionalen Endpunkts, in dem Sie Ihr Modell erstellt haben. Wenn Sie das Modell auf dem globalen Endpunkt erstellt haben, lassen Sie das Flag --region aus.

  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 die Google APIs-Clientbibliothek für Python verwenden, um die AI Platform API für Training und Vorhersagen aufzurufen, ohne manuell HTTP-Anforderungen zu erstellen. Bevor Sie das folgende Codebeispiel ausführen, müssen Sie die Authentifizierung einrichten.

# 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')

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.
    """
    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 HTTP-Anfragen manuell zu erstellen. Bevor Sie das folgende Codebeispiel ausführen, 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.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 com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
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");

    GoogleCredentials credential = GoogleCredentials.getApplicationDefault().createScoped(scopes);
    HttpRequestFactory requestFactory =
        httpTransport.createRequestFactory(new HttpCredentialsAdapter(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
  • Eine einzelne Onlinevorhersageanfrage darf nicht mehr als 1,5 MB an Daten enthalten. Anfragen, die mit dem gcloud-Tool erstellt wurden, können nicht mehr als 100 Instanzen pro Datei verarbeiten. Verwenden Sie die Batchvorhersage, um Vorhersagen für mehrere Instanzen gleichzeitig zu erhalten.

Versuchen Sie, die Modellgröße zu reduzieren, bevor Sie sie für die Vorhersage in AI Platform Prediction bereitstellen.

Weitere Informationen zur Fehlerbehebung bei Onlinevorhersagen

Weitere Informationen