硬件拓扑:NVLink、PCIe、InfiniBand、以太网的对比

聊到多卡通信,很多人第一反应就是「选个带宽大的就行」。嗯,我当年也是这么想的。直到有一次在项目里,我用四张A100跑一个分布式训练任务,结果发现通信延迟比计算还高,整个集群的利用率不到40%。排查了半天,问题出在拓扑上——两张卡虽然物理上插在同一台机器里,但它们走的却是PCIe Switch,而不是直连的NVLink。

说白了,硬件拓扑决定了数据从卡A到卡B要走多少「弯路」。今天我就把四种主流互联方式掰开揉碎了讲清楚。

一、四种互联方式的核心差异

先看一张对比表,心里有个底:

特性 NVLink PCIe 5.0 x16 InfiniBand HDR 以太网 100GbE
单链路带宽 600 GB/s (NVLink 4.0) 64 GB/s 12.5 GB/s 12.5 GB/s
延迟 < 1 μs ~1-3 μs ~1-2 μs ~5-10 μs
拓扑灵活性 固定(GPU间直连) 树形/星形 胖树/任意 任意
典型场景 单机多卡 单机多卡(低端) 多机互联 通用网络
成本 高(需专用GPU) 中 高 低

你可能会问:为什么NVLink带宽这么高?因为它走的是GPU内部的NVLink控制器,数据不需要经过CPU内存,直接在GPU之间通过高速通道传输。我习惯把它理解成「GPU之间的高速公路」,而PCIe更像是「国道」,虽然也能走,但中间要经过CPU这个收费站。

二、NVLink:GPU之间的直连通道

NVLink是NVIDIA搞出来的私有协议。它的设计目标很明确:让GPU之间通信像访问本地显存一样快。

我记得第一次用NVLink做all-reduce时,被它的延迟惊到了。两张卡之间传一个1GB的张量,耗时不到2毫秒。同样的数据走PCIe,至少需要5-6毫秒。为什么会这样?因为NVLink的物理层直接连在GPU的片上网络(NoC)上,数据包不需要经过任何中间节点。

关键点:NVLink的拓扑是固定的。以DGX A100为例,8张GPU通过NVSwitch组成全互联拓扑,任意两张卡之间都有6条NVLink链路。这意味着通信带宽是均匀的,不会出现「某两张卡通信快,另两张卡通信慢」的情况。

但NVLink也有坑。我曾经在一个项目中,把两张GPU插在不同的PCIe插槽上,以为它们会自动走NVLink。结果发现,NVLink只对同一块主板上的特定GPU对有效。如果你把GPU插在非推荐的插槽上,它们可能走的是PCIe,白白浪费了NVLink的带宽。

避坑指南:使用NVLink前,一定要用nvidia-smi topo -m命令检查GPU拓扑。我曾经因为没检查,导致通信性能只有预期的1/3。

三、PCIe:通用但有限制

PCIe是通用的I/O总线标准。它的优点是兼容性好,几乎所有GPU都支持。但缺点也很明显:带宽共享。

你想想看,一台服务器通常只有几十条PCIe通道。如果你插了4张GPU,它们可能共享同一个PCIe Root Complex。这意味着当两张GPU通信时,数据要先经过CPU的PCIe控制器,再转发到另一张GPU。这个过程中,CPU成了瓶颈。

我建议你在设计多卡系统时,优先考虑PCIe Switch的拓扑。有些高端主板会配备PCIe Switch芯片,它可以把PCIe通道扩展成多个独立链路,减少带宽竞争。但即便如此,PCIe的延迟也比NVLink高一个数量级。

小技巧:如果只能用PCIe,尽量让通信频繁的GPU插在同一个PCIe Switch下。比如,两张卡做all-reduce时,如果它们共享同一个Switch,延迟会低很多。

四、InfiniBand:多机互联的王者

InfiniBand是高性能计算领域的标配。它的核心优势是RDMA(远程直接内存访问),数据可以直接从一张GPU的显存传到另一台机器的GPU显存,不需要经过CPU内存。

我在一个64卡集群上做过测试,用InfiniBand做all-reduce,带宽利用率能达到90%以上。而同样的任务用以太网,利用率只有60%左右。为什么?因为以太网的TCP/IP协议栈开销太大了,数据每经过一层协议,就要多一次内存拷贝。

InfiniBand的拓扑通常是胖树(Fat-Tree)。这种拓扑的好处是:任意两个节点之间的带宽是对称的。你不需要担心「节点A到节点B快,但节点A到节点C慢」的问题。

个人经验:InfiniBand的配置比以太网复杂得多。我第一次配IB交换机时,光子网管理器(Subnet Manager)就折腾了两天。建议新手直接用Mellanox的UFM(Unified Fabric Manager),它能自动优化路由和负载均衡。

五、以太网:便宜但需要优化

以太网是成本最低的选择。100GbE网卡的价格只有InfiniBand的一半左右。但它的性能受限于协议栈。

如果你不得不用以太网,我建议你开启RDMA over Converged Ethernet(RoCE)。RoCE可以把RDMA的能力带到以太网上,延迟能降到2-3微秒。但要注意,RoCE对网络质量要求很高,需要开启PFC(优先级流控制)和ECN(显式拥塞通知)。

我曾经在一个项目中,用RoCE跑分布式训练,结果发现丢包率超过0.1%,通信性能直接腰斩。后来排查发现是交换机缓存太小,导致拥塞丢包。换了支持大缓存的交换机后,问题才解决。

注意:RoCE的部署难度不亚于InfiniBand。如果你没有专业的网络工程师,建议直接用InfiniBand,省心很多。

六、通信拓扑对性能的影响

聊完了硬件,我们来看看拓扑。拓扑说白了就是「卡与卡之间怎么连」。不同的拓扑,通信效率天差地别。

我画了一张图,展示三种常见拓扑:

常见通信拓扑对比 全互联(NVSwitch) GPU0 GPU1 GPU2 GPU3 SW 环形拓扑 GPU0 GPU1 GPU2 GPU3 树形拓扑 Root SW0 SW1 GPU0 GPU1 GPU2 GPU3

从图中可以看出:

  • 全互联拓扑:任意两张卡之间都是直连,通信延迟最低。但成本最高,需要NVSwitch支持。
  • 环形拓扑:每张卡只和相邻卡直连。做all-reduce时,数据需要绕一圈,延迟随卡数线性增加。
  • 树形拓扑:数据要经过根节点转发。根节点容易成为瓶颈,带宽利用率不高。

我建议你根据通信模式选择拓扑。如果做all-reduce,全互联拓扑最好;如果做点对点通信,环形拓扑也够用。

七、实战建议

最后,我总结几条实战经验:

  1. 单机多卡优先用NVLink:如果预算允许,尽量选支持NVLink的GPU和主板。通信性能提升非常明显。
  2. 多机互联用InfiniBand:虽然贵,但省心。以太网虽然便宜,但优化起来很麻烦。
  3. 检查拓扑:用nvidia-smi topo -m查看GPU拓扑,确保通信路径是最优的。
  4. 避免PCIe共享:如果只能用PCIe,尽量让通信频繁的GPU插在同一个PCIe Switch下。

最后说一句:硬件拓扑是性能优化的第一步。选对了拓扑,后面的通信算子优化才能事半功倍。选错了,再怎么优化代码也救不回来。

想要更多资料,联系可可