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, in GKE-Containern in GKE-Pods Sollte dies der Fall sein, haben Sie folgende Vorteile:

  • Verbesserte Workfloweinrichtung und -verwaltung: GKE verwaltet des 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 TPUs automatisch nach Ressourcenanforderungen des 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 Bereitstellung), die auf Hunderte von GKE-Pods und TPU-Knoten

  • 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. Im Dokument Typen und Zonen finden Sie eine Liste der die verfügbaren Zonen.
  • Sie müssen RFC 1918-konforme IP-Adressen für Ihre GKE-Cluster 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. 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

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

    Go to project selector

  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 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 unten auf Authorize. der Seite, damit gcloud Google Cloud API-Aufrufe mit Ihrem Anmeldedaten.

  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 kann 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
    Release-Kanäle ermöglichen die Verwaltung automatischer Upgrades für Ihre Cluster. Wenn Sie und einen neuen Cluster erstellen, können Sie die 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. Die Kubernetes-Pods übernehmen standardmäßig die Bereiche der Knoten, für die sie bereitgestellt werden. Daher gibt scopes=cloud-platform alle Kubernetes-Pods wird der Bereich cloud-platform im Cluster ausgeführt. Wenn Sie Sie den Zugriff für einzelne Pods einschränken möchten, finden Sie in der GKE Leitfaden zur Authentifizierung mit Dienstkonten
    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 ein Der CIDR-Bereich mit der Größe /20 wird automatisch zugewiesen und zugewiesen.

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

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. Siehe TPU-Typen und Zonen finden Sie eine vollständige Liste der gültigen TPU-Ressourcen.

    Wenn die zu verwendende Ressource ein Cloud TPU Pod ist, Anfragekontingent, da das Standardkontingent für Cloud TPU Pod ist null.

    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 präemptive Cloud TPU an v2-8 TPU mit TensorFlow 2.12.1.

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

  1. Erstellen Sie mit einem Texteditor die Pod-Spezifikation example-job.yaml und kopieren Sie sie und fügen Sie sie ein. in der zuvor gezeigten Pod-Spezifikation.

  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, ob der GKE-Pod geplant wurde und Cloud TPU Knoten wurden bereitgestellt. Ein GKE-Pod, der Cloud TPU-Knoten können vor der Ausführung 5 Minuten lang den Status „Ausstehend“ haben. Ich sieht die Ausgabe in etwa so aus, bis die GKE Pod ist geplant.

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

    <ph type="x-smartling-placeholder"></ph> 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

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 freigegebene VPC verwenden

Folgen Sie der Anleitung zu TPU in GKE-Clustern, die eine freigegebene VPC verwenden, um die korrekte Konfiguration Ihrer freigegebene VPC.

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 der Analyse der Daten fertig sind, verwenden Sie die gsutil um den von Ihnen erstellten Cloud Storage-Bucket zu löschen. Ersetzen Sie bucket-name durch den Namen Ihres Cloud Storage-Buckets:

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