环境准备: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
注意:安装过程中会提示是否安装32位兼容库,如果你只做深度学习,选No就行。另外,X server配置那块,如果是在服务器上,直接选"不配置"。

装完后重启,跑一下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就行。

小技巧:安装完成后,把CUDA路径加到.bashrc里:
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
注意:如果你用的是Docker Engine 19.03以上版本,还需要配置runtime:
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程序,感受一下多卡通信的魅力。


想要更多资料,联系可可