环境准备:GPU驱动安装、CUDA Toolkit安装、NVIDIA容器工具包安装
说实话,很多人一上来就急着跑NCCL的demo,结果卡在环境配置上。我见过太多人花了两天装驱动,最后发现是内核版本不匹配。嗯,这一章咱们就把这些坑提前填上。
环境准备说白了就三件事:GPU驱动、CUDA Toolkit、NVIDIA容器工具包。顺序不能乱,版本不能错。我个人的习惯是,先确定好CUDA版本,再反推驱动版本,这样最稳。
1. GPU驱动安装
驱动是基础中的基础。没有驱动,GPU就是一块废铁。你想想看,NCCL要跑在GPU上,驱动都不对,后面全是白搭。
1.1 确认GPU型号
先看看你手上是什么卡。我建议用这个命令:
lspci | grep -i nvidia
或者更直观的:
nvidia-smi # 如果已经装了驱动
如果是新机器,大概率是看不到nvidia-smi的。没关系,用lspci就行。我遇到过有人拿了个T4卡,结果装成了A100的驱动,虽然也能跑,但性能不对劲。后来查了半天才发现是驱动版本不匹配。
1.2 选择驱动版本
驱动版本怎么选?记住一个原则:不要追新,要追稳。
NVIDIA官方有个兼容性表格,我直接给你总结一下:
| CUDA版本 | 最低驱动版本 | 推荐驱动版本 |
|---|---|---|
| CUDA 11.8 | 520.61.05 | 535.xxx |
| CUDA 12.1 | 530.30.02 | 545.xxx |
| CUDA 12.4 | 550.54.14 | 550.xxx |
我个人习惯用535或550系列,这两个版本在NCCL场景下表现很稳定。我曾经踩过一个坑:用了太新的驱动,结果和NCCL的IB通信库冲突,导致多机训练一直报错。后来回退了一个大版本就好了。
1.3 安装驱动
安装方式有两种:
- runfile安装:最干净,但需要手动处理
- 包管理器安装:方便,但可能被系统源污染
我推荐用runfile。为什么呢?因为包管理器有时候会给你装个阉割版,或者依赖冲突。runfile虽然麻烦点,但心里踏实。
# 先卸载旧驱动(如果有)
sudo apt-get purge nvidia-*
sudo apt-get autoremove
# 禁用nouveau
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nvidia-nouveau.conf
sudo update-initramfs -u
# 重启
# 安装驱动
chmod +x NVIDIA-Linux-x86_64-550.54.14.run
sudo ./NVIDIA-Linux-x86_64-550.54.14.run
装完后重启,跑一下nvidia-smi,看到GPU列表就说明驱动装好了。
2. CUDA Toolkit安装
驱动装好了,接下来是CUDA Toolkit。很多人分不清驱动和Toolkit的区别。简单说:驱动让系统认识GPU,Toolkit让程序能用GPU算。
2.1 版本选择
选CUDA版本时,要看你的NCCL版本要求。比如NCCL 2.18要求CUDA 11.8以上。我建议直接用CUDA 12.1或12.4,这两个版本对NCCL的支持最完善。
你可能会问:能不能装多个CUDA版本?当然可以。我自己的机器上就同时装了11.8和12.1,通过update-alternatives切换。但如果你刚开始,我建议只装一个,省心。
2.2 安装步骤
还是推荐runfile安装。deb包虽然方便,但有时候会覆盖系统库,引发奇怪的问题。
# 下载CUDA 12.1 runfile
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run
# 安装
sudo sh cuda_12.1.0_530.30.02_linux.run
安装时注意:不要勾选Driver,因为我们已经装过了。只选CUDA Toolkit和CUDA Samples就行。
export PATH=/usr/local/cuda-12.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH
然后source ~/.bashrc生效。
2.3 验证安装
nvcc --version
# 应该看到:Cuda compilation tools, release 12.1, V12.1.0
再跑一个简单的测试:
cd /usr/local/cuda-12.1/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
看到Result = PASS就说明CUDA Toolkit装好了。
3. NVIDIA容器工具包安装
为什么要装这个?说白了,就是为了在Docker里用GPU。你想想看,分布式训练通常要跑在容器里,没有容器工具包,Docker根本看不到GPU。
3.1 安装nvidia-docker2
现在主流的方式是装nvidia-container-toolkit。我建议用这个:
# 添加NVIDIA容器仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
# 安装
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# 重启Docker
sudo systemctl restart docker
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
3.2 验证容器工具包
# 跑一个测试容器
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
如果能看到GPU信息,就说明容器工具包安装成功了。我曾经遇到过一个问题:容器里能识别GPU,但跑NCCL时一直报错。后来发现是容器里没有安装NCCL库。嗯,这个坑后面会细讲。
4. 整体验证
三样东西都装好了,我们来个综合测试:
# 1. 检查驱动
nvidia-smi
# 2. 检查CUDA
nvcc --version
# 3. 检查容器工具包
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
全部通过的话,恭喜你,环境准备就完成了。说实话,这一步虽然枯燥,但真的值得花时间做好。我见过太多人因为驱动版本不对,调试NCCL时浪费了好几天。
- 驱动版本要匹配CUDA版本,不要追新
- CUDA Toolkit用runfile安装,避免污染系统库
- 容器工具包是分布式训练的必备组件
好了,环境准备好了,下一章咱们就开始真正接触NCCL了。到时候我会带你写第一个NCCL程序,感受一下多卡通信的魅力。
想要更多资料,联系可可