1. 环境准备与版本选型:别让第一步就埋雷
装 CUDA 这件事,说简单也简单,说坑多那也是真多。我见过太多人上来就apt install cuda或者直接下载最新版 runfile 一顿操作,结果nvidia-smi和nvcc --version显示的版本对不上,TensorFlow 跑起来报libcudart.so找不到,最后只能重装系统。所以这篇东西我打算从最根上的逻辑讲起,把版本匹配、驱动安装、CUDA Toolkit 部署、cuDNN 配置、多版本共存、WSL2 场景、常见报错排查这一整条链路全部串一遍。不管你是刚拿到一张 4060Ti 的新手,还是要在服务器上维护多版本 CUDA 的老手,都能从里面找到能直接抄的步骤和踩过的坑。
先明确一个核心概念:N 卡驱动(Driver)和 CUDA Toolkit 是两码事。驱动是操作系统和显卡硬件之间的桥梁,CUDA Toolkit 是建立在驱动之上的开发工具集合。驱动版本决定了你最高能支持到哪个 CUDA 版本,而 Toolkit 是你实际安装的开发环境。很多人搞混这一点,以为装了最新驱动就等于有了最新 CUDA,其实不是。nvidia-smi右上角显示的那个CUDA Version: 12.4指的是当前驱动最高支持的 CUDA 运行时版本,不是你系统里已经装好的版本。真正装没装 CUDA,要看nvcc --version。
1.1 驱动版本与 CUDA 版本的对应逻辑
这个对应关系是整件事的地基。NVIDIA 官方有一张兼容性表,但很多人懒得查,我直接把常用组合列出来,你对着自己的卡和需求选就行。
| 驱动版本区间 | 最高支持 CUDA 运行时 | 典型适用场景 |
|---|---|---|
| 550.xx 及以上 | CUDA 12.4 | 最新框架、40 系卡 |
| 535.xx | CUDA 12.2 | 主流稳定组合 |
| 525.xx | CUDA 12.0 | 30 系卡常见 |
| 515.xx | CUDA 11.7 | 老框架兼容 |
| 470.xx | CUDA 11.4 | 20 系及更早 |
这里有个关键点:驱动是向下兼容的。你装了 550 的驱动,照样能跑 CUDA 11.8 的程序,因为 CUDA 运行时是随程序分发的。但反过来不行,驱动太老就跑不了新 CUDA。所以策略很清晰——驱动尽量装新一点,CUDA Toolkit 按你的框架需求来选。
那框架需求怎么定?以 TensorFlow 为例,2.5.0 这个版本对应的是 CUDA 11.2 + cuDNN 8.1,你要是给它配 CUDA 12,直接报错没商量。PyTorch 相对宽松一些,但每个版本也有明确的 CUDA 版本要求。所以正确的顺序是:先确定你要用的框架版本,再查它要求的 CUDA 和 cuDNN,最后反推需要的最低驱动版本。这个顺序千万别搞反。
1.2 先查清楚你手里是什么卡
在动手之前,先确认硬件信息。Linux 下直接:
lspci | grep -i nvidiaWindows 下打开设备管理器看显示适配器,或者装好驱动后用nvidia-smi看。这一步的目的是确认显卡型号,因为不同架构的卡支持的 CUDA 版本上限不同。比如 4060Ti 是 Ada Lovelace 架构,算力 8.9,最低要求 CUDA 11.8 以上才能发挥完整性能。你要是给它装个 CUDA 10.2,虽然可能勉强跑,但很多新特性用不了。
另外注意一个热词里提到的情况——"amd显卡完美运行cuda"。这个说法要谨慎看待。AMD 卡原生是不支持 CUDA 的,因为 CUDA 是 NVIDIA 的专有技术。市面上所谓的"AMD 跑 CUDA"方案,本质上是通过转译层或者重编译的方式,把 CUDA 调用映射到其他计算后端上,性能和兼容性都有明显损失,而且配置极其折腾。如果你手里是 AMD 卡,老老实实用 ROCm 或者 DirectML 路线,别在 CUDA 上浪费时间。
2. N 卡驱动安装:选对方式比选对版本更重要
驱动安装这件事,Windows 和 Linux 完全是两个世界。Windows 下基本就是下载安装包一路下一步,Linux 下就有讲究了——用包管理器还是官方 runfile,用 DKMS 还是手动编译,每个选择都有它的适用场景。
2.1 Linux 下三种安装方式的取舍
先说要命的结论:能用包管理器就用包管理器,除非你有明确理由不用。
Ubuntu/Debian 系推荐用apt,因为包管理器会自动处理内核模块编译、依赖关系、后续升级。具体操作:
# 先添加官方源 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update # 查看推荐的驱动版本 ubuntu-drivers devices # 安装推荐版本(会自动选最合适的) sudo ubuntu-drivers autoinstall或者手动指定:
sudo apt install nvidia-driver-550装完重启,nvidia-smi能出结果就说明驱动 OK 了。
那什么时候用 runfile?两种情况:一是你的发行版包管理器里没有你需要的驱动版本,二是你需要精确控制安装路径和组件。runfile 的坑在于它会和包管理器打架,如果你之前用 apt 装过驱动,再跑 runfile 很容易出现库文件冲突。所以用 runfile 之前一定要先彻底清理旧驱动:
sudo apt purge nvidia-* sudo apt autoremove然后禁用 nouveau 开源驱动,这个步骤不能省,否则 runfile 安装会失败:
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf" sudo update-initramfs -u重启后确认 nouveau 没加载,再跑 runfile 安装。
注意:runfile 安装时如果提示需要关闭 X server,在服务器上一般没事,但在有桌面的机器上要先切到 tty 模式(Ctrl+Alt+F3),然后
sudo service lightdm stop或gdm stop,装完再启动。
2.2 Windows 下的驱动安装要点
Windows 相对简单,但有两个坑。第一,不要用 Windows Update 自动装的驱动,那个版本往往很老,而且可能缺组件。去 NVIDIA 官网手动下载,选对你的卡型号和系统版本。第二,安装时选"自定义安装",勾上"执行清洁安装",这样会清掉旧驱动残留,避免版本冲突。
安装完在命令行跑nvidia-smi,如果提示找不到命令,说明安装路径没加到 PATH 里。默认路径是C:\Program Files\NVIDIA Corporation\NVSMI,手动加一下环境变量就行。
2.3 验证驱动是否真正生效
装完驱动别急着装 CUDA,先确认驱动本身没问题。nvidia-smi能正常输出是最基本的,但还要看几个细节:
- Driver Version是否和你装的一致
- CUDA Version右上角显示的版本是否满足你的需求
- GPU 利用率、显存、温度是否正常读取
- 有没有
ERR!开头的报错
如果nvidia-smi报 "Failed to initialize NVML: Driver/library version mismatch",说明内核模块版本和用户态库版本不一致,通常是装了新驱动但没重启,或者 DKMS 编译失败。重启一般能解决,不行就重装驱动。
3. CUDA Toolkit 安装:runfile 与包管理器的实战对比
驱动搞定之后,接下来是 CUDA Toolkit。这里的选择同样影响后续维护成本。
3.1 包管理器安装 CUDA Toolkit
Ubuntu 下用 apt 装 CUDA Toolkit 的流程:
# 下载并安装 CUDA keyring wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt update # 安装指定版本的 CUDA Toolkit sudo apt install cuda-toolkit-12-4注意这里装的是cuda-toolkit-12-4而不是cuda。cuda这个包会连带装驱动,如果你已经装好驱动了,再装cuda可能把驱动覆盖掉。所以只装 toolkit,不装驱动,这是经验之谈。
装完之后配置环境变量,在~/.bashrc里加:
export PATH=/usr/local/cuda-12.4/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64:$LD_LIBRARY_PATH如果你想让系统默认用某个版本,可以创建软链接:
sudo ln -sf /usr/local/cuda-12.4 /usr/local/cuda这样 PATH 里写/usr/local/cuda/bin就行,切换版本时只改软链接。
3.2 runfile 安装的适用场景
runfile 适合需要精确控制组件、或者包管理器源里没有对应版本的场景。下载对应版本的 runfile 后:
sudo sh cuda_12.4.0_550.54.14_linux.run安装过程中会问你装不装驱动,如果你已经装好驱动了,这里一定要选 no,否则会覆盖。然后选 toolkit 组件,一般全选就行。安装路径默认/usr/local/cuda-12.4。
runfile 的好处是干净、可控,坏处是升级麻烦,每次都要手动下载新版本。而且它不会自动处理依赖,缺什么库要自己补。
3.3 验证 CUDA 安装是否成功
装完 CUDA Toolkit,第一件事是确认nvcc能用:
nvcc --version如果报 "nvcc 不是内部或外部命令,也不是可运行的程序或批处理文件",说明 PATH 没配好。Windows 下这个报错特别常见,因为 CUDA 的 bin 目录默认没加到系统 PATH。手动加上C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4\bin就行。
nvcc能输出版本号之后,再跑一个实际编译测试。CUDA Samples 是个好选择,但热词里提到"cuda samples找不到",这是因为新版本 CUDA 不再默认安装 samples 了。你需要单独从 GitHub 克隆:
git clone https://github.com/NVIDIA/cuda-samples.git cd cuda-samples make编译过程中如果报错,大概率是缺依赖,比如libfreeimage-dev、libgl1-mesa-dev这些,按提示装就行。编译完成后跑./Samples/1_Utilities/deviceQuery/deviceQuery,能看到显卡信息就说明 CUDA 环境完全正常。
4. cuDNN 配置:最容易被忽略的细节
cuDNN 是 NVIDIA 的深度神经网络加速库,TensorFlow、PyTorch 这些框架都依赖它。但 cuDNN 的安装方式比较原始——下载压缩包,手动拷贝文件。这个过程中版本匹配和文件权限是两个高频坑点。
4.1 cuDNN 版本必须和 CUDA 严格对应
cuDNN 每个版本都明确标注了支持的 CUDA 版本。比如 cuDNN 8.9.7 支持 CUDA 11.x 和 12.x,但 cuDNN 8.1 只支持 CUDA 11.2 及以下。装错了版本,框架加载时会报libcudnn.so找不到或者符号未定义。
下载 cuDNN 需要注册 NVIDIA 开发者账号,这个没办法跳过。下载下来是个 tar.gz 包,解压后是cuda目录,里面有include和lib64。安装就是把文件拷到 CUDA 安装目录:
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz sudo cp cuda/include/* /usr/local/cuda-12.4/include/ sudo cp cuda/lib64/* /usr/local/cuda-12.4/lib64/ sudo chmod a+r /usr/local/cuda-12.4/include/cudnn*.h sudo chmod a+r /usr/local/cuda-12.4/lib64/libcudnn*最后两行 chmod 很关键,我见过有人拷完文件但权限不对,普通用户跑程序时读不到库文件,排查半天才发现是权限问题。
4.2 验证 cuDNN 是否可用
cuDNN 没有像nvcc那样的命令行工具,验证方式是编译一个用到 cuDNN 的程序,或者直接跑框架。最直接的是用 PyTorch:
import torch print(torch.backends.cudnn.version()) print(torch.cuda.is_available())如果输出了 cuDNN 版本号且is_available()返回 True,说明整条链路都通了。
5. 多版本 CUDA 共存与切换:服务器维护的必修课
实际工作中经常遇到这种情况:老项目要 CUDA 10.2,新项目要 CUDA 12.4,你不可能每次切换都重装。多版本共存的核心思路是——每个版本装在自己的目录里,通过环境变量或软链接切换。
5.1 多版本安装的目录规划
CUDA 默认安装到/usr/local/cuda-<版本号>,这个设计本身就支持多版本共存。你只需要在装第二个版本时,确保不覆盖第一个版本的目录。用 runfile 安装时它会自动带版本号后缀,用 apt 装cuda-toolkit-12-4也是独立的。
装好之后,/usr/local/下会有多个目录:
/usr/local/cuda-11.8 /usr/local/cuda-12.4 /usr/local/cuda -> 软链接,指向当前默认版本5.2 切换版本的三种方式
方式一:改软链接。最直接,影响全局:
sudo rm /usr/local/cuda sudo ln -s /usr/local/cuda-11.8 /usr/local/cuda方式二:改环境变量。在~/.bashrc里改 PATH 和 LD_LIBRARY_PATH,只影响当前用户:
export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH方式三:用 update-alternatives。最规范,适合需要频繁切换的场景:
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-11.8 100 sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-12.4 200 sudo update-alternatives --config cuda然后交互式选择要用的版本。
实操心得:切换版本后一定要重新开一个终端,或者
source ~/.bashrc,否则环境变量不生效。另外,PyTorch 这类框架在安装时就绑定了 CUDA 版本,切换系统 CUDA 不一定能改变框架用的版本,因为框架自带 CUDA 运行时。这一点很多人搞混。
6. WSL2 下的 CUDA 安装:和原生 Linux 有什么不同
WSL2 装 CUDA 是近两年的热门需求,因为很多人想在 Windows 上做深度学习开发,又不想双系统。WSL2 的 CUDA 支持和原生 Linux 有本质区别——WSL2 不需要在 Linux 里装驱动,驱动由 Windows 提供。
6.1 WSL2 CUDA 的正确安装顺序
第一步,在 Windows 上装好 N 卡驱动。注意要装Windows 版驱动,不是 Linux 版。WSL2 通过 Windows 驱动直接访问 GPU,Linux 侧不需要独立驱动。
第二步,在 WSL2 的 Linux 发行版里装 CUDA Toolkit。这里只装 toolkit,不要装驱动。如果你用 apt 装cuda,它会把 Linux 驱动也装上,然后和 Windows 驱动冲突,导致 GPU 不可用。
# 在 WSL2 里 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 update sudo apt install cuda-toolkit-12-4注意源地址是wsl-ubuntu而不是ubuntu,这个细节很多人忽略,用错了源会装出问题。
第三步,验证。在 WSL2 里跑nvidia-smi,如果能看到显卡信息,说明 Windows 驱动和 WSL2 的 GPU 直通都正常。然后nvcc --version确认 toolkit 装好。
6.2 WSL2 场景的常见坑
WSL2 的 CUDA 有几个特有的坑。第一,显存是动态分配的,WSL2 不会预留显存,用多少占多少,但这也意味着显存信息在nvidia-smi里可能显示不准确。第二,性能有损耗,WSL2 的 GPU 直通虽然能用,但相比原生 Linux 还是有一定性能损失,尤其是多卡场景。第三,驱动更新后要重启 WSL2,在 PowerShell 里wsl --shutdown再重新进入,否则可能识别不到新驱动。
7. 常见报错与排查速查表
装 CUDA 这条路上,报错是常态。我把高频问题和排查思路整理成表,遇到问题直接对号入座。
| 报错信息 | 根本原因 | 解决方式 |
|---|---|---|
nvcc: command not found | PATH 未配置 | 把 CUDA bin 目录加入 PATH |
Failed to initialize NVML | 驱动版本不匹配 | 重启或重装驱动 |
libcudart.so not found | LD_LIBRARY_PATH 未配置 | 加入 CUDA lib64 目录 |
CUDA driver version is insufficient | 驱动太老 | 升级驱动 |
no CUDA-capable device detected | 驱动未加载或卡不支持 | 检查驱动和硬件 |
cudnn version mismatch | cuDNN 与 CUDA 不匹配 | 下载对应版本 cuDNN |
nvcc fatal: unsupported gpu architecture | 算力参数不匹配 | 调整-arch编译参数 |
7.1 几个排查思路的展开
nvcc: command not found这个最基础,但 Windows 下特别容易遇到。除了加 PATH,还要注意 CUDA 安装时有没有勾选"添加到系统环境变量"。如果没勾,手动加。
Failed to initialize NVML: Driver/library version mismatch这个报错的本质是内核模块和用户态库版本不一致。常见于 apt 自动升级了驱动但没重启。sudo reboot一般能解决。如果重启后还报,检查 DKMS 状态:dkms status,看 nvidia 模块有没有编译成功。
CUDA driver version is insufficient for CUDA runtime version说明你的驱动太老,跑不了当前 CUDA 版本。要么升级驱动,要么降级 CUDA。用nvidia-smi看驱动支持的最高 CUDA 版本,然后装不超过这个版本的 toolkit。
7.2 一个容易被忽略的排查工具
nvidia-smi -q能输出非常详细的 GPU 和驱动信息,包括驱动版本、CUDA 版本、显存、温度、功耗、ECC 状态等。排查问题时先跑这个,信息比默认输出全得多。另外dmesg | grep -i nvidia能看内核层面的驱动加载日志,驱动加载失败时这个很有用。
8. 框架侧的 CUDA 兼容性:别让环境白装
CUDA 装好了,框架跑不起来,这种情况太常见了。核心原因是框架对 CUDA 版本有硬性要求,而且很多框架自带 CUDA 运行时,和你系统装的 CUDA 是两套东西。
8.1 TensorFlow 与 CUDA 的版本绑定
TensorFlow 每个版本都明确要求特定的 CUDA 和 cuDNN 组合。比如 TF 2.5.0 要求 CUDA 11.2 + cuDNN 8.1,TF 2.10 之后开始支持 CUDA 11.8,TF 2.15 支持 CUDA 12.2。装错了版本,import 的时候就报错。
查版本对应关系最靠谱的方式是去 TensorFlow 官网的"Tested build configurations"页面,那里有完整的表格。别信博客里的二手信息,版本更新太快,博客往往过时。
8.2 PyTorch 的 CUDA 版本选择
PyTorch 相对灵活,因为它自带 CUDA 运行时。你装 PyTorch 时选的 CUDA 版本(比如cu118、cu121)决定了它用哪个 CUDA 运行时,和系统装的 CUDA 可以不一样。但驱动版本必须满足要求。
# 装 CUDA 11.8 版本的 PyTorch pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118装完验证:
import torch print(torch.version.cuda) # 显示 PyTorch 用的 CUDA 版本 print(torch.cuda.is_available())如果torch.version.cuda显示 None,说明装的是 CPU 版本,需要重装 GPU 版本。
8.3 llama.cpp 等推理框架的 CUDA 兼容问题
热词里提到 "cuda llama.cpp non compatible",这个问题的根源通常是编译时的 CUDA 架构参数不对。llama.cpp 编译时需要指定CMAKE_CUDA_ARCHITECTURES,如果没指定或者指定错了,编译出来的二进制在目标卡上跑不了。
cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=89这里的 89 对应 Ada Lovelace 架构(40 系卡)。30 系卡是 86,20 系是 75,具体查 NVIDIA 的算力表。架构参数不对,轻则性能差,重则直接报 "no kernel image is available for execution on the device"。
9. 版本升级与迁移的实操建议
CUDA 环境用久了总要升级,但升级比全新安装更容易出问题,因为旧版本的残留会干扰新版本。
9.1 升级前的清理清单
升级 CUDA 之前,先确认哪些东西依赖旧版本。跑一下:
# 看当前 CUDA 版本 nvcc --version # 看驱动版本 nvidia-smi # 看已安装的 CUDA 相关包 dpkg -l | grep cuda然后决定是原地升级还是并行安装。推荐并行安装,保留旧版本,新版本装到独立目录,通过环境变量切换。这样出问题可以随时回退。
9.2 迁移到新机器的注意事项
换机器时,CUDA 环境不能直接拷贝,因为驱动和内核模块是机器相关的。正确的迁移方式是:在新机器上按同样的版本组合重新装一遍,然后把项目代码和虚拟环境迁移过去。虚拟环境里的 PyTorch 等包如果绑定了特定 CUDA 版本,可能需要重装。
实操心得:我习惯在项目根目录放一个
environment.md,记录这个项目用的驱动版本、CUDA 版本、cuDNN 版本、框架版本和安装命令。换机器或者过半年再回来维护时,照着文档重装,比凭记忆靠谱得多。
10. 一些零散但重要的经验
最后这部分是我这些年踩坑攒下来的零碎经验,不成体系但都实用。
关于 4060Ti 的 CUDA 版本选择。4060Ti 是 Ada 架构,算力 8.9,建议 CUDA 11.8 起步,12.x 更好。驱动建议 535 以上。太老的 CUDA 版本虽然可能能跑,但发挥不出新架构的性能。
关于 CUDA 更新。小版本更新(比如 12.4.0 到 12.4.1)一般直接覆盖安装就行,大版本更新(11.x 到 12.x)建议并行安装。更新后记得重新编译依赖 CUDA 的项目,因为 ABI 可能变了。
关于 SLI 和 CUDA。SLI 是图形渲染的多卡技术,和 CUDA 计算是两回事。CUDA 多卡计算不需要 SLI,直接用cudaSetDevice指定设备就行。别为了 CUDA 去组 SLI,没意义。
关于显存监控。nvidia-smi默认刷新一次就退出,用nvidia-smi -l 1可以每秒刷新,实时监控显存和利用率。调试 OOM 问题时这个很有用。
关于 CUDA 安装包体积。完整版 CUDA Toolkit 好几个 G,如果只需要运行时,可以装cuda-toolkit而不是cuda,体积小很多。如果只是跑现成的框架,甚至可以不装 toolkit,因为框架自带运行时,只需要驱动就行。
关于环境变量污染。多个 CUDA 版本共存时,PATH 和 LD_LIBRARY_PATH 的顺序很重要。排在前面的优先。如果发现nvcc版本和预期不符,先which nvcc看用的是哪个路径的。
关于容器场景。Docker 里用 CUDA 需要装nvidia-container-toolkit,然后运行时加--gpus all。容器里的 CUDA 版本可以和宿主机不同,因为容器自带运行时,但驱动是共享宿主机的。这个特性让容器成为多版本 CUDA 隔离的好方案。
关于 conda 环境。conda 可以装cudatoolkit和cudnn,这些是 conda 打包的版本,和系统 CUDA 独立。用 conda 装框架时,它可能自动装 conda 版的 CUDA,这时候系统 CUDA 版本就不那么重要了。但 conda 版的 CUDA 有时缺一些组件,编译自定义算子时可能出问题。
关于驱动自动更新。Ubuntu 的 unattended-upgrades 有时会自动升级驱动,导致内核模块和用户态库版本不一致。生产环境建议锁定驱动版本,或者至少知道怎么回退。
关于nvcc和nvidia-smi版本不一致。这是正常的,因为nvidia-smi显示的是驱动支持的 CUDA 版本,nvcc显示的是 toolkit 版本。两者可以不同,只要驱动支持的版本不低于 toolkit 版本就行。
关于卸载。apt 装的用apt purge,runfile 装的用/usr/local/cuda-X.X/bin/cuda-uninstaller。卸载后记得清理残留的/usr/local/cuda软链接和/etc/ld.so.conf.d/下的配置文件,否则可能影响下次安装。
关于权限。CUDA 安装目录默认 root 所有,普通用户编译时如果需要写权限,要么用 sudo,要么改目录权限。但改权限有安全风险,建议只在开发机上这么做。
关于磁盘空间。CUDA Toolkit 加 cuDNN 加多个版本,很容易占几十 G。装之前确认/usr/local所在分区有足够空间。空间不够时,可以只装需要的组件,比如只装cuda-compiler和cuda-libraries,不装文档和示例。
关于网络问题。下载 CUDA 和 cuDNN 时如果网络不稳定,runfile 可能下载不完整,安装时报校验失败。下载完先核对 MD5,别嫌麻烦。cuDNN 的下载需要登录,如果浏览器下载慢,可以试试用下载工具,但注意别用来源不明的镜像。
关于 WSL2 的显存限制。WSL2 默认最多用宿主显存的一半,可以在.wslconfig里调整:
[wsl2] memory=16GB但显存限制是另一回事,WSL2 的 GPU 显存是动态的,一般不需要手动限制。
关于多用户环境。服务器上多个用户共用 CUDA 时,建议把 CUDA 装在系统目录,通过环境变量让每个用户选择自己的版本。不要每个用户装一份,浪费空间还容易冲突。
关于 CUDA 和显卡计算能力。编译 CUDA 程序时,-arch参数指定目标架构。可以指定多个,生成兼容多个架构的二进制,但体积会变大。只在自己卡上跑的话,指定单一架构就行,编译更快。
关于nvidia-smi显示不全。有些消费级卡在nvidia-smi里不显示 ECC 等信息,这是正常的,消费卡不支持 ECC。别以为是驱动问题。
关于驱动安装后的黑屏。Linux 下装完驱动重启黑屏,通常是 nouveau 没禁用干净,或者驱动和内核版本不匹配。进 recovery 模式,检查dmesg日志,重新禁用 nouveau 再装。
关于 CUDA 的日志。CUDA 程序报错时,设置CUDA_LAUNCH_BLOCKING=1可以让错误同步返回,方便定位。默认是异步的,报错位置可能不准。
关于 cuDNN 的 frontend。新版 cuDNN 引入了 frontend 库,编译时需要链接libcudnn_frontend。如果报找不到这个库,检查 cuDNN 版本和链接参数。
关于 TensorRT。TensorRT 也依赖 CUDA 和 cuDNN,版本要求更严格。装 TensorRT 之前先确认 CUDA 和 cuDNN 版本符合它的要求,否则装了也用不了。
关于 CUDA 的兼容包。NVIDIA 提供了cuda-compat包,可以让新驱动跑老 CUDA 程序,或者老驱动跑新 CUDA 程序(有限制)。这个包在容器场景很有用,但别指望它能解决所有版本问题。
关于环境隔离。最彻底的隔离方案是容器,每个项目一个镜像,CUDA 版本互不干扰。如果觉得 Docker 太重,conda 环境也能做到一定程度的隔离,但不如容器干净。
关于备份。装 CUDA 之前,如果系统已经配好了一套环境,先备份/usr/local/cuda的软链接指向和~/.bashrc里的环境变量。出问题时能快速恢复。
关于文档。NVIDIA 的官方文档虽然排版一般,但信息最准。遇到版本问题先查官方兼容性表,别信搜索引擎里的二手答案。CUDA Toolkit 的 release notes 里有详细的版本对应关系。
关于社区。NVIDIA 开发者论坛和 Stack Overflow 是排查问题的好去处,但提问时要把nvidia-smi、nvcc --version、系统版本、框架版本都贴出来,否则别人没法帮你。
关于心态。CUDA 环境配置是个耐心活,报错很正常。按顺序排查——驱动、CUDA、cuDNN、框架,一层一层确认,别跳步。每装完一层就验证一次,比全装完再排查高效得多。
我个人在实际操作中的体会是,CUDA 环境最怕的就是"想当然"。想当然以为驱动装了就行,想当然以为版本差不多就能跑,想当然以为报错是框架的问题。实际上大部分问题都出在版本匹配和路径配置上。把这两件事做扎实,CUDA 环境能省掉八成的麻烦。