Questa pagina mostra come risolvere i problemi relativi alle TPU in Google Kubernetes Engine (GKE).
Se hai bisogno di ulteriore assistenza, contatta Assistenza clienti Google Cloud.Quota insufficiente per soddisfare la richiesta TPU
Un errore simile a Insufficient quota to satisfy the request
indica che il tuo progetto Google Cloud non dispone di una quota sufficiente per soddisfare la richiesta.
Per risolvere il problema, controlla il limite di quota e l'utilizzo corrente del progetto. Se se necessario, richiedi un aumento della quota di TPU.
Controlla il limite di quota e l'utilizzo attuale
Le sezioni seguenti ti aiutano ad assicurarti di avere una quota sufficiente quando utilizzi le TPU in GKE.
Per verificare il limite e l'utilizzo attuale della tua quota dell'API Compute Engine per le TPU, segui questi passaggi:
Vai alla pagina Quote nella console Google Cloud:
Nella casella
Filtra, procedi nel seguente modo:Seleziona la proprietà Servizio, inserisci API Compute Engine e premi Invio.
Seleziona la proprietà Tipo e scegli Quota.
Seleziona la proprietà Nome e inserisci il nome della quota in base alla versione TPU e Ad esempio, se prevedi di creare modelli I nodi TPU v5e , inserisci
TPU v5 Lite PodSlice chips
.Versione TPU Nome della quota per le istanze on demand Nome della quota per le istanze Spot2 TPU v4 TPU v4 PodSlice chips
Preemptible TPU v4 PodSlice chips
TPU v5e TPU v5 Lite Device chips
Preemptible TPU v5 Lite Device chips
TPU v5e TPU v5 Lite PodSlice chips
Preemptible TPU v5 Lite PodSlice chips
TPU v5p TPU v5p chips
Preemptible TPU v5p chips
Seleziona 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 crea nodi della sezione TPU nella zonaus-west4-a
. La quota TPU è regionale, pertanto tutte le zone all'interno della stessa regione consumano la stessa quota TPU.
Se nessuna quota corrisponde al filtro inserito, il progetto non è stato ti sia stata concessa una qualsiasi della quota specificata per la regione di cui hai bisogno e devi richiedere un aumento della quota di TPU.
Quando viene creata una prenotazione TPU, sia il limite sia i valori di utilizzo corrente per la quota corrispondente aumentano in base al numero di chip nella prenotazione TPU. Ad esempio, quando viene creata una prenotazione per 16 chip TPU v5e, entrambi i valori Limite e Utilizzo corrente 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 nel in cui GKE crea le tue risorse.
- Quota di dischi permanenti SSD (GB): il disco di avvio di ogni nodo Kubernetes. richiede 100 GB per impostazione predefinita. Pertanto, questa quota deve essere impostata su un valore almeno uguale al prodotto del numero massimo di nodi GKE che prevedi di creare e 100 GB (nodi * 100 GB).
- Quota indirizzi IP in uso: ogni nodo Kubernetes utilizza un indirizzo IP. Pertanto, questa quota deve essere impostata almeno su un valore pari al numero massimo i 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 che si traducono in una subnet /26 per nodo. Tieni presente che questo intervallo non deve essere condiviso con altri cluster. Per evitare di esaurire l'intervallo di indirizzi IP, utilizza il flag--max-pods-per-node
per limitare il numero di pod consentiti da pianificare su un nodo. La quota permax-pods-per-node
deve essere impostata su un valore almeno pari al numero massimo di nodi GKE che prevedi di creare.
Per richiedere un aumento della quota, consulta Richiedere un aumento di quota.
Errore durante l'abilitazione del provisioning automatico dei nodi in un pool di nodi della sezione TPU
Il seguente errore si verifica quando abiliti il provisioning automatico dei nodi in una Cluster GKE che non supporta le TPU.
Il messaggio di errore è simile al seguente:
ERROR: (gcloud.container.clusters.create) ResponseError: code=400,
message=Invalid resource: tpu-v4-podslice.
Per risolvere il problema, esegui l'upgrade del cluster GKE alla versione 1.27.6 o successiva.
GKE non esegue automaticamente il provisioning dei nodi della sezione TPU
Le seguenti sezioni descrivono i casi in cui GKE non eseguire automaticamente il provisioning dei nodi della sezione TPU e come correggerli.
Limita configurazione errata
GKE non esegue automaticamente il provisioning dei nodi dei sezioni TPU se i limiti di provisioning automatico che hai definito per un cluster sono troppo bassi. In questi scenari potresti osservare i seguenti errori:
Se esiste un pool di nodi della sezione TPU, ma GKE non può fare lo scale up dei nodi a causa a violare i limiti delle risorse, quando esegui il comando
kubectl get events
, puoi visualizzare il seguente messaggio di errore:11s Normal NotTriggerScaleUp pod/tpu-workload-65b69f6c95-ccxwz pod didn't trigger scale-up: 1 node(s) didn't match Pod's node affinity/selector, 1 max cluster cpu, memory limit reached
Inoltre, in questo caso potresti vedere messaggi di avviso simili ai seguenti: nella console Google Cloud:
"Your cluster has one or more unschedulable Pods"
Quando GKE tenta di eseguire il provisioning automatico di un pool di nodi della sezione TPU che supera i limiti delle risorse, i log di visibilità del gestore della scalabilità automatica il seguente messaggio di errore:
messageId: "no.scale.up.nap.pod.zonal.resources.exceeded"
Inoltre, in questo scenario, nella console Google Cloud puoi visualizzare messaggi di avviso simili al seguente:
"Can't scale up because node auto-provisioning can't provision a node pool for the Pod if it would exceed resource limits"
Per risolvere questi problemi, aumenta il numero massimo di chip TPU, core CPU e memoria nel cluster.
Per completare questi passaggi:
- Calcola i requisiti delle risorse per un determinato tipo e numero di macchine TPU. Tieni presente che devi aggiungere risorse per i pool di nodi delle sezioni non TPU, come i sistemi carichi di lavoro con scale out impegnativi.
Ottenere una descrizione delle TPU, della CPU e della memoria disponibili per un tipo di macchina e zona. Utilizza gcloud CLI:
gcloud compute machine-types describe MACHINE_TYPE \ --zone COMPUTE_ZONE
Sostituisci quanto segue:
MACHINE_TYPE
: il tipo di macchina da cercare.COMPUTE_ZONE
: il nome della zona di calcolo.
L'output include una riga di descrizione simile alla seguente:
description: 240 vCPUs, 407 GB RAM, 4 Google TPUs ```
Calcola il numero totale di CPU e memoria moltiplicando queste quantità per il numero di nodi richiesto. Ad esempio, il tipo di macchina
ct4p-hightpu-4t
utilizza 240 core CPU e 407 GB di RAM con 4 chip TPU. Supponendo che tu abbia bisogno 20 chip TPU, che corrispondono a cinque nodi, devi definire quanto segue valori:--max-accelerator=type=tpu-v4-podslice,count=20
.CPU = 1200
(240 x 5)memory = 2035
(407 volte 5)
Devi definire i limiti con un certo margine per ospitare i nodi delle sezioni non TPU come i carichi di lavoro di sistema.
Aggiorna i limiti del cluster:
gcloud container clusters update CLUSTER_NAME \ --max-accelerator type=TPU_ACCELERATOR \ count=MAXIMUM_ACCELERATOR \ --max-cpu=MAXIMUM_CPU \ --max-memory=MAXIMUM_MEMORY
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del cluster.TPU_ACCELERATOR
: il nome dell'acceleratore TPU.MAXIMUM_ACCELERATOR
: il numero massimo di chip TPU nel cluster.MAXIMUM_CPU
: il numero massimo di core nell' in un cluster Kubernetes.MAXIMUM_MEMORY
: il numero massimo di gigabyte di memoria nel cluster.
Non tutte le istanze sono in esecuzione
ERROR: nodes cannot be created due to lack of capacity. The missing nodes
will be created asynchronously once capacity is available. You can either
wait for the nodes to be up, or delete the node pool and try re-creating it
again later.
Questo errore può verificarsi quando l'operazione GKE ha esaurito il tempo di attesa o la richiesta non può essere completata e messa in coda per il provisioning di pool di nodi TPU mono o multi-host. Per ridurre i problemi di capacità, puoi utilizzare le prenotazioni o prendere in considerazione le VM spot.
Configurazione errata del carico di lavoro
Questo errore si verifica a causa di un'errata configurazione del carico di lavoro. Di seguito sono riportate alcune delle cause più comuni dell'errore:
- Le
cloud.google.com/gke-tpu-accelerator
ecloud.google.com/gke-tpu-topology
etichette sono errate o mancanti nel pod del modello. GKE non eseguirà il provisioning dei pool di nodi della sezione TPU e del nodo il provisioning automatico non sarà in grado di fare lo scale up del cluster. - La specifica del pod non specifica
google.com/tpu
nei requisiti delle risorse.
Per risolvere il problema, esegui una delle seguenti operazioni:
- Verifica che non siano presenti etichette non supportate nel selettore dei nodi del carico di lavoro.
Ad esempio, un selettore di nodi per l'etichetta
cloud.google.com/gke-nodepool
impedire a GKE di creare pool di nodi aggiuntivi per i tuoi pod. - Assicurati che le specifiche del modello di pod, in cui viene eseguito il carico di lavoro TPU, includano
i seguenti valori:
cloud.google.com/gke-tpu-accelerator
ecloud.google.com/gke-tpu-topology
nelnodeSelector
.google.com/tpu
nella richiesta.
Per scoprire come eseguire il deployment dei carichi di lavoro TPU in GKE, consulta Esegui un carico di lavoro che visualizza il numero di chip TPU disponibili in un pool di nodi della sezione TPU.
Errori di pianificazione durante il deployment di pod che utilizzano TPU in GKE
Il seguente problema si verifica quando GKE non riesce a pianificare i pod che richiedono TPU sui nodi della sezione TPU. Ad esempio, questo potrebbe verificarsi se alcuni slice non TPU erano già pianificati sui nodi TPU.
Il messaggio di errore, emesso come evento FailedScheduling
nel pod, è simile al seguente:
Cannot schedule pods: Preemption is not helpful for scheduling.
Error message: 0/2 nodes are available: 2 node(s) had untolerated taint
{google.com/tpu: present}. preemption: 0/2 nodes are available: 2 Preemption is
not helpful for scheduling
Per risolvere il problema:
Verifica di avere almeno un pool di nodi CPU nel cluster, in modo che il sistema sia critico I pod possono essere eseguiti nei nodi non TPU. Per saperne di più, consulta Eseguire il deployment di un pod in un pool di nodi specifico.
Risoluzione dei problemi comuni relativi ai JobSet in GKE
Per conoscere i problemi comuni relativi a JobSet e i suggerimenti per la risoluzione dei problemi, consulta la pagina relativa alla risoluzione dei problemi di JobSet. Questa pagina riguarda problemi comuni, ad esempio "Webhook non disponibile" l'errore, il job figlio o i pod non creati, e il ripristino del problema di carichi di lavoro prerilasciati utilizzando JobSet e Kueue.
Inizializzazione della TPU non riuscita
Il seguente problema si verifica quando GKE non riesce a eseguire il provisioning di nuovi carichi di lavoro TPU a causa della mancanza dell'autorizzazione per accedere ai dispositivi TPU.
Il messaggio di errore è simile al seguente:
TPU platform initialization failed: FAILED_PRECONDITION: Couldn't mmap: Resource
temporarily unavailable.; Unable to create Node RegisterInterface for node 0,
config: device_path: "/dev/accel0" mode: KERNEL debug_data_directory: ""
dump_anomalies_only: true crash_in_debug_dump: false allow_core_dump: true;
could not create driver instance
Per risolvere questo problema, assicurati di eseguire il container TPU in
con privilegi o aumenti il valore di ulimit
all'interno del contenitore.
Programmazione deadlock
La pianificazione di due o più job potrebbe non riuscire in caso di deadlock. Ad esempio, nello scenario in cui si verifica quanto segue:
- Hai due job (job A e job B) con regole di affinità dei pod.
GKE pianifica le sezioni TPU per entrambi i job con una topologia TPU
di
v4-32
. - Nel cluster sono presenti due sezioni TPU
v4-32
. - Il tuo cluster ha una capacità sufficiente per pianificare entrambi i job e, in teoria, ogni job può essere pianificato rapidamente su ogni slice TPU.
- Lo scheduler Kubernetes pianifica un pod dal job A su un livello, quindi pianifica un pod dal job B sullo stesso livello.
In questo caso, date le regole di affinità dei pod per il job A, lo scheduler tenta di pianificare tutti i pod rimanenti per il job A e il job B, su una singola sezione TPU ciascuno. Di conseguenza, GKE non sarà in grado di pianificare completamente il job A Lavoro B. Di conseguenza, lo stato di entrambi i job rimarrà In attesa.
Per risolvere il problema, utilizza
l'anti-affinità dei pod
con cloud.google.com/gke-nodepool
come topologyKey
, come mostrato nell'esempio seguente:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
parallelism: 2
template:
metadata:
labels:
job: pi
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: job
operator: In
values:
- pi
topologyKey: cloud.google.com/gke-nodepool
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: job
operator: NotIn
values:
- pi
topologyKey: cloud.google.com/gke-nodepool
namespaceSelector:
matchExpressions:
- key: kubernetes.io/metadata.name
operator: NotIn
values:
- kube-system
containers:
- name: pi
image: perl:5.34.0
command: ["sleep", "60"]
restartPolicy: Never
backoffLimit: 4
Autorizzazione negata durante la creazione del cluster in us-central2
Se stai tentando di creare un cluster in us-central2
(l'unica regione in cui è disponibile TPU v4), potresti visualizzare un messaggio di errore simile al seguente:
ERROR: (gcloud.container.clusters.create) ResponseError: code=403,
message=Permission denied on 'locations/us-central2' (or it may not exist).
Questo errore è perché la regione us-central2
è una regione privata.
Per risolvere il problema, invia una richiesta di assistenza o contatta il tuo
di rendere visibile us-central2
all'interno del tuo
progetto Google Cloud.
Quota insufficiente durante la creazione del pool di nodi TPU in us-central2
Se stai tentando di creare un pool di nodi della sezione TPU in us-central2
(l'unico
regione in cui è disponibile TPU v4), potrebbe essere necessario aumentare il
Quote relative a GKE alla creazione iniziale di pool di nodi TPU v4:
- Quota SSD (GB) di Persistent Disk in us-central2: per impostazione predefinita, il disco di avvio di ogni nodo Kubernetes richiede 100 GB. Pertanto, questa quota deve essere impostata almeno su un valore pari al prodotto del numero massimo di nodi GKE che prevedi di creare in
us-central2
e 100 GB (maximum_nodes
x100 GB
). - Quota di indirizzi IP in uso in us-central2: ogni nodo Kubernetes utilizza
a un indirizzo IP. Pertanto, questa quota deve essere impostata almeno su un valore pari a quello
di nodi GKE che prevedi di creare
us-central2
.
Subnet mancante durante la creazione del cluster GKE
Se stai tentando di creare un cluster in us-central2
(l'unica regione in cui è disponibile TPU v4), potresti visualizzare un messaggio di errore simile al seguente:
ERROR: (gcloud.container.clusters.create) ResponseError: code=404,
message=Not found: project <PROJECT> does not have an auto-mode subnetwork
for network "default" in region <REGION>.
Per fornire la connettività è necessaria una subnet nella tua rete VPC
ai nodi GKE. Tuttavia, in alcune regioni comeus-central2
, potrebbe non essere creata una subnet predefinita, anche se utilizzi la rete VPC predefinita in modalità automatica (per la creazione di subnet).
Per risolvere il problema, assicurati di aver creato un modello personalizzato nella regione durante la creazione del cluster GKE. Questa subnet non deve sovrapporsi ad altre subnet creati in altre regioni nella stessa rete VPC.
Visualizza i log TPU GKE
Per visualizzare tutti i log relativi a TPU per un caricamento di lavoro specifico, Cloud Logging offre una posizione centralizzata per eseguire query su questi log quando il logging del sistema e del carico di lavoro di GKE è abilitato. In Cloud Logging, i log sono organizzati in voci di log e ogni La voce di log ha un formato strutturato. Di seguito è riportato un esempio di voce di log del job di addestramento TPU.
{
insertId: "gvqk7r5qc5hvogif"
labels: {
compute.googleapis.com/resource_name: "gke-tpu-9243ec28-wwf5"
k8s-pod/batch_kubernetes_io/controller-uid: "443a3128-64f3-4f48-a4d3-69199f82b090"
k8s-pod/batch_kubernetes_io/job-name: "mnist-training-job"
k8s-pod/controller-uid: "443a3128-64f3-4f48-a4d3-69199f82b090"
k8s-pod/job-name: "mnist-training-job"
}
logName: "projects/gke-tpu-demo-project/logs/stdout"
receiveTimestamp: "2024-06-26T05:52:39.652122589Z"
resource: {
labels: {
cluster_name: "tpu-test"
container_name: "tensorflow"
location: "us-central2-b"
namespace_name: "default"
pod_name: "mnist-training-job-l74l8"
project_id: "gke-tpu-demo-project"
}
type: "k8s_container"
}
severity: "INFO"
textPayload: "
1/938 [..............................] - ETA: 13:36 - loss: 2.3238 - accuracy: 0.0469
6/938 [..............................] - ETA: 9s - loss: 2.1227 - accuracy: 0.2995
13/938 [..............................] - ETA: 8s - loss: 1.7952 - accuracy: 0.4760
20/938 [..............................] - ETA: 7s - loss: 1.5536 - accuracy: 0.5539
27/938 [..............................] - ETA: 7s - loss: 1.3590 - accuracy: 0.6071
36/938 [>.............................] - ETA: 6s - loss: 1.1622 - accuracy: 0.6606
44/938 [>.............................] - ETA: 6s - loss: 1.0395 - accuracy: 0.6935
51/938 [>.............................] - ETA: 6s - loss: 0.9590 - accuracy: 0.7160
……
937/938 [============================>.] - ETA: 0s - loss: 0.2184 - accuracy: 0.9349"
timestamp: "2024-06-26T05:52:38.962950115Z"
}
Ogni voce del log dei nodi del segmento TPU ha l'etichetta compute.googleapis.com/resource_name
con il valore impostato come nome del nodo.
Se vuoi visualizzare i log di un determinato nodo e ne conosci il nome,
puoi filtrare i log in base a quel nodo nella query. Ad esempio, la seguente query mostra i log del nodo TPU gke-tpu-9243ec28-wwf5
:
resource.type="k8s_container"
labels."compute.googleapis.com/resource_name" = "gke-tpu-9243ec28-wwf5"
GKE collega l'etichetta cloud.google.com/gke-tpu-accelerator
e
cloud.google.com/gke-tpu-topology
a tutti i nodi contenenti TPU. Quindi, se
del nome del nodo o se desideri elencare tutti i nodi della sezione TPU, puoi eseguire
il seguente comando:
kubectl get nodes -l cloud.google.com/gke-tpu-accelerator
Esempio di output:
NAME STATUS ROLES AGE VERSION
gke-tpu-9243ec28-f2f1 Ready <none> 25m v1.30.1-gke.1156000
gke-tpu-9243ec28-wwf5 Ready <none> 7d22h v1.30.1-gke.1156000
Puoi applicare ulteriori filtri in base alle etichette dei nodi e ai relativi valori. Ad esempio, il comando seguente elenca il nodo TPU con un tipo specifico e topologia:
kubectl get nodes -l cloud.google.com/gke-tpu-accelerator=tpu-v5-lite-podslice,cloud.google.com/gke-tpu-topology=1x1
Per visualizzare tutti i log nei nodi delle sezioni TPU, puoi utilizzare la query che corrisponde l'etichetta al suffisso del nodo della sezione TPU. Ad esempio, utilizza la seguente query:
resource.type="k8s_container"
labels."compute.googleapis.com/resource_name" =~ "gke-tpu-9243ec28.*"
log_id("stdout")
Per visualizzare i log associati a un determinato carico di lavoro TPU utilizzando un
job Kubernetes,
puoi filtrare i log utilizzando l'etichetta batch.kubernetes.io/job-name
. Ad esempio, per il job mnist-training-job
, puoi eseguire la seguente query per i log STDOUT:
resource.type="k8s_container"
labels."k8s-pod/batch_kubernetes_io/job-name" = "mnist-training-job"
log_id("stdout")
Per visualizzare i log di un carico di lavoro TPU utilizzando un JobSet Kubernetes,
puoi filtrare i log utilizzando l'etichetta k8s-pod/jobset_sigs_k8s_io/jobset-name
.
Ad esempio:
resource.type="k8s_container"
labels."k8s-pod/jobset_sigs_k8s_io/jobset-name"="multislice-job"
Per visualizzare ulteriori dettagli, puoi filtrare in base alle altre etichette del carico di lavoro.
Ad esempio, per visualizzare i log per un carico di lavoro su più sezioni dal worker 0 e
sezione 1, puoi filtrare in base alle etichette: job-complete-index
e job-index
:
resource.type="k8s_container"
labels."k8s-pod/jobset_sigs_k8s_io/jobset-name"="multislice-job"
labels."k8s-pod/batch_kubernetes_io/job-completion-index"="0"
labels."k8s-pod/jobset_sigs_k8s_io/job-index"="1"
Puoi anche filtrare utilizzando il pattern del nome del pod:
resource.labels.pod_name:<jobSetName>-<replicateJobName>-<job-index>-<worker-index>
Ad esempio, nella seguente query il jobSetName
è multisettore-job e
replicateJobName
è una sezione. Sia job-index
che worker-index
sono 0:
resource.type="k8s_container"
labels."k8s-pod/jobset_sigs_k8s_io/jobset-name"="multislice-job"
resource.labels.pod_name:"multislice-job-slice-0-0"
Per altri carichi di lavoro TPU, ad esempio un singolo carico di lavoro del pod GKE, puoi filtrare i log in base ai nomi dei pod. Ad esempio:
resource.type="k8s_container"
resource.labels.pod_name="tpu-job-jax-demo"
Se vuoi verificare se il plug-in del dispositivo TPU funziona correttamente, puoi utilizzare usa la seguente query per controllare i log dei container:
resource.type="k8s_container"
labels.k8s-pod/k8s-app="tpu-device-plugin"
resource.labels.namespace_name="kube-system"
Esegui la seguente query per controllare gli eventi correlati:
jsonPayload.involvedObject.name=~"tpu-device-plugin.*"
log_id("events")
Per tutte le query puoi aggiungere altri filtri, ad esempio nome del cluster, località e ID progetto. Puoi anche combinare le condizioni per restringere i risultati. Ad esempio:
resource.type="k8s_container" AND
resource.labels.project_id="gke-tpu-demo-project" AND
resource.labels.location="us-west1" AND
resource.labels.cluster_name="tpu-demo" AND
resource.labels.namespace_name="default" AND
labels."compute.googleapis.com/resource_name" =~ "gke-tpu-9243ec28.*" AND
labels."k8s-pod/batch_kubernetes_io/job-name" = "mnist-training-job" AND
log_id("stdout")
L'operatore AND
è facoltativo tra i confronti e può essere omesso. Per ulteriori informazioni sul linguaggio delle query, puoi leggere la specifica del linguaggio delle query di Logging.
Per altri esempi di query, puoi anche leggere le query dei log relative a Kubernetes.
Se preferisci SQL con Analisi dei log, puoi trovare esempi di query in Query SQL con Analisi dei log. In alternativa, puoi anche eseguire le query utilizzando Google Cloud CLI in Esplora log. Ad esempio:
gcloud logging read 'resource.type="k8s_container" labels."compute.googleapis.com/resource_name" =~ "gke-tpu-9243ec28.*" log_id("stdout")' --limit 10 --format json