Entraîner les modèles avec des GPU en mode GKE Standard
Ce tutoriel de démarrage rapide explique comment déployer un modèle d'entraînement avec des GPU dans Google Kubernetes Engine (GKE) et stocker les prédictions dans Cloud Storage. Ce tutoriel utilise un modèle TensorFlow et des clusters GKE Standard. Vous pouvez également exécuter ces charges de travail sur des clusters Autopilot avec moins d'étapes de configuration.
Ce document est destiné aux administrateurs GKE qui possèdent des clusters Standard existants et qui souhaitent exécuter des charges de travail GPU pour la première fois.
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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine and Cloud Storage APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine and Cloud Storage APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Cloner l'exemple de dépôt
Dans Cloud Shell, exécutez la commande suivante :
git clone https://github.com/GoogleCloudPlatform/ai-on-gke/ ai-on-gke
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
Créer un cluster en mode Standard et un pool de nœuds GPU
Utilisez Cloud Shell pour effectuer les opérations suivantes :
Créez un cluster Standard qui utilise la fédération d'identité de charge de travail pour GKE et installe le pilote Cloud Storage FUSE :
gcloud container clusters create gke-gpu-cluster \ --addons GcsFuseCsiDriver \ --location=us-central1 \ --num-nodes=1 \ --workload-pool=PROJECT_ID.svc.id.goog
Remplacez
PROJECT_ID
par l'ID de votre projet Google Cloud.La création du cluster peut prendre plusieurs minutes.
Créez un pool de nœuds GPU :
gcloud container node-pools create gke-gpu-pool-1 \ --accelerator=type=nvidia-tesla-t4,count=1,gpu-driver-version=default \ --machine-type=n1-standard-16 --num-nodes=1 \ --location=us-central1 \ --cluster=gke-gpu-cluster
Créer un bucket Cloud Storage
Dans la console Google Cloud, accédez à la page Créer un bucket :
Dans le champ Attribuer un nom au bucket, saisissez le nom suivant :
PROJECT_ID-gke-gpu-bucket
Cliquez sur Continuer.
Pour Type d'emplacement, sélectionnez Région.
Dans la liste Région, sélectionnez
us-central1 (Iowa)
, puis cliquez sur Continuer.Dans la section Choisir une classe de stockage pour vos données, cliquez sur Continuer.
Dans la section Choisir comment contrôler l'accès aux objets, pour Contrôle des accès, sélectionnez Uniforme.
Cliquez sur Créer.
Dans la boîte de dialogue L'accès public sera bloqué, assurez-vous que la case Appliquer la protection contre l'accès public sur ce bucket est cochée, puis cliquez sur Confirmer.
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
Vérifier que les pods peuvent accéder au bucket Cloud Storage
Dans Cloud Shell, créez les variables d'environnement suivantes :
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Remplacez
PROJECT_ID
par l'ID de votre projet Google Cloud.Créez un pod contenant un conteneur TensorFlow :
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Cette commande remplace les variables d'environnement que vous avez créées par les références correspondantes dans le fichier manifeste. Vous pouvez également ouvrir le fichier manifeste dans un éditeur de texte et remplacer
$K8S_SA_NAME
et$BUCKET_NAME
par les valeurs correspondantes.Créez un exemple de fichier dans le bucket :
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucket
Attendez que votre pod soit prêt :
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-ai-namespace --timeout=180s
Lorsque le pod est prêt, le résultat est le suivant :
pod/test-tensorflow-pod condition met
Ouvrez une interface système dans le conteneur Tensorflow :
kubectl -n gke-ai-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
Essayez de lire l'exemple de fichier que vous avez créé :
ls /data
La sortie affiche l'exemple de fichier.
Consultez les journaux pour identifier le GPU associé au pod :
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
La sortie affiche le GPU associé au pod, semblable à ceci :
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')
Quittez le conteneur :
exit
Supprimez l'exemple de pod :
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-namespace
Entraîner et prédire à l'aide de l'ensemble de données MNIST
Dans cette section, vous allez exécuter une charge de travail d'entraînement sur l'exemple d'ensemble de données MNIST
.
Copiez les exemples de données dans le bucket Cloud Storage :
gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursive
Créez les variables d'environnement suivantes :
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Examinez le Job d'entraînement :
Déployez le Job d'entraînement :
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-ai-namespace apply -f -
Cette commande remplace les variables d'environnement que vous avez créées par les références correspondantes dans le fichier manifeste. Vous pouvez également ouvrir le fichier manifeste dans un éditeur de texte et remplacer
$K8S_SA_NAME
et$BUCKET_NAME
par les valeurs correspondantes.Attendez que le Job ait l'état
Completed
:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
Le résultat ressemble à ce qui suit :
job.batch/mnist-training-job condition met
Vérifiez les journaux du conteneur Tensorflow :
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-ai-namespace
Le résultat indique que les événements suivants se produisent :
- Installer les packages Python requis
- Télécharger l'ensemble de données MNIST
- Entraîner le modèle à l'aide d'un GPU
- Enregistrer le modèle
- Évaluer le modèle
... Epoch 12/12 927/938 [============================>.] - ETA: 0s - loss: 0.0188 - accuracy: 0.9954 Learning rate for epoch 12 is 9.999999747378752e-06 938/938 [==============================] - 5s 6ms/step - loss: 0.0187 - accuracy: 0.9954 - lr: 1.0000e-05 157/157 [==============================] - 1s 4ms/step - loss: 0.0424 - accuracy: 0.9861 Eval loss: 0.04236088693141937, Eval accuracy: 0.9861000180244446 Training finished. Model saved
Supprimez la charge de travail d'entraînement :
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
Déployer une charge de travail d'inférence
Dans cette section, vous allez déployer une charge de travail d'inférence qui utilise un exemple d'ensemble de données en tant qu'entrée et renvoie des prédictions.
Copiez les images pour la prédiction dans le bucket :
gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursive
Examinez la charge de travail d'inférence :
Déployez la charge de travail d'inférence :
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-ai-namespace apply -f -
Cette commande remplace les variables d'environnement que vous avez créées par les références correspondantes dans le fichier manifeste. Vous pouvez également ouvrir le fichier manifeste dans un éditeur de texte et remplacer
$K8S_SA_NAME
et$BUCKET_NAME
par les valeurs correspondantes.Attendez que le Job ait l'état
Completed
:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180s
Le résultat ressemble à ce qui suit :
job.batch/mnist-batch-prediction-job condition met
Vérifiez les journaux du conteneur Tensorflow :
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-ai-namespace
Le résultat correspond à la prédiction associée à chaque image et à la fiabilité du modèle, semblable à celle-ci :
Found 10 files belonging to 1 classes. 1/1 [==============================] - 2s 2s/step The image /data/mnist_predict/0.png is the number 0 with a 100.00 percent confidence. The image /data/mnist_predict/1.png is the number 1 with a 99.99 percent confidence. The image /data/mnist_predict/2.png is the number 2 with a 100.00 percent confidence. The image /data/mnist_predict/3.png is the number 3 with a 99.95 percent confidence. The image /data/mnist_predict/4.png is the number 4 with a 100.00 percent confidence. The image /data/mnist_predict/5.png is the number 5 with a 100.00 percent confidence. The image /data/mnist_predict/6.png is the number 6 with a 99.97 percent confidence. The image /data/mnist_predict/7.png is the number 7 with a 100.00 percent confidence. The image /data/mnist_predict/8.png is the number 8 with a 100.00 percent confidence. The image /data/mnist_predict/9.png is the number 9 with a 99.65 percent confidence.
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 :
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.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-gpu-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-ai-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 à
gke-gpu-cluster
.Cliquez sur
Supprimer.Pour confirmer la suppression, saisissez
gke-gpu-cluster
, puis cliquez sur Supprimer.
Supprimez le bucket Cloud Storage :
Accédez à la page Buckets :
Sélectionnez la case à cocher correspondant à
PROJECT_ID-gke-gpu-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-ai-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.