Informazioni sulle strategie di condivisione GPU in GKE


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 NVIDIA MPS.

Prima di leggere questa pagina, assicurati di conoscere bene i seguenti argomenti:

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. Si tratta di una soluzione inefficiente e può essere costosa, soprattutto quando l'esecuzione più carichi di lavoro con requisiti di GPU bassi simili.

Best practice:

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 delle GPU:

  • GPU multi-istanza: GKE suddivide una singola GPU supportata in fino a sette sezioni. Ogni slice può essere allocato a un contenitore sul nodo indipendentemente, per un massimo di sette contenitori per GPU. GPU multi-istanza fornisce l'isolamento hardware tra i carichi di lavoro, oltre a servizi qualità del servizio (QoS) prevedibile per tutti i container in esecuzione sulla GPU.
  • Condivisione del tempo delle GPU: GKE utilizza la funzionalità di condivisione del tempo integrata offerta la GPU NVIDIA e lo stack software. A partire dall'architettura Pascal, NVIDIA Le GPU supportano il prerilascio a livello di istruzione. Quando si cambia contesto tra i processi in esecuzione su una GPU, il prerilascio a livello di istruzione di processo ha tempi discreti. 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.
  • NVIDIA MPS: GKE utilizza Servizio multi-processo (MPS) 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 della GPU utilizzare

La tabella seguente riassume e confronta le caratteristiche dei modelli disponibili Strategie di condivisione delle GPU:

GPU a più istanze Condivisione del tempo della GPU NVIDIA MPS
Generale Condivisione GPU in parallelo tra i container Cambio di contesto rapido Condivisione parallela di GPU tra container
Isolamento Una singola GPU è divisa in un massimo di sette sezioni ogni container sulla stessa GPU fisica dispone di computing, memoria e e la larghezza di banda. Di conseguenza, un container in una partizione ha una la velocità effettiva e la latenza anche quando altri container saturano altri partizioni di Compute Engine.

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 del tempo non fornisce l'applicazione forzata dei 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 ne guadagna di più flessibilità in altre dimensioni, ad esempio tipi di GPU e numero massimo di unità condivise, che semplificano l'allocazione delle risorse.
Adatto 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 caricamenti di lavoro di inferenza AI, le GPU multi-istanza consentono di eseguire più query di inferenza contemporaneamente per 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 conveniente con una GPU completamente dedicata. Utilizzando la condivisione del tempo, i carichi di lavoro accedere rapidamente alla GPU quando è in fase attiva.

GPU la condivisione del tempo è ottimale per scenari che evitano l'inattività delle GPU costose in cui l'isolamento completo e la continuità L'accesso alla GPU potrebbe non essere necessario, ad esempio, quando più utenti eseguono test o carichi di lavoro prototipi.

I carichi di lavoro che utilizzano la condivisione del tempo devono tollerare determinati compromessi in termini di prestazioni e latenza.

Opzione consigliata per l'elaborazione batch per job di piccole dimensioni poiché MPS massimizza la velocità effettiva e l'uso 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, i job MPI con parallelismo dei ranghi tra MPI. Con questi lavori, ogni piccolo processo CUDA (tipicamente i ranking MPI) può essere eseguito contemporaneamente sulla GPU per saturare completamente l'intera GPU.

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 GPU multi-istanza. Utilizzare Cloud Monitoring per monitorare le prestazioni la condivisione del tempo della GPU. Per scoprire di più sulle metriche disponibili, consulta Monitorare i nodi con condivisione in tempo della GPU o NVIDIA MPS. Utilizzare Cloud Monitoring per monitorare le prestazioni la tua NVIDIA MPS. Per scoprire di più sulle metriche disponibili, consulta Monitorare la condivisione del tempo della GPU o i nodi NVIDIA MPS.
Richiedere GPU condivise nei carichi di lavoro Esegui GPU multi-istanza Eseguire le GPU con il time-sharing Eseguire le GPU con NVIDIA MPS
Best practice:

Per massimizzare l'utilizzo della GPU, combina la condivisione delle GPU strategie. Per ogni partizione GPU con più istanze, utilizza il time-sharing o NVIDIA MPS. Puoi quindi eseguire più container su ogni partizione, con dei container che condividono l'accesso alle risorse su quella partizione. È consigliabile puoi 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, questa configurazione 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 di pool di nodi.

Le sezioni seguenti spiegano il comportamento di pianificazione e il funzionamento di ciascuna GPU strategia di condivisione.

GPU multi-istanza

Puoi richiedere una GPU multi-istanza nei carichi di lavoro specificando il Etichetta cloud.google.com/gke-gpu-partition-size nella specifica del pod nodeSelector, sotto spec: nodeSelector.

GKE pianifica i carichi di lavoro in base ai nodi disponibili appropriati abbinando 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 dell'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 il seguire le etichette nel campo della specifica del pod nodeSelector, in spec:nodeSelector.

  • cloud.google.com/gke-max-shared-clients-per-gpu: seleziona i nodi che consentono con un numero specifico di client con cui 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 carichi di lavoro nei nodi disponibili corrispondenti entrambe le etichette.

Se non ci sono nodi disponibili, GKE utilizza la scalabilità automatica il provisioning automatico dei nodi per creare nuovi nodi o pool di nodi le etichette.

Solo cloud.google.com/gke-max-shared-clients-per-gpu

Autopilot: GKE rifiuta il carico di lavoro.

Standard:GKE pianifica i carichi di lavoro nei nodi disponibili corrispondenti l'etichetta. Se non sono disponibili nodi, GKE utilizza la scalabilità automatica il provisioning automatico per creare nuovi nodi o pool di nodi corrispondenti all'etichetta. Di ai nodi predefiniti di cui è stato eseguito il provisioning automatico vengono assegnati la seguente etichetta e valore per ogni strategia:

  • Condivisione del tempo delle GPU: cloud.google.com/gke-gpu-sharing-strategy=TIME_SHARING
  • NVIDIA MPS: cloud.google.com/gke-gpu-sharing-strategy=MPS
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.

  • Se sono presenti più pool di nodi condivisi con valori diversi per cloud.google.com/gke-max-shared-clients-per-gpu, il carico di lavoro può essere pianificato su qualsiasi nodo disponibile.
  • Se ci sono nessun nodo disponibile in nessun pool di nodi, il gestore della scalabilità automatica dei cluster fa lo scale up il pool di nodi con il valore più basso cloud.google.com/gke-max-shared-clients-per-gpu.
  • Se tutti i pool di nodi hanno raggiunto la capacità massima, il provisioning automatico dei nodi crea nuovo pool di nodi con il valore predefinito cloud.google.com/gke-max-shared-clients-per-gpu=2

Il processo di richiesta delle GPU che completi è lo stesso per la condivisione del tempo e 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 le richieste per più GPU in un del container per evitare comportamenti imprevisti. Inoltre, il numero di GPU richieste con condivisione del tempo, mentre NVIDIA MPS non misura la potenza di calcolo disponibili per il container.

La tabella seguente mostra cosa aspettarsi quando si richiedono quantità specifiche di GPU.

Richieste GPU che si applicano alla condivisione del tempo 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 del tempo della GPU per container

GKE rifiuta la richiesta.

Questo comportamento è lo stesso quando ne richiedi più di uno GPU multi-istanza in un container, 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:

  • GKE consente la richiesta quando ha una sola GPU fisica.
  • GKE rifiuta la richiesta quando il nodo ha più GPU fisiche. Questo comportamento è lo stesso quando ne richiedi più di uno GPU multi-istanza in un container, perché ogni istanza GPU è considerata una GPU fisica discreta.

Se GKE rifiuta il carico di lavoro, viene visualizzato un messaggio di errore simile a:

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 Condivisione del tempo della GPU o nodi NVIDIA MPS. GKE invia le metriche per ogni nodo GPU a Cloud Monitoring. Queste metriche relative alla condivisione del tempo della GPU o ai nodi NVIDIA MPS si applicano a livello di nodo (node/accelerator/).

Puoi controllare le seguenti metriche per ogni nodo NVIDIA MPS o con condivisione del tempo della GPU 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 memoria (node/accelerator/memory_used): quantità dell'acceleratore di memoria 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 GPU normali che non sono con condivisione temporale 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