Informazioni sulle strategie di condivisione delle GPU in GKE


Questa pagina spiega e confronta le strategie di condivisione delle GPU disponibili in Google Kubernetes Engine (GKE). Questa pagina presuppone la conoscenza dei concetti di Kubernetes come pod, nodi, deployment e spazi dei nomi, nonché di concetti di GKE come pool di nodi, scalabilità automatica e provisioning automatico dei nodi.

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. Anche se puoi richiedere unità CPU frazionarie per i carichi di lavoro, non puoi richiedere unità GPU frazionarie. I manifest dei pod devono richiedere le 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 un'operazione inefficiente e costosa, soprattutto quando esegui più carichi di lavoro con requisiti di GPU simili e ridotti. 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.

Cosa sono le strategie di condivisione delle GPU?

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

  • GPU multi-istanza: GKE suddivide una singola GPU supportata in un massimo di sette sezioni. Ogni sezione 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 carichi di lavoro e la qualità del servizio (QoS) coerente e prevedibile per tutti i container in esecuzione sulla GPU.
  • Condivisione del tempo della GPU: GKE utilizza la capacità di condivisione del tempo integrata fornita dalla GPU NVIDIA e dallo stack software. A partire dall'architettura Pascal, le GPU NVIDIA supportano il prerilascio dei livelli di istruzione. Quando esegui il cambio di contesto tra i processi in esecuzione su una GPU, il prerilascio a livello di istruzione garantisce che ogni processo riceva una tempistica discreta. La condivisione del 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 il servizio multi-processo (MPS) di NVIDIA. NVIDIA MPS è un'implementazione alternativa e compatibile con il programma binario dell'API CUDA progettata per consentire in modo trasparente l'esecuzione simultanea di carichi di lavoro CUDA multi-processo collaborativi 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 della GPU utilizzare

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

GPU multi-istanza Condivisione del tempo della GPU NVIDIA MPS
Generico Condivisione parallela delle GPU tra container Rapido cambio di contesto. Condivisione parallela delle GPU tra container
Isolamento Una singola GPU è divisa in un massimo di sette sezioni e ogni container sulla stessa GPU fisica dispone di calcolo, 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 le altre partizioni.

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

Tuttavia, la condivisione del tempo non prevede l'applicazione di limiti di memoria tra i job condivisi e il cambio rapido di contesto per l'accesso condiviso può introdurre overhead.

NVIDIA MPS ha un isolamento delle risorse limitato, ma ottiene maggiore flessibilità in altre dimensioni, ad esempio i tipi di GPU e il numero massimo di unità condivise, che semplificano l'allocazione delle risorse.
Adatto a questi carichi di lavoro Opzione consigliata per i carichi di lavoro in esecuzione in parallelo che richiedono una certa resilienza e QoS. Ad esempio, durante l'esecuzione di carichi di lavoro di inferenza AI, la GPU multi-istanza con GPU multi-istanza consente l'esecuzione contemporanea di più query di inferenza per ottenere risposte rapide, senza rallentamenti a vicenda.

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

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

I carichi di lavoro che utilizzano la condivisione del tempo devono tollerare determinate compromissioni di prestazioni e latenza.

Opzione consigliata per l'elaborazione batch per piccoli job perché MPS massimizza la velocità effettiva e l'utilizzo simultaneo di una GPU. MPS consente ai job batch di elaborare in parallelo in modo efficiente per carichi di lavoro di piccole e medie dimensioni.

NVIDIA MPS è ottimale per i processi collaborativi che agiscono come una singola applicazione. Ad esempio, i job MPI con il parallelismo tra i ranking 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 delle 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 Monitorare la condivisione del tempo della GPU o i nodi NVIDIA MPS. Utilizza Cloud Monitoring per monitorare le prestazioni di NVIDIA MPS. Per saperne 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 Eseguire 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 delle GPU in modo da utilizzare la condivisione del tempo o NVIDIA MPS per ogni partizione GPU multi-istanza. Puoi quindi eseguire più container su ogni partizione, con i container che condividono l'accesso alle risorse su quella partizione. Ti consigliamo di utilizzare una delle seguenti combinazioni:

  • Condivisione del tempo di GPU e GPU multi-istanza.
  • GPU multi-istanza e NVIDIA MPS.

Come funzionano le strategie di condivisione della GPU

Puoi specificare il numero massimo di container che possono condividere una GPU fisica. Nei cluster Autopilot, è 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 è condivisa in base all'impostazione specificata a livello del pool di nodi.

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

GPU multi-istanza

Puoi richiedere una GPU multi-istanza nei carichi di lavoro specificando l'etichetta cloud.google.com/gke-gpu-partition-size nel campo delle specifiche del pod nodeSelector, in spec: nodeSelector.

GKE pianifica i carichi di lavoro in nodi disponibili corrispondenti a queste 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 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 seguente tabella descrive come cambia il comportamento di pianificazione in base alla combinazione di etichette dei nodi specificata 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 in 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 in 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 i seguenti valori e etichetta per ogni strategia:

  • Condivisione del tempo GPU: cloud.google.com/gke-gpu-sharing-strategy=TIME_SHARING
  • MPS di NVIDIA: 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 in 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 alcun 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à, il provisioning automatico dei nodi crea un nuovo pool di nodi con un valore predefinito di cloud.google.com/gke-max-shared-clients-per-gpu=2

Il processo di richiesta della GPU che completi è lo stesso per la condivisione del tempo della GPU e la strategia NVIDIA MPS. Se stai sviluppando applicazioni GPU che vengono eseguite con condivisione del tempo GPU o NVIDIA MPS, puoi richiedere una sola GPU per container. GKE rifiuta la richiesta di più di una GPU in un container per evitare comportamenti imprevisti e poiché il numero di condivisione del tempo della GPU e di NVIDIA MPS richieste 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 di GPU che si applicano alla condivisione del tempo 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 GPU per container

GKE rifiuta la richiesta.

Questo comportamento include la richiesta di più di un'istanza GPU multi-istanza in un container, poiché ogni istanza GPU è considerata una GPU fisica discreta.

Più di una NVIDIA MPS per container

In base al numero di GPU fisiche nel nodo, GKE effettua 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, ad esempio richiede più di un'istanza di GPU multi-istanza in un container. Questo rifiuto si verifica 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 della condivisione del tempo della GPU o dei nodi NVIDIA MPS. GKE invia metriche per ciascun nodo GPU a Cloud Monitoring. Queste metriche sono diverse da quelle delle metriche per GPU normali che non sono nodi con condivisione temporale o nodi NVIDA MPS.

Puoi controllare le seguenti metriche per ogni condivisione del tempo della GPU o nodo 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. L'intervallo è compreso tra 1% e 100%.
  • Utilizzo memoria (node/accelerator/memory_used): quantità di memoria dell'acceleratore allocata in byte per ciascun nodo GPU.
  • Capacità di memoria (node/accelerator/memory_total): memoria totale dell'acceleratore in byte per ogni nodo GPU.

Queste metriche di condivisione del tempo della GPU o dei nodi NVIDIA MPS si applicano a livello di nodo (node/accelerator/), mentre le metriche per le GPU fisiche normali si applicano a livello di container (container/accelerator). Le metriche per le metriche di GPU fisiche normali non vengono raccolte per i container pianificati su una GPU che utilizza la condivisione del tempo della GPU o NVIDIA MPS.

Passaggi successivi