Questo documento spiega come configurare l'infrastruttura Google Kubernetes Engine (GKE) per supportare l'allocazione dinamica delle risorse (DRA). I passaggi di configurazione includono la creazione di pool di nodi che utilizzano GPU o TPU e l'installazione dei driver DRA nel cluster. Questo documento è destinato agli amministratori della piattaforma che vogliono ridurre la complessità e l'overhead della configurazione dell'infrastruttura con dispositivi hardware specializzati.
Limitazioni
- Il provisioning automatico dei nodi non è supportato.
- I cluster Autopilot non supportano DRA.
- L'installazione automatica dei driver GPU non è supportata con DRA.
- Non puoi utilizzare le seguenti funzionalità di condivisione della GPU:
- GPU in time-sharing
- GPU multi-istanza
- Servizio multi-processo (MPS)
- Per le TPU, devi abilitare le versioni
v1beta1ev1beta2dei tipi di API DRA. Questa limitazione non si applica alle GPU, che possono utilizzare le versioni dell'APIv1.
Requisiti
Per utilizzare DRA, il cluster GKE deve eseguire la versione 1.34 o successive.
Devi inoltre conoscere i seguenti requisiti e limitazioni, a seconda del tipo di hardware che vuoi utilizzare:
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
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Avere un cluster GKE Standard che esegue la versione 1.34 o successive. Puoi anche creare un cluster regionale.
Se non utilizzi Cloud Shell, installa Helm CLI:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.shPer utilizzare DRA per le TPU, abilita le versioni
v1beta1ev1beta2dei tipi di API DRA:gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices,resource.k8s.io/v1beta2/deviceclasses,resource.k8s.io/v1beta2/resourceclaims,resource.k8s.io/v1beta2/resourceclaimtemplates,resource.k8s.io/v1beta2/resourceslices"
Crea un pool di nodi GKE con GPU o TPU
Su GKE, puoi utilizzare DRA sia con le GPU che con le TPU. Le impostazioni di configurazione del pool di nodi, come tipo di macchina, tipo di acceleratore, conteggio, sistema operativo del nodo e posizioni dei nodi, dipendono dai tuoi requisiti. Per creare un pool di nodi che supporti DRA, seleziona una delle seguenti opzioni:
GPU
Per utilizzare DRA per le GPU, devi eseguire le seguenti operazioni quando crei il pool di nodi:
- Disattiva l'installazione automatica dei driver GPU specificando l'opzione
gpu-driver-version=disablednel flag--acceleratorquando configuri le GPU per un pool di nodi. - Disattiva il plug-in del dispositivo GPU aggiungendo l'etichetta del nodo
gke-no-default-nvidia-gpu-device-plugin=true. - Consenti l'esecuzione di DaemonSet del driver DRA sui nodi aggiungendo l'etichetta del nodo
nvidia.com/gpu.present=true.
Per creare un pool di nodi GPU per DRA:
Crea un pool di nodi con l'hardware richiesto. L'esempio seguente crea un pool di nodi con un'istanza
g2-standard-24su Container-Optimized OS con due GPU L4.gcloud container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --machine-type "g2-standard-24" \ --accelerator "type=nvidia-l4,count=2,gpu-driver-version=disabled" \ --num-nodes "1" \ --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=trueSostituisci quanto segue:
NODEPOOL_NAME: il nome del tuo pool di nodi.CLUSTER_NAME: il nome del tuo cluster.CONTROL_PLANE_LOCATION: la regione o la zona del control plane del cluster, ad esempious-central1ous-central1-a.
Installa manualmente i driver sui nodi Container-Optimized OS o Ubuntu. Per istruzioni dettagliate, consulta Installare manualmente i driver GPU NVIDIA.
TPU
Per utilizzare DRA per le TPU, devi disattivare il plug-in del dispositivo TPU aggiungendo l'etichetta del nodo gke-no-default-tpu-device-plugin=true. L'esempio seguente
crea un pool di nodi TPU Trillium con supporto DRA:
gcloud container node-pools create NODEPOOL_NAME \
--cluster CLUSTER_NAME --num-nodes 1 \
--location=CONTROL_PLANE_LOCATION \
--node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
--machine-type=ct6e-standard-8t
Sostituisci quanto segue:
NODEPOOL_NAME: il nome del tuo pool di nodi.CLUSTER_NAME: il nome del tuo cluster.CONTROL_PLANE_LOCATION: la regione o la zona del control plane del cluster, ad esempious-central1ous-central1-a.
Installa i driver DRA
GPU
Estrai e aggiorna il grafico Helm che contiene il driver NVIDIA DRA:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo updateInstalla il driver NVIDIA DRA con la versione
25.3.2:helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \ --version="25.3.2" --create-namespace --namespace=nvidia-dra-driver-gpu \ --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \ --set gpuResourcesEnabledOverride=true \ --set resources.computeDomains.enabled=false \ --set kubeletPlugin.priorityClassName="" \ --set 'kubeletPlugin.tolerations[0].key=nvidia.com/gpu' \ --set 'kubeletPlugin.tolerations[0].operator=Exists' \ --set 'kubeletPlugin.tolerations[0].effect=NoSchedule'Per i nodi Ubuntu, utilizza il percorso della directory
nvidiaDriverRoot="/opt/nvidia".
TPU
Clona il repository
ai-on-gkeper accedere ai grafici Helm che contengono i driver DRA per GPU e TPU:git clone https://github.com/ai-on-gke/common-infra.gitVai alla directory che contiene i grafici:
cd common-infra/common/chartsInstalla il driver DRA della TPU:
./tpu-dra-driver/install-tpu-dra-driver.sh
Verifica che la tua infrastruttura sia pronta per DRA
Per verificare che i pod del driver DRA siano in esecuzione, seleziona una delle seguenti opzioni:
GPU
kubectl get pods -n nvidia-dra-driver-gpuL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE nvidia-dra-driver-gpu-kubelet-plugin-52cdm 1/1 Running 0 46sTPU
kubectl get pods -n tpu-dra-driverL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE tpu-dra-driver-kubeletplugin-h6m57 1/1 Running 0 30sVerifica che
ResourceSliceelenchi i dispositivi hardware che hai aggiunto:kubectl get resourceslices -o yamlSe hai utilizzato l'esempio nella sezione precedente, l'output è simile al seguente, a seconda che tu abbia configurato GPU o TPU:
GPU
apiVersion: v1 items: - apiVersion: resource.k8s.io/v1 kind: ResourceSlice metadata: # Multiple lines are omitted here. spec: devices: - attributes: architecture: string: Ada Lovelace brand: string: Nvidia cudaComputeCapability: version: 8.9.0 cudaDriverVersion: version: 13.0.0 driverVersion: version: 580.65.6 index: int: 0 minor: int: 0 pcieBusID: string: "0000:00:03.0" productName: string: NVIDIA L4 resource.kubernetes.io/pcieRoot: string: pci0000:00 type: string: gpu uuid: string: GPU-ccc19e5e-e3cd-f911-65c8-89bcef084e3f capacity: memory: value: 23034Mi name: gpu-0 - attributes: architecture: string: Ada Lovelace brand: string: Nvidia cudaComputeCapability: version: 8.9.0 cudaDriverVersion: version: 13.0.0 driverVersion: version: 580.65.6 index: int: 1 minor: int: 1 pcieBusID: string: "0000:00:04.0" productName: string: NVIDIA L4 resource.kubernetes.io/pcieRoot: string: pci0000:00 type: string: gpu uuid: string: GPU-f783198d-42f9-7cef-9ea1-bb10578df978 capacity: memory: value: 23034Mi name: gpu-1 driver: gpu.nvidia.com nodeName: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm pool: generation: 1 name: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm resourceSliceCount: 1 kind: List metadata: resourceVersion: ""TPU
apiVersion: v1 items: - apiVersion: resource.k8s.io/v1beta1 kind: ResourceSlice metadata: # lines omitted for clarity spec: devices: - basic: attributes: index: int: 0 tpuGen: string: v6e uuid: string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454 name: "0" - basic: attributes: index: int: 1 tpuGen: string: v6e uuid: string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454 name: "1" - basic: attributes: index: int: 2 tpuGen: string: v6e uuid: string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454 name: "2" - basic: attributes: index: int: 3 tpuGen: string: v6e uuid: string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454 name: "3" driver: tpu.google.com nodeName: gke-tpu-b4d4b61b-fwbg pool: generation: 1 name: gke-tpu-b4d4b61b-fwbg resourceSliceCount: 1 kind: List metadata: resourceVersion: ""