Ce tutoriel explique comment diffuser un modèle simple avec des GPU dans Google Kubernetes Engine (GKE). Ce tutoriel crée un cluster GKE qui utilise un seul GPU L4 Tensor Core et prépare l'infrastructure GKE pour l'inférence en ligne. Ce tutoriel utilise deux des frameworks les plus utilisés pour la livraison en ligne :
Objectifs
Ce tutoriel est destiné aux ingénieurs en infrastructure, aux ingénieurs MLOps ou DevOps ou aux administrateurs de cluster qui souhaitent héberger un modèle de machine learning (ML) pré-entraîné dans un cluster GKE.
Ce tutoriel couvre les étapes suivantes :
- Créez un cluster GKE Autopilot ou Standard.
- Configurez un bucket Cloud Storage où réside le modèle pré-entraîné.
- Déployez le framework d'inférence en ligne que vous sélectionnez.
- Envoyez une requête de test au service déployé.
Coûts
Ce tutoriel utilise les composants facturables Google Cloud suivants :- GKE
- Cloud Storage
- Accélérateurs de GPU L4
- Trafic de sortie
Utilisez le simulateur de coût pour générer une estimation des coûts en fonction de votre utilisation prévue.
Une fois que vous avez terminé ce tutoriel, évitez 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
Configurer votre projet
- 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.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Définir des valeurs par défaut pour Google Cloud CLI
Dans la console Google Cloud, démarrez une instance Cloud Shell :
Ouvrir Cloud ShellTéléchargez le code source pour cet exemple d'application :
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
Définissez les variables d'environnement par défaut :
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION
Remplacez les valeurs suivantes :
- PROJECT_ID : ID de votre projet Google Cloud.
- COMPUTE_REGION : région Compute Engine compatible avec le type d'accélérateur que vous souhaitez utiliser (par exemple,
us-central1
pour les GPU L4).
Dans Cloud Shell, créez les variables d'environnement suivantes :
export PROJECT_ID=$(gcloud config get project) export REGION=$(gcloud config get compute/region) export K8S_SA_NAME=gpu-k8s-sa export GSBUCKET=$PROJECT_ID-gke-bucket export MODEL_NAME=mnist export CLUSTER_NAME=online-serving-cluster
Créer un cluster GKE
Vous pouvez diffuser des modèles sur un seul GPU dans un cluster GKE Autopilot ou Standard. Nous vous recommandons d'utiliser un cluster Autopilot pour une expérience Kubernetes entièrement gérée. Avec GKE Autopilot, les ressources évoluent automatiquement en fonction des requêtes du modèle.
Pour choisir le mode de fonctionnement GKE le mieux adapté à vos charges de travail, consultez la section Choisir un mode de fonctionnement GKE.
Autopilot
Exécutez la commande suivante pour créer un cluster GKE Autopilot :
gcloud container clusters create-auto ${CLUSTER_NAME} \
--region=${REGION} \
--project=${PROJECT_ID} \
--release-channel=rapid
GKE crée un cluster Autopilot avec des nœuds de processeur et de GPU, à la demande des charges de travail déployées.
Standard
Exécutez la commande suivante pour créer un cluster GKE Standard :
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --region=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --addons GcsFuseCsiDriver \ --release-channel=rapid \ --num-nodes=1
La création du cluster peut prendre plusieurs minutes.
Exécutez la commande suivante pour créer le pool de nœuds :
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-8 \ --num-nodes=1
GKE crée un pool de nœuds unique contenant un GPU L4 pour chaque nœud.
Créer un bucket Cloud Storage
Créer un bucket Cloud Storage pour stocker le modèle pré-entraîné qui sera diffusé
Dans Cloud Shell, exécutez la commande ci-dessous.
gcloud storage buckets create gs://$GSBUCKET
Configurer votre cluster pour accéder au bucket à l'aide de la fédération d'identité de charge de travail pour GKE
Pour permettre à votre cluster d'accéder au bucket Cloud Storage, procédez comme suit :
- Créez un compte de service Google Cloud.
- Créer un ServiceAccount Kubernetes dans votre cluster
- Associer le ServiceAccount Kubernetes au compte de service Google Cloud
Créer un compte de service Google Cloud
Dans la console Google Cloud, accédez à la page Créer un compte de service :
Dans le champ ID du compte de service, saisissez
gke-ai-sa
.Cliquez sur Créer et continuer.
Dans la liste Rôle, sélectionnez le rôle Cloud Storage > Service de collecte des insights sur le stockage.
Cliquez sur
Ajouter un autre rôle.Dans la liste Sélectionner un rôle, sélectionnez le rôle Cloud Storage > Administrateur des objets de l'espace de stockage.
Cliquez sur Continue (Continuer), puis sur Done (OK).
Créer un ServiceAccount Kubernetes dans votre cluster
Dans Cloud Shell, procédez comme suit :
Créez un espace de noms Kubernetes :
kubectl create namespace gke-ai-namespace
Créez un ServiceAccount Kubernetes dans l'espace de noms :
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Associer le ServiceAccount Kubernetes au compte de service Google Cloud
Dans Cloud Shell, exécutez les commandes suivantes :
Ajoutez une liaison IAM au compte de service Google Cloud :
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
L'option
--member
fournit l'identité complète du ServiceAccount Kubernetes dans Google Cloud.Annotez le compte de service Kubernetes :
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
Déployer le serveur d'inférence en ligne
Chaque framework d'inférence en ligne s'attend à trouver le modèle de ML pré-entraîné dans un format spécifique. La section suivante montre comment déployer le serveur d'inférence en fonction du framework que vous souhaitez utiliser :
Triton
Dans Cloud Shell, copiez le modèle de ML pré-entraîné dans le bucket Cloud Storage :
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
Déployez le framework sur Kubernetes :
envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Vérifiez que GKE a déployé le framework :
kubectl get deployments --namespace=gke-ai-namespace
Une fois le framework prêt, le résultat ressemble à ce qui suit :
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29s
Déployer les Services pour accéder au déploiement
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
Vérifiez que l'adresse IP externe est attribuée :
kubectl get services --namespace=gke-ai-namespace
Le résultat ressemble à ce qui suit :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m triton-server LoadBalancer 34.118.227.176 35.239.54.228 8000:30866/TCP,8001:31035/TCP,8002:30516/TCP 5m14s
Notez l'adresse IP de
triton-server
dans la colonne EXTERNAL-IP.Vérifiez que le service et le déploiement fonctionnent correctement :
curl -v EXTERNAL_IP:8000/v2/health/ready
Le résultat ressemble à ce qui suit :
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...
TF Serving
Dans Cloud Shell, copiez le modèle de ML pré-entraîné dans le bucket Cloud Storage :
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
Déployez le framework sur Kubernetes :
envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Vérifiez que GKE a déployé le framework :
kubectl get deployments --namespace=gke-ai-namespace
Une fois le framework prêt, le résultat ressemble à ce qui suit :
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29s
Déployer les Services pour accéder au déploiement
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
Vérifiez que l'adresse IP externe est attribuée :
kubectl get services --namespace=gke-ai-namespace
Le résultat ressemble à ce qui suit :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m tfserve-server LoadBalancer 34.118.227.176 35.239.54.228 8500:30003/TCP,8000:32194/TCP 5m14s
Notez l'adresse IP de
tfserve-server
dans la colonne EXTERNAL-IP.Vérifiez que le service et le déploiement fonctionnent correctement :
curl -v EXTERNAL_IP:8000/v1/models/mnist
Remplacez
EXTERNAL_IP
par votre adresse IP externe.Le résultat ressemble à ce qui suit :
... < HTTP/1.1 200 OK < Content-Type: application/json < Date: Thu, 12 Oct 2023 19:01:19 GMT < Content-Length: 154 < { "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }
Diffuser le modèle
Triton
Créez un environnement virtuel Python dans Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activate
Installez les packages Python requis.
pip install -r src/client/triton-requirements.txt
Testez le serveur d'inférence Triton en chargeant une image :
cd src/client python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
Remplacez les éléments suivants :
EXTERNAL_IP
: votre adresse IP externe.TEST_IMAGE
: nom du fichier correspondant à l'image que vous souhaitez tester. Vous pouvez utiliser les images stockées danssrc/client/images
.
Selon l'image utilisée, le résultat ressemble à ce qui suit :
Calling Triton HTTP Service -> Prediction result: 7
TF Serving
Créez un environnement virtuel Python dans Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activate
Installez les packages Python requis.
pip install -r src/client/tfserve-requirements.txt
Testez TensorFlow Serving avec quelques images.
cd src/client python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
Remplacez les éléments suivants :
EXTERNAL_IP
: votre adresse IP externe.TEST_IMAGE
: Une valeur comprise entre0
et9
. Vous pouvez utiliser les images stockées danssrc/client/images
.
En fonction de l'image utilisée, vous obtenez un résultat semblable à celui-ci :
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
Effectuer un nettoyage
Pour éviter que les ressources que vous avez créées dans ce guide soient facturées sur votre compte Google Cloud, effectuez l'une des opérations suivantes :
- Conserver le cluster GKE : supprimez les ressources Kubernetes du cluster et les ressources Google Cloud.
- Conserver le projet Google Cloud : supprimer le cluster GKE et les ressources Google Cloud.
- Supprimer le projet
Supprimer les ressources Kubernetes du cluster et les ressources Google Cloud
- Supprimez l'espace de noms Kubernetes et les charges de travail que vous avez déployées :
Triton
kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace
TF Serving
kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace
Supprimez le bucket Cloud Storage :
Accédez à la page Buckets :
Sélectionnez la case à cocher correspondant à
PROJECT_ID-gke-bucket
.Cliquez sur
Supprimer.Pour confirmer la suppression, saisissez
DELETE
, puis cliquez sur Supprimer.
Supprimer le compte de service Google Cloud :
Accédez à la page Comptes de service :
Sélectionnez votre projet.
Sélectionnez la case à cocher correspondant à
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
.Cliquez sur
Supprimer.Pour confirmer la suppression, cliquez sur Supprimer.
Supprimer le cluster GKE et les ressources Google Cloud
Supprimez le cluster GKE :
Accédez à la page Clusters :
Sélectionnez la case à cocher correspondant à
online-serving-cluster
.Cliquez sur
Supprimer.Pour confirmer la suppression, saisissez
online-serving-cluster
, puis cliquez sur Supprimer.
Supprimez le bucket Cloud Storage :
Accédez à la page Buckets :
Sélectionnez la case à cocher correspondant à
PROJECT_ID-gke-bucket
.Cliquez sur
Supprimer.Pour confirmer la suppression, saisissez
DELETE
, puis cliquez sur Supprimer.
Supprimer le compte de service Google Cloud :
Accédez à la page Comptes de service :
Sélectionnez votre projet.
Sélectionnez la case à cocher correspondant à
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
.Cliquez sur
Supprimer.Pour confirmer la suppression, cliquez sur Supprimer.
Supprimer le projet
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.