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:

  • Verbesserte Einrichtung und Verwaltung von Workflows: GKE verwaltet den TPU-Lebenszyklus. Nach der Initialisierung und dem Training von Cloud TPU mit GKE eingerichtet sind, können Ihre Arbeitslasten wiederholt die 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 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.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 Ressourcen auf Hunderte von GKE-Pods und TPU-Knoten skalieren können.

  • Fehlertoleranz: Job API von GKE TensorFlow-Prüfpunktmechanismus, geben Sie Semantik für die vollständige Ausführung. Ihre Trainingsjobs werden automatisch mit Den letzten vom Prüfpunkt gelesenen Status, wenn Fehler bei den VM-Instanzen auftreten oder Cloud TPU-Knoten.

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.
  • Sie müssen für Ihre GKE-Cluster RFC 1918-kompatible IP-Adressen verwenden. Weitere Informationen 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.

Hinweis

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

    Go to project selector

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

  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 Anleitung unten, um Ihre Umgebung einzurichten und eine GKE-Cluster mit Cloud TPU-Unterstützung über die gcloud CLI:

  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 Google Cloud 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
    Release-Kanäle ermöglichen die Verwaltung automatischer Upgrades für Ihre Cluster. Wenn Sie einen neuen Cluster erstellen, können Sie dessen Release-Version auswählen. Mein Cluster nur auf die in diesem Kanal angebotenen Versionen aktualisiert.
    Bereiche
    Sorgt dafür, dass alle Knoten im Cluster Zugriff auf Ihre Cloud Storage-Bucket. 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 gibt scopes=cloud-platform alle Kubernetes-Pods wird im Cluster den Bereich cloud-platform ausgeführt. Informationen dazu, wie Sie den Zugriff für einzelne Pods einschränken können, finden Sie im GKE-Leitfaden unter Mit Dienstkonten bei der Cloud Platform 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 CIDR-Bereich an, der für Cloud TPU verwendet werden soll. Definieren der IP_RANGE im Format IP/20, 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 im Abschnitt limits unter der resource in der Containerspezifikation.

    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 folgende Beispiel-Pod-Spezifikation fordert eine Cloud TPU v2-8-TPU auf Abruf mit TensorFlow 2.12.1 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.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 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 ca. 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

So aktivieren Sie die Cloud TPU-Unterstützung in einer vorhandenen GKE: Cluster führen Sie in der Google Cloud CLI die folgenden Schritte aus:

  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

Dabei gilt:

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

Vorhandene CIDR-Bereiche mit Shared VPC verwenden

Folgen Sie der Anleitung zu TPUs in GKE-Clustern mit einer freigegebenen VPC, um die korrekte Konfiguration für Ihre freigegebene VPC zu prüfen.

Cloud TPU in einem Cluster deaktivieren

So deaktivieren Sie die Cloud TPU-Unterstützung für eine vorhandene GKE: Cluster führen Sie in der Google Cloud CLI die folgenden Schritte 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

    Dabei gilt:

    • 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 cluster-name durch Ihren Clusternamen und project-name durch Ihren Name 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 der gcloud CLI den von Ihnen erstellten Cloud Storage-Bucket. Ersetzen Sie bucket-name durch den Namen des Cloud Storage-Buckets:

    $ gcloud storage rm gs://bucket-name --recursive