GPU 通信 · RDMA 直连

GPUDirect RDMA 详解:
让网卡「绕开 CPU」还不够,还得「直连显存」

从 PCIe P2P 到 nvidia-peermem:数据通路三段式演进、GPUDirect 家族、NCCL 配置与验证一次讲透

RDMA(Remote Direct Memory Access)已经让网卡绕过 CPU 和内核协议栈,直接把数据写进对端机器的主机内存。很多人以为这就是分布式训练通信优化的终点。但仔细看数据通路,还有一段「绕不过去」的路:

对端 GPU 显存 → 对端主机内存 → 网卡 → 网络 → 网卡 → 本端主机内存 → 本端 GPU 显存

GPU 计算产生的数据在显存里,但 RDMA 网卡只认主机内存。于是每一笔跨机传输都要「显存 → 主机内存 → 网卡」这样搬运两次,既多耗时间,又占用 CPU 和 PCIe 带宽。GPU 算力越强,这段中转的开销就越刺眼——尤其是大模型训练/推理这种「GPU 之间频繁交换 GB 级数据」的场景。

GPUDirect RDMA(GDR) 就是为砍掉这段中转而生:让 RDMA 网卡通过 PCIe 总线直接读写 GPU 显存,数据通路变成:

对端 GPU 显存 → 对端网卡 → 网络 → 本端网卡 → 本端 GPU 显存

一句话:RDMA 绕过 CPU,GDR 再绕过主机内存。

数据通路演进

一、三段式演进:数据通路怎么一步步变短

阶段数据通路中间环节痛点
传统 TCP/IP显存 → 主机内存 → 内核协议栈 → 网卡 → …CPU 拷贝 + 内核态/用户态切换延迟毫秒级、CPU 占用高
普通 RDMA显存 → 主机内存 → 网卡(内核旁路)→ …显存与主机内存间的两次搬运延迟微秒级,但仍绕主机内存
GPUDirect RDMA显存 → 网卡 → 网络 → 网卡 → 显存仅网络本身延迟与 CPU 占用进一步下降,带宽利用率拉满

三个阶段的本质区别,就是「数据从 GPU 到网卡」这一段由谁搬运、搬运几次。GDR 把这一段从「CPU 指挥搬运两次」变成「PCIe 点对点直达一次」。

核心原理

二、核心原理:PCIe P2P + 显存注册

GDR 能在硬件上成立,靠两个关键机制:

1. PCIe P2P(Peer-to-Peer):设备间不经过 CPU 的直通

传统 PCIe 架构里,两个设备(如 GPU 和网卡)之间的数据传输默认要经过 Root Complex(RC,通常在 CPU 里) 中转。支持 PCIe P2P 的系统允许两个端点设备直接通过 PCIe 交换机/总线互相读写,不再绕 RC。

GDR 的本质,就是「GPU 与 RDMA 网卡之间的 PCIe P2P 通信」:网卡的 DMA 引擎直接以 GPU 显存为目标地址发读写请求。这就要求:

2. 显存注册:把 GPU 显存「翻译」成网卡能识别的地址

RDMA 通信前必须做 Memory Registration(内存注册),把内存地址翻译成网卡 HCA 能理解的形式(物理地址 + lkey/rkey)。普通 RDMA 注册的是主机内存;GDR 要注册的是 GPU 显存,这就需要一个「翻译官」——nvidia-peermem 内核模块。

nvidia-peermem 由 NVIDIA 驱动包提供,它向内核暴露一个虚拟的「对端内存」设备,让 InfiniBand/RoCE HCA 驱动能够:

CUDA 侧则通过 cuPointerGetAttribute 等接口确认显存指针是否支持 GDR 注册(返回 CUDA_ERROR_INVALID_VALUE 说明不支持,程序应回退到普通路径)。

GPUDirect 家族

三、技术家族:别把四个「GPUDirect」搞混

NVIDIA 的 GPUDirect 是一个技术家族,经常被混为一谈,实际上各管一段:

技术解决的通信典型场景
GPUDirect P2P单机内 GPU ↔ GPU(同 PCIe 树)多卡机内直连、NCCL P2P 传输
GPUDirect RDMA(GDR)跨机 GPU ↔ GPU(经 IB/RoCE 网卡)多机 AllReduce、分布式训练/推理
GPUDirect Storage(GDS)GPU ↔ 存储(NVMe/NVMe-oF)数据加载、Checkpoint 读写
GPUDirect Async / DOCA GPUNetIOGPU 直接控制网络操作(计算通信融合)CUDA 内核内发起通信,进一步去 CPU 化

再往上一层,NVIDIA 用 Magnum IO 统一打包这些「喂数据给 GPU」的技术栈。而单机内的 NVLink/NVSwitch 是另一条更快的通道,与 GDR 是「机内 vs 跨机」的分层关系:机内靠 NVLink,跨机靠 GDR。

NCCL 中的 GDR

四、NCCL 里的 GDR:NCCL_NET_GDR_LEVEL 与拓扑探测

NCCL 是 GDR 最大的受益者和推广者。它在初始化时会做两件事:

  1. 拓扑探测:通过 ncclTopo 判断 GPU 与网卡是否在同一 PCIe 域、是否支持 P2P,决定能否启用 GDR
  2. 路径选择:支持 GDR 就走「显存直连」,不支持则回退到「显存 → 主机内存 → 网卡」

用户侧主要通过环境变量控制:

export NCCL_NET_GDR_LEVEL=5   # GPUDirect RDMA 等级(0=关闭,值越高越激进)
export NCCL_IB_HCA=mlx5_0     # 指定 RDMA 网卡
export NCCL_IB_GID_INDEX=3    # RoCEv2 的 GID 索引(show_gids 查)
export NCCL_DEBUG=INFO        # 调试时打开,确认 GDR 是否启用

怎么确认 GDR 真的生效了? 打开 NCCL_DEBUG=INFO 看日志,出现类似字样即说明网卡层面已识别:

NCCL INFO NET/IB : GPU Direct RDMA Enabled for HCA mlx5_0
NCCL INFO Channel 00/0 : 0[0] -> 1[0] via P2P/direct pointer

注意:日志只能说明「网卡层面识别了 GDR」,实际是否走通还要看带宽实测与有无静默降级。

性能收益

五、性能收益:不是锦上添花,而是「多机能不能用」的差距

GDR 的收益体现在三个维度:

更关键的是规模效应:模型越大、并行度越高、通信越频繁,GDR 的收益越大。对 2 卡小任务可能无关痛痒,对 16/32/64 卡以上的多机张量并行或大规模数据并行 AllReduce,没开 GDR 基本等于网络白买。

前提与验证

六、前提条件与验证清单

GDR 不是装个库就能用的,它要求整条链路都对齐:

环节要求
系统Linux kernel 5.12+(NVIDIA GPU Operator 文档的典型前提)
CUDA / 驱动CUDA 11.7+、NVIDIA 驱动(推荐 Open GPU Kernel Modules)
内核模块nvidia-peermem 正确加载(lsmod | grep nvidia_peermem)
网卡InfiniBand 或 RoCE 的 HCA(如 Mellanox/NVIDIA ConnectX)
拓扑GPU 与网卡在同一 PCIe 域,支持 PCIe P2P(老 Intel IOH 平台不支持)
网络前提RoCE 需无损以太网(PFC/ECN)+ 正确 GID 索引

验证三步走

  1. lsmod | grep nvidia_peermem 确认 peermem 模块已加载
  2. NCCL_DEBUG=INFO 跑 all_reduce_perf(nccl-tests),看日志有无 GPU Direct RDMA Enabled
  3. ib_write_bw --use_cuda 直接压 RDMA 带宽,与物理带宽对比(无 GDR 时该命令无法直连显存)
落地要点

七、落地设计要点(八条)

  1. 先确认拓扑:GPU 与网卡不同 PCIe 域、老平台不支持 P2P,一切都白搭——买机器前先问清楚
  2. nvidia-peermem 必须加载:装完驱动检查 lsmod | grep nvidia_peermem,没加载就没有 GDR
  3. kernel 版本对齐:老内核升级代价大,采购时就把「kernel 5.12+ / CUDA 11.7+」写进需求
  4. GID 索引进容器再确认:容器内外 GID 索引可能不一致,show_gids 以容器内为准
  5. NCCL_DEBUG 验证而非「以为生效」:日志看到 GPU Direct RDMA Enabled 只是网卡识别,还要带宽实测
  6. GDR 等级按需调:NCCL_NET_GDR_LEVEL 值越高越激进,个别驱动/网卡组合兼容性差时可降级排查
  7. 机内用 P2P/NVLink、跨机用 GDR:别混用——NCCL_P2P_LEVEL 管机内,NCCL_NET_GDR_LEVEL 管跨机
  8. 配套无损网络:GDR 是「通路」,RoCE 的无损(PFC/ECN)是「路况」,缺一不可
总结

八、写在最后

回顾整条演进线,每一代优化的逻辑高度一致——把数据路径上每一个不必要的「中转站」拆掉:

对大模型工程团队来说,GDR 不是可选优化,而是多机分布式的基础配置:链路不齐,加再多的卡、换再贵的网卡,通信也会卡在「显存 ↔ 主机内存」这两段搬运上。下次调多机性能时,先别怀疑模型和框架——查一查你的集群里,GPU Direct RDMA Enabled 这行日志到底有没有打出来。

关于向量云:大模型落地,把基础设施的复杂性留给我们

GPU 集群、RDMA 网络、分布式通信调优,都是持续的基础设施工程。向量云(南京)科技有限公司依托字节跳动火山方舟官方授权,专注大模型应用落地:

向量云能力说明
官方授权接入火山方舟官方 API 与官方 Key 直连
低折扣 Token专属折扣价,用量越大越划算
独享接入点独立接入点,缓存与配额不被公共池挤占
缓存隔离降本上下文缓存红利稳定落袋
计费灵活按量计费、即用即扣、注册充值 10 元起
协议兼容OpenAI 兼容协议,业务代码几乎零改动

接入方式:注册后获取官方 API Key,把 base_url 指向向量云接入点即可直接调用火山方舟官方模型。

获取 API Key:https://ark.tokenrize.cn/ · 火山方舟官方 API 与 Key 直连,注册即用

一句话总结:RDMA 绕过 CPU,GDR 再绕过主机内存——多机大模型通信的最后一段中转,砍掉它,网络才算真正「直连」。

关于向量云
向量云(南京)科技有限公司

面向大模型应用落地的技术服务型企业,依托字节跳动火山方舟能力,为合作方提供低折扣模型 Token、可独立部署的运营支撑平台及全链路运营支持。

火山方舟官方授权 官方 API Key 独享接入点 缓存隔离降本 低折扣 Token 即用即扣 · 不设账期

常见问题(FAQ)

火山方舟官方 API 与官方 Key 直连 · 向量云 · GPUDirect RDMA 显存直连

Q1. GPUDirect RDMA 是什么?和普通 RDMA 有什么区别?

A. 普通 RDMA 让网卡绕过 CPU 和内核,把数据直接写进对端的「主机内存」;GPUDirect RDMA(GDR)进一步让 InfiniBand/RoCE 网卡通过 PCIe 总线直接读写「GPU 显存」。区别在于:普通 RDMA 的跨机传输仍要经历「显存 → 主机内存 → 网卡」的两次搬运,GDR 把这两段也砍掉,实现「对端显存 → 本端显存」全程不经过 CPU 和主机内存。

Q2. GPUDirect RDMA 的核心原理是什么?

A. 两个机制:① PCIe P2P——GPU 与网卡在同一 PCIe 域内点对点直连,网卡 DMA 引擎直接以显存为目标地址读写,不绕 Root Complex;② 显存注册——nvidia-peermem 内核模块把 GPU 显存映射进 PCIe BAR 空间并完成 pin(页锁定),生成 lkey/rkey 交给网卡,让 HCA 能像操作主机内存一样操作显存。

Q3. GPUDirect RDMA、GPUDirect P2P、GPUDirect Storage 有什么区别?

A. 三者同属 GPUDirect 家族但各管一段:GPUDirect P2P 解决单机内 GPU 与 GPU 之间的 PCIe 直连;GPUDirect RDMA 解决跨机 GPU 之间经 IB/RoCE 网卡的显存直连;GPUDirect Storage(GDS)解决 GPU 与存储(NVMe/NVMe-oF)之间的直连。此外还有 GPUDirect Async / DOCA GPUNetIO,让 GPU 直接控制网络操作、进一步去 CPU 化。

Q4. 怎么确认 GDR 是否真正生效?

A. 三步:① lsmod | grep nvidia_peermem 确认内核模块已加载;② 设 NCCL_DEBUG=INFO 跑 all_reduce_perf,日志出现「GPU Direct RDMA Enabled for HCA」说明网卡层面已识别;③ 用 ib_write_bw --use_cuda 实测 RDMA 带宽并与物理带宽对比。注意日志只能说明识别成功,实际是否走通还要以带宽实测为准。

Q5. GPUDirect RDMA 有哪些前提条件?

A. Linux kernel 5.12+、CUDA 11.7+、NVIDIA 驱动(推荐 Open GPU Kernel Modules);nvidia-peermem 内核模块正确加载;网卡为 InfiniBand 或 RoCE HCA(如 ConnectX);GPU 与网卡在同一 PCIe 域且支持 PCIe P2P;RoCE 场景还需无损以太网(PFC/ECN)与正确的 GID 索引。老 Intel IOH 平台不支持跨桥 P2P,是常见踩坑点。

Q6. GDR 的性能收益有多大?

A. 三个维度:延迟显著下降(对 AllReduce 等延迟敏感操作尤其明显,配合 DOCA GPUNetIO 等方案端到端延迟可再降 30% 以上);CPU 占用大幅降低(无需指挥内存拷贝);带宽利用率更接近网卡物理带宽。收益随规模放大——2 卡任务无关痛痒,16/32/64 卡以上的多机并行不开 GDR 基本等于网络白买。

Q7. nvidia-peermem 是什么?为什么必须加载?

A. nvidia-peermem 是 NVIDIA 驱动包提供的内核模块,充当 GPU 显存与 RDMA 网卡之间的「翻译官」:它把显存映射进 PCIe BAR 空间、完成 pin 页锁定、生成网卡可用的 lkey/rkey。没有它,HCA 驱动就无法注册显存,GDR 整条链路不成立。装完驱动后应第一时间用 lsmod | grep nvidia_peermem 确认已加载。