Questo documento descrive come raccogliere e interpretare i log NCCL/gIB per risolvere i problemi di stabilità e prestazioni su AI Hypercomputer, incluse indicazioni su come ottenere quanto segue:
- Raccogli i log NCCL.
- Comprendere la struttura delle voci di log NCCL.
- Verifica che i plug-in NCCL/gIB siano caricati correttamente.
- Verifica che le versioni di NCCL e gIB siano corrette.
- Risolvi i problemi relativi agli avvisi e agli errori NCCL comuni.
Raccogliere i log NCCL
Puoi utilizzare i log della NVIDIA Collective Communications Library (NCCL) per eseguire il debug degli errori NCCL. Per il debug di stabilità o prestazioni, raccogli i log NCCL da tutti i livelli di logging mentre esegui il carico di lavoro problematico. Evita di scaricare le voci di log nella console, perché il volume elevato dei log potrebbe impedire la continuazione del job.
Per raccogliere i log NCCL, imposta le seguenti variabili di ambiente:
NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,ENV,GRAPH,NET,COLL,TUNING
NCCL_DEBUG_FILE=DESIRED_PATH/nccl_logs.VM_NAME.RANK_PROCESS_ID
Sostituisci quanto segue:
DESIRED_PATH: il percorso in cui vuoi archiviare i file di log
VM_NAME: il nome della VM
RANK_PROCESS_ID: l'ID processo del rank
Formato del log NCCL
I log NCCL sono simili ai seguenti:
# 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
Indipendentemente dalla loro origine, i log NCCL hanno un prefisso simile al seguente:
<VM name>:<pid>:<tid> [<GPU device ID>] <log level> <log content>
Verifica che i plug-in NCCL/gIB siano caricati correttamente
NCCL/gIB è costituito da più plug-in sviluppati da Google. Il mancato caricamento di uno dei plug-in può comportare prestazioni scadenti e, in alcuni casi, errori irreversibili.
Plug-in di rete (libnccl-net.so)
Se il plug-in di rete gIB viene caricato correttamente, dovresti visualizzare voci di log NCCL simili alle seguenti:
... NCCL INFO Using network gIB
Se visualizzi voci di log simili a una delle seguenti, segui i passaggi descritti nella sezione Impossibile caricare un oggetto condiviso per risolvere il problema.
# 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 del tuner (libnccl-tuner.so)
Se il plug-in gIB tuner viene caricato correttamente, dovresti visualizzare voci di log NCCL simili alle seguenti:
NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v3 symbol.
NCCL INFO TUNER/Plugin: Using tuner plugin A3xTunerPlugin_v2
Se vedi una voce di log simile alla seguente, segui i passaggi descritti nella sezione Impossibile caricare un oggetto condiviso per risolvere il problema.
NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v2 symbol, using internal tuner instead.
Plug-in CollNet
Sebbene queste voci di log indichino un errore, sono previste e non sono motivo di preoccupazione:
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.
Controllare la versione di NCCL e gIB
Ti consigliamo di utilizzare NCCL incluso nel programma di installazione di gIB per garantire le funzionalità più recenti, le migliori prestazioni e la massima stabilità. Tuttavia, puoi scegliere di utilizzare una versione NCCL personalizzata per i test, ad esempio una versione NCCL inclusa nel framework di machine learning che preferisci.
Per controllare la versione di NCCL e gIB utilizzata, cerca le seguenti voci di log NCCL:
# NCCL version.
... NCCL INFO NCCL version 2.23.4+cuda12.2
# gIB version.
... NCCL INFO NET/gIB : Initializing gIB v1.0.2
Verifica le variabili di ambiente NCCL/gIB
Per ottenere buone prestazioni di NCCL, forniamo uno script che puoi utilizzare per impostare le variabili di ambiente NCCL consigliate. Prima di eseguire il workload, esegui l'origine dello script nello stesso ambiente del workload. All'interno del programma di installazione di NCCL/gIB, lo script si trova in /usr/local/gib/set_nccl_env.sh. Se non utilizzi questo script e di conseguenza le variabili di ambiente NCCL vengono impostate in modo errato, è possibile che gIB NCCL Config Checker termini il carico di lavoro, NCCL si arresti in modo anomalo o le prestazioni di NCCL siano scarse.
Per verificare che le variabili di ambiente NCCL/gIB siano applicate correttamente, cerca voci di log NCCL simili alle seguenti:
# 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.
Confronta i seguenti valori con le variabili di ambiente NCCL consigliate.
Controlla il manifest del workload GKE
Su GKE, il manifest del workload Kubernetes richiede diverse configurazioni per utilizzare senza problemi NCCL/gIB:
- Il manifest deve montare i file binari NCCL/gIB da
/home/kubernetes/bin/gibsulla VM a/usr/local/gibnel container del workload. Tieni presente che/home/kubernetes/bin/nvidiasulla VM viene montato automaticamente su/usr/local/nvidianel contenitore del workload. - Il container del workload deve impostare
LD_LIBRARY_PATHsu/usr/local/gib/lib64:/usr/local/nvidia/lib64. - Il cluster e i pool di nodi devono avere configurato il networking multiplo GKE e il manifest del workload deve includere le annotazioni di networking multiplo per evitare la necessità di impostare
hostNetwork: true.
Un manifest di carico di lavoro Kubernetes effettivo su GKE è simile al seguente:
...
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
Controllare la tabella GID
In RoCE, la tabella degli identificatori globali (GID) viene utilizzata per indirizzare in modo univoco il traffico RDMA. Se la tabella GID è danneggiata, non può passare alcun traffico RDMA.
Forniamo uno script show_gids.sh per mostrare la tabella GID. Nel programma di installazione, si trova in /usr/local/gib/scripts. Se hai utilizzato il nostro programma di installazione senza modifiche, viene installato in /var/lib/gib/scripts sulla VM.
Quando esegui lo script nella VM, dovresti vedere un output simile al seguente:
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
...
Esamina l'output e conferma quanto segue:
- La tabella GID ha il numero corretto di voci:
- Per A3 Ultra o A4, 32 voci con 4 voci per CX-7.
- Per A3 Mega, 32 voci con 4 voci per CX-7.
- Per A3 High (8 GPU), 16 voci con 4 voci per CX-7.
- Per A4X, 16 voci con 4 voci per CX-7.
- Le voci GID di ogni CX-7 hanno gli indici 0, 1, 2 e 3.
- Per ogni CX-7, gli indici 2 e 3 hanno un indirizzo IPv4 e questo indirizzo IP corrisponde all'IPv4 del dispositivo (ad esempio da
ip a).
Se uno di questi elementi è falso, la tabella GID è danneggiata. Valuta la possibilità di riavviare la VM o il gestore di rete nel sistema operativo guest.
Avvisi NCCL
I log NCCL hanno diversi livelli, con gli avvisi NCCL (NCCL WARN) che sono i più gravi. Gli avvisi NCCL in genere indicano errori, che potrebbero essere fatali o meno. NCCL non ha un livello di log che arresta automaticamente il workload.
Impossibile caricare un oggetto condiviso
Il seguente errore si verifica quando non è possibile caricare un oggetto condiviso a causa della tua configurazione.
error while loading shared libraries: libnccl.so.2: cannot open shared object file: No such file or directory
Per risolvere il problema:
- Assicurati che l'oggetto condiviso sia installato nel tuo ambiente.
- Assicurati che la directory dell'oggetto condiviso si trovi nella variabile di ambiente
$LD_LIBRARY_PATH.
Impossibile mappare il segmento dall'oggetto condiviso
Il seguente errore si verifica quando la directory dell'oggetto condiviso non è eseguibile.
error while loading shared libraries: libnccl.so.2: failed to map segment from shared object: Operation not permitted
Per risolvere il problema, esegui questi comandi (questi esempi presuppongono che i file binari gIB siano installati in /var/lib/gib sulle VM):
sudo mount --bind /var/lib/gib /var/lib/gib
sudo mount -o remount,exec /var/lib/gib
Guest Config Checker non riesce a trovare un file di configurazione
Le voci di log come queste vengono visualizzate quando Config Checker ospite non riesce a trovare un file di configurazione da utilizzare.
... 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
Per risolvere il problema, puoi impostare la variabile di ambiente NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE in modo che punti alla posizione di guest_config.txtpb. La posizione predefinita del programma di installazione NCCL/gIB per il file di configurazione è /usr/local/gib/configs/guest_config.txtpb.
Ti sconsigliamo di disattivare il controllo della configurazione ospite perché contribuisce a garantire le best practice e la corretta configurazione. Tuttavia, se necessario, puoi disattivare il controllo della configurazione guest impostando la variabile di ambiente NCCL_SHIMNET_SHIM_LAYERS su UNUSED.
Controllo configurazione ospite ha applicato o consigliato un'impostazione
I seguenti errori si verificano quando le variabili di ambiente NCCL/gIB non sono impostate come consigliato.
# 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)
Per risolvere il problema:
- Segui le indicazioni dei log di Config Checker per gli ospiti.
- Verifica le variabili di ambiente NCCL/gIB.
Il sintonizzatore non riesce a trovare un file di configurazione
Il seguente errore si verifica quando il plug-in del sintonizzatore non riesce a trovare un file di configurazione da utilizzare.
... NCCL WARN No NCCL_TUNER_CONFIG_PATH provided. Please populate NCCL_TUNER_CONFIG_PATH to use config-based tuner plugin.
Per risolvere il problema:
- Imposta la variabile di ambiente
NCCL_TUNER_CONFIG_PATHin modo che punti alla posizione dituner_config.txtpb. La posizione predefinita del programma di installazione NCCL/gIB per il file di configurazione è/usr/local/gib/configs/guest_config.txtpb. - Verifica le variabili di ambiente NCCL/gIB.
Versione di glibc insufficiente
Il seguente errore si verifica quando la versione glibc locale della distribuzione è troppo vecchia, molto probabilmente perché la distribuzione Linux nel tuo ambiente locale è troppo vecchia. I file binari NCCL/gIB richiedono glibc versione 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)
Per risolvere il problema, esegui l'upgrade della distribuzione dell'immagine (ad esempio Ubuntu 20.04 o versioni successive, RockyLinux 9 o versioni successive).
Messaggio troncato
Si verifica il seguente errore quando utilizzi versioni NCCL miste tra i ranghi.
... NCCL WARN Message truncated : received ### bytes instead of ###
Per risolvere il problema, controlla la versione di NCCL e gIB. Se utilizzi GKE, controlla o reinstalla il daemonset dell'installer NCCL/gIB (consulta le istruzioni per A3U e A4 o le istruzioni per A4X).
libibverbs non può caricare la configurazione del provider
Il seguente errore si verifica quando non hai montato la directory contenente i file binari gIB su /usr/local/gib. Ciò non causerà un errore del workload. Tuttavia, NCCL torna a utilizzare TCP e può causare prestazioni scadenti.
libibverbs: Warning: couldn't open config directory '/usr/local/gib/rdma-core/build/etc/libibverbs.d'.
Per risolvere il problema, se utilizzi GKE, controlla il manifest del carico di lavoro.
ibv_modify_qp errors
Potresti riscontrare diversi errori durante la preparazione delle query di produzione per le transazioni di rete effettive da parte del plug-in di rete gIB.
Argomento non valido (errno 22)
Il seguente errore si verifica per uno dei seguenti motivi:
- L'altra estremità della query ha una tabella GID danneggiata.
- Le variabili di ambiente NCCL/gIB sono configurate in modo errato, in particolare
NCCL_IB_GID_INDEX,NCCL_IB_TCeNCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error Invalid argument errno 22
Per risolvere il problema:
- Cerca altri errori
ibv_modify_qpcon la firmaNo data available error 61e segui le istruzioni di mitigazione per l'errore 61. - Verifica le variabili di ambiente NCCL/gIB.
Nessun dato disponibile (errno 61)
Il seguente errore si verifica per uno dei seguenti motivi:
- Questa VM ha una tabella GID danneggiata.
- Le variabili di ambiente NCCL/gIB sono configurate in modo errato, in particolare
NCCL_IB_GID_INDEX,NCCL_IB_TCeNCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error No data available errno 61
Per risolvere il problema, verifica innanzitutto la causa:
Se la tabella GID è danneggiata, prova le seguenti mitigazioni:
- (A breve termine) Riavvia il gestore di rete (ad esempio
networkd) sulla VM finché l'indirizzo IP dell'interfaccia problematica non viene aggiornato.- Puoi riavviare
networkdsulla VM utilizzandosudo systemctl restart systemd-networkd. - Puoi visualizzare l'indirizzo IP di tutte le interfacce utilizzando
ip a. - Controlla che la tabella GID sia stata recuperata.
- Puoi riavviare
- Contatta l'Assistenza Google per ricevere supporto per una soluzione a lungo termine.
Timeout della connessione (errno 110)
Si verifica il seguente errore quando si verifica un problema di connettività di base tra le VM.
... NCCL WARN Call to ibv_modify_qp failed with error Connection timed out errno 110
Per risolvere il problema, contatta l'Assistenza Google.
QP Got Completion with Error
Il seguente errore si verifica per uno dei seguenti motivi:
- Problemi di connessione RDMA sottostanti (link flap e così via).
- Le variabili di ambiente NCCL/gIB sono configurate in modo errato, in particolare
NCCL_IB_TIMEOUTeNCCL_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
Per risolvere il problema, contatta l'Assistenza Google.