1. 环境准备与版本选型:别急着敲命令,先把账算清楚
装 CUDA 这件事,十个人里有八个是栽在“版本对不上”这五个字上。我见过太多人,显卡插上去,驱动随便找个最新版一装,CUDA Toolkit 也挑最新的下载,结果跑起 PyTorch 或者 TensorFlow 直接报CUDA error: no kernel image is available for execution on the device,然后开始怀疑人生。问题不在你手笨,在于 NVIDIA 这套东西的版本依赖链是驱动版本 → CUDA Runtime 版本 → 框架编译版本三层锁死的,任何一层错位都会炸。
先把最核心的对应关系讲透。N 卡驱动(Driver)是操作系统层面的,它决定了你这台机器最高能支持到哪个 CUDA 版本。注意是“最高”,不是“必须”。比如驱动版本 550.144.03,它支持 CUDA 12.4 及以下的所有版本。你装 CUDA 11.8 完全没问题,装 CUDA 12.4 也行,但你想装 CUDA 12.5 就得先升驱动。这个“向下兼容”的特性是很多人没搞明白的,以为驱动和 CUDA 必须一一对应,其实不是。
那怎么查驱动支持的最高 CUDA 版本?最直接的办法是看nvidia-smi右上角那行CUDA Version: 12.4。这里有个坑要提前说:nvidia-smi显示的 CUDA Version 是驱动支持的最高版本,不是你当前安装的 CUDA Toolkit 版本。很多人看到这里显示 12.4,就以为自己已经装了 CUDA 12.4,然后去nvcc -V一看发现根本没有,或者版本对不上,就开始懵。这两个东西是分开的,nvidia-smi属于驱动层,nvcc属于 Toolkit 层,后面我会详细拆。
选版本的正确姿势是这样的:先确定你要跑的框架需要什么 CUDA 版本,再反推驱动版本。举个例子,TensorFlow 2.5.0 官方要求 CUDA 11.2 + cuDNN 8.1,那你就得装 CUDA 11.2,驱动只要满足最低要求(>= 450.80.02)就行。再比如 PyTorch 2.x 现在主流是 CUDA 11.8 和 12.1 两个版本,你选哪个取决于你的显卡架构和驱动。4060 Ti 是 Ada Lovelace 架构,算力 8.9,CUDA 11.8 和 12.x 都支持,但如果你要用最新的 FlashAttention 或者某些编译型库,12.x 会更省心。
这里插一句关于wsl2安装cuda的事。WSL2 里的 CUDA 安装逻辑和纯 Linux 不太一样。WSL2 本身不需要你在里面装显卡驱动,驱动是装在 Windows 宿主机的,WSL2 通过/usr/lib/wsl/lib这个路径直接调用宿主机的驱动。所以你只需要在 WSL2 里装 CUDA Toolkit 就行,千万别在 WSL2 里再装一遍 Linux 驱动,装了反而会冲突。这个点后面会展开讲。
还有一个高频问题:cuda多版本安装。很多人一台机器上要跑不同的项目,有的要 CUDA 10.2,有的要 11.8,有的要 12.1。这时候你不需要反复卸载重装,CUDA 是支持多版本共存的,通过软链接和环境变量切换就行。具体操作后面有详细步骤。
最后说一个反直觉的点:不是所有 N 卡都能装 CUDA。你的显卡算力(Compute Capability)必须 >= 3.0,太老的卡比如 GT 610 这种就别折腾了。另外,AMD 显卡原生跑 CUDA 这件事,网上确实有一些方案,但本质上都是通过转译层或者重编译实现的,性能和兼容性都有折损,不是“完美运行”,这个后面会专门聊。
2. 驱动安装:从 nvidia-smi 到黑屏救援的完整流程
2.1 驱动安装前的系统检查
装驱动之前,先确认三件事:显卡型号、操作系统版本、是否已有旧驱动残留。显卡型号用lspci | grep -i nvidia(Linux)或者设备管理器(Windows)看。操作系统版本决定了你下载哪个驱动包,Ubuntu 22.04 和 20.04 的驱动包是不一样的,Windows 10 和 11 也不一样。
旧驱动残留是重装系统后最容易忽略的问题。如果你之前装过驱动,哪怕是在“程序和功能”里卸载了,注册表里可能还有残留。Linux 下更麻烦,/etc/modprobe.d/下面可能有blacklist-nouveau.conf之类的文件,/usr/lib/modules/下面可能有旧的内核模块。这些不清干净,新驱动装上去大概率会冲突,表现就是开机黑屏或者循环登录。
提示:Linux 下装驱动前,先禁用 nouveau 开源驱动。这个驱动是内核自带的,会和 N 卡官方驱动抢设备。禁用方法是在
/etc/modprobe.d/blacklist-nouveau.conf里写入blacklist nouveau和options nouveau modeset=0,然后sudo update-initramfs -u更新内核镜像,重启生效。
2.2 Windows 下的驱动安装
Windows 下装驱动相对简单,但有几个细节要注意。首先,下载驱动的时候选“Game Ready Driver”还是“Studio Driver”?如果你主要是跑深度学习,选 Studio Driver,它的稳定性更好,更新频率低,不会在你跑实验的时候突然弹窗让你重启。Game Ready Driver 更新太频繁,有时候新驱动反而会引入兼容性问题。
安装的时候选“自定义安装”,然后勾选“执行清洁安装”。这个选项会把旧驱动彻底清掉再装新的,虽然会多花几分钟,但能避免很多玄学问题。如果你不勾,有时候旧驱动的残留文件会导致nvidia-smi能跑但 CUDA 程序报错。
安装完成后,打开命令行输入nvidia-smi,如果能看到显卡信息表格,说明驱动装好了。表格里重点看三个东西:Driver Version、CUDA Version、GPU 名称。Driver Version 是你装的驱动版本,CUDA Version 是这个驱动支持的最高 CUDA 版本,GPU 名称确认是你那张卡。
2.3 Linux 下的驱动安装
Linux 下装驱动有三种方式:apt 包管理器、runfile 安装包、conda 安装。我推荐 apt 方式,最省心。以 Ubuntu 为例,先ubuntu-drivers devices看看系统推荐哪个版本,然后sudo apt install nvidia-driver-550这样装。装完重启,nvidia-smi能出来就行。
runfile 方式适合需要精细控制的情况,比如你要装特定版本的驱动,或者 apt 源里的版本太老。下载.run文件后,先sudo telinit 3进入文本模式,然后sudo sh NVIDIA-Linux-x86_64-xxx.run运行安装程序。安装过程中会问你要不要装 32 位兼容库、要不要更新 X 配置,一般选是就行。装完sudo telinit 5回到图形界面。
conda 方式最不推荐,虽然conda install cudatoolkit看起来很方便,但它装的是 CUDA 运行时库,不是完整驱动。而且 conda 的 CUDA 版本往往滞后,和系统驱动的兼容性也不好。除非你是在没有 root 权限的集群上跑,否则别用 conda 装 CUDA。
注意:Linux 下装完驱动如果黑屏,别慌。按 Ctrl+Alt+F2 进文本终端,登录后
sudo apt remove --purge nvidia-*把驱动卸干净,然后重新装。如果连文本终端都进不去,就用 Live USB 启动,chroot 进去修。这个坑我踩过三次,每次都是因为没禁用 nouveau。
2.4 WSL2 下的驱动逻辑
WSL2 的驱动安装和纯 Linux 完全不同。你不需要在 WSL2 里装任何显卡驱动,只需要在 Windows 宿主机上装好驱动就行。WSL2 通过一个叫/usr/lib/wsl/lib的目录直接访问宿主机的驱动库。你可以在 WSL2 里ls /usr/lib/wsl/lib看看,里面应该有libcuda.so之类的文件。
如果你在 WSL2 里跑nvidia-smi报错说找不到命令,先检查/usr/lib/wsl/lib在不在 PATH 里。通常这个目录会被自动加到 PATH,但有时候需要手动加。在~/.bashrc里加一行export PATH=$PATH:/usr/lib/wsl/lib就行。
WSL2 里装 CUDA Toolkit 的步骤和纯 Linux 一样,但注意不要装驱动。NVIDIA 官方文档里 WSL2 的 CUDA 安装指南明确说了,只装 Toolkit,不装 Driver。如果你手贱装了 Linux 驱动,WSL2 会直接挂掉,只能重装 WSL2。
3. CUDA Toolkit 安装:nvcc 不是内部命令的根治方案
3.1 Toolkit 和 Driver 的区别
这是最容易被混淆的一对概念。Driver 是让操作系统认识显卡的,Toolkit 是让你写 CUDA 程序的。nvidia-smi来自 Driver,nvcc来自 Toolkit。你可以只装 Driver 不装 Toolkit,这时候nvidia-smi能用但nvcc不能用。你也可以装多个版本的 Toolkit,但 Driver 只有一个。
nvcc' 不是内部或外部命令,也不是可运行的程序,或批处理文件这个报错,99% 的原因是 Toolkit 没装,或者装了但没加到 PATH。Windows 下 Toolkit 默认装在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin,你需要把这个路径加到系统环境变量 PATH 里。Linux 下默认装在/usr/local/cuda-12.4/bin,同样要加到 PATH。
验证 Toolkit 装好没有,用nvcc -V。注意是大写 V,小写 v 在某些版本上不显示版本号。输出应该类似:
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2024 NVIDIA Corporation Built on Wed_Apr_17_19:19:55_PDT_2024 Cuda compilation tools, release 12.4, V12.4.131 Build cuda_12.4.r12.4/compiler.34097967_0如果nvcc -V报错但nvidia-smi正常,那就是 Toolkit 的问题,不是驱动的问题。别去折腾驱动,浪费时间。
3.2 Linux 下安装 CUDA Toolkit
以 Ubuntu 22.04 装 CUDA 12.4 为例。先去 NVIDIA 官网下载页,选 Linux → x86_64 → Ubuntu → 22.04 → runfile (local)。下载下来是个.run文件,大概 4 个 G。
安装命令:
sudo sh cuda_12.4.1_550.54.15_linux.run运行后会先解压,然后弹出安装界面。这里有个关键操作:在安装选项里把 Driver 那一项的勾去掉。因为你已经装过驱动了,Toolkit 自带的驱动版本可能和你系统里的不一样,勾上会覆盖掉现有驱动,容易出问题。只勾 CUDA Toolkit 和 Samples 就行。
安装完成后,配置环境变量。在~/.bashrc里加:
export PATH=/usr/local/cuda-12.4/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc生效。nvcc -V能出版本号就说明装好了。
3.3 Windows 下安装 CUDA Toolkit
Windows 下更简单,下载.exe安装包,双击运行。安装类型选“自定义”,然后取消勾选 Driver 组件,只留 CUDA 和 Development 相关的。安装路径默认就行,别改,改了容易出玄学问题。
装完后检查环境变量。系统属性 → 高级 → 环境变量,看看Path里有没有C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin。如果没有,手动加。加完重启命令行,nvcc -V验证。
提示:Windows 下如果
nvcc -V报错,先检查是不是装了多个版本的 Toolkit。多个版本共存时,PATH 里哪个版本在前面,nvcc就用哪个。你可以通过调整 PATH 顺序来切换版本。
3.4 WSL2 下安装 CUDA Toolkit
WSL2 下装 Toolkit 和纯 Linux 几乎一样,但有几个坑。首先,WSL2 的 Ubuntu 版本要和 Toolkit 支持的版本匹配。Ubuntu 22.04 装 CUDA 12.x 没问题,但装 CUDA 11.x 可能会缺依赖。其次,WSL2 下不要装 Driver,前面说过了。
安装命令和 Linux 一样,但注意 WSL2 的/usr/local/cuda软链接可能不会自动创建。装完后手动建一下:
sudo ln -s /usr/local/cuda-12.4 /usr/local/cuda然后配 PATH 和 LD_LIBRARY_PATH。WSL2 下nvidia-smi是从/usr/lib/wsl/lib调用的,和 Toolkit 的路径不冲突,两个都能用就对了。
3.5 多版本共存与切换
一台机器上装多个 CUDA 版本是常态。Linux 下,所有版本都装在/usr/local/下面,比如cuda-11.8、cuda-12.1、cuda-12.4。/usr/local/cuda是个软链接,指向当前默认版本。
切换版本就是改软链接:
sudo rm /usr/local/cuda sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda然后重新source ~/.bashrc。但注意,如果你的 PATH 里写的是/usr/local/cuda-12.4/bin这种硬编码路径,改软链接没用,得改 PATH。所以我建议 PATH 里写/usr/local/cuda/bin,这样切换软链接就能全局生效。
Windows 下多版本切换靠改 PATH 顺序。把想用的版本的bin目录挪到最前面就行。但 Windows 下有个坑:nvcc和cudart的版本可能不一致,因为 PATH 里可能混了不同版本的库。建议用where nvcc确认一下实际调用的是哪个。
4. cuDNN 安装:版本匹配比安装本身更重要
4.1 cuDNN 是什么,为什么需要它
cuDNN 是 NVIDIA 的深度神经网络加速库,全称 CUDA Deep Neural Network library。PyTorch、TensorFlow 这些框架底层调用的卷积、池化、归一化等操作,都是通过 cuDNN 实现的。没有 cuDNN,框架也能跑,但速度会慢很多,因为会退回到 CUDA 的通用实现。
cuDNN 的版本必须和 CUDA 版本严格对应。CUDA 11.8 对应 cuDNN 8.9.x,CUDA 12.1 对应 cuDNN 8.9.x 或 9.x,CUDA 12.4 对应 cuDNN 9.x。装错了版本,框架启动时就会报Could not locate cudnn_ops_infer64_8.dll或者libcudnn.so.8: cannot open shared object file这种错。
4.2 Linux 下安装 cuDNN
cuDNN 的下载需要注册 NVIDIA 开发者账号,这个没办法跳过。下载下来是个 tar 包,解压后里面有三个目录:include、lib64、lib。把它们拷贝到 CUDA 的对应目录:
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64 sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*验证安装:cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2,能看到版本号就对了。
注意:如果你装了多个 CUDA 版本,cuDNN 要分别拷贝到每个版本的目录下。比如 CUDA 11.8 和 12.4 都装了,那 cuDNN 8.9 要拷到 11.8 的目录,cuDNN 9.x 要拷到 12.4 的目录。别偷懒只拷一个。
4.3 Windows 下安装 cuDNN
Windows 下下载的是 zip 包,解压后同样有bin、include、lib三个目录。把bin里的 dll 拷到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin,include里的 h 文件拷到...\include,lib里的 lib 文件拷到...\lib\x64。
验证方法:写个简单的 CUDA 程序调用 cuDNN,或者直接跑框架看能不能启动。更简单的方法是看C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin下面有没有cudnn64_8.dll或者cudnn64_9.dll。
4.4 版本匹配速查表
| CUDA 版本 | 推荐 cuDNN 版本 | 适用框架 |
|---|---|---|
| 11.2 | 8.1.0 | TensorFlow 2.5.0 |
| 11.8 | 8.9.7 | PyTorch 2.0-2.2 |
| 12.1 | 8.9.7 / 9.1 | PyTorch 2.1+ |
| 12.4 | 9.1 | PyTorch 2.3+ |
这张表建议存下来,装之前对一遍。我见过太多人拿着 TensorFlow 2.5.0 去配 CUDA 12.4,然后问为什么跑不起来。不是 CUDA 的问题,是 TensorFlow 2.5.0 编译的时候就是针对 CUDA 11.2 的,你给它 12.4 它不认识。
5. 验证与排查:从 nvidia-smi 到实际跑通框架
5.1 三层验证法
装完驱动、Toolkit、cuDNN 之后,别急着跑框架,先做三层验证。
第一层:nvidia-smi。能出表格,Driver Version 和 CUDA Version 都正常,说明驱动没问题。
第二层:nvcc -V。能出编译器版本,说明 Toolkit 没问题。
第三层:编译并运行一个 CUDA Samples。CUDA Toolkit 自带 Samples,在/usr/local/cuda/samples或者C:\ProgramData\NVIDIA Corporation\CUDA Samples。进去make一下,然后跑./bin/x86_64/linux/release/deviceQuery。如果输出Result = PASS,说明 CUDA 运行时没问题。
如果cuda samples找不到,可能是安装的时候没勾 Samples 组件。Linux 下可以单独下载 Samples 包,Windows 下重新运行安装程序勾上就行。
5.2 框架层面的验证
PyTorch 验证:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) print(torch.version.cuda)如果torch.cuda.is_available()返回 False,先检查 PyTorch 版本和 CUDA 版本是否匹配。PyTorch 官网有版本对照表,装之前对一下。如果返回 True 但get_device_name报错,可能是驱动和 Toolkit 版本不匹配。
TensorFlow 验证:
import tensorflow as tf print(tf.__version__) print(tf.config.list_physical_devices('GPU'))TensorFlow 2.5.0 比较特殊,它要求 CUDA 11.2 + cuDNN 8.1,而且对驱动版本也有要求。如果你驱动太新,反而可能不兼容。这时候要么降驱动,要么升 TensorFlow。
5.3 常见报错速查
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
nvcc: command not found | Toolkit 没装或 PATH 没配 | 装 Toolkit,配 PATH |
CUDA error: no kernel image | 显卡算力和编译目标不匹配 | 重新编译,指定正确的算力 |
libcudnn.so.8: cannot open | cuDNN 没装或版本不对 | 装对应版本的 cuDNN |
CUDA out of memory | 显存不够 | 减小 batch size,或换卡 |
driver version insufficient | 驱动版本太低 | 升级驱动 |
nvidia-smi: command not found | 驱动没装或 PATH 没配 | 装驱动,配 PATH |
5.4 独家避坑技巧
第一个坑:别用最新版。CUDA 和驱动都不是越新越好。新版本刚出来的时候,框架往往还没适配,你装了就是当小白鼠。等三个月,等框架官方说支持了再升。
第二个坑:WSL2 里别装驱动。这个前面说过了,但真的有人不信邪,装了之后 WSL2 直接挂掉,数据全丢。WSL2 的驱动是宿主机管的,你只需要装 Toolkit。
第三个坑:多版本共存时,LD_LIBRARY_PATH 的顺序很重要。如果你 PATH 里是 CUDA 12.4,但 LD_LIBRARY_PATH 里是 CUDA 11.8 的 lib64,那运行时链接的库是 11.8 的,会出各种诡异错误。确保 PATH 和 LD_LIBRARY_PATH 指向同一个版本。
第四个坑:cuDNN 的版本号要看仔细。cuDNN 8.9.7 和 8.9.6 可能只差一个小版本,但对应的 CUDA 版本可能不一样。下载的时候看清楚文件名里的cuda11还是cuda12。
第五个坑:4060 Ti 的算力是 8.9,编译的时候要指定-arch=sm_89。如果你用默认的编译选项,可能编译出来的二进制在 4060 Ti 上跑不了。PyTorch 官方编译的版本一般会包含多个算力,但你自己编译的时候要注意。
6. 进阶话题:多版本管理、迁移与特殊场景
6.1 CUDA 迁移到新机器
换机器的时候,CUDA 环境不能直接拷贝,因为驱动和硬件绑定。正确的迁移步骤是:新机器先装驱动,然后装相同版本的 Toolkit 和 cuDNN,最后把项目代码拷过去。如果项目里有编译好的二进制,可能需要重新编译,因为算力目标可能不一样。
如果新机器显卡算力比旧机器低,编译的时候要降低算力目标。比如旧机器是 A100(算力 8.0),新机器是 4060 Ti(算力 8.9),那编译的时候要包含 sm_89。反过来,如果旧机器算力低,新机器算力高,一般没问题,因为 CUDA 是向前兼容的。
6.2 llama.cpp 与 CUDA 的兼容性
cuda llama.cpp non compatible这个问题最近问的人很多。llama.cpp 的 CUDA 后端对版本比较敏感,它要求 CUDA 11.7 以上,但太新的版本也可能有问题。如果你用 CUDA 12.4 编译 llama.cpp 报错,试试降到 12.1 或者 11.8。
编译 llama.cpp 的 CUDA 后端:
make LLAMA_CUDA=1如果报错说找不到 CUDA,检查CUDA_PATH环境变量。llama.cpp 的 Makefile 会读这个变量,没设的话它找不到 Toolkit。
6.3 AMD 显卡跑 CUDA 的真相
网上有些文章说 AMD 显卡可以“完美运行 CUDA”,这个说法不太准确。AMD 显卡跑 CUDA 本质上是通过 HIP(Heterogeneous-compute Interface for Portability)或者 ZLUDA 这样的转译层实现的。HIP 是 AMD 自己的 CUDA 替代方案,代码需要移植;ZLUDA 是直接转译 CUDA 二进制,但兼容性和性能都有折损。
如果你手头只有 AMD 卡,想跑 CUDA 程序,最靠谱的方案是用 ROCm。ROCm 是 AMD 的官方计算平台,PyTorch 和 TensorFlow 都有 ROCm 版本。但 ROCm 支持的显卡型号有限,不是所有 AMD 卡都能用。而且 ROCm 的安装比 CUDA 还麻烦,坑更多。
6.4 SLI 与 CUDA 的关系
sli cuda这个组合现在很少见了。SLI 是 NVIDIA 的多卡渲染技术,主要用于游戏,和 CUDA 计算没关系。CUDA 的多卡计算靠的是 NCCL 和 CUDA 的 P2P 访问,不需要 SLI 桥接器。如果你有多张卡想跑 CUDA,直接装驱动和 Toolkit 就行,不用管 SLI。
多卡 CUDA 编程的时候,用cudaSetDevice切换设备,用cudaMemcpyPeer做卡间通信。NCCL 库封装了这些操作,做分布式训练的时候直接用 NCCL 就行。
6.5 驱动更新与 CUDA 版本升级
驱动更新和 CUDA 升级是两件事。驱动更新不影响已安装的 Toolkit,但可能影响 Toolkit 的可用性。比如你驱动从 550 升到 555,CUDA 12.4 的 Toolkit 可能还能用,但 CUDA 11.8 的可能就出问题了,因为新驱动可能不再支持老版本的运行时。
升级 CUDA 版本的时候,建议先备份当前环境,然后装新版本,测试没问题再删旧版本。别直接覆盖安装,出了问题回滚很麻烦。
7. 实操心得与常见问题实录
7.1 我的标准安装流程
以 Ubuntu 22.04 + RTX 4060 Ti + CUDA 12.4 为例,我的标准流程是这样的:
- 装系统,更新到最新:
sudo apt update && sudo apt upgrade - 禁用 nouveau:写 blacklist 文件,
update-initramfs -u,重启 - 装驱动:
sudo apt install nvidia-driver-550,重启 - 验证驱动:
nvidia-smi能出表格 - 装 Toolkit:下载 runfile,安装时取消 Driver 勾选
- 配环境变量:PATH 和 LD_LIBRARY_PATH
- 验证 Toolkit:
nvcc -V能出版本 - 装 cuDNN:下载对应版本,拷贝文件
- 验证 cuDNN:检查头文件和库文件
- 装 PyTorch:
pip install torch --index-url https://download.pytorch.org/whl/cu124 - 验证 PyTorch:
torch.cuda.is_available()返回 True
这套流程我跑了不下二十遍,每次都能一次成功。关键点就三个:禁用 nouveau、取消 Driver 勾选、版本严格匹配。
7.2 那些年我踩过的坑
第一个坑:在 WSL2 里装了 Linux 驱动,WSL2 直接挂掉,重装花了两个小时。教训是 WSL2 只装 Toolkit,不装 Driver。
第二个坑:cuDNN 版本装错,TensorFlow 启动时报Could not create cudnn handle。查了半天才发现是 cuDNN 8.9 配了 CUDA 11.2,应该用 cuDNN 8.1。教训是版本对照表要常备。
第三个坑:多版本共存时 PATH 和 LD_LIBRARY_PATH 不一致,PyTorch 能 import 但跑不了卷积。查了一天才发现是运行时链接了错误版本的库。教训是 PATH 和 LD_LIBRARY_PATH 必须指向同一个版本。
第四个坑:驱动自动更新后 CUDA 挂了。Ubuntu 的 unattended-upgrades 会自动更新驱动,有时候新驱动和老 Toolkit 不兼容。教训是关掉自动更新,或者锁定驱动版本。
7.3 常见问题速查表
| 问题 | 排查思路 | 解决方案 |
|---|---|---|
| nvidia-smi 报错 | 驱动没装或版本不对 | 重装驱动 |
| nvcc 找不到 | Toolkit 没装或 PATH 没配 | 装 Toolkit,配 PATH |
| 框架检测不到 GPU | 驱动/Toolkit/cuDNN 版本不匹配 | 对照版本表逐一检查 |
| 编译 CUDA 程序报错 | 算力目标不对 | 指定正确的 -arch |
| 显存不足 | batch size 太大 | 减小 batch size |
| 多卡训练报错 | NCCL 没装或版本不对 | 装 NCCL,配环境变量 |
| WSL2 里 nvidia-smi 找不到 | PATH 没包含 /usr/lib/wsl/lib | 加 PATH |
| 驱动更新后 CUDA 挂了 | 新驱动不兼容老 Toolkit | 降驱动或升 Toolkit |
7.4 最后的经验分享
装 CUDA 这件事,说难不难,说简单也不简单。核心就一句话:版本匹配。驱动、Toolkit、cuDNN、框架,四个东西的版本必须对得上。对上了,一路畅通;对不上,各种报错。
我的建议是,装之前先花十分钟查版本对照表,别急着下载。下载的时候看清楚文件名,别下错平台。安装的时候仔细看选项,别一路 Next。装完做三层验证,别急着跑框架。
还有,别追新。CUDA 12.4 刚出的时候我就装了,结果 PyTorch 还不支持,又降回 12.1。等三个月,等生态跟上了再升,省心省力。
最后,备份环境。装之前把当前环境用conda env export或者pip freeze导出来,出了问题能快速回滚。这个习惯我养了五年,救了我无数次。