Modell mit GPUs im GKE Autopilot-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. Dieses Dokument richtet sich an GKE-Administratoren, die Cluster im Autopilot-Modus haben und zum ersten Mal GPU-Arbeitslasten ausführen möchten.
Sie können diese Arbeitslasten auch in Standardclustern ausführen, wenn Sie in Ihren Clustern separate GPU-Knotenpools erstellen. Eine Anleitung finden Sie unter Modell mit GPUs im GKE Standard-Modus trainieren.
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 GKE and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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 GKE and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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 && \
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
Cluster erstellen
Rufen Sie in der Google Cloud -Konsole die Seite Autopilot-Cluster erstellen auf:
Geben Sie im Feld Name
gke-gpu-cluster
ein.Wählen Sie in der Liste Region
us-central1
aus.Klicken Sie auf Erstellen.
Cloud Storage-Bucket erstellen
Rufen Sie in der Google Cloud -Konsole die Seite Bucket erstellen auf:
Geben Sie im Feld Bucket benennen den folgenden Namen ein:
PROJECT_ID-gke-gpu-bucket
Ersetzen Sie
PROJECT_ID
durch die Projekt-ID Ihres Google Cloud-Kontos.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 Identitätsföderation von Arbeitslasten für GKE konfigurieren
So gewähren Sie dem Cluster Zugriff auf den Cloud Storage-Bucket:
- Erstellen Sie ein Kubernetes-Dienstkonto in Ihrem Cluster.
- Erstellen Sie eine IAM-Zulassungsrichtlinie, die dem Dienstkonto Zugriff auf den Bucket gewährt.
Kubernetes-Dienstkonto in Ihrem Cluster erstellen
Gehen Sie in Cloud Shell so vor:
So stellen Sie eine Verbindung zum Cluster her:
gcloud container clusters get-credentials gke-gpu-cluster \ --location=us-central1
Erstellen Sie einen Kubernetes-Namespace:
kubectl create namespace gke-gpu-namespace
Erstellen Sie ein Kubernetes-Dienstkonto im Namespace:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-gpu-namespace
IAM-Zulassungsrichtlinie für den Bucket erstellen
Weisen Sie dem Kubernetes-ServiceAccount die Rolle „Storage-Objekt-Administrator“ (roles/storage.objectAdmin
) für den Bucket zu:
gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID \
--member=principal://iam.googleapis.com/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-gpu-namespace/sa/gpu-k8s-sa \
--role=roles/storage.objectAdmin \
--condition=None
Ersetzen Sie PROJECT_NUMBER
durch die Projektnummer Ihres Google Cloud-Projekts.
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 Projekt-ID Ihres Google Cloud-Kontos.Erstellen Sie einen Pod mit einem TensorFlow-Container:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-gpu-namespace apply -f -
Mit diesem Befehl werden die von Ihnen erstellten Umgebungsvariablen in die entsprechenden Referenzen im Manifest eingefügt. 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 gsutil 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-gpu-namespace --timeout=180s
Wenn der Pod bereit ist, sieht die Ausgabe so aus:
pod/test-tensorflow-pod condition met
Wenn der Befehl abläuft, erstellt GKE möglicherweise noch neue Knoten, um die Pods auszuführen. Führen Sie den Befehl noch einmal aus und warten Sie, bis der Pod bereit ist.
Öffnen Sie eine Shell im TensorFlow-Container:
kubectl -n gke-gpu-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-gpu-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:
gsutil -m cp -R src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/
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-gpu-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-gpu-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
Wenn der Job bereit ist, sieht die Ausgabe in etwa so aus:
job.batch/mnist-training-job condition met
Wenn für den Befehl ein Zeitlimit erreicht wird, erstellt GKE möglicherweise noch neue Knoten, um die Pods auszuführen. Führen Sie den Befehl noch einmal aus und warten Sie, bis der Job bereit ist.
Prüfen Sie die Logs des TensorFlow-Containers:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-gpu-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-gpu-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:
gsutil -m cp -R data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/
Überprüfen Sie die Inferenzarbeitslast:
Stellen Sie die Inferenzarbeitslast bereit:
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-gpu-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-gpu-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-gpu-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-gpu-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-gpu-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-gpu-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-gpu-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.