Cloud TPU-Anwendungen in GKE ausführen

In diesem Leitfaden wird Folgendes beschrieben:

Weitere Informationen zu TPU-VM-Architekturen finden Sie unter Systemarchitektur. Diese Anleitung kann nur mit der TPU-Knotenarchitektur verwendet werden.

Vorteile der Ausführung von Cloud TPU-Anwendungen in GKE

Cloud TPU-Trainingsanwendungen können so konfiguriert werden, dass sie in GKE-Containern in GKE-Pods ausgeführt werden. Sollte dies der Fall sein, haben Sie folgende Vorteile:

  • Einfachere Einrichtung und Verwaltung: GKE verwaltet den TPU-Lebenszyklus. Sobald die Cloud TPU-Initialisierung und das Training mit GKE eingerichtet sind, wird das Training von GKE einfacher wiederholt und verwaltet, einschließlich der Wiederherstellung nach Jobfehlern.

  • Optimierte Kosten: Sie zahlen nur dann für die TPU, wenn der Job aktiv ist. GKE erstellt und löscht gemäß den Ressourcenanforderungen eines Pods automatisch TPUs.

  • Flexible Verwendung: Sie müssen nur eine geringfügige Änderung an der Pod-Spezifikation vornehmen, um einen anderen Hardwarebeschleuniger (CPU, GPU oder TPU) anzufordern:

    kind: Pod
    metadata:
      name: example-tpu
      annotations:
        # The Cloud TPUs that will be created for this Job will support
        # TensorFlow 2.6.0. This version MUST match the
        # TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "2.6.0"
    spec:
      containers:
      - name: example-container
        resources:
          limits:
            cloud-tpus.google.com/v2: 8
            # See the line above for TPU, or below for CPU / GPU.
            # cpu: 2
            # nvidia.com/gpu: 1
    
  • Skalierbarkeit: GKE bietet APIs (Job und Deployment), die Ressourcen problemlos auf Hunderte von GKE-Pods und TPU-Knoten skalieren können.

  • Fehlertoleranz: Die Job API von GKE stellt in Verbindung mit dem TensorFlow-Prüfpunktmechanismus die Semantik für die vollständige Ausführung bereit. Falls in den VM-Instanzen oder Cloud TPU-Knoten Fehler auftreten sollten, werden Ihre Trainingsjobs automatisch noch einmal ausgeführt, wobei der zuletzt vom Prüfpunkt gelesene Zustand verwendet wird.

Cloud TPU- und GKE-Konfigurationsanforderungen und -einschränkungen

Beachten Sie Folgendes, wenn Sie Ihre GKE-Konfiguration definieren:

  • Cloud TPU wird in Windows Server-Knotenpools nicht unterstützt.
  • Sie müssen Ihren GKE-Cluster und die Knotenpools in einer Zone erstellen, in der die Cloud TPU verfügbar ist. Sie müssen außerdem die Cloud Storage-Buckets zum Speichern Ihrer Trainingsdaten und Modelle in derselben Region erstellen, in der sich auch Ihr GKE-Cluster befindet. Eine Liste der verfügbaren Zonen finden Sie im Dokument Typen und Zonen.
  • Jeder Container kann höchstens eine Cloud TPU anfordern. Mehrere Container in einem Pod können jedoch jeweils eine Cloud TPU anfordern.

Hinweis

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch 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.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.

  4. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  5. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für ein Projekt aktiviert ist.

  6. Wenn Sie Cloud TPU mit GKE verwenden, verwendet Ihr Projekt kostenpflichtige Komponenten von Google Cloud. Schauen Sie sich die Cloud TPU-Preise und die GKE-Preise an, um Ihre Kosten zu schätzen, und folgen Sie dann der Anleitung zum Bereinigen von Ressourcen, die nicht mehr gebraucht werden.

  7. Aktivieren Sie die folgenden APIs in der Konsole:

Neuen Cluster mit Cloud TPU-Unterstützung erstellen

Folgen Sie der folgenden Anleitung, um die Umgebung einzurichten und mithilfe der gcloud-Befehlszeile einen GKE-Cluster mit Cloud TPU-Unterstützung zu erstellen:

  1. Installieren Sie die gcloud-Komponenten, die Sie zum Ausführen von GKE mit Cloud TPU benötigen:

    $ gcloud components install kubectl 
  2. Konfigurieren Sie gcloud mit Ihrer Google Cloud-Projekt-ID.

    $ gcloud config set project project-name
    

    Ersetzen Sie project-name durch den Namen des Google Cloud-Projekts.

    Wenn Sie diesen Befehl zum ersten Mal in einer neuen Cloud Shell-VM ausführen, wird die Seite Authorize Cloud Shell angezeigt. Klicken Sie auf Authorize unten auf der Seite, damit gcloud GCP API-Aufrufe mit Ihren Anmeldedaten durchführen kann.

  3. Konfigurieren Sie gcloud mit der Zone, in der Sie eine Cloud TPU-Ressource verwenden möchten. In diesem Beispiel wird us-central1-b verwendet. Sie können jedoch eine TPU in einer beliebigen unterstützten Zone verwenden.

    $ gcloud config set compute/zone us-central1-b
    
  4. Verwenden Sie den Befehl gcloud container clusters create, um in GKE einen Cluster mit Unterstützung für Cloud TPU zu erstellen.

    $ gcloud container clusters create cluster-name \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu
    

    Beschreibung der Befehls-Flags

    release-channel
    Mit Release-Versionen können Sie automatische Upgrades für Ihren Cluster verwalten. Wenn Sie einen neuen Cluster erstellen, können Sie dessen Release-Version auswählen. Ihr Cluster wird nur auf die in diesem Kanal angebotenen Versionen aktualisiert.
    scopes
    Dadurch wird allen Knoten im Cluster der Zugriff auf Ihren Cloud Storage-Bucket ermöglicht. Der Cluster und der Storage-Bucket müssen sich in demselben Projekt befinden, damit dies funktioniert. Beachten Sie, dass die Kubernetes Pods standardmäßig die Bereiche der Knoten übernehmen, für die sie bereitgestellt werden. Daher teilt scopes=cloud-platform allen Kubernetes-Pods, die im Cluster ausgeführt werden, den Bereich cloud-platform zu. Informationen dazu, wie Sie den Zugriff für einzelne Pods einschränken können, finden Sie im GKE-Leitfaden unter Mit Dienstkonten authentifizieren.
    enable-ip-alias
    Gibt an, dass der Cluster Alias-IP-Bereiche verwendet. Dies ist für die Nutzung von Cloud TPU in GKE erforderlich.
    enable-tpu
    Gibt an, dass der Cluster Cloud TPU unterstützen muss.
    tpu-ipv4-cidr (optional, oben nicht angegeben)
    Gibt den CIDR-Bereich an, der für Cloud TPU verwendet werden soll. Geben Sie die IP_RANGE im Format IP/20 an, z. B. 10.100.0.0/20. Wenn Sie dieses Flag nicht angeben, wird automatisch ein CIDR-Bereich mit einer Größe von /20 zugeordnet und zugewiesen.

Wenn der Cluster erstellt wurde, sollte eine Meldung wie die folgende angezeigt werden:

NAME             LOCATION       MASTER_VERSION    MASTER_IP     MACHINE_TYPE   NODE_VERSION      NUM_NODES  STATUS
cluster-name  us-central1-b  1.16.15-gke.4901  34.71.245.25  n1-standard-1  1.16.15-gke.4901  3          RUNNING

Cloud TPU in der Kubernetes Pod-Spezifikation anfordern

In der Kubernetes Pod-Spezifikation:

  • Sie müssen alle Modelle in Ihren Containern mit derselben TensorFlow-Version erstellen. Siehe die unterstützten Versionen.

  • Geben Sie die Cloud TPU-Ressource in der Containerspezifikation im Bereich limits unter dem Feld resource an.

    Die Einheit der Cloud TPU-Ressource ist die Anzahl der Cloud TPU-Kerne. In der folgenden Tabelle sind Beispiele für gültige Ressourcenanfragen aufgeführt. Eine vollständige Liste der gültigen TPU-Ressourcen finden Sie unter TPU-Typen und Zonen.

    Wenn die zu verwendende Ressource ein Cloud TPU Pod ist, müssen Sie ein Kontingent anfordern, da das Standardkontingent für Cloud TPU Pod null ist.

    Ressourcenanfrage Cloud TPU-Typ
    cloud-tpus.google.com/v2: 8 Ein Cloud TPU v2-Gerät (8 Kerne)
    cloud-tpus.google.com/preemptible-v2: 8 Ein Cloud TPU v2-Gerät auf Abruf (8 Kerne)
    cloud-tpus.google.com/v3: 8 Ein Cloud TPU v3-Gerät (8 Kerne)
    cloud-tpus.google.com/preemptible-v3: 8 Ein Cloud TPU v3-Gerät auf Abruf (8 Kerne)
    cloud-tpus.google.com/v2: 32 Ein v2-32 Cloud TPU Pod (32 Kerne)
    cloud-tpus.google.com/v3: 32 Ein v3-32 Cloud TPU Pod (32 Kerne)

    Weitere Informationen zur Angabe von Ressourcen und Limits in der Pod-Spezifikation finden Sie in der Kubernetes-Dokumentation.

Die unten gezeigte Beispiel-Pod-Spezifikation fordert eine Cloud TPU v2-8-TPU auf Abruf mit TensorFlow 2.6.0 an.

Die Lebensdauer von Cloud TPU-Knoten ist an die Kubernetes Pods gebunden, die diese anfordern. Die Cloud TPU wird nach Bedarf beim Planen des Kubernetes Pods erstellt und beim Löschen des Kubernetes Pods anderweitig verwendet.

apiVersion: v1
kind: Pod
metadata:
  name: gke-tpu-pod
  annotations:
     # The Cloud TPUs that will be created for this Job will support
     # TensorFlow 2.6.0. This version MUST match the
     # TensorFlow version that your model is built on.
     tf-version.cloud-tpus.google.com: "2.6.0"
spec:
  restartPolicy: Never
  containers:
  - name: gke-tpu-container
    # The official TensorFlow 2.6.0 image.
    # https://hub.docker.com/r/tensorflow/tensorflow
    image: tensorflow/tensorflow:2.6.0
    command:
    - python
    - -c
    - |
      import tensorflow as tf
      print("Tensorflow version " + tf.__version__)

      tpu = tf.distribute.cluster_resolver.TPUClusterResolver('$(KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS)')
      print('Running on TPU ', tpu.cluster_spec().as_dict()['worker'])

      tf.config.experimental_connect_to_cluster(tpu)
      tf.tpu.experimental.initialize_tpu_system(tpu)
      strategy = tf.distribute.TPUStrategy(tpu)

      @tf.function
      def add_fn(x,y):
          z = x + y
          return z

      x = tf.constant(1.)
      y = tf.constant(1.)
      z = strategy.run(add_fn, args=(x,y))
      print(z)
    resources:
      limits:
        # Request a single Preemptible v2-8 Cloud TPU device to train the model.
        cloud-tpus.google.com/preemptible-v2: 8

Job erstellen

Führen Sie folgende Schritte aus, um den Job im GKE-Cluster zu erstellen und kubectl zu installieren:

  1. Erstellen Sie mit einem Texteditor eine Pod-Spezifikation (example-job.yaml) und fügen Sie die oben gezeigte Pod-Spezifikation ein.

  2. Führen Sie den Job aus:

    $ kubectl create -f example-job.yaml
    
    pod "gke-tpu-pod" created

    Dieser Befehl erstellt den Job, der den Pod automatisch plant.

  3. Prüfen Sie, ob der GKE-Pod geplant und die Cloud TPU-Knoten bereitgestellt wurden. Ein GKE-Pod, der Cloud TPU-Knoten anfordert, kann vor der Ausführung 5 Minuten lang den Status "Ausstehend" haben. Bis der GKE-Pod geplant ist, sieht die Ausgabe etwa so aus:

    $ kubectl get pods -w
    
    NAME          READY     STATUS    RESTARTS   AGE
    gke-tpu-pod   0/1       Pending   0          1m
    

    Nach etwa 5 Minuten sehen Sie in etwa Folgendes:

    NAME          READY     STATUS              RESTARTS   AGE
    gke-tpu-pod   0/1       Pending             0          21s
    gke-tpu-pod   0/1       Pending             0          2m18s
    gke-tpu-pod   0/1       Pending             0          2m18s
    gke-tpu-pod   0/1       ContainerCreating   0          2m18s
    gke-tpu-pod   1/1       Running             0          2m48s
    gke-tpu-pod   0/1       Completed           0          3m8s
    

    Verwenden Sie Strg-C, um den Befehl "kubectl get" zu beenden.

    Mit den folgenden kubectl-Befehlen können Sie Loginformationen drucken und ausführlichere Informationen zu jedem GKE-Pod abrufen. Mit dem folgenden Befehl können Sie beispielsweise die Logausgabe für Ihren GKE-Pod aufrufen:

    $ kubectl logs gke-tpu-pod
    Die Ausgabe sollte in etwa so aussehen:
    2021-09-24 18:55:25.400699: I tensorflow/core/platform/cpu_feature_guard.cc:142]
    This TensorFlow binary is optimized with oneAPI Deep Neural Network Library
    (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
    To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
    2021-09-24 18:55:25.405947: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470}
    2021-09-24 18:55:25.406058: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769}
    2021-09-24 18:55:28.091729: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470}
    2021-09-24 18:55:28.091896: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769}
    2021-09-24 18:55:28.092579: I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:427]
    Started server with target: grpc://localhost:32769
    Tensorflow version 2.6.0
    Running on TPU  ['10.0.16.2:8470']
    PerReplica:{
      0: tf.Tensor(2.0, shape=(), dtype=float32),
      1: tf.Tensor(2.0, shape=(), dtype=float32),
      2: tf.Tensor(2.0, shape=(), dtype=float32),
      3: tf.Tensor(2.0, shape=(), dtype=float32),
      4: tf.Tensor(2.0, shape=(), dtype=float32),
      5: tf.Tensor(2.0, shape=(), dtype=float32),
      6: tf.Tensor(2.0, shape=(), dtype=float32),
      7: tf.Tensor(2.0, shape=(), dtype=float32)
    }
    

    Eine vollständige Beschreibung des GKE-Pods erhalten Sie mit folgendem Befehl:

    $ kubectl describe pod gke-tpu-pod
    

    Weitere Informationen finden Sie unter Anwendungsintrospektion und Debugging.

Ihr Modell im Docker-Image erstellen und containerisieren

Weitere Informationen zu diesem Vorgang finden Sie unter Eigenes Modell erstellen und containerisieren.

Cloud TPU für einen vorhandenen Cluster aktivieren

Führen Sie die folgenden Schritte in der Google Cloud-Befehlszeile aus, um die Cloud TPU-Unterstützung für einen vorhandenen GKE-Cluster zu aktivieren:

  1. Aktivieren Sie die Cloud TPU-Unterstützung:

    gcloud beta container clusters update cluster-name --enable-tpu
    

    Ersetzen Sie cluster-name durch den Namen Ihres Clusters.

  2. Aktualisieren Sie den kubeconfig-Eintrag:

    gcloud container clusters get-credentials cluster-name
    

Benutzerdefinierten CIDR-Bereich festlegen

Standardmäßig weist GKE den vom Cluster bereitgestellten TPUs einen CIDR-Block mit der Größe /20 zu. Sie können einen benutzerdefinierten CIDR-Bereich für die Cloud TPU angeben. Führen Sie dazu folgenden Befehl aus:

gcloud beta container clusters update cluster-name \
  --enable-tpu \
  --tpu-ipv4-cidr 10.100.0.0/20

Ersetzen Sie Folgendes:

  • cluster-name ist der Name Ihres vorhandenen Clusters.
  • 10.100.0.0/20: Ihr benutzerdefinierter CIDR-Bereich.

Vorhandenen CIDR-Bereich mit freigegebener VPC verwenden

Dieser Abschnitt richtet sich an Nutzer, die einen Cluster in einem freigegebenen VPC-Netzwerk bereitstellen, das einen vorhandenen CIDR-Bereich verwenden muss. Wenn es sich nicht um Ihren Anwendungsfall handelt, überspringen Sie diesen Abschnitt.

Der folgende Befehl zeigt, wie Sie einen Cluster mit einem vorhandenen CIDR-Bereich erstellen:

gcloud beta container clusters create cluster-name \
  --enable-tpu \
  --project TENANT_PROJECT \
  --zone=us-ZONE \
  --enable-ip-alias \
  --network projects/HOST_PROJECT/global/networks/HOST_NETWORK \
  --subnetwork projects/HOST_PROJECT/regions/REGION/subnetworks/SUBNETWORK \
  --services-secondary-range-name SERVICES_SECONDARY_RANGE \
  --enable-tpu \
  --enable-tpu-service-networking

Ersetzen Sie Folgendes:

  • cluster-name ist der Name Ihres vorhandenen Clusters.
  • TENANT_PROJECT ist der Name Ihres Projekts.
  • HOST_PROJECT: Der Name des Hostprojekts.
  • HOST_NETWORK: Der voll qualifizierte Hostname.
  • HOST_PROJECT: Der voll qualifizierte Name des Subnetzwerks.
  • SERVICES_SECONDARY_RANGE: der vorhandene Netzwerkbereich des Dienstes.

Weitere Informationen zu diesen Flags finden Sie im gcloud beta container clusters create-Befehlsreferenzhandbuch.

Cloud TPU in einem Cluster deaktivieren

Führen Sie zum Deaktivieren der Cloud TPU-Unterstützung für einen vorhandenen GKE-Cluster die folgenden Schritte in der Google Cloud-Befehlszeile aus:

  1. Prüfen Sie, dass keine Ihrer Arbeitslasten Cloud TPU verwendet:

    $ kubectl get tpu
    
  2. Deaktivieren Sie die Cloud TPU-Unterstützung in Ihrem Cluster:

    $ gcloud beta container clusters update cluster-name --no-enable-tpu
    

    Ersetzen Sie cluster-name durch den Namen Ihres Clusters.

    Bei zonalen Clustern dauert dieser Vorgang etwa 5 Minuten, bei regionalen Clustern je nach Clusterregion etwa 15 Minuten.

  3. Sobald die Vorgänge ohne Fehler abgeschlossen sind, können Sie prüfen, ob die vom Cluster bereitgestellten TPUs entfernt wurden:

    $ gcloud compute tpus list
    

    Die Namen der von Cloud TPU erstellten TPUs haben folgendes Format:

    $ gke-cluster-name-cluster-id-tpu-tpu-id
    

    Ersetzen Sie Folgendes:

    • cluster-name ist der Name Ihres vorhandenen Clusters.
    • cluster-id ist die ID Ihres vorhandenen Clusters.
    • tpu-id ist die ID der Cloud TPU.

    Wenn TPUs angezeigt werden, können Sie sie mit folgendem Befehl manuell löschen:

    $ gcloud compute tpus delete gke-cluster-name-cluster-id-tpu-tpu-id
    

Bereinigen

Wenn Sie mit Cloud TPU in GKE fertig sind, bereinigen Sie die Ressourcen, um zusätzliche Kosten für Ihr Cloud-Rechnungskonto zu vermeiden.

Falls Sie das Projekt und die Zone für diese Sitzung noch nicht festgelegt haben, holen Sie dies jetzt nach. Die Anleitung hierzu finden Sie weiter oben in diesem Leitfaden. Befolgen Sie dann diese Schritte zur Bereinigung:

  1. Führen Sie den folgenden Befehl aus, um den GKE-Cluster zu löschen. Ersetzen Sie dabei cluster-name durch den Clusternamen und "project-name" durch den Namen des Google Cloud-Projekts:

    $ gcloud container clusters delete cluster-name \
    --project=project-name --zone=us-central1-b
    
  2. Wenn Sie mit dem Untersuchen der Daten fertig sind, löschen Sie mit dem Befehl gsutil alle von Ihnen erstellten Cloud Storage-Buckets. Ersetzen Sie bucket-name durch den Namen Ihres Cloud Storage-Buckets:

    $ gsutil rm -r gs://bucket-name