3. 通信基础与硬件拓扑
做过多卡训练的朋友都知道,通信往往是整个系统的瓶颈。我见过不少团队,GPU算力堆得挺高,结果一跑分布式训练,效率直接腰斩。说白了,就是没搞明白通信硬件在干什么。
今天咱们聊聊三种主流的通信技术:NVLink、PCIe、InfiniBand。它们分别解决什么问题?节点内怎么连,跨节点又怎么连?带宽和延迟模型该怎么理解?
一、三种通信技术的本质差异
先给个直观的对比。我个人习惯把这三者放在一张表里看,一目了然:
| 特性 | NVLink | PCIe 5.0 x16 | InfiniBand HDR |
|---|---|---|---|
| 单链路带宽 | 50 GB/s(双向) | 32 GB/s(双向) | 25 GB/s(单向) |
| 延迟 | ~200 ns | ~1 μs | ~1 μs |
| 拓扑范围 | 节点内(GPU-GPU) | 节点内(CPU-GPU) | 跨节点(服务器间) |
| 协议开销 | 极低(硬件直连) | 中等(DMA引擎) | 较高(RDMA仍需封装) |
| 典型场景 | 多GPU共享显存 | 数据加载、控制流 | 集群训练、分布式存储 |
嗯,这里要注意:NVLink的延迟是纳秒级的,PCIe和InfiniBand是微秒级。差了5倍左右。我在项目中遇到过有人拿PCIe当NVLink用,结果通信开销占了训练时间的40%。
二、节点内通信拓扑
节点内,也就是一台服务器内部,GPU之间怎么连?
最常见的拓扑有两种:
- 全互联(NVSwitch):每个GPU通过NVLink连接到中央交换芯片。任意两个GPU之间都是直连,带宽不打折。DGX系列就是这种。
- 环形/混合立方体:GPU之间通过NVLink形成环或立方体。比如A100 4卡,每张卡连2-3个邻居。跨跳数多的通信,带宽会下降。
你想想看,全互联的好处是通信均匀,坏处是成本高。环形拓扑便宜,但写代码时得小心——我曾经因为没注意GPU拓扑,把all-reduce放到了跨跳的链路上,结果性能直接掉了一半。
三、跨节点通信拓扑
跨节点,说白了就是多台服务器之间怎么连。这里的主角是InfiniBand和RoCE(RDMA over Converged Ethernet)。
典型的拓扑是Fat-Tree(胖树):
- 每个节点有一张或多张InfiniBand HCA卡(比如ConnectX-6)
- HCA卡连接到叶交换机(Leaf Switch)
- 叶交换机再上行到脊交换机(Spine Switch)
- 脊交换机之间全互联,保证任意两个节点之间带宽一致
我建议你在设计集群时,至少保证节点间带宽 = 节点内总带宽的1/4。为什么?因为分布式训练中,梯度同步的通信量大约是计算量的1/4。如果跨节点带宽太低,通信就会成为瓶颈。
四、通信带宽与延迟模型
搞清楚了硬件,还得会算账。通信模型说白了就两个参数:带宽和延迟。
对于一次消息传递,总时间可以近似为:
总时间 = 延迟 + 数据量 / 带宽
举个例子:
- NVLink延迟200 ns,带宽50 GB/s
- 传输1 MB数据:200 ns + 1 MB / 50 GB/s ≈ 200 ns + 20 μs ≈ 20.2 μs
- 传输1 GB数据:200 ns + 1 GB / 50 GB/s ≈ 200 ns + 20 ms ≈ 20 ms
你看,小消息(比如1 MB)延迟占主导,大消息(比如1 GB)带宽占主导。所以优化策略也不同:
- 小消息:减少通信次数,合并小包。比如用梯度累积代替频繁同步。
- 大消息:提高带宽利用率,用流水线(pipeline)把计算和通信重叠。
五、知识体系总览
下面这张图,是我自己总结的通信硬件知识框架。你可以把它当作一个快速索引:
嗯,这张图基本把今天的内容串起来了。你想想看,从NVLink到InfiniBand,从节点内到跨节点,再到带宽延迟模型,其实就三个核心问题:谁和谁通信?走什么路?路有多宽多快?
搞清楚了这些,后面调优的时候,你就能一眼看出瓶颈在哪。我个人习惯是先看拓扑图,再看profiling数据,最后动手改代码。顺序别搞反了。