Executar o NCCL em clusters Slurm

Esta página descreve como executar NCCL do NCCL em um cluster do Slurm. Para usar um ambiente gerenciado do Slurm que inclua testes integrados do NCCL para verificar a integridade do cluster, consulte o Cluster Director.

Escolha as etapas para seu tipo de máquina:

A4X Max, A4X e A4

O teste a seguir usa Ramble, um framework de experimentação multiplataforma de código aberto escrito em Python que é usado para coordenar a execução de testes do NCCL. O Ramble e as dependências dele são compatíveis com a arquitetura ARM64 usada pelas máquinas A4X Max e A4X.

Os scripts de execução usados para esse teste são preparados em /opt/apps/system_benchmarks no nó do controlador do Slurm e estão disponíveis para todos os nós do cluster. A execução desse teste instala o Ramble no diretório /opt/apps/ramble.

  1. No nó de login no diretório ${HOME}, execute o comando a seguir. Como o teste pode levar aproximadamente 10 minutos ou mais se outros jobs estiverem na fila, o comando a seguir usa nohup e redireciona o stdout/err para um arquivo de registro.

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

    Esse comando cria uma pasta chamada nccl-tests_$(date +%s) que armazena todos os resultados do teste. A tag de data garante que uma pasta exclusiva seja criada com base em cada carimbo de data/hora atual.

    Por exemplo, se o cluster tiver 16 nós, os testes do NCCL serão executados para all-gather, all-reduce e reduce-scatter em 2, 4, 8 e 16 nós.

  2. Analise os resultados. O nccl.log contém os registros da configuração e execução do teste. Para conferir esses registros, execute o seguinte:

    tail -f nccl.log

    Também é possível usar Ctrl+C para interromper a saída a qualquer momento. No final do nccl.log, a saída será semelhante a esta:

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

    Todos os scripts de job do Slurm e os registros de saída de nccl-tests são armazenados no diretório nccl-tests_$(date +%s)/experiments. Um resumo da performance do teste do NCCL também é armazenado no arquivo nccl-tests_${date +%s)/summary.tsv.

    A remoção do diretório nccl-tests_$(date +%s)/ remove todos os arquivos gerados durante esses testes.

A3 Ultra

  1. No diretório compartilhado do nó de login (geralmente localizado em ${HOME}), faça o download do script necessário para criar o teste do NCCL executando o comando a seguir:

    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. Depois que o script for baixado, importe uma imagem do Pytorch do registro de contêineres da NVIDIA e crie os testes do NCCL. Para isso, execute este comando:

    sbatch build-nccl-tests.sh

    O script anterior é executado em um dos nós. Ele usa a opção --container-mounts para montar o diretório atual, $PWD, no diretório /nccl dentro do contêiner.

  3. Verifique se o teste do NCCL foi criado. Para verificar isso, execute o comando a seguir:

    sacct -a

    Se concluída, a saída será semelhante a esta:

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

    Se a criação for bem-sucedida, você também terá um arquivo chamado nvidia+pytorch+24.09-py3.sqsh no diretório em que executou o comando, além de um diretório chamado nccl-tests.

  4. Verifique se a pasta nccl-tests/build contém vários binários, incluindo all_gather_perf, all_reduce_perf, reduce_scatter_perf e alltoall_perf.

  5. Faça o download do script de teste do 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 executar qualquer job em um cluster A3 Ultra, várias variáveis de ambiente precisam ser definidas para ativar a rede de alta performance com RDMA. Como você usa contêineres enroot neste procedimento para iniciar cargas de trabalho, essas variáveis precisam ser definidas no ambiente do contêiner, e não no ambiente do host. Essas variáveis podem ser inspecionadas no script run-nccl-tests.sh que você acabou de baixar.

  6. Execute o script de teste do NCCL. O teste pode levar aproximadamente 15 minutos ou mais.

    sbatch run-nccl-tests.sh
  7. Analise os resultados. O script gera um arquivo slurm-XX.out que contém o resultado do comparativo de mercado all_gather_perf do nccl.

    O resultado será assim:

    #
    #                                                              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. No diretório compartilhado do nó de login (geralmente localizado em ${HOME}), faça o download do script necessário para criar o teste do NCCL executando o comando a seguir:

    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. Depois que o script for baixado, importe uma imagem do Pytorch do registro de contêineres da NVIDIA e crie os testes do NCCL.

    sbatch build-nccl-tests.sh

    O script anterior é executado em um dos nós. Ele usa a opção --container-mounts para montar o diretório atual, $PWD, no diretório /nccl dentro do contêiner.

  3. Verifique se o teste do NCCL foi criado:

    sacct -a

    O resultado será assim:

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

    Depois que a criação for concluída, o diretório nccl-tests será criado. Esse diretório contém o arquivo nvidia+pytorch+24.09-py3.sqsh. Um arquivo .sqsh é uma imagem de sistema compactada somente leitura que serve como formato de contêiner padrão para cargas de trabalho de IA.

  4. Verifique se a pasta nccl-tests/build contém vários binários, incluindo all_gather_perf, all_reduce_perf, reduce_scatter_perf e alltoall_perf.

  5. Faça o download do script de teste do 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 executar qualquer job em um cluster A3 Mega, várias variáveis de ambiente precisam ser definidas para ativar a rede de alta performance com o protocolo GPUDirect-TCPXO. Como você usa contêineres enroot neste procedimento para iniciar cargas de trabalho, essas variáveis precisam ser definidas no ambiente do contêiner, e não no ambiente do host. É possível inspecionar essas variáveis no script run-nccl-tests.sh que você baixou na etapa anterior.

  6. Execute o script de teste do NCCL. O teste pode levar aproximadamente 15 minutos ou mais.

    sbatch run-nccl-tests.sh
  7. Analise os resultados. O script gera um arquivo slurm-XX.out que contém o resultado do comparativo de mercado all_gather_perf do nccl.

    O resultado será assim:

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

  1. No diretório compartilhado do nó de login (geralmente localizado em ${HOME}), faça o download do script necessário para criar o teste do NCCL executando o comando a seguir:

    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. Depois que o script for baixado, importe uma imagem do Pytorch do registro de contêineres da NVIDIA e crie os testes do NCCL. Para isso, execute o seguinte comando:

    sbatch build-nccl-tests.sh

    O script anterior é executado em um dos nós. Ele usa a opção --container-mounts para montar o diretório atual, $PWD, no diretório /nccl dentro do contêiner.

  3. Verifique se o teste do NCCL foi criado:

    sacct -a

    O resultado será assim:

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

    Se a criação for bem-sucedida, o diretório nccl-tests será criado. Esse diretório contém o arquivo nvidia+pytorch+24.09-py3.sqsh. Um arquivo .sqsh é uma imagem de sistema compactada somente leitura que serve como formato de contêiner padrão para cargas de trabalho de IA.

  4. Verifique se a pasta nccl-tests/build contém vários binários, incluindo all_gather_perf, all_reduce_perf, reduce_scatter_perf e alltoall_perf.

  5. Faça o download do script de teste do 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 executar qualquer job em um cluster A3 Alto, várias variáveis de ambiente precisam ser definidas para ativar a rede de alta performance com GPUDirect-TCPX. Como você usa contêineres enroot neste procedimento para iniciar cargas de trabalho, essas variáveis precisam ser definidas no ambiente do contêiner, e não no ambiente do host. É possível inspecionar essas variáveis no script run-nccl-tests.sh que você acabou de baixar.

  6. Execute o script de teste do NCCL. O teste pode levar aproximadamente 15 minutos ou mais.

    sbatch run-nccl-tests.sh
  7. Analise os resultados. O script gera um arquivo slurm-XX.out que contém o resultado do comparativo de mercado all_gather_perf do nccl.

    O resultado será assim:

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

A seguir