2. 硬件基础
做多卡通信驱动,第一关就是搞懂硬件长什么样。
说白了,你写的驱动代码,最终要跑在PCIe、NVLink或者InfiniBand这些物理链路上。不懂它们的脾气,性能调优就是瞎蒙。我这些年踩过的坑,十有八九都跟没吃透硬件拓扑有关。
PCIe总线拓扑与带宽
PCIe,全称是Peripheral Component Interconnect Express。几乎所有GPU、网卡、NVMe硬盘,都挂在这条总线上。
拓扑结构:典型的PCIe拓扑是树形结构。CPU内部集成Root Complex,下面挂Switch,Switch再分出多个Endpoint。GPU和网卡就是Endpoint。
我个人习惯,拿到一台服务器,第一件事就是跑lspci -t看拓扑树。为什么?因为跨Switch通信和同Switch通信,延迟差一大截。
关键点:PCIe是点对点串行总线。每个通道(Lane)是一对差分信号,收发独立。
带宽计算:PCIe版本不同,单通道速率也不同。
| PCIe版本 | 单通道速率(GT/s) | 编码方式 | 有效带宽(x16) |
|---|---|---|---|
| PCIe 3.0 | 8 | 128b/130b | 约15.75 GB/s |
| PCIe 4.0 | 16 | 128b/130b | 约31.5 GB/s |
| PCIe 5.0 | 32 | 128b/130b | 约63 GB/s |
注意,GT/s是每秒传输的Giga Transfers,不是Giga Bits。因为编码开销,实际有效带宽要打个折扣。PCIe 3.0用128b/130b编码,效率约98.5%。
我的经验:我曾经调试一个4卡互联的项目,发现GPU间通信带宽只有理论值的一半。查了半天,原来是PCIe链路协商到了x8而不是x16。用lspci -vvv一看,有个金手指接触不良。嗯,硬件问题往往最隐蔽。
NVLink/NVSwitch互联架构
PCIe带宽再高,也扛不住多GPU之间的AllReduce流量。NVIDIA搞了NVLink,专门给GPU之间高速互联。
NVLink:直接连接GPU到GPU,不走PCIe。每路NVLink带宽约50 GB/s(双向100 GB/s)。A100有12路NVLink,总带宽600 GB/s。H100更猛,18路,900 GB/s。
NVSwitch:当GPU数量超过4个,全互联拓扑就不现实了。NVSwitch登场,它是一个交换芯片,所有GPU通过NVLink连到Switch上,形成全互联。
你想想看,8卡A100通过NVSwitch互联,任意两张卡之间都是600 GB/s带宽,延迟极低。这比走PCIe Switch快了一个数量级。
避坑指南:我曾经在DGX A100上跑分布式训练,发现通信效率上不去。后来发现,NVLink拓扑是分组的。8张卡分成两组,每组4张卡内部全互联,组间通过NVSwitch桥接。如果你的通信模式是跨组AllReduce,带宽会受限。所以,nvidia-smi topo -m一定要看。
拓扑示例:
# nvidia-smi topo -m 输出示例
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7
GPU0 X NV1 NV1 NV2 NV2 SYS SYS SYS
GPU1 NV1 X NV1 NV2 NV2 SYS SYS SYS
GPU2 NV1 NV1 X NV2 NV2 SYS SYS SYS
GPU3 NV2 NV2 NV2 X NV1 SYS SYS SYS
GPU4 NV2 NV2 NV2 NV1 X SYS SYS SYS
GPU5 SYS SYS SYS SYS SYS X NV1 NV1
GPU6 SYS SYS SYS SYS SYS NV1 X NV1
GPU7 SYS SYS SYS SYS SYS NV1 NV1 X
NV1表示直接NVLink连接,NV2表示通过NVSwitch连接,SYS表示走PCIe。你看,GPU0到GPU4是NV2,带宽没问题。但GPU0到GPU5是SYS,那就惨了,只能走PCIe。
InfiniBand与RoCEv2网络对比
多机互联,目前两大主流:InfiniBand和RoCEv2。
InfiniBand:专用网络,端到端设计。HCA(Host Channel Adapter)直接插在PCIe上,通信走RDMA,不经过CPU。延迟极低,1-2微秒。带宽也高,HDR 200Gbps,NDR 400Gbps。
RoCEv2:基于以太网的RDMA。把RDMA报文封装在UDP里,走标准以太网。好处是便宜,用普通交换机就行。但延迟比IB高一些,大概3-5微秒。
| 特性 | InfiniBand | RoCEv2 |
|---|---|---|
| 延迟 | 1-2 us | 3-5 us |
| 带宽 | 200-400 Gbps | 100-200 Gbps |
| 成本 | 高 | 中 |
| 拥塞控制 | 硬件级,优秀 | 依赖DCQCN,较复杂 |
| 生态 | NVIDIA独家 | 开放,多厂商 |
我的建议:如果预算充足,上InfiniBand。性能稳定,调优省心。如果预算有限,RoCEv2也能用,但要做好拥塞控制。我曾经在一个RoCEv2集群上,因为PFC死锁导致全网瘫痪。嗯,那滋味不好受。
核心区别:InfiniBand是Lossless网络,RoCEv2也是Lossless,但依赖PFC(优先级流控制)。PFC配置不当,容易引发死锁。IB的Credit-based流控,天生不会死锁。
知识体系总览
下面这张图,是我自己总结的多卡通信硬件知识体系。你看一眼,心里就有谱了。
这张图把机内互联和机间互联分开。左边是PCIe和NVLink,右边是InfiniBand和RoCEv2。底下是三个核心关注点:带宽、延迟、拓扑感知。你调优的时候,就盯着这三个指标。
个人习惯:我每次接手一个新集群,都会先画一张这样的拓扑图。然后对照着跑ib_write_bw或者nvidia-smi topo -m,验证实际带宽。纸上得来终觉浅,绝知此事要躬行。