Modell mit GPUs im GKE Standard-Modus trainieren
In dieser Kurzanleitung wird gezeigt, wie Sie ein Trainingsmodell mit GPUs in Google Kubernetes Engine (GKE) bereitstellen und die Vorhersagen in Cloud Storage speichern. In dieser Anleitung werden ein TensorFlow-Modell und GKE-Standardcluster verwendet. Sie können diese Arbeitslasten auch mit weniger Einrichtungsschritten in Autopilot-Clustern ausführen.
Dieses Dokument richtet sich an GKE-Administratoren mit Standard-Clustern, die zum ersten Mal GPU-Arbeitslasten ausführen möchten.
Hinweise
- 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.
Beispiel-Repository klonen
Führen Sie in Cloud Shell den folgenden Befehl aus:
git clone https://github.com/GoogleCloudPlatform/ai-on-gke/ ai-on-gke
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
Cluster im Standard-Modus und GPU-Knotenpool erstellen
Erledigen Sie mit Cloud Shell Folgendes:
Erstellen Sie einen Standard-Cluster, der die Workload Identity-Föderation für GKE verwendet und den Cloud Storage FUSE-Treiber installiert:
gcloud container clusters create gke-gpu-cluster \ --addons GcsFuseCsiDriver \ --location=us-central1 \ --num-nodes=1 \ --workload-pool=PROJECT_ID.svc.id.goog
Ersetzen Sie
PROJECT_ID
durch die Google Cloud-Projekt-ID.Die Erstellung eines Clusters kann einige Minuten dauern.
Erstellen Sie einen GPU-Knotenpool:
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
Cloud Storage-Bucket erstellen
Rufen Sie in der Google Cloud Console die Seite Bucket erstellen auf:
Geben Sie im Feld Bucket benennen den folgenden Namen ein:
PROJECT_ID-gke-gpu-bucket
Klicken Sie auf Weiter.
Wählen Sie als Standorttyp die Option Region aus.
Wählen Sie in der Liste Region
us-central1 (Iowa)
aus und klicken Sie auf Weiter.Klicken Sie im Abschnitt Speicherklasse für Daten auswählen auf Weiter.
Wählen Sie im Abschnitt Legen Sie fest, wie der Zugriff auf Objekte gesteuert wird für Zugriffssteuerung die Option Einheitlich aus.
Klicken Sie auf Erstellen.
Achten Sie darauf, dass im Dialogfeld Der öffentliche Zugriff wird verhindert das Kästchen Verhinderung des öffentlichen Zugriffs für diesen Bucket erzwingen angeklickt ist, und klicken Sie auf Bestätigen.
Cluster für den Zugriff auf den Bucket mithilfe der Workload Identity-Föderation für GKE konfigurieren
So gewähren Sie dem Cluster Zugriff auf den Cloud Storage-Bucket:
- Erstellen Sie ein Google Cloud-Dienstkonto.
- Erstellen Sie ein Kubernetes-Dienstkonto in Ihrem Cluster.
- Binden Sie das Kubernetes-Dienstkonto an das Google Cloud-Dienstkonto.
Google Cloud-Dienstkonto erstellen
Wechseln Sie in der Google Cloud Console zur Seite Dienstkonto erstellen:
Geben Sie im Feld Dienstkonto-ID
gke-ai-sa
ein.Klicken Sie auf Erstellen und fortfahren.
Wählen Sie in der Liste Rolle die Rolle Cloud Storage > Storage Insights Collector Service aus.
Klicken Sie auf
Weitere Rolle hinzufügen.Wählen Sie in der Liste Rolle auswählen die Rolle Cloud Storage > Storage Object Admin aus.
Klicken Sie auf Weiter und dann auf Fertig.
Kubernetes-Dienstkonto in Ihrem Cluster erstellen
Gehen Sie in Cloud Shell so vor:
Erstellen Sie einen Kubernetes-Namespace:
kubectl create namespace gke-ai-namespace
Erstellen Sie ein Kubernetes-Dienstkonto im Namespace:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Kubernetes-Dienstkonto an das Google Cloud-Dienstkonto binden
Führen Sie in Cloud Shell die folgenden Befehle aus:
Fügen Sie dem Google Cloud-Dienstkonto eine IAM-Bindung hinzu:
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]"
Das Flag
--member
stellt die vollständige Identität des Kubernetes-Dienstkontos in Google Cloud bereit.Annotieren Sie das Kubernetes-Dienstkonto.
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
Prüfen, ob Pods auf den Cloud Storage-Bucket zugreifen können
Erstellen Sie in Cloud Shell die folgenden Umgebungsvariablen:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Ersetzen Sie
PROJECT_ID
durch die Google Cloud-Projekt-ID.Erstellen Sie einen Pod mit einem TensorFlow-Container:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Mit diesem Befehl werden die von Ihnen erstellten Umgebungsvariablen durch die entsprechenden Referenzen im Manifest ersetzt. Sie können das Manifest auch in einem Texteditor öffnen und
$K8S_SA_NAME
und$BUCKET_NAME
durch die entsprechenden Werte ersetzen.Erstellen Sie eine Beispieldatei im Bucket:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucket
Warten Sie, bis der Pod bereit ist:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-ai-namespace --timeout=180s
Wenn der Pod bereit ist, sieht die Ausgabe so aus:
pod/test-tensorflow-pod condition met
Öffnen Sie eine Shell im TensorFlow-Container:
kubectl -n gke-ai-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
Versuchen Sie, die von Ihnen erstellte Beispieldatei zu lesen:
ls /data
Die Ausgabe zeigt die Beispieldatei.
Prüfen Sie die Logs, um die mit dem Pod verknüpfte GPU zu identifizieren:
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
Die Ausgabe enthält die GPU, die mit dem Pod verbunden ist, ähnlich dem Folgenden:
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')
Schließen Sie den Container:
exit
Löschen Sie den Beispiel-Pod:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-namespace
Mit dem MNIST
-Dataset trainieren und vorhersagen
In diesem Abschnitt führen Sie eine Trainingsarbeitslast für das MNIST
-Beispiel-Dataset aus.
Kopieren Sie die Beispieldaten in den Cloud Storage-Bucket:
gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursive
Erstellen Sie die folgenden Umgebungsvariablen:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Überprüfen Sie den Trainingsjob:
Stellen Sie den Trainingsjob bereit:
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-ai-namespace apply -f -
Mit diesem Befehl werden die von Ihnen erstellten Umgebungsvariablen durch die entsprechenden Referenzen im Manifest ersetzt. Sie können das Manifest auch in einem Texteditor öffnen und
$K8S_SA_NAME
und$BUCKET_NAME
durch die entsprechenden Werte ersetzen.Warten Sie, bis der Job den Status
Completed
hat:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
Die Ausgabe sieht in etwa so aus:
job.batch/mnist-training-job condition met
Prüfen Sie die Logs des TensorFlow-Containers:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-ai-namespace
Die Ausgabe zeigt die folgenden auftretenden Ereignisse:
- Erforderliche Python-Pakete installieren
- MNIST-Dataset herunterladen
- Modell mit einer GPU trainieren
- Modell speichern
- Modell bewerten
... 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
Löschen Sie die Trainingsarbeitslast:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
Inferenzarbeitslast bereitstellen
In diesem Abschnitt stellen Sie eine Inferenzarbeitslast bereit, die ein Beispiel-Dataset als Eingabe verwendet und Vorhersagen zurückgibt.
Kopieren Sie die Bilder für die Vorhersage in den Bucket:
gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursive
Überprüfen Sie die Inferenzarbeitslast:
Stellen Sie die Inferenzarbeitslast bereit:
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-ai-namespace apply -f -
Mit diesem Befehl werden die von Ihnen erstellten Umgebungsvariablen durch die entsprechenden Referenzen im Manifest ersetzt. Sie können das Manifest auch in einem Texteditor öffnen und
$K8S_SA_NAME
und$BUCKET_NAME
durch die entsprechenden Werte ersetzen.Warten Sie, bis der Job den Status
Completed
hat:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180s
Die Ausgabe sieht in etwa so aus:
job.batch/mnist-batch-prediction-job condition met
Prüfen Sie die Logs des TensorFlow-Containers:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-ai-namespace
Die Ausgabe ist die Vorhersage für jedes Bild und die Konfidenz des Modells für die Vorhersage, in etwa so:
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.
Bereinigen
Führen Sie einen der folgenden Schritte aus, damit Ihrem Google Cloud-Konto die in dieser Anleitung erstellten Ressourcen nicht in Rechnung gestellt werden:
- GKE-Cluster beibehalten: Kubernetes-Ressourcen im Cluster und die Google Cloud-Ressourcen löschen
- Google Cloud-Projekt beibehalten: GKE-Cluster und die Google Cloud-Ressourcen löschen
- Projekt löschen
Kubernetes-Ressourcen im Cluster und die Google Cloud-Ressourcen löschen
Löschen Sie den Kubernetes-Namespace und die bereitgestellten Arbeitslasten:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-ai-namespace
Löschen Sie den Cloud Storage-Bucket:
Rufen Sie die Seite Buckets auf.
Aktivieren Sie das Kästchen für
PROJECT_ID-gke-gpu-bucket
.Klicken Sie auf
Löschen.Geben Sie
DELETE
ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.
Löschen Sie das Google Cloud-Dienstkonto:
Rufen Sie die Seite Dienstkonten auf:
Wählen Sie Ihr Projekt aus.
Aktivieren Sie das Kästchen für
gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
.Klicken Sie auf
Löschen.Klicken Sie zur Bestätigung noch einmal auf Löschen.
GKE-Cluster und Google Cloud-Ressourcen löschen
Löschen Sie den GKE-Cluster:
Rufen Sie die Seite Cluster auf:
Aktivieren Sie das Kästchen für
gke-gpu-cluster
.Klicken Sie auf
Löschen.Geben Sie
gke-gpu-cluster
ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.
Löschen Sie den Cloud Storage-Bucket:
Rufen Sie die Seite Buckets auf.
Aktivieren Sie das Kästchen für
PROJECT_ID-gke-gpu-bucket
.Klicken Sie auf
Löschen.Geben Sie
DELETE
ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.
Löschen Sie das Google Cloud-Dienstkonto:
Rufen Sie die Seite Dienstkonten auf:
Wählen Sie Ihr Projekt aus.
Aktivieren Sie das Kästchen für
gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
.Klicken Sie auf
Löschen.Klicken Sie zur Bestätigung noch einmal auf Löschen.
Projekt löschen
- 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.