4、环境搭建:NCCL与NVSHMEM的安装、版本兼容性检查、CUDA环境配置
好,咱们进入实操环节。
说实话,环境搭建这块,我见过太多人卡在这里了。不是装不上,就是装上了跑不起来。你想想看,NCCL 和 NVSHMEM 都是跟 CUDA 深度绑定的东西,版本一不对,整个集群就罢工。我个人习惯是,动手之前先把版本兼容性理清楚,不然后面全是坑。
4.1 版本兼容性:先看这张表
为什么先讲兼容性?因为 NCCL 和 NVSHMEM 对 CUDA 版本有严格依赖。我曾经在一个项目里,直接把 NCCL 2.12 装到了 CUDA 11.0 上,结果编译倒是过了,一跑就段错误。查了两天才发现是 ABI 不兼容。
下面这张表是我自己整理的,你可以直接拿来用:
| NVSHMEM 版本 | 推荐 NCCL 版本 | 支持 CUDA 版本 | 备注 |
|---|---|---|---|
| 2.8.x | 2.15.x - 2.18.x | 11.8, 12.0, 12.1 | 稳定版,推荐生产使用 |
| 2.9.x | 2.19.x - 2.21.x | 12.2, 12.3 | 新增了 NVLink 优化 |
| 3.0.x | 2.22.x+ | 12.4+ | 实验性,我还没在生产用过 |
4.2 CUDA 环境配置:基础中的基础
嗯,这里要注意。CUDA 环境配置不只是装个驱动那么简单。
我建议你按这个顺序来:
- 确认驱动版本:运行
nvidia-smi,看右上角的 CUDA Version。这个版本必须 >= 你后面要装的 CUDA Toolkit 版本。 - 安装 CUDA Toolkit:去 NVIDIA 官网下载 runfile 或者 deb 包。我个人习惯用 runfile,因为可以指定安装路径,方便多版本共存。
- 设置环境变量:把下面这几行加到你的
~/.bashrc里:
export CUDA_HOME=/usr/local/cuda-12.2
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
然后 source ~/.bashrc,再跑 nvcc --version 确认一下。
/usr/local 下保留多个 CUDA 版本,比如 cuda-11.8、cuda-12.2,然后用软链接 cuda 指向当前要用的那个。切换版本只需要改一下软链接,不用改环境变量。
4.3 NCCL 安装:两种方式
NCCL 的安装其实不复杂。我一般用两种方式:
方式一:apt 安装(推荐)
如果你用的是 Ubuntu,直接加 NVIDIA 的 apt 源:
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /"
sudo apt update
sudo apt install libnccl2 libnccl-dev
这种方式最省心,依赖会自动处理。
方式二:源码编译(灵活)
如果你需要定制 NCCL 的编译选项,比如开启 NVLink 支持或者调整 ring 算法,那就得自己编译了:
git clone https://github.com/NVIDIA/nccl.git
cd nccl
make -j src.build CUDA_HOME=/usr/local/cuda-12.2
sudo make install
编译的时候注意看日志,我遇到过因为 GCC 版本太低导致编译失败的情况。建议用 GCC 9 以上。
4.4 NVSHMEM 安装:依赖检查是关键
NVSHMEM 的安装比 NCCL 稍微麻烦一点。它依赖 NCCL 和 CUDA,而且对 MPI 也有要求。
我的安装步骤:
- 先装好 NCCL(上面已经讲了)
- 安装 MPI:推荐 OpenMPI 4.x 或 MPICH 3.x。我习惯用 OpenMPI:
sudo apt install openmpi-bin openmpi-common libopenmpi-dev
- 下载 NVSHMEM 源码:从 GitHub 上 clone:
git clone https://github.com/NVIDIA/nvshmem.git
cd nvshmem
- 编译安装:
make -j CUDA_HOME=/usr/local/cuda-12.2 NCCL_HOME=/usr/local/nccl MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi
sudo make install
nccl.h,说明 NCCL_HOME 路径不对。你可以用 find / -name "nccl.h" 2>/dev/null 找到实际路径。
4.5 验证安装:跑个测试
装完了别急着用,先验证一下。我一般跑两个测试:
测试 NCCL:
# 进入 NCCL 的测试目录
cd /opt/nccl-tests
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 4
如果能看到带宽数据,说明 NCCL 工作正常。
测试 NVSHMEM:
# 进入 NVSHMEM 的测试目录
cd /opt/nvshmem/tests
mpirun -np 4 ./simple_put
输出里没有报错,就说明环境搭好了。
simple_put 一直卡住。后来排查发现是 MPI 版本不对——NVSHMEM 2.8 要求 OpenMPI 4.0.5 以上,而我装的是 4.0.3。升级 MPI 后问题解决。
4.6 知识体系总览
下面这张图,帮你把整个环境搭建的逻辑串起来:
说白了,整个流程就是:先打好地基(CUDA),再砌墙(NCCL 和 MPI),最后盖屋顶(NVSHMEM)。每一步都验证通过,才能保证后面跑分布式训练时不掉链子。
公众号:蓝海资料掘金营,微信deep3321