ARTICLE DETAIL

资讯详情

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

RDMA技术详解:从内存搬运到AI集群网络优化

RDMA技术详解:从内存搬运到AI集群网络优化 RDMA 这个缩写前些年还只是存储和超算圈子里的“黑话”这两年随着 AI 大模型把算力集群的规模推向新高度它已经成了高性能网络领域躲不开的关键词。很多人第一次接触 RDMA是从“它能省 CPU”“它很擅长搬数据”这类结论开始的但真要问一句它到底怎么工作的、为什么能这么快能讲清楚的人就没那么多了。这篇文章我打算从最底层的内存搬运讲起一路看到 RDMA 在 AI 集群网络里的落地形态。不堆术语尽量用大白话把几条核心链路拆开。如果你正准备做分布式训练的网络调优或者只是好奇“GPU 直连存储”这类宣传语背后的原理这篇文章应该能给你一张比较完整的地图。咱们先从一个最原始的问题出发为什么传统网络传输怎么优化都觉得“重”1. 先理解内存搬运这件事为什么成了瓶颈1.1 传统网络传输里 CPU 被“杂活”拖垮的真相一台服务器要把数据发给另一台服务器表面上是“网卡把数据发出去”实际上数据不会自己跑到网卡里。应用程序先要把数据从用户态内存拷贝到内核态的内存缓冲区再经过协议栈层层处理最后才交给网卡。这个过程里数据至少被完整拷贝了两次甚至四次。CPU 不只是负责发起拷贝它还得为每一个数据包计算校验和、组装协议头、处理中断这些工作单个看都不重但架不住量太大。我举个直观点的数字一个 100Gbps 的网卡每秒钟能接收大约 1.48 亿个最小尺寸的数据包。就算每个包只消耗几千个 CPU 周期来处理这个开销也足以把一个高端服务器 CPU 的所有核心全部吃满。换句话说传统网络模式下CPU 不是在“做计算”而是在“当搬运工”搬运本身的成本甚至超过了计算本身。这种模式在普通 Web 服务里勉强能忍但在存储集群、分布式数据库、AI 训练这类场景里纯粹是浪费算力资源。1.2 DMA 是第一步但不是终点为了解决 CPU 搬运数据效率低的问题工程师们很早就搞出了 DMADirect Memory Access技术。DMA 允许外设直接读写系统内存CPU 只需要在传输开始前配置好“从哪里搬、搬多少、搬到哪”然后就能撒手不管等 DMA 控制器做完再发个中断通知一声。这个设计确实大大解放了 CPU但注意它只是在单台机器内部解决了问题。数据从网卡到内存这一段虽然不用 CPU 了可数据从应用程序内存到内核缓冲区、再一路走到网卡的完整链路里DMA 只能覆盖最后那一小段。真正让 CPU 疲惫的是数据在不同缓冲区之间反复拷贝、以及协议栈处理的整个过程。光有 DMA救不了整个网络传输路径。2. RDMA 的核心思路把“搬运”这件事整体外包2.1 内核旁路与零拷贝跳过“中间商”的数据通道RDMARemote Direct Memory Access远程直接内存访问的思路和 DMA 一脉相承但它的野心更大不仅让网卡直接访问本机内存还要直接访问远程机器的内存。实现这个目标靠两板斧。第一板斧是内核旁路Kernel Bypass。传统网络里数据必须经过内核协议栈而 RDMA 允许应用程序直接跟网卡交互数据根本不进内核。应用程序在用户态直接注册一块内存区域把这块区域的地址信息告诉网卡网卡就能自行读写这块内存。这个操作绕开了内核也绕开了内核协议栈的那些协议解析、缓存管理、锁竞争。第二板斧是零拷贝。数据从源端应用程序内存到目的端应用程序内存整个过程不经过任何中间缓冲区没有多余的 CPU 拷贝也不需要 CPU 参与逻辑控制。打个比方传统网络相当于你叫了个快递员到家里取件快递员先到小区驿站、再送到城市分拨中心、最后才送到收件人手上每个环节都要有人扫码登记RDMA 相当于给了快递员一把钥匙他直接进你家拿走东西、直接开到对方家楼下放进去全程只有一个动作。2.2 从 IB 到 RoCEv2三种 RDMA 实现路径的取舍RDMA 不是一个具体的产品而是一类技术的统称。当前主要有三条实现路线工程上需要根据已有基础设施做选择。InfiniBandIB从硬件到协议完全为 RDMA 设计性能最好端到端延迟可以做到亚微秒级但需要专有的交换机、网卡和线缆价格也最昂贵。传统 HPC 超算中心用得最多。RoCEv2RDMA over Converged Ethernet version 2把 RDMA 报文封装在以太网帧里传输可以复用现有以太网交换机。成本比 IB 低很多但这要求网络不能丢包——因为 RDMA 协议对丢包极其敏感一旦丢包性能就会断崖式下跌这也是为什么 RoCEv2 必须搭配无损以太网来用。iWARP把 RDMA 跑在 TCP/IP 协议栈上兼容性最好但性能受限于 TCP 的处理开销实际场景中部署最少。当前 AI 集群里最常见的选型是 RoCEv2。原因很直接InfiniBand 性能虽好但产能有限、交付周期长、价格高RoCEv2 在标准以太网硬件上就能实现接近 IB 的性能——前提是网络调优做到位。这也是为什么每次聊 AI 集群网络RoCEv2 的 PFC、ECN 这些流控机制总是绕不开的话题。2.3 Queue Pair 与 verbs 接口数据搬运的“车间流水线”RDMA 的编程模型里最核心的抽象叫Queue PairQP。每个 QP 由一对队列组成一个发送队列Send Queue和一个接收队列Receive Queue。应用要发数据就在发送队列里放一个工作请求Work RequestWR网卡会去执行这个请求把指定内存里的数据发出去完成后在完成队列Completion QueueCQ里放一个完成通知。整个过程就是生产者-消费者模型应用生产请求网卡消费请求再把结果回报回来。QP 这个概念容易被新手忽略但它恰恰是理解 RDMA 性能的关键。一个 QP 代表一条独立的通信上下文多个 QP 之间可以并行处理互不干扰。比如一个应用要同时跟 8 台机器通信可以建 8 个 QP每个 QP 独立干活网卡在多 QP 之间负载均衡。实际调优时QP 的数量多少、每个 QP 的队列深度设置多少直接决定能不能把网卡的并发能力吃满。这个我们到后面的配置章节再细说。3. 从单机到集群RDMA 的“内存”变成了整个集群3.1 AI 集群里为什么需要 RDMA数据喂不饱 GPU 的尴尬搞 AI 训练的人应该都有这种体验GPU 算力上去了但训练效率提不上去一看监控GPU 有一大半时间在等数据。这就是典型的“数据饥渴”问题。分布式训练里每个 GPU 卡既要读训练样本又要跟其他节点上的 GPU 交换梯度这两种流量加起来非常可观。举个例子一个千亿参数的大模型用 64 台 8 卡服务器做训练每台服务器有 8 张 GPU训练过程中每计算完一个 batch就要做一次梯度同步。梯度数据量有多大呢以千亿参数模型为例梯度张量动辄几十 GB 甚至上百 GB。每轮迭代都要把这上百 GB 数据在集群里同步一遍这还只是训练中的通信流量数据读取的流量还没算进去。如果用传统 TCP/IP 网络来做这种规模的梯度同步每台服务器光是处理网络包就得消耗好几个 CPU 核心而且是海量小包的 CPU 中断风暴直接把训练节点打成“半瘫痪”状态。RDMA 的价值在这种场景下体现得最充分它让数据在 GPU 显存之间直接流动CPU 只做任务调度不碰数据本身GPU 收到的数据延迟低、吞吐高、对 CPU 的干扰小。3.2 GPUDirect RDMA数据直达显存CPU 和主存彻底“出局”AI 集群场景下RDMA 还有一个进阶形态叫GPUDirect RDMA简称 GDR。常规 RDMA 是网卡直接访问主机内存DRAM但 GPU 的数据在显存HBM里中间隔了一道 PCIe。如果网卡把数据先搬到主机内存再由 CPU 发起拷贝把数据送进显存这里又产生了一次额外拷贝和一次 PCIe 往返。GPUDirect RDMA 的思路是网卡绕过主机内存通过 PCIe 直接读写 GPU 显存。数据从远端网卡出发到达本地网卡之后直接经 PCIe 写入 GPU 显存整个过程不碰 CPU、不碰主机内存。这个能力对分布式训练意义重大因为梯度同步的数据本来就是显存里的张量数据如果每次同步都要先搬到主机内存再转一道凭空多出的拷贝开销和延迟在千卡集群里会被放大到难以接受。说个我调优时看到过的真实数字在同样的集群里开启 GPUDirect RDMA 之后梯度同步的端到端延迟比“网卡先到内存、再拷贝到显存”的模式能降低 30% 以上。对那种每轮迭代通信时间占比很高的训练任务这个优化可以直接换算成训练总耗时下降。3.3 无损以太网RoCEv2 离不开的“交通规则”前面提过 RoCEv2 对丢包零容忍这里展开讲一下为什么。RoCEv2 的数据传输依赖流控机制来保证不丢包业界一般用PFCPriority Flow Control优先级流控和ECNExplicit Congestion Notification显式拥塞通知两个机制配合。PFC 的作用可以理解为“红绿灯”当某个交换机端口快要拥堵时它会向上一跳设备发送暂停帧让上游设备暂时不要发数据等自己处理完了再恢复。这就像是高速公路入口看到前方堵车先放行一部分车剩下的在匝道上等着。问题是PFC 的作用范围是一个端口的所有流量如果这个端口里同时混合了不同优先级的流量暂停帧可能会误伤不该停的流量引发队头阻塞。所以在部署 RoCEv2 时通常会给 RDMA 流量打单独的优先级队列跟普通 TCP 流量物理隔离。ECN 则是“提前减速”的思路交换机检测到拥塞时不是在端口上直接暂停而是在转发的包里打上拥塞标记接收端看到标记后会主动通知发送端降低发送速率。这个机制比 PFC 温和也更精细但需要端到端配合——网卡驱动、交换机、应用都要支持并正确配置。实际部署中PFC 负责兜底防丢包ECN 负责主动降速避免拥塞两者配合才能让 RoCEv2 网络既无损又高效。4. 动手配置一个 RDMA 环境的核心要点4.1 硬件准备与驱动选型搭建 RDMA 环境首先得确认硬件是否支持。如果用 InfiniBand必须买 Mellanox现为 NVIDIA或 Intel 的 IB 网卡和配套交换机如果用 RoCEv2还需要确认网卡型号支持 RDMA 功能。目前主流的高性能网卡比如 NVIDIA ConnectX-6/7 系列、Broadcom 的一些网卡型号都支持 RoCEv2。驱动方面NVIDIA 的网卡一般用 MLNX_OFED 驱动包它集成了 RDMA 所需的 verbs 库、诊断工具和内核模块。安装驱动的时候有个小细节必须确认系统内核版本和 OFED 版本的兼容性网上很多 RDMA 起不来的案例最后排查到底都是驱动和内核不匹配。装完驱动后用ibv_devinfo命令能看到网卡的 RDMA 能力、支持的 MTU、端口状态这是验证环境是否就绪的第一步。4.2 子网管理器与链路确认RDMA 环境里有个容易被忽略的组件叫Subnet ManagerSM子网管理器。在 InfiniBand 网络里SM 负责为每个端口分配 LIDLocal Identifier也就是 IB 网络中的地址。没有 SMIB 端口是起不来的。RoCEv2 因为是跑在以太网上不需要 SM但需要保证 IP 网络本身是通的、路由可及。验证 RDMA 链路是否通最常用的命令是ibping或者rping。我用得最多的是ib_write_bw和ib_read_bw这两个性能测试工具它们能测出两个节点之间的实际读写带宽和延迟。第一次跑性能测试时建议先跑一个小规模的带宽测试比如两个节点之间的点对点测试确认带宽能跑到线速的 80% 以上再往下做多节点扩展测试。如果带宽明显偏低优先级排查顺序是先看链路速率有没有协商到预期值再看 MTU 设置是否一致最后看流控配置是否生效。4.3 QP 数量和队列深度的参数调整思路很多人以为 RDMA 配置好驱动、网络通了就完事了其实参数调优才是影响性能的关键。最重要的两个参数就是QP 数量和队列深度Queue Depth。QP 数量太少多对通信会争抢同一个 QP形成串行瓶颈QP 数量太多又会浪费网卡资源、增加管理开销。经验值是一个网卡上根据并发通信对的数量每个通信对至少分配一个 QP高并发场景可能一个通信对分配多个 QP 做并行。队列深度则是每个 QP 里能排队的工作请求数量深度太小应用生成请求的速度稍微一快网卡就会空闲深度太大内存消耗增加而且延迟也会上升。一般建议从 128 开始测试然后按 256、512 逐档往上调观察带宽和延迟的曲线变化找到拐点。在 Mellanox 网卡上这些参数可以通过mlx5_ib模块的 modprobe 参数或者ibv_create_qp接口在应用层指定。很多应用框架比如 NCCL本身暴露了环境变量来控制这些参数NCCL 里就是通过NCCL_IB_QPS_PER_CONNECTION这个环境变量来调整每个连接的 QP 数量。实际训练任务里QP 和队列深度没有万能设置必须以实测为准我见过太多照搬网上的“最优配置”换了个集群规模后性能反而不如默认值的情况。4.4 NCCL 与 RDMA 的经典配合聊 AI 集群网络NCCLNVIDIA Collective Communications Library是绕不开的名字。NCCL 是 NVIDIA 出的集合通信库专门负责多 GPU 之间的数据交换比如 AllReduce、AllGather 这类分布式训练里的高频操作。NCCL 的底层可以跑在多种传输方式上共享内存、PCIe、以及 RDMA 网络。当节点数量超过一台机器时NCCL 默认就会尝试用 RDMA 来做跨机通信。NCCL 通过一系列环境变量控制 RDMA 的行为。最常用的是这几个NCCL_IB_DISABLE0显式启用 InfiniBand/RoCE 传输路径。NCCL_IB_GID_INDEXRoCEv2 环境下需要设置 GID 索引尤其是在多网卡、多子网的复杂环境里GID 索引选错会直接导致通信超时。NCCL_IB_TIMEOUT控制 IB 传输的超时时间网络抖动大的场景需要把这个值调大否则偶发拥塞会被误判为断连。NCCL_IB_QPS_PER_CONNECTION前面提到的 QP 数量控制。实际训练中NCCL 跑在 RoCEv2 上的常见故障就是“初始化超时”或者“连接断开”。排查这种问题我一般分三步走先确认所有节点到目标节点ping通且延迟正常再确认 RoCE 的 GID 索引配置一致最后用ib_write_bw在两个节点间做一次实测看物理链路本身是否健康。链路没问题还超时再怀疑 NCCL 参数和环境变量的问题。5. 远端内存直接访问的排查利器与实战故障表5.1 RDMA 故障排查的几个常用工具RDMA 环境出问题的时候光靠ping和ip a是不够的需要专门的工具链。我常用的有这些ibv_devinfo查看网卡的 RDMA 能力、端口状态、活跃速率、MTU 等基础信息。ibstat/ibstatus查看 InfiniBand 端口的链路状态、速率、宽度确认是不是协商降级了。ibpingIB 网络里的 ping测试两个 IB 端口之间的连通性。ib_write_bw/ib_read_bw/ib_send_bw性能测试三件套分别测写、读、发送三种操作的带宽和延迟。perftest包的ib_*系列工具基本都在上述范围里装完 MLNX_OFED 就会自带。rdma_resource查看系统中的 RDMA 资源使用情况包括 QP、CM_ID、MR内存区域等非常适合排查“QP 建不起来”“资源泄露”之类的问题。用这些工具排查时有个经验口诀先看链路再看配置先测点对点再测集群。很多问题单节点测试完全正常一上集群就暴露那是因为集群环境里多了交换机拓扑、多路径、拥塞等变量。5.2 常见故障、原因与处置速查故障现象可能原因排查思路与处置方法ibv_devinfo显示端口状态为 DOWN线缆问题、对端设备未就绪、SM 异常IB 场景检查线缆和光模块是否正常两端设备的端口状态是否协商成功。IB 场景检查 SM 是否在运行。两个节点ping通但ib_write_bw无法连接RoCEv2 的 GID 索引配置不一致或者防火墙拦了 RDMA 端口对比两端的ibv_devinfo输出确认 GID 索引一致检查 iptables/firewalld 是否放行 RDMA 相关端口。ib_write_bw带宽远低于预期MTU 不一致、PFC/ECN 未生效、链路协商降级、PCIe 带宽不足确认两端 MTU 一致且为最大值通常 4096检查交换机无损配置是否下发用ibstatus确认链路速率注意插在 PCIe 3.0 x8 上的 100G 网卡带宽本来就会被限制。训练任务偶发超时但点对点测试正常大规模集群下拥塞导致 RoCEv2 丢包检查 ECN 标记的计数器确认交换机拥塞配置生效加大NCCL_IB_TIMEOUT和重试次数考虑调整拓扑减少多打一流量。应用报错create QP failed内存注册不足、QP 数量到达硬件上限用rdma_resource查看当前 QP 数量和使用情况调整应用配置减少并发 QP 数量检查是否有旧的未释放的 QP 残留。GPUDirect RDMA 没有生效带宽没有提升驱动未开启 GDR 相关模块、BAR 映射失败检查驱动加载参数是否开启CONFIG_MLX5_VFIO等用nvidia-smi topo -m确认 GPU 和网卡是否在同一 NUMA 节点或 PCIe switch 下。这张表里的内容都是我在实际部署和调优过程中反复踩过、也反复帮别人排过的坑。特别是 MTU 和 GID 索引这两个问题几乎占了 RoCEv2 环境问题的半壁江山。5.3 关于“内存”这件事的更深一层最后聊一个容易被忽视的点RDMA 之所以快本质上是把“内存”这个资源的管理方式重构了。传统网络里内存是被“拷贝”的每经过一层就被复制一次RDMA 里内存是被“共享”的网卡直接读远端用户态内存。这个思路落到底层就是 RDMA 网卡需要维护一个内存翻译表把应用注册的虚拟内存地址转换成物理地址这就是注册内存区域Memory RegionMR这个操作的由来。MR 注册是有代价的——注册 100MB 的内存区域驱动要做页表锁定、地址映射可能需要几十毫秒甚至更久。这也是为什么 RDMA 应用通常会复用注册好的内存缓冲区而不是像 TCP 那样频繁分配释放。初次接触 RDMA 编程的人最容易犯的错就是每个请求都重新注册内存结果性能不但没提升反而因为注册开销拖慢了速度。正确的做法是启动时一次性注册一块大的内存池以后所有收发请求都从这个池子里分配缓冲区。这个优化思路也解释了为什么很多高性能框架都要自己做内存池。它不只是为了减少 malloc 的开销更深层的动机是避免频繁的 MR 注册和注销。内存分配的优化到今天依然是 RDMA 场景里性价比最高的调优点之一。6. 从网络到训练框架一次性能调优的实战复盘6.1 现象与目标我之前帮一个团队做过一次 32 节点、256 卡集群的训练性能优化。训练任务用的是一套经典的 GPT 风格大模型通信模式以 AllReduce 为主。跑起来之后发现GPU 利用率只有 70% 左右训练迭代时间波动也很大每隔一段时间就会出现一次明显的长尾延迟。第一反应是看网络。登录到计算节点用ib_write_bw做了点对点测试带宽正常能达到 90Gbps以上。链路本身没问题那就继续往前排查。接着看 NCCL 的通信日志发现每次长尾延迟都伴随着 ECN 标记数量的激增说明网络里确实有拥塞。进一步检查交换机的流控配置发现虽然 PFC 是开启的但优先级队列的映射关系没配置对——RDMA 流量和普通 TCP 流量被分到了同一个优先级TCP 的突发流量直接把 RDMA 流量堵住了。6.2 调整方案与效果定位到问题后调整了交换机上的优先级映射把 RDMA 流量放到单独的优先级队列并配置了严格的调度策略。同时把 NCCL 的NCCL_IB_TIMEOUT从默认值调到更大增加对偶发拥塞的容忍度。调整之后的效果非常明显迭代时间的长尾消失了GPU 利用率从 70% 提升到了 92% 左右。整个训练任务的总耗时缩短了差不多 25%。这个案例让我印象很深因为它说明了一个道理——RDMA 调优很多问题都不在 RDMA 本身而在它周边的生态配置。6.3 这个事情还没完RDMA 与 AI 网络的发展趋势回过头来看RDMA 在 AI 集群里的角色还在继续深化。一方面随着模型参数规模持续膨胀训练集群从千卡走向万卡网络通信占比会越来越高RDMA 几乎是唯一能撑住这种规模通信量的方案。另一方面RDMA 也在和新的硬件形态融合比如存算一体架构、CXL 内存池化这些新技术本质上都在做同一件事——打破传统的数据搬运路径让数据更直接地流向真正需要它的地方。我个人的体会是懂 RDMA 的核心不在于记住几个命令和参数而在于理解“数据从哪来、到哪去、中间能不能少绕几道弯”这条主线。内存搬运这件事听起来基础却是整个高性能计算、存储和 AI 基础设施的共同底座。把这条线捋顺了再去看 NCCL、看网络拓扑、看存储架构整个视野都会不一样。如果你正准备在自己的集群里部署 RDMA我的建议是从小规模开始两个节点先把链路调通、性能测达标再逐步扩展到更多节点。不要一上来就照搬大规模配置每个集群的拓扑、流量模型、硬件型号都不同最可靠的方案永远是实测出来的那套。
返回列表