Questa pagina descrive come accelerare i carichi di lavoro di machine learning (ML) utilizzando gli acceleratori Cloud TPU (TPU) nei cluster GKE Autopilot. Queste indicazioni possono aiutarti a selezionare le librerie corrette per i framework delle applicazioni ML, a configurare i carichi di lavoro TPU in modo che vengano eseguiti in modo ottimale su GKE e a monitorare i carichi di lavoro dopo il deployment.
Questa pagina è rivolta ad amministratori e operatori della piattaforma, specialisti di dati e AI e sviluppatori di applicazioni che vogliono preparare ed eseguire carichi di lavoro di ML sulle TPU. Per scoprire di più sui ruoli, sulle responsabilità e sulle attività di esempio comuni a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli utente e attività comuni di GKE Enterprise.
Prima di leggere questa pagina, assicurati di conoscere le seguenti risorse:
Come funzionano le TPU in Autopilot
Per utilizzare le TPU nei carichi di lavoro Autopilot, specifica quanto segue nel manifest del carico di lavoro:
- La versione della TPU nel campo
spec.nodeSelector
. - La topologia TPU nel campo
spec.nodeSelector
. La topologia deve essere supportata dalla versione di TPU specificata. - Il numero di chip TPU nei campi
spec.containers.resources.requests
espec.containers.resources.limits
.
Quando esegui il deployment del workload, GKE esegue il provisioning dei nodi con la configurazione TPU richiesta e pianifica i pod sui nodi. GKE posiziona ogni carico di lavoro sul proprio nodo in modo che ogni pod possa accedere a tutte le risorse del nodo con un rischio minimo di interruzione.
Le TPU in Autopilot sono compatibili con le seguenti funzionalità:
Pianificare la configurazione TPU
Prima di utilizzare questa guida per il deployment dei carichi di lavoro TPU, pianifica la configurazione TPU in base al modello e alla quantità di memoria richiesta. Per maggiori dettagli, vedi Pianificare la configurazione della TPU.
Prezzi
Per informazioni sui prezzi, consulta Prezzi di Autopilot.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo
gcloud components update
.
- Assicurati di avere un cluster Autopilot che esegue GKE versione 1.32.3-gke.1927000 o successive. Per istruzioni, vedi Creazione di un cluster Autopilot.
- Per utilizzare le TPU riservate, assicurati di avere una prenotazione della capacità specifica esistente. Per le istruzioni, vedi Utilizzo delle risorse di zona prenotate.
Assicurati la quota per le TPU e altre risorse GKE
Le sezioni seguenti ti aiutano a verificare di avere una quota sufficiente quando utilizzi le TPU in GKE. Per creare nodi slice TPU, devi disporre di una quota TPU disponibile, a meno che tu non stia utilizzando una prenotazione di capacità esistente. Se utilizzi TPU riservate, salta questa sezione.La creazione di nodi slice TPU in GKE richiede la quota dell'API Compute Engine (compute.googleapis.com), non la quota dell'API Cloud TPU (tpu.googleapis.com). Il nome della quota è diverso nei pod Autopilot regolari e nei pod spot.
Per controllare il limite e l'utilizzo attuale della quota API Compute Engine per le TPU, segui questi passaggi:
Vai alla pagina Quote nella console Google Cloud :
Nella casella
Filtro, procedi nel seguente modo:Utilizza la seguente tabella per selezionare e copiare la proprietà della quota in base alla versione della TPU e al valore nel selettore del nodo
cloud.google.com/gke-tpu-accelerator
. Ad esempio, se prevedi di creare nodi TPU v5e on demand il cui valore nel selettore di nodicloud.google.com/gke-tpu-accelerator
ètpu-v5-lite-podslice
, inserisciName: TPU v5 Lite PodSlice chips
.Versione TPU, cloud.google.com/gke-tpu-accelerator
Proprietà e nome della quota per le istanze on demand Proprietà e nome della quota per le istanze Spot2 TPU v3,
tpu-v3-device
Dimensions (e.g. location):
tpu_family:CT3Non applicabile TPU v3,
tpu-v3-slice
Dimensions (e.g. location):
tpu_family:CT3PNon applicabile TPU v4,
tpu-v4-podslice
Name:
TPU v4 PodSlice chipsName:
Preemptible TPU v4 PodSlice chipsTPU v5e,
tpu-v5-lite-podslice
Name:
TPU v5 Lite PodSlice chipsName:
Preemptible TPU v5 Lite Podslice
chipsTPU v5p,
tpu-v5p-slice
Name:
TPU v5p chipsName:
Preemptible TPU v5p chipsTPU Trillium,
tpu-v6e-slice
Dimensions (e.g. location):
tpu_family:CT6EName:
Preemptible TPU slices v6eSeleziona la proprietà Dimensioni (ad es. località) e inserisci
region:
seguito dal nome della regione in cui prevedi di creare TPU in GKE. Ad esempio, inserisciregion:us-west4
se prevedi di creare nodi slice TPU nella zonaus-west4-a
. La quota TPU è regionale, quindi tutte le zone all'interno della stessa regione consumano la stessa quota TPU.
Se nessuna quota corrisponde al filtro inserito, significa che al progetto non è stata concessa nessuna delle quote specificate per la regione di cui hai bisogno e devi richiedere una modifica della quota TPU.
Quando viene creata una prenotazione TPU, sia il limite che i valori di utilizzo attuali per
la quota corrispondente aumentano del numero di chip nella prenotazione TPU. Ad esempio, quando viene creata una prenotazione per 16 chip TPU v5e
il cui
valore nel selettore di nodi cloud.google.com/gke-tpu-accelerator
è tpu-v5-lite-podslice
,
sia il limite sia
l'utilizzo attuale per la quota TPU v5 Lite PodSlice chips
nella regione
pertinente aumentano di 16.
Quote per risorse GKE aggiuntive
Potresti dover aumentare le seguenti quote relative a GKE nelle regioni in cui GKE crea le risorse.
- Quota SSD Persistent Disk (GB): il disco di avvio di ogni nodo Kubernetes richiede 100 GB per impostazione predefinita. Pertanto, questa quota deve essere impostata almeno sul prodotto del numero massimo di nodi GKE che prevedi di creare e 100 GB (nodi * 100 GB).
- Quota di indirizzi IP in uso: ogni nodo Kubernetes utilizza un indirizzo IP. Pertanto, questa quota deve essere impostata almeno sul numero massimo di nodi GKE che prevedi di creare.
- Assicurati che
max-pods-per-node
sia in linea con l'intervallo di subnet: ogni nodo Kubernetes utilizza intervalli IP secondari per i pod. Ad esempio,max-pods-per-node
di 32 richiede 64 indirizzi IP, il che si traduce in una subnet /26 per nodo. Tieni presente che questo intervallo non deve essere condiviso con nessun altro cluster. Per evitare di esaurire l'intervallo di indirizzi IP, utilizza il flag--max-pods-per-node
per limitare il numero di pod che possono essere pianificati su un nodo. La quota permax-pods-per-node
deve essere impostata almeno al livello del numero massimo di nodi GKE che prevedi di creare.
Per richiedere un aumento della quota, consulta Richiedi un aggiustamento delle quote.
Opzioni per il provisioning delle TPU in GKE
GKE Autopilot consente di utilizzare le TPU direttamente nei singoli carichi di lavoro utilizzando i nodeSelector di Kubernetes.
In alternativa, puoi richiedere TPU utilizzando classi di calcolo personalizzate. Le classi di calcolo personalizzate consentono agli amministratori della piattaforma di definire una gerarchia di configurazioni dei nodi che GKE deve dare la priorità durante le decisioni di scalabilità dei nodi, in modo che i workload vengano eseguiti sull'hardware selezionato.
Per le istruzioni, consulta la sezione Eseguire il provisioning centralizzato delle TPU con classi di calcolo personalizzate.
Prepara la tua richiesta di TPU
I carichi di lavoro TPU hanno i seguenti requisiti di preparazione.
- Framework come JAX, PyTorch e TensorFlow accedono alle VM TPU utilizzando la libreria condivisa
libtpu
.libtpu
include il compilatore XLA, il software di runtime TPU e il driver TPU. Ogni release di PyTorch e JAX richiede una determinata versione dilibtpu.so
. Per utilizzare le TPU in GKE, assicurati di utilizzare le seguenti versioni:Tipo di TPU libtpu.so
versioneTPU Trillium (v6e)
tpu-v6e-slice
- Versione jax[tpu] consigliata: v0.4.9 o successive
- Versione consigliata di torchxla[tpuvm]: v2.1.0 o successive
TPU v5e
tpu-v5-lite-podslice
- Versione jax[tpu] consigliata: v0.4.9 o successive
- Versione consigliata di torchxla[tpuvm]: v2.1.0 o successive
TPU v5p
tpu-v5p-slice
- Versione jax[tpu] consigliata: 0.4.19 o successive.
- Versione consigliata di torchxla[tpuvm]: si consiglia di utilizzare una versione nightly creata il 23 ottobre 2023.
TPU v4
tpu-v4-podslice
- jax[tpu] consigliato: v0.4.4 o versioni successive
- torchxla[tpuvm] consigliato: v2.0.0 o versioni successive
TPU v3
tpu-v3-slice
tpu-v3-device
- jax[tpu] consigliato: v0.4.4 o versioni successive
- torchxla[tpuvm] consigliato: v2.0.0 o versioni successive
- Imposta le seguenti variabili di ambiente per il container che richiede le risorse TPU:
TPU_WORKER_ID
: un numero intero univoco per ogni pod. Questo ID indica un worker-id univoco nella slice TPU. I valori supportati per questo campo vanno da zero al numero di pod meno uno.TPU_WORKER_HOSTNAMES
: un elenco separato da virgole di nomi host o indirizzi IP delle VM TPU che devono comunicare tra loro all'interno dello slice. Deve essere presente un nome host o un indirizzo IP per ogni VM TPU nello slice. L'elenco di indirizzi IP o nomi host è ordinato e indicizzato a zero in base aTPU_WORKER_ID
.
GKE inserisce automaticamente queste variabili di ambiente utilizzando un webhook di mutazione quando viene creato un job con le proprietà
completionMode: Indexed
,subdomain
,parallelism > 1
egoogle.com/tpu
. GKE aggiunge un servizio headless in modo che i record DNS vengano aggiunti per i pod che supportano il servizio.
Una volta completata la preparazione del workload, puoi eseguire un job che utilizza le TPU.
Richiedere TPU in un workload
Questa sezione mostra come creare un job che richiede TPU in Autopilot. In qualsiasi carico di lavoro che richiede TPU, devi specificare quanto segue:
- Selettori di nodi per la versione e la topologia TPU
- Il numero di chip TPU per un container nel tuo carico di lavoro
Per un elenco delle versioni e delle topologie TPU supportate e del numero corrispondente di chip e nodi TPU in una sezione, consulta Scegliere la versione TPU.
Considerazioni per le richieste TPU nei workload
Solo un container in un pod può utilizzare le TPU. Il numero di chip TPU richiesti da un container
deve essere uguale al numero di chip TPU collegati a un nodo nella sezione.
Ad esempio, se richiedi TPU v5e (tpu-v5-lite-podslice
) con una topologia 2x4
, puoi richiedere uno dei seguenti elementi:
4
chip, che crea due nodi multi-host con 4 chip TPU ciascuno8
chip, che crea un singolo nodo host con 8 chip TPU
Come best practice per massimizzare l'efficienza dei costi, utilizza sempre tutte le TPU nella sezione che richiedi. Se richiedi una sezione multihost di due nodi con 4 chip TPU ciascuno, devi eseguire il deployment di un workload che viene eseguito su entrambi i nodi e utilizza tutti gli 8 chip TPU nella sezione.
Crea un workload che richieda TPU
I passaggi seguenti creano un job che richiede TPU. Se hai carichi di lavoro che vengono eseguiti su sezioni TPU multi-host, devi anche creare un servizio headless che selezioni il carico di lavoro in base al nome. Questo servizio headless consente ai pod su nodi diversi nella sezione multihost di comunicare tra loro aggiornando la configurazione DNS di Kubernetes in modo che punti ai pod nel carico di lavoro.
Salva il seguente manifest come
tpu-autopilot.yaml
:apiVersion: v1 kind: Service metadata: name: headless-svc spec: clusterIP: None selector: job-name: tpu-job --- apiVersion: batch/v1 kind: Job metadata: name: tpu-job spec: backoffLimit: 0 completions: 4 parallelism: 4 completionMode: Indexed template: spec: # Optional: Run in GKE Sandbox # runtimeClassName: gvisor subdomain: headless-svc restartPolicy: Never nodeSelector: cloud.google.com/gke-tpu-accelerator: TPU_TYPE cloud.google.com/gke-tpu-topology: TOPOLOGY containers: - name: tpu-job image: python:3.10 ports: - containerPort: 8471 # Default port using which TPU VMs communicate - containerPort: 8431 # Port to export TPU runtime metrics, if supported. command: - bash - -c - | pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html python -c 'import jax; print("TPU cores:", jax.device_count())' resources: requests: cpu: 10 memory: MEMORY_SIZE google.com/tpu: NUMBER_OF_CHIPS limits: cpu: 10 memory: MEMORY_SIZE google.com/tpu: NUMBER_OF_CHIPS
Sostituisci quanto segue:
TPU_TYPE
: il tipo di TPU da utilizzare, ad esempiotpu-v4-podslice
. Deve essere un valore supportato da GKE.TOPOLOGY
: la disposizione dei chip TPU nello slice, ad esempio2x2x4
. Deve essere una topologia supportata per il tipo di TPU selezionato.NUMBER_OF_CHIPS
: il numero di chip TPU da utilizzare per il container. Deve essere lo stesso valore perlimits
erequests
.MEMORY_SIZE
: la quantità massima di memoria utilizzata dalla TPU. I limiti di memoria dipendono dalla versione e dalla topologia della TPU che utilizzi. Per saperne di più, consulta Valori minimi e massimi per gli acceleratori.- ** Facoltativo
runtimeClassname: gvisor
*: l'impostazione che consente di eseguire questo pod in GKE Sandbox. Per utilizzarla, rimuovi il commento da questa riga. GKE Sandbox supporta le TPU versione v4 e successive. Per saperne di più, consulta la pagina relativa alla sandbox di GKE.
Esegui il deployment del job:
kubectl create -f tpu-autopilot.yaml
Quando crei questo job, GKE esegue automaticamente le seguenti operazioni:
- Esegue il provisioning dei nodi per eseguire i pod. A seconda del tipo di TPU, della topologia e delle richieste di risorse che hai specificato, questi nodi sono sezioni single-host o multi-host.
- Aggiunge incompatibilità ai pod e tolleranze ai nodi per impedire l'esecuzione di altri carichi di lavoro sugli stessi nodi dei carichi di lavoro TPU.
Al termine di questa sezione, puoi evitare l'addebito di ulteriori costi eliminando il carico di lavoro che hai creato:
kubectl delete -f tpu-autopilot.yaml
Crea un workload che richieda TPU e pianificazione della raccolta
In TPU Trillium, puoi utilizzare la pianificazione della raccolta per raggruppare i nodi delle sezioni TPU. Il raggruppamento di questi nodi slice TPU semplifica la regolazione del numero di repliche per soddisfare la domanda del carico di lavoro. Google Cloud controlla gli aggiornamenti software per garantire che siano sempre disponibili slice sufficienti all'interno della raccolta per gestire il traffico.
TPU Trillium supporta la pianificazione della raccolta per i node pool single-host e multi-host che eseguono carichi di lavoro di inferenza. Di seguito viene descritto come il comportamento di pianificazione della raccolta dipende dal tipo di sezione TPU che utilizzi:
- Sezione TPU multi-host:GKE raggruppa le sezioni TPU multi-host per formare una raccolta. Ogni pool di nodi GKE è una replica all'interno di questa raccolta. Per definire una raccolta, crea uno slice TPU multihost e assegna un nome univoco alla raccolta. Per aggiungere altre sezioni di TPU alla raccolta, crea un altro pool di nodi di sezioni di TPU multi-host con lo stesso nome della raccolta e tipo di carico di lavoro.
- Sezione TPU single-host:GKE considera l'intero pool di nodil della sezione TPU single-host come una raccolta. Per aggiungere altre sezioni TPU alla raccolta, puoi ridimensionare ilpool di nodil di sezioni TPU single-host.
Per informazioni sulla limitazione della pianificazione della raccolta, vedi Come funziona la pianificazione della raccolta
Utilizzare una sezione TPU multi-host
La pianificazione della raccolta nei nodi delle sezioni TPU multihost è disponibile per i cluster Autopilot nella versione 1.31.2-gke.1537000 e successive. I nodi TPU multi-host con topologia
2x4
sono supportati solo nella versione 1.31.2-gke.1115000 o successive. Per creare
nodi slice TPU multi-host e raggrupparli in una raccolta, aggiungi le
seguenti etichette Kubernetes alla specifica del workload:
cloud.google.com/gke-nodepool-group-name
: ogni raccolta deve avere un nome univoco a livello di cluster. Il valore nell'etichettacloud.google.com/gke-nodepool-group-name
deve rispettare i requisiti per le etichette dei cluster.cloud.google.com/gke-workload-type: HIGH_AVAILABILITY
Ad esempio, il seguente blocco di codice definisce una raccolta con una sezione TPU multihost:
nodeSelector: cloud.google.com/gke-nodepool-group-name: ${COLLECTION_NAME} cloud.google.com/gke-workload-type: HIGH_AVAILABILITY cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice cloud.google.com/gke-tpu-topology: 4x4 ...
Utilizzare una sezione TPU single-host
La pianificazione della raccolta nei nodi delle sezioni TPU a host singolo è disponibile per
i cluster Autopilot nella versione 1.31.2-gke.1088000 e successive. Per creare
nodi slice TPU a host singolo e raggrupparli come raccolta, aggiungi l'etichetta
cloud.google.com/gke-workload-type:HIGH_AVAILABILITY
nella specifica del carico di lavoro.
Ad esempio, il seguente blocco di codice definisce una raccolta con una slice TPU a singolo host:
nodeSelector:
cloud.google.com/gke-tpu-accelerator: tpu-v6e-slice
cloud.google.com/gke-tpu-topology: 2x2
cloud.google.com/gke-workload-type: HIGH_AVAILABILITY
...
Esegui il provisioning centralizzato delle TPU con classi di calcolo personalizzate
Per eseguire il provisioning delle TPU con una classe di calcolo personalizzata che segue le regole TPU ed eseguire il deployment del carico di lavoro, completa i seguenti passaggi:
Salva il seguente manifest come
tpu-compute-class.yaml
:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: tpu-class spec: priorities: - tpu: type: tpu-v5-lite-podslice count: 4 topology: 2x4 - spot: true tpu: type: tpu-v5-lite-podslice count: 4 topology: 2x4 - flexStart: enabled: true tpu: type: tpu-v6e-slice count: 4 topology: 2x4 nodePoolAutoCreation: enabled: true
Esegui il deployment della classe di computing:
kubectl apply -f tpu-compute-class.yaml
Per saperne di più sulle classi di calcolo personalizzate e sulle TPU, consulta la sezione Configurazione TPU.
Salva il seguente manifest come
tpu-job.yaml
:apiVersion: v1 kind: Service metadata: name: headless-svc spec: clusterIP: None selector: job-name: tpu-job --- apiVersion: batch/v1 kind: Job metadata: name: tpu-job spec: backoffLimit: 0 completions: 4 parallelism: 4 completionMode: Indexed template: spec: subdomain: headless-svc restartPolicy: Never nodeSelector: cloud.google.com/compute-class: tpu-class containers: - name: tpu-job image: python:3.10 ports: - containerPort: 8471 # Default port using which TPU VMs communicate - containerPort: 8431 # Port to export TPU runtime metrics, if supported. command: - bash - -c - | pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html python -c 'import jax; print("TPU cores:", jax.device_count())' resources: requests: cpu: 10 memory: MEMORY_SIZE google.com/tpu: NUMBER_OF_CHIPS limits: cpu: 10 memory: MEMORY_SIZE google.com/tpu: NUMBER_OF_CHIPS
Sostituisci quanto segue:
NUMBER_OF_CHIPS
: il numero di chip TPU da utilizzare per il container. Deve essere lo stesso valore perlimits
erequests
, uguale al valore nel campotpu.count
nella classe di calcolo personalizzata selezionata.MEMORY_SIZE
: la quantità massima di memoria utilizzata dalla TPU. I limiti di memoria dipendono dalla versione e dalla topologia della TPU che utilizzi. Per saperne di più, consulta Valori minimi e massimi per gli acceleratori.NUMBER_OF_CHIPS
: il numero di chip TPU da utilizzare per il container. Deve essere lo stesso valore perlimits
erequests
.
Esegui il deployment del job:
kubectl create -f tpu-job.yaml
Quando crei questo job, GKE esegue automaticamente le seguenti operazioni:
- Esegue il provisioning dei nodi per eseguire i pod. A seconda del tipo di TPU, della topologia e delle richieste di risorse che hai specificato, questi nodi sono sezioni single-host o multi-host. A seconda della disponibilità delle risorse TPU nella priorità più alta, GKE potrebbe ricorrere a priorità inferiori per massimizzare l'ottenibilità.
- Aggiunge incompatibilità ai pod e tolleranze ai nodi per impedire l'esecuzione di altri carichi di lavoro sugli stessi nodi dei carichi di lavoro TPU.
Per saperne di più, consulta Informazioni sulle classi di calcolo personalizzate.
Al termine di questa sezione, puoi evitare l'addebito di ulteriori costi eliminando le risorse create:
kubectl delete -f tpu-job.yaml
Esempio: visualizzare il numero totale di chip TPU in una sezione multi-host
Il seguente carico di lavoro restituisce il numero di chip TPU in tutti i nodi di una sezione TPU multi-host. Per creare una sezione multihost, il carico di lavoro ha i seguenti parametri:
- Versione TPU: TPU v4
- Topologia: 2x2x4
Questa selezione di versione e topologia genera una sezione multi-host.
- Salva il seguente manifest come
available-chips-multihost.yaml
:apiVersion: v1 kind: Service metadata: name: headless-svc spec: clusterIP: None selector: job-name: tpu-available-chips --- apiVersion: batch/v1 kind: Job metadata: name: tpu-available-chips spec: backoffLimit: 0 completions: 4 parallelism: 4 completionMode: Indexed template: spec: subdomain: headless-svc restartPolicy: Never nodeSelector: cloud.google.com/gke-tpu-accelerator: tpu-v4-podslice cloud.google.com/gke-tpu-topology: 2x2x4 containers: - name: tpu-job image: python:3.10 ports: - containerPort: 8471 # Default port using which TPU VMs communicate - containerPort: 8431 # Port to export TPU runtime metrics, if supported. command: - bash - -c - | pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html python -c 'import jax; print("TPU cores:", jax.device_count())' resources: requests: cpu: 10 memory: 407Gi google.com/tpu: 4 limits: cpu: 10 memory: 407Gi google.com/tpu: 4
- Esegui il deployment del manifest:
kubectl create -f available-chips-multihost.yaml
GKE esegue una sezione TPU v4 con quattro VM (sezione TPU multi-host). La sezione ha 16 chip TPU interconnessi.
- Verifica che il job abbia creato quattro pod:
kubectl get pods
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE tpu-job-podslice-0-5cd8r 0/1 Completed 0 97s tpu-job-podslice-1-lqqxt 0/1 Completed 0 97s tpu-job-podslice-2-f6kwh 0/1 Completed 0 97s tpu-job-podslice-3-m8b5c 0/1 Completed 0 97s
- Recupera i log di uno dei pod:
kubectl logs POD_NAME
Sostituisci
POD_NAME
con il nome di uno dei pod creati. Ad esempio,tpu-job-podslice-0-5cd8r
.L'output è simile al seguente:
TPU cores: 16
- (Facoltativo) Rimuovi il workload:
kubectl delete -f available-chips-multihost.yaml
Esempio: visualizzare i chip TPU in un singolo nodo
Il seguente workload è un pod statico che mostra il numero di chip TPU collegati a un nodo specifico. Per creare un nodo a singolo host, il workload ha i seguenti parametri:
- Versione TPU: TPU v5e
- Topologia: 2x4
Questa selezione di versione e topologia genera una sezione a singolo host.
- Salva il seguente manifest come
available-chips-singlehost.yaml
:apiVersion: v1 kind: Pod metadata: name: tpu-job-jax-v5 spec: restartPolicy: Never nodeSelector: cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice cloud.google.com/gke-tpu-topology: 2x4 containers: - name: tpu-job image: python:3.10 ports: - containerPort: 8431 # Port to export TPU runtime metrics, if supported. command: - bash - -c - | pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html python -c 'import jax; print("Total TPU chips:", jax.device_count())' resources: requests: google.com/tpu: 8 limits: google.com/tpu: 8
- Esegui il deployment del manifest:
kubectl create -f available-chips-singlehost.yaml
GKE esegue il provisioning dei nodi con otto sezioni TPU a singolo host che utilizzano TPU v5e. Ogni nodo TPU ha otto chip TPU (sezione TPU a host singolo).
- Recupera i log del pod:
kubectl logs tpu-job-jax-v5
L'output è simile al seguente:
Total TPU chips: 8
- (Facoltativo) Rimuovi il workload:
kubectl delete -f available-chips-singlehost.yaml
Osserva e monitora le TPU
Dashboard
L'osservabilità del node pool nella Google Cloud console è disponibile pubblicamente. Per visualizzare lo stato dei tuoi node pool TPU multi-host su GKE, vai alla dashboard Stato del node pool TPU GKE fornita da Cloud Monitoring:
Vai a Stato del node pool GKE TPU
Questa dashboard fornisce informazioni complete sullo stato dei tuoi node pool TPU multi-host. Per saperne di più, consulta Monitorare le metriche di integrità per i nodi TPU e i pool di nodi.
Nella pagina Cluster Kubernetes della consoleGoogle Cloud , la scheda Osservabilità mostra anche le metriche di osservabilità delle TPU, come l'utilizzo delle TPU, sotto l'intestazione Acceleratori > TPU. Per ulteriori informazioni, consulta Visualizzare le metriche di osservabilità.
La dashboard TPU viene compilata solo se hai abilitato le metriche di sistema nel tuo cluster GKE.
Metriche di runtime
In GKE 1.27.4-gke.900 o versioni successive, i carichi di lavoro TPU
che utilizzano JAX versione
0.4.14
o successive e specificano containerPort: 8431
esportano le metriche di utilizzo della TPU come
metriche di sistema GKE.
In Cloud Monitoring sono disponibili le seguenti metriche
per monitorare le prestazioni di runtime del carico di lavoro TPU:
- Ciclo di lavoro: percentuale di tempo nell'ultimo periodo di campionamento (60 secondi) durante il quale i TensorCore hanno eseguito attivamente l'elaborazione su un chip TPU. Una percentuale maggiore indica un migliore utilizzo della TPU.
- Memoria utilizzata: quantità di memoria dell'acceleratore allocata in byte. Campionamento eseguito ogni 60 secondi.
- Memoria totale: memoria totale dell'acceleratore in byte. Campionamento eseguito ogni 60 secondi.
Queste metriche si trovano nello schema del nodo Kubernetes (k8s_node
) e del container Kubernetes (k8s_container
).
Container Kubernetes:
kubernetes.io/container/accelerator/duty_cycle
kubernetes.io/container/accelerator/memory_used
kubernetes.io/container/accelerator/memory_total
Nodo Kubernetes:
kubernetes.io/node/accelerator/duty_cycle
kubernetes.io/node/accelerator/memory_used
kubernetes.io/node/accelerator/memory_total
Monitora le metriche di integrità per i nodi TPU e i pool di nodi
Quando un job di addestramento genera un errore o termina con esito negativo, puoi controllare le metriche relative all'infrastruttura sottostante per capire se l'interruzione è stata causata da un problema con il nodo o il pool di nodi sottostante.
Stato nodo
In GKE versione 1.32.1-gke.1357001 o successive, la seguente metrica di sistema GKE mostra la condizione di un nodo GKE:
kubernetes.io/node/status_condition
Il campo condition
riporta le condizioni del nodo, ad esempio Ready
, DiskPressure
e MemoryPressure
. Il campo status
mostra lo stato segnalato della condizione,
che può essere True
, False
o Unknown
. Si tratta di una metrica con il tipo di risorsa monitorata k8s_node
.
Questa query PromQL mostra se un determinato nodo è Ready
:
kubernetes_io:node_status_condition{
monitored_resource="k8s_node",
cluster_name="CLUSTER_NAME",
node_name="NODE_NAME",
condition="Ready",
status="True"}
Per risolvere i problemi in un cluster, potresti voler esaminare i nodi che hanno mostrato altre condizioni:
kubernetes_io:node_status_condition{
monitored_resource="k8s_node",
cluster_name="CLUSTER_NAME",
condition!="Ready",
status="True"}
Potresti voler esaminare in modo specifico i nodi che non sono Ready
:
kubernetes_io:node_status_condition{
monitored_resource="k8s_node",
cluster_name="CLUSTER_NAME",
condition="Ready",
status="False"}
Se non sono presenti dati, i nodi sono pronti. La condizione di stato viene campionata ogni 60 secondi.
Puoi utilizzare la seguente query per comprendere lo stato dei nodi in tutto il parco macchine:
avg by (condition,status)(
avg_over_time(
kubernetes_io:node_status_condition{monitored_resource="k8s_node"}[${__interval}]))
Stato del node pool
La seguente metrica di sistema GKE per la risorsa monitorata k8s_node_pool
mostra lo stato di unpool di nodil GKE:
kubernetes.io/node_pool/status
Questa metrica viene segnalata solo per i node pool TPU multi-host.
Il campo status
indica lo stato del pool di nodi, ad esempio Provisioning
, Running
, Error
,
Reconciling
o Stopping
. Gli aggiornamenti dello stato vengono eseguiti al termine delle operazioni dell'API GKE.
Per verificare se un determinato pool di nodi ha lo stato Running
, utilizza la seguente query PromQL:
kubernetes_io:node_pool_status{
monitored_resource="k8s_node_pool",
cluster_name="CLUSTER_NAME",
node_pool_name="NODE_POOL_NAME",
status="Running"}
Per monitorare il numero di pool di nodi nel tuo progetto raggruppati in base al loro stato, utilizza la seguente query PromQL:
count by (status)(
count_over_time(
kubernetes_io:node_pool_status{monitored_resource="k8s_node_pool"}[${__interval}]))
Disponibilità del node pool
La seguente metrica di sistema GKE mostra se un pool di nodi TPU multi-host è disponibile:
kubernetes.io/node_pool/multi_host/available
La metrica ha un valore pari a True
se tutti i nodi nel pool di nodi sono disponibili,
e False
in caso contrario. La metrica viene campionata ogni 60 secondi.
Per controllare la disponibilità dei node pool TPU multi-host nel tuo progetto, utilizza la seguente query PromQL:
avg by (node_pool_name)(
avg_over_time(
kubernetes_io:node_pool_multi_host_available{
monitored_resource="k8s_node_pool",
cluster_name="CLUSTER_NAME"}[${__interval}]))
Conteggio interruzioni dei nodi
La seguente metrica di sistema GKE riporta il conteggio delle interruzioni per un nodo GKE dall'ultimo campione (la metrica viene campionata ogni 60 secondi):
kubernetes.io/node/interruption_count
I campi interruption_type
(ad esempio TerminationEvent
, MaintenanceEvent
o PreemptionEvent
) e interruption_reason
(ad esempio HostError
, Eviction
o AutoRepair
) possono contribuire a fornire il motivo per cui
un nodo è stato interrotto.
Per ottenere una suddivisione delle interruzioni e delle relative cause nei nodi TPU nei cluster del tuo progetto, utilizza la seguente query PromQL:
sum by (interruption_type,interruption_reason)(
sum_over_time(
kubernetes_io:node_interruption_count{monitored_resource="k8s_node"}[${__interval}]))
Per visualizzare solo gli
eventi di manutenzione dell'host,
aggiorna la query per filtrare il valore HW/SW Maintenance
per interruption_reason
. Utilizza la seguente query PromQL:
```promql
sum by (interruption_type,interruption_reason)(
sum_over_time(
kubernetes_io:node_interruption_count{monitored_resource="k8s_node", interruption_reason="HW/SW Maintenance"}[${__interval}]))
```
Per visualizzare il conteggio delle interruzioni aggregato per pool di nodi, utilizza la seguente query PromQL:
```promql
sum by (node_pool_name,interruption_type,interruption_reason)(
sum_over_time(
kubernetes_io:node_pool_interruption_count{monitored_resource="k8s_node_pool", interruption_reason="HW/SW Maintenance", node_pool_name=NODE_POOL_NAME }[${__interval}]))
```
Tempi di ripristino (TTR) dei node pool
La seguente metrica di sistema GKE riporta la distribuzione delle durate del periodo di recupero per i node pool TPU multi-host GKE:
kubernetes.io/node_pool/accelerator/times_to_recover
Ogni campione registrato in questa metrica indica un singolo evento di ripristino per il pool di nodi da un periodo di inattività.
Questa metrica è utile per monitorare il tempo di ripristino e il tempo tra le interruzioni del pool di nodi TPU multi-host.
Puoi utilizzare la seguente query PromQL per calcolare il tempo medio di ripristino (MTTR) degli ultimi 7 giorni nel tuo cluster:
sum(sum_over_time(
kubernetes_io:node_pool_accelerator_times_to_recover_sum{
monitored_resource="k8s_node_pool", cluster_name="CLUSTER_NAME"}[7d]))
/
sum(sum_over_time(
kubernetes_io:node_pool_accelerator_times_to_recover_count{
monitored_resource="k8s_node_pool",cluster_name="CLUSTER_NAME"}[7d]))
Tempo tra le interruzioni (TBI) dei node pool
Il tempo tra le interruzioni del node pool misura il tempo di esecuzione dell'infrastruttura prima di subire un'interruzione. Viene calcolato come media in un periodo di tempo, in cui il numeratore misura il tempo totale di attività dell'infrastruttura e il denominatore misura le interruzioni totali dell'infrastruttura.
Il seguente esempio di PromQL mostra il tempo medio tra le interruzioni (MTBI) di 7 giorni per il cluster specificato:
sum(count_over_time(
kubernetes_io:node_memory_total_bytes{
monitored_resource="k8s_node", node_name=~"gke-tpu.*|gk3-tpu.*", cluster_name="CLUSTER_NAME"}[7d]))
/
sum(sum_over_time(
kubernetes_io:node_interruption_count{
monitored_resource="k8s_node", node_name=~"gke-tpu.*|gk3-tpu.*", cluster_name="CLUSTER_NAME"}[7d]))
Metriche host
In GKE 1.28.1-gke.1066000 o versioni successive, le VM in una sezione di TPU esportano le metriche di utilizzo della TPU come metriche di sistema GKE. In Cloud Monitoring sono disponibili le seguenti metriche per monitorare le prestazioni dell'host TPU:
- Utilizzo di TensorCore: percentuale attuale di TensorCore utilizzata. Il valore di TensorCore è uguale alla somma delle unità di moltiplicazione a matrice (MXU) più l'unità vettoriale. Il valore di utilizzo di TensorCore è la divisione tra le operazioni TensorCore eseguite nell'ultimo periodo di campionamento (60 secondi) e il numero di operazioni TensorCore supportate nello stesso periodo. Un valore più alto indica un utilizzo migliore.
- Utilizzo della larghezza di banda della memoria: percentuale attuale della larghezza di banda della memoria dell'acceleratore in uso. Viene calcolata dividendo la larghezza di banda della memoria utilizzata in un periodo di campionamento (60 secondi) per la larghezza di banda massima supportata nello stesso periodo di campionamento.
Queste metriche si trovano nello schema del nodo Kubernetes (k8s_node
) e del container Kubernetes (k8s_container
).
Container Kubernetes:
kubernetes.io/container/accelerator/tensorcore_utilization
kubernetes.io/container/accelerator/memory_bandwidth_utilization
Nodo Kubernetes:
kubernetes.io/node/accelerator/tensorcore_utilization
kubernetes.io/node/accelerator/memory_bandwidth_utilization
Per ulteriori informazioni, consulta Metriche Kubernetes e Metriche di sistema GKE.
Logging
I log emessi dai container in esecuzione sui nodi GKE, incluse le VM TPU, vengono raccolti dall'agente di logging GKE, inviati a Logging e sono visibili in Logging.
Consigli per i carichi di lavoro TPU in Autopilot
I seguenti consigli potrebbero migliorare l'efficienza dei carichi di lavoro TPU:
- Utilizza i pod con runtime esteso per un periodo di tolleranza fino a sette giorni prima che GKE termini i pod per ridimensionamenti o upgrade dei nodi. Puoi utilizzare finestre di manutenzione ed esclusioni con pod con tempi di esecuzione estesi per ritardare ulteriormente gli upgrade automatici dei nodi.
- Utilizza le prenotazioni di capacità per garantire che i tuoi workload ricevano le TPU richieste senza essere inseriti in una coda per la disponibilità.
Per scoprire come configurare Cloud TPU in GKE, consulta le seguenti risorse Google Cloud :
- Pianifica le TPU in GKE per iniziare la configurazione delle TPU.
- Esegui il deployment dei carichi di lavoro TPU in GKE Autopilot
- Esegui il deployment dei carichi di lavoro TPU in GKE Standard
- Scopri le best practice per l'utilizzo di Cloud TPU per le tue attività di machine learning.
- Video: Build large-scale machine learning on Cloud TPU with GKE.
- Eroga modelli linguistici di grandi dimensioni con KubeRay sulle TPU.
- Scopri di più sul sandboxing dei carichi di lavoro GPU con GKE Sandbox