Obtén predicciones en línea

La predicción en línea de AI Platform Prediction es un servicio optimizado para ejecutar los datos mediante modelos alojados con la menor latencia posible. Envía lotes pequeños de datos al servicio y, las predicciones se mostrarán en la respuesta.

Consulta una comparación entre la predicción en línea y la predicción por lotes o lee una descripción general de los conceptos de predicción.

Antes de comenzar

Para solicitar predicciones, primero debes hacer lo siguiente:

Regiones

En la actualidad, la predicción en línea de AI Platform Prediction está disponible en las siguientes regiones:

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

Los tipos de máquina de Compute Engine (N1) para la predicción en línea (Beta) solo están disponibles en us-central1.

Si deseas saber qué regiones están disponibles para los servicios de entrenamiento y predicción de AI Platform Prediction, lee la guía de regiones.

Crea modelos y versiones

Toma las siguientes decisiones importantes sobre cómo ejecutar la predicción en línea cuando crees el modelo y los recursos de la versión:

Recurso creado Decisión especificada en la creación de recursos
Model Región en la que se ejecutan las predicciones
Model Habilita el registro de predicciones en línea
Version Versión del entorno de ejecución que se usa
Version La versión de Python que se usa
Version Tipo de máquina que se usa para la predicción en línea

No puedes actualizar los parámetros de configuración enumerados anteriormente después de la creación inicial del modelo o la versión. Si tienes que cambiar estos parámetros de configuración, crea un modelo nuevo o recurso de la versión con la configuración nueva y vuelve a implementar tu modelo.

Tipos de máquinas disponibles para la predicción en línea

Cuando creas una versión, puedes elegir qué tipo de máquina virtual usará AI Platform Prediction para los nodos de predicción en línea. Obtén más información sobre los tipos de máquinas.

Solicita registros para solicitudes de predicción en línea

El servicio de predicción de AI Platform Prediction no proporciona información registrada sobre las solicitudes de forma predeterminada, ya que los registros generan costos. La predicción en línea a una tasa alta de consultas por segundo (QPS) puede generar una cantidad considerable de registros, que están sujetos a los precios de Cloud Logging o los precios de BigQuery.

Si deseas habilitar el registro de predicción en línea, debes configurarlo cuando crees un recurso de modelo o cuando crees un recurso de versión de modelo, según el tipo de registro que desees habilitar. Existen tres tipos de registro, que puedes habilitar de forma independiente:

  • Registro de acceso, que registra información como la marca de tiempo y la latencia de las solicitudes a Cloud Logging.

    Puedes habilitar el registro de acceso cuando creas un recurso de modelo.

  • Registro de transmisión, que registra las transmisiones stderr y stdout de los nodos de predicción en Cloud Logging y puede ser útil para la depuración. Este tipo de registro está en versión Beta y no es compatible con los tipos de máquinas de Compute Engine (N1) .

    Puedes habilitar el registro de transmisión cuando creas un recurso modelo.

  • Registro de solicitud-respuesta, que registra una muestra de solicitudes de predicción en línea y respuestas a una tabla de BigQuery. Este tipo de registro está en versión Beta.

    Para habilitar el registro de solicitudes y respuestas, crea un recurso de versión de modelo y, luego, actualiza esa versión.

gcloud

Para habilitar el registro de acceso, incluye la marca --enable-logging cuando crees tu modelo con el comando de gcloud ai-platform models create. Por ejemplo:

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

Para habilitar el registro de transmisión (Beta), usa el componente gcloud beta y, también, incluye la marca --enable-console-logging. Por ejemplo:

gcloud components install beta

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

En la actualidad, no puedes habilitar el registro de solicitudes y respuestas (Beta) con la herramienta de gcloud. Solo puedes habilitar este tipo de registro cuando envías una solicitud projects.models.versions.patch a la API de REST.

API de REST

Para habilitar el registro de acceso, establece onlinePredictionLogging en True en el recurso de modelo cuando crees el modelo con projects.models.create.

Para habilitar el registro de transmisión (Beta), establece el campo onlinePredictionConsoleLogging en True en el recurso Modelo.

Registro de solicitudes y respuestas

A diferencia de los otros tipos de registros, no puedes habilitar el registro de solicitudes y respuestas cuando creas un modelo. En cambio, puedes habilitarlo mediante el método projects.models.versions.patch en una versión de modelo existente. (Primero, debes crear la versión de modelo mediante Google Cloud Console, la herramienta de gcloud o la API de REST).

Para habilitar el registro de solicitudes y respuestas, propaga el campo requestLoggingConfig del recurso de versión con las siguientes entradas:

  • samplingPercentage: Un número entre 0 y 1 que define la fracción de solicitudes que se registrará. Por ejemplo, establece este valor en 1 para registrar todas las solicitudes o en 0.1 a fin de registrar el 10% de las solicitudes.
  • bigqueryTableName: Es el nombre completamente calificado (project_id.dataset_name.table_name) de la tabla de BigQuery en la que deseas registrar solicitudes y respuestas. La tabla ya debe existir con el siguiente esquema:

    Nombre del campoTipoModo
    modelSTRINGOBLIGATORIO
    model_versionSTRINGOBLIGATORIO
    timeMARCA DE TIEMPOOBLIGATORIO
    raw_dataSTRINGOBLIGATORIO
    raw_predictionSTRINGACEPTA VALOR NULL
    groundtruthSTRINGACEPTA VALOR NULL

    Aprende a crear una tabla de BigQuery.

Inspecciona modelos con la Herramienta What-If

Puedes usar la Herramienta What-If (WIT) en los entornos de notebooks para inspeccionar los modelos de AI Platform Prediction mediante un panel interactivo. La Herramienta What-If se integra a TensorBoard, JupyterHub y notebooks de Jupyter y de Colab. También está preinstalada en instancias de TensorFlow de AI Platform Notebooks.

Aprende a usar la Herramienta What-If con AI Platform.

Dale formato a tu entrada para la predicción en línea

Dale formato a tus instancias como strings JSON

El formato básico de la predicción en línea es una lista de instancias de datos. Pueden ser listas sin formato de valores o miembros de un objeto JSON, según cómo configuraste las entradas en la aplicación de entrenamiento. Los modelos de TensorFlow y las rutinas de predicción personalizadas pueden aceptar entradas más complejas, mientras que la mayoría de los modelos de scikit-learn y XGBoost esperan una lista de números como entrada.

En este ejemplo, se muestra un tensor de entrada y una clave de instancia para un modelo de TensorFlow:

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

La composición de la string JSON puede ser compleja, siempre y cuando siga estas reglas:

  • El nivel superior de los datos de instancia debe ser un objeto JSON: un diccionario de pares clave-valor.

  • Los valores individuales en un objeto de instancia pueden ser strings, números o listas. No puedes incorporar objetos JSON.

  • Las listas deben contener solo elementos del mismo tipo (incluidas otras listas). No puedes mezclar valores numéricos y strings.

Pasa instancias de entrada para la predicción en línea como el cuerpo del mensaje de la llamada projects.predict. Obtén más información sobre los requisitos de formato del cuerpo de la solicitud.

gcloud

  1. Asegúrate de que tu archivo de entrada sea un archivo JSON delimitado por saltos de línea, con cada instancia en forma de objeto JSON, una instancia por línea.

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

API de REST

  1. Convierte cada instancia en un elemento de una lista y asigna el nombre instances al miembro de la lista.

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

Datos binarios en la entrada de predicción

No es posible darles a los datos binarios el formato de strings codificadas en UTF-8 que admite JSON. Si tienes datos binarios en tus entradas, debes usar la codificación base64 para representarlos. Se requiere el siguiente formato especial:

  • La string codificada debe tener el formato de un objeto JSON con una sola clave llamada b64. En el siguiente ejemplo de Python 2.7, se codifica un búfer de datos JPEG sin procesar mediante la biblioteca en base64 para crear una instancia:

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

    En Python 3, la codificación en base64 genera una secuencia de bytes. Debes convertir esto en una string para que pueda serializarse con JSON.

    {'image_bytes': {'b64': base64.b64encode(jpeg_data).decode()}}
    
  • En tu código de modelo TensorFlow, debes asignar los alias de los tensores de entrada y salida binarios de modo que finalicen con “_bytes”.

Solicita predicciones

Envía las instancias de datos de entrada como una string JSON en una solicitud de predicción para solicitar una predicción en línea. Si deseas obtener información sobre cómo dar formato al cuerpo de la solicitud y la respuesta, consulta los detalles de la solicitud de predicción.

Si no especificas una versión del modelo, se usa la versión predeterminada del modelo en la solicitud de predicción.

gcloud

  1. Crea variables de entorno para conservar los parámetros, incluido un valor de versión si decides especificar una versión de modelo en particular:

    MODEL_NAME="[YOUR-MODEL-NAME]"
    INPUT_DATA_FILE="instances.json"
    VERSION_NAME="[YOUR-VERSION-NAME]"
    
  2. Usa gcloud ai-platform predict para enviar instancias a un modelo implementado. Ten en cuenta que --version es opcional.

    gcloud ai-platform predict --model $MODEL_NAME  \
                       --version $VERSION_NAME \
                       --json-instances $INPUT_DATA_FILE
    
  3. La herramienta de gcloud analiza la respuesta y, luego, imprime las predicciones en la terminal en un formato legible. Puedes especificar un formato de salida diferente, como JSON o CSV, si usas la marca --format con tu comando predict. Ver formatos de salida disponibles.

Python

Puedes usar la biblioteca cliente de las API de Google para Python a fin de llamar a la API de entrenamiento y predicción de AI Platform sin crear solicitudes HTTP de forma manual. Antes de ejecutar la siguiente muestra de código, debes configurar la autenticación.

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

Puedes usar la biblioteca cliente de las API de Google para Java a fin de llamar a la API de entrenamiento y predicción de AI Platform sin construir solicitudes HTTP de forma manual. Antes de ejecutar el siguiente ejemplo de código, debes configurar la autenticación.

/*
 * 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);
  }
}

Solución de problemas de la predicción en línea

Los errores comunes en la predicción en línea incluyen los siguientes:

  • Errores por falta de memoria
  • Formato incorrecto de los datos de entrada
  • Una solicitud de predicción en línea individual no debe contener más de 1.5 MB de datos. Las solicitudes creadas mediante la herramienta de gcloud no pueden controlar más de 100 instancias por archivo. Si deseas obtener predicciones para más instancias al mismo tiempo, usa la predicción por lotes.

Si es posible, reduce el tamaño del modelo antes de implementarlo en AI Platform Prediction para la predicción.

Ve más detalles en Solución de problemas de la predicción en línea.

Qué sigue