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 für die Ausführung in GKE-Containern in GKE-Pods konfiguriert werden. Sollte dies der Fall sein, haben Sie folgende Vorteile:

  • Verbesserte Workfloweinrichtung und -verwaltung:GKE verwaltet den TPU-Lebenszyklus. Sobald die Initialisierung und das Training von Cloud TPU mit GKE eingerichtet sind, können Ihre Arbeitslasten wiederholt und von der GKE verwaltet werden, 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 TPUs automatisch entsprechend den Ressourcenanforderungen eines Pods.

  • 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.12.1. This version MUST match the
        # TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "2.12.1"
    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 auf Hunderte von GKE-Pods und TPU-Knoten skaliert werden 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. Wenn Fehler auf den VM-Instanzen oder Cloud TPU-Knoten auftreten, werden Ihre Trainingsjobs automatisch noch einmal ausgeführt, wobei der letzte Status vom Prüfpunkt gelesen 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 zu Typen und Zonen.
  • Sie müssen RFC 1918-konforme IP-Adressen für Ihre GKE-Cluster verwenden. Weitere Informationen finden Sie unter GKE-Netzwerk.
  • Jeder Container kann höchstens eine Cloud TPU anfordern. Mehrere Container in einem Pod können jedoch jeweils eine Cloud TPU anfordern.

Hinweise

  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 Google Cloud-Projekt muss aktiviert sein.

  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 Google Cloud-Projekt muss aktiviert sein.

  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 Google Cloud Console:

Neuen Cluster mit Cloud TPU-Unterstützung erstellen

Folgen Sie der nachstehenden Anleitung, um über die gcloud CLI Ihre Umgebung einzurichten und 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 unten auf der Seite auf Authorize, um gcloud zu erlauben, Google Cloud API-Aufrufe mit Ihren Anmeldedaten auszuführen.

  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 jeder 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 Ihre Cluster verwalten. Wenn Sie einen neuen Cluster erstellen, können Sie dessen Release-Version auswählen. Für den Cluster wird nur ein Upgrade auf die in diesem Kanal angebotenen Versionen durchgeführt.
    Bereiche
    Sorgt dafür, dass alle Knoten im Cluster Zugriff auf Ihren Cloud Storage-Bucket haben. Der Cluster und der Storage-Bucket müssen sich im selben 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 Verwendung 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 für Cloud TPU zu verwendenden CIDR-Bereich an. Geben Sie 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 zugewiesen 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 im Abschnitt limits unter dem Feld resource in der Containerspezifikation 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, Anfragekontingent, 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.

In der folgenden Beispiel-Pod-Spezifikation wird eine Cloud TPU v2-8-TPU auf Abruf mit TensorFlow 2.12.0 angefordert.

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.12.1. This version MUST match the
     # TensorFlow version that your model is built on.
     tf-version.cloud-tpus.google.com: "2.12.1"
spec:
  restartPolicy: Never
  containers:
  - name: gke-tpu-container
    # The official TensorFlow 2.12.1 image.
    # https://hub.docker.com/r/tensorflow/tensorflow
    image: tensorflow/tensorflow:2.12.1
    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 die folgenden Schritte aus, um den Job im GKE-Cluster zu erstellen und kubectl zu installieren.

  1. Erstellen Sie mit einem Texteditor die Pod-Spezifikation example-job.yaml, kopieren Sie die zuvor gezeigte Pod-Spezifikation und fügen Sie sie 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 Cloud TPU-Knoten bereitgestellt wurde. Ein GKE-Pod, der Cloud TPU-Knoten anfordert, kann vor der Ausführung 5 Minuten lang ausstehend sein. Die Ausgabe sieht in etwa so aus, bis der GKE-Pod geplant wird.

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

    Nach etwa 5 Minuten sollten Sie in etwa Folgendes sehen:

    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.12.1
    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 CLI 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.

Vorhandene CIDR-Bereiche mit freigegebene VPC verwenden

Folgen Sie der Anleitung zu TPU in GKE-Clustern mit freigegebener VPC, um die korrekte Konfiguration für die freigegebene VPC zu prüfen.

Cloud TPU in einem Cluster deaktivieren

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

  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.

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

    $ 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 den von Ihnen erstellten Cloud Storage-Bucket. Ersetzen Sie bucket-name durch den Namen Ihres Cloud Storage-Buckets:

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