Questa pagina mostra come consentire a più workload di ottenere l'accesso in time-sharing della GPU a un singolo acceleratore hardware GPU NVIDIA® nei nodi Google Kubernetes Engine (GKE). Utilizzando il time-sharing della GPU in GKE, puoi utilizzare in modo più efficiente le GPU collegate e ridurre i costi di esecuzione.
Questa pagina è rivolta agli sviluppatori che progettano ed eseguono il deployment dei workload 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 saperne di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività comuni degli utenti GKE.
Requisiti
- Versione GKE: puoi abilitare il time-sharing 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 abilitare il time-sharing della GPU su tutti i modelli di GPU NVIDIA. Tuttavia, non puoi abilitare il time-sharing per i tipi di macchine G4 che hanno meno di una GPU (anteprima).
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il
gcloud components updatecomando. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
- Assicurati di avere una quota sufficiente di modelli di GPU NVIDIA. Se hai bisogno di una quota maggiore, consulta 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.
Abilitare il time-sharing della GPU sui cluster e sui node pool GKE
In qualità di amministratore della piattaforma, devi abilitare il time-sharing della GPU su un cluster GKE Standard prima che gli sviluppatori possano eseguire il deployment dei workload per utilizzare le GPU. Per abilitare il time-sharing della GPU, devi:
- Abilitare il time-sharing della GPU su un cluster GKE.
- Installare i driver dei dispositivi GPU NVIDIA (se necessario).
- Verificare 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. Il time-sharing sui cluster Autopilot è configurato nella specifica del workload. Per saperne di più, consulta la sezione Eseguire il deployment dei workload che utilizzano GPU in time-sharing.
Abilitare il time-sharing della GPU su un cluster GKE Standard
Puoi abilitare il time-sharing della GPU quando crei cluster GKE Standard. Il pool di nodi predefinito nel cluster ha la funzionalità abilitata. Devi comunque abilitare il time-sharing della GPU quando crei manualmente nuovi node pool in quel 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 località 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 GKE per il control plane e i nodi del cluster. Utilizza GKE versione 1.23.7-gke.1400 o successive. In alternativa, specifica un canale di rilascio con quella versione GKE utilizzando il--release-channel=RELEASE_CHANNELflag.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 GKE.latest: installa l'ultima versione 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. Dopo aver creato the pool di nodi, devi installare manualmente un driver. Se omettigpu-driver-version, questa è l'opzione predefinita.
Abilitare il time-sharing della GPU su un pool di nodi GKE
Puoi abilitare il time-sharing della GPU quando crei manualmente nuovi node pool 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 località 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 GKE.latest: installa l'ultima versione 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. Dopo aver creato the pool di nodi, devi installare manualmente un driver. Se omettigpu-driver-version, questa è l'opzione predefinita.
Installare i driver dei dispositivi GPU NVIDIA
Prima di procedere, connettiti al cluster eseguendo il seguente comando:
gcloud container clusters get-credentials CLUSTER_NAME
Se hai scelto di disabilitare l'installazione automatica dei driver durante la creazione del cluster o se utilizzi una versione 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, esegui il deployment di un DaemonSet di installazione GKE che configura i driver.
Per istruzioni, consulta Installare i driver dei dispositivi GPU NVIDIA.
Se prevedi di utilizzare il provisioning automatico dei nodi nel cluster, devi anche configurarlo con gli ambiti che consentono a GKE di installare i driver dei dispositivi GPU. Per istruzioni, consulta Utilizzare il provisioning automatico dei nodi con le GPU.
Verificare le risorse GPU disponibili sui nodi
Per verificare che il numero di GPU visibili nei nodi corrisponda al numero specificato quando hai abilitato il time-sharing 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 delle GPU fisiche da collegare al nodo era 1. In un altro esempio, se il count delle GPU fisiche fosse 2, l'output mostrerebbe 6 risorse GPU allocabili, tre su ogni GPU fisica.
Eseguire il deployment dei workload che utilizzano il time-sharing della GPU
In qualità di operatore dell'applicazione che esegue il deployment dei workload GPU, puoi selezionare il time-sharing della GPU abilitato 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 deployment.
Per eseguire il deployment di un workload per utilizzare il time-sharing della GPU, completa i seguenti passaggi:
Aggiungi un
nodeSelectoral manifest del workload 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 sottostante.
Aggiungi la richiesta di risorse GPU
nvidia.com/gpu=1alla 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 in time-sharing della GPU. GKE alloca ogni container alla stessa GPU fisica. I container stampano l'UUID della GPU collegata a quel 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 workload 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_STRATEGYcon "time-sharing" per richiedere il time-sharing per la GPU.CLIENTS_PER_GPU: il numero di workload che utilizzeranno questa GPU. Per questo esempio, utilizza3.
Applica il manifest:
kubectl apply -f gpu-timeshare.yamlVerifica che tutti i pod siano in esecuzione:
kubectl get pods -l=app=cuda-simpleControlla i log di qualsiasi pod per visualizzare l'UUID della GPU:
kubectl logs POD_NAMEL'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_NAMEL'output è simile al seguente:
GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
Utilizzare il time-sharing della GPU con le GPU multi-istanza
In qualità di amministratore della piattaforma, potresti voler combinare più funzionalità GPU GKE. Il time-sharing della GPU funziona con le GPU multi-istanza, che partizionano una singola GPU fisica in un massimo di sette slice. Queste partizioni sono isolate l'una dall'altra. Puoi configurare il time-sharing 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 in time-sharing della GPU disponibili per l'allocazione in quella GPU fisica. Per scoprire come gpu-partition-size
viene convertito in partizioni effettive, consulta Partizioni GPU multi-istanza.
Per creare un cluster GPU multi-istanza con il time-sharing della GPU abilitato, esegui il seguente comando:
Autopilot
Con Autopilot, il time-sharing della GPU e le GPU multi-istanza possono essere utilizzati 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 in time-sharing 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 la
dimensione della partizione GPU multi-istanza
che vuoi, ad esempio 1g.5gb.
Limitazioni
- Con il time-sharing della GPU, GKE applica l'isolamento dello spazio degli 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 alle GPU. Per evitare problemi di esaurimento della memoria, imposta i limiti di memoria della GPU nei workload. Per evitare problemi di sicurezza, esegui il deployment solo dei workload che si trovano nello stesso limite di attendibilità per il time-sharing della GPU.
- Per evitare comportamenti imprevisti durante l'allocazione della capacità, GKE potrebbe rifiutare alcune richieste di time-sharing della GPU. Per maggiori dettagli, consulta Richieste GPU per il time-sharing della GPU.
- Il numero massimo di container che possono utilizzare il time-sharing in una singola GPU fisica è 48. Quando pianifichi la configurazione del time-sharing della GPU, tieni conto delle esigenze di risorse dei workload e della capacità delle GPU fisiche sottostanti per ottimizzare le prestazioni e la reattività.
- Non puoi abilitare il time-sharing per i tipi di macchine G4 che hanno meno di una GPU (anteprima).
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 multi-istanza.
- Per ulteriori informazioni sulla sottrazione di risorse di computing per la GPU NVIDIA, consulta la Guida alla regolazione di NVIDIA Pascal.