NCCL性能调优参考

举报
tsjsdbd 发表于 2023/10/11 15:51:22 2023/10/11
【摘要】 本文可以当做你NCCL性能调优的一个参考,不一定非常的全面。咱们从NCCL底层涉及的对性能可能有影响的各个维度展开讨论

 

本文可以当做你调优的一个参考维度,不一定非常的全面。咱们从NCCL底层涉及的对性能可能有影响的各个维度展开讨论:


 

一、网络开启pfc流控

RDMA网络对丢包是极其敏感的,丢包会导致网络性能大幅下降。

参见:https://support.huawei.com/enterprise/zh/doc/EDOC1100153180/c2aa1fe4

 

所以咱们要实现参数面网络为无损网络(不丢包),就得开启PFC流控策略。这需要网络的所有环节全部开启pfc,即:源服务器网口,交换机入口,交换机出口,目的服务器网口。

 

ps,具体操作命令可以参考《2RoCE网卡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

可以看到,总共有8buffer,分别对应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个因素影响:

  1. RoCEMTU可选的值有:256, 512, 1024, 2048 or 4096 bytes. 2^N 次)
  2. 但同时,又必须小于网卡设置的MTU。(即:2^N = 最终值 < 接口MTU

 

所以网卡设置的MTU推荐如下:

  • 为了使用MTU4096 - 配置网卡MTU4200
  • 为了使用MTU2048 - 配置网卡MTU2200

参见: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除了服务器测,交换机侧也同样重要。同样是“缓存空间”相关的参数为主:

 

  1. 设置合适的 alpha
  2. 设置合适的缓冲区大小,Cells
  3. 如果是双网卡聚合(Bond)口,设置合适的hash分担策略

例如:

dcb pfc buffer 4 xoff dynamic 4 hdrm 3000 cells

具体命令,依旧可以参考《2RoCE网卡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,这里必须设置为301表示ipv6的。 23才是ipv4

2表示使用 RoCE V1协议,3表示使用RoCE V2协议。所以我们这里要选3

 

2. 性能配置

pfc流控参数设置好后,接下里就是NCCL调优了。以下是收集的可能影响NCCL性能的参数,仅供参考:

 

NCCL_IB_RETRY_CNT=15

默认值7,可以适当调大,以规避偶尔出现的异常。

 

NCCL_IB_TIMEOUT=18

可选1-22默认值182.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

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。