第2章:环境搭建——NVIDIA驱动安装、CUDA Toolkit配置、cuDNN安装、Docker容器化环境准备
说实话,多卡通信这件事,很多人一上来就急着调代码、测带宽。但我见过太多人卡在环境上——驱动版本不对,CUDA和PyTorch不匹配,cuDNN少了个文件,折腾两天才发现是基础没打好。所以这一章,咱们老老实实把地基夯实。
我个人习惯是:先装驱动,再配CUDA Toolkit,然后装cuDNN,最后用Docker把环境固化下来。这套流程走一遍,后面30章你都会感谢现在的自己。
核心原则:版本匹配是第一要务。NVIDIA驱动、CUDA Toolkit、cuDNN、PyTorch/TensorFlow,这四个东西的版本必须对齐。少一个版本号不对,就可能跑不起来。
2.1 NVIDIA驱动安装
驱动是底层中的底层。没有它,GPU就是一块废铁。我遇到过有人用Ubuntu自带的nouveau开源驱动跑深度学习,结果显存死活认不全——嗯,那肯定不行。
第一步:检查当前显卡型号
lspci | grep -i nvidia
你会看到类似这样的输出:
01:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3080] (rev a1)
第二步:卸载旧驱动(如果有)
sudo apt-get purge nvidia*
第三步:添加NVIDIA官方源并安装
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-535
这里我推荐535版本,稳定且兼容性好。当然,你可以去NVIDIA官网查最新推荐版本。
小技巧:装完驱动后,用 nvidia-smi 验证。如果能看到GPU列表和驱动版本,说明驱动装好了。我曾经有一次装完驱动忘了重启,nvidia-smi报错——别犯这种低级错误。
2.2 CUDA Toolkit配置
驱动装好了,接下来是CUDA Toolkit。说白了,CUDA是NVIDIA给开发者用的并行计算平台。没有它,你没法在GPU上跑自定义的核函数。
版本选择:我个人建议用CUDA 11.8或12.1。这两个版本兼容性最广,PyTorch、TensorFlow都支持得很好。
安装步骤:
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
安装时注意:不要勾选Driver,因为我们已经装过了。只选CUDA Toolkit和CUDA Samples。
配置环境变量:
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
把这两行加到 ~/.bashrc 里,然后 source ~/.bashrc。
注意:如果你有多张GPU,且型号不同(比如A100和V100混插),CUDA版本必须兼容所有显卡的架构。我踩过这个坑——V100支持CUDA 11,但A100需要11.8以上。最后统一用12.1才搞定。
2.3 cuDNN安装
cuDNN是NVIDIA针对深度神经网络优化的库。它加速了卷积、池化、归一化等操作。没有它,训练速度会慢一个数量级。
下载:去NVIDIA官网注册账号,下载对应CUDA版本的cuDNN。我一般下载 cuDNN Library for Linux (x86_64) 那个tar包。
安装:
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*
验证:
cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
如果能看到版本号,说明装好了。
避坑指南:我曾经直接把cuDNN文件复制到系统目录,结果权限不对,程序运行时提示找不到libcudnn.so。记得用 chmod a+r 给所有用户读权限。
2.4 Docker容器化环境准备
环境搭好了,但问题来了——换一台机器怎么办?重装一遍?太麻烦了。Docker就是解决这个问题的。你把环境打包成镜像,到哪都能跑。
安装Docker:
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
安装NVIDIA Container Toolkit:
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 update
sudo apt install nvidia-container-toolkit
sudo systemctl restart docker
拉取官方镜像:
docker pull nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04
这个镜像包含了CUDA 11.8和cuDNN 8,开箱即用。
运行容器并挂载GPU:
docker run --gpus all -it --rm nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 nvidia-smi
如果能看到GPU信息,说明Docker环境配好了。
为什么用Docker?你想想看,多卡通信实验经常要换CUDA版本、换PyTorch版本。用Docker,你只需要切换镜像标签就行,不用重装系统。我团队里现在所有实验都在Docker里跑,省心多了。
2.5 知识体系总览
下面这张图帮你理清整个环境搭建的脉络:
2.6 验证环境是否可用
所有东西装完后,跑一个简单的PyTorch程序验证一下:
import torch
print(torch.cuda.is_available())
print(torch.cuda.device_count())
print(torch.cuda.get_device_name(0))
如果输出 True、4(假设你有4张卡)、NVIDIA A100,那恭喜你,环境搭好了。
最后一句:环境搭建是枯燥的,但也是最重要的。我见过太多人因为驱动版本不对,debug了三天才发现是CUDA和PyTorch不匹配。所以,别急,一步步来。后面咱们就开始真正的多卡通信实战了。
想要更多资料,联系可可