Gérer les appareils GPU avec l'allocation dynamique des ressources

L'allocation dynamique des ressources est une API Kubernetes qui vous permet de demander et de partager des ressources, telles que des GPU, entre les pods et les conteneurs de vos clusters Google Distributed Cloud Bare Metal. Des pilotes tiers gèrent ces appareils, et Kubernetes les alloue de manière dynamique, un peu comme des volumes de stockage. Vos charges de travail d'IA n'ont pas besoin de cibler des nœuds spécifiques ni de demander le nombre exact d'appareils associés. Ce document explique comment configurer vos charges de travail GPU pour qu'elles utilisent l'allocation dynamique des ressources.

Avant de commencer

Avant de configurer vos charges de travail GPU pour qu'elles utilisent l'allocation dynamique des ressources, vérifiez que les conditions préalables suivantes sont remplies :

  • Votre cluster Bare Metal est à la version 1.33.0 ou ultérieure.
  • Votre système d'exploitation est Ubuntu 22.04 ou Red Hat Enterprise Linux (RHEL) 9.4.
  • Vous avez mis à jour votre cluster pour activer l'allocation dynamique des ressources, comme décrit dans Activer l'allocation dynamique des ressources.
  • Vous disposez d'au moins une machine de nœud à laquelle un GPU est associé et sur laquelle le pilote de GPU NVIDIA est installé. Pour en savoir plus, consultez Installer ou désinstaller l'opérateur GPU NVIDIA groupé.
  • Si vous utilisez l'opérateur GPU NVIDIA groupé, la version 1.33.0 ou ultérieure active Container Device Interface (CDI) par défaut. Si vous utilisez un opérateur GPU installé manuellement, assurez-vous que CDI est activé dans le ClusterPolicy.
  • Vous avez suivi les instructions de la page Pilote NVIDIA DRA pour les GPU pour installer le pilote NVIDIA DRA sur tous les nœuds associés à un GPU.

Créer des charges de travail GPU qui utilisent l'allocation dynamique des ressources

Pour que vos charges de travail GPU puissent profiter de l'allocation dynamique des ressources pour demander des GPU, elles doivent se trouver dans un espace de noms partagé avec un ResourceClaim qui décrit la demande d'allocation d'appareils GPU. Vos charges de travail doivent référencer le ResourceClaim pour que Kubernetes puisse attribuer des ressources GPU.

Les étapes suivantes permettent de configurer un environnement dans lequel vos charges de travail utilisent l'allocation dynamique de ressources pour demander des ressources GPU :

  1. Pour créer des ressources liées à l'allocation dynamique des ressources, créez un Namespace dans votre cluster :

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

    Remplacez les éléments suivants :

    • CLUSTER_KUBECONFIG : chemin d'accès au fichier kubeconfig du cluster d'utilisateur.

    • NAMESPACE_NAME par le nom de votre espace de noms d'allocation dynamique des ressources.

  2. Créez un fichier ResourceClaim pour décrire la demande d'accès au GPU :

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    Remplacez RESOURCE_CLAIM_NAME par le nom de votre revendication de ressource pour les requêtes de GPU.

  3. Créez des charges de travail qui font référence au ResourceClaim créé à l'étape précédente.

    Les exemples de charges de travail suivants montrent comment référencer un ResourceClaim nommé gpu-claim dans l'espace de noms dra-test. Les conteneurs du pod pod1 sont des exemples d'architecture CUDA (Compute Unified Device Architecture) de NVIDIA conçus pour exécuter des charges de travail CUDA sur les GPU. Lorsque le pod pod1 se termine correctement, cela indique que la fonctionnalité d'allocation dynamique des ressources fonctionne correctement et que l'allocation dynamique des ressources est prête à gérer les ressources GPU dans votre cluster.

    Ubuntu

    1. Exécutez la commande suivante pour appliquer le fichier manifeste à votre cluster :

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. Exécutez la commande suivante pour appliquer le fichier manifeste à votre cluster :

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
      
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

Limites

Tenez compte des limites suivantes lorsque vous utilisez l'allocation dynamique des ressources :

  • Lorsque vous utilisez l'OS RHEL avec une version compatible de l'opérateur GPU NVIDIA, la spécification Container Device Interface (CDI) gère automatiquement l'injection d'appareils et l'étiquetage SELinux. Vous n'êtes pas obligé d'utiliser la configuration manuelle de la règle SELinux ni de définir le securityContext du pod.

  • Cette fonctionnalité utilise le groupe d'API resource.k8s.io/v1beta1, qui diffère du groupe d'API Kubernetes Open Source pour cette fonctionnalité, resource.k8s.io/v1. Le groupe d'API Open Source v1 offre plus de fonctionnalités et une meilleure stabilité que le groupe d'API v1beta1.

Étapes suivantes