Informazioni sulle strategie di condivisione delle GPU in GKE


Questa pagina illustra le caratteristiche e i migliori tipi di carichi di lavoro per le strategie di condivisione delle GPU disponibili in Google Kubernetes Engine (GKE), ad esempio GPU multi-istanza, condivisione del tempo delle GPU e NVIDIA MPS.

In questa pagina si presuppone che tu abbia familiarità con i concetti di Kubernetes, come pod, nodi, deployment e spazi dei nomi, e con concetti GKE come pool di nodi, scalabilità automatica e provisioning automatico dei nodi. Avere anche familiarità con i deployment di base di Kubernetes e GKE.

Come funzionano le richieste GPU in Kubernetes

Kubernetes consente ai carichi di lavoro di richiedere con precisione le quantità di risorse necessarie per il funzionamento. Sebbene sia possibile 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. Si tratta di una soluzione inefficiente e può essere costosa, soprattutto quando esegui più carichi di lavoro con requisiti di GPU simili bassi.

Pertanto, ti consigliamo di utilizzare strategie di condivisione delle GPU per migliorare l'utilizzo delle GPU quando i tuoi carichi di lavoro non utilizzano tutte le risorse GPU.

Quali sono le strategie di condivisione della GPU?

Le strategie di condivisione delle GPU consentono a più container di utilizzare in modo efficiente le GPU collegate, risparmiando sui costi di gestione. GKE offre le seguenti strategie di condivisione delle GPU:

  • GPU multiistanza: GKE divide una singola GPU supportata in un massimo di sette sezioni. Ogni sezione può essere allocata in modo indipendente a un container sul nodo, per un massimo di sette container per GPU. La GPU multi-istanza fornisce l'isolamento hardware tra i carichi di lavoro, oltre a una qualità del servizio (QoS) coerente e prevedibile per tutti i container in esecuzione sulla GPU.
  • Condivisione del tempo delle GPU: GKE utilizza la funzionalità di condivisione del tempo integrata fornita dalla GPU NVIDIA e dallo stack software. A partire dall'architettura Pascal, le GPU NVIDIA 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 garantisce che ogni processo abbia tempi discreti. La condivisione del tempo della GPU fornisce l'isolamento a livello di software tra i carichi di lavoro in termini di isolamento dello spazio di indirizzi e delle prestazioni e degli errori.
  • NVIDIA MPS: GKE utilizza il servizio multi-processo (MPS) di NVIDIA. NVIDIA MPS è un'implementazione alternativa e compatibile con i programmi binari dell'API CUDA, progettata per consentire in maniera trasparente l'esecuzione contemporanea di carichi di lavoro CUDA con processi multiprocesso 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 bloccato).

Quale strategia di condivisione della GPU utilizzare

La tabella seguente riassume e confronta le caratteristiche delle strategie di condivisione delle GPU disponibili:

GPU multi-istanza Condivisione del tempo della GPU NVIDIA MPS
Generale Condivisione parallela di GPU tra container Cambio di contesto rapido Condivisione parallela di GPU tra container
Isolamento Una singola GPU è divisa in fino a sette sezioni e ogni container sulla stessa GPU fisica dispone di computing, memoria e larghezza di banda dedicati. Di conseguenza, un container in una partizione ha una velocità effettiva e una latenza prevedibili anche quando altri container saturano altre partizioni.

Ogni container accede all'intera capacità della GPU fisica sottostante effettuando il cambio di contesto tra i processi in esecuzione su una GPU.

Tuttavia, la condivisione del tempo non consente l'applicazione di limiti di memoria tra i job condivisi e il cambio rapido di contesto per l'accesso condiviso potrebbe comportare overhead.

NVIDIA MPS ha un isolamento delle risorse limitato, ma ottiene maggiore 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 Opzione consigliata per carichi di lavoro eseguiti in parallelo e che richiedono determinate resilienza e QoS. Ad esempio, quando si eseguono carichi di lavoro di inferenza AI, le GPU multi-istanza GPU multi-istanza consentono l'esecuzione simultanea di più query di inferenza per risposte rapide, senza rallentamenti a vicenda.

Opzione consigliata per carichi di lavoro bursty e interattivi con periodi di inattività. Questi carichi di lavoro non sono convenienti con una GPU completamente dedicata. Utilizzando la condivisione del tempo, i carichi di lavoro ottengono accesso rapido alla GPU quando sono in fasi attive.

La condivisione del tempo della GPU è ottimale per gli scenari in modo da evitare costose GPU in cui potrebbero non essere necessari l'isolamento completo e l'accesso continuo alle GPU, ad esempio quando più utenti testano o prototipano carichi di lavoro.

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 ai job batch di elaborare in modo efficiente in parallelo per carichi di lavoro di piccole e medie dimensioni.

NVIDIA MPS è ottimale per i processi cooperativi che fungono da singola applicazione. Ad esempio, i job MPI con parallelismo dei ranghi tra MPI. Con questi job, ogni piccolo processo CUDA (in genere 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 relative alla protezione della memoria e al contenimento degli errori.

Monitoraggio Le metriche di utilizzo della GPU non sono disponibili per le GPU a più istanze. Utilizza Cloud Monitoring per monitorare le prestazioni della condivisione del tempo della GPU. Per scoprire di più sulle metriche disponibili, consulta Monitorare la condivisione del tempo della GPU o i nodi NVIDIA MPS. Utilizza Cloud Monitoring per monitorare le prestazioni di NVIDIA MPS. Per scoprire di più sulle metriche disponibili, consulta Monitorare la condivisione del tempo della GPU o i nodi NVIDIA MPS.
Richiedi GPU condivise nei carichi di lavoro Esegui GPU multi-istanza Esegui GPU con condivisione del tempo Esegui GPU con NVIDIA MPS

Se vuoi massimizzare l'utilizzo della GPU, puoi combinare le strategie di condivisione della GPU per utilizzare la condivisione del tempo o NVIDIA MPS per ogni partizione di GPU multi-istanza. Puoi quindi eseguire più container su ogni partizione e questi condividono l'accesso alle risorse su quella partizione. Ti consigliamo di utilizzare una delle seguenti combinazioni:

  • Condivisione del tempo per GPU e GPU a più istanze.
  • 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, questa opzione è configurata nella specifica del carico di lavoro.
  • Sui 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 del pool di nodi.

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

GPU multi-istanza

Puoi richiedere GPU multi-istanza nei carichi di lavoro specificando l'etichetta cloud.google.com/gke-gpu-partition-size nel campo nodeSelector delle specifiche del pod in 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 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 nodo
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 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 corrispondenti 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 carichi di lavoro 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:

  • 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 non sono disponibili nodi in nessun pool di nodi, il gestore della scalabilità automatica dei cluster fa lo scale up del pool di nodi con il valore più basso per 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 un 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 delle GPU e per la strategia NVIDIA MPS.

Se stai sviluppando applicazioni GPU eseguite con condivisione del tempo della GPU o NVIDIA MPS, puoi richiedere una sola GPU per ogni container. GKE rifiuta le richieste per più GPU in un container per evitare comportamenti imprevisti. Inoltre, il numero di GPU richieste con la condivisione del tempo e NVIDIA MPS non rappresenta una misura della potenza di calcolo disponibile per il container.

La tabella seguente mostra cosa aspettarti quando richiedi quantità specifiche di GPU.

Richieste GPU che si applicano alla condivisione del tempo delle GPU e a NVIDIA MPS
Una condivisione del tempo della GPU o NVIDIA MPS per container 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 si richiedono più istanze GPU a più istanze 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:

  • GKE consente la richiesta quando il nodo ha una sola GPU fisica.
  • GKE rifiuta la richiesta quando il nodo ha più GPU fisiche. Questo comportamento è lo stesso quando si richiedono più istanze GPU a più istanze 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 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 la condivisione del tempo della GPU o i nodi NVIDIA MPS

Utilizza Cloud Monitoring per monitorare le prestazioni dei nodi NVIDIA MPS o della condivisione del tempo delle GPU. 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 con 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 è stato elaborato attivamente. Varia da 1% a 100%.
  • Utilizzo 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 acceleratore totale in byte per ogni nodo GPU.

Queste metriche sono diverse dalle metriche per le GPU normali che non sono condivise nel tempo o nodi NVIDA MPS. Le metriche per le GPU fisiche normali si applicano a livello di container (container/accelerator) e non vengono raccolte per i container pianificati su una GPU che utilizza la condivisione del tempo delle GPU o NVIDIA MPS.

Passaggi successivi