nccl-test 工具是 nvidia 开源的一项用于测试 NCCL 集合通信的工具。可以用于检测集合通信是否正常、压测集合通信速率。官方开源地址:https://github.com/NVIDIA/nccl-tests
目前已经支持的测试方法:
nccl
, cuda
, mpi
:
nccl & cuda: https://developer.nvidia.com/nccl/nccl-download
openmpi: https://www.open-mpi.org/software/ompi/v4.1/git clone https://github.com/NVIDIA/nccl-tests.git
make -j40 MPI=1 MPI_HOME=/path/to/mpi CUDA_HOME=/path/to/cuda NCCL_HOME=/path/to/nccl
根据需要,可以将 build 目录添加之 PATH 环境变量,或者 建立软链,方便快速访问。
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8
启动测试
命令说明:8 张 GPU (-g 8)执行 all_reduce操作,数据量从 8B(-b 8) 到 128M(-e 128M), 数据量每次翻倍(-f 2)mpirun -np 8 ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1
命令说明:8个进程(-np 8),每个进程一张 GPU(-g 1),执行 all_reduce操作
注意:使用 MPI方式启动时,请确保可执行文件所在位置在每台机器上相同,或者都在 PATH 路径中使用示例:
# 2台机器,16 张 GPU卡,执行 all_reduce_perf 测试
mpirun -np 16 \
-H 172.16.2.8:8,172.16.2.13:8 \
--allow-run-as-root -bind-to none -map-by slot \
-x NCCL_DEBUG=INFO \
-x NCCL_IB_GID_INDEX=3 \
-x NCCL_IB_DISABLE=0 \
-x NCCL_SOCKET_IFNAME=eth0 \
-x NCCL_NET_GDR_LEVEL=2 \
-x NCCL_IB_QPS_PER_CONNECTION=4 \
-x NCCL_IB_TC=160 \
-x LD_LIBRARY_PATH -x PATH \
-mca coll_hcoll_enable 0 -mca pml ob1 -mca btl_tcp_if_include eth0 -mca btl ^openib \
all_reduce_perf -b 32M -e 1G -i 1000 -f 2 -g 1
指令详解:
mpirun
是一个用于启动和管理 MPI(消息传递接口)程序的实用程序。它允许您在单个节点或多个节点上并行运行程序。-np <num>
:指定要运行的进程数。这应该与您要使用的总 GPU 数量相匹配。例如,如果您有 2 台机器,每台机器有 8 个 GPU,您应该使用 -np 16
.-H
host列表,:
后指定每台机器要用的 GPU数量--bind-to none
:此选项告诉 MPI 不要将进程绑定到特定的 CPU 核心。这在某些情况下可能会提高性能。-x <VARNAME>
:将环境变量传递给 MPI 程序。--allow-run-as-root
:这个选项允许 mpirun
以 root 用户身份运行。通常,出于安全考虑,mpirun
不允许以 root 用户身份运行。-map-by slot
表示任务会按照 slot 的顺序分配到节点上。-x NCCL_DEBUG=INFO
:这个选项设置了 NCCL 的调试级别为 INFO。-x NCCL_IB_GID_INDEX=3
:这个选项设置了 InfiniBand 网络的 GID 索引为 3。-x NCCL_IB_DISABLE=0
:这个选项表示不禁用 InfiniBand 网络。-x NCCL_SOCKET_IFNAME=eth0
:这个选项指定了 NCCL 使用 eth0
网络接口进行通信。-x NCCL_NET_GDR_LEVEL=2
:这个选项设置了 GPU Direct RDMA 的级别为 2。-x NCCL_IB_QPS_PER_CONNECTION=4
:这个选项设置了每个连接的队列对数为 4。-x NCCL_IB_TC=160
:这个选项设置了 InfiniBand 的流量类别为 160。-x LD_LIBRARY_PATH -x PATH
:这些选项将当前 shell 的 LD_LIBRARY_PATH
和 PATH
环境变量传递给 mpirun
。all_reduce_perf 表示执行的是
all reduce 操作
结果详解:
size (B)
:操作处理的数据的大小,以字节为单位。在这个例子中,第一次操作处理了 33554432 字节(约 32MB)的数据,第二次操作处理了 133554432 字节(约 127MB)的数据。count (elements)
:操作处理的元素的数量。在这个例子中,第一次操作处理了 8388608 个元素,第二次操作处理了 33388608 个元素。type
:元素的数据类型。在这个例子中,元素的数据类型是 float。redop
:使用的归约操作。在这个例子中,使用的归约操作是 sum(求和)。root
:对于某些操作(如 reduce 和 broadcast),这列指定了根节点的编号。在这个例子中,这列的值是 -1,这表示这个操作没有根节点(这是因为 all-reduce 操作涉及到所有的节点)。time (us)
:操作的执行时间,以微秒为单位。这个列有两个值,分别表示两次不同的测量结果。algbw (GB/s)
:算法带宽,以每秒吉字节(GB/s)为单位。这个列有两个值,分别表示两次不同的测量结果。busbw (GB/s)
:总线带宽,以每秒吉字节(GB/s)为单位。这个列有两个值,分别表示两次不同的测量结果。wrong
:错误的数量。如果这个值不是 0,那么这可能表示有一些错误发生。在这个例子中,你可以看到,当处理的数据量增大时,算法带宽和总线带宽都有所提高,这可能表示 NCCL 能够有效地利用大量的数据。
查看结果时,需要关注如下几点:
-t,--nthreads <num threads>
每个进程的线程数量配置, 默认 1-g,--ngpus <GPUs per thread>
每个线程的 GPU数量,默认 1.-b,--minbytes <min size in bytes>
开始的最小数据量,默认32M-e,--maxbytes <max size in bytes>
结束的最大数据量,默认 32M.-i,--stepbytes <increment size>
每次增加的数据量. 默认: 1M.-f,--stepfactor <increment factor>
每次增加的倍数. 默认禁用.-o,--op <sum/prod/min/max/avg/all>
指定那种操作为reduce,仅适用于Allreduce、Reduce或ReduceScatter等缩减操作。默认值为:求和(Sum)。-d,--datatype <nccltype/all>
指定使用哪种数据类型. 默认 : Float.-r,--root <root/all>
指定使用哪个 root 用户,默认0.-n,--iters <iteration count>
每次操作(一次发送)循环多少次. 默认 : 20.-w,--warmup_iters <warmup iteration count>
预热迭代次数(不计时)。默认值为:5。-m,--agg_iters <aggregation count>
每次迭代中要聚合在一起的操作数。默认值为:1-a,--average <0/1/2/3>
在所有ranks计算均值作为最终结果 (MPI=1 only). <0=Rank0,1=Avg,2=Min,3=Max>. 默认为 1.-p,--parallel_init <0/1>
使用线程并行初始化 NCCL, 默认 : 0.-c,--check <0/1>
检查结果的正确性。在大量GPU上可能会非常慢。默认值为:1-z,--blocking <0/1>
使NCCL集合阻塞,即在每个集合之后让CPU等待和同步。默认值为:0。-G,--cudagraph <num graph launches>
将迭代作为CUDA图形捕获,然后重复指定的次数。默认值为:0。1. 如何实现持续运行 nccl-test
可以通过,使用 `-b`, `-e`选项将数据量设置为一致的,使用`-i 0`将每次增加的数据步长设置为 0,就可以实现持续运行该数据大小的 nccl-test 测试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。