第2章:单机多卡环境搭建:NVIDIA驱动、CUDA Toolkit、cuDNN的安装与版本匹配
好,咱们直接进入正题。
单机多卡环境搭建,说白了就是给你的机器装上「显卡驱动 + CUDA + cuDNN」这三件套。这三样东西,就像电脑的电源、主板和CPU——缺一不可,而且版本必须匹配。我见过太多同学在这上面栽跟头,装了半天跑不起来,最后发现是驱动版本不对。
2.1 先搞清楚你的硬件
动手之前,先看看你手头有什么卡。
- NVIDIA GPU 型号:用
nvidia-smi查看(如果已经装了驱动)。没装驱动?那就看显卡上的标签,或者查系统设备管理器。 - 操作系统:Ubuntu 20.04/22.04 最省心。Windows 也能用,但坑更多。
- CUDA 计算能力:每个 GPU 都有个「计算能力」编号,比如 8.0、7.5。这个数字决定了你能装哪个版本的 CUDA Toolkit。
核心原则:驱动版本 ≥ CUDA Toolkit 版本 ≥ cuDNN 版本。向下兼容,但不向上兼容。
2.2 NVIDIA 驱动安装
我个人习惯用 runfile 方式安装驱动,干净利落。但新手我建议用包管理器,省心。
2.2.1 查看当前驱动
nvidia-smi
如果提示命令找不到,说明没装驱动。如果显示了 GPU 信息,恭喜你,省了一步。
2.2.2 安装驱动(Ubuntu 为例)
# 先卸载旧驱动(如果有)
sudo apt-get purge nvidia-*
# 添加 NVIDIA 官方驱动源
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
# 查看推荐版本
ubuntu-drivers devices
# 安装推荐版本
sudo apt-get install nvidia-driver-535
# 重启
sudo reboot
我的经验:别装最新版驱动。我踩过坑,535 版本在 RTX 4090 上跑 PyTorch 有内存泄漏。建议用 525 或 530 这种「次新」版本,稳定。
2.2.3 验证驱动
nvidia-smi
看到类似下面的输出,就对了:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.05 Driver Version: 535.86.05 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 Off | 00000000:01:00.0 On | Off |
| 0% 35C P8 8W / 450W | 0MiB / 24564MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
2.3 CUDA Toolkit 安装
驱动装好了,接下来装 CUDA Toolkit。注意:nvidia-smi 显示的 CUDA Version 是驱动支持的最高版本,不是实际安装的版本。
2.3.1 选择版本
我建议用 CUDA 11.8 或 12.1。为什么?PyTorch 官方对这两个版本支持最好。你想想看,如果装了个 CUDA 12.5,结果 PyTorch 还没适配,那不是白忙活?
2.3.2 安装步骤
# 下载 runfile(以 CUDA 12.1 为例)
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(驱动已经装好了)
# - 勾选 Toolkit、Samples、Documentation
警告:安装时千万别选「Install NVIDIA Driver」!否则会覆盖你之前装的驱动,版本可能不匹配。我曾经手滑选了一次,结果系统直接黑屏,折腾了一下午才恢复。
2.3.3 配置环境变量
# 编辑 ~/.bashrc
echo 'export PATH=/usr/local/cuda-12.1/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
2.3.4 验证
nvcc --version
输出应该类似:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Feb__7_19:32:13_PST_2023
Cuda compilation tools, release 12.1, V12.1.66
2.4 cuDNN 安装
cuDNN 是 NVIDIA 的深度学习加速库。说白了,就是让卷积、池化这些操作跑得更快。
2.4.1 下载 cuDNN
需要注册 NVIDIA 开发者账号才能下载。我一般用 tar 包安装,不用 deb 包——deb 包容易和系统库冲突。
# 下载 cuDNN 8.9.5 for CUDA 12.x
# 假设下载到了 ~/Downloads 目录
# 解压
tar -xzvf cudnn-linux-x86_64-8.9.5.30_cuda12-archive.tar.xz
# 复制到 CUDA 目录
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.1/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.1/lib64/
# 设置权限
sudo chmod a+r /usr/local/cuda-12.1/include/cudnn*.h
sudo chmod a+r /usr/local/cuda-12.1/lib64/libcudnn*
2.4.2 验证 cuDNN
# 查看 cuDNN 版本
cat /usr/local/cuda-12.1/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
2.5 版本匹配速查表
这是我整理的一份常用版本匹配表,直接照着来就行:
| GPU 型号 | 推荐驱动版本 | 推荐 CUDA 版本 | 推荐 cuDNN 版本 |
|---|---|---|---|
| RTX 3090 / 4090 | 525.147.05 | 12.1 | 8.9.5 |
| RTX 3080 / 4080 | 525.147.05 | 12.1 | 8.9.5 |
| RTX 2080 Ti / 3070 | 470.223.02 | 11.8 | 8.6.0 |
| V100 / A100 | 525.147.05 | 12.1 | 8.9.5 |
| T4 / P100 | 470.223.02 | 11.8 | 8.6.0 |
2.6 验证多卡环境
装完三件套,跑个简单的测试看看多卡是否正常:
# 查看 GPU 数量和状态
nvidia-smi
# 用 Python 验证 CUDA 可用性
python3 -c "import torch; print(torch.cuda.device_count()); print(torch.cuda.is_available())"
如果输出 True 和 GPU 数量(比如 4),说明环境搭建成功。
避坑指南:我曾经遇到一个问题——torch.cuda.device_count() 返回 0,但 nvidia-smi 能看到 4 张卡。后来发现是 PyTorch 版本太老,不支持新驱动。升级 PyTorch 到 2.0+ 就解决了。
2.7 知识体系图
下面这张图帮你理清整个安装流程和依赖关系:
2.8 常见问题排查
- nvidia-smi 报错:驱动没装好,或者内核模块没加载。试试
sudo modprobe nvidia。 - nvcc 找不到:环境变量没配好。检查
~/.bashrc里的 PATH 设置。 - cuDNN 版本不匹配:运行深度学习模型时报
libcudnn.so.8: cannot open shared object file。重新复制 cuDNN 库文件到正确的 CUDA 目录。 - 多卡训练时某张卡不工作:检查 PCIe 连接,或者用
nvidia-smi topo -m查看拓扑结构。
我的习惯:每次装完环境,我都会写一个简单的测试脚本,跑一遍 torch.cuda.is_available() 和一个小模型训练。确保所有卡都能正常工作,再开始正式干活。这一步能省下后面排查问题的无数时间。
好了,环境搭好了,接下来就可以开始真正的多卡训练了。记住:版本匹配是基础,验证测试是关键。别急着跑大模型,先把基础打牢。