Questa pagina spiega le caratteristiche e i tipi migliori di workload per ogni strategia di condivisione della GPU disponibile in Google Kubernetes Engine (GKE), come le GPU multi-istanza, la condivisione del tempo 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 è destinata agli amministratori e agli operatori della piattaforma e agli specialisti di dati e AI che vogliono eseguire workload basati su GPU che utilizzano la capacità della GPU nel modo più efficiente possibile. Per scoprire di più sui ruoli comuni a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli utente e attività comuni di 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 workload di richiedere con precisione le quantità di risorse necessarie per funzionare. Sebbene tu possa richiedere unità CPU frazionarie per i workload, 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ù workload 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 workload 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 workload CUDA multi-processo cooperativi su un singolo dispositivo GPU. La GPU con NVIDIA MPS fornisce l'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 riepiloga 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 | Cambio di contesto rapido | 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 contenitore in una partizione ha una velocità effettiva e una latenza prevedibili anche quando altri contenitori 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 rapido cambio di contesto 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 i workload interattivi e con picchi di attività che hanno periodi di inattività. Questi carichi di lavoro non sono convenienti con una GPU completamente dedicata. Utilizzando la condivisione del tempo, i workload accedono rapidamente alla GPU quando si trovano in 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 workload che utilizzano il time-sharing devono tollerare determinati compromessi in termini di prestazioni e latenza. |
Consigliato per l'elaborazione batch per piccoli job perché MPS massimizza il throughput e l'utilizzo simultaneo di una GPU. MPS consente ai job batch di essere elaborati in modo efficiente in parallelo per workload di piccole e medie dimensioni. NVIDIA MPS è ottimale per i processi cooperativi che agiscono come una singola applicazione. Ad esempio, job MPI con parallelismo del rango MPI. Con questi job, ogni piccolo processo CUDA (in genere i ranghi MPI) può essere eseguito contemporaneamente sulla GPU per saturarla completamente. I workload che utilizzano CUDA MPS devono tollerare le limitazioni della protezione della memoria e del 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 saperne di più sulle metriche disponibili, consulta Monitora i nodi di condivisione del tempo della GPU o NVIDIA MPS. | Utilizza Cloud Monitoring per monitorare le prestazioni di NVIDIA MPS. Per saperne di più sulle metriche disponibili, consulta Monitora 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 del tempo 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 multi-istanza e condivisione a rotazione della GPU.
- 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 la 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 la scalabilità automatica e il provisioning automatico dei nodi per creare nuovi nodi o node pool che corrispondono a questa etichetta.
Time-sharing della GPU o NVIDIA MPS
Puoi richiedere la condivisione del tempo della GPU o NVIDIA MPS nei workload 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 seguente tabella descrive come cambia il comportamento di pianificazione in base alla combinazione di etichette dei nodi specificate nei manifest.
| Etichette del nodo | |
|---|---|
cloud.google.com/gke-max-shared-clients-per-gpuand 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 workload. Standard:GKE pianifica i workload nei nodi disponibili che corrispondono 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 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 workload. 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 stai sviluppando applicazioni GPU che vengono eseguite in time-sharing della GPU o NVIDIA MPS, puoi richiedere una sola GPU per ogni container. GKE rifiuta una richiesta per 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 a tempo della GPU per container | GKE rifiuta la richiesta. Questo comportamento è lo stesso quando si richiedono più istanze di una GPU multi-istanza in un container, perché ogni istanza di 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. Intervallo da 1% a 100%. - Memoria utilizzata (
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 da quelle
per le GPU normali che non sono
nodi time-sharing o NVIDIA MPS.
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 a 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 saperne di più sul preemptive computing per la GPU NVIDIA, consulta la Guida all'ottimizzazione di NVIDIA Pascal.