Best practice per lavorare con le GPU di Dataflow

Questa pagina descrive le best practice per la creazione di pipeline utilizzando le GPU.

Per informazioni ed esempi su come abilitare le GPU nei job Dataflow, consulta Esegui una pipeline con le GPU ed Elabora immagini satellitari Landsat con le GPU.

Prerequisiti per l'utilizzo delle GPU in Dataflow

  • Per utilizzare le GPU con il job Dataflow, devi utilizzare Portable Runner (in precedenza Runner v2).
  • Dataflow esegue il codice utente nelle VM worker all'interno di un container Docker. Queste VM worker eseguono Container-Optimized OS. Affinché i job Dataflow utilizzino le GPU, devi soddisfare i seguenti prerequisiti:
  • Poiché i container GPU sono in genere di grandi dimensioni, per evitare di esaurire lo spazio su disco, aumenta le dimensioni predefinite del disco di avvio a 50 gigabyte o più.

Considerazioni

Quando progetti gli ambienti di test e di produzione, tieni in considerazione i seguenti fattori.

Sviluppo locale

L'utilizzo di Apache Beam con le GPU NVIDIA ti consente di creare pipeline di elaborazione dati su larga scala che gestiscono la pre-elaborazione e l'inferenza. Quando utilizzi le GPU per lo sviluppo locale, tieni presente le seguenti informazioni:

  • Spesso, i flussi di lavoro di elaborazione dati utilizzano librerie aggiuntive che devi installare nell'ambiente di avvio e nell'ambiente di esecuzione sui worker Dataflow. Questa configurazione aggiunge passaggi al flusso di lavoro di sviluppo per configurare i requisiti della pipeline o per utilizzare container personalizzati in Dataflow. È utile avere un ambiente di sviluppo locale che imiti il più possibile l'ambiente di produzione.

  • Se il tuo flusso di lavoro soddisfa entrambi i seguenti criteri, non devi creare container personalizzati o modificare il flusso di lavoro di sviluppo per configurare i requisiti della pipeline:

    • Stai utilizzando una libreria che utilizza implicitamente le GPU NVIDIA.
    • Il codice non richiede modifiche per supportare la GPU.
  • Alcune librerie non passano in modo trasparente tra l'utilizzo della CPU e della GPU e, di conseguenza, richiedono build specifiche e percorsi di codice diversi. Per replicare il ciclo di vita di sviluppo codice-esecuzione-codice per questo scenario, sono necessari passaggi aggiuntivi.

  • Quando esegui esperimenti locali, replica il più possibile l'ambiente del worker Dataflow. A seconda della libreria, potresti aver bisogno di una macchina con una GPU e le librerie GPU richieste installate. Questo tipo di macchina potrebbe non essere disponibile nel tuo ambiente locale. Puoi emulare l'ambiente di esecuzione di Dataflow utilizzando un container in esecuzione su una macchina virtuale dotata di GPU Google Cloud .

Specifiche dei tipi di macchina

Per informazioni dettagliate sul supporto dei tipo di macchina per ogni modello di GPU, consulta Piattaforme GPU. Le GPU supportate con i tipi di macchina N1 supportano anche i tipi di macchina N1 personalizzati.

Il tipo e il numero di GPU definiscono i limiti superiori per le quantità disponibili di vCPU e memoria che i worker possono avere. Per trovare le limitazioni corrispondenti, consulta Disponibilità.

Se specifichi un numero maggiore di CPU o memoria, potresti dover specificare un numero maggiore di GPU.

Per maggiori dettagli, consulta GPU su Compute Engine.

Ottimizza l'utilizzo delle risorse

La maggior parte delle pipeline non è composta interamente da trasformazioni che richiedono una GPU. Una pipeline tipica ha una fase di acquisizione che utilizza una delle numerose origini fornite da Apache Beam. Questa fase è seguita da trasformazioni di manipolazione o modellazione dei dati, che poi vengono inserite in una trasformazione GPU.

La funzionalità di dimensionamento corretto utilizza i suggerimenti sulle risorse di Apache Beam per personalizzare le risorse worker per le pipeline batch. Quando il dimensionamento corretto è abilitato, Dataflow utilizza le GPU solo per le fasi della pipeline che ne hanno bisogno. Di conseguenza, questa funzionalità migliora la flessibilità e la capacità della pipeline, riducendo potenzialmente i costi.

Per saperne di più, consulta Dimensionamento corretto.

GPU e parallelismo dei worker

Per le pipeline Python che utilizzano l'architettura Portable Runner di Dataflow, Dataflow avvia un processo SDK Apache Beam per ogni core della VM. Ogni processo SDK viene eseguito nel proprio container Docker e, a sua volta, genera molti thread, ognuno dei quali elabora i dati in entrata.

Le GPU utilizzano un'architettura con più processi e le GPU nei worker Dataflow sono visibili a tutti i processi e thread.

Se esegui più processi SDK su una GPU condivisa, puoi migliorare l'efficienza e l'utilizzo della GPU abilitando NVIDIA Multi-Process Service (MPS). MPS migliora il parallelismo dei worker e la velocità effettiva complessiva per le pipeline GPU, in particolare per i workload con un basso utilizzo delle risorse GPU. Per saperne di più, consulta Migliora il rendimento su una GPU condivisa utilizzando NVIDIA MPS.

Per evitare la sovrascrizione della memoria GPU, potresti dover gestire l'accesso alla GPU. Se utilizzi TensorFlow, uno dei seguenti suggerimenti può aiutarti a evitare la sovrascrizione della memoria GPU:

  • Configura i worker Dataflow in modo che avviino un solo processo Python in container, indipendentemente dal numero di vCPU del worker. Per eseguire questa configurazione, quando avvii il job, utilizza le seguenti opzioni della pipeline:

    • --experiments=no_use_multiple_sdk_containers
    • --number_of_worker_harness_threads

    Per saperne di più su quanti thread utilizzare, consulta Riduci il numero di thread.

  • Abilita MPS.

Workload di inferenza

Quando utilizzi i modelli di machine learning (ML) per eseguire l'inferenza locale e remota, utilizza la trasformazione RunInference integrata di Apache Beam. L'API RunInference è una PTransform ottimizzata per le inferenze di machine learning. L'utilizzo della trasformazione RunInference può migliorare l'efficienza quando utilizzi i modelli ML nelle pipeline.

Flusso di lavoro

Il seguente flusso di lavoro in due fasi mostra come creare una pipeline utilizzando le GPU. Questo flusso gestisce separatamente i problemi relativi alle GPU e non alle GPU e accorcia il ciclo di feedback.

  1. Crea una pipeline

    Crea una pipeline che può essere eseguita su Dataflow. Sostituisci le trasformazioni che richiedono le GPU con le trasformazioni che non utilizzano le GPU, ma sono funzionalmente le stesse:

    1. Crea tutte le trasformazioni che riguardano l'utilizzo della GPU, come l'acquisizione e la manipolazione dei dati.

    2. Crea uno stub per la trasformazione GPU con una modifica pass-through o dello schema.

  2. Testa localmente

    Testa la parte GPU del codice della pipeline nell'ambiente che imita l'ambiente di esecuzione del worker Dataflow. I seguenti passaggi descrivono uno dei metodi per eseguire questo test:

    1. Crea un'immagine Docker con tutte le librerie necessarie.

    2. Inizia lo sviluppo del codice GPU.

    3. Inizia il ciclo codice-esecuzione-codice utilizzando una Google Cloud macchina virtuale con l' immagine Docker. Per escludere incompatibilità delle librerie, esegui il codice GPU in un processo Python locale separatamente da una pipeline Apache Beam. Quindi, esegui l'intera pipeline sul runner diretto o avvia la pipeline su Dataflow.

Utilizza una VM che esegue un sistema operativo ottimizzato per i container

Per un ambiente minimo, utilizza una macchina virtuale (VM) ottimizzata per i container. Per saperne di più, consulta Crea una VM con GPU collegate.

Il flusso generale è il seguente:

  1. Crea una VM.

  2. Connettiti alla VM ed esegui i seguenti comandi:

    sudo cos-extensions install gpu -- -version latest
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    
  3. Verifica che le GPU siano disponibili:

    ./nvidia-smi
    
  4. Avvia un container Docker con i driver GPU dalla VM montata come volumi. Ad esempio:

    sudo 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 gcr.io/bigdatapivot/image_process_example:latest
    

Per un Dockerfile di esempio, consulta Crea un'immagine container personalizzata. Aggiungi tutte le dipendenze necessarie per la pipeline al Dockerfile.

Per saperne di più sull'utilizzo di un'immagine Docker preconfigurata per l'utilizzo della GPU, consulta Utilizza un'immagine esistente configurata per l'utilizzo della GPU.

Strumenti per lavorare con sistemi ottimizzati per i container

  • Per configurare Docker CLI in modo che utilizzi docker-credential-gcr come helper delle credenziali per il set predefinito di Google Container Registry (GCR), utilizza:

    sudo docker-credential-gcr configure-docker
    

    Per saperne di più sulla configurazione delle credenziali Docker, consulta docker-credential-gcr.

  • Per copiare file, come il codice della pipeline, da o verso una VM, utilizza toolbox. Questa tecnica è utile quando si utilizza un'immagine ottimizzata personalizzata. Ad esempio:

    toolbox /google-cloud-sdk/bin/gsutil cp gs://bucket/gpu/image_process/* /media/root/home/<userid>/opencv/
    

    Per saperne di più, consulta Risoluzione dei problemi dei nodi utilizzando toolbox.

Passaggi successivi