Risolvere i problemi relativi al job Dataflow TPU

Se riscontri problemi durante l'esecuzione del job Dataflow con le TPU, utilizza i seguenti passaggi per la risoluzione dei problemi.

Risolvere i problemi relativi all'immagine container

Può essere utile eseguire il debug del software del container e della TPU su una VM autonoma. Puoi eseguire il debug con una VM creata da un pool di nodi GKE oppure eseguire il debug su una VM worker Dataflow in esecuzione.

Eseguire il debug con una VM autonoma

Per eseguire il debug del container su una VM autonoma, puoi creare un pool di nodi GKE che utilizza la stessa VM TPU per la sperimentazione locale. Ad esempio, la creazione di un pool di nodi GKE con un dispositivo TPU V5 Lite in us-west1-c avrebbe il seguente aspetto:

  1. Creare un cluster GKE.

    gcloud container clusters create TPU_CLUSTER_NAME \
      --project PROJECT_ID \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --location us-west1-c
    
  2. Crea un pool di nodi GKE.

    gcloud container node-pools create TPU_NODE_POOL_NAME \
      --project PROJECT_ID \
      --location=us-west1-c \
      --cluster=TPU_CLUSTER_NAME \
      --node-locations=us-west1-c \
      --machine-type=ct5lp-hightpu-1t \
      --num-nodes=1 \
      [ --reservation RESERVATION_NAME \
      --reservation-affinity=specific ]
    
  3. Trova il nome della VM del nodo TPU nel pool di nodi nell'interfaccia utente GKE o con il seguente comando.

    gcloud compute instances list --filter='metadata.kube-labels:"cloud.google.com/gke-nodepool=TPU_NODEPOOL_NAME"'
    
  4. Connettiti a una VM creata dal pool di nodi GKE utilizzando SSH:

    gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_ID
    
  5. Dopo aver eseguito la connessione a una VM utilizzando SSH, configura Docker per il registro Artifact Registry che stai utilizzando.

    docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.dev
    
  6. Poi, avvia un container dall'immagine che utilizzi.

    docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAME
    
  7. All'interno del container, verifica che le TPU siano accessibili.

    Ad esempio, se hai un'immagine che utilizza PyTorch per utilizzare le TPU, apri un interprete Python:

    python3
    

    Quindi, esegui un calcolo su un dispositivo TPU:

    import torch
    import torch_xla.core.xla_model as xm
    dev = xm.xla_device()
    t1 = torch.randn(3,3,device=dev)
    t2 = torch.randn(3,3,device=dev)
    print(t1 + t2)
    

    Esempio di output:

    >>> tensor([[ 0.3355, -1.4628, -3.2610],
    >>>        [-1.4656,  0.3196, -2.8766],
    >>>        [ 0.8667, -1.5060,  0.7125]], device='xla:0')
    
  8. Se il calcolo non va a buon fine, l'immagine potrebbe non essere configurata correttamente.

    Ad esempio, potresti dover impostare le variabili di ambiente richieste nel Dockerfile dell'immagine. Per confermare, riprova il calcolo dopo aver impostato manualmente le variabili di ambiente nel seguente modo:

    export TPU_SKIP_MDS_QUERY=1 # Don't query metadata
    export TPU_HOST_BOUNDS=1,1,1 # There's only one host
    export TPU_CHIPS_PER_HOST_BOUNDS=1,1,1 # 1 chips per host
    export TPU_WORKER_HOSTNAMES=localhost
    export TPU_WORKER_ID=0 # Always 0 for single-host TPUs
    export TPU_ACCELERATOR_TYPE=v5litepod-1 # Since we use v5e 1x1 accelerator.
    

    Se mancano le dipendenze PyTorch o LibTPU, puoi riprovare il calcolo dopo averle installate utilizzando il seguente comando:

    # Install PyTorch with TPU support
    pip install torch torch_xla[tpu] torchvision -f https://storage.googleapis.com/libtpu-releases/index.html
    

Eseguire il debug utilizzando una VM Dataflow

In alternativa, puoi connetterti all'istanza VM worker Dataflow utilizzando SSH durante l'esecuzione di un job. Poiché le VM worker Dataflow vengono arrestate al termine della pipeline, potrebbe essere necessario aumentare artificialmente il runtime eseguendo un calcolo che attende per un periodo di tempo prolungato.

Poiché un dispositivo TPU non può essere condiviso tra più processi, potresti dover eseguire una pipeline che non esegue calcoli su una TPU.

  1. Trova una VM per il job TPU in esecuzione cercando l'ID job Dataflow nella barra di ricerca della console Google Cloud o utilizzando il seguente comando gcloud:

    gcloud compute instances list --project PROJECT_ID --filter "STATUS='RUNNING' AND description ~ 'Created for Dataflow job: JOB_ID'"
    
  2. Dopo aver eseguito la connessione a una VM con TPU utilizzando SSH, avvia un container dall'immagine che utilizzi. Per un esempio, consulta Eseguire il debug con una VM autonoma.

  3. All'interno del contenitore, riconfigura le impostazioni TPU e installa le librerie necessarie per testare la configurazione. Per un esempio, vedi Eseguire il debug con una VM autonoma.

I worker non si avviano

Prima di risolvere il problema, verifica che le seguenti opzioni della pipeline siano impostate correttamente:

  • l'opzione --dataflow_service_option=worker_accelerator
  • l'opzione --worker_zone
  • l'opzione --machine_type

Controlla se i log della console mostrano che i worker vengono avviati, ma il job non riesce con un messaggio simile al seguente:

  Workflow failed. Causes: The Dataflow job appears to be stuck because no worker
  activity has been seen in the last 25m.

La causa di questi problemi potrebbe essere correlata a problemi di capacità o di avvio dei worker.

  • Capacità: se utilizzi la capacità TPU on demand o una prenotazione esaurita, le nuove pipeline potrebbero non avviarsi finché non è disponibile capacità. Se utilizzi una prenotazione, controlla la capacità rimanente nella pagina Prenotazioni Compute della consoleGoogle Cloud o con il seguente comando:

    gcloud compute reservations describe RESERVATION_NAME --zone ZONE
    

    Controlla se il job ha avviato VM worker. Quando il job avvia un worker, i logger come worker, worker_startup, kubelet e altri generalmente forniscono l'output. Inoltre, nella pagina Metriche job nella console Google Cloud , il numero di worker attuali deve essere maggiore di zero.

  • Avvio del worker: controlla i log job-message e launcher. Se la pipeline avvia i worker, ma non riescono ad avviarsi, potrebbero esserci errori nel container personalizzato.

  • Spazio su disco: verifica che sia disponibile spazio su disco sufficiente per il tuo job. Per aumentare lo spazio su disco, utilizza l'opzione --disk_size_gb.

Il job non riesce a causa di un errore

Utilizza i seguenti suggerimenti per la risoluzione dei problemi quando il job non va a buon fine e viene visualizzato un errore.

Avvio del worker pool non riuscito

Se visualizzi il seguente errore, verifica che la pipeline specifichi --worker_zone e che la zona corrisponda a quella della prenotazione.

JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] INVALID_FIELD_VALUE:
Instance 'INSTANCE_NAME' creation failed: Invalid value for field
'resource.reservationAffinity': '{ "consumeReservationType":
"SPECIFIC_ALLOCATION", "key":
"compute.googleapis.com/RESERVATION_NAME...'. Specified reservations
[RESERVATION_NAME] do not exist.

I gruppi di istanze gestite non supportano le Cloud TPU

Se visualizzi il seguente errore, contatta il tuo team dell'account per verificare se il tuo progetto è stato registrato per l'utilizzo delle TPU o segnala un bug utilizzando Google Issue Tracker.

apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow
pipeline failed. State: FAILED, Error: Workflow failed. Causes: One or more
operations had an error [...]: [INVALID_FIELD_VALUE] 'Invalid value
for field 'resource.instanceTemplate': Managed Instance Groups do not support
Cloud TPUs. '.

Valore non valido per il campo

Se visualizzi il seguente errore, verifica che la chiamata della pipeline imposti l'opzione del servizio Dataflow worker_accelerator.

JOB_MESSAGE_ERROR: Workflow failed. Causes: One or more operations had an error:
'operation-[...]': [INVALID_FIELD_VALUE] 'Invalid value for field
'resource.instanceTemplate': 'projects/[...]-harness'. Regional
Managed Instance Groups do not support Cloud TPUs.'

Dispositivo o risorsa occupati

Se viene visualizzato il seguente errore, un worker Dataflow che elabora la pipeline probabilmente esegue più processi che accedono alla TPU contemporaneamente. Questa opzione non è supportata. Per ulteriori informazioni, vedi TPU e parallelismo dei worker.

RuntimeError: TPU initialization failed: open(/dev/vfio/0): Device or resource
busy: Device or resource busy; Couldn't open iommu group /dev/vfio/0

Se visualizzi l'errore precedente durante il debug della pipeline su una VM, puoi ispezionare e terminare il processo che blocca la TPU utilizzando i seguenti comandi:

apt update ; apt install lsof
lsof -w /dev/vfio/0
kill -9 PROCESS_ID    # to terminate the process.

Le istanze con acceleratori guest non supportano la migrazione live

Se visualizzi il seguente errore, è probabile che la pipeline sia stata avviata con un tipo di macchina impostato in modo esplicito che dispone di acceleratori, ma non è stata specificata correttamente la configurazione dell'acceleratore. Verifica che l'invocazione della pipeline imposti l'opzione del servizio Dataflow worker_accelerator e assicurati che il nome dell'opzione non contenga errori di battitura.

JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] UNSUPPORTED_OPERATION:
Instance INSTANCE_ID creation failed: Instances with guest
accelerators do not support live migration.

Il flusso di lavoro è stato rifiutato automaticamente dal servizio

I seguenti errori potrebbero essere visualizzati anche se alcune delle opzioni della pipeline richieste sono mancanti o errate:

The workflow was automatically rejected by the service. The requested
accelerator type tpu-v5-lite-podslice;topology:1x1 requires setting
the worker machine type to ct5lp-hightpu-1t. Learn more at:
https://cloud.google.com/dataflow/docs/guides/configure-worker-vm

Timeout durante l'attesa di un aggiornamento dal worker

Se avvii pipeline su VM TPU con molte vCPU e non riduci il numero predefinito di thread worker, il job potrebbe riscontrare errori come il seguente:

Workflow failed. Causes WORK_ITEM failed.
The job failed because a work item has failed 4 times.
Root cause: Timed out waiting for an update from the worker.

Per evitare questo errore, riduci il numero di thread. Ad esempio, potresti impostare: --number_of_worker_harness_threads=50.

Nessun utilizzo di TPU

Se la pipeline viene eseguita correttamente, ma i dispositivi TPU non vengono utilizzati o non sono accessibili, verifica che i framework che utilizzi, come JAX o PyTorch, possano accedere ai dispositivi collegati. Per risolvere i problemi relativi all'immagine container su una singola VM, consulta Eseguire il debug con una VM autonoma.