Prepara l'infrastruttura GKE per i carichi di lavoro DRA


Questa pagina spiega come configurare l'infrastruttura Google Kubernetes Engine (GKE) per supportare l'allocazione dinamica delle risorse (DRA). In questa pagina creerai cluster in grado di eseguire il deployment di carichi di lavoro GPU o TPU e installerai manualmente i driver necessari per abilitare DRA.

Questa pagina è destinata agli amministratori della piattaforma che vogliono ridurre la complessità e l'overhead della configurazione dell'infrastruttura con dispositivi hardware specializzati.

Informazioni su DRA

DRA è una funzionalità integrata di Kubernetes che ti consente di richiedere, allocare e condividere in modo flessibile l'hardware nel tuo cluster tra pod e container. Per saperne di più, consulta Informazioni sull'allocazione dinamica delle risorse.

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)

Requisiti

Per utilizzare DRA, la versione di GKE deve essere la 1.32.1-gke.1489001 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 gcloud components update.
  • Se non utilizzi Cloud Shell, installa l'interfaccia a riga di comando di Helm:

    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
    

Crea un cluster GKE Standard

Crea un cluster in modalità Standard che abiliti le API beta di Kubernetes per DRA:

   gcloud container clusters create CLUSTER_NAME \
       --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices" \
       --cluster-version=GKE_VERSION

Sostituisci quanto segue:

  • CLUSTER_NAME: un nome per il cluster.
  • GKE_VERSION: la versione di GKE da utilizzare per il cluster e i nodi. Deve essere 1.32.1-gke.1489001 o versioni successive.

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 località dei nodi, dipendono dai tuoi requisiti.

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 con gpu-driver-version=disabled.
  • Disattiva il plug-in del dispositivo GPU aggiungendo l'etichetta del nodo gke-no-default-nvidia-gpu-device-plugin=true.
  • Consenti l'esecuzione di DRA Driver DaemonSet 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 istanze g2-standard-24 su Container-Optimized OS con due GPU L4.

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --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.
  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.

Crea un pool di nodi che utilizza le TPU. L'esempio seguente crea un pool di nodi TPU Trillium:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --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.

Installare 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.0-rc.4:

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu --version="25.3.0-rc.4" --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

Puoi installare i driver DRA per le TPU con il grafico Helm fornito. Per accedere ai grafici Helm, completa i seguenti passaggi:

  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

Verifica che il pod del driver DRA sia in esecuzione.

GPU

kubectl get pods -n nvidia-dra-driver-gpu
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
NAME                                         READY   STATUS    RESTARTS   AGE
tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s

Verifica che ResourceSlice elenchi i dispositivi hardware che hai aggiunto:

kubectl get resourceslices -o yaml

Se hai utilizzato l'esempio nella sezione precedente, ResourceSlice sarà simile a quanto segue, a seconda del tipo di hardware utilizzato:

GPU

L'esempio seguente crea una macchina g2-standard-24 con due GPU L4.

apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
  kind: ResourceSlice
  metadata:
    # lines omitted for clarity
  spec:
    devices:
    - basic:
        attributes:
          architecture:
            string: Ada Lovelace
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 8.9.0
          cudaDriverVersion:
            version: 12.9.0
          driverVersion:
            version: 575.57.8
          index:
            int: 0
          minor:
            int: 0
          productName:
            string: NVIDIA L4
          type:
            string: gpu
          uuid:
            string: GPU-4d403095-4294-6ddd-66fd-cfe5778ef56e
        capacity:
          memory:
            value: 23034Mi
      name: gpu-0
    - basic:
        attributes:
          architecture:
            string: Ada Lovelace
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 8.9.0
          cudaDriverVersion:
            version: 12.9.0
          driverVersion:
            version: 575.57.8
          index:
            int: 1
          minor:
            int: 1
          productName:
            string: NVIDIA L4
          type:
            string: gpu
          uuid:
            string: GPU-cc326645-f91d-d013-1c2f-486827c58e50
        capacity:
          memory:
            value: 23034Mi
      name: gpu-1
    driver: gpu.nvidia.com
    nodeName: gke-cluster-gpu-pool-9b10ff37-mf70
    pool:
      generation: 1
      name: gke-cluster-gpu-pool-9b10ff37-mf70
      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