十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

深入理解RDMA:零拷贝如何重塑AI集群网络性能

深入理解RDMA:零拷贝如何重塑AI集群网络性能 1. 为什么要聊 RDMA从一次内存拷贝说起还记得刚入行那会儿做分布式存储最头疼的就是网络延迟。业务方总抱怨写入慢我们第一反应是加带宽、换网卡结果 10GbE 升到 25GbE延迟还是那个鬼样子。后来才明白瓶颈根本不在链路带宽而在操作系统网络协议栈那套老流程里。你把一段数据从应用内存发给另一台机器上的应用传统 TCP/IP 路径大概是这样应用先调用 send()数据从用户态缓冲区拷到内核态缓冲区然后内核协议栈把它拆包、加头部、走网卡发送接收端反过来再一层层剥掉头部数据先从内核缓冲区拷到用户态缓冲区最后应用才能拿到。全程下来数据在内核里被折腾了好几趟。CPU 不是在大包小包地搬数据就是在处理中断真正干活的利用率低得可怜。RDMA 全称是 Remote Direct Memory Access直译就是远程直接内存访问。它要做的事情很简单粗暴让一台机器的应用可以直接读写另一台机器的内存而且整个过程不经过操作系统内核、不占用 CPU、不需要双方应用参与拷贝。这里的关键词是直接从内存到内存网络在里面只是一个搬运通道协议栈被大幅简化了。这篇文章会从内存搬运这个最底层的视角把 RDMA 的原理、核心概念和在 AI 集群网络里的落地方式拆开讲清楚。如果你在搞分布式训练、高性能存储或者只是对为什么 AI 集群非得上 RDMA感到好奇这篇应该能帮你把整个链路串起来。2. RDMA 到底解决了什么问题把 CPU 从搬运工岗位上解放出来2.1 传统网络栈的三个隐形开销先说一个反直觉的事实在高速网络上真正拖后腿的不是网线不是交换机而是操作系统。一次传统网络通信CPU 至少要做三件脏活累活第一件是内存拷贝。数据从用户态到内核态、再从内核态到网卡缓冲区每一跳都是一次实打实的 copy带宽越高拷贝消耗的 CPU 占比就越大。第二件是上下文切换。每次系统调用 send/recvCPU 都要从用户态切到内核态切换本身有开销频繁切换更会让 CPU 缓存凉掉。第三件是中断处理。网卡每收到一个包就触发一次中断CPU 得停下手里的事去处理虽然现在有 MSI-X 和多队列来缓解但高 PPS每秒包数场景下CPU 依旧可能被中断风暴淹没。这三件事叠加的结果就是CPU 大量时间在伺候网络真正干计算的时间被挤占而且延迟被拉到几十微秒级别。对于数据库同步、分布式锁这类场景这个延迟已经很难受了对 AI 分布式训练这种动辄几万次梯度同步的场景更是灾难。2.2 RDMA 的核心思想让硬件直接访问内存RDMA 的思路是釜底抽薪既然 CPU 搬运数据又慢又累那把搬运这件事交给网卡硬件来做不就行了RDMA 网卡HCA上有专门的处理器和 DMA 引擎它可以从应用内存里直接把数据打包发到网络接收端网卡再把数据直接写进应用指定的内存区域。要做到这一步需要三个前提内核旁路Kernel Bypass应用和网卡之间的交互绕过操作系统内核通过用户态驱动直接操作硬件队列。零拷贝Zero-Copy数据从发出到接收始终在应用内存和网卡之间直接流动不在内核缓冲区做中间拷贝。CPU 卸载CPU Offload传输层的组装、拆分、确认、重传全由网卡固件完成CPU 只在最开始下发任务、最后接收完成通知。这个设计带来的收益非常直接延迟从几十微秒降到一两微秒CPU 占用率大幅下降吞吐量还能往上走。我印象很深的是有个做高频交易的朋友他们从 TCP 换成 RDMA 之后单笔通信延迟直接降了一个数量级业务逻辑没改几行效果立竿见影。2.3 三种传输语义SEND/RECV、RDMA Read、RDMA WriteRDMA 并不只有一种通信方式它提供了三种基本语义理解这三种语义是看懂后续所有内容的基础。SEND/RECV 和传统收发消息类似但收发双方需要提前把内存缓冲区注册好、下发到网卡数据到达时由网卡直接写入接收缓冲区。这个适合消息长度不确定、需要灵活通信的场景。RDMA Write 是单向操作主动方直接把数据写到对端的内存地址里对端应用完全不需要参与甚至不知道数据来了除非主动去检查。这个语义非常适合把大批量数据推给对端。RDMA Read 反过来主动方从对端内存地址直接读取数据同样不需要对端应用参与。这个语义适合我需要数据但不知道对方什么时候准备好的场景。这三种语义里RDMA Write 用得最多因为 AI 分布式训练里的梯度同步、参数更新本质就是把数据写到对端内存Write 天然匹配。3. 核心概念逐层拆解QP、MR、WR 到底都是什么3.1 QP 是什么一条逻辑上的通信管道很多刚开始看 RDMA 文档的人第一个被绕晕的概念就是 QPQueue Pair。文档里总是说创建 QPQP 状态机QP 数上限听起来像某种神秘对象其实它没有那么复杂。QP 就是一对硬件队列一个发送队列SQ和一个接收队列RQ应用把待发送的任务WRWork Request扔进发送队列网卡自己取任务执行完成后在完成队列CQ里放一个完成通知CQE。QP 可以理解成在两个端点之间的一条逻辑管道所有的通信都通过这条管道进行。这里有几个容易混淆的点我踩过坑给大家捋清楚QP 是端到端的不是广播的。一个 QP 只连接一个对端你要是和 N 台机器通信本地就得建 N 个 QP。QP 分可靠和不可靠两种类型。可靠连接RC提供确认和重传丢包了网卡会自己重发应用无感知不可靠连接UC和不可靠数据报UD不保证送达靠上层自己处理。绝大多数场景默认用 RC。QP 的数量受硬件资源限制每个 QP 都要占用网卡的内存资源一个网卡能创建的 QP 数量是有限的大规模部署时这是需要提前规划的。3.2 内存注册与 MR为什么 RDMA 需要固定内存RDMA 能直接读写内存的前提是这块内存物理上必须存在而且不能被操作系统换页换走。因为网卡 DMA 访问的是物理地址如果内存被 swap 到磁盘上DMA 一读就是一堆乱码。所以应用在使用 RDMA 通信前必须先做内存注册Memory Registration把一段虚拟内存锁定在物理内存里并拿到一个内存区域描述符MRMemory Region里面包含这段内存的地址、长度、访问权限和一把钥匙rkey。这把钥匙很重要后续 RDMA 操作要靠它来校验访问权限。内存注册是要花钱的——注册和注销本身有开销所以实践中不会每条消息都注册一次而是采用三种常见策略预注册程序启动时一次性注册一大块内存整个生命周期复用。内存池维护一组注册好的缓冲区需要时从池里取用完归还避免反复注册。动态注册对频繁变化的小块内存做按需注册用ibv_reg_mr这类接口实时注册。我个人的建议是能预注册就预注册能把内存池用起来就用起来。在 AI 训练这类场景消息模式相对固定预分配加内存池的组合可以省掉大量不必要的注册开销。3.3 一次完整的 RDMA 通信流程把概念串起来看一次完整的 RDMA 通信就拿最常见的 SEND/RECV 举例首先两端各自创建 QP 和 CQ注册内存并拿到 MR。然后两端交换必要的信息包括 QP 编号、内存地址和 rkey 等这一步通常通过 TCP 连接或者别的方式完成叫做带外握手。接下来接收端先把一个接收请求RRReceive Request扔进 RQ表示我准备好收数据了往这块缓冲区里写。发送端构造一个发送 WR挂在 SQ 上网卡自动从发送缓冲区 DMA 数据、打包、发出去。接收端网卡收到数据后直接 DMA 写入接收端预置的缓冲区然后在接收端的 CQ 里生成一个完成通知。两端应用各自轮询或者等待完成事件确认数据传输完成。这个流程最关键的一点是真正的数据搬运完全由网卡完成应用层只是在最开始下发了任务、最后读取完成状态中间没有一次系统调用。4. RDMA 在 AI 集群网络中的角色从可选优化到标配底座4.1 AI 分布式训练为什么离不开 RDMA过去聊 RDMA大家想到的是存储网络、数据库同步这类对延迟极其敏感的场景。但这两年情况变了AI 分布式训练成了 RDMA 最大的增量市场甚至可以说没有 RDMA大模型训练根本跑不起来。原因在于分布式训练的工作模式。以最常见的 All-Reduce 梯度同步为例几百上千张 GPU 卡分散在几十台服务器上每训练完一个 batch所有卡都要把自己的梯度广播给其他人然后汇总求和再把更新后的参数同步回每张卡。这个环节里每张卡都要和其他所有卡通信通信量随卡数近似平方级增长。如果用传统 TCP 网络做梯度同步通信时间会轻松超过计算时间GPU 大部分时间在等数据利用率惨不忍睹。RDMA 的低延迟和高带宽加上它不占 CPU 的特性让梯度同步的开销被压到很低。实测中同一套模型从 TCP 换到 RDMA训练吞吐提升 30% 到一倍都不稀奇具体取决于通信占比。还有一点很多人忽略GPT 类模型的训练采用流水线并行和张量并行混合策略不同并行维度之间的通信模式差异巨大有的要广播、有的要规约、有的要全交换。RDMA 的多种传输语义和灵活的 QP 管理方式能比较好地适配这些复杂通信模式。4.2 AI 集群网络的典型组网形态AI 集群网络和传统数据中心网络有个显著区别它的东西向流量极大而且在训练期间几乎是持续满负荷运转。为了承载这种流量当前主流的方案是组建无阻塞的胖树Fat-Tree或类似拓扑核心层用支持无损以太网的高端交换机加上 RoCERDMA over Converged Ethernet或 InfiniBand 作为传输方案。InfiniBand 是 RDMA 的原生网络端到端设计自带无损保证性能最好但生态封闭、成本高。RoCE 则把 RDMA 跑在以太网上利用 PFC 流控等技术模拟无损环境成本低、能复用现有以太网运维经验是当前 AI 集群最主流的选择。组网时几个关键点要把握好服务器侧GPU 服务器通常配备多张支持 RoCE 的高速网卡25G/100G/200G网卡直连到架顶交换机不同网卡走不同网段做冗余和负载分担。交换机侧所有端口建议启用 PFC 和 ECN这是无损网络的基石。PFC 负责按优先级流控防止丢包ECN 负责拥塞标记配合 DCQCN 算法做拥塞控制。用一句通俗的话来讲PFC 是让交换机宁可等一等也不要丢包ECN 是提前通知发送端我快顶不住了你悠着点。存储侧AI 训练的数据读取和 checkpoint 落盘同样走 RDMA所以存储网络要预留足够的带宽避免和训练通信互相挤兑。4.3 从内存搬运理解 AI 集群的性能链路从内存视角看 AI 集群网络整个链路其实特别清晰每张 GPU 卡的显存就是一块快内存服务器内存是中转站RDMA 网卡就是打通这些内存之间的搬运管道。梯度数据从 GPU 显存拷到主机内存RDMA 网卡 DMA 把数据搬上网络另一端的网卡 DMA 写进对方内存再拷进显存完成更新。这条链路上任何一环慢了整体就慢。这也是为什么做 AI 集群性能优化时不能只看网络带宽和延迟还要关注内存拷贝的路径。有些场景下GPU 直接通过 GPUDirect RDMA 和网卡做 DMA 交换完全绕过主机内存省掉一次拷贝性能立竿见影。这个技术现在在大模型训练里已经是标配了特别是 NCCL 这类通信库底层就是通过 RDMA 拿到的这个能力。5. 实操经验部署与排查 RDMA 网络的干货总结5.1 五个最容易踩的坑纸上谈兵聊完原理说点实际部署中经常遇到的问题。这几年 RDMA 网络落地来来去去就是这几个坑第一无损网络配置不完整。很多人以为开了 PFC 就万事大吉结果忽略了一个细节PFC 必须按优先级队列配置当 RoCE 流量和普通 TCP 流量混跑时如果优先级划分不合理RoCE 流量照样被丢包RDMA 性能断崖式下跌。第二MTU 不一致导致性能异常。RoCE 要求端到端开启巨型帧建议 MTU 设置为 9000 字节。交换机上哪怕有一个端口没放行巨型帧传输就会退化成小包模式带宽上不去问题还特别难排查。第三QP 数量估算不足。大规模集群里每个进程每建一条连接就要占一个 QPGPU 数量一多单台服务器上的 QP 数很容易爆。开部署之前建议先按进程数乘对端数粗算一下确认 HCA 固件和驱动的 QP 上限足够。第四内存注册不当导致 CPU 飙高。用了动态注册的接口频繁申请释放内存注册开销全让 CPU 扛了性能反而比 TCP 还差。遇到这种情况最好改成预注册加内存池。第五交换机缓冲不足被 PFC 反噬。无损网络靠交换机缓冲区吸收突发流量如果缓冲区太小PFC 触发频繁可能出现队头阻塞甚至 PFC 死锁。这类问题在入门级交换机上尤其常见预算允许的情况下尽量选择大缓冲型号。5.2 排查问题的三个实用手段遇到 RDMA 性能问题先别急着怀疑代码按下面三个手段排查大部分问题都能定位。第一个手段是看计数。运行rdma stat show或者perftest里的工具重点看丢包计数、CRC 错误、PFC 暂停帧计数。如果连续传输过程中丢包计数一直涨网络拥塞或者配置有问题多半要先解决这个再谈性能。第二个手段是测基线。用ib_write_bw、ib_read_lat这类微基准工具先测同一台交换机下两台机器之间的带宽和延迟。如果基线测出来只有 50Gbps而你买的网卡是 100G那问题在网络配置或者硬件不在应用。先修基线再测应用能少走很多弯路。第三个手段是抓包定位。RoCE 的包可以通过普通网卡抓到但抓包位置要在交换机镜像口或者支持 RoCE 解析的网卡上否则看到的都是裸的 RoCE 头分析起来费劲。确认拥塞丢包的时候留意 ECN 标记的包和 CNP 反压包的比例这两个是高优先级排查对象。5.3 一张速查表常见问题与排查方向现象可能原因优先排查方向带宽远低于预期MTU 不一致 / PFC 未开启 / 链路协商降速检查端到端 MTU、交换机 PFC 配置、网卡协商速率延迟抖动严重拥塞控制算法参数不合理 / 其他流量抢占优先级检查 ECN 阈值、DCQCN 参数、PFC 优先级映射偶发连接超时RC 模式重传超时 / 对端 QP 未在接收状态查看网卡计数里的重传次数、RST 事件CPU 占用异常高内存注册太频繁 / 轮询模式导致忙等检查应用是否频繁 reg_mr合理设置轮询间隔多机训练时快时慢交换机哈希不均 / 长尾流拥塞确认 RoCE 哈希是否基于 L4 端口必要时做流调度优化5.4 一个亲身经历的案例RoCE 性能掉半的排查过程分享一个我实际处理过的案例。一次上线新的训练集群百亿参数模型RoCE 组网预期单流带宽 90Gbps 以上实际只有 45Gbps 左右且训练吞吐不及预期的 70%。第一步用ib_write_bw做单机对测带宽确实只有 45Gbps说明问题不在应用层。第二步看计数器某个端口的 PFC pause 帧频繁触发丢包计数没有明显增长初步判断是无损流控在刹车而不是丢包。第三步检查交换机 ECN 配置发现 ECN 阈值设置得过低交换机在流量刚上来时就疯狂打 ECN 标记发送端的 DCQCN 算法一收到标记就把速率降下去导致吞吐一直上不来。调整方案是把 ECN 阈值调高并给 RoCE 流量单独设置缓冲池避免和其他业务流量争抢缓冲区。改完后单流带宽恢复到了 92Gbps训练吞吐也提升到预期的 95% 以上。这类问题如果不测基线、不看计数器光靠猜应用代码可能几天都定位不到。6. 给新人的一点实操建议最后聊几句个人体会。RDMA 这个领域有个门槛它不像 TCP 那样有丰富的中文资料和成熟的调试工具很多细节藏在 Linux 内核文档、InfiniBand 规范和各家交换机的配置手册里新手容易在概念上被劝退。我的建议是先装一块支持 RDMA 的网卡哪怕是二手的 25G 卡把perftest工具跑起来亲手测一次带宽和延迟再对照文档看 QP、MR、CQ 这些概念理解会快很多。纸上概念看得再多不如亲手触发一次网卡直接写内存带来的直观冲击。另外一个建议是把 TCP 和 RDMA 的对比当成理解 RDMA 的抓手。遇到一个新概念先问TCP 里对应的机制是什么RDMA 为什么不用它比如 TCP 靠内核做可靠传输RDMA 靠网卡做可靠传输这么一比很多设计思路就清楚了。RDMA 已经不只是高性能计算领域的专属工具AI 时代它正在成为基础设施的一部分。从最简单的内存搬运开始理解它你会发现它没那么玄乎甚至可以用一句话概括让网卡帮你把数据从一个内存搬到另一个内存CPU 安心做它的计算就行。把这个逻辑记住后面的细节都是围绕这句话展开的。
返回列表