2、测试环境搭建:硬件选型与软件栈安装验证
做带宽测试,第一步就是把环境搭起来。这一步要是没弄好,后面测出来的数据全是废的。我见过不少团队,硬件买回来就急着跑测试,结果发现网卡驱动不对,或者NCCL版本跟CUDA不匹配,折腾好几天。
说白了,环境搭建就是打好地基。地基不稳,楼盖得再高也得塌。
2.1 硬件选型:GPU与网卡怎么配
先聊GPU。目前做高性能AI训练,NVIDIA的A100和H100是主流。我个人习惯,如果预算充足,直接上H100。为什么?H100的NVLink带宽是900GB/s,比A100的600GB/s高了50%。你想想看,多卡通信时,这个差距就是实打实的训练速度差异。
但如果你手头是A100,也别灰心。A100在FP16和TF32下的表现依然能打。我在项目中遇到过用A100 80GB跑千亿参数模型的情况,只要网络拓扑设计合理,照样能跑出不错的吞吐量。
网卡这块,Mellanox是绕不开的选择。CX6、CX7系列我都用过。CX7单口400Gb/s,双口就是800Gb/s。嗯,这里要注意:网卡选型不光看速率,还要看PCIe通道数。CX7需要PCIe 5.0 x16才能跑满带宽。如果你服务器只支持PCIe 4.0,那CX6其实就够了,别花冤枉钱。
硬件选型速查表
| 组件 | 推荐型号 | 关键参数 | 适用场景 |
|---|---|---|---|
| GPU | NVIDIA H100 | NVLink 900GB/s, HBM3 | 千亿参数大模型训练 |
| GPU | NVIDIA A100 | NVLink 600GB/s, HBM2e | 百亿参数模型,性价比之选 |
| 网卡 | Mellanox CX7 | 400Gb/s, PCIe 5.0 x16 | H100集群,追求极致带宽 |
| 网卡 | Mellanox CX6 | 200Gb/s, PCIe 4.0 x16 | A100集群,成熟稳定 |
2.2 软件栈安装:NCCL、OFED、CUDA Toolkit
硬件到位了,接下来就是装软件。这三样东西缺一不可:CUDA Toolkit、OFED、NCCL。顺序也有讲究,我建议先装CUDA,再装OFED,最后装NCCL。
2.2.1 CUDA Toolkit安装
CUDA Toolkit是GPU计算的基石。去NVIDIA官网下载对应版本就行。我个人习惯用runfile安装,因为可以指定安装路径,方便多版本共存。
# 下载CUDA 12.1
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
# 执行安装,建议选择自定义安装,只安装Toolkit
sudo sh cuda_12.1.0_530.30.02_linux.run
# 设置环境变量
export PATH=/usr/local/cuda-12.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH
小技巧:安装完成后,用 nvcc --version 验证。如果显示版本号,说明CUDA装好了。我曾经遇到过装完没加环境变量,结果nvcc找不到,折腾了半小时才发现是PATH没配。
2.2.2 OFED驱动安装
OFED是Mellanox网卡的驱动栈。说白了,没有它,网卡就是块废铁。OFED包含了驱动、固件工具、性能测试工具(比如ib_write_bw)。
# 下载OFED 5.9
wget https://content.mellanox.com/ofed/MLNX_OFED-5.9-0.5.6.0/MLNX_OFED_LINUX-5.9-0.5.6.0-ubuntu22.04-x86_64.tgz
# 解压并安装
tar xzf MLNX_OFED_LINUX-5.9-0.5.6.0-ubuntu22.04-x86_64.tgz
cd MLNX_OFED_LINUX-5.9-0.5.6.0-ubuntu22.04-x86_64
sudo ./mlnxofedinstall --all
# 重启驱动
sudo /etc/init.d/openibd restart
注意:OFED版本必须与内核版本匹配。我遇到过最坑的一次,是内核升级后OFED驱动加载失败,网卡直接down了。建议安装前先查一下内核版本:uname -r,然后去Mellanox官网确认兼容性。
2.2.3 NCCL安装
NCCL是NVIDIA的集合通信库。多卡通信全靠它。NCCL有几种安装方式:源码编译、pip安装、或者用NVIDIA的容器镜像。我个人推荐用源码编译,因为可以针对你的硬件做优化。
# 下载NCCL源码
git clone https://github.com/NVIDIA/nccl.git
cd nccl
# 编译安装
make -j src.build
sudo make install
# 验证安装
ldconfig -p | grep nccl
验证NCCL是否正常工作:
# 运行NCCL的allreduce测试
/usr/local/bin/allreduce_perf -b 8 -e 128M -f 2 -g 8
# 输出示例
# 8 bytes: 0.12 GB/s
# 16 bytes: 0.23 GB/s
# ...
# 128M bytes: 85.6 GB/s
如果能看到带宽数据,说明NCCL安装成功。注意看最后的大消息带宽,应该接近硬件理论值。
2.3 环境验证:确保一切就绪
装完软件,别急着跑测试。先做一轮验证,确保每个组件都正常工作。
- GPU验证:运行
nvidia-smi,确认所有GPU都能识别,驱动版本正确。 - 网卡验证:运行
ibstat,查看网卡状态。如果显示"Active",说明网卡正常。 - 网络连通性:用
ib_write_bw测试两台机器间的点对点带宽。
# 在服务器A上启动服务端
ib_write_bw -d mlx5_0 --report_gbits
# 在服务器B上启动客户端
ib_write_bw -d mlx5_0 --report_gbits 192.168.1.1
如果看到带宽接近网卡标称值,比如CX6的200Gb/s,那说明网络环境没问题。我曾经遇到过交换机配置错误,导致带宽只有标称值的30%,排查了两天才发现是流控没开。
避坑指南:我曾经在验证环境时,发现NCCL测试带宽只有理论值的一半。排查后发现是PCIe链路宽度不对,GPU插在了x8的插槽上。所以,装完环境后,一定要用 nvidia-smi topo -m 检查GPU的拓扑结构,确保每个GPU都跑在x16上。
2.4 知识体系总览
下面这张图,把整个环境搭建的流程串起来了。你可以把它当作一张检查清单,每做完一步就打个勾。
环境搭建这块,说白了就是细心。每个组件都验证通过,后面跑测试才能顺风顺水。我见过太多人跳过验证环节,结果测试数据异常,回头再排查环境问题,白白浪费几天时间。
好了,环境搭好了,下一步就可以开始跑带宽测试了。记住,好的开始是成功的一半。