NCCL性能调优参考
本文可以当做你调优的一个参考维度,不一定非常的全面。咱们从NCCL底层涉及的对性能可能有影响的各个维度展开讨论:
一、网络开启pfc流控
RDMA网络对丢包是极其敏感的,丢包会导致网络性能大幅下降。
参见:https://support.huawei.com/enterprise/zh/doc/EDOC1100153180/c2aa1fe4
所以咱们要实现参数面网络为无损网络(不丢包),就得开启PFC流控策略。这需要网络的所有环节全部开启pfc,即:源服务器网口,交换机入口,交换机出口,目的服务器网口。
ps,具体操作命令可以参考《2个RoCE网卡Bond聚合,实现带宽X2》文章里面有写。华为云上,是选择队列4开启pfc。
二、设置合适的 buffer_size 大小
开启pfc后,就受到网口缓存的影响,即:当接收缓存快满了,就会发出“请暂停发包”的pfc帧通知发送方,来暂缓发包。所以我们可以尽量将网络上各个环节的网口缓存调大一些。
以下是服务器网卡相关的:
查询buffer_size
cat /sys/class/net/enp80s0f0/qos/buffer_size
Port buffer size = 1027728
Spare buffer size = 851616
Buffer Size xoff_threshold xon_threshold
0 20016 0 0
1 156096 86976 66960
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 0
6 0 0 0
7 0 0 0
可以看到,总共有8个buffer,分别对应8个优先级队列。(注:xoff阈值那列,下文会讲)
缓存跟优先级队列对应齐关系:
cat /sys/class/net/enp106s0f0/qos/prio2buffer
Priority Buffer
0 0
1 0
2 0
3 0
4 1
5 0
6 0
7 0
可以看到,咱们是队列4开启的pfc,队列4对应buffer缓存是1. 而1的空间是156096字节。咱们增大队列4对应的缓存空间就行:
修改网卡队列4的 buffer_size:(这里我通过不断增大第2个参数,来逼近“最大值”。因为我也没有找到,怎么查询最大buffer可以是多少的命令,知道的朋友可以留个言。)
echo 20016,589823,0,0,0,0,0,0 > /sys/class/net/enp106s0f0/qos/buffer_size
如:
按理,调大对带宽保持高利用率是有好处的。
三、设置合适的MTU
我们知道网卡发出去的单个报文越大,带宽利用率可以更高。但是RoCE网卡的发出报文实际MTU是受到2个因素影响:
- RoCE的MTU可选的值有:256, 512, 1024, 2048 or 4096 bytes. (2^N 次)
- 但同时,又必须小于网卡设置的MTU。(即:2^N = 最终值 < 接口MTU)
所以网卡设置的MTU推荐如下:
- 为了使用MTU为4096 - 配置网卡MTU为4200
- 为了使用MTU为2048 - 配置网卡MTU为2200
参见:https://support.mellanox.com/s/article/MLNX2-117-1682kn
同时文章提到,网卡本身没有必要置过大的MTU。比如设置为9000,会浪费内存(因为实际生效是4096,所以网卡MTU其实4200就够了)。
查询网卡实际生效的MTU值:
/root # ibv_devinfo -d mlx5_0
hca_id: mlx5_0
transport: InfiniBand (0)
fw_ver: 22.31.1014
node_guid: 08c0:eb03:008c:32ec
sys_image_guid: 08c0:eb03:008c:32ec
vendor_id: 0x02c9
vendor_part_id: 4125
hw_ver: 0x0
board_id: MT_0000000359
phys_port_cnt: 1
port: 1
state: PORT_ACTIVE (4)
max_mtu: 4096 (5)
active_mtu: 4096 (5)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet
四、设置合适的网线长度
依然是pfc流控相关的。我们知道,缓存空间“快满”时,会发“别再发啦”的通知帧。那到底什么是“快满”了呢?
Xon/Xoff就是表示,触发「满」到「空闲」的值。如果能调大 Xoff值,就可以接收更多的数据,从而延缓发送“暂停发包”的pause帧。
然而,Xoff阈值,并不能单独配置(不是一个百分之多少的参数)。而是根据“网线长度,网卡速率,MTU大小”相关的公式算出来的。
如下:
xoff = ((301+2.16 * len [m]) * max(speed [Gbps], 40Gbps) + 2.72 MTU [B])
xoff_threshold = buffer size - xoff
xon_threshold = xoff_threshold - 9216
由第一行可以看出:
网线长度越小,就可以使得xoff越小,然后xoff阈值更大 ==》可以收更多的报文,更迟的触发pause帧。
所以,设置正确的网线长度,也可以影响性能。
查询网线信息:
mst cable add
mlxcables -d xx
设置:
mlnx_qos -i ens1f0 --cable_len 10
(默认值是7米。可以根据实际机房情况,选购稍微短一点的网线长度,或者故意将此值设置的比真实网线小一点,来忽悠驱动放大xoff阈值,使得缓存可以接收更多的报文)
参考:https://enterprise-support.nvidia.com/s/article/howto-tune-receive-buffers-on-mellanox-adapter-cards
五、交换机侧调优
1. PFC调优
pfc除了服务器测,交换机侧也同样重要。同样是“缓存空间”相关的参数为主:
- 设置合适的 alpha 值
- 设置合适的缓冲区大小,Cells
- 如果是双网卡聚合(Bond)口,设置合适的hash分担策略
例如:
dcb pfc buffer 4 xoff dynamic 4 hdrm 3000 cells
具体命令,依旧可以参考《2个RoCE网卡Bond聚合,实现带宽X2》一文。
2. 路由均衡
由于CLOS网络连接的拓扑,我们不希望所有服务器的报文全部压到同一台交换机的某个口上面。最好是均匀的分散到所有交换机上。
所以,这里需要合理的分配服务器网卡的IP地址+网段。一般要求,网段和IP要在不同的服务器间均衡的错开。
可以参考:https://support.huawei.com/enterprise/zh/doc/EDOC1100243309/2d4291f2
六、NCCL参数调整
在RDMA网络配置已经设置好的情况下(一般网络管理员都配置好了,咱们没法参与修改),那咱们就通过NCCL相关参数来调优:
1. 网卡配置
前面辛辛苦苦设置好参数面网络中,队列4开启PFC流控策略,那么我们就得确保我们的报文,都是匹配队列4的。所以这些参数需要设置:
NCCL_IB_TC=128
指定报文Traffic Class类似,以便使用pfc队列4。
NCCL_IB_HCA=mlx5
前缀匹配,指定需要使用的RoCE网卡。
NCCL_IB_GID_INDEX=3
默认值0,这里必须设置为3。 0和1表示ipv6的。 2和3才是ipv4。
2表示使用 RoCE V1协议,3表示使用RoCE V2协议。所以我们这里要选3。
2. 性能配置
在pfc流控参数设置好后,接下里就是NCCL调优了。以下是收集的可能影响NCCL性能的参数,仅供参考:
NCCL_IB_RETRY_CNT=15
默认值7,可以适当调大,以规避偶尔出现的异常。
NCCL_IB_TIMEOUT=18
可选1-22,默认值18, 2.14版本前默认 14。好像我们主要调上个参数(RETRY次数),这个超时时间没怎么调,自己测试看看吧。
NCCL_IB_QPS_PER_CONNECTION=8
默认值1, 不少地方推荐4
NCCL_IB_SPLIT_DATA_ON_QPS=0
默认1
NCCL_BUFFSIZE
默认4M
NCCL_IB_AR_THRESHOLD=5242880
AR功能,还没有怎么研究,具体效果需要自己验证。
NCCL_MAX_NCHANNELS
大于32
NCCL_NET_GDR_LEVEL=2
该参数会根据环境自动确定,你也可以根据DEBUG信息,主动设置。
剩下两个是Socket相关的,影响较小(RDMA通信前的“握手”信息),但是蚊子腿也是肉。
NCCL_SOCKET_NTHREADS=4
默认值1,官网说100G网络,该值可以设为4
NCCL_NSOCKS_PERTHREAD=4
默认值1,官网说100G网络,该值可以设为4
3. 集合通信算法
除了上面的参数,还有个集合通信算法,也会有影响:
NCCL_ALGO=Tree
NCCL_ALGO=RING
参考:https://zhuanlan.zhihu.com/p/597081795
- 点赞
- 收藏
- 关注作者
评论(0)