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

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Kubernetes Engine and Cloud Storage APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Kubernetes Engine and Cloud Storage APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    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:

  1. 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.

  2. 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

  1. Rufen Sie in der Google Cloud Console die Seite Bucket erstellen auf:

    Zur Seite „Bucket erstellen“

  2. Geben Sie im Feld Bucket benennen den folgenden Namen ein:

    PROJECT_ID-gke-gpu-bucket
    
  3. Klicken Sie auf Weiter.

  4. Wählen Sie als Standorttyp die Option Region aus.

  5. Wählen Sie in der Liste Region us-central1 (Iowa) aus und klicken Sie auf Weiter.

  6. Klicken Sie im Abschnitt Speicherklasse für Daten auswählen auf Weiter.

  7. Wählen Sie im Abschnitt Legen Sie fest, wie der Zugriff auf Objekte gesteuert wird für Zugriffssteuerung die Option Einheitlich aus.

  8. Klicken Sie auf Erstellen.

  9. 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:

  1. Erstellen Sie ein Google Cloud-Dienstkonto.
  2. Erstellen Sie ein Kubernetes-Dienstkonto in Ihrem Cluster.
  3. Binden Sie das Kubernetes-Dienstkonto an das Google Cloud-Dienstkonto.

Google Cloud-Dienstkonto erstellen

  1. Wechseln Sie in der Google Cloud Console zur Seite Dienstkonto erstellen:

    Zur Seite „Dienstkonto erstellen“

  2. Geben Sie im Feld Dienstkonto-ID gke-ai-sa ein.

  3. Klicken Sie auf Erstellen und fortfahren.

  4. Wählen Sie in der Liste Rolle die Rolle Cloud Storage > Storage Insights Collector Service aus.

  5. Klicken Sie auf Weitere Rolle hinzufügen.

  6. Wählen Sie in der Liste Rolle auswählen die Rolle Cloud Storage > Storage Object Admin aus.

  7. Klicken Sie auf Weiter und dann auf Fertig.

Kubernetes-Dienstkonto in Ihrem Cluster erstellen

Gehen Sie in Cloud Shell so vor:

  1. Erstellen Sie einen Kubernetes-Namespace:

    kubectl create namespace gke-ai-namespace
    
  2. 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:

  1. 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.

  2. 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

  1. 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.

  2. 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.

  3. Erstellen Sie eine Beispieldatei im Bucket:

    touch sample-file
    gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucket
    
  4. 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
    
  5. Öffnen Sie eine Shell im TensorFlow-Container:

    kubectl -n gke-ai-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
    
  6. Versuchen Sie, die von Ihnen erstellte Beispieldatei zu lesen:

    ls /data
    

    Die Ausgabe zeigt die Beispieldatei.

  7. 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')
    
  8. Schließen Sie den Container:

    exit
    
  9. 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.

  1. Kopieren Sie die Beispieldaten in den Cloud Storage-Bucket:

    gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursive
    
  2. Erstellen Sie die folgenden Umgebungsvariablen:

    export K8S_SA_NAME=gpu-k8s-sa
    export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
    
  3. Überprüfen Sie den Trainingsjob:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: mnist-training-job
    spec:
      template:
        metadata:
          name: mnist
          annotations:
            gke-gcsfuse/volumes: "true"
        spec:
          nodeSelector:
            cloud.google.com/gke-accelerator: nvidia-tesla-t4
          tolerations:
          - key: "nvidia.com/gpu"
            operator: "Exists"
            effect: "NoSchedule"
          containers:
          - name: tensorflow
            image: tensorflow/tensorflow:latest-gpu 
            command: ["/bin/bash", "-c", "--"]
            args: ["cd /data/tensorflow-mnist-example; pip install -r requirements.txt; python tensorflow_mnist_train_distributed.py"]
            resources:
              limits:
                nvidia.com/gpu: 1
                cpu: 1
                memory: 3Gi
            volumeMounts:
            - name: gcs-fuse-csi-vol
              mountPath: /data
              readOnly: false
          serviceAccountName: $K8S_SA_NAME
          volumes:
          - name: gcs-fuse-csi-vol
            csi:
              driver: gcsfuse.csi.storage.gke.io
              readOnly: false
              volumeAttributes:
                bucketName: $BUCKET_NAME
                mountOptions: "implicit-dirs"
          restartPolicy: "Never"
  4. 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.

  5. 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
    
  6. 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
    
  7. 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.

  1. Kopieren Sie die Bilder für die Vorhersage in den Bucket:

    gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursive
    
  2. Überprüfen Sie die Inferenzarbeitslast:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: mnist-batch-prediction-job
    spec:
      template:
        metadata:
          name: mnist
          annotations:
            gke-gcsfuse/volumes: "true"
        spec:
          nodeSelector:
            cloud.google.com/gke-accelerator: nvidia-tesla-t4
          tolerations:
          - key: "nvidia.com/gpu"
            operator: "Exists"
            effect: "NoSchedule"
          containers:
          - name: tensorflow
            image: tensorflow/tensorflow:latest-gpu 
            command: ["/bin/bash", "-c", "--"]
            args: ["cd /data/tensorflow-mnist-example; pip install -r requirements.txt; python tensorflow_mnist_batch_predict.py"]
            resources:
              limits:
                nvidia.com/gpu: 1
                cpu: 1
                memory: 3Gi
            volumeMounts:
            - name: gcs-fuse-csi-vol
              mountPath: /data
              readOnly: false
          serviceAccountName: $K8S_SA_NAME
          volumes:
          - name: gcs-fuse-csi-vol
            csi:
              driver: gcsfuse.csi.storage.gke.io
              readOnly: false
              volumeAttributes:
                bucketName: $BUCKET_NAME
                mountOptions: "implicit-dirs"
          restartPolicy: "Never"
  3. 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.

  4. 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
    
  5. 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

  1. 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
    
  2. Löschen Sie den Cloud Storage-Bucket:

    1. Rufen Sie die Seite Buckets auf.

      Buckets aufrufen

    2. Aktivieren Sie das Kästchen für PROJECT_ID-gke-gpu-bucket.

    3. Klicken Sie auf Löschen.

    4. Geben Sie DELETE ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.

  3. Löschen Sie das Google Cloud-Dienstkonto:

    1. Rufen Sie die Seite Dienstkonten auf:

      Zur Seite „Dienstkonten“

    2. Wählen Sie Ihr Projekt aus.

    3. Aktivieren Sie das Kästchen für gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Klicken Sie auf Löschen.

    5. Klicken Sie zur Bestätigung noch einmal auf Löschen.

GKE-Cluster und Google Cloud-Ressourcen löschen

  1. Löschen Sie den GKE-Cluster:

    1. Rufen Sie die Seite Cluster auf:

      Zu den Clustern

    2. Aktivieren Sie das Kästchen für gke-gpu-cluster.

    3. Klicken Sie auf Löschen.

    4. Geben Sie gke-gpu-cluster ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.

  2. Löschen Sie den Cloud Storage-Bucket:

    1. Rufen Sie die Seite Buckets auf.

      Buckets aufrufen

    2. Aktivieren Sie das Kästchen für PROJECT_ID-gke-gpu-bucket.

    3. Klicken Sie auf Löschen.

    4. Geben Sie DELETE ein und klicken Sie auf Löschen, um den Löschvorgang zu bestätigen.

  3. Löschen Sie das Google Cloud-Dienstkonto:

    1. Rufen Sie die Seite Dienstkonten auf:

      Zur Seite „Dienstkonten“

    2. Wählen Sie Ihr Projekt aus.

    3. Aktivieren Sie das Kästchen für gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Klicken Sie auf Löschen.

    5. Klicken Sie zur Bestätigung noch einmal auf Löschen.

Projekt löschen

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Nächste Schritte