Compartir recursos entre implementaciones

Un modelo de Vertex AI se despliega en su propia instancia de máquina virtual (VM) de forma predeterminada. Vertex AI ofrece la posibilidad de alojar modelos en la misma máquina virtual, lo que proporciona las siguientes ventajas:

  • Compartir recursos entre varias implementaciones.
  • Aplicación de modelos rentable.
  • Se ha mejorado el uso de la memoria y los recursos computacionales.

En esta guía se describe cómo compartir recursos entre varias implementaciones en Vertex AI.

Información general

La compatibilidad con el coanfitrión de modelos introduce el concepto de DeploymentResourcePool, que agrupa las implementaciones de modelos que comparten recursos en una sola máquina virtual. Se pueden implementar varios endpoints en la misma VM dentro de un DeploymentResourcePool. Cada endpoint tiene uno o varios modelos implementados. Los modelos desplegados de un endpoint determinado se pueden agrupar en el mismo DeploymentResourcePool o en otro.

En el siguiente ejemplo, tienes cuatro modelos y dos endpoints:

Modelos de cohosting de varios endpoints

Model_A, Model_B y Model_C se implementan en Endpoint_1 y el tráfico se dirige a todos ellos. Model_D se implementa en Endpoint_2, que recibe el 100% del tráfico de ese endpoint. En lugar de asignar cada modelo a una VM independiente, puede agrupar los modelos de una de las siguientes formas:

  • Agrupa Model_A y Model_B para compartir una VM, lo que los convierte en parte de DeploymentResourcePool_X.
  • Agrupa Model_C y Model_D (que actualmente no están en el mismo endpoint) para compartir una VM, lo que los convierte en parte de DeploymentResourcePool_Y.

Los diferentes grupos de recursos de implementación no pueden compartir una máquina virtual.

Cuestiones importantes

No hay límite máximo en el número de modelos que se pueden implementar en un único grupo de recursos de implementación. Depende del perfil de VM elegido, del tamaño de los modelos y de los patrones de tráfico. El alojamiento conjunto funciona bien cuando tienes muchos modelos desplegados con tráfico disperso, de forma que asignar una máquina dedicada a cada modelo desplegado no utiliza los recursos de forma eficaz.

Puedes desplegar modelos en el mismo grupo de recursos de implementación simultáneamente. Sin embargo, hay un límite de 20 solicitudes de despliegue simultáneas en cualquier momento.

Un pool de recursos de implementación vacío no consume tu cuota de recursos. Los recursos se aprovisionan en un grupo de recursos de implementación cuando se implementa el primer modelo y se liberan cuando se desimplementa el último modelo.

Los modelos de un mismo grupo de recursos de implementación no están aislados entre sí y pueden competir por la CPU y la memoria. El rendimiento de un modelo puede ser peor si otro modelo está procesando una solicitud de inferencia al mismo tiempo.

Limitaciones

Se aplican las siguientes limitaciones al implementar modelos con la función de compartir recursos habilitada:

Desplegar un modelo

Para implementar un modelo en un DeploymentResourcePool, sigue estos pasos:

  1. Crea un pool de recursos de implementación si es necesario.
  2. Crea un endpoint si es necesario.
  3. Obtén el ID del endpoint.
  4. Despliega el modelo en el endpoint del pool de recursos de despliegue.

Crear un grupo de recursos de implementación

Si vas a implementar un modelo en un DeploymentResourcePool, omite este paso:

Usa CreateDeploymentResourcePool para crear un pool de recursos.

Consola de Cloud

  1. En la Google Cloud consola, ve a la página Grupos de recursos de implementación de Vertex AI.

    Ir a Grupos de recursos de implementación

  2. Haz clic en Crear y rellena el formulario (que se muestra a continuación).

    Crea un formulario de grupo de recursos de implementación con un número mínimo y máximo de nodos de 1 y un umbral de CPU de autoescalado de nodos de 60.

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: tu ID de proyecto.
  • MACHINE_TYPE: opcional. Los recursos de la máquina que se usan 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: tipo de acelerador que se va a asociar a la máquina. Opcional si ACCELERATOR_COUNT no se especifica o es cero. No se recomienda para modelos de AutoML ni modelos entrenados personalizados que usen imágenes que no sean de GPU. Más información
  • ACCELERATOR_COUNT: número de aceleradores que debe usar cada réplica. Opcional. Debe ser cero o no especificarse en los modelos de AutoML o en los modelos entrenados personalizados que usen imágenes que no sean de GPU.
  • 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.
  • REQUIRED_REPLICA_COUNT: opcional. Número de nodos necesarios para que esta implementación se marque como correcta. Debe ser igual o superior a 1 e igual o inferior al número mínimo de nodos. Si no se especifica, el valor predeterminado es el número mínimo de nodos.
  • DEPLOYMENT_RESOURCE_POOL_ID: un nombre para tu DeploymentResourcePool. La longitud máxima es de 63 caracteres y los caracteres válidos son /^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$/.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

{
  "deploymentResourcePool":{
    "dedicatedResources":{
      "machineSpec":{
        "machineType":"MACHINE_TYPE",
        "acceleratorType":"ACCELERATOR_TYPE",
        "acceleratorCount":"ACCELERATOR_COUNT"
      },
      "minReplicaCount":MIN_REPLICA_COUNT, 
      "maxReplicaCount":MAX_REPLICA_COUNT,
      "requiredReplicaCount":REQUIRED_REPLICA_COUNT
    }
  },
  "deploymentResourcePoolId":"DEPLOYMENT_RESOURCE_POOL_ID"
}

Para enviar tu solicitud, despliega una de estas opciones:

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/deploymentResourcePools/DEPLOYMENT_RESOURCE_POOL_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateDeploymentResourcePoolOperationMetadata",
    "genericMetadata": {
      "createTime": "2022-06-15T05:48:06.383592Z",
      "updateTime": "2022-06-15T05:48:06.383592Z"
    }
  }
}

Puedes sondear el estado de la operación hasta que la respuesta incluya "done": true.

Python

# Create a deployment resource pool.
deployment_resource_pool = aiplatform.DeploymentResourcePool.create(
    deployment_resource_pool_id="DEPLOYMENT_RESOURCE_POOL_ID",  # User-specified ID
    machine_type="MACHINE_TYPE",  # Machine type
    min_replica_count=MIN_REPLICA_COUNT,  # Minimum number of replicas
    max_replica_count=MAX_REPLICA_COUNT,  # Maximum number of replicas
)

Haz los cambios siguientes:

  • DEPLOYMENT_RESOURCE_POOL_ID: un nombre para tu DeploymentResourcePool. La longitud máxima es de 63 caracteres y los caracteres válidos son /^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$/.
  • MACHINE_TYPE: opcional. Los recursos de la máquina que se usan en cada nodo de este despliegue. El valor predeterminado es n1-standard-2. Más información sobre los tipos de máquinas
  • 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 esta implementación. El recuento 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.

Crear un punto final

Para crear un endpoint, consulta Crear un endpoint público con la CLI de gcloud o la API de Vertex AI. Este paso es el mismo que para una implementación de un solo modelo.

Recuperar el ID del endpoint

Para obtener el ID del endpoint, consulta Desplegar un modelo con la CLI de gcloud o la API de Vertex AI. Este paso es el mismo que para una implementación de un solo modelo.

Desplegar el modelo en un pool de recursos de despliegue

Una vez que hayas creado un DeploymentResourcePool y un endpoint, podrás desplegarlo con el método de la API DeployModel. Este proceso es similar a una implementación de un solo modelo. Si hay un DeploymentResourcePool, especifica shared_resources de DeployModel con el nombre de recurso del DeploymentResourcePool que estés implementando.

Consola de Cloud

  1. En la Google Cloud consola, ve a la página Registro de modelos de Vertex AI.

    Ir a Registro de modelos

  2. Busca tu modelo y haz clic en Implementar en endpoint.

  3. En Configuración del modelo (que se muestra más abajo), selecciona Implementar en un grupo de recursos de implementación compartidos.

    Formulario de configuración del modelo, con la división del tráfico definida en 100 y la opción Desplegar en un grupo de recursos de implementación compartidos seleccionada

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: tu ID de proyecto.
  • 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.
  • DEPLOYMENT_RESOURCE_POOL_ID: un nombre para tu DeploymentResourcePool. La longitud máxima es de 63 caracteres y los caracteres válidos son /^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$/.
  • TRAFFIC_SPLIT_THIS_MODEL: porcentaje del tráfico de predicción de este punto final que se va a 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: valor del porcentaje de división del tráfico de la clave del ID del modelo implementado.
  • PROJECT_NUMBER: el número de proyecto generado automáticamente de tu proyecto

Método HTTP y URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/endpoints/ENDPOINT_ID:deployModel

Cuerpo JSON de la solicitud:

{
  "deployedModel": {
    "model": "projects/PROJECT/locations/us-central1/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_NAME",
    "sharedResources":"projects/PROJECT/locations/us-central1/deploymentResourcePools/DEPLOYMENT_RESOURCE_POOL_ID"
  },
  "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_NUMBER/locations/LOCATION/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeployModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2022-06-19T17:53:16.502088Z",
      "updateTime": "2022-06-19T17:53:16.502088Z"
    }
  }
}

Python

# Deploy model in a deployment resource pool.
model = aiplatform.Model("MODEL_ID")
model.deploy(deployment_resource_pool=deployment_resource_pool)

Sustituye MODEL_ID por el ID del modelo que se va a implementar.

Repite la solicitud anterior con diferentes modelos que tengan los mismos recursos compartidos para desplegar varios modelos en el mismo grupo de recursos de implementación.

Obtener inferencias

Puedes enviar solicitudes de inferencia a un modelo de un DeploymentResourcePool como lo harías con cualquier otro modelo desplegado en Vertex AI.