Risolvere i problemi relativi al job Dataflow GPU

Se riscontri problemi con 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 la sezione Verificare il job Dataflow in "Eseguire una pipeline con 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.

Eseguire 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 impediscono di eseguire il debug con una VM autonoma, puoi eseguire il debug utilizzando Dataflow.

Eseguire il debug con una VM autonoma

Mentre progetti e esegui l'iterazione di un'immagine container che fa al caso tuo, puoi ridurre più rapidamente il ciclo di feedback provando l'immagine container su una VM autonoma.

Puoi eseguire il debug del contenitore personalizzato su una VM autonoma con GPU creando una VM Compute Engine che esegue GPU su un Container-Optimized OS, installando i driver e avviando il contenitore 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 dell'SDK Apache Beam utilizzano il punto di contatto /opt/apache/beam/boot. Per scopi di debugging, puoi avviare il container manualmente con un punto di contatto 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 di Artifact Registry per l'immagine Docker.

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

    Se utilizzi TensorFlow, puoi stampare i dispositivi disponibili nell'interprete Python con quanto segue:

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

    Se utilizzi PyTorch, puoi esaminare i dispositivi disponibili nell'interprete Python con quanto segue:

    >>> 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 se sono presenti GPU, quindi eseguila su Dataflow. L'esempio seguente mostra come potrebbe essere il codice di 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 va a buon fine, il codice può accedere alle GPU. Per identificare il codice del problema, inserisci gradualmente esempi progressivamente più grandi nel codice della pipeline, eseguendo la pipeline dopo ogni modifica.

Se la pipeline non riesce a rilevare 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 contenitore personalizzato con Dataflow. Per ulteriori dettagli, consulta la guida alla risoluzione dei problemi relativi ai container personalizzati.

Se sei un utente Python, verifica che siano soddisfatte le seguenti condizioni:

  • La versione minore dell'interprete Python nella tua immagine container è la stessa che utilizzi per avviare la pipeline. In caso di mancata 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 le personalizzazioni a una configurazione minima di lavoro la prima volta che utilizzi un'immagine personalizzata. Utilizza le immagini container personalizzate di esempio fornite negli esempi di questa pagina. Assicurati di poter eseguire una semplice pipeline Dataflow con questa immagine del contenitore senza richiedere GPU. Poi, esegui l'iterazione della soluzione.

Verifica che i worker dispongano di spazio su disco sufficiente per scaricare l'immagine del contenitore. Se necessario, regola le dimensioni del disco. Il download delle immagini di grandi dimensioni richiede più tempo, il che aumenta il tempo di avvio del worker.

Il job non riesce 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 del 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.

Il job non riesce in fase di esecuzione

Se il job non riesce in fase di esecuzione, controlla se sono presenti errori di esaurimento della memoria (OOM) sulla macchina worker e sulla GPU. Gli errori OOM della GPU possono 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 ulteriori informazioni, leggi l'articolo sulle GPU e sul parallelismo dei worker.

Nessun utilizzo della GPU

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

Se le GPU sono disponibili, ma non vengono utilizzate, è probabile che il problema riguardi il codice della pipeline. Per eseguire il debug del codice della pipeline, inizia con una pipeline semplice che utilizzi correttamente le GPU, quindi aggiungi gradualmente il codice alla pipeline, testando la pipeline con ogni nuova aggiunta. Per ulteriori informazioni, consulta la sezione Debug in Dataflow di questo documento.

Se la pipeline non riesce a rilevare le GPU, verifica quanto segue:

  • Le librerie NVIDIA installate nell'immagine del contenitore 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, potresti utilizzare una configurazione software non compatibile. Per verificare la configurazione dell'immagine, esegui una semplice pipeline che controlli 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 a svolgere i seguenti passaggi per la risoluzione dei problemi:

  • Verifica di avere una combinazione compatibile di TensorFlow, la versione di cuDNN e la versione di CUDA Toolkit. Per ulteriori informazioni, consulta Configurazioni di build testate nella documentazione di TensorFlow.
  • Se possibile, esegui l'upgrade alle versioni più recenti di TensorFlow e CUDA compatibili.
  • Esamina i problemi noti per 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 non funziona con le GPU.

Passaggi successivi