Questa pagina spiega le caratteristiche e i migliori tipi di workload per ogni strategia di condivisione della GPU disponibile in Google Kubernetes Engine (GKE), come le GPU multi-istanza, la condivisione a rotazione della GPU e NVIDIA MPS. La condivisione della GPU ti aiuta a ridurre al minimo la capacità sottoutilizzata nel cluster e a fornire ai workload la capacità sufficiente per completare le attività.
Questa pagina è rivolta agli amministratori e agli operatori della piattaforma e agli specialisti di dati e AI che vogliono eseguire carichi di lavoro basati su GPU che utilizzano la capacità delle GPU nel modo più efficiente possibile. Per scoprire di più sui ruoli comuni a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli e attività comuni degli utenti GKE.
Prima di leggere questa pagina, assicurati di avere familiarità con i seguenti concetti:
- I concetti di base di Kubernetes, come pod, nodi, deployment e spazi dei nomi.
- Concetti di GKE, come node pool, scalabilità automatica e provisioning automatico dei nodi.
Come funzionano le richieste di GPU in Kubernetes
Kubernetes consente ai carichi di lavoro di richiedere con precisione le quantità di risorse necessarie per funzionare. Sebbene tu possa richiedere unità CPU frazionarie per i carichi di lavoro, non puoi richiedere unità GPU frazionarie. I manifest dei pod devono richiedere risorse GPU in numeri interi, il che significa che un'intera GPU fisica viene allocata a un container anche se il container ha bisogno solo di una frazione delle risorse per funzionare correttamente. Questo approccio è inefficiente e può essere costoso, soprattutto quando esegui più carichi di lavoro con requisiti di GPU bassi simili.
Utilizza le strategie di condivisione della GPU per migliorare l'utilizzo della GPU quando i tuoi carichi di lavoro non richiedono tutte le risorse GPU.
Che cosa sono le strategie di condivisione GPU?
Le strategie di condivisione della GPU consentono a più container di utilizzare in modo efficiente le GPU collegate e di risparmiare sui costi di esecuzione. GKE fornisce le seguenti strategie di condivisione GPU:
- GPU multi-istanza: GKE divide una singola GPU supportata in un massimo di sette sezioni. Ogni slice può essere allocata a un container sul nodo in modo indipendente, per un massimo di sette container per GPU. La GPU multi-istanza fornisce l'isolamento hardware tra i workload, oltre a una qualità del servizio (QoS) coerente e prevedibile per tutti i container in esecuzione sulla GPU.
- Time-sharing della GPU: GKE utilizza la funzionalità di time-sharing integrata fornita dalla GPU NVIDIA e dallo stack software. A partire dall'architettura Pascal, le GPU NVIDIA supportano la preemption a livello di istruzione. Quando si esegue il cambio di contesto tra i processi in esecuzione su una GPU, la preemption a livello di istruzione garantisce che ogni processo riceva una fetta di tempo equa. La condivisione del tempo della GPU fornisce l'isolamento a livello software tra i carichi di lavoro in termini di isolamento dello spazio degli indirizzi, isolamento delle prestazioni e isolamento degli errori.
- NVIDIA MPS: GKE utilizza Multi-Process Service (MPS) di NVIDIA. NVIDIA MPS è un'implementazione alternativa e compatibile a livello binario dell'API CUDA progettata per consentire in modo trasparente l'esecuzione simultanea di carichi di lavoro CUDA multi-processo cooperativi su un singolo dispositivo GPU. La GPU con NVIDIA MPS fornisce isolamento a livello di software in termini di limiti delle risorse (percentuale di thread attivi e memoria del dispositivo bloccata).
Quale strategia di condivisione GPU utilizzare
La seguente tabella riassume e confronta le caratteristiche delle strategie di condivisione della GPU disponibili:
GPU multi-istanza | Condivisione del tempo della GPU | NVIDIA MPS | |
---|---|---|---|
Generale | Condivisione parallela della GPU tra i container | Passaggio rapido da un contesto all'altro | Condivisione parallela della GPU tra i container |
Isolamento | Una singola GPU è suddivisa in un massimo di sette sezioni e ogni container sulla stessa GPU fisica ha risorse di calcolo, memoria e larghezza di banda dedicate. Pertanto, un container in una partizione ha una velocità effettiva e una latenza prevedibili anche quando altri container saturano altre partizioni. |
Ogni container accede alla piena capacità della GPU fisica sottostante eseguendo il cambio di contesto tra i processi in esecuzione su una GPU. Tuttavia, il time-sharing non prevede l'applicazione di limiti di memoria tra i job condivisi e il cambio di contesto rapido per l'accesso condiviso può introdurre overhead. |
NVIDIA MPS ha un isolamento delle risorse limitato, ma offre maggiore flessibilità in altre dimensioni, ad esempio tipi di GPU e unità condivise massime, che semplificano l'allocazione delle risorse. |
Adatto a questi workload | Consigliato per i carichi di lavoro eseguiti in parallelo e che richiedono determinati livelli di resilienza e QoS. Ad esempio, quando esegui carichi di lavoro di inferenza AI, la GPU multi-istanza consente l'esecuzione simultanea di più query di inferenza per risposte rapide, senza rallentarsi a vicenda. |
Consigliata per carichi di lavoro interattivi e con picchi che hanno periodi di inattività. Questi workload non sono convenienti con una GPU completamente dedicata. Utilizzando la condivisione del tempo, i workload ottengono un accesso rapido alla GPU durante le fasi attive. La condivisione della GPU è ottimale per gli scenari in cui è necessario evitare l'inattività di GPU costose, dove l'isolamento completo e l'accesso continuo alla GPU potrebbero non essere necessari, ad esempio quando più utenti testano o prototipano carichi di lavoro. I carichi di lavoro che utilizzano il time-sharing devono tollerare determinati compromessi in termini di prestazioni e latenza. |
Consigliato per l'elaborazione batch per job di piccole dimensioni perché MPS massimizza la velocità effettiva e l'utilizzo simultaneo di una GPU. MPS consente ai job batch di essere elaborati in modo efficiente in parallelo per carichi di lavoro di dimensioni medio-piccole. NVIDIA MPS è ottimale per i processi cooperativi che agiscono come una singola applicazione. Ad esempio, job MPI con parallelismo del rango MPI interno. Con questi job, ogni piccolo processo CUDA (in genere ranghi MPI) può essere eseguito contemporaneamente sulla GPU per saturarla completamente. I carichi di lavoro che utilizzano CUDA MPS devono tollerare le limitazioni di protezione della memoria e contenimento degli errori. |
Monitoraggio | Le metriche di utilizzo della GPU non sono disponibili per le GPU multi-istanza. | Utilizza Cloud Monitoring per monitorare le prestazioni della condivisione del tempo della GPU. Per scoprire di più sulle metriche disponibili, consulta Monitorare i nodi di condivisione del tempo della GPU o NVIDIA MPS. | Utilizza Cloud Monitoring per monitorare le prestazioni di NVIDIA MPS. Per scoprire di più sulle metriche disponibili, consulta Monitorare i nodi di condivisione del tempo della GPU o NVIDIA MPS. |
Richiedere GPU condivise nei workload | Esegui GPU multi-istanza | Esegui GPU con time-sharing | Esegui GPU con NVIDIA MPS |
Per massimizzare l'utilizzo della GPU, combina le strategie di condivisione della GPU. Per ogni partizione GPU multi-istanza, utilizza la condivisione temporale o NVIDIA MPS. Puoi quindi eseguire più container su ogni partizione, con questi container che condividono l'accesso alle risorse sulla partizione. Ti consigliamo di utilizzare una delle seguenti combinazioni:
- GPU multi-istanza e condivisione della GPU in time-sharing.
- GPU multi-istanza e NVIDIA MPS.
Come funzionano le strategie di condivisione GPU
Puoi specificare il numero massimo di container autorizzati a condividere una GPU fisica:
- Nei cluster Autopilot, questa impostazione viene configurata nella specifica del workload.
- Nei cluster Standard, questa operazione viene configurata quando crei un nuovo pool di nodi con GPU collegate. Ogni GPU nel pool di nodi viene condivisa in base all'impostazione specificata a livello dipool di nodil.
Le sezioni seguenti spiegano il comportamento di pianificazione e il funzionamento di ciascuna strategia di condivisione della GPU.
GPU multi-istanza
Puoi richiedere GPU multi-istanza nei workload specificando l'etichetta
cloud.google.com/gke-gpu-partition-size
nel campo
nodeSelector
della specifica del pod, in spec: nodeSelector
.
GKE pianifica i workload sui nodi disponibili appropriati abbinando queste etichette. Se non sono presenti nodi disponibili appropriati, GKE utilizza lo scaling automatico e il provisioning automatico dei nodi per creare nuovi nodi o pool di nodi che corrispondono a questa etichetta.
Condivisione del tempo della GPU o NVIDIA MPS
Puoi richiedere la condivisione del tempo della GPU o NVIDIA MPS nei carichi di lavoro specificando le seguenti etichette nel campo nodeSelector
della specifica del pod, in spec:nodeSelector
.
cloud.google.com/gke-max-shared-clients-per-gpu
: seleziona i nodi che consentono a un numero specifico di client di condividere la GPU sottostante.cloud.google.com/gke-gpu-sharing-strategy
: seleziona i nodi che utilizzano la strategia di condivisione del tempo o NVIDIA MPS per le GPU.
La tabella seguente descrive come cambia il comportamento di pianificazione in base alla combinazione di etichette dei nodi specificate nei manifest.
Etichette dei nodi | |
---|---|
cloud.google.com/gke-max-shared-clients-per-gpu e cloud.google.com/gke-gpu-sharing-strategy
|
GKE pianifica i workload nei nodi disponibili che corrispondono a entrambe le etichette. Se non sono disponibili nodi, GKE utilizza la scalabilità automatica e il provisioning automatico dei nodi per creare nuovi nodi o pool di nodi che corrispondono a entrambe le etichette. |
Solo cloud.google.com/gke-max-shared-clients-per-gpu |
Autopilot: GKE rifiuta il carico di lavoro. Standard:GKE pianifica i workload nei nodi disponibili che corrispondono all'etichetta. Se non sono presenti nodi disponibili, GKE utilizza la scalabilità automatica e il provisioning automatico dei nodi per creare nuovi nodi o pool di nodi che corrispondono all'etichetta. Per impostazione predefinita, ai nodi di cui è stato eseguito il provisioning automatico vengono assegnati l'etichetta e il valore seguenti per ogni strategia:
|
Solo cloud.google.com/gke-gpu-sharing-strategy |
Autopilot: GKE rifiuta il carico di lavoro. Standard:GKE pianifica i workload nei nodi disponibili che utilizzano strategie di condivisione specifiche.
|
La procedura di richiesta della GPU che completi è la stessa per la strategia di condivisione del tempo della GPU e per NVIDIA MPS.
Se sviluppi applicazioni GPU che vengono eseguite con la condivisione del tempo della GPU o NVIDIA MPS, puoi richiedere una sola GPU per ogni container. GKE rifiuta una richiesta di più di una GPU in un container per evitare comportamenti imprevisti. Inoltre, il numero di GPU richieste con time-sharing e NVIDIA MPS non è una misura della potenza di calcolo disponibile per il container.
La tabella seguente mostra cosa aspettarsi quando richiedi quantità specifiche di GPU.
Richieste di GPU che si applicano alla condivisione del tempo della GPU e a NVIDIA MPS | |
---|---|
Una GPU time-sharing o NVIDIA MPS per container | GKE consente la richiesta, anche se il nodo ha una o più GPU fisiche. |
Più di una condivisione del tempo della GPU per container | GKE rifiuta la richiesta. Questo comportamento è lo stesso quando si richiedono più istanze di GPU multi-istanza in un container, perché ogni istanza GPU è considerata una GPU fisica discreta. |
Più di un NVIDIA MPS per container | In base al numero di GPU fisiche nel nodo, GKE esegue le seguenti operazioni:
|
Se GKE rifiuta il workload, viene visualizzato un messaggio di errore simile al seguente:
status:
message: 'Pod Allocate failed due to rpc error: code = Unknown desc = [invalid request
for sharing GPU (time-sharing), at most 1 nvidia.com/gpu can be requested on GPU nodes], which is unexpected'
phase: Failed
reason: UnexpectedAdmissionError
Monitora i nodi di condivisione del tempo della GPU o NVIDIA MPS
Utilizza Cloud Monitoring per monitorare le prestazioni dei nodi di condivisione del tempo della GPU o NVIDIA MPS. GKE invia le metriche per ogni nodo GPU a Cloud Monitoring. Queste metriche di condivisione del tempo della GPU o del nodo NVIDIA MPS si applicano a livello di nodo
(node/accelerator/
).
Puoi controllare le seguenti metriche per ogni nodo di condivisione del tempo della GPU o NVIDIA MPS in Cloud Monitoring:
- Ciclo di servizio (
node/accelerator/duty_cycle
): percentuale di tempo nell'ultimo periodo di campionamento (10 secondi) durante il quale il nodo GPU ha eseguito attivamente l'elaborazione. Valori compresi tra l'1% e il 100%. - Utilizzo della memoria (
node/accelerator/memory_used
): quantità di memoria dell'acceleratore allocata in byte per ogni nodo GPU. - Capacità di memoria (
node/accelerator/memory_total
): memoria totale dell'acceleratore in byte per ogni nodo GPU.
Queste metriche sono diverse dalle
metriche per le GPU regolari che non sono
nodi NVIDIA MPS o in time-sharing.
Le metriche per le
GPU fisiche regolari
vengono applicate a livello di
container (container/accelerator
) e
non vengono raccolte per i container pianificati su una GPU che utilizza la condivisione del tempo della GPU
o NVIDIA MPS.
Passaggi successivi
- Scopri come condividere le GPU con più carichi di lavoro utilizzando la condivisione del tempo della GPU.
- Scopri come condividere le GPU con più carichi di lavoro utilizzando NVIDIA MPS.
- Scopri come eseguire GPU multi-istanza.
- Scopri di più sulle GPU.
- Per ulteriori informazioni sulla preemption del calcolo per la GPU NVIDIA, consulta la Guida all'ottimizzazione di NVIDIA Pascal.