Ejecuta NCCL en clústeres de Slurm

En esta página, se describe cómo ejecutar pruebas de NCCL en un clúster de Slurm. Para usar un entorno de Slurm administrado que incluya pruebas de NCCL integradas para verificar el estado del clúster, consulta Cluster Director.

Elige los pasos para tu tipo de máquina:

A4X y A4

La siguiente prueba usa Ramble, un framework de experimentación multiplataforma de código abierto escrito en Python que se usa para coordinar la ejecución de pruebas de NCCL. Ramble y sus dependencias son compatibles con la arquitectura ARM64 que usan las máquinas A4X.

Las secuencias de comandos de ejecución que se usan para esta prueba se almacenan en /opt/apps/system_benchmarks en el nodo del controlador de Slurm y están disponibles para todos los nodos del clúster. La ejecución de esta prueba instala Ramble en el directorio /opt/apps/ramble.

  1. Desde el nodo de acceso en el directorio ${HOME}, ejecuta el siguiente comando. Dado que la prueba puede tardar aproximadamente 10 minutos, o más si hay otros trabajos en la cola, el siguiente comando usa nohup y redirecciona stdout/err a un archivo de registro .

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

    Este comando crea una carpeta llamada nccl-tests_$(date +%s) que almacena todos los resultados de las pruebas. La etiqueta de fecha garantiza que se cree una carpeta única según cada marca de tiempo actual.

    Por ejemplo, si tu clúster tiene 16 nodos, las pruebas de NCCL se ejecutan para all-gather, all-reduce y reduce-scatter en 2, 4, 8 y 16 nodos.

  2. Revisa los resultados. El archivo nccl.log contiene los registros de la configuración y la ejecución de la prueba. Para ver estos registros, ejecuta el siguiente comando:

    tail -f nccl.log

    También puedes usar Ctrl+C para dejar de seguir la salida en cualquier momento. Al final de nccl.log, el resultado debería ser similar al siguiente:

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

    Todas las secuencias de comandos de trabajo de Slurm y los registros de salida de nccl-tests se almacenan en el directorio nccl-tests_$(date +%s)/experiments. En el archivo nccl-tests_${date +%s)/summary.tsv, también se almacena un resumen del rendimiento de la prueba de NCCL.

    Si quitas el directorio nccl-tests_$(date +%s)/, se borrarán todos los archivos generados durante estas pruebas.

A3 Ultra

  1. Desde el directorio compartido del nodo de acceso (este nodo suele ubicarse en ${HOME}), descarga la secuencia de comandos necesaria para compilar la prueba de NCCL ejecutando el siguiente comando:

    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. Después de que se descargue la secuencia de comandos, importa una imagen de PyTorch desde el registro de contenedores de NVIDIA y compila las pruebas de NCCL. Para ello, ejecuta el comando que se indica a continuación:

    sbatch build-nccl-tests.sh

    La secuencia de comandos anterior se ejecuta en uno de tus nodos. Usa el parámetro --container-mounts para activar tu directorio actual, $PWD, en el directorio /nccl dentro del contenedor.

  3. Verifica que se haya compilado la prueba de NCCL. Para verificar que sea así, ejecuta el siguiente comando:

    sacct -a

    Si se completa correctamente, el resultado es similar al siguiente:

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

    Si la compilación se realiza correctamente, también deberías tener un archivo llamado nvidia+pytorch+24.09-py3.sqsh en el directorio en el que ejecutaste el comando, junto con un directorio llamado nccl-tests.

  4. Verifica que la carpeta nccl-tests/build contenga varios archivos binarios, incluidos all_gather_perf, all_reduce_perf, reduce_scatter_perf y alltoall_perf.

  5. Descarga la secuencia de comandos de prueba de NCCL.

    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

    Para ejecutar cualquier ejecución de trabajo en un clúster A3 Ultra, se deben establecer varias variables de entorno para habilitar redes de alto rendimiento con RDMA. Debido a que usas contenedores de enroot en este procedimiento para iniciar cargas de trabajo, estas variables se deben establecer en el entorno del contenedor, en lugar del entorno del host. Estas variables se pueden inspeccionar en la secuencia de comandos run-nccl-tests.sh que acabas de descargar.

  6. Ejecuta la secuencia de comandos de prueba de NCCL. La prueba puede tardar aproximadamente 15 minutos o más.

    sbatch run-nccl-tests.sh
  7. Revisa los resultados. La secuencia de comandos genera un archivo slurm-XX.out que contiene el resultado de la comparativa de all_gather_perf de nccl.

    El resultado es similar a lo siguiente:

    #
    #                                                              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. Desde el directorio compartido del nodo de acceso (este nodo suele ubicarse en ${HOME}), descarga la secuencia de comandos necesaria para compilar la prueba de NCCL ejecutando el siguiente comando:

    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. Después de que se descargue la secuencia de comandos, importa una imagen de PyTorch desde el registro de contenedores de NVIDIA y compila las pruebas de NCCL.

    sbatch build-nccl-tests.sh

    La secuencia de comandos anterior se ejecuta en uno de tus nodos. Usa el parámetro --container-mounts para activar tu directorio actual, $PWD, en el directorio /nccl dentro del contenedor.

  3. Verifica que se haya compilado la prueba de NCCL:

    sacct -a

    El resultado es similar a lo siguiente:

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

    Una vez que se completa la compilación, se crea el objeto nccl-tests directory. Este directorio contiene el archivo nvidia+pytorch+24.09-py3.sqsh. Un archivo .sqsh es una imagen comprimida del sistema de archivos de solo lectura que funciona como el formato de contenedor estándar para las cargas de trabajo de IA.

  4. Verifica que la carpeta nccl-tests/build contenga varios archivos binarios, incluidos all_gather_perf, all_reduce_perf, reduce_scatter_perf y alltoall_perf.

  5. Descarga la secuencia de comandos de prueba de NCCL:

    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

    Para ejecutar cualquier ejecución de trabajo en un clúster A3 Mega, debes configurar una cantidad de variables de entorno. Este parámetro de configuración habilita las redes de alto rendimiento con el protocolo GPUDirect-TCPXO. Debido a que usas contenedores de enroot en este procedimiento para iniciar cargas de trabajo, estas variables se deben establecer en el entorno del contenedor, en lugar del entorno del host. Puedes inspeccionar estas variables en la secuencia de comandos run-nccl-tests.sh que descargaste en el paso anterior.

  6. Ejecuta la secuencia de comandos de prueba de NCCL. La prueba puede tardar aproximadamente 15 minutos o más.

    sbatch run-nccl-tests.sh
  7. Revisa los resultados. La secuencia de comandos genera un archivo slurm-XX.out que contiene el resultado de la comparativa de all_gather_perf de nccl.

    El resultado es similar a lo siguiente:

    #
    #                                                              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. Desde el directorio compartido del nodo de acceso (este nodo suele ubicarse en ${HOME}), descarga la secuencia de comandos necesaria para compilar la prueba de NCCL ejecutando el siguiente comando:

    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. Después de que se descargue la secuencia de comandos, importa una imagen de PyTorch desde el registro de contenedores de NVIDIA y compila las pruebas de NCCL. Para ello, ejecuta el siguiente comando:

    sbatch build-nccl-tests.sh

    La secuencia de comandos anterior se ejecuta en uno de tus nodos. Usa el parámetro --container-mounts para activar tu directorio actual, $PWD, en el directorio /nccl dentro del contenedor.

  3. Verifica que se haya compilado la prueba de NCCL:

    sacct -a

    El resultado es similar a lo siguiente:

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

    Si la compilación se realiza de forma correcta, se crea el objeto nccl-tests directory. Este directorio contiene el archivo nvidia+pytorch+24.09-py3.sqsh. Un archivo .sqsh es una imagen comprimida del sistema de archivos de solo lectura que funciona como el formato de contenedor estándar para las cargas de trabajo de IA.

  4. Verifica que la carpeta nccl-tests/build contenga varios archivos binarios, incluidos all_gather_perf, all_reduce_perf, reduce_scatter_perf y alltoall_perf.

  5. Descarga la secuencia de comandos de prueba de NCCL:

    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

    Para ejecutar cualquier ejecución de trabajo en un clúster A3 High, se deben configurar varias variables de entorno para habilitar redes de alto rendimiento con GPUDirect-TCPX. Debido a que usas contenedores de enroot en este procedimiento para iniciar cargas de trabajo, estas variables se deben establecer en el entorno del contenedor, en lugar del entorno del host. Puedes inspeccionar estas variables en la secuencia de comandos run-nccl-tests.sh que acabas de descargar.

  6. Ejecuta la secuencia de comandos de prueba de NCCL. La prueba puede tardar aproximadamente 15 minutos o más.

    sbatch run-nccl-tests.sh
  7. Revisa los resultados. La secuencia de comandos genera un archivo slurm-XX.out que contiene el resultado de la comparativa de all_gather_perf de nccl.

    El resultado es similar a lo siguiente:

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

¿Qué sigue?