Prepara l'infrastruttura GKE per i carichi di lavoro DRA

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 v1beta1 e v1beta2 dei tipi di API DRA. Questa limitazione non si applica alle GPU, che possono utilizzare le versioni dell'API v1.

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.sh
    
  • Per utilizzare DRA per le TPU, abilita le versioni v1beta1 e v1beta2 dei 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=disabled nel flag --accelerator quando 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:

  1. Crea un pool di nodi con l'hardware richiesto. L'esempio seguente crea un pool di nodi con un'istanza g2-standard-24 su 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=true
    

    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 esempio us-central1 o us-central1-a.
  2. 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 esempio us-central1 o us-central1-a.

Installa i driver DRA

GPU

  1. Estrai e aggiorna il grafico Helm che contiene il driver NVIDIA DRA:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. Installa 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

  1. Clona il repository ai-on-gke per accedere ai grafici Helm che contengono i driver DRA per GPU e TPU:

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. Vai alla directory che contiene i grafici:

    cd common-infra/common/charts
    
  3. Installa il driver DRA della TPU:

    ./tpu-dra-driver/install-tpu-dra-driver.sh
    

Verifica che la tua infrastruttura sia pronta per DRA

  1. Per verificare che i pod del driver DRA siano in esecuzione, seleziona una delle seguenti opzioni:

    GPU

    kubectl get pods -n nvidia-dra-driver-gpu
    

    L'output è simile al seguente:

    NAME                                         READY   STATUS    RESTARTS   AGE
    nvidia-dra-driver-gpu-kubelet-plugin-52cdm   1/1     Running   0          46s
    

    TPU

    kubectl get pods -n tpu-dra-driver
    
    

    L'output è simile al seguente:

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. Verifica che ResourceSlice elenchi i dispositivi hardware che hai aggiunto:

    kubectl get resourceslices -o yaml
    

    Se 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: ""
    

Passaggi successivi