NCCL-/gIB-Logs zur Fehlerbehebung erfassen und verstehen

In diesem Dokument wird beschrieben, wie Sie NCCL/gIB-Logs erfassen und interpretieren können, um Stabilitäts- und Leistungsprobleme auf AI Hypercomputer zu beheben. Außerdem finden Sie hier eine Anleitung, wie Sie Folgendes erreichen:

  • NCCL-Logs erfassen
  • Die Struktur von NCCL-Logeinträgen verstehen
  • Prüfen, ob NCCL/gIB-Plug-ins korrekt geladen werden
  • Prüfen, ob die NCCL- und gIB-Versionen korrekt sind
  • Häufige NCCL-Warnungen und -Fehler beheben

NCCL-Logs erfassen

Sie können NVIDIA Collective Communications Library (NCCL)-Logs verwenden, um NCCL-Fehler zu beheben. Für die Fehlerbehebung bei Stabilitäts- oder Leistungsproblemen sollten Sie NCCL-Logs von allen Logging-Ebenen erfassen, während Sie die problematische Arbeitslast ausführen. Vermeiden Sie es, Logeinträge in die Console zu schreiben, da die schiere Menge der Logs verhindern kann, dass der Job fortgesetzt wird.

Legen Sie die folgenden Umgebungsvariablen fest, um NCCL-Logs zu erfassen:

NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,ENV,GRAPH,NET,COLL,TUNING
NCCL_DEBUG_FILE=DESIRED_PATH/nccl_logs.VM_NAME.RANK_PROCESS_ID

Ersetzen Sie Folgendes:

DESIRED_PATH: der Pfad, in dem Sie Ihre Logdateien speichern möchten

VM_NAME: der VM-Name

RANK_PROCESS_ID: die Prozess-ID des Ranks

NCCL-Logformat

NCCL-Logs sehen in etwa so aus:

# 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

Unabhängig von der Quelle haben NCCL-Logs ein Präfix, das in etwa so aussieht:

<VM name>:<pid>:<tid> [<GPU device ID>] <log level> <log content>

Prüfen, ob die NCCL/gIB-Plug-ins korrekt geladen werden

NCCL/gIB besteht aus mehreren von Google entwickelten Plug-ins. Wenn eines der Plug-ins nicht geladen wird, kann dies zu einer schlechten Leistung und in einigen Fällen zu schwerwiegenden Fehlern führen.

Netzwerk-Plug-in (libnccl-net.so)

Wenn das gIB-Netzwerk-Plug-in korrekt geladen wurde, sollten NCCL-Logeinträge ähnlich den folgenden angezeigt werden:

... NCCL INFO Using network gIB

Wenn Sie Logeinträge sehen, die einem der folgenden ähneln, beheben Sie das Problem mit der Anleitung im Abschnitt Ein freigegebenes Objekt kann nicht geladen werden.

# 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

Tuner-Plug-in (libnccl-tuner.so)

Wenn das gIB-Tuner-Plug-in korrekt geladen wurde, sollten NCCL-Logeinträge ähnlich den folgenden angezeigt werden:

NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v3 symbol.
NCCL INFO TUNER/Plugin: Using tuner plugin A3xTunerPlugin_v2

Wenn Sie einen Logeintrag sehen, der dem folgenden ähnelt, beheben Sie das Problem mit der Anleitung im Abschnitt Ein freigegebenes Objekt kann nicht geladen werden.

NCCL INFO TUNER/Plugin: Failed to find ncclTunerPlugin_v2 symbol, using internal tuner instead.

CollNet-Plug-in

Diese Logeinträge weisen zwar auf einen Fehler hin, sind aber zu erwarten und kein Grund zur Sorge:

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.

NCCL- und gIB-Version prüfen

Wir empfehlen, die NCCL-Version zu verwenden, die im gIB-Installationsprogramm enthalten ist, um die neuesten Funktionen, die beste Leistung und die höchste Stabilität zu gewährleisten. Sie können jedoch auch eine benutzerdefinierte NCCL-Version für Tests verwenden, z. B. eine NCCL-Version, die mit dem Framework für maschinelles Lernen Ihrer Wahl gebündelt ist.

Suchen Sie nach den folgenden NCCL-Logeinträgen, um die verwendete NCCL- und gIB-Version zu prüfen:

# NCCL version.
... NCCL INFO NCCL version 2.23.4+cuda12.2

# gIB version.
... NCCL INFO NET/gIB : Initializing gIB v1.0.2

NCCL/gIB-Umgebungsvariablen prüfen

Um eine gute NCCL-Leistung zu erzielen, stellen wir ein Skript bereit, mit dem Sie die empfohlenen NCCL-Umgebungsvariablen festlegen können. Bevor Sie Ihre Arbeitslast ausführen, müssen Sie das Skript in derselben Umgebung wie die Arbeitslast ausführen. Im NCCL/gIB-Installationsprogramm befindet sich das Skript unter /usr/local/gib/set_nccl_env.sh. Wenn Sie dieses Skript nicht verwenden und die NCCL-Umgebungsvariablen daher falsch festgelegt sind, kann es sein, dass der gIB NCCL Config Checker die Arbeitslast beendet, NCCL abstürzt oder die NCCL-Leistung schlecht ist.

Suchen Sie nach NCCL-Logeinträgen ähnlich den folgenden, um zu prüfen, ob die NCCL/gIB-Umgebungsvariablen korrekt angewendet wurden:

# 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.

Vergleichen Sie die folgenden Werte mit den empfohlenen NCCL-Umgebungsvariablen.

GKE-Arbeitslastmanifest prüfen

In GKE muss Ihr Kubernetes-Arbeitslastmanifest mehrere erforderliche Einstellungen enthalten, damit NCCL/gIB reibungslos verwendet werden kann:

  • Das Manifest muss die NCCL/gIB-Binärdateien von /home/kubernetes/bin/gib auf der VM in /usr/local/gib in Ihrem Arbeitslastcontainer bereitstellen. Beachten Sie, dass /home/kubernetes/bin/nvidia auf der VM automatisch in /usr/local/nvidia in Ihrem Arbeitslastcontainer bereitgestellt wird.
  • In Ihrem Arbeitslastcontainer muss LD_LIBRARY_PATH auf /usr/local/gib/lib64:/usr/local/nvidia/lib64 festgelegt sein.
  • Für Ihren Cluster und Ihre Knotenpools muss GKE Multi-Networking eingerichtet sein und Ihr Arbeitslastmanifest muss die Multi-Networking-Annotationen enthalten, damit hostNetwork: true nicht festgelegt werden muss.

Ein tatsächliches Kubernetes-Arbeitslastmanifest in GKE sieht in etwa so aus:

...
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

GID-Tabelle prüfen

In RoCE wird die GID-Tabelle (Global Identifier) verwendet, um RDMA-Traffic eindeutig zu adressieren. Wenn die GID-Tabelle beschädigt ist, kann kein RDMA-Traffic übertragen werden.

Wir stellen ein Skript show_gids.sh bereit, mit dem Sie die GID-Tabelle anzeigen können. Im Installationsprogramm befindet es sich unter /usr/local/gib/scripts. Wenn Sie unser Installationsprogramm ohne Änderungen verwendet haben, wird es auf der VM unter /var/lib/gib/scripts installiert.

Wenn Sie das Skript auf der VM ausführen, sollte eine Ausgabe ähnlich der folgenden angezeigt werden:

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
...

Prüfen Sie die Ausgabe und bestätigen Sie Folgendes:

  • Die GID-Tabelle hat die richtige Anzahl von Einträgen:
    • Für A3 Ultra oder A4: 32 Einträge mit 4 Einträgen pro CX-7.
    • Für A3 Mega: 32 Einträge mit 4 Einträgen pro CX-7.
    • Für A3 High (8 GPUs): 16 Einträge mit 4 Einträgen pro CX-7.
    • Für A4X: 16 Einträge mit 4 Einträgen pro CX-7.
  • Die GID-Einträge der einzelnen CX-7 haben die Indexe 0, 1, 2 und 3.
  • Für jeden CX-7 haben die Indexe 2 und 3 eine IPv4-Adresse und diese IP-Adresse stimmt mit der IPv4-Adresse dieses Geräts überein (z. B. aus ip a).

Wenn eine dieser Aussagen falsch ist, ist die GID-Tabelle beschädigt. Starten Sie die VM neu oder starten Sie den Netzwerkmanager in Ihrem Gastbetriebssystem neu.

NCCL-Warnungen

NCCL-Logs haben mehrere Ebenen, wobei NCCL-Warnungen (NCCL WARN) die schwerwiegendsten sind. NCCL-Warnungen weisen in der Regel auf Fehler hin, die schwerwiegend sein können oder nicht. NCCL hat keine Logebene, die die Arbeitslast automatisch beendet.

Ein freigegebenes Objekt kann nicht geladen werden

Der folgende Fehler tritt auf, wenn ein freigegebenes Objekt aufgrund Ihrer Einrichtung nicht geladen werden kann.

error while loading shared libraries: libnccl.so.2: cannot open shared object file: No such file or directory

So beheben Sie das Problem:

  1. Prüfen Sie, ob das freigegebene Objekt in Ihrer Umgebung installiert ist.
  2. Prüfen Sie, ob sich das Verzeichnis des freigegebenen Objekts in der Umgebungsvariable $LD_LIBRARY_PATH befindet.

Segment aus freigegebenem Objekt konnte nicht zugeordnet werden

Der folgende Fehler tritt auf, wenn das Verzeichnis des freigegebenen Objekts nicht ausführbar ist.

error while loading shared libraries: libnccl.so.2: failed to map segment from shared object: Operation not permitted

Führen Sie die folgenden Befehle aus, um das Problem zu beheben. In diesen Beispielen wird davon ausgegangen, dass die gIB-Binärdateien auf den VMs unter /var/lib/gib installiert sind:

sudo mount --bind /var/lib/gib /var/lib/gib
sudo mount -o remount,exec /var/lib/gib

Der Gastkonfigurationsprüfer findet keine Konfigurationsdatei

Logeinträge wie diese werden angezeigt, wenn der Gastkonfigurationsprüfer keine Konfigurationsdatei findet, die verwendet werden kann.

... 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

Um das Problem zu beheben, können Sie die Umgebungsvariable NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE so festlegen, dass sie auf den Speicherort von guest_config.txtpb verweist. Der standardmäßige Standort für die Konfigurationsdatei im NCCL/gIB-Installationsprogramm ist /usr/local/gib/configs/guest_config.txtpb.

Wir empfehlen, den Gastkonfigurationsprüfer nicht zu deaktivieren, da er dazu beiträgt, Best Practices und eine korrekte Konfiguration zu gewährleisten. Bei Bedarf können Sie den Gastkonfigurationsprüfer jedoch deaktivieren, indem Sie die Umgebungsvariable NCCL_SHIMNET_SHIM_LAYERS auf UNUSED setzen.

Die folgenden Fehler treten auf, wenn die NCCL/gIB-Umgebungsvariablen nicht wie empfohlen festgelegt sind.

# 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)

So beheben Sie das Problem:

  1. Folgen Sie der Anleitung in den Logs des Gastkonfigurationsprüfers.
  2. Prüfen Sie die NCCL/gIB-Umgebungsvariablen.

Der Tuner findet keine Konfigurationsdatei

Der folgende Fehler tritt auf, wenn das Tuner-Plug-in keine Konfigurationsdatei findet, die verwendet werden kann.

... NCCL WARN No NCCL_TUNER_CONFIG_PATH provided. Please populate NCCL_TUNER_CONFIG_PATH to use config-based tuner plugin.

So beheben Sie das Problem:

  1. Legen Sie die Umgebungsvariable NCCL_TUNER_CONFIG_PATH so fest, dass sie auf den Speicherort von tuner_config.txtpb verweist. Der standardmäßige Standort für die Konfigurationsdatei im NCCL/gIB-Installationsprogramm ist /usr/local/gib/configs/guest_config.txtpb.
  2. Prüfen Sie die NCCL/gIB-Umgebungsvariablen.

Unzureichende glibc-Version

Der folgende Fehler tritt auf, wenn die lokale glibc-Version Ihrer Distribution zu alt ist. Das liegt höchstwahrscheinlich daran, dass die Linux-Distribution in Ihrer lokalen Umgebung zu alt ist. Für die NCCL/gIB-Binärdateien ist die glibc-Version 2.29 erforderlich.

/usr/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /usr/local/gib/lib64/libnccl.so.2)

Aktualisieren Sie Ihre Image-Distribution, um das Problem zu beheben (z. B. Ubuntu 20.04 oder höher, RockyLinux 9 oder höher).

Nachricht abgeschnitten

Der folgende Fehler tritt auf, wenn Sie über verschiedene Ranks hinweg gemischte NCCL-Versionen verwenden.

... NCCL WARN Message truncated : received ### bytes instead of ###

Prüfen Sie Ihre NCCL- und gIB-Version, um das Problem zu beheben. Wenn Sie GKE verwenden, prüfen oder installieren Sie das NCCL/gIB-Installationsprogramm-Daemonset neu (siehe Anleitung für A3U und A4 oder Anleitung für A4X).

libibverbs kann die Anbieterkonfiguration nicht laden

Der folgende Fehler tritt auf, wenn Sie das Verzeichnis mit den gIB-Binärdateien nicht in /usr/local/gib bereitgestellt haben. Dies führt nicht zu einem Fehler bei der Arbeitslast. NCCL greift jedoch auf TCP zurück und kann zu einer schlechten Leistung führen.

libibverbs: Warning: couldn't open config directory '/usr/local/gib/rdma-core/build/etc/libibverbs.d'.

Wenn Sie GKE verwenden, prüfen Sie Ihr Arbeitslastmanifest, um das Problem zu beheben.

ibv_modify_qp-Fehler

Es gibt eine Reihe von Fehlern, die auftreten können, wenn das gIB-Netzwerk-Plug-in QPs für tatsächliche Netzwerktransaktionen vorbereitet.

Ungültiges Argument (Fehlercode 22)

Der folgende Fehler tritt aus einem der folgenden Gründe auf:

  1. Das andere Ende des QP hat eine beschädigte GID-Tabelle.
  2. NCCL/gIB-Umgebungsvariablen sind falsch konfiguriert, insbesondere NCCL_IB_GID_INDEX, NCCL_IB_TC und NCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error Invalid argument errno 22

So beheben Sie das Problem:

  1. Suchen Sie nach anderen ibv_modify_qp-Fehlern mit der Signatur No data available error 61 und folgen Sie der Anleitung zur Behebung von Fehler 61.
  2. Prüfen Sie die NCCL/gIB-Umgebungsvariablen.

Keine Daten verfügbar (Fehlercode 61)

Der folgende Fehler tritt aus einem der folgenden Gründe auf:

  1. Diese VM hat eine beschädigte GID-Tabelle.
  2. NCCL/gIB-Umgebungsvariablen sind falsch konfiguriert, insbesondere NCCL_IB_GID_INDEX, NCCL_IB_TC und NCCL_IB_FIFO_TC.
... NCCL WARN Call to ibv_modify_qp failed with error No data available errno 61

Prüfen Sie zuerst die Ursache, um das Problem zu beheben:

  1. Prüfen Sie die GID-Tabelle.
  2. Prüfen Sie die NCCL/gIB-Umgebungsvariablen.

Wenn die GID-Tabelle beschädigt ist, versuchen Sie Folgendes:

  1. (Kurzfristig) Starten Sie den Netzwerkmanager (z. B. networkd) auf der VM neu, bis die IP-Adresse der problematischen Schnittstelle aktualisiert wird.
    1. Sie können networkd auf der VM mit sudo systemctl restart systemd-networkd neu starten.
    2. Die IP-Adresse aller Schnittstellen können Sie mit ip a sehen.
    3. Prüfen Sie, ob die GID-Tabelle wiederhergestellt wurde.
  2. Wenden Sie sich an den Google-Support, um Unterstützung bei einer langfristigen Lösung zu erhalten.

Zeitüberschreitung der Verbindung (Fehlercode 110)

Der folgende Fehler tritt auf, wenn ein grundlegendes Verbindungsproblem zwischen den VMs besteht.

... NCCL WARN Call to ibv_modify_qp failed with error Connection timed out errno 110

Wenden Sie sich an den Google-Support, um Unterstützung zu erhalten.

QP Got Completion with Error

Der folgende Fehler tritt aus einem der folgenden Gründe auf:

  1. Probleme mit der zugrunde liegenden RDMA-Verbindung (Link-Flaps usw.).
  2. NCCL/gIB-Umgebungsvariablen sind falsch konfiguriert, insbesondere NCCL_IB_TIMEOUT und NCCL_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

Wenden Sie sich an den Google-Support, um Unterstützung zu erhalten.