Préparer l'infrastructure GKE pour les charges de travail DRA

Ce document explique comment configurer votre infrastructure Google Kubernetes Engine (GKE) pour prendre en charge l'allocation dynamique des ressources (DRA). La procédure de configuration inclut la création de pools de nœuds utilisant des GPU ou des TPU, ainsi que l'installation de pilotes DRA dans votre cluster. Ce document s'adresse aux administrateurs de plate-forme qui souhaitent réduire la complexité et les frais généraux liés à la configuration de l'infrastructure avec des appareils matériels spécialisés.

Limites

  • Le provisionnement automatique des nœuds n'est pas compatible.
  • Les clusters Autopilot ne sont pas compatibles avec DRA.
  • L'installation automatique des pilotes de GPU n'est pas compatible avec DRA.
  • Vous ne pouvez pas utiliser les fonctionnalités de partage de GPU suivantes :
    • GPU de partage de temps
    • GPU multi-instances
    • Multi-process Service (MPS)
  • Pour les TPU, vous devez activer les versions v1beta1 et v1beta2 des types d'API DRA. Cette limite ne s'applique pas aux GPU, qui peuvent utiliser les versions de l'API v1.

Conditions requises

Pour utiliser DRA, votre cluster GKE doit exécuter la version 1.34 ou ultérieure.

Vous devez également connaître les exigences et les limites suivantes, en fonction du type de matériel que vous souhaitez utiliser :

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez la gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande gcloud components update. Il est possible que les versions antérieures de la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.
  • Disposer d'un cluster GKE Standard exécutant la version 1.34 ou ultérieure. Vous pouvez également créer un cluster régional.

  • Si vous n'utilisez pas Cloud Shell, installez la CLI 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
    
  • Pour utiliser DRA pour les TPU, activez les versions v1beta1 et v1beta2 des types d'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"
    

Créer un pool de nœuds GKE avec des GPU ou des TPU

Sur GKE, vous pouvez utiliser DRA avec des GPU et des TPU. Les paramètres de configuration du pool de nœuds (type de machine, type et nombre d'accélérateurs, système d'exploitation des nœuds et emplacements des nœuds, par exemple) dépendent de vos besoins. Pour créer un pool de nœuds compatible avec DRA, sélectionnez l'une des options suivantes :

GPU

Pour utiliser DRA pour les GPU, vous devez effectuer les opérations suivantes lorsque vous créez le pool de nœuds :

  • Désactivez l'installation automatique des pilotes de GPU en spécifiant l'option gpu-driver-version=disabled dans l'indicateur --accelerator lorsque vous configurez des GPU pour un pool de nœuds.
  • Désactivez le plug-in d'appareil GPU en ajoutant le libellé de nœud gke-no-default-nvidia-gpu-device-plugin=true.
  • Laissez le DaemonSet du pilote DRA s'exécuter sur les nœuds en ajoutant le libellé de nœud nvidia.com/gpu.present=true.

Pour créer un pool de nœuds GPU pour DRA, procédez comme suit :

  1. Créez un pool de nœuds avec le matériel requis. L'exemple suivant crée un pool de nœuds comportant une instance g2-standard-24 sur Container-Optimized OS avec deux 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
    

    Remplacez les éléments suivants :

    • NODEPOOL_NAME : nom de votre pool de nœuds.
    • CLUSTER_NAME : nom du cluster
    • CONTROL_PLANE_LOCATION : région ou zone du plan de contrôle du cluster, par exemple us-central1 ou us-central1-a.
  2. Installez manuellement les pilotes sur vos nœuds Container-Optimized OS ou Ubuntu. Pour obtenir des instructions détaillées, consultez la page Installer manuellement les pilotes de GPU NVIDIA.

TPU

Pour utiliser DRA pour les TPU, vous devez désactiver le plug-in de périphérique TPU en ajoutant le libellé de nœud gke-no-default-tpu-device-plugin=true. L'exemple suivant crée un pool de nœuds TPU Trillium avec la compatibilité 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

Remplacez les éléments suivants :

  • NODEPOOL_NAME : nom de votre pool de nœuds.
  • CLUSTER_NAME : nom du cluster
  • CONTROL_PLANE_LOCATION : région ou zone du plan de contrôle du cluster, par exemple us-central1 ou us-central1-a.

Installer les pilotes DRA

GPU

  1. Extrayez et mettez à jour le chart Helm qui contient le pilote NVIDIA DRA :

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. Installez le pilote NVIDIA DRA avec la version 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'
    

    Pour les nœuds Ubuntu, utilisez le chemin d'accès au répertoire nvidiaDriverRoot="/opt/nvidia".

TPU

  1. Clonez le dépôt ai-on-gke pour accéder aux graphiques Helm contenant les pilotes DRA pour les GPU et les TPU :

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. Accédez au répertoire qui contient les graphiques :

    cd common-infra/common/charts
    
  3. Installez le pilote DRA TPU :

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

Vérifier que votre infrastructure est prête pour DRA

  1. Pour vérifier que vos pods de pilote DRA sont en cours d'exécution, sélectionnez l'une des options suivantes :

    GPU

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

    Le résultat ressemble à ce qui suit :

    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
    
    

    Le résultat ressemble à ce qui suit :

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. Vérifiez que ResourceSlice liste les appareils que vous avez ajoutés :

    kubectl get resourceslices -o yaml
    

    Si vous avez utilisé l'exemple de la section précédente, le résultat est semblable à ce qui suit, selon que vous avez configuré des GPU ou des 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: ""
    

Étapes suivantes