案例验证:分析NCCL-Tests运行日志优化Scale-Out网络拓扑

背景:All-reduce 和 Ring 算法

GPU并行计算中需要大规模地在计算节点之间同步参数梯度,产生了大量的集合通信流量。为了优化集合通信性能,业界开发了不同的集合通信库(xCCL),其核心都是实现 All-Reduce,这也是分布式训练最主要的通信方式。

LLM训练中的 All Reduce 操作一般分为三个步骤:

  • 把每个节点的数据切分成N份;

  • 通过reduce-scatter,让每个节点都得到1/N的完整数据块;

  • 通过all-gather,让所有节点的每个1/N数据块都变得完整

基于这种流量模式,Ring算法是目前实现该操作最常见的基础算法之一。

顾名思义,Ring算法构建了一个环形网络——每个节点的数据会被切分成N份数据在所有GPU之间移动,且每个GPU只和相邻的GPU通信。这种流水线模式能充分利用所有节点的发送和接收带宽,减少 GPU 等待数据的空闲时间,同时也改善了传输大数据块时的性能和时延抖动问题。(但对于小规模数据传输,Ring算法可能会表现出较高的延迟和低效。)

工具说明:NCCL-Tests

NVIDIA提供的NCCL是当前面向AI的集合通信事实标准,NCCL-Test 是 NVIDIA 开源的工具,我们可以在官方Github下载来进行不同算法的性能测试(例如:ring,trees…)。本次测试使用All reduce的ring算法来进行性能评估。

root@bm-2204kzq:~# /usr/local/openmpi/bin/mpirun  #多机集群测试需要使用MPI方式执行
    --allow-run-as-root 
    -bind-to none  #不将进程绑定到特定的CPU核心
    -H 172.17.0.215:8,172.17.0.81:8 # host列表,:后指定每台机器要用的GPU数量
    -np 16 #指定要运行的进程数,等于总GPU数量
    -x NCCL_SOCKET_NTHREADS=16 
    -mca btl_tcp_if_include bond0 
    -mca pml ^ucx -mca btl ^openib #指定BTL的value为'^openib'
    -x NCCL_DEBUG=INFO #NCCL的调试级别为info
    -x NCCL_IB_GID_INDEX=3  
    -x NCCL_IB_HCA=mlx5_0:1,mlx5_2:1,mlx5_3:1,mlx5_4:1 
    -x NCCL_SOCKET_IFNAME=bond0  #指定了 NCCL 使用的网络接口
    -x UCX_TLS=sm,ud  #调整MPI使用的传输模式
    -x LD_LIBRARY_PATH -x PATH 
    -x NCCL_IBEXT_DISABLE=1 #如使用RoCE网络,此处应禁用
    -x NCCL_ALGO=ring  
/root/nccl-tests/build/all_reduce_perf -b 512 -e 18G -f 2 -g 1 #执行all reduce操作

NCCL-Tests常用参数及解释

  • GPU 数量

    • -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> 每次增加的倍数,默认禁用;

  • NCCL 操作相关配置

    • -o,--op <sum/prod/min/max/avg/all>指定哪种操作为reduce,仅适用于Allreduce、Reduce或ReduceScatter等操作。默认值为:求和(Sum);

    • -d,--datatype <nccltype/all>指定使用哪种数据类型,默认 : Float;

  • 性能相关配置

    • -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;

案例验证:优化GPU互连拓扑

下图是一个未优化的双机8卡(H20)组网测试拓扑:

按照一般CPU云数据中心的连接方式,将同服务器的网卡连接到一台交换机上,两台交换机之间有4条400G链路相连。参与测试的为星融元(Asterfusion)交换机(CX732Q-N,32 x 400GE QSFP-DD, 2 x 10GE SFP+)。

图片

NCCL-Test 性能测试结果

#                                                              out-of-place                       in-place          
#       size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
#        (B)   &
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值