Usar reservas con inferencia

En este documento se explica cómo usar las reservas de Compute Engine para tener la certeza de que tus trabajos de predicción 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 admitir actualizaciones periódicas de tus implementaciones de Vertex AI, te recomendamos que aumentes el número de VMs en más del número total de réplicas, tal como se indica a continuación, según el tipo de reserva que utilice tu DeployedModel:
    • SPECIFIC_RESERVATION: debe especificar al menos 1 VM adicional. Recomendamos un 10% (pero al menos 1). Los modelos implementados que usan SPECIFIC_RESERVATION tienen garantizado que solo consumirán VMs de la reserva. Vertex AI no puede realizar actualizaciones si no hay ninguna máquina virtual adicional.
    • ANY:
      • No es necesario tener más VMs, ya que los modelos implementados que usan ANY reservas utilizan VMs bajo demanda si la capacidad de la reserva no es suficiente. Sin embargo, si no tienes máquinas virtuales adicionales, es posible que tu reserva no se utilice por completo después de una actualización. Por ejemplo, supongamos que tienes una reserva con 40 VMs y que implementas un modelo con 40 réplicas usando esa reserva. Cuando realices la primera implementación, las 40 VMs de la reserva las usará DeployedModel. Después de la actualización, solo 36 VMs proceden de la reserva y 4 VMs son bajo demanda.
      • Si quieres mantener el uso dentro de la reserva, te recomendamos que tengas al menos 1 VM adicional por cada DeployedModel o DeploymentResourcePool que utilice la reserva. Si el número total de máquinas virtuales del mismo tipo en tus reservas de ANY es inferior a 50, te recomendamos que añadas un 10 % más (pero al menos 1). Si es superior a 50, recomendamos un 25% más. Por ejemplo:
        • Si tienes previsto desplegar modelos con 40 máquinas virtuales A3, puedes tener una reserva A3 con 44 máquinas virtuales o dos reservas A3: la reserva X con 30 máquinas virtuales y la reserva Y con 14 máquinas virtuales (44 en total). Lo mismo ocurre con otros números de reservas, siempre que se compartan con Vertex AI y el número total de VMs de esas reservas sea de al menos 44.
        • Si tienes previsto desplegar modelos con 100 máquinas virtuales A3, el número total de máquinas virtuales de todas las reservas A3 compartidas con Vertex AI debe ser de al menos 125.
        • Si tienes previsto desplegar 2 modelos con 10 VMs, el número total de VMs de todas las reservas de A3 compartidas con Vertex AI debe ser de al menos 12. El número de VMs es inferior a 50, pero el número de VMs adicionales es 2 (1 por DeployedModel).

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 predicciones 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 mediante una reserva

Para crear un despliegue de modelo que consuma una reserva de máquinas virtuales con GPU de Compute Engine, usa la API REST o el SDK de Vertex AI para Python.

REST

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

  • LOCATION_ID: la región en la que usas Vertex AI.
  • 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.
  • ENDPOINT_ID: ID del endpoint.
  • MODEL_ID: ID del modelo que se va a implementar.
  • DEPLOYED_MODEL_NAME: nombre del DeployedModel. También puedes usar el nombre visible de la Model para la DeployedModel.
  • MACHINE_TYPE: el tipo de máquina que se usará en cada nodo de esta implementación. Su ajuste predeterminado es n1-standard-2. Para obtener más información sobre los tipos de máquinas admitidos, consulta Configurar recursos de computación para la predicción.
  • ACCELERATOR_TYPE: el 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.
  • ZONE: la zona en la que se creó la reserva.
  • RESERVATION_NAME: el nombre de tu reserva.
  • MIN_REPLICA_COUNT: número mínimo de nodos de esta implementación. El número de nodos se puede aumentar o reducir según lo requiera la carga de inferencia, hasta el número máximo de nodos y nunca por debajo de este número. Este valor debe ser superior o igual a 1.
  • MAX_REPLICA_COUNT: número máximo de nodos de este despliegue. El número de nodos se puede aumentar o reducir según lo requiera la carga de inferencia, hasta este número de nodos y nunca por debajo del número mínimo de nodos.
  • TRAFFIC_SPLIT_THIS_MODEL: el porcentaje del tráfico de predicción de este punto final que se debe dirigir al modelo que se está desplegando con esta operación. El valor predeterminado es 100. Todos los porcentajes de tráfico deben sumar 100. Más información sobre las divisiones de tráfico
  • DEPLOYED_MODEL_ID_N: opcional. Si se implementan otros modelos en este endpoint, debes actualizar los porcentajes de división del tráfico para que todos los porcentajes sumen 100.
  • TRAFFIC_SPLIT_MODEL_N: el valor del porcentaje de división del tráfico de la clave del ID del modelo implementado.
  • PROJECT_NUMBER: el número de proyecto que se genera automáticamente.

Método HTTP y URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel

Cuerpo JSON de la solicitud:

{
  "deployedModel": {
    "model": "projects/PROJECT/locations/LOCATION_ID/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_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"
          ]
        }
      },
      "minReplicaCount": MIN_REPLICA_COUNT,
      "maxReplicaCount": MAX_REPLICA_COUNT
    },
  },
  "trafficSplit": {
    "0": TRAFFIC_SPLIT_THIS_MODEL,
    "DEPLOYED_MODEL_ID_1": TRAFFIC_SPLIT_MODEL_1,
    "DEPLOYED_MODEL_ID_2": TRAFFIC_SPLIT_MODEL_2
  },
}

Para enviar tu solicitud, despliega una de estas opciones:

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

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1beta1.DeployModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-10-19T17:53:16.502088Z",
      "updateTime": "2020-10-19T17:53:16.502088Z"
    }
  }
}

Python

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

Antes de ejecutar cualquiera de las siguientes secuencias de comandos, haz los siguientes cambios:

  • DEPLOYED_NAME: un nombre para el modelo implementado.
  • TRAFFIC_SPLIT: el valor del porcentaje de división del tráfico de la clave del ID del modelo implementado.
  • MACHINE_TYPE: la máquina utilizada en cada nodo de esta implementación. Su ajuste predeterminado es n1-standard-2. Más información sobre los tipos de máquinas
  • ACCELERATOR_TYPE: el 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.
  • 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.
  • ZONE: la zona en la que se encuentra la reserva.
  • RESERVATION_NAME: el nombre de tu reserva.
  • MIN_REPLICA_COUNT: número mínimo de nodos de esta implementación. El número de nodos se puede aumentar o reducir según lo requiera la carga de inferencia, hasta el número máximo de nodos y nunca por debajo de este número. Este valor debe ser superior o igual a 1.
  • MAX_REPLICA_COUNT: número máximo de nodos de este despliegue. El número de nodos se puede aumentar o reducir según lo requiera la carga de inferencia, hasta este número de nodos y nunca por debajo del número mínimo de nodos.

En función del tipo de reserva que quieras consumir, haz una de las siguientes acciones:

  • Para consumir una reserva específica, sigue estos pasos:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="SPECIFIC_RESERVATION",
        reservation_affinity_key="compute.googleapis.com/reservation-name",
        reservation_affinity_values=["projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"],
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )
  • Para consumir una reserva que se ha consumido automáticamente, siga estos pasos:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="ANY_RESERVATION",
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )

Siguientes pasos