Risolvere i problemi relativi al job Dataflow GPU

Se riscontri problemi durante l'esecuzione del job Dataflow con le GPU, segui questi passaggi:

  1. Segui il flusso di lavoro descritto in Best practice per l'utilizzo delle GPU Dataflow per assicurarti che la pipeline sia configurata correttamente.
  2. Verifica che il job Dataflow utilizzi le GPU. Consulta Verifica il job Dataflow in "Esegui una pipeline con le GPU".
  3. Esegui il debug del job, con una VM autonoma o utilizzando Dataflow.
  4. Se il problema persiste, segui gli altri passaggi per la risoluzione dei problemi riportati in questa pagina.

Esegui il debug del job

Se possibile, esegui il debug del job con una VM autonoma, perché il debug con una VM autonoma è in genere più veloce. Tuttavia, se i criteri dell'organizzazione ti impediscono di eseguire il debug con una VM autonoma, puoi eseguire il debug utilizzando Dataflow.

Eseguire il debug con una VM autonoma

Durante la progettazione e l'iterazione di un'immagine container adatta alle tue esigenze, può essere più veloce ridurre il ciclo di feedback provando l'immagine container su una VM autonoma.

Puoi eseguire il debug del tuo container personalizzato su una VM autonoma con GPU creando una VM Compute Engine che esegue GPU su Container-Optimized OS, installando i driver e avviando il container come segue.

  1. Crea un'istanza VM.

    gcloud compute instances create INSTANCE_NAME \
      --project "PROJECT" \
      --image-family cos-stable \
      --image-project=cos-cloud  \
      --zone=us-central1-f \
      --accelerator type=nvidia-tesla-t4,count=1 \
      --maintenance-policy TERMINATE \
      --restart-on-failure  \
      --boot-disk-size=200G \
      --scopes=cloud-platform
    
  2. Utilizza ssh per connetterti alla VM.

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. Installa i driver della GPU. Dopo aver eseguito la connessione alla VM utilizzando ssh, esegui i seguenti comandi sulla VM:

    # Run these commands on the virtual machine
    cos-extensions install gpu
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    /var/lib/nvidia/bin/nvidia-smi
    
  4. Avvia il container personalizzato.

    I container SDK Apache Beam utilizzano il punto di ingresso /opt/apache/beam/boot. A scopo di debug, puoi avviare manualmente il container con un punto di ingresso diverso:

    docker-credential-gcr configure-docker
    docker run --rm \
      -it \
      --entrypoint=/bin/bash \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --volume /var/lib/nvidia/bin:/usr/local/nvidia/bin \
      --privileged \
      IMAGE
    

    Sostituisci IMAGE con il percorso Artifact Registry per l'immagine Docker.

  5. Verifica che le librerie GPU installate nel container possano accedere ai dispositivi GPU.

    Se utilizzi TensorFlow, puoi stampare i dispositivi disponibili nell'interprete Python con il seguente comando:

    >>> import tensorflow as tf
    >>> print(tf.config.list_physical_devices("GPU"))
    

    Se utilizzi PyTorch, puoi ispezionare i dispositivi disponibili nell'interprete Python con il seguente comando:

    >>> import torch
    >>> print(torch.cuda.is_available())
    >>> print(torch.cuda.device_count())
    >>> print(torch.cuda.get_device_name(0))
    

Per eseguire l'iterazione della pipeline, puoi avviarla su Direct Runner. Puoi anche avviare pipeline su Dataflow Runner da questo ambiente.

Eseguire il debug utilizzando Dataflow

Se i vincoli organizzativi ti impediscono di eseguire il debug su una VM autonoma, puoi eseguire il debug utilizzando Dataflow.

Semplifica la pipeline in modo che rilevi solo la presenza di GPU e poi esegui la pipeline su Dataflow. Il seguente esempio mostra l'aspetto del codice per questa pipeline:

def check_if_gpus_present(element):
  import torch
  import tensorflow as tf

  tensorflow_detects_gpus = tf.config.list_physical_devices("GPU")
  torch_detects_gpus = torch.cuda.is_available()
  if tensorflow_detects_gpus and torch_detects_gpus:
    return element

  if tensorflow_detects_gpus:
    raise Exception('PyTorch failed to detect GPUs with your setup')
  if torch_detects_gpus:
    raise Exception('Tensorflow failed to detect GPUs with your setup')
  raise Exception('Both Tensorflow and PyTorch failed to detect GPUs with your setup')

with beam.Pipeline() as p:
  _ = (p | beam.Create([1,2,3]) # Create a PCollection of the prompts.
         | beam.Map(check_if_gpus_present)
  )

Se la pipeline ha esito positivo, il codice è in grado di accedere alle GPU. Per identificare il codice problematico, inserisci gradualmente esempi sempre più grandi nel codice della pipeline, eseguendo la pipeline dopo ogni modifica.

Se la pipeline non rileva le GPU, segui i passaggi descritti nella sezione Nessun utilizzo della GPU di questo documento.

I worker non si avviano

Se il job è bloccato e i worker Dataflow non iniziano mai a elaborare i dati, è probabile che tu abbia un problema relativo all'utilizzo di un container personalizzato con Dataflow. Per maggiori dettagli, leggi la guida alla risoluzione dei problemi relativi ai container personalizzati.

Se utilizzi Python, verifica che siano soddisfatte le seguenti condizioni:

  • La versione secondaria dell'interprete Python nell'immagine container è la stessa che utilizzi quando avvii la pipeline. Se non c'è corrispondenza, potresti visualizzare errori come SystemError: unknown opcode con una analisi dello stack che coinvolge apache_beam/internal/pickler.py.
  • Se utilizzi l'SDK Apache Beam 2.29.0 o versioni precedenti, pip deve essere accessibile nell'immagine in /usr/local/bin/pip.

Ti consigliamo di ridurre al minimo le personalizzazioni la prima volta che utilizzi un'immagine personalizzata. Utilizza le immagini container personalizzate di esempio fornite negli esempi in questa pagina. Assicurati di poter eseguire una semplice pipeline Dataflow con questa immagine container senza richiedere GPU. Poi, itera la soluzione.

Verifica che i worker dispongano di spazio su disco sufficiente per scaricare l'immagine del container. Regola le dimensioni del disco, se necessario. Le immagini di grandi dimensioni richiedono più tempo per il download, il che aumenta il tempo di avvio del worker.

Il job non riesce a essere eseguito immediatamente all'avvio

Se riscontri gli errori ZONE_RESOURCE_POOL_EXHAUSTED o ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS, puoi procedere nel seguente modo:

  • Non specificare la zona worker in modo che Dataflow selezioni la zona ottimale per te.

  • Avvia la pipeline in una zona diversa o con un tipo di acceleratore diverso.

  • Configura un modello di provisioning, ad esempio l'avvio flessibile. Per saperne di più, leggi Configurare un modello di provisioning.

Il job non riesce in fase di runtime

Se il job non viene completato in fase di runtime, verifica la presenza di errori dovuti all'esaurimento della memoria (OOM) sulla macchina worker e sulla GPU. Gli errori OOM della GPU potrebbero manifestarsi come errori cudaErrorMemoryAllocation out of memory nei log dei worker. Se utilizzi TensorFlow, verifica di utilizzare un solo processo TensorFlow per accedere a un dispositivo GPU. Per saperne di più, leggi GPU e parallelismo dei worker.

Nessun utilizzo di GPU

Se il job non sembra utilizzare le GPU, segui i passaggi descritti nella sezione Esegui il debug del job di questo documento per verificare se le GPU sono disponibili con l'immagine Docker.

Se le GPU sono disponibili ma non vengono utilizzate, il problema riguarda probabilmente il codice della pipeline. Per eseguire il debug del codice della pipeline, inizia con una pipeline semplice che utilizza correttamente le GPU, quindi aggiungi gradualmente codice alla pipeline, testandola ogni volta che aggiungi qualcosa. Per saperne di più, consulta la sezione Debug su Dataflow di questo documento.

Se la pipeline non rileva le GPU, verifica quanto segue:

  • Le librerie NVIDIA installate nell'immagine container corrispondono ai requisiti del codice utente della pipeline e delle librerie che utilizza.
  • Le librerie NVIDIA installate nelle immagini container sono accessibili come librerie condivise.

Se i dispositivi non sono disponibili, è possibile che tu stia utilizzando una configurazione software incompatibile. Per verificare la configurazione dell'immagine, esegui una pipeline semplice che controlla solo che le GPU siano disponibili e accessibili ai worker.

Risolvere i problemi di TensorFlow

Se PyTorch rileva le GPU nella pipeline, ma TensorFlow no, prova i seguenti passaggi per la risoluzione dei problemi:

  • Verifica di avere una combinazione compatibile di TensorFlow, versione di cuDNN e versione del toolkit CUDA. Per ulteriori informazioni, consulta la sezione Configurazioni di build testate nella documentazione di TensorFlow.
  • Se possibile, esegui l'upgrade alle ultime versioni compatibili di TensorFlow e CUDA.
  • Esamina i problemi noti di TensorFlow e CUDA per verificare se un problema noto sta causando problemi nella tua pipeline. Ad esempio, il seguente problema noto potrebbe impedire a TensorFlow di rilevare le GPU: TF 2.17.0 RC0 Fails to work with GPUs.

Passaggi successivi