Questa pagina descrive le best practice per la creazione di pipeline utilizzando le GPU.
Per informazioni ed esempi su come attivare le GPU nei job Dataflow, consulta Eseguire una pipeline con le GPU e Elaborare immagini satellitari Landsat con le GPU.
Prerequisiti per l'utilizzo delle GPU in Dataflow
- Per utilizzare le GPU con il tuo job Dataflow, devi utilizzare Runner v2.
- Dataflow esegue il codice utente nelle VM worker all'interno di un contenitore Docker.
Queste VM worker eseguono Container-Optimized OS.
Affinché i job Dataflow utilizzino le GPU, sono necessari i seguenti prerequisiti:
- I driver GPU sono installati sulle VM worker e sono accessibili al container Docker. Per ulteriori informazioni, consulta Installare i driver GPU.
- Le librerie GPU richieste dalla pipeline, ad esempio le librerie NVIDIA CUDA-X o il toolkit NVIDIA CUDA, vengono installate nell'immagine del contenitore personalizzato. Per ulteriori informazioni, consulta Configurare l'immagine del contenitore.
- Poiché i contenitori GPU sono in genere di grandi dimensioni, per evitare di esaurire lo spazio su disco, aumenta le dimensioni del disco di avvio predefinite a 50 gigabyte o più.
Considerazioni
Quando progetti gli ambienti di test e di produzione, prendi in considerazione i seguenti fattori.
Sviluppo locale
L'utilizzo di Apache Beam con le GPU NVIDIA ti consente di creare su larga scala pipeline di elaborazione dati 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 dei dati utilizzano librerie aggiuntive che devi installare nell'ambiente di lancio e nell'ambiente di esecuzione sui worker Dataflow. Questa configurazione aggiunge passaggi al flusso di lavoro di sviluppo per la configurazione dei requisiti della pipeline o per l'utilizzo di contenitori personalizzati in Dataflow. È utile avere un ambiente di sviluppo locale che simuli l'ambiente di produzione il più fedelmente possibile.
Se il tuo flusso di lavoro soddisfa entrambi i seguenti criteri, non devi creare contenuti 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 dall'utilizzo della CPU a quello della GPU e quindi richiedono build specifiche e percorsi di codice diversi. Per replicare il ciclo di vita di sviluppo di codice-esecuzione-codice per questo scenario, sono necessari passaggi aggiuntivi.
Quando esegui esperimenti locali, replica l'ambiente dell'operatore Dataflow il più fedelmente possibile. A seconda della libreria, potresti aver bisogno di un computer 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 DataflowRunner utilizzando un contenitore in esecuzione su una macchina virtuale Google Cloud con GPU.
Specifiche dei tipi di macchine
Per informazioni dettagliate sul supporto dei tipo di macchina per ogni modello di GPU, consulta 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 superiori alle quantità disponibili di vCPU e memoria che i worker possono avere. Per trovare le limitazioni corrispondenti, consulta Disponibilità.
La specifica di un numero maggiore di CPU o memoria potrebbe richiedere la specifica di un numero maggiore di GPU.
Per maggiori dettagli, leggi l'articolo sulle 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 importazione che utilizza una delle molte origini fornite da Apache Beam. Questa fase è seguita da trasformazioni di manipolazione o definizione dei dati, che vengono poi inserite in una trasformazione GPU.
La giusta scelta utilizza suggerimenti sulle risorse Apache Beam per personalizzare le risorse dei worker per le pipeline batch. Quando è attivata la funzionalità di adattamento corretto, Dataflow utilizza le GPU solo per le fasi della pipeline che ne hanno bisogno. Di conseguenza, questa funzionalità migliora la flessibilità e le funzionalità della pipeline, con una possibile riduzione dei costi.
Per ulteriori informazioni, vedi Misura giusta.
GPU e parallelismo dei worker
Per le pipeline Python che utilizzano l'architettura Dataflow Runner v2, Dataflow avvia un processo SDK Apache Beam per ogni core 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 di più processi e le GPU nei worker Dataflow sono visibili a tutti i processi e i thread.
Se esegui più processi SDK su una GPU condivisa, puoi migliorare l'efficienza e l'utilizzo della GPU attivando il servizio NVIDIA Multi-Process (MPS). MPS migliora il parallelismo dei worker e il throughput complessivo per le pipeline GPU, soprattutto per i carichi di lavoro con un utilizzo ridotto delle risorse GPU. Per ulteriori informazioni, consulta Migliorare le prestazioni su una GPU condivisa utilizzando NVIDIA MPS.
Per evitare una sottoscrizione eccessiva della memoria GPU, potresti dover gestire l'accesso alla GPU. Se utilizzi TensorFlow, uno dei seguenti suggerimenti può aiutarti a evitare la sottoscrizione eccessiva della memoria GPU:
Configura i worker Dataflow in modo da avviare un solo processo Python containerizzato, indipendentemente dal numero di vCPU del worker. Per eseguire questa configurazione, al momento del lancio del job utilizza le seguenti opzioni della 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 inferenze locali e remote,
utilizza la trasformazione
RunInference
di Apache Beam integrata.
L'API RunInference
è un PTransform
ottimizzato 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 si occupa separatamente dei problemi relativi alla GPU e a quelli non correlati alla GPU e abbrevia il ciclo di feedback.
Crea una pipeline
Crea una pipeline che può essere eseguita su Dataflow. Sostituisci le trasformazioni che richiedono GPU con quelle che non utilizzano GPU, ma sono funzionalmente uguali:
Crea tutte le trasformazioni relative all'utilizzo della GPU, come l'importazione e la manipolazione dei dati.
Crea uno stub per la trasformazione GPU con una modifica di passaggio o dello schema.
Eseguire il test localmente
Testa la parte del codice della pipeline per GPU nell'ambiente che simula l'ambiente di esecuzione del worker Dataflow. I passaggi riportati di seguito descrivono uno dei metodi per eseguire questo test:
Crea un'immagine Docker con tutte le librerie necessarie.
Inizia lo sviluppo del codice GPU.
Inizia il ciclo di codice-esecuzione-codice utilizzando una macchina virtuale Google Cloud 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 avviala su Dataflow.
Utilizzare una VM con sistema operativo ottimizzato per i container
Per un ambiente minimo, utilizza una macchina virtuale (VM) ottimizzata per i container. Per ulteriori informazioni, vedi Creare una VM con GPU collegate.
Il flusso generale è il seguente:
Crea una VM.
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
Verifica che le GPU siano disponibili:
./nvidia-smi
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 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 della GPU, consulta Utilizzare 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 assistente per le credenziali per l'insieme predefinito di Google Container Registry (GCR), utilizza: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 utilizzi 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 la sezione Debug dei problemi relativi ai nodi mediante 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.
- Consulta la sezione Elaborazione di immagini satellitari Landsat con le GPU.