3. 硬件拓扑认知:单机多卡与多机多卡架构、NVLink与PCIe的区别、GPU拓扑结构查看
大家好,我是你们的分布式训练讲师。今天咱们聊一个特别实在的话题——硬件拓扑。
说实话,我见过太多团队,代码写得漂漂亮亮,结果一上多卡训练,吞吐量死活上不去。查来查去,最后发现是硬件拓扑没搞明白。你想想看,GPU之间怎么通信的,数据走哪条路,这些都不清楚,优化从何谈起?
这一节,我就带你把硬件拓扑彻底吃透。咱们从单机多卡讲到多机多卡,再掰扯清楚NVLink和PCIe到底差在哪,最后手把手教你用nvidia-smi topo -m看穿你的GPU拓扑结构。
3.1 单机多卡 vs 多机多卡:架构差异
先聊最基础的。单机多卡,就是一台服务器里插了多张GPU卡。多机多卡,就是多台服务器通过网络连起来,每台服务器里又有若干张卡。
这两种架构,本质区别在哪?
通信延迟和带宽。
单机多卡里,GPU之间可以通过NVLink或者PCIe直接通信。延迟在微秒级别,带宽能到几百GB/s。多机多卡呢?服务器之间走的是网络——InfiniBand、RoCE或者千兆以太网。延迟直接跳到几十微秒甚至毫秒级,带宽也缩水到几十GB/s甚至更低。
我在项目中遇到过一件事:有个团队用8台机器做分布式训练,每台机器8张卡,总共64卡。结果发现,跨机器的通信占了总训练时间的60%以上。为什么?因为他们用的千兆以太网,带宽才1Gbps,而单机内NVLink带宽是600GB/s。差了三个数量级。
所以,设计分布式训练方案时,你得想清楚:
- 单机多卡:适合模型能塞进单机显存,但需要加速训练的场景。比如BERT-Large、GPT-2这类模型。
- 多机多卡:适合模型大到单机装不下,或者需要极大规模并行训练的场景。比如GPT-3、LLaMA-65B这种。
核心原则:尽量让通信发生在单机内部。跨机通信越少,训练效率越高。
3.2 NVLink vs PCIe:到底差在哪?
好,咱们深入一层。单机多卡里,GPU之间怎么连?两种主流方式:PCIe和NVLink。
PCIe(PCI Express),说白了就是通用总线。CPU、GPU、NVMe硬盘都挂在这上面。它的优点是通用,缺点是——嗯,有点慢。
目前主流的PCIe 4.0 x16,单向带宽约16GB/s,双向32GB/s。PCIe 5.0翻倍,单向32GB/s。听起来还行?但跟NVLink一比,就露怯了。
NVLink,是NVIDIA搞的专用GPU互联技术。它不走PCIe,而是直接在两块GPU之间拉一条高速通道。A100上NVLink 3.0,单向带宽50GB/s,双向100GB/s。H100上NVLink 4.0,单向带宽90GB/s,双向180GB/s。
你看,NVLink比PCIe快了5到10倍。
为什么会这样?因为设计目标不同。PCIe要兼容各种设备,协议开销大。NVLink只服务GPU,协议精简,延迟低,带宽高。
我个人的习惯是:
- 如果GPU之间需要频繁通信(比如张量并行、流水线并行),优先走NVLink。
- 如果通信不频繁(比如数据并行中的梯度同步),PCIe也够用。
注意:不是所有GPU都支持NVLink。比如RTX 3090、4090这些消费级显卡,只有PCIe,没有NVLink。只有V100、A100、H100这些数据中心级GPU才有。
我曾经踩过一个坑:用4张RTX 3090做张量并行训练,结果发现通信成了瓶颈。查了半天,才意识到3090之间只有PCIe,没有NVLink。后来换成4张A100,吞吐量直接翻了两倍多。
3.3 GPU拓扑结构查看:nvidia-smi topo -m
理论讲完了,咱们来点实操。怎么知道你的机器里GPU是怎么连的?
NVIDIA提供了一个命令:nvidia-smi topo -m。它能打印出GPU之间的拓扑关系。
来,我演示一下:
$ nvidia-smi topo -m
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7 CPU Affinity NUMA Affinity
GPU0 X NV2 NV2 NV2 NV2 SYS SYS SYS 0-31 0
GPU1 NV2 X NV2 NV2 SYS NV2 SYS SYS 0-31 0
GPU2 NV2 NV2 X NV2 SYS SYS NV2 SYS 0-31 0
GPU3 NV2 NV2 NV2 X SYS SYS SYS NV2 0-31 0
GPU4 NV2 SYS SYS SYS X NV2 NV2 NV2 32-63 1
GPU5 SYS NV2 SYS SYS NV2 X NV2 NV2 32-63 1
GPU6 SYS SYS NV2 SYS NV2 NV2 X NV2 32-63 1
GPU7 SYS SYS SYS NV2 NV2 NV2 NV2 X 32-63 1
Legend:
X = Self
SYS = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
NV# = Connection traversing a bonded set of # NVLinks
这张表怎么看?我教你三步:
- 看对角线:全是X,表示自己连自己,忽略。
- 看非对角线:每个格子表示对应两个GPU之间的连接方式。
NV2:表示通过2条NVLink连接。这是最快的。SYS:表示通过PCIe和系统互联(比如QPI/UPI)连接。这是最慢的。
- 看CPU Affinity和NUMA Affinity:表示GPU挂在哪个CPU和NUMA节点上。GPU0-3挂在CPU0(核心0-31),GPU4-7挂在CPU1(核心32-63)。
从这张表里,你能看出什么?
- GPU0-3之间全是NV2,说明它们在一个NVSwitch域内,通信极快。
- GPU4-7之间也是NV2,同理。
- 但GPU0和GPU4之间是SYS,说明它们跨了NUMA节点,通信要走PCIe和QPI,慢很多。
所以,如果你做数据并行,最好把梯度同步限制在同一个NVLink域内。如果必须跨域,考虑使用梯度压缩或异步通信来缓解。
小技巧:用nvidia-smi topo -m之前,先确保所有GPU都在运行状态。如果某张卡处于空闲或掉线状态,输出可能不准确。
3.4 知识体系图:硬件拓扑核心逻辑
为了让你更直观地理解,我画了一张图。它把单机多卡、多机多卡、NVLink、PCIe以及拓扑查看工具串在了一起。
这张图把咱们讲的内容都串起来了。你对照着看,思路会更清晰。
3.5 避坑指南:我踩过的那些坑
最后,分享几个我亲身经历过的坑,希望能帮你少走弯路。
坑1:我曾经在一台8卡机器上做训练,发现GPU0和GPU7通信特别慢。查了nvidia-smi topo -m才发现,它们之间是SYS连接,跨了NUMA节点。后来我把通信密集的GPU对限制在同一个NUMA域内,速度就上来了。
坑2:有次用4张RTX 4090做分布式训练,死活跑不出预期速度。后来才意识到,4090不支持NVLink,只能走PCIe。而PCIe 4.0 x16的带宽根本喂不饱张量并行的通信需求。最后换成了A100,问题解决。
坑3:多机训练时,我一开始用的千兆以太网,结果跨机通信成了瓶颈。后来换成InfiniBand,训练速度提升了3倍。记住,网络是分布式训练的命脉,别在这上面省钱。
好了,这一节的内容就到这。硬件拓扑是分布式训练的基石,搞懂了它,后面的优化才能有的放矢。希望你能把nvidia-smi topo -m用起来,真正看清你的GPU是怎么连的。
一句话总结:NVLink是高速公路,PCIe是普通公路,网络是乡间小路。选对路,才能跑得快。
想要更多资料,联系可可