Obtener inferencias por lotes a partir de un modelo entrenado personalizado

En esta página se explica cómo obtener inferencias por lotes de tus modelos entrenados personalizados mediante la consola de Google Cloud o la API de Vertex AI.

Para hacer una solicitud de inferencia por lotes, debes especificar una fuente de entrada y una ubicación de salida, que puede ser Cloud Storage o BigQuery, donde Vertex AI almacena los resultados de la inferencia por lotes.

Limitaciones y requisitos

Ten en cuenta las siguientes limitaciones y requisitos al obtener inferencias por lotes:

  • Para minimizar el tiempo de procesamiento, las ubicaciones de entrada y salida deben estar en la misma región o multirregión. Por ejemplo, si la entrada está en us-central1, la salida puede estar en us-central1 o US, pero no en europe-west4. Para obtener más información, consulta las ubicaciones de Cloud Storage y las ubicaciones de BigQuery.
  • Las entradas y salidas también deben estar en la misma región o multirregión que el modelo.
  • Los modelos de BigQuery ML no son modelos entrenados de forma personalizada. Sin embargo, la información de esta página se puede usar para obtener inferencias por lotes de un modelo de BigQuery ML en las siguientes condiciones:
    • El modelo de BigQuery ML debe registrarse en Vertex AI Model Registry.
    • Para usar una tabla de BigQuery como entrada, debes definir InstanceConfig.instanceType en "object" mediante la API Vertex AI.
  • El tiempo de espera para cargar un modelo de inferencia por lotes es de unos 40 minutos. Si ves el siguiente mensaje de error, usa un modelo más pequeño para las inferencias por lotes: Error: model server never became ready. Please validate that your model file or container configuration are valid.

Requisitos de los datos de entrada

La entrada de las solicitudes por lotes especifica los elementos que se enviarán a tu modelo para la inferencia. Admitimos los siguientes formatos de entrada:

JSON Lines

Usa un archivo JSON Lines para especificar una lista de instancias de entrada sobre las que hacer inferencias. Almacena el archivo en un segmento de Cloud Storage.

Ejemplo 1

En el ejemplo siguiente se muestra un archivo JSON Lines en el que cada línea contiene un array:

[1, 2, 3, 4]
[5, 6, 7, 8]

A continuación, se muestra lo que se envía al contenedor en el cuerpo de la solicitud HTTP:

Todos los demás contenedores

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

Contenedores de PyTorch

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

Ejemplo 2

En el siguiente ejemplo se muestra un archivo JSON Lines en el que cada línea contiene un objeto.

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

A continuación, se muestra lo que se envía al contenedor en el cuerpo de la solicitud HTTP. Ten en cuenta que el mismo cuerpo de solicitud se envía a todos los contenedores.

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

Ejemplo 3

En el caso de los contenedores precompilados de PyTorch, asegúrate de envolver cada instancia en un campo data, tal como requiere el controlador predeterminado de TorchServe. Vertex AI no envuelve las instancias por ti. Por ejemplo:

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

A continuación, se muestra lo que se envía al contenedor de inferencia en el cuerpo de la solicitud HTTP:

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

TFRecord

Guarda las instancias de entrada en formato TFRecord. También puedes comprimir los archivos TFRecord con Gzip. Almacena los archivos TFRecord en un segmento de Cloud Storage.

Vertex AI lee cada instancia de tus archivos TFRecord como binaria y, a continuación, codifica en base64 la instancia como objeto JSON con una sola clave llamada b64.

A continuación, se muestra lo que se envía al contenedor en el cuerpo de la solicitud HTTP:

Todos los demás contenedores

{"instances": [
{ "b64": "b64EncodedASCIIString" },
{ "b64": "b64EncodedASCIIString" } ]}

Contenedores de PyTorch

{"instances": [ { "data": {"b64": "b64EncodedASCIIString" } }, { "data": {"b64": "b64EncodedASCIIString" } }
]}

Asegúrate de que tu contenedor sabe cómo decodificar la instancia.

CSV

Especifica una instancia de entrada por fila en un archivo CSV. La primera fila debe ser una fila de encabezado. Todas las cadenas deben incluirse entre comillas dobles ("). Vertex AI no acepta valores de celda que contengan saltos de línea. Los valores sin comillas se leen como números de punto flotante.

En el siguiente ejemplo se muestra un archivo CSV con dos instancias de entrada:

"input1","input2","input3"
0.1,1.2,"cat1"
4.0,5.0,"cat2"

A continuación, se muestra lo que se envía al contenedor en el cuerpo de la solicitud HTTP:

Todos los demás contenedores

{"instances": [ [0.1,1.2,"cat1"], [4.0,5.0,"cat2"] ]}

Contenedores de PyTorch

{"instances": [
{ "data": [0.1,1.2,"cat1"] },
{ "data": [4.0,5.0,"cat2"] } ]}

Lista de archivos

Crea un archivo de texto en el que cada fila sea el URI de Cloud Storage de un archivo. Vertex AI lee el contenido de cada archivo como binario y, a continuación, codifica en base64 la instancia como un objeto JSON con una sola clave llamada b64.

Si tienes previsto usar la Google Cloud consola para obtener inferencias por lotes, pega tu lista de archivos directamente en la Google Cloud consola. De lo contrario, guarda la lista en un segmento de Cloud Storage.

En el siguiente ejemplo se muestra una lista de archivos con dos instancias de entrada:

gs://path/to/image/image1.jpg
gs://path/to/image/image2.jpg

A continuación, se muestra lo que se envía al contenedor en el cuerpo de la solicitud HTTP:

Todos los demás contenedores

{ "instances": [
{ "b64": "b64EncodedASCIIString" },
{ "b64": "b64EncodedASCIIString" } ]}

Contenedores de PyTorch

{ "instances": [ { "data": { "b64": "b64EncodedASCIIString" } }, { "data": { "b64": "b64EncodedASCIIString" } }
]}

Asegúrate de que tu contenedor sabe cómo decodificar la instancia.

BigQuery

Especifica una tabla de BigQuery como projectId.datasetId.tableId. Vertex AI transforma cada fila de la tabla en una instancia JSON.

Por ejemplo, si su tabla contiene lo siguiente:

Columna 1 Columna 2 Columna 3
1.0 3,0 "Cat1"
2,0 4.0 "Cat2"

A continuación, se muestra lo que se envía al contenedor en el cuerpo de la solicitud HTTP:

Todos los demás contenedores

{"instances": [ [1.0,3.0,"cat1"], [2.0,4.0,"cat2"] ]}

Contenedores de PyTorch

{"instances": [
{ "data": [1.0,3.0,"cat1"] },
{ "data": [2.0,4.0,"cat2"] } ]}

Así se convierten los tipos de datos de BigQuery a JSON:

Tipo BigQuery Tipo JSON Valor de ejemplo
Cadena Cadena "abc"
Entero Entero 1
Flotante Flotante 1.2
Numérico Flotante 4925.000000000
Booleano Booleano true
TimeStamp Cadena "2019-01-01 23:59:59.999999+00:00"
Fecha Cadena "2018-12-31"
Hora Cadena "23:59:59.999999"
DateTime Cadena "2019-01-01T00:00:00"
Grabar Objeto { "A": 1,"B": 2}
Tipo repetido Array[Type] [1, 2]
Registro anidado Objeto {"A": {"a": 0}, "B": 1}

Datos de partición

La inferencia por lotes usa MapReduce para fragmentar la entrada de cada réplica. Para usar las funciones de MapReduce, la entrada debe poder particionarse.

Vertex AI particiona automáticamente las entradas de BigQuery, lista de archivos y líneas JSON.

Vertex AI no particiona automáticamente los archivos CSV porque no son compatibles con las particiones de forma natural. Las filas de los archivos CSV no son autodescriptivas, no tienen tipo y pueden contener saltos de línea. No recomendamos usar entradas CSV en aplicaciones sensibles al rendimiento.

En el caso de las entradas TFRecord, asegúrate de particionar los datos manualmente dividiendo las instancias en archivos más pequeños y transfiriendo los archivos al trabajo con un comodín (por ejemplo, gs://my-bucket/*.tfrecord). El número de archivos debe ser al menos el número de réplicas especificado.

Filtrar y transformar datos de entrada

Puedes filtrar y transformar la entrada por lotes especificando instanceConfig en tu solicitud BatchPredictionJob.

La filtración te permite excluir determinados campos de los datos de entrada de tu solicitud de inferencia o incluir solo un subconjunto de campos de los datos de entrada en tu solicitud de inferencia, sin tener que realizar ningún preprocesamiento o postprocesamiento personalizado en el contenedor de inferencia. Esto resulta útil cuando el archivo de datos de entrada tiene columnas adicionales que el modelo no necesita, como claves o datos adicionales.

Transformar te permite enviar las instancias a tu contenedor en formato JSON array o object. Consulta instanceType para obtener más información.

Por ejemplo, si su tabla de entrada contiene lo siguiente:

customerId col1 col2
1001 1 2
1002 5 6

y especifica los siguientes instanceConfig:

{
  "name": "batchJob1",
  ...
  "instanceConfig": {
    "excludedFields":["customerId"]
    "instanceType":"object"
  }
}

A continuación, las instancias de tu solicitud de inferencia se envían como objetos JSON y se excluye la columna customerId:

{"col1":1,"col2":2}
{"col1":5,"col2":6}

Ten en cuenta que, si especificas lo siguiente, instanceConfig, obtendrás el mismo resultado:

{
  "name": "batchJob1",
  ...
  "instanceConfig": {
    "includedFields": ["col1","col2"]
    "instanceType":"object"
  }
}

Para ver una demostración de cómo usar los filtros de características, consulta el cuaderno Inferencia por lotes de modelos personalizados con filtros de características.

Solicitar una inferencia por lotes

Para las solicitudes de inferencia por lotes, puedes usar la Google Cloud consola o la API Vertex AI. En función del número de elementos de entrada que hayas enviado, una tarea de inferencia por lotes puede tardar un tiempo en completarse.

Cuando solicitas una inferencia por lotes, el contenedor de inferencia se ejecuta como la cuenta de servicio personalizada proporcionada por el usuario. Las operaciones de lectura y escritura, como la lectura de las instancias de inferencia de la fuente de datos o la escritura de los resultados de la inferencia, se realizan mediante el agente de servicio de Vertex AI, que tiene acceso a BigQuery y Cloud Storage de forma predeterminada.

Google Cloud consola

Usa la consola Google Cloud para solicitar una inferencia por lotes.

  1. En la Google Cloud consola, en la sección Vertex AI, ve a la página Predicciones por lotes.

Ir a la página Predicciones por lotes

  1. Haga clic en Crear para abrir la ventana Nueva predicción por lotes.

  2. En Define your batch prediction (Define tu predicción por lotes), sigue estos pasos:

    1. Escribe un nombre para la inferencia por lotes.

    2. En Nombre del modelo, seleccione el nombre del modelo que quiera usar para esta inferencia por lotes.

    3. En Seleccionar fuente, elija la fuente que corresponda a sus datos de entrada:

      • Si ha dado formato a los datos de entrada como JSON Lines, CSV o TFRecord, seleccione Archivo en Cloud Storage (JSON Lines, CSV, TFRecord o TFRecord Gzip). A continuación, especifique el archivo de entrada en el campo Ruta de origen.
      • Si usas una lista de archivos como entrada, selecciona Archivos en Cloud Storage (otro) y pega la lista de archivos en el campo siguiente.
      • En Entrada de BigQuery, selecciona Ruta de BigQuery. Si selecciona BigQuery como entrada, también debe seleccionar BigQuery como salida y Google-managed encryption key. No se admite la clave de cifrado gestionada por el cliente (CMEK) con BigQuery como entrada o salida.
    4. En el campo Ruta de destino, especifica el directorio de Cloud Storage en el que quieres que Vertex AI almacene la salida de la inferencia por lotes.

    5. También puede marcar la opción Habilitar atribuciones de funciones para este modelo para obtener atribuciones de funciones como parte de la respuesta de inferencia por lotes. A continuación, haz clic en Editar para configurar los ajustes de la explicación. (Editar los ajustes de explicación es opcional si ya los ha configurado para el modelo, pero es obligatorio en caso contrario).

    6. Especifica las opciones de computación de la tarea de inferencia por lotes: Número de nodos de computación, Tipo de máquina, y (opcionalmente) Tipo de acelerador y Número de aceleradores.

  3. Opcional: El análisis Monitorización de modelos de las inferencias por lotes está disponible en Vista previa. Consulta los requisitos para añadir la configuración de detección de sesgos a tu tarea de inferencia por lotes.

    1. Haz clic para activar Habilitar la monitorización del modelo para esta predicción por lotes.

    2. Seleccione una fuente de datos de entrenamiento. Introduce la ruta de datos o la ubicación de la fuente de datos de entrenamiento que hayas seleccionado.

    3. Opcional: En Umbrales de alerta, especifica los umbrales en los que se activarán las alertas.

    4. En Correos de notificación, introduzca una o varias direcciones de correo separadas por comas para recibir alertas cuando un modelo supere un umbral de alerta.

    5. Opcional: En Canales de notificación, añade canales de Cloud Monitoring para recibir alertas cuando un modelo supere un umbral de alerta. Puede seleccionar canales de Cloud Monitoring que ya tenga o crear uno nuevo haciendo clic en Gestionar canales de notificaciones. La consola Google Cloud admite los canales de notificación de PagerDuty, Slack y Pub/Sub.

  4. Haz clic en Crear.

API

Usa la API de Vertex AI para enviar solicitudes de inferencia por lotes. Selecciona una pestaña en función de la herramienta que estés usando para obtener inferencias por lotes.

REST

Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

  • LOCATION_ID: región en la que se almacena el modelo y se ejecuta el trabajo de predicción por lotes. Por ejemplo, us-central1.

  • PROJECT_ID: tu ID de proyecto.

  • BATCH_JOB_NAME: nombre visible del trabajo de predicción por lotes.

  • MODEL_ID: ID del modelo que se va a usar para hacer predicciones.

  • INPUT_FORMAT: el formato de los datos de entrada: jsonl, csv, tf-record, tf-record-gzip o file-list.

  • INPUT_URI: URI de Cloud Storage de los datos de entrada. Puede contener comodines.

  • OUTPUT_DIRECTORY: URI de Cloud Storage de un directorio en el que quieres que Vertex AI guarde el resultado.

  • MACHINE_TYPE: los recursos de la máquina que se usarán en este trabajo de predicción por lotes.

    También puedes configurar el campo machineSpec para usar aceleradores, pero en el siguiente ejemplo no se muestra cómo hacerlo.

  • BATCH_SIZE: número de instancias que se enviarán en cada solicitud de predicción. El valor predeterminado es 64. Aumentar el tamaño del lote puede mejorar el rendimiento, pero también puede provocar que se agote el tiempo de espera de las solicitudes.

  • STARTING_REPLICA_COUNT: número de nodos de este trabajo de predicción por lotes.

Método HTTP y URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs

Cuerpo JSON de la solicitud:

{
  "displayName": "BATCH_JOB_NAME",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "INPUT_FORMAT",
    "gcsSource": {
      "uris": ["INPUT_URI"],
    },
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "OUTPUT_DIRECTORY",
    },
  },
  "dedicatedResources" : {
    "machineSpec" : {
      "machineType": MACHINE_TYPE
    },
    "startingReplicaCount": STARTING_REPLICA_COUNT
  },
  "manualBatchTuningParameters": {
    "batch_size": BATCH_SIZE,
  }
}

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs"

PowerShell

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/batchPredictionJobs" | Select-Object -Expand Content

Deberías recibir una respuesta JSON similar a la siguiente:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/batchPredictionJobs/BATCH_JOB_ID",
  "displayName": "BATCH_JOB_NAME 202005291958",
  "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
  "inputConfig": {
    "instancesFormat": "jsonl",
    "gcsSource": {
      "uris": [
        "INPUT_URI"
      ]
    }
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "gcsDestination": {
      "outputUriPrefix": "OUTPUT_DIRECTORY"
    }
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "2020-05-30T02:58:44.341643Z",
  "updateTime": "2020-05-30T02:58:44.341643Z",
}

Java

Antes de probar este ejemplo, sigue las Java instrucciones de configuración de la guía de inicio rápido de Vertex AI con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de Vertex AI.

Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

En el siguiente ejemplo, sustituye PREDICTIONS_FORMAT por jsonl. Para saber cómo sustituir los demás marcadores de posición, consulta la REST & CMD LINEpestaña de esta sección.

import com.google.cloud.aiplatform.util.ValueConverter;
import com.google.cloud.aiplatform.v1.AcceleratorType;
import com.google.cloud.aiplatform.v1.BatchDedicatedResources;
import com.google.cloud.aiplatform.v1.BatchPredictionJob;
import com.google.cloud.aiplatform.v1.GcsDestination;
import com.google.cloud.aiplatform.v1.GcsSource;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.ModelName;
import com.google.protobuf.Value;
import java.io.IOException;

public class CreateBatchPredictionJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String displayName = "DISPLAY_NAME";
    String modelName = "MODEL_NAME";
    String instancesFormat = "INSTANCES_FORMAT";
    String gcsSourceUri = "GCS_SOURCE_URI";
    String predictionsFormat = "PREDICTIONS_FORMAT";
    String gcsDestinationOutputUriPrefix = "GCS_DESTINATION_OUTPUT_URI_PREFIX";
    createBatchPredictionJobSample(
        project,
        displayName,
        modelName,
        instancesFormat,
        gcsSourceUri,
        predictionsFormat,
        gcsDestinationOutputUriPrefix);
  }

  static void createBatchPredictionJobSample(
      String project,
      String displayName,
      String model,
      String instancesFormat,
      String gcsSourceUri,
      String predictionsFormat,
      String gcsDestinationOutputUriPrefix)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (JobServiceClient client = JobServiceClient.create(settings)) {

      // Passing in an empty Value object for model parameters
      Value modelParameters = ValueConverter.EMPTY_VALUE;

      GcsSource gcsSource = GcsSource.newBuilder().addUris(gcsSourceUri).build();
      BatchPredictionJob.InputConfig inputConfig =
          BatchPredictionJob.InputConfig.newBuilder()
              .setInstancesFormat(instancesFormat)
              .setGcsSource(gcsSource)
              .build();
      GcsDestination gcsDestination =
          GcsDestination.newBuilder().setOutputUriPrefix(gcsDestinationOutputUriPrefix).build();
      BatchPredictionJob.OutputConfig outputConfig =
          BatchPredictionJob.OutputConfig.newBuilder()
              .setPredictionsFormat(predictionsFormat)
              .setGcsDestination(gcsDestination)
              .build();
      MachineSpec machineSpec =
          MachineSpec.newBuilder()
              .setMachineType("n1-standard-2")
              .setAcceleratorType(AcceleratorType.NVIDIA_TESLA_T4)
              .setAcceleratorCount(1)
              .build();
      BatchDedicatedResources dedicatedResources =
          BatchDedicatedResources.newBuilder()
              .setMachineSpec(machineSpec)
              .setStartingReplicaCount(1)
              .setMaxReplicaCount(1)
              .build();
      String modelName = ModelName.of(project, location, model).toString();
      BatchPredictionJob batchPredictionJob =
          BatchPredictionJob.newBuilder()
              .setDisplayName(displayName)
              .setModel(modelName)
              .setModelParameters(modelParameters)
              .setInputConfig(inputConfig)
              .setOutputConfig(outputConfig)
              .setDedicatedResources(dedicatedResources)
              .build();
      LocationName parent = LocationName.of(project, location);
      BatchPredictionJob response = client.createBatchPredictionJob(parent, batchPredictionJob);
      System.out.format("response: %s\n", response);
      System.out.format("\tName: %s\n", response.getName());
    }
  }
}

Python

Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la API Python.

def create_batch_prediction_job_dedicated_resources_sample(
    project: str,
    location: str,
    model_resource_name: str,
    job_display_name: str,
    gcs_source: Union[str, Sequence[str]],
    gcs_destination: str,
    instances_format: str = "jsonl",
    machine_type: str = "n1-standard-2",
    accelerator_count: int = 1,
    accelerator_type: Union[str, aiplatform_v1.AcceleratorType] = "NVIDIA_TESLA_K80",
    starting_replica_count: int = 1,
    max_replica_count: int = 1,
    sync: bool = True,
):
    aiplatform.init(project=project, location=location)

    my_model = aiplatform.Model(model_resource_name)

    batch_prediction_job = my_model.batch_predict(
        job_display_name=job_display_name,
        gcs_source=gcs_source,
        gcs_destination_prefix=gcs_destination,
        instances_format=instances_format,
        machine_type=machine_type,
        accelerator_count=accelerator_count,
        accelerator_type=accelerator_type,
        starting_replica_count=starting_replica_count,
        max_replica_count=max_replica_count,
        sync=sync,
    )

    batch_prediction_job.wait()

    print(batch_prediction_job.display_name)
    print(batch_prediction_job.resource_name)
    print(batch_prediction_job.state)
    return batch_prediction_job

BigQuery

En el ejemplo de REST anterior se usa Cloud Storage como origen y destino. Para usar BigQuery, haz los siguientes cambios:

  • Cambie el campo inputConfig por lo siguiente:

    "inputConfig": {
       "instancesFormat": "bigquery",
       "bigquerySource": {
          "inputUri": "bq://SOURCE_PROJECT_ID.SOURCE_DATASET_NAME.SOURCE_TABLE_NAME"
       }
    }
    
  • Cambie el campo outputConfig por lo siguiente:

    "outputConfig": {
       "predictionsFormat":"bigquery",
       "bigqueryDestination":{
          "outputUri": "bq://DESTINATION_PROJECT_ID.DESTINATION_DATASET_NAME.DESTINATION_TABLE_NAME"
       }
     }
    
  • Haz los cambios siguientes:

    • SOURCE_PROJECT_ID: ID del proyecto de origen Google Cloud
    • SOURCE_DATASET_NAME: nombre del conjunto de datos de BigQuery de origen
    • SOURCE_TABLE_NAME: nombre de la tabla de BigQuery de origen
    • DESTINATION_PROJECT_ID: ID del proyecto de destino Google Cloud
    • DESTINATION_DATASET_NAME: nombre del conjunto de datos de BigQuery de destino.
    • DESTINATION_TABLE_NAME: nombre de la tabla de destino de BigQuery

Importancia de características

Si quieres que se devuelvan los valores de importancia de las características de tus inferencias, asigna el valor true a la propiedad generateExplanation. Ten en cuenta que los modelos de previsión no admiten la importancia de las características, por lo que no puedes incluirla en tus solicitudes de inferencia por lotes.

La importancia de las funciones, a veces denominada atribuciones de funciones, forma parte de Vertex Explainable AI.

Solo puedes definir generateExplanation como true si has configurado tu Model para que muestre explicaciones o si especificas el campo explanationSpec de BatchPredictionJob.

Elegir el tipo de máquina y el número de réplicas

Escalar horizontalmente aumentando el número de réplicas mejora el rendimiento de forma más lineal y predecible que usando tipos de máquina más grandes.

En general, te recomendamos que especifiques el tipo de máquina más pequeño posible para tu trabajo y que aumentes el número de réplicas.

Para que sea rentable, le recomendamos que elija un número de réplicas de forma que su trabajo de inferencia por lotes se ejecute durante al menos 10 minutos. Esto se debe a que se te cobra por cada hora de nodo de réplica, lo que incluye los aproximadamente 5 minutos que tarda cada réplica en iniciarse. No es rentable procesar datos solo durante unos segundos y, después, cerrar el servicio.

Como norma general, para miles de instancias, recomendamos un starting_replica_count de decenas. En el caso de millones de instancias, recomendamos un starting_replica_count de cientos. También puede usar la siguiente fórmula para estimar el número de réplicas:

N / (T * (60 / Tb))

Donde:

  • N: número de lotes de la tarea. Por ejemplo, 1 millón de instancias/100 (tamaño del lote) = 10.000 lotes.
  • T: el tiempo previsto para la tarea de inferencia por lotes. Por ejemplo, 10 minutos.
  • Tb: el tiempo en segundos que tarda una réplica en procesar un solo lote. Por ejemplo, 1 segundo por lote en un tipo de máquina de 2 núcleos.

En nuestro ejemplo, 10.000 lotes / (10 minutos * (60 / 1 s)) se redondea a 17 réplicas.

A diferencia de la inferencia online, las tareas de inferencia por lotes no se escalan automáticamente. Como todos los datos de entrada se conocen de antemano, el sistema particiona los datos en cada réplica cuando se inicia el trabajo. El sistema usa el parámetro starting_replica_count. Se ignora el parámetro max_replica_count.

Todas estas recomendaciones son directrices aproximadas. No necesariamente proporcionan un rendimiento óptimo para todos los modelos. No proporcionan estimaciones exactas del tiempo de procesamiento ni del coste. Además, no siempre reflejan la mejor relación coste-rendimiento en cada caso. Úsalos como punto de partida razonable y ajústalos según sea necesario. Para medir características como el rendimiento de tu modelo, ejecuta el cuaderno Finding ideal machine type (Encontrar el tipo de máquina ideal).

Para máquinas aceleradas por GPU o TPU

Sigue las directrices anteriores (que también se aplican a los modelos solo con CPU) y ten en cuenta lo siguiente:

  • Es posible que necesites más CPUs y GPUs (por ejemplo, para el preprocesamiento de datos).
  • Los tipos de máquina con GPU tardan más en iniciarse (10 minutos), por lo que te recomendamos que elijas tiempos más largos (por ejemplo, al menos 20 minutos en lugar de 10) para la tarea de inferencia por lotes, de forma que se dedique una proporción razonable del tiempo y el coste a generar inferencias.

Recuperar resultados de inferencia por lotes

Cuando se completa una tarea de inferencia por lotes, el resultado de la inferencia se almacena en el segmento de Cloud Storage o en la ubicación de BigQuery que hayas especificado en tu solicitud.

Resultado de inferencia por lotes de ejemplo

La carpeta de salida contiene un conjunto de archivos JSON Lines.

Los archivos se denominan {gcs_path}/prediction.results-{file_number}-of-{number_of_files_generated}. El número de archivos no es determinista debido a la naturaleza distribuida de la inferencia por lotes.

Cada línea del archivo corresponde a una instancia de la entrada y tiene los siguientes pares clave-valor:

  • prediction: contiene el valor devuelto por el contenedor.
  • instance: en el caso de una lista de archivos, contiene el URI de Cloud Storage. En el caso de los demás formatos de entrada, contiene el valor que se ha enviado al contenedor en el cuerpo de la solicitud HTTP.

Ejemplo 1

Si la solicitud HTTP contiene lo siguiente:

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

El contenedor devuelve lo siguiente:

{
  "predictions": [
    [0.1,0.9],
    [0.7,0.3]
  ],
}

El archivo de salida JSON Lines es el siguiente:

{ "instance": [1, 2, 3, 4], "prediction": [0.1,0.9]}
{ "instance": [5, 6, 7, 8], "prediction": [0.7,0.3]}

Ejemplo 2

Si la solicitud HTTP contiene lo siguiente:

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

El contenedor devuelve lo siguiente:

{
  "predictions": [
    {"result":1},
    {"result":0}
  ],
}

El archivo de salida JSON Lines es el siguiente:

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

Usar Explainable AI

No recomendamos ejecutar explicaciones basadas en las características en una gran cantidad de datos. Esto se debe a que cada entrada puede generar miles de solicitudes en función del conjunto de valores de características posibles, lo que puede provocar un aumento masivo del tiempo y el coste de procesamiento. Por lo general, un conjunto de datos pequeño es suficiente para comprender la importancia de las funciones.

La inferencia por lotes no admite explicaciones basadas en ejemplos.

Notebooks

Siguientes pasos