RDMA 技术栈全解——ML 系统研发面试通关
RDMA 技术栈全解——ML 系统研发面试通关
本文目标:让你在面试官问"你们大模型训练集群用的什么网络、为什么用 RDMA、RDMA 怎么做到零拷贝、RoCEv2 和 InfiniBand 区别、NCCL 里 RDMA 起什么作用"时,能从原理到工程对答如流。
全文按"为什么 → 是什么 → 怎么用 → 在 ML 系统里怎么用 → 面试问答"组织。
一、为什么需要 RDMA:传统网络栈的瓶颈
先看传统 TCP/IP 协议栈一次发送数据的完整路径(以应用 A 发数据到应用 B 为例):
- A 应用调用
send(),数据从用户态缓冲区通过copy_to_user-like 的拷贝进入内核态 socket buffer(第一次拷贝)。 - 协议栈(TCP/IP)逐层封装报文头,经过内核协议栈处理。
- 数据通过 DMA 从内核缓冲区拷到网卡(NIC)的发送环(第二次拷贝)。
- 网卡把数据发到网线上。
- B 端网卡收到数据,DMA 拷到内核 socket buffer。
- B 应用调用
recv(),数据从内核态拷回用户态(第三次拷贝)。
问题有三个:
| 瓶颈 | 说明 |
|---|---|
| 多次内存拷贝 | 用户态↔内核态、内核↔网卡至少 2~3 次 memcpy,CPU 要全程搬运。 |
| 全程内核参与 | 每个报文都要走一次系统调用、进一次内核协议栈,中断、上下文切换开销大。 |
| CPU 成瓶颈 | 网络吞吐越高,CPU 被中断/协议栈处理占满得越狠——网络越快 CPU 反而越累,这就是"CPU overhead grows with bandwidth"问题。在 100Gbps/400Gbps 的 AI 训练网络里,传统栈根本喂不饱链路,CPU 先被打爆。 |
RDMA(Remote Direct Memory Access)的解法:让网卡(RNIC/HCA)自己去读写远端机器的内存,绕开两端的操作系统内核和 CPU。一句话:
数据直接从一台机器的用户态内存,经过网卡,落到另一台机器的用户态内存,中间不进内核、不经协议栈、不需要 CPU 搬运。
这就是 RDMA 的两个核心特性:
- Kernel Bypass(内核旁路):应用直接在用户态操作网卡,不进 OS 协议栈,不走系统调用。
- Zero-Copy(零拷贝):数据在收发两端都不在用户态/内核态之间拷贝,网卡用 DMA 直接操作应用注册的内存。
后果:吞吐越高,CPU 反而越闲。这正是大模型训练 all-reduce 通信所需要的——把 CPU 留给算子、留给框架,通信交给网卡硬件。
二、RDMA 的三类承载协议:IB、RoCE、iWARP
RDMA 是一种能力,承载它的网络协议有三套,面试必考:
2.1 InfiniBand(IB)
- 由 IBTA(InfiniBand Trade Association)制定,专用网络:需要专用 IB 网卡(HCA,Host Channel Adapter)和专用 IB 交换机。
- 链路层就原生支持 RDMA,不依赖 IP/Ethernet。
- 性能最好、延迟最低(亚微秒级)、有原生的硬件可靠传输和拥塞控制(CC)。
- 缺点:贵、组网封闭、与现有以太网不互通。典型厂商:Mellanox/NVIDIA、Intel(Omni-Path 已式微)。
- 大模型训练的事实标准之一(如 NVIDIA 的 IB + SuperPOD)。
2.2 RoCE(RDMA over Converged Ethernet)
把 RDMA 跑在以太网上,分两版:
- RoCE v1:只在以太网链路层上跑 IB 传输层,不可路由(L2 only),基本已淘汰。
- RoCE v2(重点):在 IB 传输层外面再包一层 UDP + IP,可三层路由,能跨子网、可走标准以太网交换机。今天说 RoCE 基本都指 RoCEv2。
- UDP 目的端口 4791 是 IB 传输层的标识(面试常问)。
- 优势:用便宜通用的以太网交换机,复用现有基础设施。
- 代价:以太网本身没有原生可靠传输和拥塞控制,必须靠 PFC(Priority Flow Control)+ ECN + DCQCN/HPCC 等机制补齐,否则在 AI 训练这种 incast/all-reduce 场景下会丢包成灾、性能塌方。这也是 RoCEv2 工程上最难调的部分。
2.3 iWARP
- RDMA over TCP,可路由,但实现复杂、厂商支持少,基本淡出主流,知道有这东西即可。
三者一句话对比:
IB = 专用高性能;RoCEv2 = 以太网 + RDMA 的折中、可路由、是当下数据中心主流;iWARP = 没存在感。
三、RDMA 的通信模型:传输服务类型
RDMA 通过 QP(Queue Pair) 建立连接后通信,QP 有若干传输服务类型(Transport Service Type),面试常考 RC/UD:
| 类型 | 全称 | 连接 | 可靠性 | 典型用途 |
|---|---|---|---|---|
| RC | Reliable Connection | 点对点连接 | 可靠(硬件保证按序、重传) | ML 训练最常用,NCCL/RDMA Write/Read 默认走 RC |
| UC | Unreliable Connection | 点对点连接 | 不可靠、保序 | 少见 |
| UD | Unreliable Datagram | 无连接 | 不可靠、不保序 | 多播、发现协议、小消息(如 RDMA CM 建链前的握手) |
| RD | Reliable Datagram | 可靠数据报 | 可靠但无连接 | 硬件要求高,实际产品很少支持 |
面试要点:
- RC 是一对一的,意味着如果有 N 台机器两两要通信,每台机器上要建 个 QP,QP 是网卡硬件资源(context、收发状态),N 大了 QP 数量爆炸,成为扩展瓶颈。
- UD 是无连接、支持多播的,一个 QP 可与多个对端通信,但不可靠,适合控制面/广播。
- ML 训练(NCCL)默认用 RC,因为需要可靠、按序的大块数据传输;近年为了减少 QP 数、支持更大集群,也有 MST (Multi-Path Transport) / RPC-style over UD 的探索,但主流仍是 RC。
连接管理:RDMA CM vs 内存管理
- RDMA CM(Connection Manager):提供类似 socket 的建链 API(
rdma_connect/rdma_accept),底层通常先走 UD 交换地址信息(QPN、GID 等),再建立 RC。可类比 TCP 的三次握手。 - 也可不建链,直接用 UD 通信。
四、RDMA 核心对象:PD / MR / QP / CQ / WR(必背名词解释)
这部分是面试"你懂不懂 RDMA 编程模型"的试金石。把这张关系图背下来:
1 | 应用 (user space) |
逐个名词:
- PD(Protection Domain,保护域):隔离单位。一个 PD 下的 QP 和 MR 互相可见;不同 PD 之间互相不可见。防止一个 QP 去操作不该操作的内存。
- MR(Memory Region,内存区域):应用要先把数据缓冲区"注册"给网卡(pin 住物理页、建立虚拟→物理地址映射表),网卡才能对它做 DMA。注册成功返回:
- lkey(local key):本地操作(自己网卡 DMA 本机内存)用的钥匙。
- rkey(remote key):远端操作(让对方网卡通过 RDMA Write/Read 写/读我这块内存)用的钥匙——这是 RDMA “远端直接读写” 的关键凭证。
- QP(Queue Pair):通信端点,由 SQ + RQ 组成。
- SQ(Send Queue):放主动发起的请求(Send / RDMA Write / RDMA Read)。
- RQ(Receive Queue):放"我准备好接收"的请求,告诉网卡收到数据后放哪个 buffer。只有
Send/Recv模式需要预先 post receive;RDMA Write/Read是单边的,不消耗对端 RQ。
- WQE(Work Queue Element)/ WR(Work Request):投递到 SQ/RQ 里的工作请求。
- CQ(Completion Queue)/ CQE(Completion Queue Entry):WQE 完成后网卡往 CQ 里塞一个 CQE,应用轮询(
ibv_poll_cq)拿到结果。这就是 RDMA 异步、事件驱动的核心。 - GID(Global Identifier)/ QPN(QP Number):标识一个远端 QP 的地址,建链时要交换,相当于"RDMA 的 IP+端口"。
面试金句:“RDMA 通信的本质是:双方各注册好 MR,交换 lkey/rkey 和 QPN/GID 后,一方把一个 WQE post 到自己的 SQ,网卡硬件完成 DMA 收发,完成后产生 CQE 通知应用;全程不进内核、不拷贝数据、不占 CPU。”
五、四种 RDMA 操作语义(必背,含数据流)
5.1 Send / Recv(双边操作)
- 发送方 post 一个 Send WQE 到 SQ,接收方必须提前 post 一个 Recv WQE 到 RQ,指明收到的数据放哪。
- 接收方网卡收到数据后 DMA 写到 Recv 指定的 buffer,产生 CQE。
- 两边都要参与、消耗 RQ,类似传统 socket。
- 适合小消息、控制流;大块数据传输用 RDMA Write。
5.2 RDMA Write(单边操作,零拷贝利器)
- 发送方直接把数据写到远端内存,远端 CPU 完全不知情、不参与、不进内核——远端甚至不需要在 RQ 上 post 任何东西。
- 发送方需要知道远端的:远程内存地址(remote addr)+ rkey(前面注册 MR 得到的)。
- 数据流:
本地 buffer → 本地网卡 DMA → 网线 → 远端网卡 DMA → 远端 buffer。零拷贝、内核旁路、CPU 不参与。 - ML 训练中最常用:reduce/scatter 时把本地梯度直接写到对端机器的对应梯度 buffer。
- 还有 RDMA Write with Immediate:写完同时给远端 RQ 产一个 CQE,用来做"数据写完了"的信号通知。
5.3 RDMA Read(单边读)
- 发送方主动从远端内存读数据到本地,远端 CPU 同样不参与。
- 同样需要远端 addr + rkey。
- 适合"拉"模型:比如 GPU Direct RDMA 里某些场景,或参数同步时拉取。
- 注意:RC 模式下 RDMA Read 的吞吐通常不如 Write,因为 Read 是请求-应答往返,网卡要维护 outstanding read 上下文,深度受限。
5.4 Atomic(原子操作)
Compare-and-Swap、Fetch-and-Add,作用在远端内存上,硬件保证原子。- 用于分布式锁、计数器、同步原语。ML 场景用得少,但面试提到分布式同步时是个加分点。
一张对比表
| 操作 | 边性 | 远端 CPU 是否参与 | 远端 RQ | 典型 ML 用途 |
|---|---|---|---|---|
| Send/Recv | 双边 | 参与(post recv) | 消耗 | 小消息、建链握手 |
| RDMA Write | 单边 | 不参与 | 不消耗 | 大块梯度/激活传输(主力) |
| RDMA Read | 单边 | 不参与 | 不消耗 | 参数拉取 |
| Atomic | 单边 | 不参与 | 不消耗 | 分布式同步原语 |
面试高分点:强调"单边操作是 RDMA 的精髓"——远端 CPU 不参与,才是它能在 GPU 训练里把通信开销从 CPU 卸载到网卡的根本原因。结合后面的 GPU Direct RDMA,这一点会被反复问到。
六、零拷贝与内核旁路的工程细节(高频追问)
- 内存必须 pin 住:因为网卡用 DMA 直接访问物理内存,操作系统不能在网卡 DMA 过程中把页换出(swap)或重新映射,所以注册 MR 时内核会把这段内存锁定在物理内存(pin page)。代价:锁定的内存不能再被换出,占用物理内存。
- 虚拟→物理映射表下发给网卡:网卡要靠这张表把应用给的虚拟地址翻译成物理地址去做 DMA,这张表就是 MR 注册时建好的。所以 MR 注册有开销,不能对每个 token 都注册——MR 要复用、要尽量大块注册。
- ODP(On-Demand Paging):较新的网卡支持按需 paging,不必一开始就 pin 全部内存,缓解 pin 的成本,但性能略低于全 pin。
- 不进协议栈 = 不用 TCP:RoCEv2 虽然包了 UDP/IP,但那是网卡硬件封装的,不走 OS 的 TCP/IP 栈,UDP 也只是个承载壳,不保证可靠性——可靠性由 IB 传输层(RC)的硬件重传保证。
- CPU 释放:因为搬数据的是网卡的 DMA 引擎和 RISC 芯片,主 CPU 只在 post WQE 和 poll CQE 时参与极少量工作,所以"带宽越高 CPU 越闲",与传统栈正好相反。
七、拥塞控制与无损网络:RoCEv2 的工程命门
IB 原生有硬件 CC,但 RoCEv2 跑在以太网上,以太网默认是有损的(会丢包),而 RDMA 对丢包敏感(一旦丢包靠重传,RC 重传代价高),所以必须打造无损以太网(lossless Ethernet)。三件套:
- PFC(Priority Flow Control,基于优先级的流控):以太网流控的细化版,给不同优先级(8 个)单独的暂停,避免 head-of-line blocking 连累无关流量。本质:接收方缓存快满时,反压让发送方暂停。配置在交换机和网卡上,per-priority。
- ECN(Explicit Congestion Notification):交换机在队列拥塞时,在 IP 头打 ECN 标记(把 IP TOS 两位设为 11)告诉端点"我拥塞了"。
- DCQCN(Data Center QCN):RoCEv2 端到端拥塞控制算法——交换机打 ECN → 接收端网卡识别 → 回发 CNP(Congestion Notification Packets)给发送端 → 发送端降速,是一套基于 ECN 反馈的速率调节闭环。是当前 RoCEv2 事实标准。
- 进阶还有 HPCC(High Precision Congestion Control,阿里),用 INT(In-Band Network Telemetry)拿到精确队列长度,比 DCQCN 更准但需交换机支持。
- DSCP / 优先级映射:RDMA 流量打特定 DSCP,映射到 PFC 优先级,确保 RDMA 报文走无损队列。
面试易问:“RoCEv2 怎么做到不丢包?”
答:靠 PFC 做链路级反压防丢包 + ECN/DCQCN 做端到端降速避免持续拥塞 + 正确的 DSCP→优先级映射。PFC 是兜底防丢,DCQCN 是治本降速,两者配合。但 PFC 配错会出现 PFC 死锁(head-of-line 循环暂停),需要拓扑无环设计,这是运维痛点。
为什么 AI 训练对这个特别敏感:训练时 all-reduce / all-gather 是同步的 collective,incast 严重(N 个节点同时往一个节点打),瞬时微突发极大,没有无损网络+合理 CC,尾部延迟会爆炸,直接拖慢整个 iter 时间。
八、RDMA 在 ML 系统里的真实落地(面试重头戏)
8.1 NCCL 与 RDMA
- NCCL(NVIDIA Collective Communications Library) 是多 GPU 集合通信库,训练框架(PyTorch DDP、Megatron、DeepSpeed)底层都调它。
- NCCL 的 transport 层支持多种:NVLink(GPU↔GPU)、PCIe/NVSwitch、SHM(同机进程)、Socket、IB Verbs / RoCE Verbs。
- 跨机时,NCCL 默认走 RDMA Verbs(IB 或 RoCEv2),通常用 RDMA Write(高频、单边)做 ring/tree 的 all-reduce,配合 GPU Direct RDMA 让 GPU 显存直连网卡。
- 可用
NCCL_DEBUG=INFO看它选了哪个 transport(面试常问怎么排查 NCCL 没走 RDMA:看日志里Channel 00 : xth[index] via xth[index]是否是IB/NET,以及是否出现GPUDirect RDMA)。 - 关键环境变量:
NCCL_IB_DISABLE(禁用 IB,退回 socket)、NCCL_IB_HCA(指定网卡)、NCCL_NET_GDR_LEVEL等。
8.2 GPU Direct RDMA(GDR)——把"零拷贝"进行到底
普通 RDMA 通信 GPU 数据的路径是:
GPU 显存 → (DMA over PCIe) → CPU 内存 → (MR 注册) → 网卡 DMA → 网线 → 对端网卡 → CPU 内存 → PCIe → 对端 GPU 显存
中间还要过一次" bounced 到 host 内存"。GPU Direct RDMA 让网卡直接 DMA 读写 GPU 显存:
GPU 显存 ←(PCIe BAR1/Peer-to-Peer)→ 网卡 → 网线 → 对端网卡 → 对端 GPU 显存
- 好处:省掉 host 内存这一跳,CPU 不参与,延迟更低、带宽更满。
- 要求:网卡和 GPU 在 PCIe 拓扑上要支持 P2P(Peer-to-Peer DMA);NVIDIA 组合(ConnectX + GPU)原生支持;需开启
nvidia-peermem(旧版nv_peer_mem)内核模块,让 MR 可以注册到 GPU 显存。 - 调优点:把 GPU 和网卡放在同一个 PCIe Switch/NVSwitch 下,P2P 不跨 NUMA/不跨 PCIe root,性能最好。这就是为什么训练服务器网卡插法有讲究。
- GPU Direct Storage (GDS) 是同类思路,让 GPU 直连 NVMe/存储,绕过 CPU,用于加载 checkpoint。
8.3 通信拓扑与集合通信算法
- 大模型训练通信主战场是 all-reduce(DDP 梯度同步)、all-gather(TP/MoE)、reduce-scatter(ZeRO/梯度分片)。
- 算法层面:Ring All-Reduce(带宽最优, 倍单链路带宽)、Tree(低延迟)、Halving-Doubling。这些在 NCCL 里自动选,但理解原理能在面试讲"为什么 ring 在带宽受限网络最优"。
- 硬件层面:NVLink(GPU 间,900GB/s 级)> NVSwitch > PCIe > IB/RoCE(跨机,400/800Gbps)。一台机内尽量用 NVLink,跨机才用 RDMA——这就是 8 机/千卡 GPU 节点内高速、节点间 RDMA 的两层网络架构来源。
- NVLink 和 RDMA 不冲突,NCCL 会按拓扑自动分层:机内 NVLink ring + 跨机 IB ring。
8.4 典型集群网络参数(心里要有数)
- 单卡训练时 all-reduce 通信量 模型参数量。一个 70B 模型 fp16 约 140GB 参数,每步 all-gather 要传 140GB。
- RoCEv2/IB 单口 400Gbps = 50GB/s,要传 140GB 即便带宽全打满也 秒,所以通信开销真实存在、不可忽略,梯度分桶(bucket)/ 重叠计算通信(overlap)/ ZeRO 分片都是为此而生。
- 面试可顺势引到你对通信计算重叠、bucketing 大小调优、张量并行 vs 数据并行的网络选择的理解,体现"懂网络也懂训练"。
九、常用命令与排障(实操题必背)
1 | # 查看网卡/状态 |
常见坑:
- NCCL 没走 RDMA → 检查
NCCL_IB_DISABLE、网卡是否被NCCL_IB_HCA正确选中、peermem 模块是否加载。 - PFC/ECN 没配好 → 用
ethtool -S <iface>看rx_ppp_xxx(pause)和 ECN 计数,训练慢但带宽利用率低时优先怀疑拥塞/丢包。 - 跨 NUMA 装网卡 →
numactl看网卡和 GPU 的 NUMA 亲和性,跨 NUMA 的 P2P 性能显著下降,需要重插或绑定进程 NUMA。
十、面试高频问答(Q&A 速记)
Q1:RDMA 为什么比 TCP 快?
两点:kernel bypass(不进 OS 协议栈、不走系统调用、无上下文切换)+ zero-copy(用户态内存直接被网卡 DMA,不在用户态/内核态间拷贝)。结果是吞吐高且 CPU 不被占用——带宽越高 CPU 反而越闲,这是和 TCP 栈最大的不同。
Q2:RoCEv2 和 InfiniBand 有什么区别?
IB 是专用网络,链路层原生支持 RDMA,性能最好但贵且封闭;RoCEv2 把 IB 传输层封装在 UDP/IP(端口 4791)上跑标准以太网,可三层路由、复用以太网交换机,便宜通用,但要在以太网上补 PFC+ECN+DCQCN 做无损。性能 IB 略优,工程上 RoCEv2 是当下 AI 数据中心主流。
Q3:什么是零拷贝?内存为什么要注册(MR)?
零拷贝指数据从一端用户态内存到另一端用户态内存全程不在内核态拷贝。MR 注册是因为网卡要用 DMA 直接访问物理内存,必须:①把内存 pin 在物理页(不能被 swap/重映射);②建立虚拟→物理地址映射表下发给网卡,并返回 lkey/rkey 作为访问凭证。所以 MR 有开销,要复用、大块注册,避免频繁注册。
Q4:RDMA Write 和 Send 有什么区别?为什么训练里用 Write 多?
Send 是双边,对端必须 post Receive 接收、消耗对端 RQ、对端 CPU 参与;RDMA Write 是单边,只要知道对端 addr+rkey 就直接 DMA 写过去,对端 CPU/RQ 完全不参与。训练里数据块大、对端 GPU 忙着算、希望通信完全卸载,所以单边 Write 最合适。
Q5:你们训练集群为什么网卡和 GPU 在同一个 PCIe switch 下要特意安排?
为了 GPU Direct RDMA 的 P2P DMA 性能最优。GDR 让网卡直接 DMA GPU 显存、省掉 host 内存中转;但 P2P 走 PCIe,跨 PCIe root/跨 NUMA 性能下降明显,所以把通信的 GPU 和网卡放在同一个 PCIe switch(同 NUMA)下,P2P 不出 switch,延迟和带宽最好。
Q6:RoCEv2 怎么做到无损?DCQCN 和 PFC 各管什么?
PFC 做链路级反压防丢包(接收端快满就反压发送端暂停),是兜底;ECN+DCQCN 做端到端拥塞控制(交换机拥塞打 ECN→接收端回 CNP→发送端降速),是治本。配合 DSCP→优先级映射让 RDMA 流量走无损队列。AI 训练 incast 大,没这套尾部延迟会爆炸。
Q7:NCCL 是怎么用 RDMA 的?怎么排查没走 RDMA?
NCCL transport 层跨机默认走 IB/RoCE Verbs,集合通信用 RDMA Write 做 ring/tree。排查:
NCCL_DEBUG=INFO,日志里看 transport 是IB/NET还是SOCKET,是否出现GPUDirect RDMA,以及NCCL_IB_DISABLE、NCCL_IB_HCA、peermem 模块是否加载正确。
Q8:RC 和 UD 怎么选?RC 的扩展性瓶颈是什么?
RC 可靠按序点对点,ML 训练主力;UD 不可靠不保序、无连接、支持多播,适合控制面/发现/小消息。RC 的瓶颈是点对点连接——N 台机器两两通信每台要 个 QP,QP 是网卡硬件资源,N 大了 QP 爆炸,扩展受限。这也是近年有"over UD 的可靠消息层""多 path/多 QP 分片"等优化方向的原因。
Q9:Ring All-Reduce 通信量是多少,为什么带宽最优?
Ring All-Reduce 把 reduce-scatter 和 all-gather 各走一遍环,每步每节点传 ( 总数据量, 节点数),共 步,总通信量 ,摊到每节点每步用满单链路带宽,所以带宽利用率高。对比树形,ring 在带宽受限网络更优,树形在延迟受限网络更优,NCCL 按拓扑自动选。
Q10:无损、不丢包就能保证 RDMA 性能吗?
不能只靠不丢包。PFC 不丢包但会 head-of-line blocking,甚至 PFC 死锁;DCQCN 降速但参数难调。真正性能还依赖:①拓扑无环避免 PFC 死锁;②合理 buffer/ECN 阈值;③端侧 GDR+P2P 拓扑;④QP/qp_depth/outstanding read 调优。无损是底线,调优才是性能。
十一、一张图总结全栈
1 | 应用层: PyTorch / Megatron / DeepSpeed |
记住:kernel bypass + zero-copy 是根,单边操作是魂,无损网络是 RoCEv2 的命门,GDR/NCCL 是 ML 落地的两把钥匙。 把这套讲顺,机器学习系统研发岗的 RDMA 这关基本稳过。
参考资料
- InfiniBand Architecture Specification, IBTA.
- RDMA over Converged Ethernet (RoCE) v2 Spec, IBTA.
- Investigating the PCIe in Modern GPU Accelerators / NVIDIA GPUDirect RDMA 白皮书.
- NCCL 文档与源码:https://docs.nvidia.com/deeplearning/nccl/
- DCQCN: Congestion Control for Large-Scale RDMA Deployments, SIGCOMM 2015.
- HPCC: HPCC: High Precision Congestion Control, SIGCOMM 2019.
- DeepMind / Meta / 阿里 关于 AI 训练网络的工程博客。