2、硬件环境准备:支持RDMA的网卡、GPU型号要求、NVLink与PCIe拓扑
好,咱们直接进入正题。上一章聊了GPU Direct RDMA的整体架构,这一章咱们把硬件底子铺好。说白了,你软件写得再漂亮,硬件不支持,一切都是白搭。
我个人习惯,在搭建任何高性能计算集群之前,先把硬件清单列清楚。尤其是RDMA和GPU的搭配,踩坑的代价太大了。我曾经在一个项目里,因为网卡和GPU的PCIe插槽没对齐,导致带宽直接腰斩,排查了整整两天。
2.1 支持RDMA的网卡:Mellanox与Intel怎么选?
目前市面上主流的RDMA网卡,基本就是Mellanox(现在叫NVIDIA Networking)和Intel两家的天下。你想想看,它们虽然都叫RDMA,但实现方式和生态各有千秋。
2.1.1 Mellanox ConnectX系列
这是目前AI训练集群的绝对主力。我个人最常用的是ConnectX-5和ConnectX-6系列。为什么?
- 生态成熟:NVIDIA自家的东西,和GPU的配合天衣无缝。你装个NVIDIA驱动,MLNX_OFED驱动包一装,基本就能跑起来。
- 带宽高:ConnectX-6单口200Gb/s,双口400Gb/s。嗯,这个速度,喂饱A100甚至H800都绰绰有余。
- 支持GPUDirect:这是核心。Mellanox网卡可以直接访问GPU显存,不需要经过CPU内存中转。
2.1.2 Intel Omni-Path与100G网卡
Intel这边,主要是Omni-Path架构和后来的100G Ethernet网卡。说实话,在AI领域,Intel的RDMA方案市场份额不如Mellanox,但也不是不能用。
- Omni-Path:这是Intel自家的高速互联技术,延迟低,但生态相对封闭。我记得有个客户用了Omni-Path,结果想换Mellanox的卡,发现驱动和交换机都不兼容,折腾了很久。
- Intel 100G网卡:比如XXV710系列,支持RoCE v2。如果你预算有限,或者公司已经有Intel的网络设备,可以考虑。
2.2 GPU型号要求:NVIDIA Tesla与Quadro
说到GPU,很多人以为只要是NVIDIA的卡就能用GPUDirect RDMA。其实不然。这里有个关键点:只有支持UVA(统一虚拟地址)的GPU才能直接参与RDMA通信。
2.2.1 Tesla系列:AI训练的主力军
Tesla系列,比如V100、A100、H100,是专门为数据中心设计的。它们都支持GPUDirect RDMA,而且性能最好。
- A100:目前最主流的训练卡。80GB显存,支持NVLink 3.0,带宽高达600GB/s。我现在的集群里,清一色的A100。
- H100:新一代旗舰,支持NVLink 4.0和第四代NVSwitch。如果你做千亿级大模型训练,H100是首选。
- V100:老将了,但依然能打。32GB显存,支持NVLink 2.0。预算有限的话,V100也能跑通GPUDirect RDMA。
2.2.2 Quadro系列:工作站也能玩
Quadro系列,比如RTX A6000,其实也支持GPUDirect RDMA。但要注意,Quadro的驱动和Tesla不同,有些功能被限制了。
我有个朋友,用Quadro RTX 8000搭了个小集群,跑分布式训练。结果发现GPUDirect RDMA的带宽只有Tesla的一半。查了半天,原来是Quadro的PCIe BAR(基地址寄存器)大小被限制了。所以,如果你真想玩RDMA,还是老老实实用Tesla。
2.3 NVLink与PCIe拓扑:决定性能的关键
硬件选好了,怎么连?这里面的门道可多了。你想想看,GPU和网卡之间怎么通信?数据走哪条路?这直接决定了你的训练速度。
2.3.1 NVLink:GPU之间的高速公路
NVLink是NVIDIA自家的高速互联技术。它让GPU之间可以直接通信,不需要经过PCIe总线。
- NVLink 2.0(V100):每对GPU 300GB/s,6条链路。
- NVLink 3.0(A100):每对GPU 600GB/s,12条链路。
- NVLink 4.0(H100):每对GPU 900GB/s,18条链路。
嗯,这个速度,比PCIe 4.0 x16的32GB/s快了一个数量级。所以,如果你的模型需要频繁的All-Reduce通信,NVLink是必须的。
2.3.2 PCIe拓扑:网卡插哪里?
这是最容易踩坑的地方。GPUDirect RDMA要求网卡和GPU在同一个PCIe Root Complex下,或者通过PCIe Switch相连。
我曾经在一个项目中,把网卡插在了CPU0的PCIe插槽,而GPU插在了CPU1的插槽。结果呢?数据要从GPU -> CPU1 -> QPI总线 -> CPU0 -> 网卡,延迟高得离谱。
正确的做法是:
- 查看拓扑:用
lspci -t或者nvidia-smi topo -m命令,看看GPU和网卡在哪个PCIe总线下。 - 尽量靠近:把网卡插在和GPU同一个CPU的PCIe插槽上。
- 避免跨Socket:如果必须跨Socket,确保有足够的QPI/UPI带宽。
# 查看GPU和网卡的PCIe拓扑
nvidia-smi topo -m
# 输出示例:
# GPU0 GPU1 GPU2 GPU3 mlx5_0
# GPU0 X NV2 NV2 NV2 PIX
# GPU1 NV2 X NV2 NV2 PIX
# GPU2 NV2 NV2 X NV2 PIX
# GPU3 NV2 NV2 NV2 X PIX
# mlx5_0 PIX PIX PIX PIX X
# 注意:PIX表示同一个PCIe Switch下,这是最佳情况。
# 如果是PHB(跨CPU),就要小心了。
2.3.3 实际拓扑示例
我给大家画个简单的拓扑图(文字版):
| 组件 | PCIe位置 | 说明 |
|---|---|---|
| GPU0 | CPU0, Bus 0x01 | 通过NVLink连接GPU1 |
| GPU1 | CPU0, Bus 0x02 | 通过NVLink连接GPU0 |
| Mellanox网卡 | CPU0, Bus 0x03 | 和GPU在同一CPU下,PIX连接 |
| GPU2 | CPU1, Bus 0x81 | 跨CPU,通过QPI连接 |
你看,GPU0和GPU1在同一CPU下,网卡也在同一CPU下,它们之间的通信走PCIe Switch,延迟很低。而GPU2在另一个CPU下,通信就要走QPI总线,延迟会高一些。
2.4 硬件检查清单
最后,我给大家列个检查清单,照着做,基本不会出大问题:
- 网卡:Mellanox ConnectX-5/6,或者Intel XXV710,确保支持RoCE v2或InfiniBand。
- GPU:NVIDIA Tesla V100/A100/H100,确保驱动版本≥418.xx(支持GPUDirect)。
- NVLink:检查GPU之间是否有NVLink连接,用
nvidia-smi nvlink -s查看。 - PCIe拓扑:用
nvidia-smi topo -m确认网卡和GPU在同一PCIe Switch下。 - 驱动:安装MLNX_OFED驱动,并确保
ibv_devinfo能看到网卡支持GPUDirect。
嗯,硬件环境准备就这些。下一章,咱们开始动手配置软件环境,把驱动和库装好。到时候,我会分享一些我踩过的坑,保证让你少走弯路。