In questa pagina vengono descritte le best practice per la creazione di pipeline mediante GPU.
Per informazioni ed esempi su come abilitare le GPU nei job Dataflow, consulta Esecuzione di una pipeline con GPU ed Elaborazione delle immagini satellitari Landsat con GPU.
Prerequisiti per l'utilizzo delle GPU in Dataflow
- Per utilizzare le GPU con il job Dataflow, devi usare Runner v2.
- Dataflow esegue il codice utente in VM worker all'interno di un container Docker.
Queste VM worker eseguono Container-Optimized OS.
Affinché i job Dataflow utilizzino le GPU, sono necessari i seguenti prerequisiti:
- I driver GPU vengono installati sulle VM worker e sono accessibili al container Docker. Per maggiori informazioni, consulta Installare i driver GPU.
- Le librerie GPU richieste dalla pipeline, come le librerie NVIDIA CUDA-X o il toolkit NVIDIA CUDA, sono installate nell'immagine container personalizzata. Per maggiori informazioni, consulta Configurare l'immagine container.
- Poiché i container GPU sono in genere di grandi dimensioni, per evitare di esaurire lo spazio su disco, aumenta la dimensione predefinita del disco di avvio a 50 gigabyte o più.
Considerazioni
Quando progetti gli ambienti di test e di produzione, considera i fattori riportati di seguito.
Sviluppo locale
L'uso di Apache Beam con GPU NVIDIA consente di creare pipeline di elaborazione dati su larga scala che gestiscono pre-elaborazione e inferenza. Quando utilizzi GPU per lo sviluppo locale, considera le seguenti informazioni:
Spesso, i flussi di lavoro di elaborazione dati utilizzano librerie aggiuntive che devi installare nell'ambiente di lancio e nell'ambiente di esecuzione sui worker di 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 disporre di un ambiente di sviluppo locale che imita il più fedelmente possibile l'ambiente di produzione.
Se il flusso di lavoro soddisfa entrambi i criteri seguenti, non è necessario creare container personalizzati o modificare il flusso di lavoro di sviluppo per configurare i requisiti della pipeline:
- Stai utilizzando una libreria che utilizza in modo implicito le GPU NVIDIA.
- Il codice non richiede modifiche per supportare le GPU.
Alcune librerie non passano in modo trasparente tra l'utilizzo di CPU e GPU e richiedono build specifiche e percorsi di codice diversi. Per replicare il ciclo di vita di sviluppo code-run-code per questo scenario, sono necessari passaggi aggiuntivi.
Durante l'esecuzione di esperimenti locali, replica l'ambiente del worker Dataflow il più fedelmente possibile. A seconda della libreria, potrebbe essere necessaria una macchina con una GPU e le librerie GPU necessarie installate. Questo tipo di macchina potrebbe non essere disponibile nel tuo ambiente locale. Puoi emulare l'ambiente runner di Dataflow utilizzando un container in esecuzione su una macchina virtuale Google Cloud con GPU.
Specifiche dei tipi di macchina
Per maggiori dettagli sul supporto dei tipo di macchina per ogni modello GPU, vedi Piattaforme GPU. Le GPU supportate con i tipi di macchine N1 supportano anche i tipi di macchine N1 personalizzate.
Il tipo e il numero di GPU definiscono le limitazioni del limite superiore sulla quantità di vCPU e memoria disponibili che i worker possono avere. Per trovare le limitazioni corrispondenti, consulta la sezione 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 completamente da trasformazioni che richiedono una GPU. Una pipeline tipica ha una fase di importazione che utilizza una delle numerose origini fornite da Apache Beam. Questa fase è seguita dalla manipolazione dei dati o dalle trasformazioni di modellazione, che poi alimentano una trasformazione GPU.
L'adattamento corretto utilizza indizi delle risorse Apache Beam per personalizzare le risorse worker per le pipeline batch. Quando è abilitato il adattamento corretto, Dataflow utilizza le GPU solo per le fasi della pipeline che le richiedono. Di conseguenza, questa funzionalità migliora la flessibilità e le capacità della pipeline, riducendo al contempo i costi.
Per ulteriori informazioni, consulta la sezione Adattabilità ottimale.
GPU e parallelismo dei worker
Per le pipeline Python che utilizzano l'architettura Dataflow Runner v2, Dataflow lancia un processo SDK Apache Beam per core VM. Ogni processo dell'SDK viene eseguito nel proprio container Docker e genera molti thread, ognuno dei quali elabora i dati in entrata.
Le GPU utilizzano più architetture di processo e le GPU nei worker Dataflow sono visibili a tutti i processi e i thread.
Se esegui più processi dell'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 carichi di lavoro con un utilizzo ridotto di risorse GPU. Per maggiori informazioni, consulta Migliorare le prestazioni su una GPU condivisa utilizzando NVIDIA MPS.
Per evitare l'oversubscription della memoria GPU, potrebbe essere necessario gestire l'accesso alle GPU. Se utilizzi TensorFlow, uno dei seguenti suggerimenti può aiutarti a evitare l'abbonamento oltre l'abbonamento alla memoria GPU:
Configura i worker Dataflow in modo che avviino un solo processo Python containerizzato, a prescindere dal conteggio delle vCPU dei worker. Per effettuare questa configurazione, quando avvii il job, utilizza le seguenti opzioni pipeline:
--experiments=no_use_multiple_sdk_containers
--number_of_worker_harness_threads
Per ulteriori informazioni sul numero di thread da utilizzare, consulta Ridurre il numero di thread.
Carichi di lavoro di inferenza
Quando utilizzi modelli di machine learning (ML) per eseguire l'inferenza locale e remota,
utilizza la trasformazione integrata Apache Beam
RunInference
.
L'API RunInference
è un'PTransform
ottimizzata per le inferenze
del 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 si occupa separatamente dei problemi relativi alla GPU e non alle GPU e abbrevia il ciclo di feedback.
Crea una pipeline
Creare una pipeline che possa essere eseguita su Dataflow. Sostituisci le trasformazioni che richiedono GPU con quelle che non utilizzano GPU, ma hanno le stesse funzionalità:
Crea tutte le trasformazioni che circondano l'utilizzo della GPU, come importazione e manipolazione dei dati.
Creare uno stub per la trasformazione GPU con un passthrough o una modifica dello schema.
Esegui test in locale
Testa la porzione GPU del codice della pipeline nell'ambiente che imita l'ambiente di esecuzione worker di Dataflow. I passaggi seguenti descrivono uno dei metodi per eseguire questo test:
Crea un'immagine Docker con tutte le librerie necessarie.
Avvia lo sviluppo del codice GPU.
Avvia il ciclo codice-esecuzione-codice utilizzando una macchina virtuale Google Cloud con l'immagine Docker. Per escludere le incompatibilità delle librerie, esegui il codice GPU in un processo Python locale separatamente da una pipeline Apache Beam. Poi 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 ulteriori informazioni, consulta Creare una VM con GPU collegate.
Il flusso generale è:
Creare una VM.
Connettiti alla VM ed esegui questi 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
Verifica che le GPU siano disponibili:
./nvidia-smi
Avvia un container Docker con 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 Creare un'immagine container personalizzata. Aggiungi al Dockerfile tutte le dipendenze necessarie per la pipeline.
Per ulteriori informazioni sull'utilizzo di un'immagine Docker preconfigurata per l'utilizzo delle GPU, consulta Utilizzare un'immagine esistente configurata per l'utilizzo delle GPU.
Strumenti per lavorare con sistemi ottimizzati per i container
Per configurare l'interfaccia a riga di comando di Docker in modo che utilizzi
docker-credential-gcr
come assistente delle credenziali per l'insieme predefinito di registri di container di Google, usa:sudo docker-credential-gcr configure-docker
Per ulteriori informazioni sulla configurazione delle credenziali Docker, consulta docker-credential-gcr.
Per copiare file, ad esempio 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 ulteriori informazioni, consulta Debug dei problemi relativi ai nodi utilizzando gli strumenti.
Passaggi successivi
- Scopri di più sul supporto di Dataflow per le GPU.
- Scopri di più su come eseguire una pipeline utilizzando le GPU.
- Scopri l'elaborazione delle immagini satellitari Landsat con le GPU.