Usa reservas con la inferencia por lotes

En este documento, se explica cómo usar las reservas de Compute Engine para garantizar que tus trabajos de inferencia por lotes tengan los recursos de máquina virtual (VM) necesarios para ejecutarse.

Las reservas son una función de Compute Engine. Ayudan a garantizar que tengas los recursos disponibles para crear VMs con el mismo hardware (memoria y CPU virtuales) y recursos opcionales (CPUs, GPUs, TPUs y discos SSD locales) cuando los necesites.

Cuando creas una reserva, Compute Engine verifica que la capacidad solicitada esté disponible en la zona especificada. Si es así, Compute Engine reserva los recursos, crea la reserva y sucede lo siguiente:

  • Puedes consumir los recursos reservados de inmediato, y permanecerán disponibles hasta que borres la reserva.
  • Se te cobrará por los recursos reservados con la misma tarifa según demanda que las VMs en ejecución, incluidos los descuentos aplicables, hasta que se borre la reserva. Una VM que consume una reserva no genera cargos independientes. Solo se te cobra por los recursos que no están incluidos en la reserva, como los discos o las direcciones IP. Para obtener más información, consulta los precios de las reservas.

Limitaciones y requisitos

Cuando uses reservas de Compute Engine con Vertex AI, ten en cuenta las siguientes limitaciones y requisitos:

  • Vertex AI solo puede usar reservas para CPU, VMs con GPU o TPUs (vista previa).
  • Vertex AI no puede consumir reservas de VMs que tienen discos SSD locales conectados de forma manual.
  • El uso de reservas de Compute Engine con Vertex AI solo se admite para el entrenamiento y la inferencia personalizados, y para Vertex AI Workbench (vista previa).
  • Para consumir la reserva, las propiedades de la VM de la reserva deben coincidir exactamente con tu carga de trabajo de Vertex AI. Por ejemplo, si una reserva especifica un tipo de máquina a2-ultragpu-8g, la carga de trabajo de Vertex AI solo puede consumir la reserva si también usa un tipo de máquina a2-ultragpu-8g. Consulta los Requisitos.
  • Para consumir una reserva compartida de VMs con GPU o TPU, debes consumirla con su proyecto propietario o un proyecto de consumidor con el que se comparte la reserva. Consulta Cómo funcionan las reservas compartidas.
  • Para consumir una reserva de SPECIFIC_RESERVATION, otorga el rol de IAM de Visualizador de Compute a la cuenta de servicio de Vertex AI en el proyecto que posee las reservas (service-${PROJECT_NUMBER}@gcp-sa-aiplatform.iam.gserviceaccount.com, donde PROJECT_NUMBER es el número del proyecto que consume la reserva).
  • Los siguientes servicios y funciones no son compatibles cuando se usan reservas de Compute Engine con la inferencia por lotes de Vertex AI:

    • Cumplimiento del Programa Federal de Administración de Autorizaciones y Riesgo (FedRAMP)

Facturación

Cuando usas las reservas de Compute Engine, se te factura lo siguiente:

  • Precios de Compute Engine para los recursos de Compute Engine, incluidos los descuentos por uso comprometido (CUD) aplicables. Consulta los precios de Compute Engine.
  • Tarifas de administración de la inferencia por lotes de Vertex AI, además del uso de tu infraestructura. Consulta Precios de las predicciones.

Antes de comenzar

Permite que se consuma una reserva

Antes de consumir una reserva de CPUs, VMs con GPU o TPU, debes configurar su política de uso compartido para permitir que Vertex AI consuma la reserva. Para ello, usa uno de los siguientes métodos:

Cómo permitir el consumo mientras se crea una reserva

Cuando creas una reserva de un solo proyecto o compartida de VMs con GPU, puedes permitir que Vertex AI consuma la reserva de la siguiente manera:

  • Si usas la consola de Google Cloud , en la sección Servicios de Google Cloud, selecciona Compartir reserva.
  • Si usas Google Cloud CLI, incluye la marca --reservation-sharing-policy establecida en ALLOW_ALL.
  • Si usas la API de REST, incluye en el cuerpo de la solicitud el campo serviceShareType establecido en ALLOW_ALL.

Cómo permitir el consumo en una reserva existente

Solo puedes modificar una reserva creada de forma automática de VMs con GPU o TPU para una reserva futura después de la hora de inicio de la reserva.

Para permitir que Vertex AI consuma una reserva existente, usa uno de los siguientes métodos:

Verifica que se haya consumido una reserva

Para verificar que se esté consumiendo la reserva, consulta Verifica el consumo de las reservas en la documentación de Compute Engine.

Obtén inferencias por lotes con una reserva

Para crear una solicitud de inferencia por lotes que consuma una reserva de Compute Engine de VMs con GPU, puedes usar la API de REST y elegir Cloud Storage o BigQuery como fuente y destino.

Cloud Storage

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • LOCATION_ID: Es la 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: Es el proyecto en el que se creó la reserva. Para consumir una reserva compartida de otro proyecto, debes compartir la reserva con ese proyecto. Para obtener más información, consulta Modifica los proyectos de consumidor en una reserva compartida.

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

  • MODEL_ID: Es el ID del modelo que se usará para hacer predicciones.

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

  • INPUT_URI: Es el URI de Cloud Storage de tus datos de entrada. Puede contener comodines.

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

  • MACHINE_TYPE: Los recursos de máquina que se usarán para este trabajo de predicción por lotes.

  • ACCELERATOR_TYPE: Es el tipo de acelerador que se adjuntará a la máquina. Para obtener más información sobre el tipo de GPU que admite cada tipo de máquina, consulta GPU para cargas de trabajo de procesamiento.

  • ACCELERATOR_COUNT: Es la cantidad de aceleradores que se deben conectar a la máquina.

  • RESERVATION_AFFINITY_TYPE: Debe ser ANY, SPECIFIC_RESERVATION o NONE.

    • ANY significa que las VMs de tu customJob pueden consumir automáticamente cualquier reserva con propiedades coincidentes.
    • SPECIFIC_RESERVATION significa que las VMs de tu customJob solo pueden consumir una reserva a la que las VMs se orienten de forma específica por nombre.
    • NONE significa que las VMs de tu customJob no pueden consumir ninguna reserva. Especificar NONE tiene el mismo efecto que omitir una especificación de afinidad de reserva.
  • BATCH_SIZE: La cantidad de instancias que se enviarán en cada solicitud de predicción. El valor predeterminado es 64. El aumento del tamaño del lote puede provocar una mayor capacidad de procesamiento, pero también puede provocar tiempos de espera de solicitudes.

  • STARTING_REPLICA_COUNT: Es la cantidad de nodos para 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,
      "acceleratorType": "ACCELERATOR_TYPE",
      "acceleratorCount": ACCELERATOR_COUNT,
      "reservationAffinity": {
        "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
        "key": "compute.googleapis.com/reservation-name",
        "values": [
          "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
        ]
      }
    },
    "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 que se muestra a continuación:

{
  "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",
}

BigQuery

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • LOCATION_ID: Es la 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: Es el proyecto en el que se creó la reserva. Para consumir una reserva compartida de otro proyecto, debes compartir la reserva con ese proyecto. Para obtener más información, consulta Modifica los proyectos de consumidor en una reserva compartida.

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

  • MODEL_ID: Es el ID del modelo que se usará para hacer predicciones.

  • INPUT_PROJECT_ID: Es el ID del proyecto Google Cloud del que deseas obtener los datos.

  • INPUT_DATASET_NAME: Es el nombre del conjunto de datos de BigQuery del que deseas obtener los datos.

  • INPUT_TABLE_NAME: Es el nombre de la tabla de BigQuery de la que deseas obtener los datos.

  • OUTPUT_PROJECT_ID: Es el ID del proyecto Google Cloud en el que deseas guardar el resultado.

  • OUTPUT_DATASET_NAME: Es el nombre del conjunto de datos de BigQuery de destino en el que deseas guardar el resultado.

  • OUTPUT_TABLE_NAME: Es el nombre de la tabla de destino de BigQuery en la que deseas guardar el resultado.

  • MACHINE_TYPE: Los recursos de máquina que se usarán para este trabajo de predicción por lotes.

  • ACCELERATOR_TYPE: Es el tipo de acelerador que se adjuntará a la máquina. Para obtener más información sobre el tipo de GPU que admite cada tipo de máquina, consulta GPU para cargas de trabajo de procesamiento.

  • ACCELERATOR_COUNT: Es la cantidad de aceleradores que se deben conectar a la máquina.

  • RESERVATION_AFFINITY_TYPE: Debe ser ANY, SPECIFIC_RESERVATION o NONE.

    • ANY significa que las VMs de tu customJob pueden consumir automáticamente cualquier reserva con propiedades coincidentes.
    • SPECIFIC_RESERVATION significa que las VMs de tu customJob solo pueden consumir una reserva a la que las VMs se orienten de forma específica por nombre.
    • NONE significa que las VMs de tu customJob no pueden consumir ninguna reserva. Especificar NONE tiene el mismo efecto que omitir una especificación de afinidad de reserva.
  • BATCH_SIZE: La cantidad de instancias que se enviarán en cada solicitud de predicción. El valor predeterminado es 64. El aumento del tamaño del lote puede provocar una mayor capacidad de procesamiento, pero también puede provocar tiempos de espera de solicitudes.

  • STARTING_REPLICA_COUNT: Es la cantidad de nodos para 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": "bigquery",
    "bigquerySource": {
      "inputUri": "bq://INPUT_PROJECT_ID.INPUT_DATASET_NAME.INPUT_TABLE_NAME"
    },
  },
  "outputConfig": {
    "predictionsFormat":"bigquery",
    "bigqueryDestination":{
      "outputUri": "bq://OUTPUT_PROJECT_ID.OUTPUT_DATASET_NAME.OUTPUT_TABLE_NAME"
    }
  },
  "dedicatedResources" : {
    "machineSpec" : {
      "machineType": MACHINE_TYPE,
      "acceleratorType": "ACCELERATOR_TYPE",
      "acceleratorCount": ACCELERATOR_COUNT,
      "reservationAffinity": {
        "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
        "key": "compute.googleapis.com/reservation-name",
        "values": [
          "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
        ]
      }
    },
    "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 que se muestra a continuación:

{
  "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",
    "bigquerySource": {
      "uris": [
        "INPUT_URI"
      ]
    }
  },
  "outputConfig": {
    "predictionsFormat": "jsonl",
    "bigqueryDestination": {
      "outputUri": "OUTPUT_URI"
    }
  },
  "state": "JOB_STATE_PENDING",
  "createTime": "2020-05-30T02:58:44.341643Z",
  "updateTime": "2020-05-30T02:58:44.341643Z",
}

Recupera los resultados de la inferencia por lotes

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

¿Qué sigue?