Résoudre les problèmes liés aux GPU dans GKE


Cette page explique comment résoudre les problèmes liés aux TPU dans Google Kubernetes Engine (GKE).

Installation des pilotes de GPU

Cette section fournit des informations de dépannage pour l'installation automatique des pilotes d'appareils NVIDIA dans GKE.

Échec de l'installation du pilote dans les nœuds Ubuntu

Si vous utilisez des nœuds Ubuntu avec des GPU L4, H100 ou H200 associés, il est possible que le pilote de GPU par défaut installé par GKE ne corresponde pas à la version requise pour ces GPU. Par conséquent, le pod du plug-in d'appareil GPU reste bloqué à l'état "En attente", et vos charges de travail GPU sur ces nœuds peuvent rencontrer des problèmes.

Pour résoudre ce problème pour les GPU L4 et H100, nous vous recommandons de passer aux versions GKE suivantes, qui installent la version 535 du pilote de GPU par défaut:

  • 1.26.15-gke.1483000 et versions ultérieures
  • 1.27.15-gke.1039000 et versions ultérieures
  • 1.28.11-gke.1044000 et versions ultérieures
  • 1.29.6-gke.1073000 et versions ultérieures
  • 1.30.2-gke.1124000 et versions ultérieures

Vous pouvez également installer manuellement la version 535 ou ultérieure du pilote en exécutant la commande suivante :

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R535.yaml

Pour résoudre ce problème pour les GPU H200, vous devez installer manuellement la version 550 ou ultérieure du pilote en exécutant la commande suivante:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R550.yaml

Les plug-ins d'appareils GPU échouent avec des erreurs CrashLoopBackOff

Le problème suivant se produit si vous avez utilisé la méthode d'installation manuelle des pilotes dans votre pool de nœuds avant le 25 janvier 2023, puis que vous avez mis à niveau votre pool de nœuds vers une version de GKE compatible avec l'installation automatique des pilotes. Les deux charges de travail d'installation existent en même temps et tentent d'installer des versions de pilotes en conflit sur vos nœuds.

Le conteneur d'initialisation du plug-in de l'appareil GPU échoue avec l'état Init:CrashLoopBackOff. Les journaux du conteneur sont semblables à ceux-ci :

failed to verify installation: failed to verify GPU driver installation: exit status 18

Essayez les solutions suivantes pour résoudre ce problème :

  • Supprimez le DaemonSet d'installation manuelle des pilotes de votre cluster. Cela supprime la charge de travail d'installation en conflit et permet à GKE d'installer automatiquement un pilote sur vos nœuds.

    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
    
  • Réappliquez le fichier manifeste du DaemonSet d'installation manuelle des pilotes à votre cluster. Le 25 janvier 2023, nous avons mis à jour le fichier manifeste pour ignorer les nœuds qui utilisent l'installation automatique du pilote.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
    
  • Désactivez l'installation automatique des pilotes pour votre pool de nœuds. Le DaemonSet d'installation du pilote existant devrait fonctionner comme prévu une fois l'opération de mise à jour terminée.

    gcloud container node-pools update POOL_NAME \
        --accelerator=type=GPU_TYPE,count=GPU_COUNT,gpu-driver-version=disabled \
        --cluster=CLUSTER_NAME \
        --location=LOCATION
    

    Remplacez les éléments suivants :

    • POOL_NAME : nom du pool de nœuds.
    • GPU_TYPE : type de GPU déjà utilisé par le pool de nœuds.
    • GPU_COUNT : nombre de GPU déjà associés au pool de nœuds.
    • CLUSTER_NAME : nom du cluster GKE contenant le pool de nœuds.
    • LOCATION : emplacement Compute Engine du cluster.

Erreur: "L'image de conteneur cos-nvidia-installer:fixed n'est pas présente avec la stratégie d'extraction "Never" (Jamais)." ou "L'image de conteneur ubuntu-nvidia-installer:fixed n'est pas présente avec la stratégie d'extraction "Never" (Jamais)."

Ce problème se produit lorsque les pods nvidia-driver-installer sont à l'état PodInitializing et que l'appareil du plug-in GPU ou les pods d'installation du pilote GPU signalent l'erreur suivante. Le message d'erreur spécifique dépend du système d'exploitation exécuté sur votre nœud :

COS

Container image "cos-nvidia-installer:fixed" is not present with pull policy of Never.

Ubuntu

Container image "gke-nvidia-installer:fixed" is not present with pull policy of Never.

Ce problème peut se produire lorsque le garbage collector supprime l'image du pilote NVIDIA préchargé pour libérer de l'espace sur un nœud. Lorsque le pod du pilote est recréé ou que son conteneur est redémarré, GKE ne peut pas localiser l'image préchargée.

Pour atténuer le problème de récupération de mémoire lorsque vous exécutez COS, mettez à niveau vos nœuds GKE vers l'une de ces versions contenant le correctif :

  • 1.25.15-gke.1040000 et versions ultérieures
  • 1.26.10-gke.1030000 et versions ultérieures
  • 1.27.6-gke.1513000 et versions ultérieures
  • 1.28.3-gke.1061000 et versions ultérieures

Si vos nœuds exécutent Ubuntu, aucune solution n'est encore disponible pour ce problème de collecte des déchets. Pour atténuer ce problème sur Ubuntu, vous pouvez exécuter un conteneur privilégié qui interagit avec l'hôte pour vous assurer que les pilotes de GPU NVIDIA sont correctement configurés. Pour ce faire, exécutez sudo /usr/local/bin/nvidia-container-first-boot à partir de votre nœud ou appliquez le fichier manifeste suivant :

apiVersion: v1
kind: Pod
metadata:
  name: gke-nvidia-installer-fixup
spec:
  nodeSelector:
    cloud.google.com/gke-os-distribution: ubuntu
  hostPID: true
  containers:
  - name: installer
    image: ubuntu
    securityContext:
      privileged: true
    command:
      - nsenter
      - -at
      - '1'
      - --
      - sh
      - -c
      - "/usr/local/bin/nvidia-container-first-boot"
  restartPolicy: Never

Une autre cause potentielle du problème est la perte des images du pilote NVIDIA après le redémarrage du nœud ou la maintenance de l'hôte. Cela peut se produire sur des nœuds confidentiels ou des nœuds avec GPU qui utilisent un stockage SSD local éphémère. Dans ce cas, GKE précharge les images de conteneur nvidia-installer-driver sur les nœuds et les déplace du disque de démarrage vers le SSD local au premier démarrage.

Pour confirmer qu'un événement de maintenance de l'hôte s'est produit, utilisez le filtre de journal suivant :

resource.type="gce_instance"
protoPayload.serviceName="compute.googleapis.com"
log_id("cloudaudit.googleapis.com/system_event")

Pour résoudre le problème de maintenance de l'hôte, mettez à niveau votre version de GKE vers l'une des versions suivantes:

  • 1.27.13-gke.1166000 et versions ultérieures
  • 1.29.3-gke.1227000 et versions ultérieures
  • 1.28.8-gke.1171000 et versions ultérieures

Erreur : Échec de la configuration des répertoires d'installation du pilote GPU : Échec de la création de la superposition lib64 : Échec de la création du répertoire /usr/local/nvidia/lib64 : mkdir /usr/local/nvidia/lib64 ne correspond à aucun répertoire.

Vous rencontrez cette erreur à partir du conteneur d'installation du pilote de GPU dans le plug-in de l'appareil GPU lorsque NCCL fastsocket est activé :

failed to configure GPU driver installation dirs: failed to create lib64 overlay: failed to create dir /usr/local/nvidia/lib64: mkdir /usr/local/nvidia/lib64: not a directory.

Ce problème ne se produit que sur les clusters et les nœuds exécutant GKE 1.28 et 1.29.

Le problème est causé par une condition de course NCCL fastsocket avec l'installateur du pilote de GPU.

Pour résoudre ce problème, mettez à niveau votre version de GKE vers l'une des versions suivantes :

  • 1.28.8-gke.1206000 et versions ultérieures
  • 1.29.3-gke.1344000 et versions ultérieures

Pour en savoir plus, consultez les notes de version de GPUDirect-TCPXO.

Erreur : Impossible d'obtenir l'appareil nvidia0 : l'appareil nvidia0 n'a pas été trouvé.

L'erreur suivante indique que XID 62 et RmInitAdapter ont échoué pour le GPU avec la version mineure 0 :

Failed to get device for nvidia0: device nvidia0 not found.

La version 525.105.17 du pilote NVIDIA comporte un bug qui peut entraîner des erreurs de communication (XID) et empêcher l'initialisation correcte du GPU, ce qui entraîne un échec de l'initialisation du GPU.

Pour résoudre ce problème, mettez à niveau le pilote NVIDIA vers la version 525.110.11 ou ultérieure.

Réinitialiser les GPU sur les VM A3

Certains problèmes peuvent vous obliger à réinitialiser le GPU sur une VM A3.

Pour réinitialiser le GPU, procédez comme suit:

  1. Supprimez les pods qui demandent des ressources GPU du nœud sur lequel vous devez réinitialiser le GPU.

  2. Désactivez le plug-in d'appareil GPU sur le nœud:

    kubectl get nodes \
        --selector=kubernetes.io/hostname=NODE_NAME \
        --no-headers | awk '{print $1}' \
        | xargs -I{} kubectl label node {} gke-no-default-nvidia-gpu-device-plugin=true
    

    Remplacez NODE_NAME par le nom du nœud.

  3. Connectez-vous à la VM qui est la base du nœud.

  4. Dans la session SSH, réinitialisez le GPU:

    /home/kubernetes/bin/nvidia/bin/nvidia-smi --gpu-reset
    
  5. Réactivez le plug-in de l'appareil GPU:

    kubectl get nodes --selector=kubernetes.io/hostname=NODE_NAME \
        --no-headers \| awk '{print $1}' \
        | xargs -I{} kubectl label node {} gke-no-default-nvidia-gpu-device-plugin=false \
        --overwrite
    

GPU sur les nœuds Confidential GKE Node

Les sections suivantes vous expliquent comment identifier et résoudre les problèmes liés aux GPU exécutés sur des nœuds GKE Confidential.

Les charges de travail GPU ne sont pas planifiées sur les nœuds Confidential GKE Node

Les nœuds Confidential GKE Node nécessitent que vous installiez manuellement un pilote de GPU correspondant au type de GPU sélectionné et à votre version de GKE. Si vos pods GPU ne sont pas planifiés sur des nœuds GKE Confidential et restent à l'état Pending, décrivez le DaemonSet d'installation du pilote:

kubectl --namespace=kube-system get daemonset nvidia-driver-installer -o yaml

Si la sortie renvoie une erreur NotFound, installez le pilote.

Si le DaemonSet est en cours d'exécution, le résultat ressemble à ce qui suit:

apiVersion: apps/v1
kind: DaemonSet
# lines omitted for clarity
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nvidia-driver-installer
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: nvidia-driver-installer
        name: nvidia-driver-installer
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cloud.google.com/gke-accelerator
                operator: Exists
              - key: cloud.google.com/gke-gpu-driver-version
                operator: DoesNotExist
              - key: cloud.google.com/gke-confidential-nodes-instance-type
                operator: In
                values:
                - TDX

Dans cette sortie, vérifiez que le champ nodeAffinity contient la clé cloud.google.com/gke-confidential-nodes-instance-type. Si la sortie ne contient pas cette clé, le DaemonSet d'installation du pilote n'est pas compatible avec les nœuds GKE Confidential.

Déployez le DaemonSet compatible avec les GPU sur les nœuds Confidential GKE Node:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/nvidia-driver-installer/cos/daemonset-confidential.yaml

Une fois les pilotes installés, vérifiez si vos charges de travail GPU démarrent correctement.

Erreur: Échec de l'allocation du vecteur de l'appareil

Le message d'erreur suivant dans les journaux de votre conteneur GPU indique que le GPU a été dissocié de l'instance de VM du nœud:

Failed to allocate device vector A (error code unknown error)!

Cette dissociation peut se produire en raison d'une erreur matérielle ou d'un problème lié aux clés de chiffrement.

Pour résoudre ce problème, redémarrez l'instance de nœud. Cette opération est perturbatrice et affecte toutes les charges de travail sur ce nœud. Pour redémarrer l'instance, procédez comme suit:

  1. Obtenez le nom du nœud qui exécute le pod GPU:

    kubectl get pod POD_NAME -o yaml | grep "nodeName"
    

    Remplacez POD_NAME par le nom du pod défaillant.

    Le résultat ressemble à ce qui suit :

    nodeName: gke-cluster-1-default-pool-b7asdfbt-fd3e
    
  2. Réinitialisez l'instance Compute Engine:

    gcloud compute instances reset NODE_NAME
    

    Remplacez NODE_NAME par le nom du nœud dans la sortie de l'étape précédente.

    Gcloud CLI recherche les VM portant ce nom dans votre projet actif. Si vous êtes invité à sélectionner une zone, spécifiez Y.

  3. Vérifiez si vos charges de travail GPU s'exécutent sans erreur.

Erreur: Échec du déchiffrement avec l'erreur -74

Le message d'erreur suivant dans les journaux de votre nœud indique que les clés de chiffrement du GPU ont été perdues:

Decryption failed with error -74

Cette erreur se produit lorsque le démon de persistance NVIDIA, qui s'exécute sur l'instance de VM de nœud, échoue. Si ce message d'erreur s'affiche, réinitialisez l'instance:

gcloud compute instances reset NODE_NAME

Remplacez NODE_NAME par le nom du nœud défaillant.

Gcloud CLI recherche les VM portant ce nom dans votre projet actif. Si vous êtes invité à sélectionner une zone, spécifiez Y.

Si la réinitialisation de l'instance ne résout pas ce problème, contactez l'Cloud Customer Care ou signalez un bug du produit. Pour en savoir plus, consultez la page Obtenir de l'aide.

Rechercher des erreurs XID

Le daemonset gpu-device-plugin s'exécute dans l'espace de noms kube-system et est responsable des éléments suivants:

  • Planification des charges de travail GPU:allocation de ressources GPU aux pods.
  • Vérification de l'état du GPU:surveillance de l'état de vos GPU.
  • Collecte des métriques du GPU:collecte des métriques liées au GPU, telles que le cycle d'utilisation et l'utilisation de la mémoire.

gpu-device-plugin utilise la bibliothèque de gestion NVIDIA (NVML) pour détecter les erreurs XID. Lorsqu'une erreur XID se produit, le pod gpu-device-plugin exécuté sur le nœud concerné consigne l'erreur. Vous trouverez deux types de journaux d'erreurs XID:

  • Erreurs XID non critiques:
    • Format du journal : Skip error Xid=%d as it is not Xid Critical
    • Signification: ces erreurs sont considérées comme non critiques. Elles peuvent être causées par divers problèmes logiciels ou matériels.
    • Action: GKE n'effectue aucune action automatique pour les erreurs XID non critiques.
  • Erreurs XID critiques:
    • Format du journal : XidCriticalError: Xid=%d, All devices will go unhealthy
    • Signification: ces erreurs indiquent un problème matériel de GPU.
    • Action :
      • GKE marque les ressources GPU du nœud comme défaillantes.
      • GKE empêche la planification des charges de travail GPU sur le nœud.
      • Si la réparation automatique des nœuds est activée, GKE recrée le nœud.

Étapes suivantes