Risolvere i problemi relativi alle TPU in GKE


Questa pagina mostra come risolvere i problemi relativi alle TPU in Google Kubernetes Engine (GKE).

Se hai bisogno di ulteriore aiuto, contatta l'assistenza clienti Google Cloud.

Quota insufficiente per soddisfare la richiesta TPU

Un errore simile a Insufficient quota to satisfy the request indica che il progetto Google Cloud non ha una quota sufficiente per soddisfare la richiesta.

Per risolvere il problema, controlla il limite di quota e l'utilizzo attuale del tuo progetto. Se necessario, richiedi un aumento della quota TPU.

Controllare il limite di quota e l'utilizzo attuale

Per verificare il limite e l'utilizzo attuale della tua quota API Compute Engine per le TPU, segui questi passaggi:

  1. Vai alla pagina Quote nella console Google Cloud:

    Vai a Quote

  2. Nella casella Filtro, segui questi passaggi:

    1. Seleziona la proprietà Servizio, inserisci API Compute Engine e premi Invio.

    2. Seleziona la proprietà Tipo e scegli Quota.

    3. Seleziona la proprietà Dimensioni (ad esempio località) e inserisci region: seguito dal nome della regione in cui prevedi di creare TPU in GKE. Ad esempio, inserisci region:us-west4 se prevedi di creare nodi TPU nella zona us-west4-a. La quota TPU è a livello di regione, pertanto tutte le zone all'interno della stessa regione consumano la stessa quota TPU.

Se nessuna quota corrisponde al filtro inserito, al progetto non è stata concessa nessuna delle quote specificate per la regione desiderata e devi richiedere un aumento della quota TPU.

Errore durante l'abilitazione del provisioning automatico dei nodi in un pool di nodi TPU

Il seguente errore si verifica quando abiliti il provisioning automatico dei nodi in un 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 questo problema, esegui l'upgrade del cluster GKE alla versione 1.27.6 o successiva.

GKE non esegue automaticamente il provisioning dei nodi TPU

Le seguenti sezioni descrivono i casi in cui GKE non esegue automaticamente il provisioning dei nodi TPU e come risolverli.

Limita gli errori di configurazione

GKE non esegue automaticamente il provisioning dei nodi TPU se i limiti di provisioning automatico che hai definito per un cluster sono troppo bassi. In questi scenari potresti notare i seguenti errori:

  • Se esiste un pool di nodi TPU, ma GKE non può fare lo scale up dei nodi a causa della violazione dei limiti delle risorse, puoi visualizzare il seguente messaggio di errore durante l'esecuzione del comando kubectl get events:

    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 scenario, nella console Google Cloud puoi visualizzare messaggi di avviso simili al seguente:

    "Your cluster has one or more unschedulable Pods"
    
  • Quando GKE tenta di eseguire il provisioning automatico di un pool di nodi TPU che supera i limiti di risorse, i log di visibilità del gestore della scalabilità automatica dei cluster mostreranno 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 della CPU e memoria nel cluster.

Per completare questi passaggi:

  1. Calcola i requisiti di risorse per un determinato tipo di macchina TPU e conteggio. Tieni presente che devi aggiungere risorse per i pool di nodi non TPU, come i carichi di lavoro del sistema.
  2. Ottieni una descrizione delle TPU, della CPU e della memoria disponibili per una zona e un tipo di macchina specifici. Utilizza gcloud CLI:

    gcloud compute machine-types describe MACHINE_TYPE \
        --zone COMPUTE_ZONE
    

    Sostituisci quanto segue:

    • MACHINE_TYPE: il tipo di macchina in cui eseguire la ricerca.
    • COMPUTE_ZONE: il nome della zona di computing.

    L'output include una riga descrittiva simile alla seguente:

      description: 240 vCPUs, 407 GB RAM, 4 Google TPUs
      ```
    
  3. Calcola il numero totale di CPU e memoria moltiplicando questi valori per il numero richiesto di nodi. Ad esempio, il tipo di macchina ct4p-hightpu-4t utilizza 240 core CPU e 407 GB di RAM con 4 chip TPU. Supponendo che siano richiesti 20 chip TPU, che corrispondono a cinque nodi, devi definire i seguenti valori:

    • --max-accelerator=type=tpu-v4-podslice,count=20.
    • CPU = 1200 (240 volte 5 )
    • memory = 2035 (407 volte 5)

    Dovresti definire i limiti con un certo margine per supportare nodi non TPU, come i carichi di lavoro di sistema.

  4. 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 nel cluster.
    • MAXIMUM_MEMORY: il numero massimo di gigabyte di memoria nel cluster.

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 etichette cloud.google.com/gke-tpu-accelerator e cloud.google.com/gke-tpu-topology sono errate o mancanti nella specifica del pod. GKE non eseguirà il provisioning dei pool di nodi TPU e il provisioning automatico dei nodi non potrà 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:

  1. Verifica che non esistano 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 impedirà a GKE di creare pool di nodi aggiuntivi per i tuoi pod.
  2. Assicurati che le specifiche dei modelli di pod, su cui viene eseguito il carico di lavoro TPU, includano i seguenti valori:
    • cloud.google.com/gke-tpu-accelerator e cloud.google.com/gke-tpu-topology in nodeSelector.
    • google.com/tpu nella richiesta.

Per scoprire come eseguire il deployment dei carichi di lavoro TPU in GKE, consulta Eseguire un carico di lavoro che visualizza il numero di chip TPU disponibili in un pool di nodi TPU.

Pianificazione degli errori durante il deployment di pod che consumano TPU in GKE

Il seguente problema si verifica quando GKE non può pianificare pod che richiedono TPU sui nodi TPU. Ad esempio, questo potrebbe verificarsi se alcuni pod 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 i pod critici del sistema possano essere eseguiti nei nodi non TPU. Per scoprire di più, consulta Eseguire il deployment di un pod in un pool di nodi specifico.

Inizializzazione TPU non riuscita

Il seguente problema si verifica quando GKE non può 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 modalità privilegiata o di aumentare il valore di ulimit all'interno del container.

Pianificazione del deadlock

La pianificazione di due o più job potrebbe non riuscire in un deadlock. Ad esempio, nello scenario in cui si verifica quanto segue:

  • Hai due job (Job A e Job B) con regole di affinità pod. GKE pianifica le sezioni TPU per entrambi i job con una topologia TPU di v4-32.
  • Hai due sezioni TPU v4-32 nel cluster.
  • Il cluster ha un'ampia capacità di pianificare sia i job che, in teoria, ogni job può essere pianificato rapidamente su ogni sezione TPU.
  • Lo scheduler Kubernetes pianifica un pod del job A su una sezione, quindi pianifica un pod del job B sulla stessa sezione.

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, ciascuno su una singola sezione TPU. Di conseguenza, GKE non sarà in grado di pianificare completamente il job A o il job B. Di conseguenza, lo stato di entrambi i job rimarrà In attesa.

Per risolvere il problema, utilizza l'anti-affinità del 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 è dovuto al fatto che la regione us-central2 è una regione privata.

Per risolvere il problema, invia una richiesta di assistenza o contatta il team dedicato al tuo account per richiedere che us-central2 sia reso visibile 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 TPU in us-central2 (l'unica regione in cui è disponibile TPU v4), potresti dover aumentare le seguenti quote relative a GKE quando crei per la prima volta i pool di nodi TPU v4:

  • Quota SSD (GB) su disco permanente in us-central2: il disco di avvio di ciascun nodo Kubernetes richiede 100 GB per impostazione predefinita. Pertanto, questa quota deve essere impostata su un valore pari almeno a quello del prodotto del numero massimo di nodi GKE che prevedi di creare in us-central2 e 100 GB (maximum_nodes X 100 GB).
  • Quota di indirizzi IP in uso in us-central2: ogni nodo Kubernetes utilizza un indirizzo IP. Pertanto, questa quota deve essere impostata almeno pari al numero massimo di nodi GKE che prevedi di creare in 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>.

È necessaria una subnet nella tua rete VPC per fornire connettività ai nodi GKE. Tuttavia, in determinate regioni come us-central2, è possibile non creare una subnet predefinita anche quando utilizzi la rete VPC predefinita in modalità automatica (per la creazione di subnet).

Per risolvere questo problema, assicurati di aver creato una subnet personalizzata nella regione prima di creare il cluster GKE. Questa subnet non deve sovrapporsi ad altre create in altre regioni nella stessa rete VPC.

Passaggi successivi

Se hai bisogno di ulteriore aiuto, contatta l'assistenza clienti Google Cloud.