Questa pagina illustra le caratteristiche e i tipi migliori di carichi di lavoro per ogni strategia di condivisione della GPU disponibile in Google Kubernetes Engine (GKE), ad esempio GPU multi-istanza, condivisione del tempo della GPU e MPS di NVIDIA.
Prima di leggere questa pagina, assicurati di conoscere:
- Concetti di Kubernetes come pod, nodi, deployment e spazi dei nomi.
- Concetti di GKE come pool di nodi, 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 di cui hanno bisogno per funzionare. Sebbene tu possa richiedere unità CPU frazionate per i carichi di lavoro, non puoi richiedere unità GPU frazionate. I manifest dei pod devono richiedere risorse GPU in 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 se esegui più carichi di lavoro con requisiti GPU ridotti 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 della 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 gestione. GKE fornisce le seguenti strategie di condivisione GPU:
- GPU multi-istanza: GKE suddivide una singola GPU supportata in fino a sette sezioni. Ogni slice può essere allocato a un container sul nodo in modo indipendente, per un massimo di sette container per GPU. La GPU a più istanze fornisce l'isolamento hardware tra i carichi di lavoro, nonché una qualità del servizio (QoS) coerente e prevedibile per tutti i container in esecuzione sulla GPU.
- Condivisione in tempo della GPU: GKE utilizza la funzionalità di condivisione in tempo 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 esegui il cambio di contesto tra i processi in esecuzione su una GPU, la preemption a livello di istruzione garantisce a ogni processo un intervallo di tempo equo. La condivisione in tempo della GPU fornisce isolamento a livello di software tra i carichi di lavoro in termini di isolamento dello spazio degli indirizzi, isolamento delle prestazioni e isolamento degli errori.
- MPS di NVIDIA: GKE utilizza il servizio MPS (Multi-Process Service) di NVIDIA. NVIDIA MPS è un'implementazione alternativa compatibile con i binari dell'API CUDA progettata per consentire in modo trasparente l'esecuzione in contemporanea su un singolo dispositivo GPU di carichi di lavoro CUDA con più processi cooperativi. La GPU con NVIDIA MPS fornisce isolamento a livello di software in termini di limiti di risorse (percentuale di thread attivi e memoria del dispositivo bloccata).
Quale strategia di condivisione GPU utilizzare
La seguente tabella riassume e mette a confronto le caratteristiche delle strategie di condivisione della GPU disponibili:
GPU a più istanze | Condivisione del tempo della GPU | NVIDIA MPS | |
---|---|---|---|
Generale | Condivisione GPU in parallelo tra i container | Commutazione rapida di contesto | Condivisione GPU in parallelo tra i container |
Isolamento | Una singola GPU è divisa in un massimo di sette slice e ogni contenitore sulla stessa GPU fisica dispone di risorse di calcolo, memoria e larghezza di banda dedicate. Pertanto, un contenitore in una partizione ha un throughput e una latenza prevedibili anche quando altri contenitori saturano altre partizioni. |
Ogni contenitore accede alla piena capacità della GPU fisica sottostante eseguendo il passaggio di contesto tra i processi in esecuzione su una GPU. Tuttavia, la condivisione in tempo non prevede l'applicazione di limiti di memoria tra i job condivisi e il rapido cambio di contesto per l'accesso condiviso può introdurre un overhead. |
NVIDIA MPS ha un isolamento delle risorse limitato, ma offre maggiore flessibilità in altre dimensioni, ad esempio i tipi di GPU e le unità condivise massime, che semplificano l'allocazione delle risorse. |
Adatti a questi carichi di lavoro | Consigliato per i carichi di lavoro eseguiti in parallelo e che richiedono una certa resilienza e QoS. Ad esempio, quando esegui carichi di lavoro di inferenza AI, la GPU multi-istanza consente di eseguire più query di inferenza contemporaneamente per ottenere risposte rapide, senza rallentarsi a vicenda. |
Consigliato per i carichi di lavoro interattivi e con picchi che presentano periodi di inattività. Questi carichi di lavoro non sono convenienti con una GPU completamente dedicata. Con il time-sharing, i carichi di lavoro accedono rapidamente alla GPU quando sono in fase attiva. La condivisione in tempo della GPU è ottimale per evitare di tenere inutilizzate GPU costose quando l'isolamento completo e l'accesso continuo alla GPU potrebbero non essere necessari, ad esempio quando più utenti testano o creano prototipi di carichi di lavoro. I carichi di lavoro che utilizzano la condivisione del tempo devono tollerare determinati compromessi in termini di prestazioni e latenza. |
Consigliato per l'elaborazione batch di piccoli job perché MPS massimizza la throughput e l'utilizzo simultaneo di una GPU. MPS consente di elaborare in modo efficiente in parallelo i job batch per carichi di lavoro di piccole e medie dimensioni. NVIDIA MPS è ottimale per i processi cooperativi che agiscono come singola applicazione. Ad esempio, job MPI con parallelismo di ranking inter-MPI. Con questi job, ogni piccolo processo CUDA (in genere rank MPI) può essere eseguito contemporaneamente sulla GPU per saturarla completamente. I workload che utilizzano CUDA MPS devono tollerare le limitazioni di protezione della memoria e contenimento degli errori. |
Monitoraggio | Le metriche di utilizzo delle GPU non sono disponibili per le GPU a più istanze. | Utilizza Cloud Monitoring per monitorare le prestazioni della condivisione in tempo della GPU. Per scoprire di più sulle metriche disponibili, consulta Monitorare i nodi con condivisione in tempo della GPU o NVIDIA MPS. | Utilizza Cloud Monitoring per monitorare le prestazioni del tuo MPS NVIDIA. Per scoprire di più sulle metriche disponibili, consulta Monitorare i nodi con condivisione in tempo della GPU o NVIDIA MPS. |
Richiedere GPU condivise nei carichi di lavoro | Eseguire GPU a più istanze | Eseguire le GPU con il time-sharing | Eseguire le GPU con NVIDIA MPS |
Per massimizzare l'utilizzo della GPU, combina le strategie di condivisione GPU. Per ogni partizione GPU con più istanze, utilizza il time-sharing o NVIDIA MPS. Puoi quindi eseguire più container su ogni partizione, con questi container che condividono l'accesso alle risorse su quella partizione. Ti consigliamo di utilizzare una delle seguenti combinazioni:
- GPU a più istanze e condivisione in tempo della GPU.
- GPU a più istanze e NVIDIA MPS.
Come funzionano le strategie di condivisione della GPU
Puoi specificare il numero massimo di container autorizzati a condividere una GPU fisica:
- Nei cluster Autopilot, questo valore è configurato nella specifica del carico di lavoro.
- Nei cluster standard, questo viene configurato 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 di pool di nodi.
Le sezioni seguenti spiegano il comportamento e il funzionamento della pianificazione di ogni strategia di condivisione della GPU.
GPU a più istanze
Puoi richiedere GPU a più istanze nei carichi di lavoro specificando l'etichetta cloud.google.com/gke-gpu-partition-size
nel campo spec del pod nodeSelector
in spec: nodeSelector
.
GKE pianifica i carichi di lavoro sui nodi disponibili appropriati in base alla corrispondenza di queste etichette. Se non sono disponibili nodi appropriati, GKE utilizza la scalabilità automatica e il provisioning automatico dei nodi per creare nuovi nodi o pool di nodi corrispondenti a questa etichetta.
Condivisione del tempo della GPU o NVIDIA MPS
Puoi richiedere il time-sharing 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 in 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 corrispondano 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 corrispondenti all'etichetta. Se non sono disponibili nodi, GKE utilizza la scalabilità automatica e il provisioning automatico dei nodi per creare nuovi nodi o pool di nodi corrispondenti all'etichetta. Per impostazione predefinita, ai nodi di cui è stato eseguito il provisioning automatico vengono assegnati la seguente etichetta e il seguente valore per ogni strategia:
|
Solo cloud.google.com/gke-gpu-sharing-strategy |
Autopilot: GKE rifiuta il carico di lavoro. Standard:GKE pianifica i carichi di lavoro nei nodi disponibili che utilizzano strategie di condivisione specifiche.
|
La procedura di richiesta della GPU che completi è la stessa per la condivisione in tempo della GPU e per la strategia NVIDIA MPS.
Se stai sviluppando applicazioni GPU che funzionano con il co-uso della GPU o con NVIDIA MPS, puoi richiedere una sola GPU per ogni contenitore. GKE rifiuta una richiesta di più GPU in un contenutore per evitare comportamenti imprevisti. Inoltre, il numero di GPU richieste con il co-sharing e NVIDIA MPS non è una misura della potenza di calcolo disponibile per il contenitore.
La tabella seguente mostra cosa aspettarsi quando si richiedono quantità specifiche di GPU.
Richieste di GPU che si applicano al time sharing delle GPU e a NVIDIA MPS | |
---|---|
Una GPU con condivisione in tempo o NVIDIA MPS per contenitore | GKE consente la richiesta anche se il nodo ha una GPU fisica o più GPU fisiche. |
Più di una condivisione in tempo della GPU per contenitore | GKE rifiuta la richiesta. Questo comportamento è lo stesso quando si richiede più di un'istanza di GPU a più istanze in un contenitore, perché ogni istanza GPU è considerata una GPU fisica discreta. |
Più di un servizio NVIDIA MPS per container | In base al numero di GPU fisiche nel nodo, GKE esegue quanto segue:
|
Se GKE rifiuta il carico di lavoro, 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 con condivisione del tempo della GPU o NVIDIA MPS
Utilizza Cloud Monitoring per monitorare le prestazioni dei tuoi nodi GPU con condivisione in tempo o NVIDIA MPS. GKE invia le metriche per ogni
nodo GPU a Cloud Monitoring. Queste metriche dei nodi con condivisione del tempo della GPU o NVIDIA MPS si applicano a livello di nodo
(node/accelerator/
).
Puoi controllare le seguenti metriche per ogni nodo GPU con condivisione del tempo 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. Va da 1% a 100%. - Utilizzo della memoria (
node/accelerator/memory_used
): quantità di memoria dell'acceleratore allocata in byte per ogni nodo GPU. - Capacità memoria (
node/accelerator/memory_total
): memoria dell'acceleratore totale in byte per ogni nodo GPU.
Queste metriche sono diverse dalle
metriche per le GPU standard che non sono
con condivisione in tempo o nodi NVIDA MPS.
Le metriche per le
GPU fisiche standard
si applicano a livello di
contenuto (container/accelerator
) e
non vengono raccolte per i container pianificati su una GPU che utilizza il multitasking GPU
o NVIDIA MPS.
Passaggi successivi
- Scopri come condividere le GPU con più carichi di lavoro utilizzando il time sharing delle GPU.
- Scopri come condividere le GPU con più carichi di lavoro utilizzando NVIDIA MPS.
- Scopri come eseguire GPU a più istanze.
- Scopri di più sulle GPU.
- Per ulteriori informazioni sulla preemption del calcolo per la GPU NVIDIA, consulta la Guida all'ottimizzazione di NVIDIA Pascal.