Gérer les charges de travail GPU

Cette page explique comment activer et gérer les charges de travail des unités de traitement graphique (GPU) sur Google Distributed Cloud Connected. Pour profiter de cette fonctionnalité, vous devez disposer d'une configuration matérielle Distributed Cloud connectée contenant des GPU. La prise en charge du GPU est désactivée par défaut. Vous devez activer explicitement la compatibilité avec les GPU sur votre cluster Distributed Cloud connecté. N'oubliez pas que les serveurs Distributed Cloud ne sont pas compatibles avec les charges de travail GPU.

Pour planifier et commander une telle configuration, choisissez la configuration 2 dans les documents suivants :

Si votre rack Distributed Cloud connecté inclut des GPU, vous pouvez configurer vos charges de travail Distributed Cloud connectées pour qu'elles utilisent des ressources GPU.

Les charges de travail connectées Distributed Cloud peuvent s'exécuter dans des conteneurs et sur des machines virtuelles :

  • Charges de travail GPU exécutées dans des conteneurs. Lorsque vous activez la compatibilité avec les GPU, toutes les ressources GPU de votre cluster Distributed Cloud connecté sont initialement allouées aux charges de travail s'exécutant dans des conteneurs. Le pilote de GPU pour exécuter les charges de travail conteneurisées basées sur le GPU est inclus dans Distributed Cloud connecté. Dans chaque conteneur, les bibliothèques GPU sont montées sur /opt/nvidia.

  • Charges de travail GPU exécutées sur des machines virtuelles. Pour exécuter une charge de travail basée sur un GPU sur une machine virtuelle, vous devez allouer des ressources de GPU sur le nœud connecté Distributed Cloud cible aux machines virtuelles, comme décrit plus loin sur cette page. Cela permet de contourner le pilote de GPU intégré et de transmettre directement les GPU aux machines virtuelles. Vous devez installer manuellement un pilote de GPU compatible sur le système d'exploitation invité de chaque machine virtuelle. Vous devez également obtenir toutes les licences nécessaires pour exécuter des pilotes GPU spécialisés sur vos machines virtuelles.

Pour vérifier que des GPU sont présents sur un nœud Distributed Cloud connecté, assurez-vous que le nœud comporte le libellé vm.cluster.gke.io.gpu=true. Si le libellé n'est pas présent sur le nœud, cela signifie qu'aucun GPU n'est installé sur la machine physique Distributed Cloud connectée correspondante.

Activer la prise en charge du GPU

Pour activer la prise en charge des GPU pour vos charges de travail, vous devez créer ou modifier la ressource personnalisée VMRuntime qui contient le paramètre enableGPU avec sa valeur définie sur true, puis l'appliquer à votre cluster connecté Distributed Cloud. Exemple :

apiVersion: vm.cluster.gke.io/v1
kind: VMRuntime
metadata:
  name: vmruntime
spec:
  # Enable GPU support
  enableGPU: true

Selon le type de cluster sur lequel vous souhaitez activer le sous-système de machine virtuelle VM Runtime sur GDC, procédez de l'une des manières suivantes :

  • Pour les clusters de plan de contrôle Cloud sur lesquels vous n'avez pas encore activé le sous-système de machine virtuelle VM Runtime sur GDC, vous devez créer manuellement la ressource VMRuntime.
  • Pour les clusters de plan de contrôle Cloud sur lesquels vous avez déjà activé le sous-système de machine virtuelle VM Runtime sur GDC, vous devez modifier la ressource VMRuntime existante.
  • Pour les clusters de plan de contrôle local, vous devez modifier la ressource VMRuntime existante.

Cette même ressource VMRuntime configure également la prise en charge de l'environnement d'exécution de VM sur GDC sur votre cluster à l'aide du paramètre enable. Assurez-vous de configurer les deux paramètres en fonction des besoins de votre charge de travail. Vous n'avez pas besoin d'activer la compatibilité avec l'environnement d'exécution de VM sur GDC pour activer la compatibilité avec les GPU sur votre cluster connecté Distributed Cloud.

Le tableau suivant décrit les configurations disponibles.

Valeur enable Valeur enableGPU Configuration obtenue
false false Les charges de travail ne s'exécutent que dans des conteneurs et ne peuvent pas utiliser de ressources GPU.
false true Les charges de travail ne s'exécutent que dans des conteneurs et peuvent utiliser des ressources de GPU.
true true

Les charges de travail peuvent s'exécuter sur des machines virtuelles et dans des conteneurs.

Les deux types de charges de travail peuvent utiliser des ressources GPU.

true false

Les charges de travail peuvent s'exécuter sur des machines virtuelles et dans des conteneurs.

Aucun de ces types de charges de travail ne peut utiliser de ressources GPU.

Vérifier que la prise en charge du GPU a été activée

Pour vérifier que la prise en charge des GPU a été activée sur votre cluster, utilisez la commande suivante :

kubectl get pods --namespace vm-system

La commande renvoie un résultat semblable à l'exemple suivant :

NAME                                         READY   STATUS     RESTARTS  AGE
...
gpu-controller-controller-manager-vbv4w      2/2     Running    0         31h
kubevirt-gpu-dp-daemonset-gxj7g              1/1     Running    0         31h
nvidia-gpu-dp-daemonset-bq2vj                1/1     Running    0         31h
...

Dans le résultat, vous pouvez vérifier que les pods du contrôleur de GPU ont été déployés et qu'ils s'exécutent dans l'espace de noms vm-system.

Allouer des ressources de GPU

Par défaut, lorsque vous activez la prise en charge des GPU sur votre cluster connecté Distributed Cloud, toutes les ressources GPU de chaque nœud du cluster sont allouées aux charges de travail conteneurisées. Pour personnaliser l'allocation des ressources GPU sur chaque nœud, suivez les étapes décrites dans cette section.

Configurer l'allocation des ressources GPU

  1. Pour allouer des ressources GPU sur un nœud Distributed Cloud connecté, utilisez la commande suivante pour modifier la ressource personnalisée GPUAllocation sur le nœud cible :

    kubectl edit gpuallocation NODE_NAME --namespace vm-system

    Remplacez NODE_NAME par le nom du nœud Distributed Cloud cible.

    Dans l'exemple suivant, le résultat de la commande affiche l'allocation des ressources GPU par défaut. Par défaut, toutes les ressources GPU sont allouées aux charges de travail conteneurisées (pod), et aucune ressource GPU n'est allouée aux charges de travail de machine virtuelle (vm) :

    ...
    spec:
      pod:   2  # Number of GPUs allocated for container workloads
      vm:    0  # Number of GPUs allocated for VM workloads
    
  2. Définissez vos allocations de ressources GPU comme suit :

    • Pour allouer une ressource de GPU à des charges de travail conteneurisées, augmentez la valeur du champ pod et diminuez celle du champ vm du même montant.
    • Pour allouer une ressource de GPU aux charges de travail des machines virtuelles, augmentez la valeur du champ vm et diminuez la valeur du champ pod du même montant.

    Le nombre total de ressources GPU allouées ne doit pas dépasser le nombre de GPU installés sur la machine physique Distributed Cloud connectée sur laquelle le nœud s'exécute. Sinon, le nœud rejette l'allocation non valide.

    Dans l'exemple suivant, deux ressources de GPU ont été réaffectées des charges de travail conteneurisées (pod) aux charges de travail de machine virtuelle (vm) :

    ...
    spec:
      pod:   0  # Number of GPUs allocated for container workloads
      vm:    2  # Number of GPUs allocated for VM workloads
    

    Lorsque vous avez terminé, appliquez la ressource GPUAllocation modifiée à votre cluster et attendez que son état passe à AllocationFulfilled.

Vérifier l'allocation des ressources GPU

  • Pour vérifier l'allocation de vos ressources GPU, utilisez la commande suivante :

    kubectl describe gpuallocations NODE_NAME --namespace vm-system

    Remplacez NODE_NAME par le nom du nœud connecté Distributed Cloud cible.

    La commande renvoie un résultat semblable à l'exemple suivant :

     Name:         mynode1
     ...
     spec:
       node:  mynode1
       pod:   2  # Number of GPUs allocated for container workloads
       vm:    0  # Number of GPUs allocated for VM workloads
     Status:
       Allocated:  true
       Conditions:
         Last Transition Time:  2022-09-23T03:14:10Z
         Message:
         Observed Generation:   1
         Reason:                AllocationFulfilled
         Status:                True
         Type:                  AllocationStatus
         Last Transition Time:  2022-09-23T03:14:16Z
         Message:
         Observed Generation:   1
         Reason:                DeviceStateUpdated
         Status:                True
         Type:                  DeviceStateUpdated
       Consumption:
         pod:         0/2   # Number of GPUs currently consumed by container workloads
         vm:          0/0   # Number of GPUs currently consumed by VM workloads
       Device Model:  Tesla T4
     Events:          <none>
    

Configurer un conteneur pour qu'il utilise des ressources de GPU

Pour configurer un conteneur s'exécutant sur Distributed Cloud connecté afin d'utiliser des ressources GPU, configurez sa spécification comme indiqué dans l'exemple suivant, puis appliquez-la à votre cluster :

  apiVersion: v1
  kind: Pod
  metadata:
    name: my-gpu-pod
  spec:
    containers:
    - name: my-gpu-container
      image: CUDA_TOOLKIT_IMAGE
      command: ["/bin/bash", "-c", "--"]
      args: ["while true; do sleep 600; done;"]
      env:
      resources:
        requests:
        nvidia.com/gpu-pod-TESLA_T4: 2
        limits:
        nvidia.com/gpu-pod-TESLA_T4: 2
    nodeSelector:
      kubernetes.io/hostname: NODE_NAME

Remplacez les éléments suivants :

  • CUDA_TOOLKIT_IMAGE : chemin d'accès complet et nom de l'image NVIDIA CUDA Toolkit. La version de CUDA Toolkit doit correspondre à la version du pilote NVIDIA exécutée sur votre cluster connecté Distributed Cloud. Pour déterminer la version de votre pilote NVIDIA, consultez les notes de version de Distributed Cloud. Pour trouver la version correspondante de CUDA Toolkit, consultez Compatibilité avec CUDA.
  • NODE_NAME : nom du nœud Distributed Cloud connecté cible.

Configurer une machine virtuelle pour utiliser des ressources GPU

Pour configurer une machine virtuelle exécutée sur Distributed Cloud Connected afin d'utiliser des ressources GPU, configurez sa spécification de ressources VirtualMachine comme indiqué dans l'exemple suivant, puis appliquez-la à votre cluster :

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
...
spec:
  ...
  gpu:
    model: nvidia.com/gpu-vm-TESLA_T4
    quantity: 2

Étapes suivantes