Usar reservas con la inferencia por lotes

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

Las reservas son una función de Compute Engine. Te ayudan a asegurarte de que tienes los recursos disponibles para crear máquinas virtuales con el mismo hardware (memoria y vCPUs) 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 ocurre lo siguiente:

  • Puedes usar los recursos reservados inmediatamente y seguirán estando disponibles hasta que elimines la reserva.
  • Se te cobrarán los recursos reservados a la misma tarifa bajo demanda que las máquinas virtuales en ejecución, incluidos los descuentos aplicables, hasta que se elimine la reserva. Las VMs que consumen una reserva no incurren en cargos independientes. Solo se te cobrarán los recursos que no estén incluidos en la reserva, como discos o 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 CPUs, VMs con GPU, o TPUs (vista previa).
  • Vertex AI no puede consumir reservas de VMs que tengan discos SSD locales vinculados manualmente.
  • Solo se admite el uso de reservas de Compute Engine con Vertex AI para el entrenamiento y la inferencia personalizados, así como para Vertex AI Workbench (vista previa).
  • Las propiedades de la VM de una reserva deben coincidir exactamente con las de tu carga de trabajo de Vertex AI para que se pueda consumir la reserva. Por ejemplo, si una reserva especifica un tipo de máquina a2-ultragpu-8g, la carga de trabajo de Vertex AI solo podrá consumir la reserva si también usa un tipo de máquina a2-ultragpu-8g. Consulta los requisitos.
  • Para consumir una reserva compartida de máquinas virtuales con GPU o TPUs, debes hacerlo con el proyecto propietario o con un proyecto consumidor con el que se haya compartido la reserva. Consulta Cómo funcionan las reservas compartidas.
  • Para consumir una reserva de SPECIFIC_RESERVATION, asigna el rol de gestión de identidades y accesos Lector de Compute a la cuenta de servicio de Vertex AI en el proyecto propietario de 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 se admiten cuando se usan reservas de Compute Engine con la inferencia por lotes de Vertex AI:

    • Cumplimiento del programa federal de gestión de autorizaciones y riesgo de EE. UU. (FedRAMP)

Facturación

Cuando usas reservas de Compute Engine, se te cobra por lo siguiente:

  • Precios de los recursos de Compute Engine, incluidos los descuentos por compromiso de uso (CUDs) aplicables. Consulta los precios de Compute Engine.
  • Tarifas de gestión de la inferencia por lotes de Vertex AI, además del uso de la infraestructura. Consulta los precios de Prediction.

Antes de empezar

Permitir que se consuma una reserva

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

Permitir el consumo al crear una reserva

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

  • Si usas la Google Cloud consola, ve a la sección Servicios de Google Cloud y selecciona Compartir reserva.
  • Si usas Google Cloud CLI, incluye la marca --reservation-sharing-policy definida como ALLOW_ALL.
  • Si usas la API REST, incluye en el cuerpo de la solicitud el campo serviceShareType con el valor ALLOW_ALL.

Permitir el consumo en una reserva

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

Para permitir que Vertex AI use una reserva, utilice uno de los siguientes métodos:

Verificar que se ha consumido una reserva

Para comprobar que se está usando la reserva, consulta la sección Verificar el consumo de reservas en la documentación de Compute Engine.

Obtener inferencias por lotes usando una reserva

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

Cloud Storage

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

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

  • PROJECT_ID: 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 el artículo Modificar los proyectos de consumidor de una reserva compartida.

  • 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: el URI de Cloud Storage de los datos de entrada. Puede contener comodines.

  • OUTPUT_DIRECTORY: el 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.

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

  • ACCELERATOR_COUNT: número de aceleradores que se van a asociar 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 se dirijan específicamente por su 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: número de instancias que se enviarán en cada predicción. El valor predeterminado es 64. Si aumentas el tamaño del lote, el rendimiento puede ser mayor, pero también pueden producirse tiempos 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,
      "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 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",
}

BigQuery

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

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

  • PROJECT_ID: 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 el artículo Modificar los proyectos de consumidor de una reserva compartida.

  • 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_PROJECT_ID: el ID del proyecto Google Cloud del que quieras obtener los datos.

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

  • INPUT_TABLE_NAME: nombre de la tabla de BigQuery de la que quieres obtener los datos.

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

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

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

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

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

  • ACCELERATOR_COUNT: número de aceleradores que se van a asociar 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 se dirijan específicamente por su 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: número de instancias que se enviarán en cada predicción. El valor predeterminado es 64. Si aumentas el tamaño del lote, el rendimiento puede ser mayor, pero también pueden producirse tiempos 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": "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 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",
    "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",
}

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.

Siguientes pasos