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 separate GPU-Knotenpools in Ihren Clustern erstellen. Eine Anleitung finden Sie unter Modell mit GPUs im GKE Standard-Modus trainieren.
Hinweis
- Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the GKE and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Installieren Sie die Google Cloud CLI.
-
Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the GKE and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Installieren Sie die Google Cloud CLI.
-
Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init -
Aktivieren Sie Cloud Shell in der Google Cloud Console.
Unten in der Google Cloud Console wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung, in der das Google Cloud CLI bereits installiert ist und Werte für Ihr aktuelles Projekt bereits festgelegt sind. Das Initialisieren der Sitzung kann einige Sekunden dauern.
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 Console die Seite Autopilot-Cluster erstellen auf:
Geben Sie im Feld Name
gke-gpu-clusterein.Wählen Sie in der Liste Region
us-central1aus.Klicken Sie auf Erstellen.
Cloud Storage-Bucket erstellen
Rufen Sie in der Google Cloud Console die Seite Bucket erstellen auf:
Geben Sie im Bereich Einstieg einen weltweit eindeutigen Namen für den Bucket ein:
PROJECT_ID-gke-gpu-bucketErsetzen Sie
PROJECT_IDdurch Ihre Google CloudProjekt-ID.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:
Mit dem Cluster verbinden:
gcloud container clusters get-credentials gke-gpu-cluster \ --location=us-central1Erstellen Sie einen Kubernetes-Namespace:
kubectl create namespace gke-gpu-namespaceErstellen 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-Dienstkonto die Rolle „Storage-Objekt-Administrator“ (roles/storage.objectAdmin) für den Bucket zu:
gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID-gke-gpu-bucket \
--member=principal://iam.googleapis.com/projects/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 Google CloudProjektnummer.
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-bucketErsetzen Sie
PROJECT_IDdurch Ihre Google CloudProjekt-ID.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_NAMEund$BUCKET_NAMEdurch die entsprechenden Werte ersetzen.Erstellen Sie eine Beispieldatei im Bucket:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucketWarten Sie, bis der Pod bereit ist:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-gpu-namespace --timeout=180sWenn der Pod bereit ist, sieht die Ausgabe so aus:
pod/test-tensorflow-pod condition metWenn für den Befehl ein Zeitlimit überschritten wird, erstellt GKE möglicherweise noch neue Knoten zum Ausführen der Pods. 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/bashVersuchen Sie, die von Ihnen erstellte Beispieldatei zu lesen:
ls /dataDie 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:
exitLö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:
gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursiveErstellen 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_NAMEund$BUCKET_NAMEdurch die entsprechenden Werte ersetzen.Warten Sie, bis der Job den Status
Completedhat:kubectl wait -n gke-gpu-namespace --for=condition=Complete job/mnist-training-job --timeout=180sWenn der Job bereit ist, sieht die Ausgabe in etwa so aus:
job.batch/mnist-training-job condition metWenn für den Befehl ein Zeitlimit überschritten wird, erstellt GKE möglicherweise noch neue Knoten zum Ausführen der Pods. 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-namespaceDie 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 savedLö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:
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-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_NAMEund$BUCKET_NAMEdurch die entsprechenden Werte ersetzen.Warten Sie, bis der Job den Status
Completedhat:kubectl wait -n gke-gpu-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180sDie Ausgabe sieht etwa so aus:
job.batch/mnist-batch-prediction-job condition metPrüfen Sie die Logs des TensorFlow-Containers:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-gpu-namespaceDie 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-namespaceLö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
DELETEein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.
Löschen Sie das Dienstkonto Google Cloud :
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-clusterein 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
DELETEein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.
Löschen Sie das Dienstkonto Google Cloud :
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
- Wechseln Sie in der Google Cloud -Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.