Onlinevorhersagen abrufen

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

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

Vorbereitung

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

  • Achten Sie darauf, dass die Dateigröße des SavedModel-Moduls unter dem für Cloud ML Engine geltenden Standardlimit von 250 MB liegt. Optimieren Sie gegebenenfalls die Grafik für die Vorhersage.

  • Überprüfen Sie, ob Ihre Eingabedaten im korrekten Format für Onlinevorhersagen vorliegen.

Regionen

Die Cloud ML Engine-Onlinevorhersage ist derzeit in folgenden Regionen verfügbar:

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

Lesen Sie die Informationen zu Regionen, um einen vollständigen Überblick über die verfügbaren Regionen für Cloud ML Engine-Dienste für Training und Vorhersage zu erhalten.

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

Onlinevorhersagen unterstützen derzeit Einzelkern-CPUs mit 2 GB RAM. Wenn Sie an Alpha-Programmen für andere Hardwarekomponenten teilnehmen möchten, senden Sie eine E-Mail an Cloud ML Engine-Feedback.

Informationen zur Preisgestaltung für diese Maschinentypen finden Sie auf der Preisseite.

Logs für Onlinevorhersageanfragen anfordern

Der Cloud ML Engine-Vorhersagedienst protokolliert standardmäßig keine Informationen zu Anfragen, da die Logs kostenpflichtig sind. Die Onlinevorhersage mit einer hohen Rate von Abfragen pro Sekunde (QPS) kann zu einer hohen Anzahl von Logs führen, die gemäß dem Stackdriver-Preismodell berechnet werden.

Wenn Sie die Protokollierung von Onlinevorhersagen jedoch nutzen möchten, können Sie diese beim Erstellen der Modellressource aktivieren.

gcloud

Verwenden Sie das Flag --enable-logging, wenn Sie das Modell mit dem Befehl gcloud ml-engine models create erstellen.

Python

Setzen Sie beim Erstellen des Modells mit "projects.models.create" die Option onlinePredictionLogging in der Modellressource auf True.

Eingabe für Onlinevorhersagen formatieren

Instanzen als JSON-Strings formatieren

Das Grundformat für Onlinevorhersagen ist eine Liste von Instanzdatentensoren. Es kann sich dabei um eine einfache Werteliste oder Elemente eines JSON-Objekts handeln, je nachdem, wie Sie die Eingaben in der Trainingsanwendung konfiguriert haben:

Dieses Beispiel zeigt einen Eingabetensor und einen Instanzschlüssel:

{"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 Eingabeinstanzen für Onlinevorhersagen als Nachrichtentext für den Aufruf "projects.predict".

gcloud

  1. Beachten Sie, dass die Eingabedatei eine Textdatei 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 nennen Sie das Listenmitglied instances.

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

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:

  • Der codierte String muss als JSON-Objekt mit einem einzelnen Schlüssel namens b64 formatiert werden. 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 Antworttexts finden Sie unter Details zu Vorhersageanfragen.

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 ml-engine predict, um Instanzen an ein bereitgestelltes Modell zu senden. Beachten Sie, dass --version optional ist.

    gcloud ml-engine predict --model $MODEL_NAME  \
                       --version $VERSION_NAME \
                       --json-instances $INPUT_DATA_FILE
    
  3. Das gcloud-Tool analysiert 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 Cloud Machine Learning Engine API aufzurufen, ohne manuell HTTP-Anfragen zu erstellen. Bevor Sie das folgende Codebeispiel ausführen, 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 Cloud ML Engine 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 ML Engine 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

Sie können die Google API-Clientbibliothek für Java verwenden, um die Cloud Machine Learning Engine API aufzurufen, ohne manuell HTTP-Anfragen 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.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;

/*
 * Sample code for doing Cloud Machine Learning Engine online prediction in Java.
 */

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());

    GoogleCredential credential = GoogleCredential.getApplicationDefault();
    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

Reduzieren Sie die Modellgröße, bevor Sie das Modell für Vorhersagen in Cloud ML Engine bereitstellen.

Weitere Informationen zur Fehlerbehebung bei Onlinevorhersagen

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

AI Platform für TensorFlow