Obtén predicciones en línea

La predicción en línea de AI Platform es un servicio optimizado para ejecutar tus 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 de AI Platform se encuentra actualmente 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.

A fin de comprender totalmente las regiones disponibles para los servicios de entrenamiento y predicción de AI Platform, consulta la guía de regiones.

Cómo crear 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
Modelo Región en la que se ejecutan las predicciones
Modelo Habilita el registro de predicciones en línea
Versión 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 la configuración que se indica 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áquina disponibles para la predicción en línea

Cuando creas una versión, puedes elegir qué tipo de máquina virtual AI Platform Prediction utiliza 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 AI Platform Prediction no proporciona información registrada sobre las solicitudes según la configuración predeterminada, debido a que los registros generan un costo. La predicción en línea a una tasa alta de consultas por segundo (QPS) puede producir una cantidad sustancial de registros, que están sujetos a precios de Stackdriver o precios 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 para cada solicitud a Stackdriver Logging.

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

  • Registro de transmisión, que registra las transmisiones stderr y stdout desde tus nodos de predicción a Stackdriver 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áquina 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.

    Puedes habilitar el registro de solicitud-respuesta cuando creas un recurso de versión de modelo.

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

Actualmente, no puedes habilitar el registro de solicitud-respuesta (Beta) con la herramienta de gcloud. Solo puedes habilitar este tipo de registro cuando envías una solicitud projects.models.versions.create 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 transmisión (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 cuando creas una versión (projects.models.versions.create).

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 o 1 que defina la fracción de solicitudes para 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: el nombre completo (project_id.dataset_name.table_name) de la tabla BigQuery en la que deseas registrar solicitudes y respuestas. La tabla ya debe existir con el siguiente esquema:

    Nombre del campoTipoModo
    modelSTRINGREQUIRED
    model_versionSTRINGREQUIRED
    timeTIMESTAMPREQUIRED
    raw_dataSTRINGREQUIRED
    raw_predictionSTRINGNULLABLE
    groundtruthSTRINGNULLABLE

    Aprende a crear una tabla de BigQuery.

Inspecciona modelos con la Herramienta What-If

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

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 las 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. El ejemplo de Python 2.7 siguiente codifica un búfer de datos JPEG sin procesar con la biblioteca base64 para crear una instancia:

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

    En Python 3.5, la codificación 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 nombrar 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 predicción para solicitar una predicción en línea. Si deseas 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 tu 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-instances $INPUT_DATA_FILE
    
  3. La herramienta de 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 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 la siguiente muestra 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.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);
  }
}

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

Intenta reducir el tamaño de tu modelo antes de implementarlo en AI Platform para la predicción.

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

Próximos pasos