Usa una implementación continua para reemplazar un modelo implementado

En una implementación continua, un modelo implementado se reemplaza por una versión nueva del mismo modelo. El modelo nuevo reutiliza los recursos de procesamiento del anterior.

En la solicitud de implementación continua, la división del tráfico y los valores de dedicatedResources son los mismos que para la implementación anterior. Una vez que se completa la implementación gradual, se actualiza la división del tráfico para mostrar que todo el tráfico de la DeployedModel anterior se migró a la nueva implementación.

De forma predeterminada, otros campos configurables en DeployedModel (como serviceAccount, disableContainerLogging y enableAccessLogging) se establecen en los mismos valores que para el DeployedModel anterior. Sin embargo, puedes especificar valores nuevos para estos campos de manera opcional.

Cuando se implementa un modelo con una implementación continua, se crea un DeployedModel nuevo. El nuevo DeployedModel recibe un ID nuevo que es diferente del anterior. También recibe un nuevo valor revisionNumber en el campo rolloutOptions.

Si hay varias implementaciones continuas segmentadas para los mismos recursos de copia de seguridad, el DeployedModel con el revisionNumber más alto se considera el estado final previsto.

A medida que avanza la implementación continua, todas las réplicas existentes del DeployedModel anterior se reemplazan por réplicas del DeployedModel nuevo. Esto ocurre con rapidez, y las réplicas se actualizan cada vez que la implementación tiene suficientes réplicas disponibles o suficiente capacidad de aumento para mostrar réplicas adicionales.

Además, a medida que avanza la implementación continua, el tráfico de la DeployedModel anterior se migra gradualmente a la DeployedModel nueva. El tráfico se balancea en proporción a la cantidad de réplicas listas para servir de cada DeployedModel.

Si las réplicas nuevas de la implementación continua nunca están listas porque su ruta de estado muestra constantemente un código de respuesta que no es 200, el tráfico no se envía a esas réplicas que no están listas. En este caso, la implementación continua falla y las réplicas se revierten al DeployedModel anterior.

Cómo iniciar una implementación progresiva

Para iniciar una implementación continua, incluye el campo rolloutOptions en la solicitud de implementación del modelo, como se muestra en el siguiente ejemplo.

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: El ID del proyecto.
  • ENDPOINT_ID: Es el ID del extremo.
  • MODEL_ID: El ID del modelo que se implementará.
  • PREVIOUS_DEPLOYED_MODEL: El ID DeployedModel de un modelo en el mismo extremo. Esto especifica el DeployedModel cuyos recursos de respaldo se volverán a usar. Puedes llamar a GetEndpoint para obtener una lista de los modelos implementados en un extremo junto con sus IDs numéricos.
  • MAX_UNAVAILABLE_REPLICAS: Es la cantidad de réplicas de modelos que se pueden quitar durante la implementación gradual.
  • MAX_SURGE_REPLICAS: Es la cantidad de réplicas de modelos adicionales que se pueden activar durante la implementación continua. Si se establece en cero, solo se usa la capacidad existente.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

{
  "deployedModel": {
    "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID",
    "rolloutOptions": {
      "previousDeployedModel": "PREVIOUS_DEPLOYED_MODEL",
      "maxUnavailableReplicas": "MAX_UNAVAILABLE_REPLICAS",
      "maxSurgeReplicas": "MAX_SURGE_REPLICAS"
    }
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel"

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$headers = @{  }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel" | Select-Object -Expand Content

Deberías recibir un código de estado exitoso (2xx) y una respuesta vacía.

Si lo deseas, puedes reemplazar maxSurgeReplicas y maxUnavailableReplicas, o ambos, por valores de porcentaje, como se muestra en el siguiente ejemplo.

REST

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

  • MAX_UNAVAILABLE_PERCENTAGE: Es el porcentaje de réplicas de modelos que se pueden inhabilitar durante la implementación continua.
  • MAX_SURGE_PERCENTAGE: Es el porcentaje de réplicas de modelos adicionales que se pueden activar durante la implementación continua. Si se establece en cero, solo se usa la capacidad existente.

Método HTTP y URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/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",
    "rolloutOptions": {
      "previousDeployedModel": "PREVIOUS_DEPLOYED_MODEL",
      "maxUnavailablePercentage": "MAX_UNAVAILABLE_PERCENTAGE",
      "maxSurgePercentage": "MAX_SURGE_PERCENTAGE"
    }
  }
}

Para enviar tu solicitud, expande una de estas opciones:

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel"

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$headers = @{  }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel" | Select-Object -Expand Content

Deberías recibir un código de estado exitoso (2xx) y una respuesta vacía.

Cómo revertir una implementación continua

Para revertir una implementación progresiva, inicia una nueva implementación progresiva del modelo anterior con el ID DeployedModel de la implementación progresiva en curso como el previousDeployedModel.

Para obtener el ID DeployedModel de una implementación en curso, establece el parámetro allDeploymentStates=true en la llamada a GetEndpoint, como se muestra en el siguiente ejemplo.

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: El ID del proyecto.
  • ENDPOINT_ID: Es el ID del extremo.

Método HTTP y URL:

GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID?allDeploymentStates=true

Para enviar tu solicitud, expande una de estas opciones:

Ejecuta el siguiente comando:

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID?allDeploymentStates=true"

Ejecuta el siguiente comando:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID?allDeploymentStates=true" | Select-Object -Expand Content

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",
  "displayName": "rolling-deployments-endpoint",
  "deployedModels": [
    {
      "id": "2718281828459045",
      "model": "projects/PROJECT_ID/locations/LOCATION_ID/models/MODEL_ID@1",
      "displayName": "rd-test-model",
      "createTime": "2024-09-11T21:37:48.522692Z",
      "dedicatedResources": {
        "machineSpec": {
          "machineType": "e2-standard-2"
        },
        "minReplicaCount": 5,
        "maxReplicaCount": 5
      },
      "modelVersionId": "1",
      "state": "BEING_DEPLOYED"
    }
  ],
  "etag": "AMEw9yMs3TdZMn8CUg-3DY3wS74bkIaTDQhqJ7-Ld_Zp7wgT8gsEfJlrCOyg67lr9dwn",
  "createTime": "2024-09-11T21:22:36.588538Z",
  "updateTime": "2024-09-11T21:27:28.563579Z",
  "dedicatedEndpointEnabled": true,
  "dedicatedEndpointDns": "ENDPOINT_ID.LOCATION_ID-PROJECT_ID.prediction.vertexai.goog"
}

Restricciones y limitaciones

  • El DeployedModel anterior debe estar en el mismo extremo que el DeployedModel nuevo.
  • No puedes crear varias implementaciones continuas con la misma previousDeployedModel.
  • No puedes crear implementaciones continuas sobre un DeployedModel que no se haya implementado por completo. Excepción: Si previousDeployedModel es una implementación progresiva en curso, se puede crear una nueva implementación progresiva sobre ella. Esto permite revertir las implementaciones que comienzan a fallar.
  • Los modelos anteriores no se desimplementan automáticamente después de que se completa correctamente una implementación gradual. Puedes desimplementar el modelo de forma manual.
  • Para las implementaciones continuas en extremos públicos compartidos, predictRoute y healthRoute del modelo nuevo deben ser los mismos que los del modelo anterior.
  • Las implementaciones continuas no son compatibles con el hosting compartido de modelos.
  • Las implementaciones continuas no se pueden usar para modelos que requieran explicaciones en línea.