服务器专题 | 第18期:数据直进 GPU,省掉了什么
两台机器上的 GPU 要对一次梯度。数据从一边的显存出发,到另一边的显存落下,中间要走多远?老办法的答案是一串中转:源端 GPU 显存先拷进主机内存,主机内存交给网卡,网卡发上网络;对端网卡收到,再拷进对端主机内存,最后拷进对端 GPU 显存。一段逻辑上的点对点,物理上走了六站,每一站都是一次拷贝、一次等待。
这篇只讲透这一处:GPUDirect RDMA 把中间的主机内存拿掉之后,到底省掉了什么,又没省掉什么。
老路每端都要经过主机内存,直路网卡直接读写 GPU 显存(示意图为程序绘制)
老路:数据要过两次主机内存
老路的代价,不在某一站特别慢,而在站数本身。发送端,GPU 显存里的数据要先落进主机内存这块中转地,网卡再从主机内存取走;接收端反过来,网卡先把数据放进主机内存,GPU 再从主机内存取走。NVIDIA 的公开说明把这条直路的定义写得很直白:网卡可以直接访问 GPU 显存,绕过 CPU 主机内存1。反过来看,老路就是这句话的反面:每一次跨节点交换,数据都要在两端各经过一次主机内存。
中转地带来的不只是多两次拷贝。主机内存是整台机器共用的地盘,拷贝要占内存带宽,搬运要占 CPU 的调度与处理,等待要占同步的节拍。梯度同步这类流量有个特点:消息不大、次数极多,一次中转的零头不大,乘以成千上万次同步,就成了训练节拍里甩不掉的尾巴。更麻烦的一层是,CPU 在老路里是搬运工,搬运工忙起来,真正该 CPU 干的活反而要排队。省掉中转,省的其实是三样东西:两次拷贝占用的内存带宽、CPU 在数据路径上的搬运负担、以及每一次中转叠加的等待。
这里要先把一个容易混淆的点分开。RDMA 本身已经让网卡不经过 CPU 内核直接读写内存,GPUDirect RDMA 再往前走一步:网卡读写的内存,不再是主机内存,而是 GPU 显存。两步省的是不同的东西:RDMA 省的是 CPU 内核的介入,GPUDirect 省的是主机内存这一站。只上了 RDMA、没上 GPUDirect 的集群,数据照样要在主机内存里停一脚。
直路:网卡认得 GPU 的那扇窗
直路能走通,靠的不是网卡变聪明了,而是地址先对好了。PCIe 世界里,每个设备都通过一组基地址寄存器(BAR)向外暴露自己的地址窗口,别的设备读写这个窗口里的地址,就等于读写这块设备的内存2。GPUDirect RDMA 的做法,是让网卡的 DMA 引擎直接对着 GPU 的 BAR 窗口发读写,GPU 的显存控制器从显存里接应这笔请求。操作系统事前要做的是登记:把目标显存的地址映射交给网卡驱动,页面固定住,不让它在传输中途被换走2。地址对好、页面钉牢之后,数据路径上就不再需要 CPU 发一条条读写指令,也不再需要主机内存做中转。
这个“事前”与“事中”的分工,是理解直路的关键。CPU 并没有从系统里消失,它只是从数据路径上退了下来,退到控制路径上:登记地址、固定页面、发起传输、处理完成通知,这些仍是 CPU 与驱动的事。Google Cloud 对自家 GPU 机型的说明用了同样的表述:GPUDirect RDMA 让网卡经 PCIe 直接访问 GPU 显存,绕过主机 CPU 与系统内存,点对点通信由此降低跨节点 GPU 通信的延迟3。注意这句话的主语是数据路径,不是整台机器。把“绕过 CPU”读成“不需要 CPU”,就读过头了。
直路的认路方式:网卡按 BAR 窗口地址直接读写显存,CPU 只在事前登记(示意图为程序绘制)
同家族里还有一条容易混淆的直路,顺带划清界限:GPUDirect Storage 走的是存储到 GPU 显存的直路,DMA 在显存与存储之间直接搬运,同样避开经 CPU 的弹跳缓冲1。这期讲的是网卡那条路,存储那条路的账另算。两条路共用“直达显存”这个思路,但对端的设备、驱动与支持矩阵各不相同,采购时不能拿一条路的通过证明另一条路。
绕过的是数据路,不是整台机器
直路不是插上网卡就自动成立的,买方清单上至少有三问。第一问,网卡与 GPU 的组合在不在支持矩阵里。NVIDIA 的公开说明里写明,GPUDirect 技术只在部分虚拟 GPU 与客户操作系统版本上受支持1,驱动、内核模块与网卡型号要成套对上,单点对上不算数。第二问,拓扑对不对。网卡与 GPU 挂在同一 PCIe 交换域下,直路走得顺;跨了 CPU 插槽、跨了根复合体,直路在协议上仍能走,但每一步都要多绕,省下来的好处会被拓扑吃掉一部分。验收时看拓扑图的习惯,在这里比看网卡铭牌更管用。第三问,应用是不是真的走了直路。通信库会按拓扑在点对点、主机内存中转、网络直路之间选路,直路没配通时,它会悄悄退回主机内存中转,训练照样跑,只是慢得不显眼。跑起来之后对一次实际路径,比看配置单上写没写 GPUDirect 更可信。
以小见大的一层判断:服务器里的数据路径,正在从“经过主机”转向“直达设备”。上一期讲 CXL.cache,是让设备缓存主机内存、两边共用一份数据;这一期讲 GPUDirect,是让网卡绕过主机内存、直达 GPU 显存。方向看似相反,骨子里的账是同一笔:主机内存曾经是所有数据必经的中转站,现在中转站正在被一条条直路绕开。绕开的代价是地址、拓扑、驱动要事先对得更严;绕开的好处是,数据路径上的每一站,都少了一次拷贝与等待。
没完全想通、留下一个问题:直路省下的等待,在真实训练里到底占到单步时间的几成,公开说明里多是机制描述,少有按消息大小、按同步频率拆开的对照。消息大、同步稀的负载,中转成本本来就摊得薄;消息小、同步密的负载,直路的收益才显形。这条分界线在哪一档消息大小上翻转,还缺一组能复现的测量。没有这组数,选型时直路的收益只能算方向,算不出边界。
觉 然 小 注
路省下来了,站就少了;站少了,数据才不用在中转站里等。
· · ·
九羲科技|服务器 · 私有 AI · 存力方案
系列目录
第1期 | 73% 的整机钱,都给了 GPU 板组
第2期 | 4500 颗芯片撑起 95% 的机架价值
第3期 | 拆一台 2U 双路:通用服务器的钱花在哪
第4期 | 大铁盒子,值钱的不是铁
第5期 | 冻结点:L5 之后结构不许再改
第6期 | 能点亮不等于能交付:十二层验什么
第7期 | 内存离 CPU 有多远:NUMA 的延迟税
第8期 | 带宽不是买速度,是买并行度
第9期 | 一颗坏芯片,怎样不拖垮整机
第10期 | 数据上台三步,每步都在花时间
第11期 | CXL 内存慢一档,为什么还值得买
第12期 | 存力只在关键路径上才算数
第13期 | 链路是谈出来的:开机几秒谈什么
第14期 | 四电平挤带宽:SerDes在替谁赎买
第15期 | 端口数好看,带宽要看上行
第16期 | 把故障关进一个端口
第17期 | 设备能缓存主机内存,变了什么
引用与出处
[1] NVIDIA. GPUDirect RDMA and GPUDirect Storage. docs.nvidia.com. https://docs.nvidia.com/ai-enterprise/release-7/latest/infra-software/vgpu/features/gpudirect.html
[2] NVIDIA. GPUDirect RDMA within the Linux Device Driver Model. docs.nvidia.com(CUDA 12.1.1 存档). https://docs.nvidia.com/cuda/archive/12.1.1/gpudirect-rdma/index.html
[3] Google Cloud. GPUDirect RDMA and MRDMA functions. docs.cloud.google.com. https://docs.cloud.google.com/compute/docs/gpus/gpu-network-bandwidth#mtu-gpu
下一篇|第19期:先画归属图,再谈配置 —— GPU、网卡、NVMe 挂在哪颗 CPU 上。