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


Cette page explique comment configurer votre infrastructure Google Kubernetes Engine (GKE) pour prendre en charge l'allocation dynamique des ressources (DRA, Dynamic Resource Allocation). Sur cette page, vous allez créer des clusters pouvant déployer des charges de travail GPU ou TPU, et installer manuellement les pilotes dont vous avez besoin pour activer DRA.

Cette page 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.

À propos de DRA

DRA est une fonctionnalité Kubernetes intégrée qui vous permet de demander, d'allouer et de partager du matériel de manière flexible dans votre cluster entre les pods et les conteneurs. Pour en savoir plus, consultez À propos de l'allocation dynamique des ressources.

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)

Conditions requises

Pour utiliser DRA, votre version de GKE doit être la version 1.32.1-gke.1489001 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 gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande gcloud components update.
  • 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
    

Créer un cluster GKE standard

Créez un cluster en mode Standard qui active les API bêta Kubernetes pour 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

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom de votre cluster.
  • GKE_VERSION : version de GKE à utiliser pour le cluster et les nœuds. Doit être 1.32.1-gke.1489001 ou une version ultérieure.

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.

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 du pilote de GPU avec gpu-driver-version=disabled.
  • 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 des instances g2-standard-24 sur Container-Optimized OS avec deux 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
    

    Remplacez les éléments suivants :

    • NODEPOOL_NAME : nom de votre pool de nœuds.
    • CLUSTER_NAME : nom du cluster
  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.

Créez un pool de nœuds qui utilise des TPU. L'exemple suivant crée un pool de nœuds 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

Remplacez les éléments suivants :

  • NODEPOOL_NAME : nom de votre pool de nœuds.
  • CLUSTER_NAME : nom du cluster

Installer les pilotes DRA

GPU

  1. Extrayez et mettez à jour le graphique Helm contenant 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.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
    

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

TPU

Vous pouvez installer des pilotes DRA pour les TPU à l'aide du chart Helm fourni. Pour accéder aux charts Helm, procédez comme suit :

  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 contenant les graphiques :

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

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

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

Vérifiez que le pod du pilote DRA est en cours d'exécution.

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

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, ResourceSlice ressemble à ce qui suit, selon le type de matériel que vous avez utilisé :

GPU

L'exemple suivant crée une machine g2-standard-24 avec deux 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: ""

Étapes suivantes