ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

RoCEv2实战:大模型训练网络的核心原理与故障排查

RoCEv2实战:大模型训练网络的核心原理与故障排查 前阵子帮朋友排查一个万卡训练集群的异常现象很典型GPU利用率掉到60%以下NCCL的AllReduce时延飙到正常值的两倍甚至出现周期性的“掉卡”报错。折腾一圈下来问题出在RoCEv2网络的PFC死锁和ECN水线配置上。说实话这类故障在现在的AI Infra团队里太常见了——大模型训练网络已经把RoCEv2逼到了极限而很多人对它背后的运行机制还停留在“无损以太网”这个模糊概念上。如果你也在做大模型训练相关的工作无论是网络工程师、AI平台运维还是算法工程师想搞明白自己训练作业为什么变慢这篇文章都值得看完。我会从RoCEv2为什么能扛起大模型训练网络讲起拆解它的核心技术原理再落到实际部署中的拓扑设计、参数配置和故障排查。全是实际集群里验证过的东西不是网上抄来的概念。1. 大模型训练把网络逼到了什么地步1.1 从数据并行到MoE通信模式的质变大模型训练的网络负载跟传统云计算的“南北向流量”完全不同。传统业务大多是客户端到服务器的小流量、高并发而训练集群里是GPU卡之间的“东西向流量”而且是动辄几十GB的集体搬运。拿经典的AllReduce来举例。数据并行场景下每张卡算完自己的梯度需要把梯度Reduce一下再广播回去。几万张卡同时做这个操作通信量不是简单相加是成倍放大。这里有一个大家常用的估算公式一次AllReduce的数据量约等于模型参数量的2倍时间步数一叠加单位时间内要搬的字节数非常惊人。到了千亿参数模型单次AllReduce就要搬运200GB以上的梯度数据而一个训练iteration往往只有几秒留给通信的时间窗口极其苛刻。真正让网络压力陡增的是MoE混合专家模型的普及。MoE模型里每个token只会经过部分专家这就导致序列在不同的专家之间反复分发和聚合形成了大量的All-to-All通信。这种通信模式下每张卡都可能和集群里的任意一张卡交换数据流量模式不再是规律的环形或树形而是变成了一张无形的“全网乱序蜘蛛网”。再加上张量并行和流水线并行不同并行维度之间还有各自的通信需求。一个典型的千亿参数训练作业往往同时存在数据并行的AllReduce全卡参与大数据量张量并行的AllReduce节点内小数据量高频率流水线并行的点对点通信前后层之间中等数据量MoE场景的All-to-All全网卡间随机通信突发性强这四种通信流量叠加在一起网络里的流量模型已经不是“潮汐式”的而是随时可能瞬间打满任何一个端口。传统TCP的拥塞控制在这种场景下根本来不及反应一旦出现微小的拥塞丢包重传就会让通信时延成倍放大训练迭代速度直接崩盘。1.2 训练网络真正的三条硬指标我们评估一张训练网络到底行不行核心看三个数字有效带宽、尾延迟、丢包率。有效带宽好理解就是训练通信能实际用到的带宽而不是网卡的标称速率。很多情况下明明都是400G网卡实际NCCL跑出来的带宽只有300G甚至更低。差距就出在网络协议的效率上。尾延迟是很多算法工程师容易忽略的指标。大模型训练是典型的同步并行模式——每一轮迭代都要等所有GPU都算完、通信完成才能进入下一轮。哪怕9999张卡都完成了只剩下1张卡因为网络重传慢了100毫秒整个集群都得等它。所以训练网络对延迟的要求不是“平均延迟低”而是“最差延迟也不能高”。RoCEv2的PFC机制也好拥塞控制也好本质上都是在努力压住那个尾延迟。丢包率就更致命了。对普通Web服务来说0.1%的丢包可能只是让页面加载慢了一点用户感知不强。但到了RDMA网络里RoCEv2的硬件卸载机制对丢包极其敏感一个报文丢了整个发送队列可能都要停下来等重传实际的通信效率会断崖式下跌。这也是为什么RoCEv2要依赖PFC这类流控手段来保证“无损”——它不是洁癖是没办法。2. RoCEv2的技术底座无损以太网是怎么炼成的2.1 为什么传统以太网在RDMA面前不够用先简单回顾一下RDMA的演进。RDMARemote Direct Memory Access本来是InfiniBandIB网络的看家本领它允许网卡直接读写对端主机内存绕过CPU和内核协议栈把延迟做到微秒级别。但IB网络的问题是贵而且需要专用的交换机、专用线缆生态封闭。于是就有了RoCERDMA over Converged Ethernet方案。第一代RoCEv1直接MDA在以太网二层上不能跨VLAN路由只能在同一个二层域里玩无法应对大规模集群组网。到了RoCEv2把RDMA报文封装进了UDP/IP里这样就能依赖标准的三层路由跨子网传输从根本上解决了规模扩展的问题。RoCEv2也因此成了目前绝大多数AI训练集群的默认选择。为什么传统TCP以太网干不了这个活本质原因是TCP为“尽力而为”的互联网设计重传机制健壮但开销太大。TCP的发送窗口和ACK机制在长肥管道里需要很长的建立时间而且CPU需要处理大量中断和协议栈逻辑根本无法支撑上万张卡同时以接近线速的速率通信。RDMA则把整个数据传输路径卸载到网卡的硬件里从内存到内存核心CPU完全不参与用户态数据拷贝。一台机器上的两张400G RDMA网卡CPU占用率能控制在个位数以内换成传统网卡打满就得烧掉好几个核。2.2 PFC机制为无损付出的“刹车”代价要实现无损以太网关键在流控。RoCEv2依赖的核心机制是802.1Qbb也就是PFCPriority Flow Control优先级流控。PFC的思路很朴素交换机上每个端口有多个队列按优先级区分。当某个高优先级队列的缓冲占用超过阈值时交换机就会向对端发送一个PAUSE暂停帧让对方在指定时间内暂停发送这一优先级的流量。等到缓冲区降下来再发一个恢复信号。这就像高速公路上前方车流拥堵交警大哥用对讲机喊话“后边的车先停一停别往前挤了。”PFC看起来是个好方案但在大规模训练集群中暗藏杀机。最典型的问题就是PFC死锁——也叫PFC风暴。当网络拓扑中存在环路包括逻辑环路时A交换机发PFC暂停BB暂停CC又暂停A形成一个环形等待队列头部阻塞整个网络的吞吐量瞬间归零。就算没有物理环路优先级设计不合理造成的拥塞树也能导致类似问题。我调研过不少大型训练集群很多团队对PFC是又爱又恨。有经验的网络团队会把PFC的buffer阈值调得异常保守宁可让队列多留些余量也不轻易触发流控。另外还要给PFC预留独立的优先级队列不像普通业务流量那样混在一起。这里先留个悬念具体怎么配我在后面章节会有完整的实操说明。2.3 ECN和DCQCN避免“刹过头”的关键PFC是粗粒度的链路层流控只有“停”和“走”两个状态很容易刹过头。真正让RoCEv2在拥塞控制上具备“细颗粒度”的是ECN显式拥塞通知配合DCQCN拥塞控制算法。ECN的原理是交换机检测到队列长度超过阈值后不再发送暂停帧而是在IP包的ECN字段上打个标记。接收端看到这个标记就生成一个CNP拥塞通知报文反向发给发送端。发送端收到CNP后按比例降低发送速率同时周期性探测是否恢复如果一段时间没有新的CNP就逐渐提升速率。这个机制类似聪明的高速公路管理不是直接封路而是通过广播告诉所有司机“前方拥堵请减速慢行”让车流平滑地调整速度。DCQCN算法里有两个参数很有意思一个是注水速率恢复到原速的速度一个是降速比例收到CNP后砍掉多少速率。如果降速太激进会浪费带宽如果太温和拥塞又控制不住。实际调优时这两个参数往往要结合具体的流量模型反复测试。我在3.2节会有具体的配置参考值。有了PFC ECN DCQCN三件套RoCEv2才能实现在普通以太网硬件上跑出接近InfiniBand的效果。但要注意“无损”只是优先队列层面的无损不是真正意义上所有流量都不丢包。理解了这个底层逻辑后面很多故障排查就有头绪了。2.4 RoCEv2和InfiniBand绕不开的选型命题聊RoCEv2就绕不开和InfiniBand的对比。头部互联网公司的超大集群以及很多云计算大厂旗舰训练集群往往选择IB网络理由很简单IB设计之初就是给HPC的RDMA用的天生的无损架构有自研拥塞控机制比如NPB、自适应路由稳定性更可控。但IB的问题也摆在明面上——贵、专有、绑定厂商。InfiniBand实现同等规模组网的成本通常比RoCEv2高出50%甚至更多。而且IB交换机的开放性和可编程性不如白盒以太网运维团队想做深度调优和监控时受约束更多。不可否认IB依然是性能天花板但RoCEv2在成本和通用性上的优势让它在绝大多数企业级大模型训练场景里成了务实之选。我的观点是如果团队预算充裕、有专职高性能网络工程师长期维护选IB省心。如果预算有限、更追求灵活性和生态兼容RoCEv2是个够用的方案前提是你得愿意花时间在它的PFC、ECN调优上。据我了解国内许多训练集群走的都是“RoCE为主、IB为辅”的路线实际跑出来的吞吐量差距已经很小了。3. 训练集群中的RoCEv2拓扑设计与配置实操3.1 两层还是三层Spine-Leaf拓扑的取舍RoCEv2网络设计的第一步是确定拓扑。目前主流的训练集群是Spine-Leaf叶脊架构这也是为了支撑大模型的All-to-All流量而做的必选项。两层Spine-Leaf是常见的配置所有Leaf接入交换机和所有Spine核心交换机之间做ECMP等价多路径GPU服务器挂在Leaf下全网任意两台服务器之间的路径数等于Spine的数量。以大热的400G RoCE网络为例假设有64个Spine端口、128个Leaf理论上有64条等价路径。流量进入网络后哈希算法会把这些流量尽量均衡地分散到64条链路上。但两层架构在巨型集群面前会有瓶颈。一个万卡集群单机8卡就需要1250台GPU服务器按照一台服务器2个400G端口接入来算至少需要2500个Leaf接入端口。如果Spine层要提供足够的带宽收敛比就需要成倍的Spine交换机机架空间、功耗、光纤数量都是巨大的负担。所以很多超大规模集群会选择三层设计在Spine之上再加Core层好处是扩展性好坏处是路径变长、延迟增加而且PFC死锁的风险范围更大。从实际经验看千卡以下集群用两层完全够万卡级建议直接上三层中间不要再抠收敛比——训练网络的收敛比必须做到1:1任何收敛都意味着流量无路可走拥塞概率急剧上升。3.2 交换机选型与buffer预算的硬道理RoCEv2最吃交换机的地方在于buffer也就是端口缓冲区。为什么buffer这么关键因为RoCEv2的“无损”依赖PFC和ECN来吸收瞬时突发流量。当多个GPU同时向一个端口灌流量瞬间的burst可能超过链路带宽队列来不及排队就必须有buffer来缓冲。Buffer不够交换机只能丢包丢包对RoCEv2的伤害远大于对TCP的伤害。在选型上我建议明确区分“深buffer”和“浅buffer”交换机深buffer交换机典型单端口共享buffer在几十MB以上适合核心层和汇聚层。浅buffer交换机典型共享buffer只有几MB到十几MB适合接入层且流量相对规律的场景但如果在接入层承担过多突发流量很快就会成为瓶颈。厂商的具体数值差异很大但都要围绕一个公式来算总buffer除以活跃端口数得到单端口有效buffer。比如一台交换机共享内存32MB、有128个端口单端口能拿到的buffer只有256KB。在400G端口上256KB只够缓存约0.005毫秒的流量一个微小的转瞬即逝的脉冲就能打穿。所以大型训练集群的交换机选型预算再紧核心层的buffer口碑也不能含糊否则后续排查PFC风暴时你就知道了光看计数器都会怀疑人生。3.3 部署配置的完整命令与参数备忘下面给出一套经过实测的RoCEv2部署配置模板适用于主流的Cumulus Linux或SONiC系交换机。这里以MLNX_OFED驱动环境下的Linux主机侧和交换机侧为例代码片段可以直接参考具体参数请根据自己的网络规模和流量模型调整。交换机侧核心配置SONiC风格示意# 启用PFC为RoCEv2流量预留优先级队列此处以优先级3为例 # 400G需要精确计算阈值此时假设交换机共享buffer为32MB # 开启该优先级队列的PFC能力 config qos pfc enable 3 # 设置ECN水线阈值可以先用保守值 # 低阈值为共享buffer 40%高阈值60% config qos ecn 3 low-watermark 40000 high-watermark 60000 # 配置无损队列的调度权重让RoCEv2流量相对其他业务获得高优先级 config qos scheduling-priority 3 weight 8主机侧配置Mellanox网卡推荐参数# 查看当前网卡的RoCE模式确保是RoCEv2 sudo mlxconfig -d mlx5_0 query | grep ROCE # 开启自适应速率和ECN支持 sudo mlxconfig -d mlx5_0 set ROCE_MODE2 # 1RoCEv1, 2RoCEv2 sudo mlxconfig -d mlx5_0 set ECN_ENABLE1 # QP拥塞控制参数DCQCN相关数值为建议起点 sudo mlxconfig -d mlx5_0 set CC_ACTIVE1 sudo mlxconfig -d mlx5_0 set CC_QOS_LINK_BW1000很多团队刚上手时把ECN水线设得很激进低阈值设得很小结果交换机动不动就打上ECN标记DCQCN频繁降速带宽反而跑不满。我的建议是初期把ECN水线调得保守一些阈值高一些让PFC兜底先确保无丢包再逐步调低水线寻找带宽和时延之间的平衡点。3.4 多租户场景下的QoS与隔离设计训练集群往往不是单一团队独占多个训练任务、推理服务共存这时候QoS设计的价值就体现出来了。很多集群出问题不是RoCEv2本身不行而是不同业务的流量互相干扰。方案一是按物理隔离比如按GPU分区划分独立的网络平面每个租户独享一套RoCEv2网络平面。好处是隔离彻底、故障边界清晰坏处是可扩展性差、成本高。方案二是通道隔离在共享物理网络的基础上用VLAN PFC优先级队列区分业务。RoCEv2流量的优先级队列固定在一个PFC class上其他流量走普通队列互不干扰。实际运维中我强烈建议至少在服务器侧给RoCEv2流量和存储流量分配不同的优先级队列。我们遇到过的最典型的故障场景是存储集群在做数据备份时突发流量占满了整条链路直接把正在训练的任务挤成了乌龟爬。后来通过在交换机侧将存储流量压入低优先级队列、训练流量保留在高优先级队列这个问题才彻底解决。4. 训练集群中那些磨人的RoCEv2故障与排查实录4.1 PFC风暴一条命令定位问题的完整链路先讲一个我实际处理过的案例。客户反馈2000卡训练集群的吞吐量从日均85%突然跌到30%NCCL测试跑出来的AllReduce带宽不到正常值的一半。第一反应是排查链路光看端口流量全部正常没有任何链路错误。然后看GPU也没有异常。最后把目光落到交换机PFC计数器上。# 在交换机上查看PFC控制帧计数SONiC show pfc counters # 输出留意每个端口高优先级队列的PFC Tx/Rx计数和Duration不问不知道一问吓一跳所有Leaf上联Spine的端口PFC Tx计数都在疯狂上涨说明Leaf一直在被Spine“喊停”。这就是典型的PFC风暴前兆。接下来做的是逐段定位哪个端口在持续发送PFC暂停帧以及哪个前置节点在持续接收PFC。用如下命令逐级排查# 查看具体端口的PFC暂停帧计数及持续时间 show queue pfc counters interface # 查看Ingress/egress队列的Byte计数找出异常增长队列 show queue counters interface通过对比发现故障源不是服务器而是某几台Spine上联Core的端口。这些端口的PFC暂停帧持续较长并且这些暂停帧引起了上层交换机的队列堆积最终蔓延到全网。问题本质是连接多个Leaf的某台Spine交换机buffer已经耗尽因为某个训练任务突然产生了全网All-to-All通信链路过载PFC在整个网络上“连锁踩刹车”。根因确认后我们做的不是加buffer而是针对这个大流量任务单独调控优先级并重新分配ECN水线让拥塞反馈更快、更早到达发送端而不是等到buffer耗尽才开始PFC。从那以后这个集群的PFC风暴再没有发生。4.2 ECN参数调优为什么水线调低反而变好了另一个常见现象是带宽跑不满。刚接入RoCEv2时如果按厂商默认参数跑很多集群达到预期的八成性能就不错了。问题往往出在ECN水线上。举一组实测数据。某集群跑GPT-3级别模型默认配置下ECN标记率大概在0.1%到0.2%但带宽只能到260G/400G。后来把ECN低水线从40000KB下调到30000高水线从60000下调到50000重点是把DCQCN的降速比例从默认值调得更平滑带宽反而提升到340G/400G同时尾部时延还下降了5%。原因很简单默认水线太高交换机要等到队列堆积很严重才打ECN标这时候拥塞已经扩散了速度已经刹不住了。而水线调低之后拥塞能在早期被发现发送端及时微调反而避免了大幅降速。不过ECN水线不是越低越好。有次我们把低水线从30000压到20000结果出现了TCP-like的锯齿波流量忽高忽低有效带宽反而下降。ECN标记率超过了3%DCQCN在“快速降速、缓慢恢复”之间反复横跳。所以调参要有耐心每次只动一个变量标记率、带宽、时延三个指标一起记录。4.3 一条CC消息引发的“血案”拥塞通知报文的影响RoCEv2的拥塞通知报文CNP虽然不是什么庞然大物但它在高拥塞时的行为极其重要。CNP是接收端发给发送端的告诉对方自己收到了带ECN标记的包请降速。问题在于CNP本身也消耗网络资源而且它是高优先级如果交换机的CNP处理路径和RoCEv2普通数据报文出现在同一个队列会加剧拥塞。很多厂商默认把CNP放在最高优先级队列这本身没问题但如果同时存在大量CNP它占了无谓的带宽实际数据带宽就会下降。排查时可以看CNP计数器# 网卡侧查看CNP计数 ethtool -S interface | grep -i cnp # 交换机侧查看PFC和ECN相关计数器 show pfc counters我见过一个极端案例某厂商网卡在特定固件版本下CNP生成频率异常高导致全网吞吐下降20%最后通过升级网卡固件、调整ECN阈值才解决。这种问题最难就是因为单看数据面一切“正常”只能靠CNP计数器对比各个节点的数据来定位。4.4 NCCL测试与日常监控给RoCEv2做体检的正确姿势排查完后日常监控不能掉链子。我固定每个季度会对训练集群做一次RoCEv2专项体检工具和命令如下perftest套件ib_write_bw、ib_read_lat直接测RDMA收发带宽和时延判断网卡和链路健康度。nvidia-smi dmon配合监控GPU利用率、显存读写和NCCL通信占比。ethtool -S观察网卡侧丢包、CRC错误、CNP、PFC暂停帧。交换机侧持续采集PFC计数、ECN标记计数、buffer占用率、端口瞬时流量。体检结果要画成趋势图重点看三个指标的周环比PFC暂停帧计数、ECN标记率、CNP计数。任何一个出现持续上升都说明拥塞在积累有演变成大故障的苗头。正常的集群这三类计数应该是低而平稳的。5. 从运维视角看RoCEv2的底线与未来做运维越久越明白RoCEv2不是万能的但它确实是大模型训练网络当下最务实的一种解法。相比InfiniBand的封闭和昂贵RoCEv2给了我们一个“基于标准以太网”的持久化方案。哪怕是新建网络未来从RoCEv2迁移到更新的无损方案风险也可控。我的核心体会是RoCEv2的好坏很大程度上取决于运维团队对它的理解深度——PFC、ECN、DCQCN这三套机制像三根绳子系紧了会勒死性能放松了又会丢包。你必须建立一整套监控、告警和快速定位能力才能真正“扛起”大规模训练网络。很多人选RoCEv2是为了省钱结果省下来的硬件成本最后都变成了人力排查成本这一点大家要有心理准备。最后分享一个小技巧在集群环境里做RoCEv2变更一定记得先在单台机器上验证再批量下发。我们曾经因为在交换机上统一调整ECN阈值结果不同厂商、不同型号的交换机对阈值的单位理解不一样导致全网流量雪崩训练中断了两个小时。从那以后我养成了每次只动一小批端口、观察半小时再继续的习惯。这个习惯建议你也养成。
返回列表