NCCL中设置不同的RDMA优先级

    Hurray 9691次浏览 5条评论 3060字

#网络 #深度学习 #RDMA #QoS #NCCL

> `NCCL`用在`分布式深度学习训练`中时,如果所在集群流量混杂,则可以考虑调整优先级`QoS`的方法来保证分布式训练性能。使用[IB]^(Infiniband)网络可以达到[RDMA ]^(Remote Direct Memory Access)的低延迟保证。`NCCL`中提供了环境变量以支持`IB`环境下的`QoS`支持。 [TOC] ## 具体方法 设置环境变量: ```txt NCCL_IB_HCA 该环境变量用于获取虚机用的那个ib设备 NCCL_IB_GID_INDEX,该环境变量指定用ib设备的哪个index来跑rocev2。 NCCL_IB_TC,用于设置流量的DSCP,例如105,就是设置流的优先级。 ``` --- ## IB piority原理 `RDMA`是无法容忍丢包的,也就是说`RDMA`需要`loseless`网络环境,这是`infiniband`网络的天然优势。但我们的`IDC`是`ethernet`网络环境,无法提供`loseless`的网络,因此为了让`RDMA`跑在`etherne`t上,必须想办法为ethernet提供不丢包的网络,`RoCEv2`诞生了(`RoCEv1`只能跑在一个`二层局域网`环境下,要求都在一个网段,限制比较大。`RoCEv2`可以利用`三层网络`)。 简单来说,`RoCEv2`是在(主机上部署`PFC`+`DCQCN`算法)+(交换机使能`ECN`)+(交换机`QoS`设置)来保证网络在因为网络拥塞快发生丢包的时候,及时让发送端降速,来保证网络不丢包。 ### PFC 首先来说一下[PFC ]^(priority flow control)。最开始为了保证`loseless`环境,就只使用了`PFC`技术。它的原理是把主机发出来的数据流分成了几个优先级(一般是8个,0-5是业务流,6-7是控制流),然后可以为不同数据流指定不同优先级(怎么指定下文再说),如果不指定,默认就为0。 ![](https://file.hurray0.com/uploads/menu/138/35a857b987e8ee6557a71eda2e6a869f.png) 当设备的出口转发发生拥塞,导致接收报文的入端口`Buffer` 占用超过`PFC` 水线,会触发Pause 帧进行反压上游设备停止发包,具体机制描述如下: * 交换机SW2 的端口2 在转发数据流时出现拥塞,导致数据流在入口1 的`Buffer` 占用超过`PFC` 水线触发Pause 帧反压SW1 的端口2,以停止Priority 为3 的数据流发向SW2; * 收到Pause 帧的上游设备SW1 会暂停该优先级的数据流发送,同时SW1 的入端口1 还在接收数据流,导致SW1 的入端口1 的`Buffer` 占用增加。因此,SW1 的入端口1 的Buffer 占用依赖SW2 的入端口1 的`Buffer` 占用; * 如果上游设备SW1 的入端口1 的`Buffer` 也超过`PFC` 水线,会触发Pause 帧继续向上游反压; * 最终,从源头上降低该优先级数据流的速率,防止`拥塞`场景下出现丢包。 但`PFC`有很多缺点(如`PFC死锁`等),而且一级一级反压反应太慢了,因此又发明了`DCQCN`。__不过在这里,我们先记住,数据流会被划分为几个优先级,然后在不同优先级上可以分别使能`PFC`(不使能就不反压了)。__ __需要重点强调的时,在使能`DCQCN`的时候,`PFC`不是不使用了。他们两个是相辅相成的,`DCQCN`做为先头兵,先使能,控制发端降速,如果效果不好,再使能`PFC`(后边再详细讲)__ ### DCQCN 在`IP`的包头里边有个叫“区分服务”的8bit字段,这个字段又分成了2部分,6bit的dscp优先级,2bit的ecn字段。6bit对应64个优先级,2bit的ecn,00代表不支持ecn标记,10和01表示支持ecn,11表示网络发生拥塞,ecn已经置位了。 ![](https://file.hurray0.com/uploads/menu/138/da732a74f47b685b4ae355575b14d667.png) 大致原理如下: ![](https://file.hurray0.com/uploads/menu/138/1de2b1f2984f7f0e5b12c9563bb0d971.png) * Sender发送端(RP)发送`IP 报文`标记ECN(ECN=10); * 交换机(CP)在队列拥塞的情况下(判断的标准是根据dcqcn算法,跟pfc的水线不一样)收到该报文,将ECN 字段修改为11 并转发出去; * Receiver接收服务器(NP)收到ECN 为11 的报文发送拥塞,正常处理该报文; * 接收端产生拥塞通告,周期发送[CNP ]^(Congestion Notification Packets)报文,ECN字段为01,要求报文不能被网路丢弃; * 交换机收到CNP 报文后正常转发该报文; * 发送服务器收到ECN 标记为01 的CNP 报文解析后对相应的数据流限速算法; 一般来说,`DCQCN`判断拥塞的标准要被PFC严格(为了先使能`DCQCN`),因此sender一般不会等到一级一级的反压就会降速,避免网络发生拥塞丢包,从而保证loseless环境。但有一种情况可能会让`DCQCN`还没生效`PFC`就生效了,比如Sender和Receiver之间的交换机跳数太多。。有可能出现CNP报文还没到达Sender,一些交换机就拥塞了,然后一级一级反压,导致sender的pfc先生效了。因此,在使用`DCQCN`算法的时候,一般来说,交换机跳数不要太多。 ### 交换机`ECN`与`QoS`设置 `ecn`不用设置,现在的交换机默认都支持`ecn`。 在上边我们知道,交换机端口是有`buffer`的,用来缓存来不及发送的数据包。默认情况下,大家都是共享`buffer`,但如果划分了优先级后,还存在一个共享buffer的话,就不合理了。例如某环境下我们只用了3个优先级,分别是0,3和6。0对应普通的`tcp`/`udp`。3对应`rdma`流量,6对应的是`dcqcn`的控制报文。buffer分开后就可以分别使能`dcqcn`了。同时我们对调度也进行了相应的设置,在拥塞情况下,rdma:普通流量=2:1。也就是100G带宽,在满负载情况下可以保证`rdma`66G,普通流量33G ### 优先级与环境变量设置 前边说了,数据流被分为了不同的优先级,但如果不设置的话,优先级默认都是0。因此必须为`RDMA`设置优先级为3。 但有问题的是,`PFC`使用了8个优先级,`DSCP`呢使用了6个bit位,有64个优先级。如何关联起来? 实际上,交换机很难为64个优先级同时作用`dcqcn`和`pfc`等功能,一般都是划分为不超过6个,最多4个(流量根据优先级可以形象比喻为金银铜铁)。因此,在实际判定的时候,只看最高的3位。如下所示: dscp 8bit = 6bit优先级+2bit ecn 011 000 01 最后两位一般都是01和10,来表示支持`ecn`,那么前6位,如果rdma是优先级3的话,最好保证最高3为是011就可以了,中间的3位任意。那么理论上,可以为 011 000 01 011 001 01 。。。。。。 011 000 10 011 001 10 。。。。。 1. `NCCL_IB_HCA` 该环境变量用于获取虚机用的那个ib设备 2. `NCCL_IB_GID_INDEX`,该环境变量指定用ib设备的哪个index来跑`rocev2`。 ![](https://file.hurray0.com/uploads/menu/138/752f43940dc447ba861b0478f792f2c2.png) 3. `NCCL_IB_TC`,用于设置流量的`DSCP`,优先级3为105,就是设置流的优先级。 ### 主机和交换机上的一些配置 * 主机: ![](https://file.hurray0.com/uploads/menu/138/3494fe5dfa59ace8f932fea228e6de0c.png) * 交换机: ![](https://file.hurray0.com/uploads/menu/138/8f35f69622def4dea1ab6fbc5e195971.png) ![](https://file.hurray0.com/uploads/menu/138/fc022b54e85a9a0b4b54a2419939d71f.png) _本文鸣谢@tanglei_ 其他资料:[https://cloud.tencent.com/developer/article/1078931]()

最后修改: