Le plug-in de périphérique NVIDIA est un plug-in de périphérique GPU pour les clusters Kubernetes qui gère les GPU sur chaque nœud, permettant à Kubernetes d'utiliser les ressources GPU plus efficacement. Cette rubrique décrit comment mettre à niveau et redémarrer le plug-in de périphérique NVIDIA, isoler les périphériques GPU et vérifier sa version sur les nœuds Alibaba Cloud Container Service for Kubernetes (ACK) dans un scénario de planification exclusive de GPU.
Remarques relatives à l'utilisation
Lorsque vous déployez le plug-in de périphérique NVIDIA en tant que DaemonSet, tenez compte des points suivants :
Le module complémentaire est installé automatiquement lors de la création d'un cluster.
Si vous désinstallez ce module complémentaire, les nœuds accélérés par GPU mis à l'échelle horizontalement ne pourront pas signaler correctement leurs ressources GPU.
La mise à niveau d'un cluster d'une version antérieure vers la version 1.32 entraîne également la mise à niveau du plug-in de périphérique NVIDIA, passant d'un pod statique à un module complémentaire ACK.
Le DaemonSet utilise un NodeSelector (
ack.node.gpu.schedule=default). Lorsqu'un nœud accéléré par GPU est ajouté au cluster, le script ACK qui ajoute le nœud attache automatiquement cette étiquette au nœud accéléré par GPU. Le DaemonSet déploie ensuite son pod sur le nœud accéléré par GPU.
Si un nœud exécute Ubuntu 22.04 ou Red Hat Enterprise Linux (RHEL) 9,3 64 bits, le plug-in de périphérique NVIDIA peut ne pas fonctionner correctement après l'exécution de la commande
systemctl daemon-reloadousystemctl daemon-reexec. Ce problème survient car le composantack-nvidia-device-plugindéfinit par défaut la variable d'environnementNVIDIA_VISIBLE_DEVICES=allpour les pods, ce qui peut rendre le périphérique GPU inaccessible. Pour plus d'informations, consultez Que faire si l'erreur « Failed to initialize NVML: Unknown Error » se produit lors de l'exécution d'un conteneur GPU ?.-
Si vous mettez à niveau un cluster d'une version antérieure à 1.32 vers la version 1.32 avant le 1er mai 2025, le cluster peut contenir des plug-ins de périphérique NVIDIA déployés à la fois en tant que pods statiques et DaemonSets. Vous pouvez exécuter le script suivant pour trouver les nœuds où le plug-in de périphérique NVIDIA est déployé en tant que pod statique.
Lorsque vous mettez à niveau un pool de nœuds dans un cluster de version 1.31 ou antérieure, le processus met également à niveau le plug-in de périphérique NVIDIA et réinitialise toutes ses configurations non standard.
Différences de version
L'implémentation et les stratégies de gestion du composant ack-nvidia-device-plugin varient selon la version du cluster, comme décrit dans le tableau suivant.
|
Fonctionnalité |
Version 1.32 et ultérieure |
Versions 1.20 à 1.31 |
|
Méthode de déploiement |
DaemonSet |
pod statique |
|
Méthode de gestion |
Page Add-ons dans la console ACK |
Manuelle |
|
Exigence d'étiquette de nœud |
ack.node.gpu.schedule=default |
Aucune |
|
Stratégie de mise à niveau du pool de nœuds |
Mise à niveau manuelle |
Mise à niveau automatique |
Si la version de votre cluster est antérieure à 1,20, nous vous recommandons de mettre à niveau manuellement le cluster .
Prérequis
Utilisez kubectl pour vous connecter au cluster dans Workbench ou CloudShell.
Vérifier la version du plug-in de périphérique NVIDIA
Version 1.32 et ultérieure
Pour les modules complémentaires déployés en tant que DaemonSet, accédez à la page Add-ons dans la console ACK, recherchez le module complémentaire ack-nvidia-device-plugin et consultez sa version sur la carte du module complémentaire.
Versions 1.20 à 1.31
Pour les modules complémentaires déployés en tant que pod statique, exécutez la commande suivante pour vérifier la version du module complémentaire.
kubectl get pods -n kube-system -l component=nvidia-device-plugin \
-o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\t"}{.spec.nodeName}{"\n"}{end}' \
| awk -F'[:/]' '{split($NF, a, "-"); print a[1] "\t" $0}' \
| sort -k1,1V \
| cut -f2- \
| awk -F'\t' '{split($1, img, ":"); print img[NF] "\t" $2}'
Mettre à niveau le plug-in de périphérique NVIDIA
-
Mettez à niveau le module complémentaire ack-nvidia-device-plugin.
Version 1.32 et ultérieure
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Add-ons .
Sur la page Add-ons, recherchez la carte ack-nvidia-device-plugin et cliquez sur Upgrade.
Dans la boîte de dialogue qui s'affiche, cliquez sur OK.
Versions 1.20 à 1.31
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
-
Sélectionnez les nœuds accélérés par GPU que vous souhaitez gérer, cliquez sur Batch Operations en bas de la liste des nœuds, sélectionnez Run Shell Scripts dans la boîte de dialogue Batch Operations, puis cliquez sur OK.
ImportantNous vous recommandons de commencer par mettre à niveau le plug-in de périphérique GPU sur un petit nombre de nœuds accélérés par GPU. Après avoir vérifié que le plug-in fonctionne comme prévu, effectuez la mise à niveau sur les nœuds restants.
Vous êtes redirigé vers la console CloudOps Orchestration Service (OOS). Définissez Execution Mode sur Paused Upon Failure et cliquez sur Next: Parameter Settings.
-
Sur la page des paramètres, sélectionnez Run Shell Script et collez l'exemple de script suivant.
RemarqueDéfinissez le paramètre
RUN_PKG_VERSIONdans le script sur le numéro de version majeure du cluster (par exemple, 1.30). N'entrez pas le numéro de version mineure (par exemple, 1.30.1). Sinon, le script renverra une erreur.Dans le script, modifiez le paramètre
REGION_IDpour qu'il corresponde à l'ID de région du cluster actuel, par exemple cn-beijing.
#!/bin/bash set -xe # Set the Kubernetes major version. RUN_PKG_VERSION=1.30 # Set the region ID. REGION_ID=cn-beijing function update_device_plugin() { base_dir=/tmp/update_device_plugin rm -rf $base_dir mkdir -p $base_dir cd $base_dir region_id=$REGION_ID PKG_URL=https://aliacs-k8s-${region_id}.oss-${region_id}-internal.aliyuncs.com/public/pkg/run/run-${RUN_PKG_VERSION}.tar.gz curl -sSL --retry 3 --retry-delay 2 -o run.tar.gz $PKG_URL tar -xf run.tar.gz local dir=pkg/run/$RUN_PKG_VERSION/module # Replace the image registry address. sed -i "s@registry.cn-hangzhou.aliyuncs.com/acs@registry-${region_id}-vpc.ack.aliyuncs.com/acs@g" $dir/nvidia-device-plugin.yml mkdir -p /etc/kubernetes/device-plugin-backup mkdir -p /etc/kubernetes/manifests # Back up the old configuration file. mv /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes/device-plugin-backup/nvidia-device-plugin.yml.$(date +%s) sleep 5 # Copy the new configuration file. cp -a $dir/nvidia-device-plugin.yml /etc/kubernetes/manifests echo "succeeded to update device plugin" } # Check if the nvidia-device-plugin.yml file exists. if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ]; then update_device_plugin else echo "skip to update device plugin" fi -
Cliquez sur Next: Confirm. Après avoir confirmé les informations, cliquez sur Create.
Une fois la tâche créée, vous êtes automatiquement redirigé vers la page Task Execution Management, où vous pouvez afficher l'état d'exécution de la tâche. La mise à jour est réussie si la valeur Output est
succeeded to update device plugin.
-
Vérifiez si le module complémentaire s'exécute comme prévu.
Exécutez les commandes suivantes pour vérifier si le plug-in de périphérique GPU fonctionne correctement sur le nœud accéléré par GPU.
Utilisez kubectl pour vous connecter au cluster dans Workbench ou CloudShell.
-
Exécutez la commande suivante pour vérifier si le plug-in de périphérique NVIDIA a redémarré :
kubectl get po -n kube-system -l component=nvidia-device-pluginLa colonne AGE dans la sortie d'exemple indique si le pod a redémarré.
NAME READY STATUS RESTARTS AGE nvidia-device-plugin-xxxx 1/1 Running 1 1m -
Après le redémarrage de tous les pods, exécutez le script suivant pour vérifier si les nœuds signalent les ressources GPU :
#!/bin/bash # Get all NVIDIA Device Plugin pods and their corresponding nodes. PODS=$(kubectl get po -n kube-system -l component=nvidia-device-plugin -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}') # Iterate through each pod's node. echo "$PODS" | while IFS=$'\t' read -r pod_name node_name; do # Get the allocatable nvidia.com/gpu resource value for the node. gpu_allocatable=$(kubectl get node "$node_name" -o jsonpath='{.status.allocatable.nvidia\.com/gpu}' 2>/dev/null) # Check if the resource value is 0. if [ "$gpu_allocatable" == "0" ]; then echo "Error: node=$node_name, pod=$pod_name, resource(nvidia.com/gpu) is 0" fi doneSi un nœud signale zéro ressource, consultez Redémarrer le plug-in de périphérique NVIDIA.
Redémarrer le plug-in de périphérique NVIDIA
Dans les scénarios de planification exclusive de GPU dans ACK, le plug-in de périphérique qui signale les périphériques GPU sur un nœud est déployé par défaut en tant que pod. Par conséquent, vous devez effectuer le redémarrage sur le nœud cible.
Version 1.32 et ultérieure
-
Exécutez la commande suivante pour trouver le pod du plug-in de périphérique sur le nœud correspondant.
kubectl get pod -n kube-system -l component=nvidia-device-plugin -o wide | grep <NODE> -
Exécutez la commande suivante pour redémarrer le pod du plug-in de périphérique correspondant.
kubectl delete po <DEVICE_PLUGIN_POD> -n kube-system
Versions 1.20 à 1.31
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
-
Sur la page Node Pools, cliquez sur le nom du pool de nœuds pour accéder à la page de gestion des nœuds, puis connectez-vous au nœud accéléré par GPU cible.
Si le système d'exploitation est ContainerOS, la connexion directe de l'utilisateur est désactivée par défaut pour réduire les risques potentiels de sécurité, et la connexion SSH n'est pas fournie. Si vous devez toujours vous connecter à une instance pour les opérations et la maintenance, consultez Opérations et maintenance pour les nœuds ContainerOS .
-
Sélectionnez les nœuds accélérés par GPU que vous souhaitez gérer, cliquez sur Batch Operations en bas de la liste des nœuds, sélectionnez Execute Shell Command dans la boîte de dialogue Batch Operations, puis cliquez sur OK.
ImportantNous vous recommandons de commencer par redémarrer le plug-in de périphérique sur un petit nombre de nœuds accélérés par GPU. Après avoir vérifié que le plug-in fonctionne comme prévu, effectuez le redémarrage sur les nœuds restants.
Vous êtes redirigé vers la console OOS. Définissez Execution Mode sur Paused Upon Failure et cliquez sur Next: Parameter Settings.
-
Sur la page des paramètres, sélectionnez Run Shell Script et collez l'exemple de script suivant.
#!/bin/bash set -e # Check if the nvidia-device-plugin.yml file exists. if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ]; then # Move the file to restart the static pod. cp -a /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes rm -rf /etc/kubernetes/manifests/nvidia-device-plugin.yml sleep 5 mv /etc/kubernetes/nvidia-device-plugin.yml /etc/kubernetes/manifests echo "the nvidia device is restarted" else echo "no need to restart nvidia device plugin" fi Cliquez sur Next: Confirm. Après avoir confirmé les informations, cliquez sur Create. Vous êtes redirigé vers la page Task Execution Management où vous pouvez afficher l'état de la tâche.
-
Exécutez la commande suivante pour vérifier si le plug-in de périphérique GPU fonctionne correctement sur le nœud accéléré par GPU.
kubectl get nodes <NODE_NAME> -o jsonpath='{.metadata.name} ==> nvidia.com/gpu: {.status.allocatable.nvidia\.com/gpu}'Sortie attendue :
cn-hangzhou.172.16.XXX.XX ==> nvidia.com/gpu: 1Une valeur non nulle pour la ressource étendue
nvidia.com/gpusur un nœud accéléré par GPU indique que le plug-in de périphérique fonctionne correctement.
Modifier la clé de point de contrôle du plug-in de périphérique
Lors de l'allocation d'un périphérique à un pod, le plug-in de périphérique crée un fichier de point de contrôle sur le nœud qui enregistre quels périphériques sont alloués à quels pods. Par défaut, le plug-in de périphérique NVIDIA utilise l'UUID du GPU comme clé unique pour chaque périphérique GPU dans le fichier de point de contrôle. Vous pouvez modifier cette clé pour utiliser l'index du périphérique afin de résoudre des problèmes tels que la perte d'UUID après une migration à froid de machine virtuelle.
Version 1.32 et ultérieure
-
Exécutez la commande suivante pour modifier le DaemonSet du plug-in de périphérique NVIDIA.
kubectl edit ds -n kube-system ack-nvidia-device-plugin -
Ajoutez la variable d'environnement
CHECKPOINT_DEVICE_ID_STRATEGY.env: - name: CHECKPOINT_DEVICE_ID_STRATEGY value: index Redémarrer le plug-in de périphérique NVIDIA pour appliquer les modifications.
Versions 1.20 à 1.31
Vérifiez le tag de l'image dans le fichier
/etc/kubernetes/manifests/nvidia-device-plugin.ymlsur le nœud cible. Le tag indique la version du Device-Plugin. Si la version est 0.9.3 ou ultérieure, aucune action n'est requise. Sinon, mettez à jour la version versv0.9.3-0dd4d5f5-aliyun.-
Modifiez les variables d'environnement du pod statique dans le fichier
/etc/kubernetes/manifests/nvidia-device-plugin.yml. Consultez le code suivant pour ajouter la variable d'environnementCHECKPOINT_DEVICE_ID_STRATEGY.env: - name: CHECKPOINT_DEVICE_ID_STRATEGY value: index Redémarrer le plug-in de périphérique NVIDIA pour appliquer les modifications.
Activer ou désactiver le clôturage automatique des GPU
Le système clôture automatiquement les GPU anormaux lorsqu'une détection et remédiation est déclenchée. Le clôturage automatique diffère de la réparation automatique. La facturation continue pour les instances de nœud avec des GPU clôturés, et vous devez toujours réparer le nœud. Configurez des alertes d'anomalie GPU pour traiter les problèmes rapidement. Si aucune vérification n'est sélectionnée, le clôturage automatique ne se produit pas.
Portée
La version du composant ACK NVIDIA Device Plugin doit être 0.7.0 ou ultérieure et la version du composant ACK Node Problem Detector doit être 1.2.35 ou ultérieure.
Procédure
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Add-ons .
Sur la page Component Management, recherchez le composant ack-nvidia-device-plugin et cliquez sur Configuration sur sa carte.
-
Dans la boîte de dialogue qui s'affiche, activez ou désactivez le clôturage automatique des GPU.
Pour activer : Cochez Enable Automatic GPU Fencing et sélectionnez NPD Checks for Automatic GPU Fencing.
Pour désactiver : Décochez Enable Automatic GPU Fencing ou ne configurez aucune vérification.
Monter les périphériques GDR et activer l'accélération de la copie mémoire GPU
Exigences
À partir de la version v0.5.0, ack-nvidia-device-plugin prend en charge le montage des périphériques GDR dans les conteneurs GPU. Cette fonctionnalité nécessite les éléments suivants :
La version du cluster est 1,32 ou ultérieure.
Le nœud est un nœud Lingjun.
-
Le logiciel GDR est installé sur le nœud.
Vous pouvez vous connecter au nœud et exécuter la commande
lsmod | grep gdrdrvpour vérifier si le module noyau GDR est chargé. La sortie d'exemple est la suivante :gdrdrv 196608 0 nvidia 14680064 88 nvidia_uvm,nvidia_peermem,gdrdrv,nvidia_modeset -
NVIDIA Container Toolkit 1.15.0 ou ultérieur est installé sur le nœud.
Vous pouvez vérifier la version en vous connectant au nœud et en exécutant
nvidia-container-cli --version. Voici un exemple de sortie :cli-version: 1.17.8 lib-version: 1.17.8
Activer l'accélération GDR
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Add-ons .
Sur la page Add-ons, recherchez la carte ack-nvidia-device-plugin et cliquez sur Configuration.
Dans la boîte de dialogue qui s'affiche, sélectionnez Enable GDRCopy for GPU memory copy acceleration (takes effect on Lingjun nodes with GDR software installed and nvidia-container-toolkit version >= 1.15.0).
Vérifier le résultat
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
-
Sur la page Deployments, cliquez sur Create from YAML. Utilisez l'exemple de code suivant pour créer une application.
apiVersion: v1 kind: Pod metadata: name: tensorflow-mnist namespace: default spec: containers: - image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5 name: tensorflow-mnist command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: nvidia.com/gpu: 1 # Request one GPU card for this container. workingDir: /root restartPolicy: Always -
Exécutez la commande suivante pour entrer dans le pod :
kubectl exec -ti tensorflow-mnist -- ls /dev/gdrdrvSortie attendue :
/dev/gdrdrvLa sortie indique que le périphérique gdrdrv a été monté avec succès.
FAQ
Désactiver la fonctionnalité native d'isolation des GPU
Contexte
Lorsqu'un GPU sur un nœud tombe en panne, ACK isole automatiquement le GPU défaillant en utilisant le plug-in de périphérique NVIDIA pour empêcher le planificateur de lui assigner des tâches. Cependant, cette isolation automatique n'effectue pas de réparation automatique. Vous devez toujours redémarrer ou réparer manuellement le nœud. Nous vous recommandons de configurer des alertes pour les exceptions GPU afin de les traiter rapidement. Pour plus d'informations sur la fonctionnalité native d'isolation des GPU du plug-in de périphérique NVIDIA, consultez k8s-device-plugin.
Après l'isolation, si le nœud ne dispose pas de suffisamment de GPU pour répondre aux exigences d'une tâche (par exemple, une tâche nécessite huit cartes mais seulement sept sont disponibles), le planificateur ne peut pas placer la tâche sur ce nœud, laissant les ressources GPU inutilisées.
Lorsque l'état du GPU revient à la normale, le système supprime automatiquement l'isolation du périphérique.
Si vous devez désactiver l'isolation automatique afin que le nœud continue de signaler les ressources pour les GPU défaillants, reportez-vous à la solution suivante.
Solution
-
Confirmez si la fonctionnalité native d'isolation des GPU est activée pour le module complémentaire.
Si elle n'est pas activée, vous n'avez pas besoin d'effectuer les étapes suivantes pour la désactiver.
Version 1.32 et ultérieure
Connectez-vous à la console ACK et vérifiez la version de ack-nvidia-device-plugin sur la page Add-ons du cluster cible. Si la version est v0.1.0, la fonctionnalité d'isolation des GPU est activée.
Versions 1.20 à 1.31
Utilisez kubectl pour vous connecter au cluster dans Workbench ou CloudShell.
-
Vérifiez si le plug-in de périphérique NVIDIA a l'isolation des GPU activée.
check_gpu_isolation_enabled() { echo "Checking nodes with NVIDIA Device Plugin deployed as static pods that have GPU isolation enabled (i.e., DP_DISABLE_HEALTHCHECKS is not set to 'all')..." # Get pod names with the expected label. pods=$(kubectl get pods -n kube-system -l component=nvidia-device-plugin --no-headers -o custom-columns=":metadata.name" 2>/dev/null) if [ -z "$pods" ]; then echo "No pods found with label 'component=nvidia-device-plugin'." return 0 fi found=0 while IFS= read -r pod; do [ -z "$pod" ] && continue # Check if it's a static pod: annotation kubernetes.io/config.source must be "file". config_source=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{.metadata.annotations.kubernetes\.io/config\.source}' 2>/dev/null) if [ "$config_source" != "file" ]; then # Not a static pod (e.g., managed by a DaemonSet), skip. continue fi # Get node name. node=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{.spec.nodeName}' 2>/dev/null) [ -z "$node" ] && continue # Check if DP_DISABLE_HEALTHCHECKS is set to "all". disabled_value=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{range .spec.containers[*]}{range .env[?(@.name=="DP_DISABLE_HEALTHCHECKS")]}{.value}{"\n"}{end}{end}' 2>/dev/null | head -n1) # If not set or not equal to "all", health checks are active, which means isolation is enabled. if [ -z "$disabled_value" ] || [ "$disabled_value" != "all" ]; then echo "Node: $node, Static Pod: $pod" found=1 fi done <<< "$pods" if [ "$found" -eq 0 ]; then echo "No static pods found with GPU isolation enabled." else echo "Note: The above nodes will automatically isolate faulty GPUs via the NVIDIA Device Plugin." fi } check_gpu_isolation_enabledSortie attendue :
Checking nodes with NVIDIA Device Plugin deployed as static pods that have GPU isolation enabled (i.e., DP_DISABLE_HEALTHCHECKS is not set to 'all')... Node: cn-beijing.192.168.XXX.XXX, Static Pod: nvidia-device-plugin-cn-beijing.192.168.XXX.XXX Note: The above nodes will automatically isolate faulty GPUs via NVIDIA Device Plugin.Si la sortie contient
Note: The above nodes will automatically isolate faulty GPUs via NVIDIA Device Plugin., la fonctionnalité d'isolation des GPU est activée.
-
Désactivez la fonctionnalité d'isolation des GPU en mettant à niveau le module complémentaire.
La fonctionnalité native d'isolation des GPU est désactivée par défaut dans la dernière version du module complémentaire NVIDIA Device Plugin. Mettez à niveau le plug-in de périphérique NVIDIA vers la dernière version pour appliquer cette modification.
Rubriques connexes
Pour l'historique des modifications du module complémentaire, consultez ack-nvidia-device-plugin.
Si vous rencontrez des problèmes avec les nœuds accélérés par GPU, consultez Diagnostiquer les problèmes des nœuds accélérés par GPU et FAQ GPU.
Pour plus d'informations sur la planification partagée des GPU, consultez Planification partagée des GPU.