1、多GPU基础:为什么需要多GPU、多GPU架构概述、GPU拓扑与NVLink介绍
1.1 为什么需要多GPU?—— 单卡不够用了
说实话,我刚开始做GPU编程那会儿,一块GTX 580就觉得天下无敌了。但后来项目越做越大,单卡真的扛不住了。
为什么会这样?说白了就两个原因:显存不够和算力不够。
举个例子。我去年参与过一个气象模拟项目,模型参数超过100亿。一块A100 80GB显存,连模型都装不下。你想想看,这还怎么玩?
再比如训练大语言模型。现在主流的LLaMA-65B模型,光参数就占130GB显存。加上优化器状态、梯度、激活值,单卡根本不可能跑起来。
所以,多GPU不是锦上添花,而是刚需。我个人的经验是,当你的模型显存需求超过单卡80%时,就该考虑多GPU方案了。
- 显存墙:单卡显存有限,大模型装不下
- 算力墙:单卡算力有限,训练时间太长
- 带宽墙:单卡内存带宽有限,数据搬运成瓶颈
1.2 多GPU架构概述—— 你该知道的几种模式
多GPU架构,其实没那么玄乎。我习惯把它分成三类:
1.2.1 独立GPU架构
每块GPU各自独立,通过PCIe总线通信。这是最基础的模式。我记得早期做深度学习时,就是两块1080 Ti插在主板上,各跑各的,偶尔通过PCIe交换一下梯度。
优点:便宜、灵活、随便插。
缺点:通信慢,PCIe 4.0 x16也就32GB/s,跟显存带宽比差远了。
1.2.2 混合架构
GPU之间既有PCIe连接,又有高速互联。比如NVIDIA的DGX系列,8块A100通过NVLink全互联,同时每块GPU也连着PCIe。
这种架构我特别喜欢。为什么?因为你可以把计算密集型的通信走NVLink,把控制类的通信走PCIe,各取所长。
1.2.3 全互联架构
所有GPU之间都有直连通道。NVSwitch就是干这个的。DGX-2里16块V100通过NVSwitch全互联,任意两块之间都是600GB/s的带宽。
嗯,这里要注意:全互联虽然快,但贵。一块NVSwitch芯片就要好几万,不是谁都用得起的。
| 架构类型 | 通信方式 | 典型带宽 | 适用场景 |
|---|---|---|---|
| 独立GPU | PCIe | 32 GB/s | 小规模训练、推理 |
| 混合架构 | PCIe + NVLink | 600 GB/s | 中等规模训练 |
| 全互联 | NVSwitch | 2.4 TB/s | 大规模分布式训练 |
1.3 GPU拓扑与NVLink—— 谁跟谁挨着,很重要
你想想看,8块GPU插在主板上,它们之间怎么连接的?这就是GPU拓扑要解决的问题。
我遇到过最坑的一次:项目组买了台8卡服务器,结果发现GPU 0和GPU 7之间要走PCIe根桥绕一大圈,通信延迟高得离谱。后来一查,原来是拓扑没规划好。
1.3.1 常见的拓扑结构
- 环形拓扑:GPU首尾相连,形成环。优点是布线简单,缺点是远距离通信延迟高。
- 全互联拓扑:每对GPU都有直连。延迟最低,但成本最高。
- 混合拓扑:部分GPU直连,部分通过交换机。DGX系列就是这种。
1.3.2 NVLink—— 多GPU的"高速公路"
NVLink是NVIDIA搞出来的GPU间高速互联技术。我最早接触NVLink是在P100时代,那时候还是第一代,每链路20GB/s。现在NVLink 4.0已经到每链路100GB/s了。
NVLink的几个关键点:
- 点对点通信:GPU之间可以直接读写对方显存,不用经过CPU
- 高带宽:A100上12条NVLink链路,总带宽600GB/s
- 低延迟:微秒级的延迟,比PCIe快一个数量级
nvidia-smi topo -m 看看GPU拓扑。如果两块GPU之间有NVLink,尽量把通信密集的任务分配给它俩。
1.3.3 如何查看GPU拓扑?
我习惯用这个命令:
# 查看GPU拓扑矩阵
nvidia-smi topo -m
# 输出示例:
GPU0 GPU1 GPU2 GPU3
GPU0 X NV2 NV1 PHB
GPU1 NV2 X PHB NV1
GPU2 NV1 PHB X NV2
GPU3 PHB NV1 NV2 X
# NV = NVLink连接
# PHB = 通过PCIe根桥
# PXB = 通过PCIe交换机
看到NV就放心了,那是直连。看到PHB就要小心,通信延迟会高不少。
1.4 小结—— 多GPU不是简单堆卡
多GPU编程,说白了就是算力扩展和显存扩展的艺术。但光有硬件不行,你得懂拓扑、懂NVLink、懂怎么分配任务。
我个人建议:
- 先搞清楚你的GPU拓扑结构
- 把通信密集的任务放在有NVLink的GPU上
- 能用NVLink就别走PCIe
- 多GPU调试时,先用
cudaSetDevice()确认当前设备
下一章,我会带你实战多GPU编程的第一个例子——用4块GPU并行计算向量加法。到时候你会看到,拓扑优化前后,性能差距有多大。