Partager via


Utiliser des GPU pour les charges de travail nécessitant beaucoup de ressources dans AKS sur Azure Local

S’applique à : AKS sur Azure Local

Remarque

Pour plus d’informations sur les GPU dans AKS sur Windows Server, consultez Utiliser des GPU dans AKS sur Windows Server.

Les unités de traitement graphique (GPU) sont utiles pour les charges de travail nécessitant beaucoup de ressources de calcul, telles que le Machine Learning, le Deep Learning et bien plus encore. Cet article explique comment utiliser des GPU pour les charges de travail nécessitant beaucoup de ressources de calcul dans AKS activées par Azure Arc.

Modèles GPU pris en charge

Les modèles GPU suivants sont pris en charge par AKS sur Azure Local. Notez que les GPU sont uniquement pris en charge sur les pools de nœuds de système d’exploitation Linux. Les GPU ne sont pas pris en charge sur les pools de nœuds de système d’exploitation Windows.

Fabricant Modèle GPU Version prise en charge
NVidia A2 2311.2
NVidia A16 2402.0
NVidia T4 2408.0
NVidia L4 2512.0
NVidia L40 2512.0
NVidia L40S 2512.0

Tailles des machines virtuelles GPU prises en charge

Les tailles de machine virtuelle suivantes pour chaque modèle GPU sont prises en charge par AKS sur Azure Local.

Les Nvidia T4 sont pris en charge par les SKU NK T4

Taille de la machine virtuelle les GPU Mémoire GPU : GiB Processeurs virtuels Mémoire : Gio
Standard_NK6 1 8 6 12
Standard_NK12 2 16 12 Vingt-quatre

Les Nvidia A2 sont pris en charge par les SKU NC2 A2

Taille de la machine virtuelle les GPU Mémoire GPU : GiB Processeurs virtuels Mémoire : Gio
Standard_NC4_A2 1 16 4 8
Standard_NC8_A2 1 16 8 16
Standard_NC16_A2 2 32 16 64
Standard_NC32_A2 2 32 32 128

Les Nvidia A16 sont pris en charge par les SKU NC2 A16

Taille de la machine virtuelle les GPU Mémoire GPU : GiB Processeurs virtuels Mémoire : Gio
Standard_NC4_A16 1 16 4 8
Standard_NC8_A16 1 16 8 16
Standard_NC16_A16 2 32 16 64
Standard_NC32_A16 2 32 32 128

Nvidia L4 est pris en charge par les numéros de référence SKU NC2 L4 (aperçu)

Taille de la machine virtuelle les GPU Mémoire GPU : GiB Processeurs virtuels Mémoire : Gio
Standard_NC16_L4_1 1 Vingt-quatre 16 64
Standard_NC16_L4_2 2 48 16 64
Standard_NC32_L4_1 1 Vingt-quatre 32 128
Standard_NC32_L4_2 2 48 32 128

Nvidia L40 est pris en charge par les SKU NC2 L40 (version préliminaire)

Taille de la machine virtuelle les GPU Mémoire GPU : GiB Processeurs virtuels Mémoire : Gio
Standard_NC16_L40_1 1 48 16 64
Standard_NC16_L40_2 2 96 16 64
Standard_NC32_L40_1 1 48 32 128
Standard_NC32_L40_2 2 96 32 128

Nvidia L40S est pris en charge par les SKU NC2 L40S (version préliminaire)

Taille de la machine virtuelle les GPU Mémoire GPU : GiB Processeurs virtuels Mémoire : Gio
Standard_NC16_L40S_1 1 48 16 64
Standard_NC16_L40S_2 2 96 16 64
Standard_NC32_L40S_1 1 48 32 128
Standard_NC32_L40S_2 2 96 32 128

Avant de commencer

Pour utiliser des GPU dans AKS Arc, veillez à installer les pilotes GPU nécessaires avant de commencer le déploiement du cluster. Suivez les étapes décrites dans cette section.

Étape 1 : installer le système d’exploitation

Installez le système d’exploitation local Azure localement sur chaque serveur de votre cluster Local Azure.

Étape 2 : 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 | where {$_.friendlyname -eq "3D Video Controller"}

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 3 : détacher le pilote hôte 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 sont correctement démontés à partir de l’hôte, exécutez la commande suivante. Vous devez voir les GPU dans un Unknown état :

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -eq "3D Video Controller"}
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 4 : Télécharger et installer 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. Vous pouvez suivre ce script PowerShell pour télécharger le pilote d’atténuation et l’extraire :

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 qui contient les fichiers extraits, puis sélectionnez le fichier de pilote GPU en fonction du type GPU réel installé sur vos hôtes locaux Azure. Par exemple, si le type est A2 GPU, cliquez avec le bouton droit sur le fichier nvidia_azure_stack_A2_base.inf , puis sélectionnez Installer.

Vous pouvez également installer le pilote d’atténuation en exécutant les commandes suivantes à partir de la ligne de commande :

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

Après avoir installé le pilote d’atténuation, les GPU sont répertoriés dans l’état OK sous Nvidia A2_base - Démonté :

Get-PnpDevice  | select status, class, friendlyname, instanceid | where {$_.friendlyname -match "Nvidia"}"
OK       Nvidia A2_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia A2_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

Étape 5 : répéter les étapes 1 à 4

Répétez les étapes 1 à 4 pour chaque serveur de votre cluster Local Azure.

Étape 6 : continuer le déploiement du cluster local Azure

Poursuivez le déploiement du cluster local Azure en suivant les étapes du déploiement local Azure.

Obtenir la liste des références SKU de machine virtuelle compatibles GPU disponibles

Une fois le déploiement de cluster local Azure terminé, exécutez la commande CLI suivante pour afficher les références SKU de machine virtuelle disponibles sur votre déploiement. Si vous installez correctement vos pilotes GPU, la commande répertorie les références SKU de machine virtuelle GPU correspondantes :

az aksarc vmsize list --custom-location <custom location ID> -g <resource group name>

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

Actuellement, vous pouvez uniquement utiliser des pools de nœuds compatibles GPU pour les pools de nœuds Linux. Pour créer un cluster Kubernetes :

az aksarc create -n <aks cluster name> -g <resource group name> --custom-location <custom location ID> --vnet-ids <vnet ID>

L’exemple suivant ajoute un pool de nœuds avec deux nœuds AVEC GPU (NVIDIA A2) avec une référence SKU de machine virtuelle Standard_NC4_A2 :

az aksarc nodepool add --cluster-name <aks cluster name> -n <node pool name> -g <resource group name> --node-count 2 --node-vm-size Standard_NC4_A2 --os-type Linux

Assurez-vous que vous pouvez planifier des GPU

Après avoir créé votre pool de nœuds GPU, 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 décrire le nœud pour confirmer que vous pouvez planifier les GPU. Dans la section Capacité , le GPU apparaît comme nvidia.com/gpu : 1.

kubectl describe <node> | findstr "gpu" 

La sortie affiche les GPU à partir du nœud Worker et ressemble à l’exemple suivant :

Capacity: 
  cpu:                4 
  ephemeral-storage:  103110508Ki 
  hugepages-1Gi:      0 
  hugepages-2Mi:      0 
  memory:             7865020Ki 
  nvidia.com/gpu:     1 
  pods:               110

Exécuter une charge de travail compatible GPU

Une fois que vous avez effectué les étapes précédentes, créez un fichier YAML pour les tests, tels que 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 la mise à niveau réussisse, Kubernetes doit créer de nouvelles machines virtuelles sur la machine hôte physique qui ont un ou plusieurs GPU physiques disponibles pour l’affectation d’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 deux 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, effectuez un scale-down de votre pool de nœuds vers un seul nœud avant la mise à niveau, puis effectuez un scale-up une fois la mise à niveau réussie.

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

Si vous déclenchez une mise à niveau 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, effectuez un scale-down de votre pool de nœuds vers un seul nœud avant la mise à niveau, puis effectuez un scale-up une fois la mise à niveau réussie.

Étapes suivantes