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 wird ein TensorFlow-Modell und GKE Standard-Cluster verwendet. Sie können diese Arbeitslasten auch mit weniger Einrichtungsschritten in Autopilot-Clustern ausführen. Eine Anleitung finden Sie unter Modell mit GPUs im GKE Autopilot-Modus trainieren.

Dieses Dokument richtet sich an GKE-Administratoren mit Standard-Clustern, die zum ersten Mal GPU-Arbeitslasten ausführen möchten.

Hinweise

  1. In the Trusted Cloud console, on the project selector page, select or create a Trusted Cloud project.

    Go to project selector

  2. Verify that billing is enabled for your Trusted Cloud project.

  3. Enable the Kubernetes Engine and Cloud Storage APIs.

    Enable the APIs

  4. In the Trusted Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Trusted 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.

  5. 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 Ihre Projekt-ID. Trusted Cloud

      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 Trusted 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 Trusted Cloud Dienstkonto.
    2. Erstellen Sie ein Kubernetes-Dienstkonto in Ihrem Cluster.
    3. Binden Sie das Kubernetes-Dienstkonto an das Trusted Cloud -Dienstkonto.

    Trusted Cloud -Dienstkonto erstellen

    1. Wechseln Sie in der Trusted 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 Trusted Cloud -Dienstkonto binden

    Führen Sie in Cloud Shell die folgenden Befehle aus:

    1. Fügen Sie dem Dienstkonto Trusted Cloud eine IAM-Bindung hinzu:

      gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.s3ns-system.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 Trusted Cloudbereit.

    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.s3ns-system.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 Ihre Projekt-ID. Trusted Cloud

    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 Trusted Cloud Konto die in dieser Anleitung erstellten Ressourcen nicht in Rechnung gestellt werden:

    • GKE-Cluster beibehalten: Kubernetes-Ressourcen im Cluster und die Trusted Cloud Ressourcen löschen
    • Trusted Cloud -Projekt beibehalten:GKE-Cluster und die Trusted Cloud -Ressourcen löschen
    • Projekt löschen

    Kubernetes-Ressourcen im Cluster und die Trusted 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 Dienstkonto Trusted Cloud :

      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.s3ns-system.iam.gserviceaccount.com.

      4. Klicken Sie auf Löschen.

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

    GKE-Cluster und Trusted 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 Dienstkonto Trusted Cloud :

      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.s3ns-system.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 Trusted 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