Ce tutoriel explique comment diffuser un modèle de machine learning (ML) PyTorch pré-entraîné sur un cluster GKE à l'aide du framework TorchServe pour une mise en service évolutive. Le modèle de ML utilisé dans ce tutoriel génère des prédictions basées sur les requêtes des utilisateurs. Vous pouvez utiliser les informations de ce tutoriel pour déployer et diffuser vos propres modèles à grande échelle sur GKE.
À propos de l'application du tutoriel
L'application est une petite application Web Python créée à l'aide du framework Fast Dash. Vous utilisez l'application pour envoyer des requêtes de prédiction au modèle T5. Cette application capture les entrées de texte et les paires linguistiques des utilisateurs, puis envoie les informations au modèle. Le modèle traduit le texte et renvoie le résultat à l'application, qui le présente à l'utilisateur. Pour en savoir plus sur Fast Dash, consultez la documentation de Fast Dash.
Fonctionnement
Ce tutoriel déploie les charges de travail sur un cluster GKE Autopilot. GKE gère entièrement les nœuds Autopilot, ce qui réduit les frais d'administration pour la configuration, le scaling et les mises à niveau des nœuds. Lorsque vous déployez la charge de travail et l'application de ML sur Autopilot, GKE choisit le type de machine et la taille sous-jacents appropriés pour exécuter les charges de travail. Pour en savoir plus, consultez la page Présentation d'Autopilot.
Après avoir déployé le modèle, vous obtenez une URL de prédiction que votre application peut utiliser pour envoyer des requêtes de prédiction au modèle. Cette méthode dissocie le modèle de l'application, ce qui lui permet d'évoluer indépendamment de l'application Web.
Objectifs
- Préparer un modèle T5 pré-entraîné à partir du dépôt Hugging Face pour le diffuser en l'empaquetant en tant qu'image de conteneur et en le transférant dans Artifact Registry
- Déployer le modèle sur un cluster Autopilot
- Déployer l'application Fast Dash qui communique avec le modèle
- Autoscaling du modèle en fonction des métriques Prometheus
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine, Cloud Storage, Artifact Registry, and Cloud Build APIs:
gcloud services enable container.googleapis.com
storage.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine, Cloud Storage, Artifact Registry, and Cloud Build APIs:
gcloud services enable container.googleapis.com
storage.googleapis.com artifactregistry.googleapis.com cloudbuild.googleapis.com
Préparer l'environnement
Clonez l'exemple de dépôt et ouvrez le répertoire du tutoriel :
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/ai-ml/t5-model-serving
Créer le cluster
Exécutez la commande ci-dessous.
gcloud container clusters create-auto ml-cluster \
--release-channel=RELEASE_CHANNEL \
--cluster-version=CLUSTER_VERSION \
--location=us-central1
Remplacez les éléments suivants :
RELEASE_CHANNEL
: version disponible pour votre cluster. Doit être défini surrapid
,regular
oustable
. Choisissez un canal disposant de la version 1.28.3-gke.1203000 ou ultérieure de GKE pour utiliser des GPU L4. Pour afficher les versions disponibles dans un canal spécifique, consultez la section Afficher les versions par défaut et disponibles pour les canaux de publication.CLUSTER_VERSION
: version de GKE à utiliser. Doit être1.28.3-gke.1203000
ou une version ultérieure.
Cette opération prend plusieurs minutes.
Créer un dépôt Artifact Registry
Créez un dépôt standard Artifact Registry au format Docker dans la même région que votre cluster :
gcloud artifacts repositories create models \ --repository-format=docker \ --location=us-central1 \ --description="Repo for T5 serving image"
Vérifiez le nom du dépôt :
gcloud artifacts repositories describe models \ --location=us-central1
Le résultat ressemble à ce qui suit :
Encryption: Google-managed key Repository Size: 0.000MB createTime: '2023-06-14T15:48:35.267196Z' description: Repo for T5 serving image format: DOCKER mode: STANDARD_REPOSITORY name: projects/PROJECT_ID/locations/us-central1/repositories/models updateTime: '2023-06-14T15:48:35.267196Z'
Empaqueter le modèle
Dans cette section, vous allez empaqueter le modèle et le framework de diffusion dans une seule image de conteneur à l'aide de Cloud Build, puis transférer l'image obtenue dans le dépôt Artifact Registry.
Examinez le fichier Dockerfile de l'image du conteneur :
Ce fichier Dockerfile définit le processus de compilation en plusieurs étapes suivant :
- Téléchargez les artefacts de modèle à partir du dépôt Hugging Face.
- Empaquetez le modèle à l'aide de l'outil PyTorch Serving Archive. Cela crée un fichier d'archive de modèle (.mar) que le serveur d'inférence utilise pour charger le modèle.
- Créez l'image finale avec PyTorch Serve.
Créez et transférez l'image à l'aide de Cloud Build :
gcloud builds submit model/ \ --region=us-central1 \ --config=model/cloudbuild.yaml \ --substitutions=_LOCATION=us-central1,_MACHINE=gpu,_MODEL_NAME=t5-small,_MODEL_VERSION=1.0
Le processus de compilation prend plusieurs minutes. Si le modèle est de taille supérieure à
t5-small
, le processus de compilation risque de prendre considérablement plus de temps.Vérifiez que l'image se trouve dans le dépôt :
gcloud artifacts docker images list us-central1-docker.pkg.dev/PROJECT_ID/models
Remplacez
PROJECT_ID
par l'ID de votre projet Google Cloud.Le résultat ressemble à ce qui suit :
IMAGE DIGEST CREATE_TIME UPDATE_TIME us-central1-docker.pkg.dev/PROJECT_ID/models/t5-small sha256:0cd... 2023-06-14T12:06:38 2023-06-14T12:06:38
Déployer le modèle empaqueté sur GKE
Pour déployer l'image, modifiez le fichier manifeste Kubernetes dans l'exemple de dépôt afin qu'il corresponde à votre environnement.
Examinez le fichier manifeste pour la charge de travail d'inférence :
Remplacez
PROJECT_ID
par l'ID de votre projet Google Cloud :sed -i "s/PROJECT_ID/PROJECT_ID/g" "kubernetes/serving-gpu.yaml"
Cela garantit que le chemin d'accès de l'image de conteneur dans la spécification du déploiement correspond au chemin d'accès à votre image de modèle T5 dans Artifact Registry.
Créez les ressources Kubernetes :
kubectl create -f kubernetes/serving-gpu.yaml
Pour vérifier que le modèle a bien été déployé, procédez comme suit :
Obtenez l'état du déploiement et du service :
kubectl get -f kubernetes/serving-gpu.yaml
Attendez que le résultat affiche des pods prêts, comme ci-dessous. Selon la taille de l'image, la première extraction d'image peut prendre plusieurs minutes.
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/t5-inference 1/1 1 0 66s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/t5-inference ClusterIP 10.48.131.86 <none> 8080/TCP,8081/TCP,8082/TCP 66s
Ouvrez un port local pour le service
t5-inference
:kubectl port-forward svc/t5-inference 8080
Ouvrez une nouvelle fenêtre de terminal et envoyez une requête de test au service :
curl -v -X POST -H 'Content-Type: application/json' -d '{"text": "this is a test sentence", "from": "en", "to": "fr"}' "http://localhost:8080/predictions/t5-small/1.0"
Si la requête de test échoue et que la connexion du pod se ferme, consultez les journaux :
kubectl logs deployments/t5-inference
Si le résultat ressemble à ce qui suit, TorchServe n'a pas réussi à installer certaines dépendances de modèle :
org.pytorch.serve.archive.model.ModelException: Custom pip package installation failed for t5-small
Pour résoudre ce problème, redémarrez le déploiement :
kubectl rollout restart deployment t5-inference
Le contrôleur de déploiement crée un pod. Répétez les étapes précédentes pour ouvrir un port sur le nouveau pod.
Accéder au modèle déployé à l'aide de l'application Web
Créez et transférez l'application Web Fast Dash en tant qu'image de conteneur dans Artifact Registry :
gcloud builds submit client-app/ \ --region=us-central1 \ --config=client-app/cloudbuild.yaml
Ouvrez
kubernetes/application.yaml
dans un éditeur de texte et remplacezPROJECT_ID
dans le champimage:
par votre ID de projet. Vous pouvez également exécuter la commande suivante :sed -i "s/PROJECT_ID/PROJECT_ID/g" "kubernetes/application.yaml"
Créez les ressources Kubernetes :
kubectl create -f kubernetes/application.yaml
Le provisionnement complet des services de déploiement et de service peut prendre un certain temps.
Pour vérifier l'état, exécutez la commande suivante :
kubectl get -f kubernetes/application.yaml
Attendez que le résultat affiche des pods prêts, semblable à ceci :
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/fastdash 1/1 1 0 1m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fastdash NodePort 203.0.113.12 <none> 8050/TCP 1m
L'application Web est désormais en cours d'exécution, bien qu'elle ne soit pas exposée sur une adresse IP externe. Pour accéder à l'application Web, ouvrez un port local :
kubectl port-forward service/fastdash 8050
Dans un navigateur, ouvrez l'interface Web :
- Si vous utilisez un shell local, ouvrez un navigateur et accédez à l'adresse http://127.0.0.1:8050.
- Si vous utilisez Cloud Shell, cliquez sur Aperçu Web, puis sur Modifier le port. Définissez le port
8050
.
Pour envoyer une requête au modèle T5, spécifiez des valeurs dans les champs TEXT, FROM LANG et TO LANG de l'interface Web et cliquez sur Envoyer. Pour obtenir la liste des langues disponibles, consultez la documentation T5.
Activer l'autoscaling pour le modèle
Cette section explique comment activer l'autoscaling pour le modèle en fonction des métriques de Google Cloud Managed Service pour Prometheus en procédant comme suit :
- Installer l'adaptateur de métriques personnalisées Stackdriver
- Appliquer les configurations PodMonitoring et HorizontalPodAutoscaling
Google Cloud Managed Service pour Prometheus est activé par défaut dans les clusters Autopilot exécutant les versions 1.25 et ultérieures.
Installer l'adaptateur de métriques personnalisées Stackdriver
Cet adaptateur permet à votre cluster d'utiliser les métriques de Prometheus pour prendre des décisions d'autoscaling Kubernetes.
Déployez l'adaptateur :
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Créez un compte de service IAM que l'adaptateur utilisera :
gcloud iam service-accounts create monitoring-viewer
Attribuez au compte de service IAM le rôle
monitoring.viewer
sur le projet et le rôleiam.workloadIdentityUser
:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
Remplacez
PROJECT_ID
par l'ID de votre projet Google Cloud.Annotez le compte de service Kubernetes de l'adaptateur pour lui permettre d'emprunter l'identité du compte de service IAM :
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace custom-metrics \ iam.gke.io/gcp-service-account=monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com
Redémarrez l'adaptateur pour propager les modifications :
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
Appliquer les configurations PodMonitoring et HorizontalPodAutoscaling
PodMonitoring est une ressource personnalisée Google Cloud Managed Service pour Prometheus qui permet l'ingestion de métriques et le scraping cible dans un espace de noms spécifique.
Déployez la ressource PodMonitoring dans le même espace de noms que le déploiement TorchServe :
kubectl apply -f kubernetes/pod-monitoring.yaml
Examinez le fichier manifeste HorizontalPodAutoscaler :
L'objet HorizontalPodAutoscaler adapte la quantité de pods du modèle T5 en fonction de la durée cumulée de la file d'attente de requêtes. L'autoscaling est basé sur la métrique
ts_queue_latency_microseconds
, qui affiche la durée cumulée de la file d'attente en microsecondes.Créez l'objet HorizontalPodAutoscaler :
kubectl apply -f kubernetes/hpa.yaml
Vérifier l'autoscaling à l'aide d'un générateur de charge
Pour tester votre configuration d'autoscaling, générez une charge pour l'application de diffusion. Ce tutoriel utilise un générateur de charge Locust pour envoyer des requêtes au point de terminaison de prédiction du modèle.
Créez le générateur de charge :
kubectl apply -f kubernetes/loadgenerator.yaml
Attendez que les pods du générateur de charge soient prêts.
Exposez l'interface Web du générateur de charge localement :
kubectl port-forward svc/loadgenerator 8080
Si un message d'erreur s'affiche, réessayez lorsque le pod est en cours d'exécution.
Dans un navigateur, ouvrez l'interface Web du générateur de charge :
- Si vous utilisez un shell local, ouvrez un navigateur et accédez à l'adresse http://127.0.0.1:8080.
- Si vous utilisez Cloud Shell, cliquez sur Aperçu Web, puis sur Modifier le port. Indiquez le port
8080
.
Cliquez sur l'onglet Graphiques pour observer les performances au fil du temps.
Ouvrez une nouvelle fenêtre de terminal et surveillez le nombre d'instances dupliquées de vos autoscalers horizontaux de pods :
kubectl get hpa -w
Le nombre d'instances répliquées augmente à mesure que la charge augmente. Le scaling à la hausse peut prendre environ dix minutes. À mesure que de nouvelles instances répliquées démarrent, le nombre de requêtes réussies dans le graphique Locust augmente.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE t5-inference Deployment/t5-inference 71352001470m/7M 1 5 1 2m11s
Recommandations
- Créez votre modèle avec la même version de l'image Docker de base que celle que vous utiliserez pour la diffusion.
- Si votre modèle possède des dépendances de package spéciales ou si la taille de vos dépendances est importante, créez une version personnalisée de votre image Docker de base.
- Observez la version d'arborescence de vos packages de dépendance de modèle. Assurez-vous que vos dépendances de package sont compatibles avec leurs versions respectives. Par exemple, Panda version 2.0.3 est compatible avec NumPy version 1.20.3 et ultérieure.
- Exécutez des modèles avec une utilisation intensive des GPU sur des nœuds GPU et des modèles avec utilisation intensive du processeur sur le processeur. Cela peut améliorer la stabilité de la diffusion du modèle et vous assurer que vous consommez efficacement les ressources de nœud.
Effectuer un nettoyage
Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.
Supprimer le projet
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Supprimer des ressources individuelles
Supprimez les ressources Kubernetes :
kubectl delete -f kubernetes/loadgenerator.yaml kubectl delete -f kubernetes/hpa.yaml kubectl delete -f kubernetes/pod-monitoring.yaml kubectl delete -f kubernetes/application.yaml kubectl delete -f kubernetes/serving-gpu.yaml kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Supprimez le cluster GKE :
gcloud container clusters delete "ml-cluster" \ --location="us-central1" --quiet
Supprimez le compte de service IAM et les liaisons de stratégie IAM :
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts remove-iam-policy-binding monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]" gcloud iam service-accounts delete monitoring-viewer
Supprimez les images dans Artifact Registry. Vous pouvez également supprimer l'intégralité du dépôt. Pour obtenir des instructions, consultez la documentation d'Artifact Registry sur la suppression d'images.
Présentation des composants
Cette section décrit les composants utilisés dans ce tutoriel, tels que le modèle, l'application Web, le framework et le cluster.
À propos du modèle T5
Ce tutoriel utilise un modèle T5 multilingue pré-entraîné. Le type T5 est un transformateur texte-vers-texte qui convertit du texte d'une langue à une autre. Avec le modèle T5, les entrées et les sorties sont toujours des chaînes de texte, contrairement aux modèles de type BERT qui ne peuvent générer qu'une étiquette de classe ou un segment de l'entrée. Le modèle T5 peut également être utilisé pour des tâches telles que la synthèse, les questions/réponses ou la classification de texte. Le modèle est entraîné sur une grande quantité de texte provenant de Colossal Clean Crawled Corpus (C4) et de Wiki-DPR.
Pour en savoir plus, consultez la documentation du modèle T5.
Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li, et Peter J. Liu a présenté le modèle T5 dans l'article Explore the Limits of Transfer Learning with a Unified Text-to-Text Transformer (Explorer les limites de l'apprentissage par transfert avec un transformateur de texte-vers-texte unifié) publié dans le Journal of Machine Learning Research.
Le modèle T5 est compatible avec différentes tailles de modèle, avec différents niveaux de complexité adaptés à des cas d'utilisation spécifiques. Ce tutoriel utilise la taille par défaut, t5-small
, mais vous pouvez également en choisir une autre. Les tailles T5 suivantes sont distribuées sous la licence Apache 2.0 :
t5-small
: 60 millions de paramètrest5-base
: 220 millions de paramètrest5-large
: 770 millions de paramètres. 3 Go pour le téléchargement.t5-3b
: 3 milliards de paramètres. 11 Go pour le téléchargement.t5-11b
: 11 milliards de paramètres. 45 Go pour le téléchargement.
Pour les autres modèles T5 disponibles, consultez le dépôt Hugging Face.
À propos de TorchServe
TorchServe est un outil flexible permettant de diffuser des modèles PyTorch. Il est directement compatible avec tous les principaux frameworks de deep learning, y compris PyTorch, TensorFlow et ONNX. TorchServe peut être utilisé pour déployer des modèles en production, ou pour un prototypage et des tests rapides.
Étapes suivantes
- Diffuser un LLM avec plusieurs GPU
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Cloud Architecture Center.