Usa reservas con inferencia

En este documento, se explica cómo usar las reservas de Compute Engine para garantizar que tus trabajos de predicción 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 (vista previa), 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 admitir actualizaciones periódicas de tus implementaciones de Vertex AI, te recomendamos que aumentes el recuento de VM en más de la cantidad total de réplicas de la siguiente manera, según el tipo de reserva que use tu DeployedModel:
    • SPECIFIC_RESERVATION: Se debe especificar al menos 1 VM adicional. Recomendamos un 10% (pero al menos 1). Se garantiza que los modelos implementados con SPECIFIC_RESERVATION solo consumirán VMs de la reserva. Vertex AI no puede realizar actualizaciones si no hay una VM adicional.
    • ANY:
      • No es necesario tener VMs adicionales, ya que los modelos implementados que usan la reserva de ANY utilizan VMs a pedido si la capacidad de la reserva no es suficiente. Sin embargo, sin VMs 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 realizas la primera implementación, el DeployedModel usa las 40 VMs de la reserva. Después de la actualización, solo 36 VMs son de la reserva y 4 VMs son según demanda.
      • Si deseas mantener el uso dentro de la reserva, te recomendamos tener al menos 1 VM adicional para cada DeployedModel o DeploymentResourcePool que use la reserva. Si la cantidad total de VMs del mismo tipo en tus reservas de ANY es inferior a 50, te recomendamos que agregues un 10% más (pero al menos 1). Si es mayor que 50, te recomendamos que aumentes el presupuesto en un 25%. Por ejemplo:
        • Si planeas implementar modelos con 40 VMs A3, puedes tener 1 reserva de A3 con 44 VMs o 2 reservas de A3: la reserva X con 30 VMs y la reserva Y con 14 VMs (44 en total). Lo mismo se aplica a otras cantidades de reservas, siempre y cuando todas se compartan con Vertex AI y la cantidad total de VMs en esas reservas sea de al menos 44.
        • Si planeas implementar modelos con 100 VMs A3, la cantidad total de VMs en todas las reservas de A3 compartidas con Vertex AI debe ser de al menos 125.
        • Si planeas implementar 2 modelos con 10 VMs, la cantidad total de VMs en todas las reservas de A3 compartidas con Vertex AI debe ser de al menos 12. La cantidad de VMs es inferior a 50, pero la cantidad de VMs adicionales es 2 (1 por DeployedModel).
  • 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 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 predicciones 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 con una reserva

Para crear una implementación de modelo que consuma una reserva de Compute Engine de VMs con GPU, usa la API de REST o el SDK de Vertex AI para Python.

REST

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

  • LOCATION_ID: la región en la que usas Vertex AI.
  • 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.
  • ENDPOINT_ID: Es el ID del extremo.
  • MODEL_ID: El ID del modelo que se implementará.
  • DEPLOYED_MODEL_NAME: Un nombre para DeployedModel También puedes usar el nombre comercial de Model para DeployedModel.
  • MACHINE_TYPE: Es el tipo de máquina que se usará para cada nodo en esta implementación. Su configuración predeterminada es n1-standard-2. Para obtener más información sobre los tipos de máquinas compatibles, consulta Configura recursos de procesamiento para la predicción.
  • 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.
  • ZONE: Es la zona en la que se creó la reserva.
  • RESERVATION_NAME: El nombre de tu reserva.
  • MIN_REPLICA_COUNT: La cantidad mínima de nodos para esta implementación. El recuento de nodos se puede aumentar o disminuir según lo requiera la carga de inferencia, hasta la cantidad máxima de nodos y nunca menos que esta cantidad. Este valor debe ser mayor o igual que 1.
  • MAX_REPLICA_COUNT: La cantidad máxima de nodos para esta implementación. El recuento de nodos se puede aumentar o disminuir según lo requiera la carga de inferencia, hasta esta cantidad de nodos y nunca menos que la cantidad mínima de nodos.
  • TRAFFIC_SPLIT_THIS_MODEL: El porcentaje del tráfico de predicción a este extremo para enrutar al modelo que se implementa con esta operación. La configuración predeterminada es 100. Todos los porcentajes de tráfico deben sumar hasta 100. Obtén más información sobre las divisiones del tráfico.
  • DEPLOYED_MODEL_ID_N: Opcional Si se implementan otros modelos en este extremo, debes actualizar sus porcentajes de división del tráfico para que todos los porcentajes sumen hasta 100.
  • TRAFFIC_SPLIT_MODEL_N: Es el valor de porcentaje de división del tráfico para la clave del ID del modelo implementado.
  • PROJECT_NUMBER: el número de proyecto de tu proyecto generado de forma automática.

HTTP method and 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, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

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

Si deseas obtener información para instalar o actualizar el SDK de Vertex AI para Python, consulta Instala el SDK de Vertex AI para Python. Si deseas 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, realiza los siguientes reemplazos:

  • DEPLOYED_NAME: Es un nombre para el modelo implementado.
  • TRAFFIC_SPLIT: Es el valor de porcentaje de división del tráfico para la clave del ID del modelo implementado.
  • MACHINE_TYPE: Es la máquina que se usa para cada nodo de esta implementación. Su configuración predeterminada es n1-standard-2. Obtén más información sobre los tipos de máquinas.
  • ACCELERATOR_TYPE: Es el tipo de acelerador que se conectará 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.
  • 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.
  • ZONE: Es la zona en la que se encuentra la reserva.
  • RESERVATION_NAME: El nombre de tu reserva.
  • MIN_REPLICA_COUNT: La cantidad mínima de nodos para esta implementación. El recuento de nodos se puede aumentar o disminuir según lo requiera la carga de inferencia, hasta la cantidad máxima de nodos y nunca menos que esta cantidad. Este valor debe ser mayor o igual que 1.
  • MAX_REPLICA_COUNT: La cantidad máxima de nodos para esta implementación. El recuento de nodos se puede aumentar o disminuir según lo requiera la carga de inferencia, hasta esta cantidad de nodos y nunca menos que la cantidad mínima de nodos.

Según el tipo de reserva que quieras consumir, realiza una de las siguientes acciones:

  • Para consumir una reserva específica, haz lo siguiente:
    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 consume automáticamente, haz lo siguiente:
    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
    )

¿Qué sigue?