1. 搞懂 CUDA 和 N 卡驱动到底在装什么
很多人第一次接触深度学习环境搭建,上来就是一句“CUDA 怎么装”,然后照着某篇教程一顿复制粘贴,最后nvcc报错、nvidia-smi不认、TensorFlow 找不到 GPU,折腾一整天环境还是废的。我踩过这个坑不止一次,后来才明白:装 CUDA 之前,你得先搞清楚自己在装什么、它们之间是什么关系。这一节就把这件事讲透,后面所有操作都建立在这个认知之上。
1.1 驱动、CUDA Toolkit、cuDNN 三者的真实关系
先把三个东西的角色分清楚,这是整个环境搭建的地基。
N 卡驱动(Driver)是操作系统和显卡硬件之间的桥梁。没有它,系统根本不知道你插了一张显卡。驱动里包含了一个关键组件叫CUDA Driver,它提供了运行 CUDA 程序所需的最底层接口。你平时用nvidia-smi看到的驱动版本,就是这个东西。
CUDA Toolkit是开发工具包,里面包含编译器nvcc、各种库(cuBLAS、cuFFT 等)、头文件、以及调试工具。你写 CUDA C++ 代码、编译 PyTorch 的自定义算子,靠的就是它。nvcc --version查的就是 Toolkit 版本。
cuDNN是专门为深度学习优化的加速库,全称 CUDA Deep Neural Network library。它建立在 CUDA 之上,提供了卷积、池化、归一化等深度学习常用操作的高度优化实现。TensorFlow、PyTorch 这些框架在 GPU 上跑,底层调用的就是 cuDNN。
它们的关系可以这样理解:驱动是地基,CUDA Toolkit 是盖在地基上的房子框架,cuDNN 是房子里专门为深度学习定制的家具。地基没打好,房子盖不起来;房子框架不对,家具放不进去。
这里有个特别容易搞混的点:驱动版本和 CUDA Toolkit 版本不是一回事。驱动版本是550.144.03这种,CUDA Toolkit 版本是12.4、11.8这种。一个驱动可以支持多个 CUDA Toolkit 版本,但有一个上限。比如驱动550.x最高支持到 CUDA 12.4,你想装 CUDA 12.6 就得先升级驱动。
注意:
nvidia-smi右上角显示的CUDA Version: 12.4指的是这个驱动最高支持的 CUDA 版本,不是你当前安装的 CUDA Toolkit 版本。很多人看到这个就以为自己装了 CUDA 12.4,其实根本没装 Toolkit。这是新手最容易误解的地方。
1.2 为什么版本匹配是绕不过去的坎
深度学习环境搭建 90% 的坑都来自版本不匹配。为什么这么麻烦?因为整条链路是层层依赖的:
TensorFlow/PyTorch → cuDNN → CUDA Toolkit → 驱动 → 显卡硬件每一层都对上一层有版本要求。比如 TensorFlow 2.5.0 官方要求 CUDA 11.2 + cuDNN 8.1,你如果装了 CUDA 12.x,它直接找不到 GPU。PyTorch 稍微好一点,因为它会把 CUDA 运行时打包进 wheel 里,但驱动版本仍然要满足最低要求。
我见过太多人犯这个错:显卡是 4060 Ti,驱动是新的,就随手装了最新的 CUDA 12.6,然后 pip 装了个 TensorFlow 2.5.0,跑起来发现tf.config.list_physical_devices('GPU')返回空列表,一脸懵。问题就出在 TensorFlow 2.5.0 根本不认识 CUDA 12。
所以正确的顺序是倒推:先确定你要用什么框架的什么版本,查官方文档看它要求哪个 CUDA 和 cuDNN,再根据 CUDA 版本去确定驱动的最低版本要求,最后检查你的显卡是否支持。这个顺序不能反。
1.3 不同显卡对 CUDA 版本的支持边界
不是所有显卡都能装所有 CUDA 版本,这里有个Compute Capability(计算能力)的概念。每张 N 卡都有一个计算能力版本号,CUDA Toolkit 对最低计算能力有要求。
| 显卡系列 | 计算能力 | 支持的 CUDA 版本范围 |
|---|---|---|
| GTX 10 系(1080Ti 等) | 6.1 | CUDA 8.0 - 12.x |
| RTX 20 系(2080Ti 等) | 7.5 | CUDA 10.0 - 12.x |
| RTX 30 系(3090 等) | 8.6 | CUDA 11.1 - 12.x |
| RTX 40 系(4060Ti、4090 等) | 8.9 | CUDA 11.8 - 12.x |
4060 Ti 的计算能力是 8.9,最低要求 CUDA 11.8。如果你硬要装 CUDA 11.6,编译时会报unsupported gpu architecture的错误。这一点在选版本时一定要先确认。
另外,较新的 CUDA 版本会逐步放弃对老架构的支持。比如 CUDA 12.x 已经不再支持计算能力 3.5 和 3.7 的老卡(Kepler 架构)。所以老显卡用户选版本时要格外小心,别盲目追新。
2. 装之前必须做的三件准备工作
我见过太多人跳过准备工作直接开装,结果装到一半发现驱动版本不对、磁盘空间不够、或者旧版本没清干净导致冲突。这一节说的三件事,花你十分钟,能省你半天。
2.1 用 nvidia-smi 摸清当前环境底细
第一步永远是先看现状。打开终端(Windows 用 CMD 或 PowerShell,Linux 用终端),输入:
nvidia-smi正常输出大概长这样:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 550.144.03 Driver Version: 550.144.03 CUDA Version: 12.4 | |-------------------------------+----------------------+----------------------+ | 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 ... Off | 00000000:01:00.0 On | N/A | | 30% 45C P8 20W / 200W | 500MiB / 12288MiB | 5% Default | +-------------------------------+----------------------+----------------------+重点看三个信息:Driver Version(驱动版本)、CUDA Version(驱动支持的最高 CUDA 版本)、GPU 型号和显存。
如果nvidia-smi报command not found或者不是内部或外部命令,说明驱动没装或者没装好。Windows 上还有一种情况是驱动装了但环境变量没配,nvidia-smi.exe在C:\Windows\System32下,正常情况下应该能直接调用。
提示:Windows 上如果
nvidia-smi找不到,先确认C:\Windows\System32在 PATH 里。Linux 上如果找不到,可能是驱动装在了非标准路径,用which nvidia-smi或find / -name nvidia-smi 2>/dev/null找一下。
2.2 确认驱动版本能撑起你要装的 CUDA
拿到驱动版本后,对照 NVIDIA 官方的驱动-CUDA 兼容表。这里给几个常用的对应关系:
| 驱动版本区间 | 最高支持 CUDA |
|---|---|
| 450.x - 460.x | CUDA 11.0 - 11.2 |
| 470.x | CUDA 11.4 |
| 510.x - 520.x | CUDA 11.6 - 11.8 |
| 525.x - 535.x | CUDA 12.0 - 12.2 |
| 545.x - 550.x | CUDA 12.3 - 12.4 |
| 555.x 及以上 | CUDA 12.5+ |
假设你的驱动是550.144.03,最高支持 CUDA 12.4。那你想装 CUDA 11.8 完全没问题(向下兼容),想装 CUDA 12.4 也行,但想装 CUDA 12.6 就必须先升级驱动。
这里有个经验:驱动尽量装新一点,但不要装最新的。太新的驱动有时候会有兼容性问题,尤其是和某些老框架搭配时。我一般推荐装比最新版落后一到两个小版本的驱动,稳定性最好。
2.3 清理旧版本,避免多版本打架
如果你之前装过 CUDA,强烈建议先清理干净再装新的。多版本共存虽然理论可行,但环境变量一乱,nvcc指向哪个版本就说不准了,排查起来非常痛苦。
Windows 清理步骤:
- 控制面板 → 程序和功能,卸载所有名字带
NVIDIA CUDA Toolkit的项 - 卸载
NVIDIA cuDNN(如果单独装过) - 手动删除残留目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA - 检查环境变量
CUDA_PATH、CUDA_HOME,删掉指向旧版本的项 - 检查 PATH 里有没有旧的 CUDA bin 和 libnvvp 路径,删掉
Linux 清理步骤:
# 查看已安装的 CUDA 相关包 dpkg -l | grep cuda # 卸载 CUDA Toolkit(以 11.8 为例) sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" "*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "cuda*" "nsight*" # 清理残留 sudo apt-get autoremove sudo apt-get autoclean # 删除残留目录 sudo rm -rf /usr/local/cuda*注意:卸载 CUDA Toolkit 不会卸载驱动,这是好事。驱动单独管理,除非你要升级驱动,否则不用动它。Linux 上卸载驱动用
sudo apt-get --purge remove "*nvidia*",但这个操作有风险,可能导致图形界面起不来,新手慎用。
清理完之后,重启一次机器,确保所有残留进程和句柄都释放了,再开始装新版本。
3. Windows 平台完整安装实操
Windows 是大多数人的主力开发环境,但也是坑最多的。这一节我把 Windows 上装 CUDA 的完整流程拆开讲,每一步都说明为什么这么做。
3.1 驱动安装:优先用官方安装器
Windows 上装驱动有两种方式:GeForce Experience 自动更新,或者去官网下载手动安装。我强烈推荐手动下载安装,原因有两个:一是 GeForce Experience 经常给你推最新驱动,可能和你的 CUDA 版本不匹配;二是手动安装可以选择“自定义安装”,只装你需要的组件,避免装一堆用不上的东西。
去 NVIDIA 官网驱动下载页面,选择你的显卡型号,下载对应的驱动安装包。安装时选择“自定义(高级)”,然后勾选“执行清洁安装”。这个选项会把旧驱动彻底清掉再装新的,避免残留冲突。
安装过程中有一个组件叫NVIDIA Graphics Driver,这个是必须装的。其他的如 GeForce Experience、PhysX 系统软件,按需勾选。如果你只做深度学习,GeForce Experience 可以不装。
装完重启,打开 CMD 输入nvidia-smi,能看到显卡信息就说明驱动 OK 了。
3.2 CUDA Toolkit 安装:自定义路径和组件选择
去 NVIDIA 官网的 CUDA Toolkit 下载页,选择你的系统版本,下载对应的安装包。这里有个选择:用exe (local)还是exe (network)。推荐用 local,因为它是完整离线包,装的时候不需要联网,速度稳定,不会因为网络问题中断。
下载完运行安装程序,第一步是解压路径,默认就行。然后会检测系统兼容性,如果提示驱动版本不够,说明你驱动太老了,先升级驱动。
关键步骤在“自定义安装”这里。展开 CUDA 组件,你会看到一堆选项:
- CUDA:核心组件,必装
- Graphics Driver:驱动,如果你已经装了更新的驱动,这里取消勾选,否则会覆盖你的新驱动
- Other components:包括 Nsight 系列调试工具,按需勾选
我一般只勾CUDA下面的 Runtime、Development、Documentation 三个,其他都取消。这样装出来最干净。
安装路径默认是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4。建议保持默认路径,因为很多框架和脚本会去这个默认路径找 CUDA。如果你非要改,记住改完之后环境变量也要跟着改。
3.3 环境变量配置:CUDA_PATH 和 PATH 的正确写法
安装程序通常会自动配好环境变量,但有时候会漏。装完一定要手动检查一遍。
打开“系统属性 → 高级 → 环境变量”,检查以下几项:
系统变量里应该有:
CUDA_PATH = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4 CUDA_PATH_V12_4 = C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4PATH 里应该有:
%CUDA_PATH%\bin %CUDA_PATH%\libnvvp如果缺了,手动补上。补完之后一定要重启 CMD,因为环境变量是启动时加载的,不重启不生效。
验证一下:
nvcc --version正常输出会显示 CUDA 版本信息。如果报nvcc 不是内部或外部命令,说明 PATH 没配好,回去检查。
提示:
nvcc报错是最高频的问题。90% 的情况是 PATH 没配或者没重启终端。剩下 10% 是安装时没勾 Development 组件,导致nvcc.exe根本没装。回去重新运行安装程序,勾上 Development 再装一次。
3.4 cuDNN 安装:复制粘贴也有讲究
cuDNN 从 8.x 开始,下载的是一个压缩包,需要手动把文件复制到 CUDA 目录里。这一步看着简单,但复制错了位置照样不生效。
去 NVIDIA 开发者网站下载 cuDNN(需要注册登录),选择和你 CUDA 版本匹配的 cuDNN 版本。比如 CUDA 12.4 就选 cuDNN 8.9.x 或 9.x 对应 CUDA 12 的版本。
下载下来是个 zip 包,解压后里面有bin、include、lib三个文件夹。把这三个文件夹里的内容分别复制到 CUDA 安装目录对应的文件夹里:
cudnn/bin/*.dll → C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin\ cudnn/include/*.h → C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\include\ cudnn/lib/x64/*.lib → C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\lib\x64\注意是复制内容,不是复制文件夹本身。很多人直接把bin文件夹拖进去,结果变成CUDA\v12.4\bin\bin\,这样是找不到的。
复制完之后,验证一下 cuDNN 是否生效。可以跑一个简单的测试程序,或者直接用框架测试。最直接的方法是检查文件是否存在:
dir "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin\cudnn*.dll"能看到一堆cudnn64_8.dll之类的文件就说明复制成功了。
4. Linux 与 WSL2 环境安装要点
Linux 是生产环境的主流,WSL2 则是 Windows 用户跑 Linux 环境最方便的方案。这两个环境的安装逻辑和 Windows 不太一样,单独拎出来讲。
4.1 Linux 上用 runfile 还是 apt 安装
Linux 上装 CUDA 有几种方式:apt 包管理、runfile 安装包、conda 安装。各有优劣。
apt 安装最省事,一条命令搞定,但版本受限于源里提供的版本,而且容易和系统其他包产生依赖冲突。适合对版本要求不严格、追求省事的场景。
runfile 安装最灵活,可以精确控制版本和安装路径,不依赖系统包管理。缺点是卸载麻烦,需要手动清理。适合需要特定 CUDA 版本、或者多版本共存的场景。
conda 安装最干净,完全隔离在 conda 环境里,不污染系统。缺点是某些框架对 conda 装的 CUDA 支持不好,而且 conda 源的 CUDA 版本更新滞后。适合用 conda 管理所有依赖的场景。
我个人的选择是:生产服务器用 runfile,本地开发用 conda。runfile 装一次管很久,conda 装方便切换。
runfile 安装的关键步骤:
# 下载 runfile(以 CUDA 12.4 为例) wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.run # 赋予执行权限 chmod +x cuda_12.4.0_550.54.14_linux.run # 运行安装程序 sudo sh cuda_12.4.0_550.54.14_linux.run安装过程中会问你几个问题:
- 是否安装驱动:选 No,因为驱动你已经装好了,这里再装会冲突
- 是否安装 CUDA Toolkit:选 Yes
- 安装路径:默认
/usr/local/cuda-12.4,建议保持 - 是否创建符号链接
/usr/local/cuda:选 Yes,方便版本切换
装完之后配置环境变量,编辑~/.bashrc:
export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc生效。
4.2 WSL2 装 CUDA 的特殊之处
WSL2 装 CUDA 和纯 Linux 有个本质区别:WSL2 不需要在 Linux 里装驱动。驱动是装在 Windows 宿主机的,WSL2 通过一个特殊的机制直接调用宿主机的驱动。
所以 WSL2 装 CUDA 的步骤是:
- Windows 宿主机装好驱动(就是前面 Windows 那节说的)
- WSL2 里只装 CUDA Toolkit,不装驱动
- 不要装 Linux 版的 NVIDIA 驱动,装了反而会出问题
WSL2 里装 CUDA Toolkit 用 apt 最方便:
# 添加 NVIDIA 的 apt 源 wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt-get update # 安装 CUDA Toolkit sudo apt-get install cuda-toolkit-12-4装完之后,nvidia-smi应该能正常显示宿主机的显卡信息。如果显示不了,检查 Windows 宿主机驱动是否正常,以及 WSL2 版本是否够新(wsl --version查看)。
注意:WSL2 里
nvidia-smi显示的 CUDA Version 是宿主机驱动支持的版本,和你在 WSL2 里装的 CUDA Toolkit 版本可能不一样,这是正常的。以nvcc --version为准。
4.3 多版本 CUDA 共存的切换技巧
有时候你需要在同一台机器上跑不同 CUDA 版本的项目,比如一个项目要 CUDA 11.8,另一个要 CUDA 12.4。这时候多版本共存就派上用场了。
Linux 上多版本共存很简单,因为 CUDA 装在/usr/local/cuda-11.8和/usr/local/cuda-12.4两个独立目录,通过软链接/usr/local/cuda指向当前使用的版本。
切换版本就是改软链接:
# 切换到 CUDA 11.8 sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda # 切换到 CUDA 12.4 sudo rm -rf /usr/local/cuda sudo ln -s /usr/local/cuda-12.4 /usr/local/cuda但这样切换是全局的,影响所有终端。更优雅的方式是用环境变量在单个终端里临时切换:
# 临时用 CUDA 11.8 export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH这样只影响当前终端,不影响其他终端和系统全局配置。我一般会写几个 alias 放在.bashrc里:
alias cuda11='export PATH=/usr/local/cuda-11.8/bin:$PATH && export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' alias cuda12='export PATH=/usr/local/cuda-12.4/bin:$PATH && export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH'需要哪个版本就敲哪个 alias,非常方便。
Windows 上多版本共存稍微麻烦一点,因为环境变量是全局的。但可以通过修改CUDA_PATH和 PATH 来切换,或者用批处理脚本在启动时设置。不过 Windows 上多版本共存的需求相对少,一般一个版本够用。
5. 验证安装与常见报错排查
装完了不代表能用,必须验证。这一节讲怎么验证,以及遇到报错怎么排查。
5.1 三步验证法确认环境可用
第一步:验证驱动
nvidia-smi能看到显卡信息、驱动版本、CUDA Version,说明驱动 OK。
第二步:验证 CUDA Toolkit
nvcc --version能看到release 12.4之类的信息,说明 Toolkit OK。
第三步:验证 cuDNN 和框架
写一个简单的 Python 脚本测试:
import tensorflow as tf print("TensorFlow version:", tf.__version__) print("GPU available:", tf.config.list_physical_devices('GPU'))或者 PyTorch:
import torch print("PyTorch version:", torch.__version__) print("CUDA available:", torch.cuda.is_available()) print("CUDA version:", torch.version.cuda) print("GPU name:", torch.cuda.get_device_name(0))如果GPU available返回非空列表,或者torch.cuda.is_available()返回 True,说明整条链路都通了。
5.2 nvcc 找不到的三种原因和对策
nvcc 不是内部或外部命令是最高频的报错。原因通常有三种:
原因一:PATH 没配。这是最常见的。检查 PATH 里有没有%CUDA_PATH%\bin(Windows)或/usr/local/cuda/bin(Linux)。没有就加上,然后重启终端。
原因二:没装 Development 组件。CUDA Toolkit 安装时如果只勾了 Runtime,是不会装nvcc的。回去重新运行安装程序,勾上 Development。
原因三:装在了非默认路径。如果你改了安装路径,环境变量也要跟着改。检查CUDA_PATH是否指向正确的目录。
排查顺序:先看 PATH,再看文件是否存在,最后看安装组件。
5.3 框架检测不到 GPU 的排查思路
框架检测不到 GPU,可能的原因比较多,按这个顺序排查:
- 驱动是否正常:
nvidia-smi能不能跑 - CUDA 版本是否匹配:框架要求的 CUDA 版本和你装的是否一致
- cuDNN 是否正确安装:文件是否复制到了正确位置
- 框架版本是否支持你的显卡:老框架可能不支持新显卡
- 是否装成了 CPU 版本:
pip install tensorflow默认装的是 CPU 版,要装tensorflow-gpu或者指定版本
我遇到过一个典型案例:用户装了 TensorFlow 2.5.0,CUDA 装的是 12.4,结果检测不到 GPU。原因是 TensorFlow 2.5.0 只支持 CUDA 11.2,版本不匹配。解决办法是降级 CUDA 到 11.2,或者升级 TensorFlow 到支持 CUDA 12 的版本。
5.4 常见报错速查表
| 报错信息 | 可能原因 | 解决方法 |
|---|---|---|
nvcc: command not found | PATH 未配置 | 添加 CUDA bin 到 PATH |
nvidia-smi: command not found | 驱动未安装 | 安装 NVIDIA 驱动 |
CUDA driver version is insufficient | 驱动版本过低 | 升级驱动 |
no CUDA-capable device is detected | 驱动问题或显卡不支持 | 检查驱动和显卡计算能力 |
libcudnn.so not found | cuDNN 未安装或路径不对 | 检查 cuDNN 文件位置和 LD_LIBRARY_PATH |
unsupported gpu architecture | CUDA 版本不支持显卡 | 升级 CUDA 或换显卡 |
CUDA out of memory | 显存不足 | 减小 batch size 或清理显存 |
这张表建议收藏,遇到报错先查表,能解决 80% 的问题。
6. 版本选型与升级迁移的实战经验
环境搭好只是开始,后续版本升级、迁移、兼容性处理才是长期要面对的。这一节分享一些实战经验。
6.1 如何根据框架反推 CUDA 版本
前面说过要倒推,这里给一个具体的操作流程。
假设你要用 PyTorch,先去 PyTorch 官网看它的安装命令。官网会给出几个选项,比如:
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121cu118就是 CUDA 11.8,cu121就是 CUDA 12.1。你选哪个,就装对应的 CUDA 版本。
TensorFlow 的话,去官网看兼容性表格。比如 TensorFlow 2.15 要求 CUDA 12.2 + cuDNN 8.9,TensorFlow 2.5.0 要求 CUDA 11.2 + cuDNN 8.1。
确定框架要求的 CUDA 版本后,再查这个 CUDA 版本要求的最低驱动版本。比如 CUDA 11.8 要求驱动 >= 450.80.02,CUDA 12.4 要求驱动 >= 550.54.14。
最后检查你的显卡是否支持这个 CUDA 版本。4060 Ti 支持 CUDA 11.8 及以上,所以 CUDA 11.8 和 12.4 都能装。
6.2 升级 CUDA 时驱动要不要一起升
这个问题取决于目标 CUDA 版本是否超出当前驱动的支持范围。
如果当前驱动支持目标 CUDA 版本,那不用升驱动,直接装新 CUDA 就行。比如驱动 550.x 支持 CUDA 12.4,你想从 CUDA 11.8 升到 12.4,驱动不用动。
如果目标 CUDA 版本超出当前驱动支持范围,那就必须先升驱动。比如驱动 525.x 最高支持 CUDA 12.0,你想装 CUDA 12.4,就得先把驱动升到 550.x。
升级驱动的顺序是:先升驱动,重启,再装新 CUDA。不要反过来,否则新 CUDA 装完发现驱动不支持,还得重来。
提示:升级驱动有风险,尤其是 Linux 上,可能导致图形界面起不来。升级前建议先确认当前驱动版本,记下来,万一出问题可以回滚。Linux 上可以用
sudo apt-get install nvidia-driver-550这种命令装指定版本驱动。
6.3 迁移到新机器时的环境复刻清单
换机器或者迁移环境时,最怕的就是新机器上装出来的环境和旧机器不一致。我一般会维护一个环境清单,记录以下信息:
- 操作系统版本
- 显卡型号
- 驱动版本
- CUDA Toolkit 版本
- cuDNN 版本
- Python 版本
- 框架版本(TensorFlow/PyTorch)
- 关键依赖包版本
迁移时按这个清单逐项核对安装。可以用pip freeze > requirements.txt导出 Python 依赖,但 CUDA 和驱动这些系统级的东西没法导出,只能手动记录。
我还会写一个简单的验证脚本,在新机器上跑一遍,确认所有关键组件版本都对:
import subprocess import torch import tensorflow as tf print("=== 驱动 ===") subprocess.run(["nvidia-smi"]) print("=== CUDA ===") subprocess.run(["nvcc", "--version"]) print("=== PyTorch ===") print("Version:", torch.__version__) print("CUDA available:", torch.cuda.is_available()) print("=== TensorFlow ===") print("Version:", tf.__version__) print("GPU:", tf.config.list_physical_devices('GPU'))这个脚本跑一遍,环境是否完整一目了然。
6.4 关于 AMD 显卡和其他非 N 卡方案的说明
网上偶尔能看到“AMD 显卡完美运行 CUDA”这类说法,这里需要澄清一下。CUDA 是 NVIDIA 的专有技术,原生只能在 N 卡上运行。AMD 显卡要跑 CUDA 程序,需要通过一些转换层(如 HIP),但兼容性和性能都有损失,不是所有 CUDA 程序都能跑。
如果你手头是 AMD 显卡,做深度学习建议用 ROCm 生态,PyTorch 和 TensorFlow 都有 ROCm 版本。但 ROCm 的支持范围比 CUDA 窄很多,很多库和工具不支持,踩坑概率高。如果预算允许,深度学习还是建议用 N 卡,省心。
至于 SLI 和 CUDA 的关系,SLI 是游戏多卡互联技术,和 CUDA 计算没关系。CUDA 多卡计算靠的是 NCCL 和框架自身的多卡支持,不需要 SLI。这一点很多人搞混,以为多卡跑深度学习要开 SLI,其实完全不用。
7. 我踩过的坑和几条实在建议
最后分享几条我这些年踩坑总结出来的经验,都是文档里不会写的。
第一条:装之前先截图记录当前环境。nvidia-smi、nvcc --version、pip list都截个图。万一装崩了,至少知道原来是什么样,方便回滚。
第二条:不要迷信最新版本。CUDA 和驱动都不是越新越好。新版本可能有兼容性问题,尤其是和老框架搭配时。我一般选比最新版落后一到两个版本的,稳定性最好。
第三条:环境变量改完一定要重启终端。这个坑我踩过无数次,改完 PATH 发现不生效,折腾半天才想起来没重启终端。Windows 上尤其要注意,CMD 和 PowerShell 都要重启。
第四条:cuDNN 复制文件时用命令行。Windows 上手动拖拽容易拖错层级,用xcopy或robocopy命令复制更可靠:
xcopy /y /e "cudnn\bin\*" "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin\"第五条:多版本共存时用 alias 切换。前面说过的 alias 方法,比改软链接方便,而且不影响其他终端。
第六条:遇到问题先查官方文档。NVIDIA 的官方文档其实写得很详细,包括兼容性表格、安装指南、已知问题。很多人遇到问题就到处搜博客,其实官方文档里都有。我一般先查官方文档,再查社区。
第七条:WSL2 里不要装 Linux 驱动。这个坑很隐蔽,装了之后nvidia-smi会报错,而且很难排查。记住 WSL2 的驱动是宿主机提供的,Linux 里只装 Toolkit。
第八条:显存不够先降 batch size。CUDA out of memory是最常见的运行时错误,90% 的情况是 batch size 太大。先降 batch size,再考虑其他优化。
环境搭建这件事,说难不难,说简单也不简单。核心就是搞清楚各个组件的关系,按正确的顺序装,装完验证。把这套流程走顺了,以后换机器、升级版本都是半小时的事。我现在的习惯是每台新机器都按这个流程走一遍,基本不会出问题。