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

Cette page explique comment configurer vos charges de travail GPU pour utiliser l'allocation dynamique des ressources dans vos clusters Google Distributed Cloud Bare Metal. L'allocation dynamique de ressources est une API Kubernetes qui vous permet de demander et de partager des ressources génériques, telles que des GPU, entre les pods et les conteneurs. Ces ressources sont gérées par des pilotes tiers.

Avec l'allocation dynamique des ressources, Kubernetes planifie les pods en fonction de la configuration de l'appareil référencé. Les opérateurs d'applications n'ont pas besoin de sélectionner des nœuds spécifiques dans leurs charges de travail ni de s'assurer que chaque pod demande exactement le nombre d'appareils connectés à ces nœuds. Ce processus est semblable à l'allocation de volumes pour le stockage.

Cette fonctionnalité vous aide à exécuter des charges de travail d'IA en allouant de manière dynamique et précise les ressources GPU dans vos clusters Bare Metal. Vous pouvez ainsi améliorer l'utilisation des ressources et les performances pour les charges de travail exigeantes.

Cette page est destinée aux administrateurs, aux architectes et aux opérateurs qui gèrent le cycle de vie de l'infrastructure technologique sous-jacente. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans le contenu Google Cloud , consultez Rôles utilisateur et tâches courantes de GKE Enterprise.

Avant de commencer

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

  • Votre cluster Bare Metal est de 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 avec un GPU associé et le pilote de GPU NVIDIA installé. Pour en savoir plus, consultez Installer ou désinstaller l'opérateur GPU NVIDIA fourni.
  • Vous avez suivi les instructions de la section Pilote NVIDIA DRA pour les GPU afin d'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 de 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 de périphériques GPU. Vos charges de travail doivent faire référence à ResourceClaim pour que Kubernetes attribue 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 de 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 ResourceClaim pour décrire la demande d'accès aux 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 ressources pour les demandes de GPU.

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

    Les exemples de charge 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 de périphérique de calcul unifié (CUDA) 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 de 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. Téléchargez et installez le module de règles SELinux nvidia_container_t, qui est requis pour accéder aux GPU.

      Pour en savoir plus, consultez le dépôt NVIDIA dgx-selinux.

    2. 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
        securityContext:
          seLinuxOptions:
            type: nvidia_container_t
        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 limitations suivantes lorsque vous utilisez l'allocation dynamique de ressources :

  • Lorsque vous utilisez l'OS RHEL, la règle SELinux peut interférer avec les conteneurs qui tentent d'accéder aux GPU. Pour en savoir plus, consultez Utiliser des GPU dans des conteneurs sur RHEL 8 bare metal.

  • 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