Questa pagina mostra come consentire a più carichi di lavoro ottenere l'accesso di condivisione del tempo delle GPU a un un singolo acceleratore hardware GPU NVIDIA® in Google Kubernetes Engine (GKE) nodi. Per ulteriori informazioni su come funziona la condivisione del tempo della GPU, nonché limitazioni e esempi di quando è consigliabile utilizzare la condivisione del tempo della GPU, fai riferimento Condivisione del tempo delle GPU su GKE.
Panoramica
La condivisione del tempo della GPU è una funzionalità di GKE che consente a più container a una singola GPU fisica collegata a un nodo. L'utilizzo della condivisione del tempo della GPU in GKE ti consente di utilizzare in modo più efficiente le GPU collegate e di risparmiare i costi di gestione.
Chi dovrebbe utilizzare questa guida
Le istruzioni riportate in questa guida sono applicabili ai seguenti casi:
- Amministratore di piattaforma: crea e gestisce un account GKE cluster, pianifica i requisiti di infrastruttura e risorse e monitora le prestazioni del tuo cluster.
- Sviluppatore di applicazioni: progetta ed esegue il deployment dei carichi di lavoro su cluster GKE. Se vuoi istruzioni per richiedere Condivisione del tempo della GPU, consulta Esegui il deployment di carichi di lavoro che utilizzano la condivisione del tempo delle GPU.
Requisiti
- Versione di GKE: puoi abilitare la condivisione del tempo della GPU on Cluster GKE Standard in esecuzione GKE versione 1.23.7-gke.1400 e successive. Puoi utilizzare GPU con condivisione del tempo su GKE Autopilot che eseguono GKE versione 1.29.3-gke.1093000 e successive.
- Tipo di GPU: puoi attivare la condivisione del tempo delle GPU su tutti i modelli di GPU NVIDIA.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Attiva l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
install e poi
inizializzare
con gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente
eseguendo
gcloud components update
.
- Assicurati di avere a disposizione Quota per i modelli GPU NVIDIA. Se hai bisogno quota più alta, consulta Richiedere un aumento della quota.
- Pianifica la capacità della GPU in base alle esigenze delle risorse carichi di lavoro e la capacità della GPU sottostante.
- Esamina i limiti della condivisione del tempo delle GPU.
Abilita la condivisione del tempo delle GPU nei cluster GKE e nei pool di nodi
In qualità di amministratore di piattaforma, devi abilitare la condivisione del tempo della GPU su un cluster GKE Cluster standard prima che gli sviluppatori possano eseguire il deployment dei carichi di lavoro per utilizzare le GPU. Per attivare Condivisione del tempo della GPU, devi procedere come segue:
- Abilita la condivisione del tempo della GPU su un cluster GKE.
- Installa i driver dei dispositivi GPU NVIDIA (se necessario).
- Verifica le risorse GPU disponibili sui tuoi nodi.
Cluster Autopilot che eseguono la versione 1.29.3-gke.1093000 e in seguito abilitano le GPU con condivisione del tempo per impostazione predefinita. Condivisione del tempo su Autopilot è configurato nella specifica dei carichi di lavoro. Per saperne di più, consulta Eseguire il deployment di carichi di lavoro che utilizzano GPU con condivisione temporale .
Abilita la condivisione del tempo della GPU su un cluster GKE Standard
Puoi abilitare la condivisione del tempo della GPU quando crei GKE di cluster standard. Il pool di nodi predefinito nel cluster ha la funzionalità in un bucket in cui è abilitato il controllo delle versioni. Devi comunque abilitare la condivisione del tempo della GPU quando ne crei manualmente di 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
: il Compute Engine region per il nuovo cluster. Per cluster di zona, specifica--zone=COMPUTE_ZONE
.CLUSTER_VERSION
: la versione GKE per dal piano di controllo e dai nodi del cluster. Usa la versione GKE 1.23.7-gke.1400 o versioni successive. In alternativa, specifica canale di rilascio con quella versione GKE utilizzando Flag--release-channel=RELEASE_CHANNEL
.MACHINE_TYPE
: il tipo di macchina Compute Engine per dai nodi. Ti consigliamo di selezionare un tipo di macchina ottimizzato per l'acceleratore.GPU_TYPE
: il tipo di GPU, che deve essere un Piattaforma GPU NVIDIA ad esempionvidia-tesla-v100
.GPU_QUANTITY
: il numero di GPU fisiche da collegare a ciascun nodo nel pool di nodi predefinito.CLIENTS_PER_GPU
: il numero massimo di container che possono condividere ciascuna GPU fisica.DRIVER_VERSION
: la versione del driver NVIDIA per installare l'app. Può essere uno dei seguenti:default
: installa la versione del driver predefinita per GKE completamente gestita.latest
: installa l'ultima versione del driver disponibile per GKE completamente gestita. Disponibile solo per i nodi che utilizzano Container-Optimized OS.disabled
: salta l'installazione automatica del driver. Devi installare manualmente un driver dopo la creazione del pool di nodi. Se omettigpu-driver-version
, questa è l'impostazione predefinita .
Abilita la condivisione del tempo della GPU su un pool di nodi GKE
Puoi abilitare la condivisione del tempo delle 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 versione 1.23.7-gke.1400 o successiva.COMPUTE_REGION
: il Compute Engine regione del tuo cluster. Per i servizi a livello di zona di cluster, specifica--zone=COMPUTE_ZONE
.MACHINE_TYPE
: il tipo di macchina Compute Engine per dai nodi. Ti consigliamo di selezionare un tipo di macchina ottimizzato per l'acceleratore.GPU_TYPE
: il tipo di GPU, che deve essere un Piattaforma GPU NVIDIA ad esempionvidia-tesla-v100
.GPU_QUANTITY
: il numero di GPU fisiche da collegare a ciascun nodo nel pool di nodi.CLIENTS_PER_GPU
: il numero massimo di container che possono condividere ciascuna GPU fisica.DRIVER_VERSION
: la versione del driver NVIDIA per installare l'app. Può corrispondere a uno dei seguenti:default
: installa la versione del driver predefinita per GKE completamente gestita.latest
: installa l'ultima versione del driver disponibile per GKE completamente gestita. Disponibile solo per i nodi che utilizzano Container-Optimized OS.disabled
: salta l'installazione automatica del driver. Devi installare manualmente un driver dopo la creazione del pool di nodi. Se omettigpu-driver-version
, questa è l'impostazione predefinita .
Installa i driver di dispositivo GPU NVIDIA
Prima di procedere, connettiti al cluster eseguendo questo 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 usi una versione GKE precedente alla 1.27.2-gke.1200, devi installare manualmente un driver NVIDIA compatibile per gestire la divisione di condivisione del tempo delle GPU delle GPU fisiche. Per installare i driver, esegui il deployment di un DaemonSet di installazione 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 configurare il provisioning automatico dei nodi con gli ambiti che consentono a GKE per installare i driver di dispositivo GPU. Per istruzioni, consulta 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 indicato specificato quando hai abilitato 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
delle GPU fisiche da collegare al nodo era 1
. Come ulteriore esempio, se
una percentuale pari a count
delle GPU fisiche era 2
, l'output mostrava 6
GPU allocabile
e tre per ciascuna GPU fisica.
Deployment di carichi di lavoro che utilizzano la condivisione del tempo delle GPU
In qualità di operatore di applicazioni che esegue il deployment di carichi di lavoro GPU, puoi selezionare
Condivisione del tempo della GPU abilitata specificando le etichette dei nodi appropriate in un
nodeSelector
nei tuoi manifest. Quando pianifichi le richieste, esamina le
limiti di richieste
per assicurarti che GKE non rifiuti i tuoi deployment.
Per eseguire il deployment di un carico di lavoro per consumare la condivisione del tempo della GPU, completa i seguenti passaggi:
Aggiungi un
nodeSelector
al manifest del carico di lavoro per le seguenti etichette:cloud.google.com/gke-gpu-sharing-strategy: time-sharing
: seleziona i nodi che usano la condivisione del tempo della GPU.cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
: seleziona nodi che consentono a un numero specifico di container di condividere GPU sottostante.
Aggiungi la richiesta di risorsa GPU
nvidia.com/gpu=1
al container specifica, inspec.containers.resources.limits
.
Ad esempio, i passaggi seguenti mostrano come eseguire il deployment di tre pod Pool di nodi di condivisione del tempo della GPU. GKE alloca ogni container stessa GPU fisica. I container stampano l'UUID della GPU collegata del 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 "condivisione del tempo" per richiedere la condivisione del tempo 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, verifica la presenza di eventuali altri log nei log. 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)
Utilizza la condivisione del tempo delle GPU con GPU multi-istanza
In qualità di amministratore di piattaforma, potresti voler combinare più GKE Funzionalità GPU. La condivisione del tempo delle GPU funziona con le GPU a più istanze, che eseguono la partizione una singola GPU fisica in un massimo di sette sezioni. Queste partizioni sono isolate l'uno dall'altro. Puoi configurare la condivisione del tempo delle GPU per ogni GPU a più istanze della partizione di testo.
Ad esempio, se imposti gpu-partition-size
su 1g.5gb
, la GPU sottostante
verrà suddiviso 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 per la condivisione del tempo della GPU disponibili da allocare in quella GPU fisica. Per scoprire di più su come gpu-partition-size
vengono convertiti in partizioni effettive. Fai riferimento a Partizioni GPU multi-istanza.
Per creare un cluster GPU a più istanze con la condivisione del tempo delle GPU abilitata, esegui questo comando:
Autopilot
Con Autopilot, è possibile usare GPU con condivisione del tempo e multiistanza delle GPU utilizzando entrambi i set di selettori dei 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 con condivisione del tempo della GPU eseguendo questo 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
Dimensioni delle partizioni GPU multi-istanza
desiderato, ad esempio 1g.5gb
.
Limitazioni
- Con la condivisione del tempo della GPU, GKE applica l'impostazione di spazio, delle prestazioni e degli errori tra che condividono una GPU fisica. Tuttavia, i limiti di memoria non vengono applicati sulle GPU. Per evitare problemi di esaurimento della memoria, imposta Limiti di memoria GPU nei carichi di lavoro. Per evitare problemi di sicurezza, esegui il deployment carichi di lavoro nello stesso confine di attendibilità per la condivisione del tempo della GPU.
- Per evitare un comportamento imprevisto durante l'allocazione della capacità, GKE potrebbe rifiutare determinate richieste di condivisione del tempo della GPU. Per maggiori dettagli, vedi Richieste di GPU per la condivisione del tempo delle GPU.
- Il numero massimo di container che possono utilizzare la condivisione del tempo in una singola GPU fisica è 48. Quando pianifichi la configurazione della condivisione del tempo della GPU, considera l'utilizzo delle esigenze dei carichi di lavoro e della capacità delle GPU fisiche sottostanti ottimizzare prestazioni e reattività.
Passaggi successivi
- Scopri di più sulle strategie di condivisione delle GPU disponibili in GKE.
- Scopri di più sulle GPU.
- Scopri di più sull'esecuzione di GPU multi-istanza.
- Per ulteriori informazioni sul prerilascio del calcolo per la GPU NVIDIA, fai riferimento a il Guida all'ottimizzazione di NVIDIA Pascal.