Dataproc offre la possibilità di collegare unità di elaborazione grafica (GPU) ai nodi master e worker di Compute Engine in un cluster Dataproc. Puoi utilizzare queste GPU per accelerare carichi di lavoro specifici sulle tue istanze, come machine learning ed elaborazione di dati.
Per ulteriori informazioni su cosa puoi fare con le GPU e sui tipi di hardware GPU disponibili, leggi l'articolo sulle GPU su Compute Engine.
Prima di iniziare
- Le GPU richiedono driver e software speciali. Questi elementi non sono preinstallati nei cluster Dataproc.
- Consulta i prezzi delle GPU su Compute Engine per comprendere il costo di utilizzo delle GPU nelle tue istanze.
- Leggi le restrizioni per le istanze con GPU per scoprire come funzionano in modo diverso rispetto a quelle non GPU.
- Controlla la pagina delle quote del progetto per assicurarti di disporre di una quota GPU sufficiente (
NVIDIA_K80_GPUS
,NVIDIA_P100_GPUS
oNVIDIA_V100_GPUS
). Se le GPU non sono elencate nella pagina delle quote o se hai bisogno di una quota GPU aggiuntiva, richiedi un aumento della quota.
Tipi di GPU
I nodi Dataproc supportano i seguenti tipi di GPU. Devi specificare il tipo di GPU quando colleghi le GPU al cluster Dataproc.
nvidia-tesla-k80
: NVIDIA® Tesla® K80nvidia-tesla-p100
: NVIDIA® Tesla® P100nvidia-tesla-v100
: NVIDIA® Tesla® V100nvidia-tesla-p4
: NVIDIA® Tesla® P4nvidia-tesla-t4
: NVIDIA® Tesla® T4nvidia-tesla-p100-vws
- Workstation virtuali NVIDIA® Tesla® P100nvidia-tesla-p4-vws
- Workstation virtuali NVIDIA® Tesla® P4nvidia-tesla-t4-vws
- Workstation virtuali NVIDIA® Tesla® T4
Collegamento di GPU ai cluster
gcloud
Collega le GPU ai nodi worker master e principali e secondari in un cluster Dataproc durante la creazione del cluster utilizzando i flag ‑‑master-accelerator
, ‑‑worker-accelerator
e ‑‑secondary-worker-accelerator
. Questi flag utilizzano i
seguenti valori:
- il tipo di GPU da collegare a un nodo, e
- il numero di GPU da collegare al nodo.
Il tipo di GPU è obbligatoria e il numero di GPU è facoltativo (l'impostazione predefinita è 1 GPU).
Esempio:
gcloud dataproc clusters create cluster-name \ --region=region \ --master-accelerator type=nvidia-tesla-k80 \ --worker-accelerator type=nvidia-tesla-k80,count=4 \ --secondary-worker-accelerator type=nvidia-tesla-k80,count=4 \ ... other flags
Per utilizzare le GPU nel cluster, devi installare i driver GPU.
API REST
Associa le GPU ai nodi worker principale e secondario in un cluster Dataproc
completando i campi
InstanceGroupConfig.AcceleratorConfig
e acceleratorTypeUri
come parte della richiesta API
cluster.create.
console
Fai clic su PLATFORM CPU E GPU→GPU→AGGIUNGI GPU nelle sezioni dei nodi master e worker del riquadro Configura nodi nella pagina Crea un cluster di Google Cloud Console per specificare il numero di GPU e il tipo di GPU per i nodi.
Installazione dei driver per GPU
I driver GPU sono necessari per utilizzare qualsiasi GPU collegata ai nodi Dataproc. Puoi installare i driver della GPU seguendo le istruzioni per questa azione di inizializzazione elencate di seguito.
Verifica dell'installazione del driver GPU
Dopo aver completato l'installazione del driver GPU sui nodi Dataproc, puoi verificare che il driver funzioni correttamente. Accedi al nodo master del cluster Dataproc e esegui il comando seguente:
nvidia-smi
Se il driver funziona correttamente, l'output mostrerà la versione del driver e le statistiche della GPU (vedi Verifica dell'installazione del driver GPU).
Configurazione Spark
Quando invii job a Spark, puoi utilizzare la seguente configurazione di Spark per caricare le librerie necessarie.
spark.executorEnv.LD_PRELOAD=libnvblas.so
Esempio di job GPU
Puoi testare le GPU su Dataproc eseguendo uno dei seguenti job, che apportano vantaggi:
- Esegui uno degli esempi di ML ML.
- Esegui questo esempio con
spark-shell
per eseguire un calcolo della matrice:
import org.apache.spark.mllib.linalg._ import org.apache.spark.mllib.linalg.distributed._ import java.util.Random def makeRandomSquareBlockMatrix(rowsPerBlock: Int, nBlocks: Int): BlockMatrix = { val range = sc.parallelize(1 to nBlocks) val indices = range.cartesian(range) return new BlockMatrix( indices.map( ij => (ij, Matrices.rand(rowsPerBlock, rowsPerBlock, new Random()))), rowsPerBlock, rowsPerBlock, 0, 0) } val N = 1024 * 5 val n = 2 val mat1 = makeRandomSquareBlockMatrix(N, n) val mat2 = makeRandomSquareBlockMatrix(N, n) val mat3 = mat1.multiply(mat2) mat3.blocks.persist.count println("Processing complete!")