Partager via


Utiliser des GPU Windows pour les charges de travail nécessitant beaucoup de ressources système sur Azure Kubernetes Service (AKS) (préversion)

Les processeurs graphiques (GPU) sont souvent utilisés pour les charges de travail nécessitant beaucoup de ressources système, comme le traitement graphique et la visualisation. AKS prend en charge les pools de nœuds Windows et Linux avec GPU pour exécuter des charges de travail Kubernetes gourmandes en calcul.

Cet article vous aide à approvisionner des nœuds Windows avec des GPU programmables sur des clusters AKS nouveaux et existants (préversion).

Machines virtuelles compatibles GPU prises en charge (VM)

Pour voir les machines virtuelles compatibles GPU prises en charge, consultez Tailles de machines virtuelles optimisées pour les GPU dans Azure. Pour les pools de nœuds AKS, nous recommandons une taille minimale Standard_NC6s_v3. La série NVv4 (basée sur des processeurs AMD) n’est pas prise en charge sur AKS.

Remarque

Les machines virtuelles avec GPU contiennent du matériel spécialisé, plus cher et dépendant de la disponibilité régionale. Pour plus d’informations, voir l’outil de tarification et la disponibilité régionale.

Limites

  • La mise à jour d’un pool de nœuds Windows existant pour ajouter un GPU n’est pas prise en charge.
  • Non pris en charge sur Kubernetes version 1.28 et versions ultérieures.

Avant de commencer

  • Cet article suppose que vous disposez d’un cluster AKS. Si vous avez besoin d’un cluster, créez-en un à l'aide d’Azure CLI, d’Azure PowerShell ou du Portail Azure.
  • Vous avez besoin d'Azure CLI version 1.0.0b2 ou ultérieure installée et configurée pour utiliser le champ --skip-gpu-driver-install avec la commande az aks nodepool add. Exécutez az --version pour trouver la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.
  • Vous devez avoir la version 9.0.0b5 ou ultérieure d’Azure CLI installée et configurée pour utiliser le champ --driver-type avec la commande az aks nodepool add. Exécutez az --version pour trouver la version. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.

Obtenir les informations d’identification de votre cluster

  • Obtenez les informations d’identification de votre cluster AKS à l’aide de la commande az aks get-credentials. L’exemple de commande suivant récupère les informations d’identification du cluster myAKSCluster dans le groupe de ressources myResourceGroup :

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

Utilisation du GPU Windows avec installation automatique du pilote

L’utilisation de GPU NVIDIA implique l’installation de différents composants logiciels NVIDIA, tels que le plug-in d’appareil DirectX pour Kubernetes, l’installation du pilote GPU, etc. Lorsque vous créez un pool de nœuds Windows avec une machine virtuelle compatible GPU prise en charge, ces composants et les pilotes NVIDIA CUDA ou GRID appropriés sont installés. Pour les tailles de machine virtuelle de série NC et ND, le pilote CUDA est installé. Pour les tailles de machine virtuelle de la série NV, le pilote GRID est installé.

Important

Les fonctionnalités d’évaluation AKS sont disponibles en libre-service et font l’objet d’un abonnement. Les préversions sont fournies « en l’état » et « en fonction des disponibilités », et sont exclues des contrats de niveau de service et de la garantie limitée. Les préversions AKS sont, dans la mesure du possible, partiellement couvertes par le service clientèle. Telles quelles, ces fonctionnalités ne sont pas destinées à une utilisation en production. Pour plus d’informations, consultez les articles de support suivants :

Installez l’extension Azure CLI aks-preview.

  • Inscrivez ou mettez à jour l’extension aks-preview à l’aide de la commande az extension add ou az extension update.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

Inscrire l’indicateur de fonctionnalité WindowsGPUPreview

  1. Inscrivez l’indicateur de fonctionnalité WindowsGPUPreview à l’aide de la commande az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    

    Quelques minutes sont nécessaires pour que l’état s’affiche Registered (Inscrit).

  2. Vérifiez l’état de l’inscription en utilisant la commande az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "WindowsGPUPreview"
    
  3. Quand l’état reflète Inscrit, actualisez l’inscription du fournisseur de ressources Microsoft.ContainerService à l’aide de la commande az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Créer un pool de nœuds avec GPU Windows (préversion)

Pour créer un pool de nœuds avec GPU Windows, vous devez utiliser une taille de machine virtuelle compatible GPU prise en charge et spécifier la valeur os-type en tant que Windows. La valeur par défaut de Windows os-sku est Windows2022, mais toutes les options Windows os-sku sont prises en charge.

  1. Créer un pool de nœuds Windows activé compatible GPU en utilisant la commande az aks nodepool add.

    az aks nodepool add \
       --resource-group myResourceGroup \
       --cluster-name myAKSCluster \
       --name gpunp \
       --node-count 1 \
       --os-type Windows \
       --kubernetes-version 1.29.0 \
       --node-vm-size Standard_NC6s_v3
    
  2. Vérifiez que vos GPU sont planifiables.

  3. Une fois que vous avez confirmé que vos GPU sont planifiables, vous pouvez exécuter votre charge de travail GPU.

Spécifier le type de pilote de GPU (préversion)

Par défaut, AKS spécifie un type de pilote GPU par défaut pour chaque machine virtuelle compatible avec un GPU prise en charge. Étant donné que la compatibilité des charges de travail et du pilote est importante pour le fonctionnement des charges de travail de GPU, vous pouvez spécifier le type de pilote pour votre nœud de GPU Windows. Cette fonctionnalité n’est pas prise en charge pour les pools de nœuds de GPU Linux.

Lorsque vous créez un pool d’agents Windows avec une prise en charge du GPU, vous avez la possibilité de spécifier le type de pilote de GPU à l’aide de l’indicateur --driver-type.

Les options disponibles sont les suivantes :

  • GRID : pour les applications nécessitant une prise en charge de la virtualisation.
  • CUDA : optimisé pour les tâches de calcul dans les applications informatiques scientifiques et gourmandes en données.

Remarque

Lorsque vous définissez l’indicateur --driver-type, vous prenez la responsabilité d’assurer que le type de pilote sélectionné est compatible avec la taille et la configuration de machine virtuelle spécifiques de votre pool de nœuds. Bien qu’AKS tente de valider la compatibilité, il existe des scénarios où la création du pool de nœuds peut échouer en raison d’incompatibilités entre le type de pilote spécifié et la machine virtuelle ou le matériel sous-jacent.

Pour créer un pool de nœuds avec une prise en charge de GPU Windows doté d’un type de pilote de GPU spécifique, utilisez la commande az aks nodepool add.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name gpunp \
    --node-count 1 \
    --os-type Windows \
    --kubernetes-version 1.29.0 \
    --node-vm-size Standard_NC6s_v3 \
    --driver-type GRID

Par exemple, la commande ci-dessus crée un pool de nœuds avec une prise en charge de GPU à l’aide du type de pilote de GPU GRID. La sélection de ce type de pilote remplace la valeur par défaut du type de pilote CUDA pour les SKU de machines virtuelles de la série NC.

Utilisation du GPU Windows avec installation manuelle du pilote

Lors de la création d’un pool de nœuds Windows avec des tailles de machine virtuelle de série N (NVIDIA GPU) dans AKS, le pilote GPU et le plug-in d’appareil Kubernetes DirectX sont installés automatiquement. Pour contourner cette installation automatique, procédez comme suit :

  1. Ignorer l’installation du pilote GPU (préversion) en utilisant --skip-gpu-driver-install.
  2. Installation manuelle du plug-in d’appareil Kubernetes DirectX.

Ignorer l’installation du pilote GPU (préversion)

L’installation automatique du pilote GPU est activée par défaut dans AKS. Dans certains cas, comme l’installation de vos propres pilotes, vous pouvez ignorer l’installation du pilote GPU.

Important

Les fonctionnalités d’évaluation AKS sont disponibles en libre-service et font l’objet d’un abonnement. Les préversions sont fournies « en l’état » et « en fonction des disponibilités », et sont exclues des contrats de niveau de service et de la garantie limitée. Les préversions AKS sont, dans la mesure du possible, partiellement couvertes par le service clientèle. Telles quelles, ces fonctionnalités ne sont pas destinées à une utilisation en production. Pour plus d’informations, consultez les articles de support suivants :

  1. Inscrivez ou mettez à jour l’extension aks-preview à l’aide de la commande az extension add ou az extension update.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    
  2. Créez un pool de nœuds à l’aide de la commande az aks nodepool add avec l’indicateur --skip-gpu-driver-install pour ignorer l’installation automatique du pilote GPU.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022 \
        --skip-gpu-driver-install
    

Remarque

Si l’utilisation de --node-vm-size n’est pas encore intégrée sur AKS, vous ne pouvez pas utiliser de GPU et --skip-gpu-driver-install ne fonctionne pas.

Installer manuellement le plug-in d’appareil Kubernetes DirectX

Vous pouvez déployer un DaemonSet pour le plug-in d’appareil Kubernetes DirectX, qui exécute un pod sur chaque nœud afin de fournir les pilotes requis pour les GPU.

  • Ajoutez un pool de nœuds à votre cluster avec la commande az aks nodepool add.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name gpunp \
        --node-count 1 \
        --os-type windows \
        --os-sku windows2022
    

Créer un espace de noms et déployer le plug-in d’appareil Kubernetes DirectX

  1. Créez un espace de noms à l’aide de la commande kubectl create namespace.

    kubectl create namespace gpu-resources
    
  2. Créez un fichier nommé k8s-directx-device-plugin.yaml et collez le manifeste YAML suivant fourni dans le cadre du projet de plug-in d’appareil NVIDIA pour Kubernetes :

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: nvidia-device-plugin-daemonset
      namespace: gpu-resources
    spec:
      selector:
        matchLabels:
          name: nvidia-device-plugin-ds
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          # Mark this pod as a critical add-on; when enabled, the critical add-on scheduler
          # reserves resources for critical add-on pods so that they can be rescheduled after
          # a failure.  This annotation works in tandem with the toleration below.
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            name: nvidia-device-plugin-ds
        spec:
          tolerations:
          # Allow this pod to be rescheduled while the node is in "critical add-ons only" mode.
          # This, along with the annotation above marks this pod as a critical add-on.
          - key: CriticalAddonsOnly
            operator: Exists
          - key: nvidia.com/gpu
            operator: Exists
            effect: NoSchedule
          - key: "sku"
            operator: "Equal"
            value: "gpu"
            effect: "NoSchedule"
          containers:
          - image: mcr.microsoft.com/oss/nvidia/k8s-device-plugin:v0.14.1
            name: nvidia-device-plugin-ctr
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: ["ALL"]
            volumeMounts:
              - name: device-plugin
                mountPath: /var/lib/kubelet/device-plugins
          volumes:
            - name: device-plugin
              hostPath:
                path: /var/lib/kubelet/device-plugins
    
  3. Créez le DaemonSet et vérifiez que le plug-in d’appareil NVIDIA a été créé à l’aide de la commande kubectl apply.

    kubectl apply -f nvidia-device-plugin-ds.yaml
    
  4. Maintenant que vous avez correctement installé le plug-in d’appareil NVIDIA, vous pouvez vérifier que vos GPU sont planifiables.

Vérifier que les GPU sont planifiables

Après avoir créé votre cluster, vérifiez que les GPU sont planifiables dans Kubernetes.

  1. Répertoriez les nœuds de votre cluster à l’aide de la commande kubectl get nodes.

    kubectl get nodes
    

    Vous devez obtenir un résultat semblable à l’exemple de sortie qui suit :

    NAME                   STATUS   ROLES   AGE   VERSION
    aks-gpunp-28993262-0   Ready    agent   13m   v1.20.7
    
  2. Vérifiez que les GPU peuvent être planifiés à l’aide de la commande kubectl describe node.

    kubectl describe node aks-gpunp-28993262-0
    

    Sous la section Capacité, le GPU doit apparaître ainsi : microsoft.com/directx: 1. Le résultat doit être similaire à l’exemple condensé de sortie suivant :

    Capacity:
    [...]
     microsoft.com.directx/gpu:                 1
    [...]
    

Utiliser Container Insights pour surveiller l’utilisation du GPU

Container Insights avec AKS supervise les métriques d’utilisation de GPU suivantes :

Nom de métrique Dimension de la métrique (balises) Description
containerGpuDutyCycle container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Pourcentage de temps durant lequel le GPU est resté occupé/en cours de traitement pour un conteneur au cours de la période d’échantillonnage passée (60 secondes). Le cycle d’utilisation est un nombre compris entre 1 et 100.
containerGpuLimits container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Chaque conteneur peut spécifier des limites pour un ou plusieurs GPU. Il n’est pas possible de demander ou de limiter une partie d’un GPU.
containerGpuRequests container.azm.ms/clusterId, container.azm.ms/clusterName, containerName Chaque conteneur peut demander un ou plusieurs GPU. Il n’est pas possible de demander ou de limiter une partie d’un GPU.
containerGpumemoryTotalBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Quantité de mémoire de GPU en octets à disposition pour un conteneur spécifique.
containerGpumemoryUsedBytes container.azm.ms/clusterId, container.azm.ms/clusterName, containerName, gpuId, gpuModel, gpuVendor Quantité de mémoire de GPU en octets utilisée par un conteneur spécifique.
nodeGpuAllocatable container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Nombre de GPU dans un nœud que Kubernetes peut utiliser.
nodeGpuCapacity container.azm.ms/clusterId, container.azm.ms/clusterName, gpuVendor Nombre total de GPU présents dans un nœud.

Nettoyer les ressources

  • Supprimez les objets Kubernetes associés que vous avez créés dans cet article à l’aide de la commande kubectl delete job.

    kubectl delete jobs windows-gpu-workload
    

Étapes suivantes