4、GPU驱动与CUDA:NVIDIA驱动安装、CUDA Toolkit配置、cuDNN库安装与验证

说实话,搞深度学习训练,第一步不是写模型,而是把GPU环境搭好。我见过太多同学模型写好了,一跑就报错,最后发现是驱动没装对。今天咱们就把这块硬骨头啃下来。

核心逻辑:驱动 → CUDA Toolkit → cuDNN,这三层必须版本匹配,缺一不可。

4.1 整体架构:这三样东西到底啥关系?

先理清概念。你想想看,GPU驱动是操作系统和硬件之间的翻译官。CUDA Toolkit是NVIDIA提供的并行计算平台,它依赖驱动。cuDNN则是基于CUDA的深度学习加速库。

我用一个图来说明它们的关系:

GPU训练环境三层架构 深度学习框架(PyTorch / TensorFlow) 调用 cuDNN 加速卷积、池化等操作 cuDNN(深度学习加速库) 依赖 CUDA Toolkit 运行时 CUDA Toolkit(并行计算平台) 包含 nvcc 编译器、运行时库、工具 NVIDIA GPU 驱动 直接与硬件通信

嗯,这里要注意:驱动版本决定了你能装哪个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三层都验证通过,可以放心跑深度学习模型了。


专注资料整理