Questa pagina mostra come consentire a più carichi di lavoro di accedere con condivisione del tempo della GPU a un singolo acceleratore hardware GPU NVIDIA® nei nodi Google Kubernetes Engine (GKE). Per scoprire di più sul funzionamento del time sharing GPU, nonché sulle limitazioni e su esempi di casi in cui utilizzare il time sharing GPU, consulta Time sharing GPU su GKE.
Panoramica
La condivisione del tempo della GPU è una funzionalità di GKE che consente a più container di condividere una singola GPU fisica collegata a un nodo. L'utilizzo del time-sharing GPU in GKE consente di utilizzare in modo più efficiente le GPU collegate e di risparmiare sui costi di gestione.
Chi dovrebbe utilizzare questa guida
Le istruzioni riportate in questa guida si applicano se sei:
- Amministratore della piattaforma: crea e gestisce un cluster GKE, pianifica i requisiti di risorse e infrastruttura e monitora le prestazioni del cluster.
- Sviluppatore di applicazioni: progetta ed esegue il deployment dei carichi di lavoro sui cluster GKE. Per istruzioni su come richiedere il co-uso della GPU, consulta Eseguire il deployment di carichi di lavoro che utilizzano il co-uso della GPU.
Requisiti
- Versione GKE: puoi attivare la condivisione del tempo della GPU nei cluster GKE Standard che eseguono la versione GKE 1.23.7-gke.1400 e successive. Puoi utilizzare le GPU con condivisione del tempo nei cluster GKE Autopilot che eseguono GKE versione 1.29.3-gke.1093000 e successive.
- Tipo di GPU: puoi attivare il time sharing della GPU su tutti i modelli di GPU NVIDIA.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installa e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo
gcloud components update
.
- Assicurati di disporre di una quota sufficiente di modelli di GPU NVIDIA. Se hai bisogno di una quota maggiore, consulta la sezione Richiesta di un aumento della quota.
- Pianifica la capacità della GPU in base alle esigenze di risorse dei workload e alla capacità della GPU sottostante.
- Esamina le limitazioni del condivisione in tempo della GPU.
Abilita la condivisione del tempo della GPU sui cluster GKE e sui pool di nodi
In qualità di amministratore della piattaforma, devi attivare la condivisione in tempo delle GPU su un cluster GKE Standard prima che gli sviluppatori possano eseguire il deployment dei carichi di lavoro per utilizzare le GPU. Per attivare la condivisione in tempo della GPU, devi:
- Abilita il time sharing della GPU su un cluster GKE.
- Installa i driver di dispositivo GPU NVIDIA (se necessario).
- Verifica le risorse GPU disponibili sui tuoi nodi.
I cluster Autopilot che eseguono la versione 1.29.3-gke.1093000 e successive attivano le GPU con condivisione del tempo per impostazione predefinita. La condivisione del tempo nei cluster Autopilot è configurata nella specifica del carico di lavoro. Per saperne di più, consulta la sezione Eseguire il deployment di workload che utilizzano GPU condivise in base al tempo.
Abilita il time sharing della GPU su un cluster GKE Standard
Puoi attivare il time-sharing della GPU quando crei i cluster GKE Standard. La funzionalità è attivata nel pool di nodi predefinito del cluster. Devi comunque attivare la condivisione in tempo della GPU quando crei manualmente nuovi pool di nodi nel cluster.
gcloud container clusters create CLUSTER_NAME \
--region=COMPUTE_REGION \
--cluster-version=CLUSTER_VERSION \
--machine-type=MACHINE_TYPE \
--accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del nuovo cluster.COMPUTE_REGION
: la regione Compute Engine per il nuovo cluster. Per i cluster zonali, specifica--zone=COMPUTE_ZONE
.CLUSTER_VERSION
: la versione GKE per il piano di controllo e i nodi del cluster. Utilizza GKE 1.23.7-gke.1400 o versioni successive. In alternativa, specifica un canale di release con la versione GKE utilizzando il--release-channel=RELEASE_CHANNEL
flag.MACHINE_TYPE
: il tipo di macchina Compute Engine per i tuoi nodi. Ti consigliamo di selezionare un tipo di macchina ottimizzato per l'acceleratore.GPU_TYPE
: il tipo di GPU, che deve essere una piattaforma GPU NVIDIA comenvidia-tesla-v100
.GPU_QUANTITY
: il numero di GPU fisiche da collegare a ogni nodo nel pool di nodi predefinito.CLIENTS_PER_GPU
: il numero massimo di contenitori che possono condividere ogni GPU fisica.DRIVER_VERSION
: la versione del driver NVIDIA da installare. Può essere uno dei seguenti:default
: installa la versione predefinita del driver per la tua versione GKE.latest
: installa la versione più recente del driver disponibile per la tua versione GKE. Disponibile solo per i nodi che utilizzano Container-Optimized OS.disabled
: salta l'installazione automatica del driver. Devi installare manualmente un driver dopo aver creato il pool di nodi. Se omettigpu-driver-version
, questa è l'opzione predefinita.
Attivare la condivisione del tempo della GPU in un pool di nodi GKE
Puoi attivare il time sharing della GPU quando crei manualmente nuovi pool di nodi in un cluster GKE.
gcloud container node-pools create NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--machine-type=MACHINE_TYPE \
--region=COMPUTE_REGION \
--accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION
Sostituisci quanto segue:
NODEPOOL_NAME
: il nome del nuovo pool di nodi.CLUSTER_NAME
: il nome del cluster, che deve eseguire GKE 1.23.7-gke.1400 o versioni successive.COMPUTE_REGION
: la regione Compute Engine del cluster. Per i cluster di zona, specifica--zone=COMPUTE_ZONE
.MACHINE_TYPE
: il tipo di macchina Compute Engine per i tuoi nodi. Ti consigliamo di selezionare un tipo di macchina ottimizzato per l'acceleratore.GPU_TYPE
: il tipo di GPU, che deve essere una piattaforma GPU NVIDIA comenvidia-tesla-v100
.GPU_QUANTITY
: il numero di GPU fisiche da collegare a ogni nodo del pool di nodi.CLIENTS_PER_GPU
: il numero massimo di contenitori che possono condividere ogni GPU fisica.DRIVER_VERSION
: la versione del driver NVIDIA da installare. Può corrispondere a uno dei seguenti:default
: installa la versione predefinita del driver per la tua versione GKE.latest
: installa la versione più recente del driver disponibile per la tua versione GKE. Disponibile solo per i nodi che utilizzano Container-Optimized OS.disabled
: salta l'installazione automatica del driver. Devi installare manualmente un driver dopo aver creato il pool di nodi. Se omettigpu-driver-version
, questa è l'opzione predefinita.
Installa i driver di dispositivo GPU NVIDIA
Prima di procedere, connettiti al cluster eseguendo il seguente comando:
gcloud container clusters get-credentials CLUSTER_NAME
Se hai scelto di disattivare l'installazione automatica dei driver durante la creazione del cluster o se utilizzi una versione di GKE precedente alla 1.27.2-gke.1200, devi installare manualmente un driver NVIDIA compatibile per gestire la suddivisione in base al tempo di utilizzo delle GPU fisiche. Per installare i driver, implementa un DaemonSet di installazione GKE che li configura.
Per le istruzioni, consulta Installazione dei driver di dispositivo GPU NVIDIA.
Se prevedi di utilizzare il provisioning automatico dei nodi nel tuo cluster, devi anche configurare il provisioning automatico dei nodi con gli ambiti che consentono a GKE di installare i driver di dispositivo GPU per te. Per le istruzioni, consulta Utilizzare il provisioning automatico dei nodi con le GPU.
Verifica le risorse GPU disponibili sui tuoi nodi
Per verificare che il numero di GPU visibili nei nodi corrisponda a quello specificato quando hai attivato la condivisione in tempo della GPU, descrivi i nodi:
kubectl describe nodes NODE_NAME
L'output è simile al seguente:
...
Capacity:
...
nvidia.com/gpu: 3
Allocatable:
...
nvidia.com/gpu: 3
In questo esempio di output, il numero di risorse GPU sul nodo è 3
perché il valore specificato per max-shared-clients-per-gpu
era 3
e il count
di GPU fisiche da collegare al nodo era 1
. Come altro esempio, se il count
di GPU fisiche fosse 2
, l'output mostrerebbe 6
risorse GPU allocabili, tre per ogni GPU fisica.
Esegui il deployment di carichi di lavoro che utilizzano la condivisione in tempo della GPU
In qualità di operatore di applicazioni che esegue il deployment di carichi di lavoro GPU, puoi selezionare la condivisione in tempo della GPU abilitata specificando le etichette dei nodi appropriate in un nodeSelector
nei manifest. Quando pianifichi le richieste, esamina i limiti di richiesta per assicurarti che GKE non rifiuti i tuoi implementazioni.
Per eseguire il deployment di un carico di lavoro che utilizzi la condivisione in tempo della GPU:
Aggiungi un
nodeSelector
al manifest del tuo carico di lavoro per le seguenti etichette:cloud.google.com/gke-gpu-sharing-strategy: time-sharing
: seleziona i nodi che utilizzano il time-sharing della GPU.cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
: seleziona i nodi che consentono a un numero specifico di container di condividere la GPU di base.
Aggiungi la richiesta di risorse GPU
nvidia.com/gpu=1
alla specifica del contenitore inspec.containers.resources.limits
.
Ad esempio, i passaggi riportati di seguito mostrano come eseguire il deployment di tre pod in un pool di nodi con condivisione in tempo della GPU. GKE alloca ogni contenitore alla stessa GPU fisica. I container stampano l'UUID della GPU collegata al container.
- Salva il seguente manifest come
gpu-timeshare.yaml
:
Autopilot
apiVersion: apps/v1 kind: Deployment metadata: name: cuda-simple spec: replicas: 3 selector: matchLabels: app: cuda-simple template: metadata: labels: app: cuda-simple spec: nodeSelector: cloud.google.com/gke-accelerator: "GPU_TYPE" cloud.google.com/gke-gpu-sharing-strategy: "time-sharing" cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU" cloud.google.com/gke-accelerator-count: "GPU_COUNT" containers: - name: cuda-simple image: nvidia/cuda:11.0.3-base-ubi7 command: - bash - -c - | /usr/local/nvidia/bin/nvidia-smi -L; sleep 300 resources: limits: nvidia.com/gpu: 1
Sostituisci quanto segue:
GPU_TYPE
: il tipo di GPU.CLIENTS_PER_GPU
: il numero di carichi di lavoro che utilizzeranno questa GPU. Per questo esempio, utilizza3
.GPU_COUNT
: il numero di GPU fisiche da collegare al nodo. Per questo esempio, utilizza1
.
Standard
apiVersion: apps/v1 kind: Deployment metadata: name: cuda-simple spec: replicas: 3 selector: matchLabels: app: cuda-simple template: metadata: labels: app: cuda-simple spec: nodeSelector: cloud.google.com/gke-gpu-sharing-strategy: "SHARING_STRATEGY" cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU" containers: - name: cuda-simple image: nvidia/cuda:11.0.3-base-ubi7 command: - bash - -c - | /usr/local/nvidia/bin/nvidia-smi -L; sleep 300 resources: limits: nvidia.com/gpu: 1
Sostituisci quanto segue:
SHARING_STRATEGY
con "time-sharing" per richiedere il time-sharing per la tua GPU.CLIENTS_PER_GPU
: il numero di carichi di lavoro che utilizzeranno questa GPU. Per questo esempio, utilizza3
.
Applica il manifest:
kubectl apply -f gpu-timeshare.yaml
Verifica che tutti i pod siano in esecuzione:
kubectl get pods -l=app=cuda-simple
Controlla i log di qualsiasi pod per visualizzare l'UUID della GPU:
kubectl logs POD_NAME
L'output è simile al seguente:
GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
Se ai tuoi nodi è collegata una GPU fisica, controlla i log di qualsiasi altro pod sullo stesso nodo per verificare che l'UUID della GPU sia lo stesso:
kubectl logs POD2_NAME
L'output è simile al seguente:
GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
Utilizzare il time-sharing della GPU con GPU a più istanze
In qualità di amministratore della piattaforma, potresti voler combinare più funzionalità GPU GKE. La condivisione del tempo della GPU funziona con le GPU a più istanze, che suddividono una singola GPU fisica in fino a sette slice. Queste partizioni sono isolate tra loro. Puoi configurare la condivisione del tempo della GPU per ogni partizione GPU con più istanze.
Ad esempio, se imposti gpu-partition-size
su 1g.5gb
, la GPU di base sarà suddivisa in sette partizioni. Se imposti anche max-shared-clients-per-gpu
su 3
,
ogni partizione supporterà fino a tre container, per un totale di massimo 21 dispositivi GPU a tempo condiviso disponibili per l'allocazione in quella GPU fisica. Per scoprire come gpu-partition-size
si converte in partizioni effettive, consulta la sezione Partizioni GPU multi-istanza.
Per creare un cluster GPU a più istanze con il time sharing della GPU abilitato, esegui il seguente comando:
Autopilot
Con Autopilot, le GPU a più istanze e con condivisione del tempo possono essere utilizzate insieme utilizzando entrambi i set di selettori di nodi.
apiVersion: apps/v1
kind: Deployment
metadata:
name: cuda-simple
spec:
replicas: 7
selector:
matchLabels:
app: cuda-simple
template:
metadata:
labels:
app: cuda-simple
spec:
nodeSelector:
cloud.google.com/gke-gpu-partition-size: 1g.5gb
cloud.google.com/gke-gpu-sharing-strategy: time-sharing
cloud.google.com/gke-max-shared-clients-per-gpu: "3"
cloud.google.com/gke-accelerator: nvidia-tesla-a100
cloud.google.com/gke-accelerator-count: "1"
containers:
- name: cuda-simple
image: nvidia/cuda:11.0.3-base-ubi7
command:
- bash
- -c
- |
/usr/local/nvidia/bin/nvidia-smi -L; sleep 300
resources:
limits:
nvidia.com/gpu: 1
Standard
Con Standard, devi creare un cluster multi-istanza GPU con condivisione in tempo eseguendo il seguente comando:
gcloud container node-pools create NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--machine-type=MACHINE_TYPE \
--region=COMPUTE_REGION \
--accelerator=type=nvidia-tesla-a100,count=GPU_QUANTITY,gpu-partition-size=PARTITION_SIZE,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION
Sostituisci PARTITION_SIZE
con la
dimensione della partizione della GPU a più istanze
che preferisci, ad esempio 1g.5gb
.
Limitazioni
- Con la condivisione del tempo della GPU, GKE applica l'isolamento dello spazio indirizzi, l'isolamento delle prestazioni e l'isolamento degli errori tra i container che condividono una GPU fisica. Tuttavia, i limiti di memoria non vengono applicati sulle GPU. Per evitare problemi di esaurimento della memoria (OOM), imposta i limiti di memoria della GPU nei tuoi workload. Per evitare problemi di sicurezza, esegui il deployment solo dei carichi di lavoro che si trovano nello stesso confine di attendibilità per la condivisione in tempo della GPU.
- Per evitare comportamenti inaspettati durante l'allocazione della capacità, GKE potrebbe rifiutare determinate richieste di condivisione in tempo delle GPU. Per maggiori dettagli, consulta Richieste di GPU per il time-sharing della GPU.
- Il numero massimo di container che possono utilizzare la condivisione del tempo in una singola GPU fisica è 48. Quando pianifichi la configurazione del tempo di condivisione della GPU, tieni conto delle esigenze di risorse dei tuoi carichi di lavoro e della capacità delle GPU fisiche sottostanti per ottimizzare le prestazioni e la reattività.
Passaggi successivi
- Scopri di più sulle strategie di condivisione GPU disponibili in GKE.
- Scopri di più sulle GPU.
- Scopri di più sull'esecuzione di GPU a più istanze.
- Per ulteriori informazioni sulla preemption del calcolo per la GPU NVIDIA, consulta la Guida all'ottimizzazione di NVIDIA Pascal.