Questa pagina mostra come consentire a più workload di accedere alla condivisione del tempo della GPU a un singolo acceleratore hardware GPU NVIDIA® nei nodi di Google Kubernetes Engine (GKE). Utilizzando la condivisione del tempo della GPU in GKE, puoi utilizzare in modo più efficiente le GPU collegate e risparmiare sui costi di esecuzione.
Questa pagina è rivolta agli sviluppatori che progettano e implementano carichi di lavoro sui cluster GKE e agli amministratori e agli architetti che creano e gestiscono un cluster GKE, pianificano i requisiti di infrastruttura e risorse e monitorano le prestazioni del cluster. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli utente e attività comuni di GKE Enterprise.
Prima di leggere questa pagina, assicurati di conoscere come funziona il time-sharing in GKE, inclusi i limiti e le situazioni in cui devi utilizzare il time-sharing della GPU.
Requisiti
- Versione GKE: puoi abilitare la condivisione del tempo della GPU sui cluster GKE Standard che eseguono GKE versione 1.23.7-gke.1400 e successive. Puoi utilizzare le GPU in time-sharing sui cluster GKE Autopilot che eseguono GKE versione 1.29.3-gke.1093000 e successive.
- Tipo di GPU: puoi attivare la condivisione del tempo 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à,
installala e poi
inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo
gcloud components update
.
- Assicurati di disporre di una quota sufficiente di modelli di GPU NVIDIA. Se hai bisogno di più quota, consulta la sezione Richiesta di 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 time-sharing della GPU.
Abilita la condivisione del tempo della GPU sui cluster GKE e sui pool di nodi
In qualità di amministratore della piattaforma, devi abilitare la condivisione a tempo della GPU su un cluster GKE Standard prima che gli sviluppatori possano eseguire il deployment dei carichi di lavoro per utilizzare le GPU. Per abilitare la condivisione a tempo della GPU, devi:
- Abilita la condivisione a tempo della GPU su un cluster GKE.
- Installa i driver di dispositivo GPU NVIDIA (se necessario).
- Verifica le risorse GPU disponibili sui nodi.
I cluster Autopilot che eseguono la versione 1.29.3-gke.1093000 e successive abilitano le GPU in time-sharing per impostazione predefinita. La condivisione del tempo sui cluster Autopilot è configurata nella specifica del workload. Per saperne di più, consulta la sezione Esegui il deployment di workload che utilizzano GPU in time-sharing.
Abilita la condivisione a tempo della GPU su un cluster GKE Standard
Puoi abilitare la condivisione a tempo della GPU quando crei cluster GKE Standard. La funzionalità è attivata nel pool di nodi predefinito del cluster. Devi comunque attivare la condivisione del tempo della GPU quando crei manualmente nuovi pool di nodi nel cluster.
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--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.CONTROL_PLANE_LOCATION
: la posizione di Compute Engine del control plane del tuo cluster. Fornisci una regione per i cluster regionali o una zona per i cluster zonali.CLUSTER_VERSION
: la versione di GKE per il control plane e i nodi del cluster. Utilizza GKE 1.23.7-gke.1400 o versioni successive. In alternativa, specifica un canale di rilascio con quella versione di GKE utilizzando il flag--release-channel=RELEASE_CHANNEL
.MACHINE_TYPE
: il tipo di macchina Compute Engine per i 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 container 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 del driver predefinita per la tua versione di GKE.latest
: installa la versione più recente del driver disponibile per la tua versione di 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.
Abilita la condivisione del tempo della GPU su un pool di nodi GKE
Puoi abilitare la condivisione del tempo della GPU quando crei manualmente nuovi pool di nodi in un cluster GKE.
gcloud container node-pools create NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--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:
NODEPOOL_NAME
: il nome del nuovo pool di nodi.CLUSTER_NAME
: il nome del cluster, che deve eseguire GKE versione 1.23.7-gke.1400 o successive.CONTROL_PLANE_LOCATION
: la posizione di Compute Engine del control plane del tuo cluster. Fornisci una regione per i cluster regionali o una zona per i cluster zonali.MACHINE_TYPE
: il tipo di macchina Compute Engine per i 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.CLIENTS_PER_GPU
: il numero massimo di container 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 del driver predefinita per la tua versione di GKE.latest
: installa la versione più recente del driver disponibile per la tua versione di 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 del dispositivo GPU NVIDIA
Prima di procedere, connettiti al cluster eseguendo questo 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 divisione in time-sharing delle GPU fisiche. Per installare i driver, devi eseguire il deployment di un DaemonSet di installazione di GKE che configura i driver.
Per istruzioni, consulta Installazione dei driver di dispositivo GPU NVIDIA.
Se prevedi di utilizzare il provisioning automatico dei nodi nel tuo cluster, devi anche configurarlo con gli ambiti che consentono a GKE di installare i driver di dispositivo GPU per te. Per istruzioni, consulta la pagina Utilizzo del provisioning automatico dei nodi con le GPU.
Verifica le risorse GPU disponibili sui nodi
Per verificare che il numero di GPU visibili nei nodi corrisponda al numero specificato quando hai attivato la condivisione del 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 output di esempio, 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
delle GPU fisiche era 2
, l'output mostrerebbe 6
risorse GPU allocabili, tre su ogni GPU fisica.
Esegui il deployment di carichi di lavoro che utilizzano la condivisione del tempo della GPU
In qualità di operatore di applicazioni che esegue il deployment di carichi di lavoro GPU, puoi selezionare
la condivisione del tempo della GPU abilitata specificando le etichette dei nodi appropriate in un
nodeSelector
nei manifest. Quando pianifichi le richieste, esamina i
limiti delle richieste
per assicurarti che GKE non rifiuti i tuoi deployment.
Per eseguire il deployment di un carico di lavoro per utilizzare la condivisione del tempo della GPU, completa i seguenti passaggi:
Aggiungi un
nodeSelector
al manifest del workload per le seguenti etichette:cloud.google.com/gke-gpu-sharing-strategy: time-sharing
: seleziona i nodi che utilizzano la condivisione del tempo 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 sottostante.
Aggiungi la richiesta di risorse GPU
nvidia.com/gpu=1
alla specifica del container, inspec.containers.resources.limits
.
Ad esempio, i seguenti passaggi mostrano come eseguire il deployment di tre pod in un pool di nodi con condivisione della GPU. GKE alloca ogni container 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 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 la condivisione del tempo della GPU con le GPU multi-istanza
In qualità di amministratore della piattaforma, potresti voler combinare più funzionalità GPU di GKE. La condivisione del tempo della GPU funziona con le GPU multi-istanza, che partizionano una singola GPU fisica in un massimo di sette sezioni. Queste partizioni sono isolate l'una dall'altra. Puoi configurare la condivisione del tempo della GPU per ogni partizione GPU multi-istanza.
Ad esempio, se imposti gpu-partition-size
su 1g.5gb
, la GPU sottostante
verrà 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 un massimo di 21 dispositivi di condivisione del tempo della GPU disponibili da allocare in quella GPU fisica. Per scoprire in che modo la gpu-partition-size
viene convertita in partizioni effettive, consulta Partizioni GPU multi-istanza.
Per creare un cluster GPU multi-istanza con la condivisione del tempo della GPU abilitata, esegui questo comando:
Autopilot
Con Autopilot, la condivisione del tempo della GPU e le GPU multi-istanza 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 multiistanza con condivisione del tempo della GPU eseguendo il seguente comando:
gcloud container node-pools create NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--machine-type=MACHINE_TYPE \
--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 le
dimensioni della partizione GPU multi-istanza
che preferisci, ad esempio 1g.5gb
.
Limitazioni
- Con la condivisione del tempo della GPU, GKE applica l'isolamento dello spazio degli indirizzi, delle prestazioni e degli errori tra i container che condividono una GPU fisica. Tuttavia, i limiti di memoria non vengono applicati alle GPU. Per evitare problemi di esaurimento della memoria, imposta i limiti di memoria della GPU nei tuoi workload. Per evitare problemi di sicurezza, esegui il deployment del time-sharing della GPU solo per i carichi di lavoro che si trovano nello stesso confine di attendibilità.
- Per evitare comportamenti imprevisti durante l'allocazione della capacità, GKE potrebbe rifiutare alcune richieste di time-sharing della GPU. Per i dettagli, consulta Richieste di GPU per la condivisione del tempo della GPU.
- Il numero massimo di container che possono utilizzare la condivisione del tempo in una singola GPU fisica è 48. Quando pianifichi la configurazione di condivisione del tempo della GPU, considera le esigenze di risorse dei tuoi carichi di lavoro e la capacità delle GPU fisiche sottostanti per ottimizzare le prestazioni e la reattività.
Passaggi successivi
- Scopri di più sulle strategie di condivisione della GPU disponibili in GKE.
- Scopri di più sulle GPU.
- Scopri di più sull'esecuzione di GPU a più istanze.
- Per saperne di più sulla preemption del calcolo per la GPU NVIDIA, consulta la Guida all'ottimizzazione di NVIDIA Pascal.