Questa pagina mostra come utilizzare CUDA Servizio multi-processo (MPS) per far sì che condividono un singolo acceleratore hardware GPU NVIDIA dei nodi di Google Kubernetes Engine (GKE).
Panoramica
NVIDIA MPS è una soluzione di condivisione GPU che consente a più container un singolo hardware GPU NVIDIA fisico collegato a un nodo.
NVIDIA MPS si basa sul servizio multi-processo di NVIDIA su CUDA. NVIDIA MPS è un un'implementazione alternativa compatibile con il programma binario dell'API CUDA, progettata per attivare in modo trasparente applicazioni CUDA multi-processo cooperative per l'esecuzione contemporaneamente su un singolo dispositivo GPU.
Con NVIDIA MPS, puoi specificare il numero massimo di container condivisi di una GPU fisica. Questo determina la quantità di potenza fisica della GPU che ciascun container riceve, le seguenti caratteristiche:
Per scoprire di più su come le GPU sono state pianificate con NVIDIA MPS, quando usare CUDA MPS, consulta Informazioni sulle soluzioni di condivisione delle GPU in GKE.
Chi dovrebbe utilizzare questa guida
Le istruzioni in questa sezione si applicano 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 NVIDIA MPS con GPU, consulta Esegui il deployment dei carichi di lavoro che utilizzano NVIDIA MPS con GPU.
Requisiti
- Versione di GKE: puoi abilitare la condivisione della GPU con NVIDIA MPS su Cluster GKE Standard che eseguono la versione GKE 1.27.7-gke.1088000 e versioni successive.
- Tipo di GPU: puoi abilitare NVIDIA MPS per tutti i tipi di GPU NVIDIA Tesla®.
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 GPU NVIDIA Tesla. 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 le limitazioni per NVIDIA MPS con GPU.
Abilita NVIDIA MPS con GPU sui cluster GKE
In qualità di amministratore di piattaforma, devi abilitare NVIDIA MPS con GPU su un nel cluster GKE Standard. Quindi, gli sviluppatori di applicazioni possono per utilizzare NVIDIA MPS con GPU. Per abilitare NVIDIA MPS con GPU su GKE, segui questi passaggi:
- Abilita NVIDIA MPS con GPU su un nuovo cluster GKE.
- Installa i driver dei dispositivi GPU NVIDIA (se necessario).
- Verifica le risorse GPU disponibili sui tuoi nodi.
Abilita NVIDIA MPS con GPU su un cluster GKE
Puoi abilitare NVIDIA MPS con 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 NVIDIA MPS con GPU quando crei manualmente nuove pool di nodi nel cluster.
Crea un cluster con NVIDIA MPS abilitata utilizzando Google Cloud CLI:
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=mps,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
. Il tipo di GPU che utilizzi deve essere available nella zona selezionata.CLUSTER_VERSION
: la versione GKE per dal piano di controllo e dai nodi del cluster. Usa GKE versione 1.27.7-gke.1088000 o successiva. 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.- Per le GPU H100, utilizza un tipo di macchina A3
- Per le GPU A100, utilizza un tipo di macchina A2.
- Per le GPU L4, utilizza un tipo di macchina G2.
- Per tutte le altre GPU, utilizza un tipo di macchina N1.
GPU_TYPE
: il tipo di GPU, che deve essere un Piattaforma GPU NVIDIA Tesla 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 NVIDIA MPS con GPU su un nuovo pool di nodi
Puoi abilitare NVIDIA MPS con GPU quando crei manualmente nuovi pool di nodi in un cluster GKE. Crea un pool di nodi con NVIDIA MPS abilitata utilizzando il metodo Google Cloud CLI:
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=mps,max-shared-clients-per-gpu=CONTAINER_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.27.7-gke.1088000 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. Per le GPU A100, utilizza un Tipo di macchina A2. Per tutti per altre GPU, utilizza Tipo di macchina N1.GPU_TYPE
: il tipo di GPU, che deve essere un Piattaforma GPU NVIDIA Tesla ad esempionvidia-tesla-v100
.GPU_QUANTITY
: il numero di GPU fisiche da collegare a ciascun nodo nel pool di nodi.CONTAINER_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
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 NVIDIA MPS 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
Verifica le risorse GPU disponibili
Puoi verificare che il numero di GPU nei nodi corrisponda al numero specificato quando hai abilitato NVIDIA MPS. Puoi anche verificare che NVIDIA MPS il daemon di controllo è in esecuzione.
Verifica le risorse GPU disponibili sui nodi
Per verificare le risorse GPU disponibili sui nodi, esegui questo comando:
kubectl describe nodes NODE_NAME
Sostituisci NODE_NAME con il nome del tuo nodo.
L'output è simile al seguente:
...
Capacity:
...
nvidia.com/gpu: 3
Allocatable:
...
nvidia.com/gpu: 3
In questo output, il numero di risorse GPU sul nodo è 3
a causa dei seguenti valori:
- Il valore in
max-shared-clients-per-gpu
è3
. - Il
count
di GPU fisiche da collegare al nodo è1
. Secount
di una GPU fisica era2
, l'output mostrava6
risorse GPU allocabili, tre per ciascuna GPU fisica.
Verifica che il daemon di controllo MPS sia in esecuzione
Il plug-in del dispositivo GPU esegue un controllo di integrità sul daemon di controllo MPS. Quando il daemon di controllo MPS è integro, puoi eseguire il deployment di un container.
Per verificare che l'MPS sia uno stato, esegui questo comando:
kubectl logs -l k8s-app=nvidia-gpu-device-plugin -n kube-system --tail=100 | grep MPS
L'output è simile al seguente:
I1118 08:08:41.732875 1 nvidia_gpu.go:75] device-plugin started
...
I1110 18:57:54.224832 1 manager.go:285] MPS is healthy, active thread percentage = 100.0
...
Nell'output potresti notare che si sono verificati i seguenti eventi:
- L'errore
failed to start GPU device manager
precede l'erroreMPS is healthy
. Questo errore è temporaneo. Se vedi l'iconaMPS is healthy
il daemon di controllo è in esecuzione. - Il messaggio
active thread percentage = 100.0
indica che l'intero codice La risorsa GPU ha un thread completamente attivo.
Deployment di carichi di lavoro che utilizzano MPS
In qualità di operatore di applicazioni che esegue il deployment di carichi di lavoro GPU,
GKE condividere unità di condivisione MPS nella stessa GPU fisica. Nella
manifest, richiedi una GPU fisica e imposti
max-shared-clients-per-gpu=3
. La GPU fisica riceve tre unità di condivisione MPS e avvia un job nvidia/samples:nbody
con tre pod (container) in esecuzione in parallelo.
Salva il manifest come
gpu-mps.yaml
:apiVersion: batch/v1 kind: Job metadata: name: nbody-sample spec: completions: 3 parallelism: 3 template: spec: hostIPC: true nodeSelector: cloud.google.com/gke-gpu-sharing-strategy: mps containers: - name: nbody-sample image: nvidia/samples:nbody command: ["/tmp/nbody"] args: ["-benchmark", "-i=5000"] resources: limits: nvidia.com/gpu: 1 restartPolicy: "Never" backoffLimit: 1
In questo manifest:
hostIPC: true
consente ai pod di comunicare con il daemon di controllo MPS. È obbligatorio. Tuttavia, tieni presente che la configurazione dihostIPC: true
consente un container per accedere alla risorsa host, il che introduce rischi per la sicurezza.- 5000 iterazioni vengono eseguite in modalità benchmark.
Applica il manifest:
kubectl apply -f gpu-mps.yaml
Verifica che tutti i pod siano in esecuzione:
kubectl get pods
L'output è simile al seguente:
NAME READY STATUS RESTARTS AGE nbody-sample-6948ff4484-54p6q 1/1 Running 0 2m6s nbody-sample-6948ff4484-5qs6n 1/1 Running 0 2m6s nbody-sample-6948ff4484-5zpdc 1/1 Running 0 2m5s
Controlla i log dei pod per verificare che il job sia stato completato:
kubectl logs -l job-name=nbody-sample -f
L'output è simile al seguente:
... > Compute 8.9 CUDA device: [NVIDIA L4] 18432 bodies, total time for 5000 iterations: 9907.976 ms = 171.447 billion interactions per second = 3428.941 single-precision GFLOP/s at 20 flops per interaction ...
Poiché GKE esegue 50.000 iterazioni, il log potrebbe richiedere diverse minuti.
Esegui la pulizia
Elimina i job e tutti i relativi pod eseguendo questo comando:
kubectl delete job --all
Limita la memoria bloccata del dispositivo e il thread attivo con NVIDIA MPS
Per impostazione predefinita, quando utilizzi GPU con NVIDIA MPS su GKE, quanto segue Le variabili di ambiente CUDA vengono inserite nel carico di lavoro GPU:
CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
: questa variabile indica la percentuale di i thread disponibili utilizzabili da ogni unità di condivisione MPS. Per impostazione predefinita, ogni L'unità di condivisione MPS della GPU è impostata su100 / MaxSharedClientsPerGPU
su una porzione uguale di computing GPU in termini di multiprocessore per lo streaming.CUDA_MPS_PINNED_DEVICE_MEM_LIMIT
: questa variabile limita la quantità di GPU di memoria che può essere allocata da un'unità di condivisione MPS della GPU. Per impostazione predefinita, ogni L'unità di condivisione MPS della GPU è impostata sutotal mem / MaxSharedClientsPerGPU
su una porzione uguale di memoria GPU.
Per impostare il limite delle risorse per i carichi di lavoro GPU, configura queste variabili di ambiente NVIDIA MPS:
Esamina e crea l'immagine dell'esempio
cuda-mps
in GitHub.Salva il seguente manifest come
cuda-mem-and-sm-count.yaml
:apiVersion: v1 kind: Pod metadata: name: cuda-mem-and-sm-count spec: hostIPC: true nodeSelector: cloud.google.com/gke-gpu-sharing-strategy: mps containers: - name: CUDA_MPS_IMAGE image: gcr.io/gracegao-gke-dev/cuda-mem-and-sm-count:latest securityContext: privileged: true resources: limits: nvidia.com/gpu: 1
Sostituisci
CUDA_MPS_IMAGE
con il nome dell'immagine che hai creato per l'esempiocuda-mps
.NVIDIA MPS richiede l'impostazione di
hostIPC:true
sui pod.hostIPC:true
consente al container di accedere alla risorsa host, il che introduce e rischi per la sicurezza.Applica il manifest:
kubectl apply -f cuda-mem-and-sm-count.yaml
Controlla i log per questo pod:
kubectl logs cuda-mem-and-sm-count
In un esempio che utilizza NVIDIA Tesla® L4 con
gpu-sharing-strategy=mps
emax-shared-clients-per-gpu=3
, l'output è simile al seguente:For device 0: Free memory: 7607 M, Total memory: 22491 M For device 0: multiProcessorCount: 18
In questo esempio, NVIDIA Tesla® La GPU L4 ha un conteggio di 60 SM e 24 GB di memoria. Ogni unità di condivisione MPS riceve circa il 33% di thread attivo e 8 GB la memoria.
Aggiorna il file manifest per richiedere 2
nvidia.com/gpu
:resources: limits: nvidia.com/gpu: 2
L'output è simile al seguente:
For device 0: Free memory: 15230 M, Total memory: 22491 M For device 0: multiProcessorCount: 38
Aggiorna il file manifest per eseguire l'override di
CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
eCUDA_MPS_PINNED_DEVICE_MEM_LIMIT
variabili:env: - name: CUDA_MPS_ACTIVE_THREAD_PERCENTAGE value: "20" - name: CUDA_MPS_PINNED_DEVICE_MEM_LIMIT value: "0=8000M"
L'output è simile al seguente:
For device 0: Free memory: 7952 M, Total memory: 22491 M For device 0: multiProcessorCount: 10
Limitazioni
- MPS sulle GPU pre-Volta (P100) ha funzionalità limitate a confronto con tipi di GPU in e dopo Volta.
- Con NVIDIA MPS, GKE garantisce che ogni container venga limitato la memoria del dispositivo e il thread attivo fissato. Tuttavia, altre risorse come la memoria larghezza di banda, encoder o decoder non vengono acquisiti come parte di queste limiti. Di conseguenza, i container possono influire negativamente sulle prestazioni dei e gli altri container se richiedono tutti la stessa risorsa illimitata.
- NVIDIA MPS offre protezione della memoria e contenimento degli errori limitazioni. I nostri suggerimenti di valutare queste limitazioni per garantire la compatibilità con carichi di lavoro con scale out impegnativi.
- NVIDIA MPS richiede l'impostazione di
hostIPC:true
sui pod.hostIPC:true
consente al container di accedere alla risorsa host, il che introduce e rischi per la sicurezza. - GKE potrebbe rifiutare determinate richieste GPU quando utilizzi NVIDIA MPS, per evitare un comportamento imprevisto durante l'allocazione della capacità. Per maggiori dettagli, vedi Richiedi limiti per le soluzioni di condivisione GPU.
- Il numero massimo di container che possono condividere una singola GPU fisica NVIDIA MPS è 48 (la GPU pre-Volta supporta solo 16). Durante la pianificazione la tua configurazione NVIDIA MPS, considera le esigenze in termini di risorse per i carichi di lavoro e la capacità delle GPU fisiche sottostanti di ottimizzare per migliorare le prestazioni e la reattività.
- La configurazione dell'API NVIDIA MPS è supportata solo utilizzando Google Cloud CLI o nella console Google Cloud.
Passaggi successivi
- Per ulteriori informazioni sulle strategie di condivisione della GPU disponibili in per GKE, consulta Informazioni sulle strategie di condivisione delle GPU in GKE
- Per ulteriori informazioni sul servizio multiprocesso (MPS), consulta il Documentazione di NVIDIA.