Cloud TPU-Anwendungen in GKE ausführen
In diesem Leitfaden wird Folgendes beschrieben:
- Cloud TPU-Konfiguration als Vorbereitung für den Betrieb unter Google Kubernetes Engine einrichten
- GKE-Cluster mit Cloud TPU-Unterstützung erstellen
- Cloud TPU-Messwerte mit TensorBoard visualisieren und die Leistung
- Ihr Modell im Docker-Image erstellen und containerisieren
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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Aktivieren Sie die folgenden APIs in der Google Cloud Console:
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.
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:
Installieren Sie die
gcloud
-Komponenten, die Sie zum Ausführen von GKE mit Cloud TPU benötigen:$ gcloud components install kubectl
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 aufAuthorize
unten auf der Seite, damitgcloud
Google Cloud API-Aufrufe mit Ihren Anmeldedaten durchführen kann.Konfigurieren Sie
gcloud
mit der Zone, in der Sie eine Cloud TPU-Ressource verwenden möchten. In diesem Beispiel wirdus-central1-b
verwendet. Sie können jedoch eine TPU in einer beliebigen unterstützten Zone verwenden.$ gcloud config set compute/zone us-central1-b
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 Bereichcloud-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 FormatIP/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 derresource
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:
Erstellen Sie mit einem Texteditor eine Pod-Spezifikation (
example-job.yaml
) und fügen Sie die oben gezeigte Pod-Spezifikation ein.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.
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:
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.
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:
Prüfen Sie, dass keine Ihrer Arbeitslasten Cloud TPU verwendet:
$ kubectl get tpu
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.
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.
Führen Sie den folgenden Befehl aus, um den GKE-Cluster zu löschen: Ersetzen Sie
cluster-name
durch Ihren Clusternamen undproject-name
durch Ihren Name des Google Cloud-Projekts:$ gcloud container clusters delete cluster-name \ --project=project-name --zone=us-central1-b
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