1. 环境准备与版本选型:别让第一步就埋雷
装 CUDA 这件事,说简单也简单,说坑多那是真的多。我见过太多人上来就apt install nvidia-cuda-toolkit,结果装完发现版本对不上、驱动冲突、nvcc找不到,最后只能重装系统。所以这一节我们先不急着敲命令,把版本选型这件事聊透。
1.1 先搞清楚三个东西的关系
很多人搞混驱动、CUDA Toolkit、cuDNN 这三者的关系。我用一个生活化的类比来解释:
- N 卡驱动(Driver):相当于你电脑的“操作系统底座”,它负责让系统认识这张显卡。没有它,显卡就是一块砖。
- CUDA Toolkit:相当于“编译器 + 标准库”,它提供
nvcc编译器、CUDA 运行时库、数学库等。你写的.cu代码要靠它编译成 GPU 能执行的指令。 - cuDNN:相当于“深度学习加速插件”,它是建立在 CUDA 之上的高层库,专门为卷积、池化、RNN 等神经网络操作做了极致优化。TensorFlow、PyTorch 这些框架底层调用的就是它。
三者的依赖关系是:驱动版本决定了你最高能装哪个版本的 CUDA Toolkit,而 CUDA Toolkit 版本又决定了你能用哪个版本的 cuDNN。这个链条一旦某一环选错,后面全崩。
1.2 驱动版本怎么查、怎么选
在 Linux 下,查驱动版本最直接的方式是:
nvidia-smi输出右上角会显示Driver Version: 550.144.03这样的信息,同时还会显示CUDA Version: 12.4。注意,这里的CUDA Version不是说你已经装了 CUDA 12.4,而是说这个驱动最高支持到 CUDA 12.4 运行时。这是一个非常容易误解的点,我见过不少新手以为nvidia-smi显示了 CUDA 版本就等于装好了 CUDA,结果nvcc --version一敲,报“不是内部或外部命令”。
在 Windows 下,你可以通过“设备管理器 → 显示适配器 → 右键属性 → 驱动程序”查看,或者直接右键桌面打开 NVIDIA 控制面板,左下角“系统信息”里也有。
选驱动版本的原则很简单:如果你要用深度学习框架,优先看框架官方要求的 CUDA 版本,再反推驱动版本。比如 TensorFlow 2.5.0 官方要求 CUDA 11.2 + cuDNN 8.1,那你就需要驱动版本至少支持 CUDA 11.2。根据 NVIDIA 的兼容性表,Linux 下 460 系列驱动就够,Windows 下 461 以上即可。
1.3 CUDA Toolkit 版本选择的核心逻辑
CUDA Toolkit 的版本选择,核心就一句话:跟着你的深度学习框架走,不要跟着“最新版”走。
我整理了一份常见框架与 CUDA 版本的对应关系,方便你直接查表:
| 框架版本 | 推荐 CUDA | 推荐 cuDNN | 最低驱动(Linux) |
|---|---|---|---|
| TensorFlow 2.5.0 | 11.2 | 8.1 | 460.27 |
| TensorFlow 2.10+ | 11.8 | 8.6 | 520.61 |
| PyTorch 1.12 | 11.3 | 8.2 | 465.19 |
| PyTorch 2.0+ | 11.7 / 11.8 | 8.5+ | 515.43 |
| llama.cpp (CUDA 后端) | 11.7+ | 不需要 | 515.43 |
注意:cuDNN 从 8.x 开始不再需要单独注册账号下载,直接去官网下载对应版本即可。但 8.0 之前的版本仍然需要登录开发者账号。
如果你只是想做 CUDA 编程学习,不涉及深度学习框架,那直接装最新版 CUDA Toolkit 就行,驱动也升到最新,省心。
1.4 WSL2 场景下的特殊考量
现在越来越多人在 WSL2 里跑 CUDA,毕竟 Windows 下开发体验好,Linux 下跑训练方便。但 WSL2 的 CUDA 安装和原生 Linux 有本质区别:
WSL2 不需要在 Linux 侧安装显卡驱动。你只需要在 Windows 侧装好 N 卡驱动(建议 470 以上),WSL2 会自动通过/usr/lib/wsl/lib下的libcuda.so透传显卡能力。如果你在 WSL2 里又装了一遍 Linux 驱动,大概率会把系统搞崩。
WSL2 里装 CUDA Toolkit 的步骤和原生 Linux 基本一致,但要注意:不要装cuda-drivers这个包,只装cuda-toolkit即可。另外,WSL2 对 CUDA 版本有最低要求,太老的版本(如 CUDA 10.x)在 WSL2 下跑不起来,建议至少 CUDA 11.0 起步。
2. 驱动安装实操:从裸机到 nvidia-smi 正常输出
这一节我们分 Linux 原生、Windows 原生、WSL2 三种场景来讲,每种场景的坑点都不一样。
2.1 Linux 原生安装:推荐用官方 runfile
Linux 下装驱动有三种方式:apt 包管理、官方 runfile、以及 NVIDIA 的 CUDA 网络安装包。我实测下来,最稳的是官方 runfile,原因是 apt 源里的驱动版本往往偏旧,而且和 CUDA Toolkit 的版本匹配容易出问题。
具体步骤:
- 先去 NVIDIA 官网下载对应显卡的驱动 runfile。比如 RTX 4060 Ti,选 Linux 64-bit 版本,下载
.run文件。 - 禁用 nouveau 驱动。这是 Linux 开源的 N 卡驱动,不禁用的话会和 NVIDIA 官方驱动冲突。操作如下:
sudo bash -c "echo 'blacklist nouveau' >> /etc/modprobe.d/blacklist-nouveau.conf" sudo bash -c "echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist-nouveau.conf" sudo update-initramfs -u sudo reboot- 重启后进入文本模式(Ctrl+Alt+F3),关闭图形界面:
sudo systemctl stop gdm3 # 或者 lightdm,看你用的哪个- 给 runfile 加执行权限并安装:
chmod +x NVIDIA-Linux-x86_64-550.144.03.run sudo ./NVIDIA-Linux-x86_64-550.144.03.run安装过程中会问你几个问题,比如是否安装 32 位兼容库、是否更新 X 配置,一般选默认即可。如果提示“预编译内核模块失败”,说明你需要先装kernel-headers和kernel-devel,用uname -r查当前内核版本,然后apt install linux-headers-$(uname -r)。
- 安装完成后重启,运行
nvidia-smi,如果能看到显卡信息表格,说明驱动装好了。
实操心得:如果你之前用 apt 装过驱动,一定要先
apt purge nvidia-*彻底清理,否则 runfile 安装时会报“已存在驱动”而失败。清理后记得apt autoremove把残留依赖也删掉。
2.2 Windows 原生安装:DDU 清理是王道
Windows 下装驱动本来是最简单的,下载 exe 双击下一步就行。但如果你之前装过驱动、换过显卡、或者系统自动更新过驱动,直接覆盖安装大概率会出问题,表现为nvidia-smi能跑但 CUDA 程序报错,或者干脆蓝屏。
我的标准流程是:
- 下载DDU(Display Driver Uninstaller),这是一个专门清理显卡驱动残留的工具。
- 重启进入安全模式,运行 DDU,选择“清除并重启”。
- 重启后安装新驱动,安装时选“自定义安装”,勾选“执行清洁安装”。
- 安装完成后重启,验证
nvidia-smi。
注意:Windows 下
nvidia-smi的路径默认不在环境变量里,你需要去C:\Program Files\NVIDIA Corporation\NVSMI目录下运行,或者把这个路径加到 PATH 里。很多人说“nvidia-smi 不是内部或外部命令”,就是因为这个。
2.3 WSL2 安装:Windows 侧驱动是唯一入口
WSL2 的驱动安装最简单,因为你只需要在 Windows 侧装驱动。步骤:
- 在 Windows 侧安装最新 N 卡驱动(建议 470 以上,最好 520+)。
- 在 WSL2 里运行
nvidia-smi,如果能看到显卡信息,说明透传成功。 - 如果看不到,检查 WSL2 内核版本,运行
wsl --update更新内核。
WSL2 里不需要装 Linux 驱动,也不需要装cuda-drivers。如果你不小心装了,用sudo apt purge cuda-drivers删掉,然后重启 WSL2。
实操心得:WSL2 下
nvidia-smi显示的 CUDA Version 是 Windows 驱动的最高支持版本,不是你 WSL2 里装的 CUDA Toolkit 版本。要查 Toolkit 版本,还是得nvcc --version。
3. CUDA Toolkit 与 cuDNN 安装:细节决定成败
驱动装好了,接下来就是 CUDA Toolkit 和 cuDNN。这一节我按 Linux 原生和 WSL2 分别讲,Windows 原生的 CUDA Toolkit 安装基本就是下一步下一步,不展开。
3.1 Linux 原生安装 CUDA Toolkit
推荐用官方 runfile 安装,而不是 apt。原因是 apt 安装的 CUDA Toolkit 路径分散,而且版本切换麻烦。runfile 安装可以自定义路径,多版本共存也方便。
下载 runfile 后,执行:
sudo sh cuda_11.8.0_520.61.05_linux.run安装过程中,关键一步是取消勾选 Driver。因为我们已经单独装了驱动,如果再装一遍驱动会冲突。只勾选 CUDA Toolkit 即可。
安装完成后,需要配置环境变量。在~/.bashrc里加上:
export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH然后source ~/.bashrc,运行nvcc --version,如果输出版本信息,说明装好了。
注意:如果你之前装过其他版本的 CUDA,
/usr/local/cuda这个软链接可能指向旧版本。用ls -l /usr/local/cuda看一下,如果不是你想要的版本,手动改软链接:sudo ln -sf /usr/local/cuda-11.8 /usr/local/cuda。
3.2 cuDNN 安装:复制粘贴就完事
cuDNN 的安装本质就是把头文件和库文件复制到 CUDA 的对应目录。下载 cuDNN 的 tar 包后:
tar -xzvf cudnn-11.8-linux-x64-v8.6.0.163.tgz sudo cp cuda/include/cudnn*.h /usr/local/cuda-11.8/include sudo cp cuda/lib64/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*验证 cuDNN 是否装好,可以编译一个 CUDA Samples 里的deviceQuery,或者直接跑一个 PyTorch 程序看能不能调用 GPU。
实操心得:cuDNN 的版本必须和 CUDA 版本严格对应。比如 CUDA 11.8 只能用 cuDNN 8.6 及以上,用 8.1 会报
libcudnn.so.8: cannot open shared object file。下载时看清楚文件名里的cuda11字样。
3.3 WSL2 下安装 CUDA Toolkit 与 cuDNN
WSL2 下的安装和原生 Linux 几乎一样,但有两个坑:
- 不要装
cuda-drivers。WSL2 的驱动由 Windows 侧提供,Linux 侧装驱动会冲突。 /usr/local/cuda软链接可能不存在。WSL2 下安装完 CUDA Toolkit 后,需要手动创建软链接:
sudo ln -sf /usr/local/cuda-11.8 /usr/local/cudacuDNN 的安装和原生 Linux 完全一致,复制粘贴即可。
注意:WSL2 下跑 CUDA 程序,内存和显存是共享的。如果你的模型很大,可能会爆显存。建议在 WSL2 配置文件
.wslconfig里限制内存使用,避免 Windows 侧卡死。
4. 常见问题与排查技巧实录
这一节我整理了我这些年踩过的坑和帮别人排查过的问题,做成速查表,方便你直接对号入座。
4.1 nvcc 找不到:PATH 没配好
这是最高频的问题。nvidia-smi能跑,但nvcc --version报“不是内部或外部命令”。原因就一个:nvcc不在 PATH 里。
Linux 下,nvcc默认在/usr/local/cuda/bin,你需要把这个路径加到 PATH。Windows 下,nvcc在C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin,同样需要加到 PATH。
排查技巧:用
which nvcc(Linux)或where nvcc(Windows)查一下,如果找不到,就是 PATH 问题。另外,如果你装了多版本 CUDA,nvcc可能指向旧版本,用nvcc --version确认。
4.2 CUDA Samples 找不到:新版不再默认安装
CUDA 11.x 之后,Samples 不再随 Toolkit 一起安装,需要单独从 GitHub 克隆。很多人装完 CUDA 想跑deviceQuery验证,结果发现 Samples 目录是空的。
解决方法:
git clone https://github.com/NVIDIA/cuda-samples.git cd cuda-samples git checkout v11.8 # 切换到对应版本 make编译完成后,bin/x86_64/linux/release/下就有deviceQuery和bandwidthTest,跑一下就能验证 CUDA 是否正常工作。
4.3 多版本 CUDA 共存:软链接切换法
有时候你需要同时保留多个 CUDA 版本,比如一个用于 TensorFlow 2.5(CUDA 11.2),一个用于 PyTorch 2.0(CUDA 11.8)。这时候不要改 PATH,而是用软链接切换:
sudo ln -sf /usr/local/cuda-11.2 /usr/local/cuda然后source ~/.bashrc,nvcc --version就会显示 11.2。切换回 11.8 同理。
实操心得:多版本共存时,cuDNN 也要对应多个版本。我的做法是每个 CUDA 版本目录下放对应的 cuDNN,切换 CUDA 时 cuDNN 自动跟着切。
4.4 4060 Ti 支持的 CUDA 版本:别装太老的
RTX 4060 Ti 是 Ada Lovelace 架构,算力 8.9。这个算力需要 CUDA 11.8 及以上才支持。如果你装 CUDA 11.2,编译时会报nvcc fatal: Unsupported gpu architecture 'compute_89'。
所以 4060 Ti 用户注意:最低 CUDA 11.8,推荐 CUDA 12.x。驱动也要对应升级到 520 以上。
4.5 llama.cpp 与 CUDA 不兼容:编译参数是关键
llama.cpp 的 CUDA 后端对版本比较敏感。如果你用 CUDA 11.7 编译报错,大概率是因为 llama.cpp 用了某些新 API。解决方法:
make LLAMA_CUDA=1 LLAMA_CUDA_DMMV_X=32 LLAMA_CUDA_MMV_Y=1如果还报错,升级 CUDA 到 11.8 或 12.x。另外,llama.cpp 不需要 cuDNN,所以不用装。
4.6 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| nvidia-smi 报 command not found | 驱动没装或 PATH 没配 | 装驱动,加 PATH |
| nvcc 报不是内部或外部命令 | CUDA Toolkit 没装或 PATH 没配 | 装 Toolkit,加 PATH |
| nvidia-smi 显示 CUDA Version 但 nvcc 没有 | 只装了驱动没装 Toolkit | 装 CUDA Toolkit |
| 编译报 Unsupported gpu architecture | CUDA 版本太老 | 升级 CUDA |
| libcudnn.so.8 cannot open | cuDNN 没装或版本不对 | 装对应版本 cuDNN |
| WSL2 下 nvidia-smi 找不到 | Windows 驱动太老 | 升级 Windows 驱动 |
| 多版本 CUDA 切换后 nvcc 版本没变 | 软链接没更新 | 重建软链接 |
| CUDA Samples 目录为空 | 新版不默认安装 | 从 GitHub 克隆 |
最后分享一个小技巧:如果你不确定当前环境到底装了什么,跑一遍这个命令组合,基本能摸清底细:
nvidia-smi nvcc --version ls -l /usr/local/cuda cat /usr/local/cuda/version.json这四个命令跑完,驱动版本、CUDA 版本、软链接指向、详细版本信息全都有了。排查问题时先把这四个输出贴出来,能省很多沟通成本。
这个内容后续还可以这样扩展:如果你需要在 Docker 里跑 CUDA,可以研究nvidia-container-toolkit的安装和配置;如果你需要做 CUDA 迁移(比如从一台机器迁到另一台),重点检查驱动版本和 CUDA 版本的兼容性,以及 cuDNN 的路径配置。