Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Réduire les coûts de Vertex AI Predictions avec Cloud Run

By Nadav WeissmanFeb 13, 20246 min read

Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et Português.

Problématique

De nombreuses organisations souhaitent tirer parti de Vertex AI pour la richesse de ses fonctionnalités et son intégration à l'écosystème Google Cloud, plutôt que de se contenter de créer un endpoint sur une VM pour y déployer leur modèle. Mais le coût constitue un frein majeur et impose de chercher une solution plus efficace et plus économique.

Le cœur du problème : sur Vertex AI, le coût du déploiement d'un modèle dépend du temps écoulé, indépendamment de l'utilisation réelle des ressources, comme l'indique la documentation tarifaire :

AI Platform Prediction sert les prédictions de votre modèle en exécutant un certain nombre de machines virtuelles (nodes).

Vous êtes facturé pour la durée d'exécution de chaque node attribué à votre modèle, à savoir :

1. Lorsque le node traite une requête de prédiction en ligne.

2. Lorsque le node est prêt à servir des prédictions en ligne.

Le coût d'un node exécuté pendant une heure correspond à une node hour. Une node hour représente le temps qu'une machine virtuelle passe à exécuter votre tâche de prédiction ou à attendre dans un état actif (un endpoint avec un ou plusieurs modèles déployés) pour traiter des requêtes de prédiction ou d'explication.

Lorsque les prédictions en ligne ne sont prévues qu'à certains moments de la journée ou de la semaine, l'impossibilité de descendre à zéro pendant les périodes d'inactivité devient un véritable problème. Le défi est d'autant plus marqué avec des modèles GPU, dont les coûts peuvent rapidement s'envoler.

Le dilemme du client

Dans notre cas, un client souhaite utiliser Vertex AI pour des prédictions en ligne avec le modèle de fondation Stable Diffusion (qui requiert un GPU) durant les heures et jours ouvrés — concrètement, cinq jours par semaine, de 7 h à 19 h.

Au lieu de 720 node hours, il aimerait ne payer que l'utilisation réelle, soit 240 node hours seulement (30 %).

Solution proposée

Pour répondre à ce besoin, nous allons nous appuyer sur les Cloud Run jobs :

Les Cloud Run jobs permettent aux développeurs d'exécuter des scripts longs jusqu'à leur terme, le tout sur une plateforme serverless !

Si votre code effectue une tâche puis s'arrête (un script en est un bon exemple), un Cloud Run job peut s'en charger. Vous pouvez lancer un job en ligne de commande via la gcloud CLI ou planifier son exécution récurrente.

Notre approche pragmatique repose sur trois étapes principales :

  1. Déployer le modèle sur un endpoint de prédiction en ligne Vertex AI
  2. Générer des Cloud Run jobs pour déployer et retirer le modèle des endpoints Vertex AI Prediction
  3. Mettre en place la planification des jobs

Déploiement du modèle sur un endpoint de prédiction

J'ai utilisé Vertex AI Model Garden pour parcourir et sélectionner un modèle pré-entraîné adapté aux besoins du client. Le modèle stable-diffusion-2–1 répond aux exigences spécifiées. En cliquant sur l'option Deploy dans la console, l'artefact du modèle est chargé dans Vertex AI Model Registry, puis déployé sur un endpoint de prédiction en ligne.

J'ai ensuite testé le modèle avec succès, puis je l'ai retiré manuellement.

Détails de la version du modèle dans Model Garden

Le modèle a été importé dans Model Registry

Le conteneur du modèle est déployé sur l'endpoint de prédiction en ligne

Cloud Run pour orchestrer le déploiement et le retrait du modèle

Pour piloter finement le déploiement et le retrait de notre modèle de machine learning sur les endpoints Vertex AI, nous nous appuyons sur Cloud Run Job.

Le Job a pour rôle de déployer ou de retirer le modèle. Il exécute un script shell qui contient les commandes gcloud nécessaires au déploiement et au retrait du modèle sur l'endpoint de prédiction.

Création des Cloud Run jobs

Pour créer les Cloud Run jobs, voici les étapes à suivre :

  1. Renseigner les paramètres du modèle pour qu'ils correspondent aux valeurs configurées lors du déploiement initial sur l'endpoint : MODEL_NAME,MACHINE_TYPE,ACCELERATOR_TYPE,ENDPOINT_NAME

Ces paramètres sont à adapter selon votre usage. 2. Créer les Cloud Run jobs pour le déploiement et le retrait du modèle sur les endpoints Vertex AI. La création du job se fait via gcloud run jobs en utilisant l'option de déploiement depuis la source (-source), qui construit le conteneur, le pousse vers Artifact Registry et déploie les jobs sur Cloud Run. 3. Créer un déclencheur de planification pour exécuter les jobs selon la configuration souhaitée à l'aide de gcloud pour la planification des jobs. Cette fonctionnalité permet de définir des horaires précis afin d'aligner l'activité des ressources sur des plages spécifiques pour les prédictions en ligne, à la journée comme à la semaine.

Le dépôt GitHub vertex-ai-mng-deploy permet de générer les jobs DEPLOY et UNDEPLOY du modèle sur l'endpoint Vertex AI. Il contient :

1. CreateCloudRunJobs.sh pour la création des Cloud Run jobs

2. MngModelDeploy.sh pour le déploiement et le retrait du modèle sur l'endpoint Vertex AI

3. Un fichier Docker permettant de créer un conteneur incluant le script MngModelDeploy.sh.

Voici le contenu de 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

Planification des jobs :

Le déclencheur de planification des Cloud Run jobs joue un rôle clé pour orchestrer ces processus de déploiement et de retrait sur l'endpoint Vertex AI. Il permet de définir des horaires précis afin d'aligner l'activité des ressources sur les plages prévues pour les prédictions en ligne, à la journée comme à la semaine.

La dernière partie du script CreateCloudRunJobs.sh contient la création des jobs de planification (via 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]

Déploiement et retrait du modèle

Le script MngModelDeploy.sh est exécuté par le Job et, en fonction de l'argument d'entrée ACTION, détermine le rôle du Job : déployer ou retirer le modèle.

Job de déploiement du modèle et commande :

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 retrait du modèle et commande :

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

Conclusion

En définitive, associer Vertex AI à Cloud Run pour le déploiement et la planification offre un moyen pragmatique et efficace d'éviter une consommation inutile de ressources pendant les périodes d'inactivité, et donc de générer des économies substantielles.

En s'attaquant aux contraintes spécifiques des modèles tarifaires basés sur le temps, les organisations exploitent pleinement le potentiel de Vertex AI tout en préservant leur efficacité financière.