Ce document explique comment collecter et interpréter les journaux NCCL/gIB pour résoudre les problèmes de stabilité et de performances sur AI Hypercomputer. Il fournit également des conseils pour effectuer les opérations suivantes :
- Collecter les journaux NCCL.
- Comprendre la structure des entrées de journal NCCL
- Vérifiez que les plug-ins NCCL/gIB sont chargés correctement.
- Vérifiez que les versions de NCCL et gIB sont correctes.
- Résolvez les avertissements et les erreurs NCCL courants.
Collecter les journaux NCCL
Vous pouvez utiliser les journaux de la bibliothèque NVIDIA Collective Communications Library (NCCL) pour déboguer les échecs NCCL. Pour tout débogage de stabilité ou de performances, collectez les journaux NCCL de tous les niveaux de journalisation lorsque vous exécutez la charge de travail problématique. Évitez de vider les entrées de journal dans la console, car le volume important de journaux peut empêcher la tâche de se poursuivre.
Pour collecter les journaux NCCL, définissez les variables d'environnement suivantes :
NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,ENV,GRAPH,NET,COLL,TUNING
NCCL_DEBUG_FILE=DESIRED_PATH/nccl_logs.VM_NAME.RANK_PROCESS_ID
Remplacez les éléments suivants :
DESIRED_PATH : chemin d'accès où vous souhaitez stocker vos fichiers journaux
VM_NAME : nom de la VM
RANK_PROCESS_ID : ID du processus du classement
Format des journaux NCCL
Les journaux NCCL sont semblables à ce qui suit :
# A sample log entry from NCCL core.
a3ultra-vm-0:606:642 [6] NCCL INFO Using network gIB
# A sample log entry from the gIB network plugin.
a3ultra-vm-0:606:642 [6] NCCL INFO NET/gIB : Initializing gIB v1.0.2
Quelle que soit leur source, les journaux NCCL ont un préfixe semblable à ce qui suit :
<VM name>:<pid>:<tid> [<GPU device ID>] <log level> <log content>
Vérifiez que les plug-ins NCCL/gIB sont correctement chargés.
NCCL/gIB est composé de plusieurs plug-ins développés par Google. Si l'un des plug-ins ne se charge pas, cela peut entraîner de mauvaises performances, voire des erreurs fatales dans certains cas.
Plug-in réseau (libnccl-net.so)
Si le plug-in réseau gIB est correctement chargé, vous devriez voir des entrées de journal NCCL semblables à celles-ci :
... NCCL INFO Using network gIB
Si vous voyez des entrées de journal semblables à l'une des suivantes, suivez la procédure décrite dans la section Impossible de charger un objet partagé pour résoudre le problème.
# Cannot find the gIB network plugin.
... NCCL INFO NET/Plugin: Could not find: libnccl-net.so. Using internal network plugin.
# Using the built-in TCP plugin.
... NCCL INFO Using network Socket
# Using the built-in IB plugin.
... NCCL INFO Using network IB
Plug-in Tuner (libnccl-tuner.so)
Si le plug-in du tuner gIB est correctement chargé, vous devriez voir des entrées de journal NCCL semblables à celles-ci :
NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v3 symbol.
NCCL INFO TUNER/Plugin: Using tuner plugin A3xTunerPlugin_v2
Si vous voyez une entrée de journal semblable à la suivante, suivez la procédure décrite dans la section Impossible de charger un objet partagé pour résoudre le problème.
NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v2 symbol, using internal tuner instead.
Plug-in CollNet
Bien que ces entrées de journal indiquent un échec, elles sont attendues et ne sont pas préoccupantes :
NCCL INFO NET/Plugin: Failed to find ncclCollNetPlugin_v8 symbol.
NCCL INFO NET/Plugin: Failed to find ncclCollNetPlugin symbol (>= v5). ncclCollNetPlugin symbols v4 and lower are not supported.
Vérifier la version de NCCL et de gIB
Nous vous recommandons d'utiliser NCCL fourni avec le programme d'installation de gIB pour bénéficier des dernières fonctionnalités, des meilleures performances et de la plus grande stabilité. Toutefois, vous pouvez choisir d'utiliser une version NCCL personnalisée pour les tests, par exemple une version NCCL fournie avec le framework de machine learning de votre choix.
Pour vérifier la version de NCCL et gIB utilisée, recherchez les entrées de journal NCCL suivantes :
# NCCL version.
... NCCL INFO NCCL version 2.23.4+cuda12.2
# gIB version.
... NCCL INFO NET/gIB : Initializing gIB v1.0.2
Vérifier les variables d'environnement NCCL/gIB
Pour obtenir de bonnes performances NCCL, nous fournissons un script que vous pouvez utiliser pour définir les variables d'environnement NCCL recommandées. Avant d'exécuter votre charge de travail, exécutez le script dans le même environnement que la charge de travail. Dans le programme d'installation NCCL/gIB, le script se trouve à l'adresse /usr/local/gib/set_nccl_env.sh. Si vous n'utilisez pas ce script et que les variables d'environnement NCCL sont définies de manière incorrecte, il est possible que le vérificateur de configuration NCCL gIB mette fin à la charge de travail, que NCCL plante ou que les performances de NCCL soient médiocres.
Pour vérifier que les variables d'environnement NCCL/gIB sont correctement appliquées, recherchez des entrées de journal NCCL semblables à celles-ci :
# Explicitly set values.
... NCCL INFO NCCL_P2P_PCI_CHUNKSIZE set by environment to 131072.
# Using default values because the set value is invalid.
... NCCL INFO Invalid value INVALID_VALUE for NCCL_P2P_PCI_CHUNKSIZE, using default 131072.
Comparez les valeurs suivantes avec les variables d'environnement NCCL recommandées.
Vérifier le fichier manifeste de la charge de travail GKE
Sur GKE, le fichier manifeste de votre charge de travail Kubernetes doit être configuré de plusieurs manières pour consommer NCCL/gIB de manière fluide :
- Le fichier manifeste doit monter les binaires NCCL/gIB de
/home/kubernetes/bin/gibsur la VM vers/usr/local/gibdans le conteneur de votre charge de travail. Notez que/home/kubernetes/bin/nvidiasur la VM est automatiquement installé sur/usr/local/nvidiadans votre conteneur de charge de travail. - Votre conteneur de charge de travail doit définir
LD_LIBRARY_PATHsur/usr/local/gib/lib64:/usr/local/nvidia/lib64. - Votre cluster et vos pools de nœuds doivent être configurés avec le multiréseau GKE, et le fichier manifeste de votre charge de travail doit inclure les annotations multiréseau pour éviter de définir
hostNetwork: true.
Un fichier manifeste de charge de travail Kubernetes réel sur GKE ressemble à ce qui suit :
...
metadata:
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"gvnic-1"},
{"interfaceName":"gpu0rdma0","network":"rdma-0"},
{"interfaceName":"gpu1rdma0","network":"rdma-1"},
{"interfaceName":"gpu2rdma0","network":"rdma-2"},
{"interfaceName":"gpu3rdma0","network":"rdma-3"},
{"interfaceName":"gpu4rdma0","network":"rdma-4"},
{"interfaceName":"gpu5rdma0","network":"rdma-5"},
{"interfaceName":"gpu6rdma0","network":"rdma-6"},
{"interfaceName":"gpu7rdma0","network":"rdma-7"}
]
spec:
volumes:
- name: gib
hostPath:
path: /home/kubernetes/bin/gib
...
containers:
- name: my-container
volumeMounts:
- name: gib
mountPath: /usr/local/gib
env:
- name: LD_LIBRARY_PATH
value: /usr/local/gib/lib64:/usr/local/nvidia/lib64
resources:
limits:
nvidia.com/gpu: 8
Vérifier la table GID
Dans RoCE, la table d'identifiants globaux (GID) est utilisée pour adresser de manière unique le trafic RDMA. Si la table GID est endommagée, aucun trafic RDMA ne peut transiter.
Nous fournissons un script show_gids.sh pour afficher le tableau des GID. Dans le programme d'installation, il se trouve à l'emplacement /usr/local/gib/scripts. Si vous avez utilisé notre programme d'installation sans le modifier, il est installé dans /var/lib/gib/scripts sur la VM.
Lorsque vous exécutez le script dans la VM, un résultat semblable à ce qui suit doit s'afficher :
DEV PORT INDEX GID IPv4 VER DEV
--- ---- ----- --- ---- --- ---
mlx5_0 1 0 fe80:0000:0000:0000:689c:b8ff:fedf:3b01 v1 gp0rdma0
mlx5_0 1 1 fe80:0000:0000:0000:689c:b8ff:fedf:3b01 v2 gp0rdma0
mlx5_0 1 2 0000:0000:0000:0000:0000:ffff:c0a8:0202 192.168.2.2 v1 gp0rdma0
mlx5_0 1 3 0000:0000:0000:0000:0000:ffff:c0a8:0202 192.168.2.2 v2 gp0rdma0
...
Examinez le résultat et vérifiez les points suivants :
- La table GID comporte le bon nombre d'entrées :
- Pour A3 Ultra ou A4, 32 entrées avec 4 entrées par CX-7.
- Pour A3 Mega, 32 entrées avec 4 entrées par CX-7.
- Pour A3 High (8 GPU), 16 entrées avec 4 entrées par CX-7.
- Pour A4X, 16 entrées avec 4 entrées par CX-7.
- Les entrées GID de chaque CX-7 ont les index 0, 1, 2 et 3.
- Pour chaque CX-7, les index 2 et 3 ont une adresse IPv4 qui correspond à l'adresse IPv4 de l'appareil (par exemple, à partir de
ip a).
Si l'un de ces éléments est défini sur "false", cela signifie que la table GID est endommagée. Envisagez de redémarrer votre VM ou de relancer le gestionnaire de réseau dans votre OS invité.
Avertissements NCCL
Les journaux NCCL comportent plusieurs niveaux, les avertissements NCCL (NCCL WARN) étant les plus graves. Les avertissements NCCL indiquent généralement des échecs, qui peuvent être fatals ou non. NCCL ne dispose pas d'un niveau de journalisation qui arrête automatiquement la charge de travail.
Impossible de charger un objet partagé
L'erreur suivante se produit lorsqu'un objet partagé ne peut pas être chargé en raison de votre configuration.
error while loading shared libraries: libnccl.so.2: cannot open shared object file: No such file or directory
Pour résoudre le problème :
- Assurez-vous que l'objet partagé est installé dans votre environnement.
- Assurez-vous que le répertoire de l'objet partagé se trouve dans la variable d'environnement
$LD_LIBRARY_PATH.
Échec du mappage du segment à partir de l'objet partagé
L'erreur suivante se produit lorsque le répertoire de l'objet partagé n'est pas exécutable.
error while loading shared libraries: libnccl.so.2: failed to map segment from shared object: Operation not permitted
Pour résoudre le problème, exécutez les commandes suivantes (ces exemples supposent que les binaires gIB sont installés dans /var/lib/gib sur les VM) :
sudo mount --bind /var/lib/gib /var/lib/gib
sudo mount -o remount,exec /var/lib/gib
L'outil de vérification de la configuration invitée ne trouve pas de fichier de configuration
Des entrées de journal comme celles-ci s'affichent lorsque le vérificateur de configuration invité ne trouve pas de fichier de configuration à utiliser.
... NCCL WARN cannot find config file at default paths; you must specify NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE
... NCCL WARN NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE does not exist: /path/to/guest_config.txtpb
Pour résoudre ce problème, vous pouvez définir la variable d'environnement NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE pour qu'elle pointe vers l'emplacement de guest_config.txtpb. L'emplacement par défaut du fichier de configuration de l'installateur NCCL/gIB est /usr/local/gib/configs/guest_config.txtpb.
Nous vous déconseillons de désactiver le vérificateur de configuration invité, car il permet de garantir les bonnes pratiques et une configuration appropriée. Toutefois, si nécessaire, vous pouvez désactiver le vérificateur de configuration invité en définissant la variable d'environnement NCCL_SHIMNET_SHIM_LAYERS sur UNUSED.
Le vérificateur de configuration Invité a appliqué ou recommandé un paramètre
Les erreurs suivantes se produisent lorsque les variables d'environnement NCCL/gIB ne sont pas définies comme recommandé.
# The guest Config Checker enforcing an environment variable.
# This ends the workload.
... NCCL WARN NCCL/NET (shim) mismatch enforced: NCCL_P2P_NVL_CHUNKSIZE=524288 (expected 262144)
# The guest Config Checker recommending an environment variable.
# This does not end the workload.
... NCCL WARN NCCL/NET (shim) mismatch recommended: NCCL_MAX_P2P_NCHANNELS=8 (expected unset)
Pour résoudre le problème :
- Suivez les conseils des journaux du vérificateur de configuration des invités.
- Vérifiez les variables d'environnement NCCL/gIB.
Le tuner ne trouve pas de fichier de configuration
L'erreur suivante se produit lorsque le plug-in du tuner ne trouve pas de fichier de configuration à utiliser.
... NCCL WARN No NCCL_TUNER_CONFIG_PATH provided. Please populate NCCL_TUNER_CONFIG_PATH to use config-based tuner plugin.
Pour résoudre le problème :
- Définissez la variable d'environnement
NCCL_TUNER_CONFIG_PATHpour qu'elle pointe vers l'emplacement detuner_config.txtpb. L'emplacement par défaut du fichier de configuration de l'installateur NCCL/gIB est/usr/local/gib/configs/guest_config.txtpb. - Vérifiez les variables d'environnement NCCL/gIB.
Version de glibc insuffisante
L'erreur suivante se produit lorsque la version glibc locale de votre distribution est trop ancienne, probablement parce que la distribution Linux de votre environnement local est trop ancienne. Les binaires NCCL/gIB nécessitent glibc version 2.29.
/usr/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /usr/local/gib/lib64/libnccl.so.2)
Pour résoudre le problème, mettez à niveau la distribution de votre image (par exemple, Ubuntu 20.04 ou version ultérieure, RockyLinux 9 ou version ultérieure).
Message tronqué
L'erreur suivante se produit lorsque vous utilisez des versions NCCL mixtes pour différents rangs.
... NCCL WARN Message truncated : received ### bytes instead of ###
Pour résoudre le problème, vérifiez votre version NCCL et gIB. Si vous utilisez GKE, vérifiez ou réinstallez votre DaemonSet d'installation NCCL/gIB (consultez les instructions pour A3U et A4 ou les instructions pour A4X).
libibverbs ne peut pas charger la configuration du fournisseur
L'erreur suivante se produit lorsque vous n'avez pas installé le répertoire contenant les binaires gIB sur /usr/local/gib. Cela n'entraînera pas l'échec d'une charge de travail. Toutefois, NCCL revient à l'utilisation de TCP, ce qui peut entraîner de mauvaises performances.
libibverbs: Warning: couldn't open config directory '/usr/local/gib/rdma-core/build/etc/libibverbs.d'.
Pour résoudre le problème, si vous utilisez GKE, vérifiez le fichier manifeste de votre charge de travail.
Erreurs ibv_modify_qp
Vous pouvez rencontrer plusieurs erreurs lorsque le plug-in réseau gIB prépare les QP pour les transactions réseau réelles.
Argument non valide (errno 22)
L'erreur suivante se produit pour l'une des raisons suivantes :
- L'autre extrémité de la QP comporte une table GID endommagée.
- Les variables d'environnement NCCL/gIB sont mal configurées, en particulier
NCCL_IB_GID_INDEX,NCCL_IB_TCetNCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error Invalid argument errno 22
Pour résoudre le problème :
- Recherchez d'autres erreurs
ibv_modify_qpavec la signatureNo data available error 61et suivez les instructions d'atténuation pour l'erreur 61. - Vérifiez les variables d'environnement NCCL/gIB.
Aucune donnée disponible (errno 61)
L'erreur suivante se produit pour l'une des raisons suivantes :
- Cette VM possède une table GID endommagée.
- Les variables d'environnement NCCL/gIB sont mal configurées, en particulier
NCCL_IB_GID_INDEX,NCCL_IB_TCetNCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error No data available errno 61
Pour résoudre le problème, commencez par en identifier la cause :
Si la table GID est cassée, essayez les solutions d'atténuation suivantes :
- (Solution à court terme) Redémarrez le gestionnaire de réseau (par exemple,
networkd) sur la VM jusqu'à ce que l'adresse IP de l'interface problématique soit actualisée.- Vous pouvez redémarrer
networkdsur la VM à l'aide desudo systemctl restart systemd-networkd. - Vous pouvez afficher l'adresse IP de toutes les interfaces à l'aide de
ip a. - Vérifiez que la table GID a été récupérée.
- Vous pouvez redémarrer
- Contactez l'assistance Google pour obtenir de l'aide concernant une solution à long terme.
Connexion expirée (errno 110)
L'erreur suivante se produit en cas de problème de connectivité de base entre les VM.
... NCCL WARN Call to ibv_modify_qp failed with error Connection timed out errno 110
Pour résoudre le problème, contactez l'assistance Google.
QP Got Completion with Error
L'erreur suivante se produit pour l'une des raisons suivantes :
- Problèmes de connexion RDMA sous-jacents (déconnexions, etc.)
- Les variables d'environnement NCCL/gIB sont mal configurées, en particulier
NCCL_IB_TIMEOUTetNCCL_IB_RETRY_CNT.
... NCCL WARN NET/gIB : Got completion from peer 192.168.0.9<55224> with status=12 opcode=0 len=0 vendor err 129 (Recv) localGid ::ffff:192.168.3.6 remoteGids::ffff:192.168.3.9
Pour résoudre le problème, contactez l'assistance Google.