Executar o NCCL em clusters Slurm

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

Escolha as etapas para seu tipo de máquina:

A4X e A4

O teste a seguir usa o Ramble, um framework de experimentação multiplataforma de código aberto escrito em Python 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.

Os scripts de execução usados para esse teste são armazenados em /opt/apps/system_benchmarks no nó do controlador 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 do 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 ver esses registros, execute o seguinte:

    tail -f nccl.log

    Você também pode usar Ctrl+C para interromper o rastreamento da saída a qualquer momento. No final do nccl.log, a saída será parecida com 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 do 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)/ exclui todos os arquivos gerados durante esses testes.

A3 Ultra

  1. No diretório compartilhado do nó de login (geralmente localizado em ${HOME}), baixe o script necessário para criar o teste do NCCL executando o seguinte 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. Depois que o script for baixado, importe uma imagem do Pytorch do registro de contêiner 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 a operação for concluída com êxito, a saída será semelhante a esta:

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

    Se o build for bem-sucedido, 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 da 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, é necessário definir várias variáveis de ambiente 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 de 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 da 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 nccl all_gather_perf.

    O resultado será o seguinte:

    #
    #                                                              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}), baixe o script necessário para criar o teste do NCCL executando o seguinte 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. Depois que o script for baixado, importe uma imagem do Pytorch do registro de contêiner 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á o seguinte:

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

    Depois que o build for concluído, o nccl-tests directory será criado. Esse diretório contém o arquivo nvidia+pytorch+24.09-py3.sqsh. Um arquivo .sqsh é uma imagem de sistema de arquivos compactada e somente leitura que serve como o 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 da 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, você precisa definir algumas variáveis de ambiente. Essa configuração ativa a rede de alto desempenho 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 de contêiner em vez do ambiente de host. Você pode inspecionar essas variáveis no script run-nccl-tests.sh que baixou na etapa anterior.

  6. Execute o script de teste da 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 nccl all_gather_perf.

    O resultado será o seguinte:

    #
    #                                                              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. No diretório compartilhado do nó de login (geralmente localizado em ${HOME}), baixe o script necessário para criar o teste do NCCL executando o seguinte 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. Depois que o script for baixado, importe uma imagem do Pytorch do registro de contêiner 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á o seguinte:

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

    Se a build for bem-sucedida, o nccl-tests directory será criado. Esse diretório contém o arquivo nvidia+pytorch+24.09-py3.sqsh. Um arquivo .sqsh é uma imagem de sistema de arquivos compactada e somente leitura que serve como o 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 da 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 execução de job em um cluster A3 High, várias variáveis de ambiente precisam ser definidas para ativar redes de alto desempenho com GPUDirect-TCPX. Como você usa contêineres enroot neste procedimento para iniciar cargas de trabalho, essas variáveis precisam ser definidas no ambiente de contêiner, e não no ambiente do host. Você pode inspecionar essas variáveis no script run-nccl-tests.sh que acabou de baixar.

  6. Execute o script de teste da 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 nccl all_gather_perf.

    O resultado será o seguinte:

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