NCCL in Slurm-Clustern ausführen

Auf dieser Seite wird beschrieben, wie Sie NCCL-Tests in einem Slurm-Cluster ausführen. Wenn Sie eine verwaltete Slurm-Umgebung verwenden möchten, die integrierte NCCL-Tests zur Überprüfung des Clusterstatus enthält, lesen Sie stattdessen Cluster Director.

Wählen Sie die Schritte für Ihren Maschinentyp aus:

A4X und A4

Im folgenden Test wird Ramble verwendet. Das ist ein Open-Source-Framework für plattformübergreifende Tests, das in Python geschrieben wurde und zum Koordinieren der Ausführung von NCCL-Tests verwendet wird. Ramble und seine Abhängigkeiten sind mit der ARM64-Architektur kompatibel, die von A4X-Maschinen verwendet wird.

Die für diesen Test verwendeten Ausführungsskripts werden auf dem Slurm-Controllerknoten in /opt/apps/system_benchmarks bereitgestellt und sind für alle Knoten im Cluster verfügbar. Bei diesem Test wird Ramble im Verzeichnis /opt/apps/ramble installiert.

  1. Führen Sie auf dem Anmeldeknoten im Verzeichnis ${HOME} den folgenden Befehl aus. Da der Test etwa 10 Minuten dauern kann (oder länger, wenn andere Jobs in der Warteschlange sind), wird im folgenden Befehl nohup verwendet und stdout/err in eine Logdatei umgeleitet .

    nohup bash /opt/apps/system_benchmarks/run-nccl-tests-via-ramble.sh >& nccl.log &

    Mit diesem Befehl wird ein Ordner namens nccl-tests_$(date +%s) erstellt, in dem alle Testergebnisse gespeichert werden. Das Datums-Tag sorgt dafür, dass für jeden aktuellen Zeitstempel ein eindeutiger Ordner erstellt wird.

    Wenn Ihr Cluster beispielsweise 16 Knoten hat, werden NCCL-Tests für all-gather, all-reduce und reduce-scatter auf 2, 4, 8 und 16 Knoten ausgeführt.

  2. Überprüfen Sie die Ergebnisse. Die nccl.log enthält die Protokolle für das Einrichten und Ausführen des Tests. Führen Sie den folgenden Befehl aus, um diese Logs aufzurufen:

    tail -f nccl.log

    Sie können auch Ctrl+C verwenden, um die Ausgabe jederzeit zu beenden. Am Ende des nccl.log sollte Ihre Ausgabe in etwa so aussehen:

    ...
    ---- SUMMARY for >1GB Message Sizes ----
    workload        n_nodes msg_size        busbw
    all-gather      2       1073741824      ###.##
    all-gather      2       2147483648      ###.##
    all-gather      2       4294967296      ###.##
    all-gather      2       8589934592      ###.##
    ...
    all-reduce      2       1073741824      ###.##
    ...
    reduce-scatter  2       1073741824      ###.##
    ...
    -------- Benchmarking Complete -------
    

    Alle Slurm-Jobskripts und Ausgabelogs der NCCL-Tests werden im Verzeichnis nccl-tests_$(date +%s)/experiments gespeichert. Eine Zusammenfassung der NCCL-Testleistung wird auch in der Datei nccl-tests_${date +%s)/summary.tsv gespeichert.

    Wenn Sie das Verzeichnis nccl-tests_$(date +%s)/ entfernen, werden alle Dateien gelöscht, die während dieser Tests generiert wurden.

A3 Ultra

  1. Laden Sie aus dem freigegebenen Verzeichnis des Anmeldeknotens (dieser Knoten befindet sich normalerweise unter ${HOME}) das Skript herunter, das zum Erstellen des NCCL-Tests erforderlich ist, indem Sie den folgenden Befehl ausführen:

    wget -np -nd https://raw.githubusercontent.com/GoogleCloudPlatform/cluster-toolkit/refs/heads/main/examples/machine-learning/a3-ultragpu-8g/nccl-tests/build-nccl-tests.sh
  2. Nachdem das Script heruntergeladen wurde, importieren Sie ein PyTorch-Image aus der NVIDIA-Container Registry und erstellen Sie die NCCL-Tests. Führen Sie hierzu den folgenden Befehl aus:

    sbatch build-nccl-tests.sh

    Das oben genannte Skript wird auf einem Ihrer Knoten ausgeführt. Dabei wird der Schalter --container-mounts verwendet, um das aktuelle Verzeichnis $PWD im Verzeichnis /nccl innerhalb des Containers bereitzustellen.

  3. Prüfen Sie, ob der NCCL-Test erstellt wurde. Um dies zu überprüfen, führen Sie den folgenden Befehl aus:

    sacct -a

    Wenn der Vorgang erfolgreich abgeschlossen wurde, sieht die Ausgabe in etwa so aus:

    JobID           JobName  Partition    Account  AllocCPUS      State ExitCode
    ------------ ---------- ---------- ---------- ---------- ---------- --------
    1            build-ncc+    a3ultra                   112  COMPLETED      0:0
    

    Wenn der Build erfolgreich ist, sollte sich im Verzeichnis, in dem Sie den Befehl ausgeführt haben, auch eine Datei mit dem Namen nvidia+pytorch+24.09-py3.sqsh und ein Verzeichnis mit dem Namen nccl-tests befinden.

  4. Prüfen Sie, ob der Ordner nccl-tests/build mehrere Binärdateien enthält, darunter all_gather_perf, all_reduce_perf, reduce_scatter_perf und alltoall_perf.

  5. Laden Sie das NCCL-Testskript herunter.

    wget -np -nd https://raw.githubusercontent.com/GoogleCloudPlatform/cluster-toolkit/refs/heads/main/examples/machine-learning/a3-ultragpu-8g/nccl-tests/run-nccl-tests.sh

    Damit ein Joblauf in einem A3 Ultra-Cluster ausgeführt werden kann, müssen mehrere Umgebungsvariablen festgelegt werden, um eine leistungsstarke Netzwerkverbindung mit RDMA zu ermöglichen. Da Sie in diesem Verfahren Enroot-Container zum Starten von Arbeitslasten verwenden, müssen diese Variablen in der Containerumgebung und nicht in der Hostumgebung festgelegt werden. Diese Variablen können im run-nccl-tests.sh-Script, das Sie gerade heruntergeladen haben, geprüft werden.

  6. Führen Sie das NCCL-Testskript aus. Der Test kann etwa 15 Minuten oder länger dauern.

    sbatch run-nccl-tests.sh
  7. Überprüfen Sie die Ergebnisse. Das Skript gibt eine Datei slurm-XX.out aus, die das Ergebnis des NCCL-Benchmarks all_gather_perf enthält.

    Die Ausgabe sieht etwa so aus:

    #
    #                                                              out-of-place                       in-place
    #        size         count     type     redop   root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
    #         (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
        268435456       4194304     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
        536870912       8388608     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       1073741824      16777216     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       2147483648      33554432     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       4294967296      67108864     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       8589934592     134217728     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
    # Out of bounds values : 0 OK
    # Avg bus bandwidth    : ###.##
    #
    

A3 Mega

  1. Laden Sie aus dem freigegebenen Verzeichnis des Anmeldeknotens (dieser Knoten befindet sich normalerweise unter ${HOME}) das Skript herunter, das zum Erstellen des NCCL-Tests erforderlich ist, indem Sie den folgenden Befehl ausführen:

    wget -np -nd https://raw.githubusercontent.com/GoogleCloudPlatform/cluster-toolkit/refs/heads/main/examples/machine-learning/a3-megagpu-8g/nccl-tests/build-nccl-tests.sh
  2. Nachdem das Script heruntergeladen wurde, importieren Sie ein PyTorch-Image aus der NVIDIA-Container Registry und erstellen Sie die NCCL-Tests.

    sbatch build-nccl-tests.sh

    Das oben genannte Skript wird auf einem Ihrer Knoten ausgeführt. Dabei wird der Schalter --container-mounts verwendet, um das aktuelle Verzeichnis $PWD im Verzeichnis /nccl innerhalb des Containers bereitzustellen.

  3. Prüfen Sie, ob der NCCL-Test erstellt wurde:

    sacct -a

    Die Ausgabe sieht etwa so aus:

    JobID           JobName  Partition    Account  AllocCPUS      State ExitCode
    ------------ ---------- ---------- ---------- ---------- ---------- --------
    1            build-ncc+    a3mega                   112  COMPLETED      0:0
    

    Nachdem der Build abgeschlossen ist, wird nccl-tests directory erstellt. Dieses Verzeichnis enthält die Datei nvidia+pytorch+24.09-py3.sqsh. Eine .sqsh-Datei ist ein komprimiertes, schreibgeschütztes Dateisystem-Image, das als Standardcontainerformat für KI-Arbeitslasten dient.

  4. Prüfen Sie, ob der Ordner nccl-tests/build mehrere Binärdateien enthält, darunter all_gather_perf, all_reduce_perf, reduce_scatter_perf und alltoall_perf.

  5. Laden Sie das NCCL-Testskript herunter:

    wget -np -nd https://raw.githubusercontent.com/GoogleCloudPlatform/cluster-toolkit/refs/heads/main/examples/machine-learning/a3-megagpu-8g/nccl-tests/run-nccl-tests.sh

    Damit Sie einen Joblauf in einem A3 Mega-Cluster ausführen können, müssen Sie eine Reihe von Umgebungsvariablen festlegen. Diese Einstellung ermöglicht Hochleistungsnetzwerke mit dem GPUDirect-TCPXO-Protokoll. Da Sie in diesem Verfahren Enroot-Container zum Starten von Arbeitslasten verwenden, müssen diese Variablen in der Containerumgebung und nicht in der Hostumgebung festgelegt werden. Sie können diese Variablen im run-nccl-tests.sh-Script prüfen, das Sie im vorherigen Schritt heruntergeladen haben.

  6. Führen Sie das NCCL-Testskript aus. Der Test kann etwa 15 Minuten oder länger dauern.

    sbatch run-nccl-tests.sh
  7. Überprüfen Sie die Ergebnisse. Das Skript gibt eine Datei slurm-XX.out aus, die das Ergebnis des NCCL-Benchmarks all_gather_perf enthält.

    Die Ausgabe sieht etwa so aus:

    #
    #                                                              out-of-place                       in-place
    #        size         count     type     redop   root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
    #         (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
        268435456       4194304     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
        536870912       8388608     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       1073741824      16777216     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       2147483648      33554432     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       4294967296      67108864     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       8589934592     134217728     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
    # Out of bounds values : 0 OK
    # Avg bus bandwidth    : ###.##
    #
    

A3 High

  1. Laden Sie aus dem freigegebenen Verzeichnis des Anmeldeknotens (dieser Knoten befindet sich normalerweise unter ${HOME}) das Skript herunter, das zum Erstellen des NCCL-Tests erforderlich ist, indem Sie den folgenden Befehl ausführen:

    wget -np -nd https://raw.githubusercontent.com/GoogleCloudPlatform/cluster-toolkit/refs/heads/main/examples/machine-learning/a3-highgpu-8g/nccl-tests/build-nccl-tests.sh
  2. Nachdem das Script heruntergeladen wurde, importieren Sie ein PyTorch-Image aus der NVIDIA-Container Registry und erstellen Sie die NCCL-Tests. Dazu führen Sie den folgenden Befehl aus:

    sbatch build-nccl-tests.sh

    Das oben genannte Skript wird auf einem Ihrer Knoten ausgeführt. Dabei wird der Schalter --container-mounts verwendet, um das aktuelle Verzeichnis $PWD im Verzeichnis /nccl innerhalb des Containers bereitzustellen.

  3. Prüfen Sie, ob der NCCL-Test erstellt wurde:

    sacct -a

    Die Ausgabe sieht etwa so aus:

    JobID           JobName  Partition    Account  AllocCPUS      State ExitCode
    ------------ ---------- ---------- ---------- ---------- ---------- --------
    1            build-ncc+    a3high                   112  COMPLETED      0:0
    

    Wenn der Build erfolgreich ist, wird die nccl-tests directory erstellt. Dieses Verzeichnis enthält die Datei nvidia+pytorch+24.09-py3.sqsh. Eine .sqsh-Datei ist ein komprimiertes, schreibgeschütztes Dateisystem-Image, das als Standardcontainerformat für KI-Arbeitslasten dient.

  4. Prüfen Sie, ob der Ordner nccl-tests/build mehrere Binärdateien enthält, darunter all_gather_perf, all_reduce_perf, reduce_scatter_perf und alltoall_perf.

  5. Laden Sie das NCCL-Testskript herunter:

    wget -np -nd https://raw.githubusercontent.com/GoogleCloudPlatform/cluster-toolkit/refs/heads/main/examples/machine-learning/a3-highgpu-8g/nccl-tests/run-nccl-tests.sh

    Damit ein Joblauf in einem A3 High-Cluster ausgeführt werden kann, müssen mehrere Umgebungsvariablen festgelegt werden, um Hochleistungsnetzwerke mit GPUDirect-TCPX zu ermöglichen. Da Sie in diesem Verfahren Enroot-Container zum Starten von Arbeitslasten verwenden, müssen diese Variablen in der Containerumgebung und nicht in der Hostumgebung festgelegt werden. Sie können diese Variablen im run-nccl-tests.sh-Skript prüfen, das Sie gerade heruntergeladen haben.

  6. Führen Sie das NCCL-Testskript aus. Der Test kann etwa 15 Minuten oder länger dauern.

    sbatch run-nccl-tests.sh
  7. Überprüfen Sie die Ergebnisse. Das Skript gibt eine Datei slurm-XX.out aus, die das Ergebnis des NCCL-Benchmarks all_gather_perf enthält.

    Die Ausgabe sieht etwa so aus:

    #
    #                                                              out-of-place                       in-place
    #        size         count     type     redop   root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
    #         (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
        268435456       4194304     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
        536870912       8388608     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       1073741824      16777216     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       2147483648      33554432     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       4294967296      67108864     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
       8589934592     134217728     float    none      -1    #####  ###.##  ###.##    N/A   ######  ###.##  ###.##      0
    # Out of bounds values : 0 OK
    # Avg bus bandwidth    : ###.##
    #
    

Nächste Schritte