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 tus predicciones se mostrarán en la respuesta.

Obtén más información sobre la predicción en línea frente a la predicción por lotes o consulta una descripción general de los conceptos de predicción.

Antes de comenzar

Para solicitar predicciones, primero debes realizar las siguientes acciones:

Regiones

La predicción en línea está disponible en ciertas regiones. Además, hay diferentes tipos de máquina disponibles en cada región. Para conocer la disponibilidad de la predicción en línea en cada región, consulta 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
Versión La versión de Python que se usa
Versión 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 creas un recurso modelo o cuando creas un recurso de versión modelo, según el tipo de registro que desees permitir. 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 la consola, que registra las transmisiones stderr y stdout de tus nodos de predicción en Cloud Logging y puede ser útil para la depuración. Este tipo de registro se encuentra en vista previa para los tipos de máquinas (N1) de Compute Engine y en fase de disponibilidad general para los tipos de máquinas heredadas (MLS1).

    Puedes habilitar el registro de la consola cuando creas un recurso del 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 \
  --region=us-central1 \
  --enable-logging

Para habilitar el registro de la consola (vista previa), usa el componente gcloud beta y agrega la marca --enable-console-logging. Por ejemplo:

gcloud components install beta

gcloud beta ai-platform models create MODEL_NAME \
  --region=us-central1 \
  --enable-console-logging

En este momento, no puedes habilitar el registro de solicitudes y respuestas (beta) con la CLI 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, configura onlinePredictionLogging en True en el recurso Modelo cuando creas tu modelo con projects.models.create.

Para habilitar el registro de la consola (beta), establece el campo onlinePredictionConsoleLogging en True en el recurso Modelo.

Registro de solicitud-respuesta

A diferencia de los otros tipos de registros, no puedes habilitar el registro de solicitud-respuesta 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 del modelo con la consola de Google Cloud, gcloud CLI o la API de REST).

Para habilitar el registro de solicitud-respuesta, completa el campo requestLoggingConfig del recurso 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
    timeTIMESTAMPOBLIGATORIO
    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 Notebooks administradas por el usuario de Vertex AI Workbench.

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

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

Dales 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

Puedes dar formato a tu entrada de dos maneras diferentes, según cómo planees enviar tu solicitud de predicción. Te recomendamos que uses la marca --json-request del comando gcloud ai-platform predict. Como alternativa, puedes usar la marca --json-instances con datos JSON delimitados por saltos de línea.

Para la solicitud JSON

Convierte cada instancia en un array JSON y proporciona el array como el campo instances de un archivo JSON. Por ejemplo:

instances.json

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

Para las instancias JSON

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. Por ejemplo:

instances.jsonl

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

API de REST

Convierte cada instancia en un array JSON y proporciona el array como el campo instances de un objeto JSON. Por ejemplo:

{"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 tus instancias de datos de entrada como una string JSON en una solicitud de predict para solicitar una predicción en línea. Para 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 la 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-request=$INPUT_DATA_FILE \
      --region=REGION
    

    Reemplaza REGION por la región del extremo regional en la quecreaste tu modelo. Si creaste el modelo en el extremo global, omite la marca --region.

  3. La herramienta gcloud analiza la respuesta y después imprime las predicciones en tu 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 la API de Google para Python a fin de llamar a la API de AI Platform Training y de Prediction sin construir solicitudes HTTP de forma manual. Antes de ejecutar la siguiente muestra de código, debes configurar la autenticación.

# 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 = f"projects/{project}/models/{model}"

    if version is not None:
        name += f"/versions/{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 AI Platform Training and Prediction 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.gson.GsonFactory;
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 = GsonFactory.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 CLI 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?