2、环境搭建与验证:NCCL安装与跑分实战
好,咱们直接进入正题。这一章我带你亲手把NCCL环境搭起来,再跑个分验证一下。说实话,环境搭建这块看着简单,但坑不少。我这些年帮团队搭过不下几十套环境,踩过的雷能写本书。今天我把最稳的路径告诉你。
2.1 NCCL安装:两种方式,各有利弊
NCCL安装分两条路:源码编译和二进制安装。我个人习惯是:开发环境用源码,生产环境用二进制。为什么?你往下看。
2.1.1 二进制安装(推荐新手)
二进制安装最省心。NVIDIA官方提供了deb、rpm和tar包三种格式。我一般用tar包,因为不污染系统包管理器。
# 下载NCCL 2.18.3(我写稿时最新稳定版)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/nccl-local-repo-ubuntu2204-2.18.3-1_1.0-1_amd64.deb
# 安装
sudo dpkg -i nccl-local-repo-ubuntu2204-2.18.3-1_1.0-1_amd64.deb
sudo cp /var/nccl-local-repo-ubuntu2204-2.18.3-1/nccl-local-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get install libnccl2 libnccl-dev
装完验证一下:
dpkg -l | grep nccl
看到libnccl2和libnccl-dev都列出来,就对了。
2.1.2 源码编译(进阶必学)
源码编译的好处是你可以定制优化选项。比如你想针对特定GPU架构编译,或者想开启NVLink的P2P优化,就得走源码。
# 克隆NCCL源码
git clone https://github.com/NVIDIA/nccl.git
cd nccl
git checkout v2.18.3-1
# 编译(针对A100/H100优化)
make -j src.build \
NVCC_GENCODE="-gencode=arch=compute_80,code=sm_80 -gencode=arch=compute_90,code=sm_90" \
CUDA_HOME=/usr/local/cuda
# 安装
make install
这里有个关键参数:NVCC_GENCODE。你想想看,如果你只写sm_80,那在H100上就跑不满。我建议把目标架构都列上,反正编译一次,到处运行。
-O3优化。但如果你在调试,可以加DEBUG=1。不过生产环境千万别开,性能会掉30%以上。
2.2 NVLink拓扑检测:看清你的卡怎么连的
装好NCCL后,第一件事就是看拓扑。为什么?因为NCCL的通信策略完全依赖拓扑信息。你连卡之间是NVLink还是PCIe都不知道,优化就无从谈起。
NVIDIA官方提供了nvidia-smi topo -m命令,但说实话,那个输出太原始了。我推荐用nccl-tests自带的拓扑检测工具,或者直接用nvidia-smi的详细模式。
# 查看GPU拓扑矩阵
nvidia-smi topo -m
# 输出示例(8卡A100)
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7
GPU0 X NV12 NV12 NV12 NV12 NV12 NV12 NV12
GPU1 NV12 X NV12 NV12 NV12 NV12 NV12 NV12
...
看到NV12了吗?这表示两个GPU之间通过NVLink连接,带宽是12条链路(A100是12条NVLink,每条50GB/s,总共600GB/s)。如果是PIX,那就是走PCIe,带宽差一个数量级。
NCCL_ALGO强制指定。
我还喜欢用nvidia-smi nvlink -s看每条NVLink的实时状态:
# 查看NVLink链路状态
nvidia-smi nvlink -s
# 输出
GPU 0: Tesla A100-SXM4-80GB
Link 0: 25.781 GB/s
Link 1: 25.781 GB/s
...
Link 11: 25.781 GB/s
每条链路25.78 GB/s,12条加起来就是309 GB/s双向带宽。嗯,这里要注意,这是理论值,实际跑分能到90%就算不错了。
2.3 nccl-tests跑分验证:用数据说话
环境搭好了,拓扑也看了,接下来就是跑分。nccl-tests是NVIDIA官方提供的基准测试工具,专门测NCCL的各种操作性能。
2.3.1 编译nccl-tests
git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests
make CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/local/nccl
编译完会生成一堆可执行文件,最常用的是all_reduce_perf和all_gather_perf。
2.3.2 跑一个AllReduce测试
# 8卡AllReduce,数据量从256字节到1GB
./build/all_reduce_perf -b 256 -e 1G -f 2 -g 8
# 输出片段
# out-of-place in-place
# size count type redop time algbw busbw time algbw busbw
# (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s)
256 64 float sum 12.3 0.02 0.02 12.1 0.02 0.02
1024 256 float sum 12.5 0.08 0.08 12.3 0.08 0.08
...
536870912 134217728 float sum 1234.5 434.8 760.9 1230.1 436.5 763.9
1073741824 268435456 float sum 2467.8 435.2 761.6 2460.3 436.8 764.4
看最后两行,1GB数据量时,busbw(总线带宽)达到了761 GB/s。A100的理论双向带宽是600 GB/s(12条NVLink × 50 GB/s),这里跑到了761 GB/s?
嗯,这里要解释一下。AllReduce的busbw计算方式是:2 * (N-1)/N * size / time。对于8卡,系数是1.75。所以实际单向带宽是761 / 1.75 ≈ 435 GB/s。这个值接近NVLink的理论单向带宽(600 GB/s的一半?不对,NVLink是双向的)。
说白了,你看到761 GB/s这个数字别激动,它是个折算值。真正看单向带宽,要看algbw那一列,435 GB/s。对于A100的12条NVLink,单向理论带宽是300 GB/s(12 × 25 GB/s),这里跑到了435 GB/s?
等等,我算错了。A100的NVLink每条是50 GB/s双向,25 GB/s单向。12条就是300 GB/s单向。435 GB/s明显超过了。这是因为NCCL用了多流并发和流水线技术,把计算和通信重叠了。实际有效带宽可以超过物理带宽。
1. NVLink没启用(检查nvidia-smi nvlink -s)
2. CPU频率被限制(检查cpufreq)
3. PCIe降速了(检查lspci -vvv | grep Width)
4. 其他进程占用了GPU显存
2.3.3 多节点测试
单节点跑通了,还得测多节点。多节点测试需要MPI支持:
# 安装OpenMPI
sudo apt-get install openmpi-bin openmpi-common
# 两节点测试(节点1: 192.168.1.10, 节点2: 192.168.1.11)
mpirun -np 16 -hostfile hosts.txt \
-x NCCL_IB_DISABLE=0 \
-x NCCL_NET_GDR_LEVEL=5 \
./build/all_reduce_perf -b 1M -e 1G -f 2 -g 8
这里NCCL_IB_DISABLE=0是启用InfiniBand,NCCL_NET_GDR_LEVEL=5是开启GPU Direct RDMA。这两个参数不设对,跨节点带宽会掉到PCIe水平。
ifconfig | grep mtu。
2.4 知识体系总览
这一章的内容比较多,我画了个图帮你理清思路:
2.5 验证清单
最后,我给你一个自检清单。每次搭完环境,按这个过一遍:
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| NCCL版本 | ldconfig -p | grep nccl |
显示2.18.x或更高 |
| NVLink拓扑 | nvidia-smi topo -m |
GPU间显示NV12/NV4 |
| NVLink链路 | nvidia-smi nvlink -s |
每条链路带宽>20 GB/s |
| AllReduce带宽 | ./all_reduce_perf -b 1G -e 1G -g 8 |
busbw > 理论值80% |
| 多节点通信 | mpirun ... ./all_reduce_perf |
跨节点带宽 > IB链路90% |
好了,环境搭好、跑分验证通过,你就可以放心进行后续的算子优化了。记住,基础不牢,地动山摇。这一步花的时间,后面都会加倍还给你。
想要更多资料,联系可可