4、GPU驱动与CUDA:NVIDIA驱动安装、CUDA Toolkit配置、cuDNN库安装与验证
说实话,搞深度学习训练,第一步不是写模型,而是把GPU环境搭好。我见过太多同学模型写好了,一跑就报错,最后发现是驱动没装对。今天咱们就把这块硬骨头啃下来。
核心逻辑:驱动 → CUDA Toolkit → cuDNN,这三层必须版本匹配,缺一不可。
4.1 整体架构:这三样东西到底啥关系?
先理清概念。你想想看,GPU驱动是操作系统和硬件之间的翻译官。CUDA Toolkit是NVIDIA提供的并行计算平台,它依赖驱动。cuDNN则是基于CUDA的深度学习加速库。
我用一个图来说明它们的关系:
嗯,这里要注意:驱动版本决定了你能装哪个CUDA版本。CUDA版本又决定了cuDNN的兼容性。我建议你先查好显卡型号,再去NVIDIA官网看驱动支持列表。
4.2 NVIDIA驱动安装
我个人习惯用Ubuntu系统做训练环境。Windows用户也别急,流程大同小异。
4.2.1 检查当前显卡和驱动
先看看你的机器上有没有NVIDIA显卡:
lspci | grep -i nvidia
如果有输出,说明显卡硬件是好的。然后检查驱动:
nvidia-smi
如果这个命令报错,说明驱动没装或者没加载。我在项目中遇到过一台服务器,nvidia-smi死活跑不起来,最后发现是Secure Boot没关,驱动签名验证失败。
避坑指南:我曾经因为BIOS里开启了Secure Boot,导致驱动装完但加载不了。如果你也遇到类似情况,进BIOS关掉Secure Boot,或者给驱动签名。
4.2.2 安装驱动(推荐方式)
我推荐用Ubuntu的官方驱动仓库安装,省心:
# 添加显卡驱动PPA
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
# 查看推荐驱动版本
ubuntu-drivers devices
# 自动安装推荐驱动
sudo ubuntu-drivers autoinstall
# 或者手动指定版本(比如535)
sudo apt install nvidia-driver-535
装完重启:
sudo reboot
重启后再跑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 A100 Off | 00000000:00:04.0 Off | 0 |
| 0% 45C P0 45W / 250W | 0MiB / 40960MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
看到Driver Version和CUDA Version就说明驱动装好了。注意这里的CUDA Version是驱动支持的最高CUDA版本,不是你已经装了CUDA Toolkit。
4.3 CUDA Toolkit配置
驱动装好了,接下来装CUDA Toolkit。说白了,驱动是让系统认识显卡,CUDA Toolkit是让你能写程序调用显卡算力。
4.3.1 选择版本
先确认你的深度学习框架需要什么CUDA版本。比如PyTorch 2.0以上通常需要CUDA 11.7或11.8。我个人习惯用11.8,比较稳定。
| PyTorch版本 | 推荐CUDA版本 | cuDNN版本 |
|---|---|---|
| 1.13.x | 11.6 / 11.7 | 8.4.x |
| 2.0.x | 11.7 / 11.8 | 8.5.x / 8.6.x |
| 2.1.x | 11.8 / 12.1 | 8.7.x / 8.8.x |
4.3.2 安装CUDA Toolkit
去NVIDIA官网下载runfile安装包。我习惯用runfile,因为它不污染系统包管理器:
# 下载CUDA 11.8(举例)
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
- 安装路径默认在 /usr/local/cuda-11.8
装完后配置环境变量:
# 编辑 ~/.bashrc
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
验证安装:
nvcc --version
应该能看到CUDA版本信息。
小技巧:我习惯在 /usr/local/ 下创建一个软链接,指向当前使用的CUDA版本。这样切换版本时只需要改软链接,不用改环境变量。
sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda
4.4 cuDNN库安装与验证
cuDNN是NVIDIA专门为深度学习优化的库。说白了,没有它,你的卷积运算会慢好几倍。
4.4.1 下载cuDNN
去NVIDIA官网下载cuDNN,需要注册账号。选择对应CUDA 11.8的cuDNN 8.6.0版本。
下载后解压:
# 解压
tar -xzvf cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz
# 复制文件到CUDA目录
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
sudo chmod a+r /usr/local/cuda-11.8/lib64/libcudnn*
4.4.2 验证cuDNN
验证cuDNN版本:
cat /usr/local/cuda-11.8/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
输出应该类似:
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 0
再跑一个简单的测试程序:
# 复制测试样例
cp -r /usr/local/cuda-11.8/extras/demo_suite/ ~/cuda_demo
cd ~/cuda_demo
# 编译并运行
make
./deviceQuery
如果看到最后一行显示 Result = PASS,说明CUDA环境没问题。
再测cuDNN:
./bandwidthTest
这个测试会显示GPU的内存带宽,如果数值正常,说明cuDNN也装好了。
完整验证脚本:我写了一个小脚本,一键验证所有组件:
#!/bin/bash
echo "=== 检查驱动 ==="
nvidia-smi | head -3
echo "=== 检查CUDA ==="
nvcc --version
echo "=== 检查cuDNN ==="
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
echo "=== 运行测试 ==="
/usr/local/cuda/extras/demo_suite/deviceQuery | grep "Result = PASS"
4.5 常见问题与排查
我整理了几个我踩过的坑:
- nvidia-smi报错"Failed to initialize NVML":驱动没加载,重启试试。还不行就重装驱动。
- nvcc命令找不到:环境变量没配好,检查PATH里有没有cuda/bin。
- 编译时提示找不到cudnn.h:cuDNN没复制到include目录,或者路径不对。
- 运行时提示libcudnn.so.8找不到:LD_LIBRARY_PATH没包含cuda/lib64。
重要提醒:我曾经在升级驱动后,发现之前编译好的程序全挂了。原因是驱动版本变了,CUDA运行时库不兼容。所以生产环境尽量别频繁升级驱动,除非你准备好重新编译所有依赖。
好了,到这步你的GPU训练环境就搭好了。驱动、CUDA Toolkit、cuDNN三层都验证通过,可以放心跑深度学习模型了。