Partager via


Utiliser des GPU pour les charges de travail à calcul intensif dans AKS sur Windows Server

S’applique à : AKS sur Windows Server

Les unités de traitement graphique (GPU) sont utilisées pour les charges de travail nécessitant beaucoup de ressources de calcul, telles que le Machine Learning, le Deep Learning, etc. Cet article explique comment utiliser les GPU pour les charges de travail à calcul intensif dans AKS sur Windows Server.

Avant de commencer

Si vous mettez à jour AKS à partir d’une version préliminaire antérieure à octobre 2022 qui exécute des pools de nœuds compatibles GPU, assurez-vous de supprimer tous les clusters de charge de travail exécutant des GPU avant de commencer. Suivez les étapes décrites dans cette section.

Étape 1 : Désinstaller le pilote hôte Nvidia

Sur chaque ordinateur hôte, accédez à Panneau de configuration > Ajouter ou supprimer des programmes, désinstallez le pilote hôte NVIDIA, puis redémarrez l’ordinateur. Une fois l’ordinateur redémarré, vérifiez que le pilote a été correctement désinstallé. Ouvrez un terminal PowerShell avec élévation de privilèges et exécutez la commande suivante :

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video" 

Vous devez voir que les appareils GPU apparaissent dans un état d’erreur, comme illustré dans cet exemple de sortie :

Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

Étape 2 : Démonter le pilote de l’hôte

Lorsque vous désinstallez le pilote hôte, le GPU physique passe à un état d’erreur. Vous devez démonter tous les appareils GPU de l’hôte.

Pour chaque appareil GPU (contrôleur vidéo 3D), exécutez les commandes suivantes dans PowerShell. Copiez l’ID d’instance ; par exemple, PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 à partir de la sortie de commande précédente :

$id1 = "<Copy and paste GPU instance id into this string>"
$lp1 = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceId $id1).Data[0]
Disable-PnpDevice -InstanceId $id1 -Confirm:$false
Dismount-VMHostAssignableDevice -LocationPath $lp1 -Force

Pour vérifier que les GPU ont été correctement démontés à partir de l’hôte, exécutez la commande suivante. Vous devez placer des GPU dans un Unknown état :

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video"
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

Étape 3 : Téléchargez et installez le pilote d’atténuation NVIDIA

Le logiciel peut inclure des composants développés et détenus par NVIDIA Corporation ou ses licences. L’utilisation de ces composants est régie par le contrat de licence utilisateur final NVIDIA.

Consultez la documentation du centre de données NVIDIA pour télécharger le pilote d’atténuation NVIDIA. Après avoir téléchargé le pilote, décompressez l'archive et installez le pilote d'atténuation sur chaque ordinateur hôte.

Invoke-WebRequest -Uri "https://docs.nvidia.com/datacenter/tesla/gpu-passthrough/nvidia_azure_stack_inf_v2022.10.13_public.zip" -OutFile "nvidia_azure_stack_inf_v2022.10.13_public.zip"
mkdir nvidia-mitigation-driver
Expand-Archive .\nvidia_azure_stack_inf_v2022.10.13_public.zip .\nvidia-mitigation-driver\

Pour installer le pilote d’atténuation, accédez au dossier contenant les fichiers extraits, cliquez avec le bouton droit sur le fichier nvidia_azure_stack_T4_base.inf , puis sélectionnez Installer. Vérifiez que vous avez le bon pilote ; AKS ne prend actuellement en charge que le GPU NVIDIA Tesla T4.

Vous pouvez également installer à l’aide de la ligne de commande en accédant au dossier et en exécutant les commandes suivantes pour installer le pilote d’atténuation :

pnputil /add-driver nvidia_azure_stack_T4_base.inf /install 
pnputil /scan-devices 

Une fois que vous avez installé le pilote d’atténuation, les GPU sont répertoriés à l’état OK sous Nvidia T4_base - Démonté :

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"nvidia"
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

Étape 4 : Répétez les étapes 1 à 3

Répétez les étapes 1 à 3 pour chaque nœud de votre cluster de basculement.

Important

Les machines virtuelles compatibles GPU ne sont pas ajoutées au clustering de basculement dans Windows Server 2019 et Windows Server 2022.

Installer ou mettre à jour AKS

Consultez le guide de démarrage rapide d’AKS à l’aide de PowerShell ou de Windows Admin Center pour installer ou mettre à jour AKS sur Windows Server.

Créer un cluster de calcul avec un pool de nœuds doté de GPU

Actuellement, vous ne pouvez utiliser de pools de nœuds compatibles GPU que sous Linux.

New-AksHciCluster -Name "gpucluster" -nodePoolName "gpunodepool" -nodeCount 2 -osType linux -nodeVmSize Standard_NK6 

Après avoir installé le cluster de charge de travail, exécutez la commande suivante pour obtenir votre Kubeconfig :

Get-AksHciCredential -Name gpucluster

Assurez-vous que vous pouvez planifier des GPU

Une fois votre pool de nœuds GPU créé, vérifiez que vous pouvez planifier des GPU dans Kubernetes. Tout d’abord, listez les nœuds de votre cluster avec la commande kubectl get nodes :

kubectl get nodes
NAME             STATUS  ROLES                 AGE   VERSION
moc-l9qz36vtxzj  Ready   control-plane,master  6m14s  v1.22.6
moc-lhbkqoncefu  Ready   <none>                3m19s  v1.22.6
moc-li87udi8l9s  Ready   <none>                3m5s  v1.22.6

Utilisez maintenant la commande kubectl describe node pour vérifier que les GPU peuvent être planifiés. Dans la section Capacité , le GPU doit apparaître comme nvidia.com/gpu : 1.

kubectl describe <node> | findstr "gpu" 

La sortie doit afficher le ou les GPU à partir du nœud Worker et ressembler à ceci :

         nvidia.com/gpu.compute.major=7
         nvidia.com/gpu.compute.minor=5
         nvidia.com/gpu.count=1
         nvidia.com/gpu.family=turing
         nvidia.com/gpu.machine=Virtual-Machine
         nvidia.com/gpu.memory=16384
         nvidia.com/gpu.product=Tesla-T4
Annotations:    cluster.x-k8s.io/cluster-name: gpucluster
                cluster.x-k8s.io/machine: gpunodepool-md-58d9b96dd9-vsdbl
                cluster.x-k8s.io/owner-name: gpunodepool-md-58d9b96dd9
         nvidia.com/gpu:   1
         nvidia.com/gpu:   1
ProviderID:         moc://gpunodepool-97d9f5667-49lt4
kube-system         gpu-feature-discovery-gd62h       0 (0%)    0 (0%)   0 (0%)      0 (0%)     7m1s
         nvidia.com/gpu   0     0

Exécuter une charge de travail compatible GPU

Une fois que vous avez effectué les étapes précédentes, créez un fichier YAML à des fins de test ; par exemple, gpupod.yaml. Copiez et collez le code YAML suivant dans le nouveau fichier nommé gpupod.yaml, puis enregistrez-le :

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-vector-add
    image: "k8s.gcr.io/cuda-vector-add:v0.1"
    resources:
      limits:
        nvidia.com/gpu: 1

Exécutez la commande suivante pour déployer l’exemple d’application :

kubectl apply -f gpupod.yaml

Vérifiez que le pod a démarré, terminé son exécution et que le GPU est affecté :

kubectl describe pod cuda-vector-add | findstr 'gpu'

La commande précédente doit afficher un GPU affecté :

nvidia.com/gpu: 1
nvidia.com/gpu: 1

Vérifiez le fichier journal du pod pour voir si le test a réussi :

kubectl logs cuda-vector-add

Voici un exemple de sortie de la commande précédente :

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

Si vous recevez une erreur d’incompatibilité de version lors de l’appel à des pilotes, comme « La version du pilote CUDA est insuffisante pour la version du runtime CUDA », passez en revue le graphique de compatibilité de la matrice de pilotes NVIDIA.

Questions fréquentes (FAQ)

Que se passe-t-il lors de la mise à niveau d’un pool de nœuds avec GPU ?

La mise à niveau des pools de nœuds avec GPU suit le même modèle de mise à niveau propagée que celui utilisé pour les pools de nœuds standard. Pour que les pools de nœuds avec GPU d’une nouvelle machine virtuelle soient correctement créés sur la machine hôte physique, il nécessite qu’un ou plusieurs GPU physiques soient disponibles pour l’attribution réussie de l’appareil. Cette disponibilité garantit que vos applications peuvent continuer à s’exécuter lorsque Kubernetes planifie des pods sur ce nœud mis à niveau.

Avant de mettre à niveau :

  1. Planifiez les temps d’arrêt pendant la mise à niveau.
  2. Disposer d’un GPU supplémentaire par hôte physique si vous exécutez le Standard_NK6 ou 2 GPU supplémentaires si vous exécutez Standard_NK12. Si vous exécutez à pleine capacité et que vous n’avez pas de GPU supplémentaire, nous vous recommandons d’effectuer un scale-down de votre pool de nœuds vers un nœud unique avant la mise à niveau, puis de monter en puissance après la mise à niveau.

Que se passe-t-il si je n’ai pas de GPU physiques supplémentaires sur mon ordinateur physique pendant une mise à niveau ?

Si une mise à niveau est déclenchée sur un cluster sans ressources GPU supplémentaires pour faciliter la mise à niveau propagée, le processus de mise à niveau se bloque jusqu’à ce qu’un GPU soit disponible. Si vous exécutez à pleine capacité et que vous n’avez pas de GPU supplémentaire, nous vous recommandons d’effectuer un scale-down de votre pool de nœuds vers un nœud unique avant la mise à niveau, puis de monter en puissance une fois la mise à niveau réussie.

Étapes suivantes