Planteamiento del problema:
Muchas organizaciones quieren aprovechar las ventajas de Vertex AI por sus funciones robustas y su integración con el ecosistema de Google Cloud, en lugar de simplemente crear un endpoint en una VM y desplegar ahí el modelo para hacer predicciones. Sin embargo, el costo representa un obstáculo considerable y obliga a buscar una solución más eficiente y rentable.
El núcleo del problema es que el costo asociado al despliegue de modelos en Vertex AI depende del tiempo, sin importar el uso real de los recursos, tal como se describe en la documentación de precios:
AI Platform Prediction entrega predicciones desde tu modelo ejecutando una serie de máquinas virtuales ("nodos").
Se cobra por el tiempo que cada nodo se ejecuta para tu modelo, incluyendo:
1. Cuando el nodo está procesando una solicitud de predicción en línea.
2. Cuando el nodo está en estado listo para servir predicciones en línea.
El costo de un nodo en ejecución durante una hora es una hora-nodo. Una hora-nodo representa el tiempo que una máquina virtual pasa ejecutando tu trabajo de predicción o esperando en estado activo (un endpoint con uno o más modelos desplegados) para atender solicitudes de predicción o explicación.
Cuando las predicciones en línea solo se programan en intervalos específicos del día o de la semana, no poder escalar a cero durante los periodos de inactividad se vuelve un problema importante. El reto se intensifica con modelos basados en GPU, ya que los costos pueden dispararse con rapidez.
El dilema del cliente:
En nuestro escenario, un cliente quiere usar el servicio Vertex AI para predicciones en línea del modelo fundacional Stable Diffusion (que requiere GPU) durante el horario y los días laborales habituales: específicamente, cinco días a la semana de 7 AM a 7 PM.
En lugar de pagar por 720 horas-nodo, el cliente quisiera pagar por el uso real, que es de apenas 240 horas-nodo (30%).
Solución propuesta:
Para resolver este problema, vamos a usar los Cloud Run jobs:
Los Cloud Run jobs permiten a los desarrolladores ejecutar scripts largos, de principio a fin, ¡todo sobre una plataforma serverless!
Si tu código realiza una tarea y luego se detiene (un script es un buen ejemplo), puedes usar un Cloud Run job para ejecutarlo. Puedes lanzar un job desde la línea de comandos con la CLI de gcloud o programar un job recurrente.
Nuestro enfoque pragmático consta de tres pasos principales:
- Desplegar el modelo en un endpoint de predicción en línea de Vertex AI
- Generar Cloud Run jobs tanto para desplegar como para retirar el modelo en los endpoints de Vertex AI Prediction
- Crear la programación de los jobs
Despliegue del modelo en un endpoint de predicción
Usé Vertex AI Model Garden para explorar y elegir un modelo preentrenado adecuado a las necesidades del cliente. El modelo stable-diffusion-2–1 cumple con los requisitos especificados. Al elegir la opción 'Deploy' en la consola, el artefacto del modelo se sube al Vertex AI Model Registry y luego se despliega en un endpoint de predicción en línea.
Después probé el modelo con éxito y lo retiré manualmente.

Detalles de la versión del modelo en Model Garden

El modelo se importó al Model Registry

El contenedor del modelo desplegado en el endpoint de predicción en línea
Cómo aprovechar Cloud Run para coordinar el despliegue y retiro del modelo
Para controlar con precisión el despliegue y el retiro de nuestro modelo de machine learning en los endpoints de Vertex AI, nos apoyamos en Cloud Run Job.
El Job tiene como propósito desplegar o retirar el modelo. Se basa en un script de shell que contiene los comandos gcloud necesarios para desplegar y retirar el modelo en el endpoint de predicción.
Crear los Cloud Run Jobs:
Para crear los Cloud Run jobs, seguimos estos pasos:
- Especificar los parámetros del modelo para que coincidan con los valores configurados durante el despliegue inicial del modelo en el endpoint:
MODEL_NAME,MACHINE_TYPE,ACCELERATOR_TYPE,ENDPOINT_NAME
Estos parámetros deben reemplazarse según tu caso de uso.
2. Crear los Cloud Run Jobs para desplegar y retirar el modelo en los endpoints de Vertex AI. La creación del job se hace con gcloud run jobs y la opción de desplegar desde el código fuente (-source), que construye el contenedor, lo sube al Artifact Registry y despliega los jobs en Cloud Run.
3. Crear un trigger de scheduler para ejecutar los jobs según la configuración con gcloud para la programación del job. Esta funcionalidad permite definir horarios precisos y asegurar que la actividad de los recursos coincida con los intervalos específicos para predicciones en línea durante el día y la semana.
El repositorio de GitHub vertex-ai-mng-deploy sirve para generar los jobs DEPLOY y UNDEPLOY del modelo en el endpoint de Vertex AI. El repositorio incluye lo siguiente:
1. CreateCloudRunJobs.sh para la creación del Cloud Run job
2. MngModelDeploy.sh para desplegar/retirar el modelo en el endpoint de Vertex AI
3. Un Dockerfile para crear un contenedor que incluye el script MngModelDeploy.sh.
Este es el CreateCloudRunJobs.sh:
#!/bin/bash -xv
#A number that will be used for the id of the model deployment
ENDPOINT_NAME="stabilityai_stable-diffusion-endpoint"
MODEL_NAME="stable-diffusion-2-1"
MACHINE_TYPE="g2-standard-8"
ACCELERATOR_TYPE="nvidia-l4"
PROJECT=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe "$PROJECT" --format="value(projectNumber)")
REGION=us-central1
DEPLOY_JOB_NAME=deploy-model-$MODEL_NAME
UNDEPLOY_JOB_NAME=undeploy-model-$MODEL_NAME
TIME_ZONE='UTC'
DEPLOY_SCHEDULE="0 7 * * *"
UN_DEPLOY_SCHEDULE="0 19 * * *"
#create a job for model deploy
gcloud run jobs deploy $DEPLOY_JOB_NAME --region=$REGION --source vertex-ai-mng-deploy \
--task-timeout=1800 --command "./MngModelDeploy.sh" \
--args DEPLOY,$ENDPOINT_NAME,$MODEL_NAME,$MACHINE_TYPE,$ACCELERATOR_TYPE \
--set-env-vars RUN_DEBUG=true,REGION=$REGION
#describe the job created
gcloud run jobs --region=$REGION describe $DEPLOY_JOB_NAME
#create a job for model undeploy
gcloud run jobs deploy $UNDEPLOY_JOB_NAME --region=$REGION --source vertex-ai-mng-deploy \
--task-timeout=180 --command "./MngModelDeploy.sh" \
--args UNDEPLOY,$ENDPOINT_NAME,$MODEL_NAME --set-env-vars RUN_DEBUG=true,REGION=$REGION
#describe the job created
gcloud run jobs --region=$REGION describe $UNDEPLOY_JOB_NAME
Programación de Jobs:
El trigger del scheduler de Cloud Run Jobs es clave para programar estos procesos de despliegue y retiro en el endpoint de Vertex AI. Esta funcionalidad permite definir horarios precisos y asegurar que la actividad de los recursos coincida con los intervalos específicos para predicciones en línea durante el día o la semana.
La última parte del script CreateCloudRunJobs.sh contiene la creación de los jobs de programación (con Cloud Scheduler):
#create a schedule for deploy
gcloud scheduler jobs create http scheduler-$DEPLOY_JOB_NAME \
--location $REGION \
--schedule="$DEPLOY_SCHEDULE" --time-zone=$TIME_ZONE \
--uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT/jobs/$DEPLOY_JOB_NAME:run" \
--http-method POST \
--oauth-service-account-email "$PROJECT_NUMBER"[email protected]
#create a schedule for undeploy
gcloud scheduler jobs create http scheduler-$DEPLOY_JOB_NAME \
--location $REGION \
--schedule="$UN_DEPLOY_SCHEDULE" --time-zone=$TIME_ZONE \
--uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT/jobs/$DEPLOY_JOB_NAME:run" \
--http-method POST \
--oauth-service-account-email "$PROJECT_NUMBER"[email protected]
Despliegue y retiro del modelo:
El script MngModelDeploy.sh lo ejecuta el Job y, según el argumento de entrada ACTION, define la funcionalidad del Job e indica si la tarea es desplegar o retirar el modelo:
Job de despliegue del modelo y comando:
nadav@cloudshell:~$ gcloud run jobs describe deploy-model-stable-diffusion-2-1 --region=us-central1
✔ Job deploy-model-stable-diffusion-2-1 in region us-central1
Executed 6 times
Last executed 2024-01-30T08:06:22.875396Z with execution deploy-model-stable-diffusion-2-1-sr7kk
Image: us-central1-docker.pkg.dev/nadav/cloud-run-source-deploy/deploy-model-stable-diffusion-2-1@sha256:328c1117422af347be0906b0e4d27211ca764559e2405e8832d30d2f55158974
Tasks: 1
Command: ./MngModelDeploy.sh
Args: DEPLOY stabilityai_stable-diffusion-endpoint stable-diffusion-2-1 g2-standard-8 nvidia-l4
Memory: 512Mi
CPU: 1000m
Task Timeout: 30m
Max Retries: 3
Parallelism: No limit
Service account: [email protected]
Env vars:
REGION us-central1
RUN_DEBUG true
if [ "$ACTION" == "DEPLOY" ]; then
# Model deploy (takes time)
MODEL_ID=$(gcloud ai models list --region=$REGION \
--filter="DISPLAY_NAME:$MODEL_NAME" --format="value(MODEL_ID)")
echo "Deploying model..."
gcloud ai endpoints deploy-model "$ENDPOINT_ID" --region=$REGION \
--model="$MODEL_ID" --display-name="$MODEL_NAME"\
--machine-type="$MACHINE_TYPE" --accelerator=count=1,type="$ACCELERATOR_TYPE"
fi
Job de retiro del modelo y comando:
nadav@cloudshell$ gcloud run jobs describe undeploy-model-stable-diffusion-2-1 --region=us-central1
✔ Job undeploy-model-stable-diffusion-2-1 in region us-central1
Executed 6 times
Last executed 2024-01-30T08:04:57.205233Z with execution undeploy-model-stable-diffusion-2-1-kgrrc
Image: us-central1-docker.pkg.dev/nadav/cloud-run-source-deploy/undeploy-model-stable-diffusion-2-1@sha256:b1a8de6919205191feab7e4bed5d98fba9b40ecc9cb6cdae5a5fda550a54f612
Tasks: 1
Command: ./MngModelDeploy.sh
Args: UNDEPLOY stabilityai_stable-diffusion-endpoint stable-diffusion-2-1
Memory: 512Mi
CPU: 1000m
Task Timeout: 3m
Max Retries: 3
Parallelism: No limit
Service account: [email protected]
Env vars:
REGION us-central1
RUN_DEBUG true
if [ "$ACTION" == "UNDEPLOY" ]; then
echo "Un-deploying model..."
DEPLOY_MODEL_ID=$(gcloud ai endpoints describe "$ENDPOINT_ID" --region=$REGION \
--format=json | \
jq --arg ml_name "$MODEL_NAME" \
-r '.deployedModels[] | select(.displayName == $ml_name).id')
gcloud ai endpoints undeploy-model "$ENDPOINT_ID" --region=$REGION \
--deployed-model-id="$DEPLOY_MODEL_ID"
fi
Conclusión:
En resumen, la solución propuesta de combinar Vertex AI con Cloud Run para el despliegue y la programación es una forma práctica y efectiva de evitar el consumo innecesario de recursos durante los periodos de inactividad, lo que se traduce en un ahorro significativo.
Al atacar los retos específicos de las estructuras de costos basadas en tiempo, las organizaciones pueden aprovechar todo el potencial de Vertex AI sin sacrificar la eficiencia financiera.