Questa pagina spiega come utilizzare CUDA Multi-Process Service (MPS) per consentire a più workload di condividere un singolo acceleratore hardware GPU NVIDIA nei nodi Google Kubernetes Engine (GKE).
Panoramica
NVIDIA MPS è una soluzione di condivisione GPU che consente a più container di condividere un singolo hardware GPU NVIDIA fisico collegato a un nodo.
NVIDIA MPS si basa sul servizio con processi multipli di NVIDIA su CUDA. NVIDIA MPS è un'implementazione alternativa e compatibile a livello binario dell'API CUDA progettata per consentire in modo trasparente l'esecuzione simultanea di applicazioni CUDA con processi multipli cooperativi su un singolo dispositivo GPU.
Con NVIDIA MPS, puoi specificare il numero massimo di container condivisi di una GPU fisica. Questo valore determina la quantità di potenza della GPU fisica che ogni container riceve, in termini di caratteristiche seguenti:
Per scoprire di più su come le GPU pianificate con NVIDIA MPS e quando utilizzare CUDA MPS, consulta Informazioni sulle soluzioni di condivisione GPU in GKE.
A chi si rivolge questa guida
Le istruzioni in questa sezione si applicano se rientri in una delle seguenti categorie:
- Amministratore della piattaforma: crea e gestisce un cluster GKE , pianifica i requisiti di infrastruttura e risorse e monitora le prestazioni del cluster.
- Sviluppatore di applicazioni: progetta ed esegue il deployment di workload sui cluster GKE. Se vuoi istruzioni per richiedere NVIDIA MPS con GPU, consulta Eseguire il deployment di workload che utilizzano NVIDIA MPS con GPU.
Requisiti
- Versione GKE: puoi abilitare la condivisione GPU con NVIDIA MPS sui cluster GKE Standard che eseguono la versione GKE 1.27.7-gke.1088000 e successive.
- Tipo di GPU: puoi abilitare NVIDIA MPS per tutti i tipi di GPU NVIDIA. Tuttavia, non puoi abilitare NVIDIA MPS per i tipi di macchine G4 che hanno meno di una GPU.
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 disporre di una quota GPU NVIDIA sufficiente. 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 per il NVIDIA MPS con GPU.
Abilitare NVIDIA MPS con GPU sui cluster GKE
In qualità di amministratore della piattaforma, devi abilitare NVIDIA MPS con GPU su un cluster GKE Standard. Poi, gli sviluppatori di applicazioni possono eseguire il deployment dei workload per utilizzare NVIDIA MPS con GPU. Per abilitare NVIDIA MPS con GPU su GKE:
- Abilita NVIDIA MPS con GPU su un nuovo cluster GKE.
- Installa i driver di dispositivo GPU NVIDIA (se necessario).
- Verifica le risorse GPU disponibili sui nodi.
Abilitare NVIDIA MPS con GPU su un cluster GKE
Puoi abilitare NVIDIA MPS con GPU quando crei cluster GKE Standard. Il pool di nodi predefinito nel cluster ha la funzionalità abilitata. Devi comunque abilitare NVIDIA MPS con GPU quando crei manualmente nuovi node pool in quel cluster.
Crea un cluster con NVIDIA MPS abilitato utilizzando Google Cloud CLI:
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=mps,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. Il tipo di GPU che utilizzi deve essere disponibile nella regione selezionata.CLUSTER_VERSION: la versione GKE per il control plane e i nodi del cluster. Utilizza la versione GKE 1.27.7-gke.1088000 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.- Per le GPU GB200, utilizza il tipo di macchina A4X.
- Per le GPU B200, utilizza il tipo di macchina A4.
- Per le GPU H200, utilizza il tipo di macchina A3 Ultra
- Per le GPU H100, utilizza un tipo di macchina A3 diverso da Ultra (Mega, High o Edge).
- Per le GPU A100, utilizza un tipo di macchina A2.
- Per le GPU RTX PRO 6000, utilizza un tipo di macchina G4.
- 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 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ò essere 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 dei driver. Dopo aver creato the pool di nodi, devi installare manualmente un driver. Se omettigpu-driver-version, questa è l'opzione predefinita.
Abilitare NVIDIA MPS con GPU su un nuovo pool di nodi
Puoi abilitare NVIDIA MPS con GPU quando crei manualmente nuovi node pool in un cluster GKE. Crea un pool di nodi con NVIDIA MPS abilitato utilizzando Google Cloud CLI:
gcloud container node-pools create NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--machine-type=MACHINE_TYPE \
--location=CONTROL_PLANE_LOCATION \
--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 la versione GKE 1.27.7-gke.1088000 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. Per le GPU A100, utilizza un tipo di macchina A2. Per tutte le altre GPU, utilizza un tipo di macchina N1.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.CONTAINER_PER_GPU: il numero massimo di container che possono condividere ogni GPU fisica.DRIVER_VERSION: la versione del driver NVIDIA da installare. Può essere 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 dei driver. Dopo aver creato the pool di nodi, devi installare manualmente un driver. Se omettigpu-driver-version, questa è l'opzione predefinita.
Installare i driver di dispositivo GPU NVIDIA
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 NVIDIA MPS delle GPU fisiche. Per installare i driver, esegui il deployment di un DaemonSet di installazione GKE che configura i driver.
Per le istruzioni, consulta Installare i driver di dispositivo GPU NVIDIA.
Verificare 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 il daemon di controllo NVIDIA MPS sia in esecuzione.
Verificare le risorse GPU disponibili sui nodi
Per verificare le risorse GPU disponibili sui nodi, esegui il seguente comando:
kubectl describe nodes NODE_NAME
Sostituisci NODE_NAME con il nome del 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
countdelle GPU fisiche da collegare al nodo è1. Se ilcountdelle GPU fisiche fosse2, l'output mostrerebbe6risorse GPU allocabili, tre su ogni GPU fisica.
Verificare 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 lo stato di MPS, esegui il seguente 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 managerprecede l'erroreMPS is healthy. Questo errore è temporaneo. Se vedi il messaggioMPS is healthy, significa che il daemon di controllo è in esecuzione. - Il messaggio
active thread percentage = 100.0indica che l'intera risorsa GPU fisica ha un thread completamente attivo.
Eseguire il deployment di workload che utilizzano MPS
In qualità di operatore di applicazioni che esegue il deployment di workload GPU, puoi indicare a GKE di condividere le unità di condivisione MPS nella stessa GPU fisica. Nel seguente manifest, richiedi una GPU fisica e imposta 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: # Specifies the desired number of successfully finished Pods. completions: 3 # Specifies the maximum desired number of Pods that should run at any given time. parallelism: 3 template: spec: # Allows the Pod to share the host's IPC namespace. # The following field is required for containers to communicate with the MPS control daemon. hostIPC: true # Selects a node with the 'mps' GPU sharing strategy. nodeSelector: cloud.google.com/gke-gpu-sharing-strategy: mps containers: - name: nbody-sample # A sample CUDA application from NVIDIA. image: nvidia/samples:nbody # The command to run in the container. command: ["/tmp/nbody"] # Arguments for the command. Runs the nbody simulation in benchmark mode. args: ["-benchmark", "-i=5000"] resources: limits: # Requests one MPS sharing unit from a physical GPU. nvidia.com/gpu: 1 restartPolicy: "Never" backoffLimit: 1In questo manifest:
hostIPC: trueconsente ai pod di comunicare con il daemon di controllo MPS. È obbligatorio. Tuttavia, tieni presente che la configurazionehostIPC: trueconsente al container di accedere alla risorsa host, il che introduce rischi per la sicurezza.- 5000 iterazioni eseguite in modalità benchmark.
Applica il manifest:
kubectl apply -f gpu-mps.yamlVerifica che tutti i pod siano in esecuzione:
kubectl get podsL'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 2m5sControlla i log dei pod per verificare che il job sia stato completato:
kubectl logs -l job-name=nbody-sample -fL'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 5000 iterazioni, il log potrebbe richiedere diversi minuti.
Esegui la pulizia
Elimina i job e tutti i relativi pod eseguendo il seguente comando:
kubectl delete job --all
Limitare la memoria del dispositivo bloccata e il thread attivo con NVIDIA MPS
Per impostazione predefinita, quando utilizzi la GPU con NVIDIA MPS su GKE, le seguenti variabili di ambiente CUDA vengono inserite nel workload GPU:
CUDA_MPS_ACTIVE_THREAD_PERCENTAGE: questa variabile indica la percentuale di thread disponibili che ogni unità di condivisione MPS può utilizzare. Per impostazione predefinita, ogni unità di condivisione MPS della GPU è impostata su100 / MaxSharedClientsPerGPUper ottenere una porzione uguale del calcolo della GPU in termini di multiprocessore di stream.CUDA_MPS_PINNED_DEVICE_MEM_LIMIT: questa variabile limita la quantità di memoria GPU che può essere allocata da un'unità di condivisione MPS della GPU. Per impostazione predefinita, ogni unità di condivisione MPS della GPU è impostata sutotal mem / MaxSharedClientsPerGPUper ottenere una porzione uguale della memoria GPU.
Per impostare il limite di risorse per i workload GPU, configura queste variabili di ambiente NVIDIA MPS:
Esamina e crea l'immagine dell'esempio
cuda-mpsin GitHub.Salva il seguente manifest come
cuda-mem-and-sm-count.yaml:apiVersion: v1 kind: Pod metadata: name: cuda-mem-and-sm-count spec: # Allows the Pod to share the host's IPC namespace. # The following field is required for containers to communicate with the MPS control daemon. hostIPC: true # Selects a node with the 'mps' GPU sharing strategy. nodeSelector: cloud.google.com/gke-gpu-sharing-strategy: mps containers: - name: cuda-mem-and-sm-count # The custom image built from the cuda-mps example. image: CUDA_MPS_IMAGE # Grants the container extended privileges on the host machine. securityContext: privileged: true resources: limits: # Requests one MPS sharing unit from a physical GPU. nvidia.com/gpu: 1Sostituisci
CUDA_MPS_IMAGEcon il nome dell'immagine che hai creato per l'esempiocuda-mps.NVIDIA MPS richiede di impostare
hostIPC:truesui pod. La configurazionehostIPC:trueconsente al container di accedere alla risorsa host, il che introduce rischi per la sicurezza.Applica il manifest:
kubectl apply -f cuda-mem-and-sm-count.yamlControlla i log di questo pod:
kubectl logs cuda-mem-and-sm-countIn un esempio che utilizza NVIDIA Tesla L4 con
gpu-sharing-strategy=mpsemax-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: 18In questo esempio, la GPU NVIDIA Tesla L4 ha 60 SM e 24 GB di memoria. Ogni unità di condivisione MPS ottiene circa il 33% di thread attivo e 8 GB di memoria.
Aggiorna il manifest per richiedere 2
nvidia.com/gpu:resources: limits: nvidia.com/gpu: 2L'output è simile al seguente:
For device 0: Free memory: 15230 M, Total memory: 22491 M For device 0: multiProcessorCount: 38Aggiorna il manifest per sostituire le variabili
CUDA_MPS_ACTIVE_THREAD_PERCENTAGEeCUDA_MPS_PINNED_DEVICE_MEM_LIMIT: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 rispetto ai tipi di GPU in e dopo Volta.
- Con NVIDIA MPS, GKE contribuisce a garantire che ogni container riceva una memoria del dispositivo bloccata e un thread attivo limitati. Tuttavia, altre risorse come la larghezza di banda della memoria, i codificatori o i decodificatori non vengono acquisite come parte di questi limiti di risorse. Di conseguenza, i container potrebbero influire negativamente sulle prestazioni di altri container se richiedono tutti la stessa risorsa illimitata.
- NVIDIA MPS presenta limitazioni relative alla protezione della memoria e al contenimento degli errori limitazioni. Ti consigliamo di valutare queste limitazioni per garantire la compatibilità con i tuoi workload.
- NVIDIA MPS richiede di impostare
hostIPC:truesui pod. La configurazionehostIPC:trueconsente al container di accedere alla risorsa host, il che introduce rischi per la sicurezza. - GKE potrebbe rifiutare alcune richieste di GPU quando utilizzi NVIDIA MPS, per evitare comportamenti imprevisti durante l'allocazione della capacità.
- Il numero massimo di container che possono condividere una singola GPU fisica con NVIDIA MPS è 48 (la GPU pre-Volta supporta solo 16). Quando pianifichi la configurazione di NVIDIA MPS, 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 NVIDIA MPS per i tipi di macchine G4 che hanno meno di una GPU.
Passaggi successivi
- Per ulteriori informazioni sulle strategie di condivisione GPU disponibili in GKE, consulta Informazioni sulle strategie di condivisione GPU in GKE
- Per ulteriori informazioni su Multi-Process Service (MPS), consulta la documentazione NVIDIA.