2. 硬件与驱动排查:GPU型号与显存容量确认、NVIDIA驱动版本检查、CUDA与cuDNN版本兼容性、nvidia-smi命令详解
显存溢出,说白了就是你的显卡“内存”不够用了。但很多时候,问题并不出在模型太大,而是你压根没搞清楚自己手头的硬件到底什么水平。我见过太多同学,拿着4G显存的卡硬跑大模型,不爆才怪。
所以,排查的第一步,就是先摸清家底。咱们从最基础的硬件确认开始。
2.1 GPU型号与显存容量确认
你可能会说:“我买的什么卡我还不知道?” 嗯,还真不一定。我遇到过有人买到了刷了BIOS的假卡,系统里显示的型号和实际物理芯片不一样。所以,别信标签,信命令。
最直接的方法,就是看系统报告。在Linux下,我习惯用这个命令:
lspci | grep -i nvidia
这会列出所有NVIDIA的PCI设备。但信息比较简略,只能看到型号。要确认显存大小,还得靠 nvidia-smi,这个我们后面细说。
另外,有个小技巧:nvidia-smi --query-gpu=name,memory.total --format=csv。这个命令会直接输出GPU名称和总显存,一目了然。
2.2 NVIDIA驱动版本检查
驱动版本不对,CUDA根本跑不起来。我见过最离谱的一次,是有人装了最新的驱动,但CUDA Toolkit还是旧的,结果程序直接报“CUDA driver version is insufficient”。
检查驱动版本,用这个命令:
nvidia-smi
在输出的最上面一行,你会看到类似 Driver Version: 535.129.03 的信息。这就是当前驱动的版本号。
驱动版本和CUDA版本有对应关系。一般来说,新驱动支持旧CUDA,但反过来不行。比如,驱动535系列,最高支持CUDA 12.2。如果你装了CUDA 12.3,那就得升级驱动。
2.3 CUDA与cuDNN版本兼容性
CUDA是并行计算平台,cuDNN是深度学习加速库。它们俩的版本必须匹配,否则你的模型训练速度会慢得像蜗牛,甚至直接报错。
怎么查?首先,确认你安装的CUDA版本:
nvcc --version
这会输出类似 Cuda compilation tools, release 11.8, V11.8.89 的信息。
然后,去NVIDIA官网查cuDNN的兼容性表。我直接给你一个常用的对应关系:
| CUDA 版本 | cuDNN 推荐版本 | 备注 |
|---|---|---|
| 11.8 | 8.9.x | 稳定组合,PyTorch 2.0+ 常用 |
| 12.1 | 8.9.x 或 9.x | 新特性支持,但部分旧模型可能不兼容 |
| 12.2 | 9.x | 最新,建议新项目使用 |
检查cuDNN版本,可以看它的头文件:
cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
或者用这个命令:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
2.4 nvidia-smi命令详解
这个命令,可以说是GPU调试的瑞士军刀。我每天至少要用它十几次。咱们来拆解一下它的输出。
直接运行 nvidia-smi,你会看到类似这样的信息:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 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. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA A100 80GB Off | 00000000:00:04.0 Off | 0 |
| 0% 35C P0 45W / 300W | 0MiB / 81920MiB | 0% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+
咱们一行一行看:
- 第一行:驱动版本和CUDA版本。这个前面说过了。
- GPU 0:这是第0块GPU。如果你有多卡,会有GPU 0、GPU 1……
- Name:GPU型号,比如A100 80GB。
- Temp:温度。超过85°C就要注意散热了。
- Perf:性能状态,P0是最高性能,P12是最低。
- Pwr:Usage/Cap:当前功耗/最大功耗。如果功耗上不去,可能是供电不足或温度过高。
- Memory-Usage:显存使用情况。这是最关键的!
0MiB / 81920MiB表示用了0M,总共80G。如果接近满的,那就是显存溢出了。 - GPU-Util:GPU利用率。如果模型在跑但利用率很低,可能是CPU瓶颈或数据加载太慢。
除了基础输出,nvidia-smi 还有很多实用参数。我常用的几个:
nvidia-smi -l 1:每秒刷新一次,实时监控显存变化。调试显存泄漏时特别好用。nvidia-smi --query-gpu=memory.used,memory.free --format=csv:只输出显存使用和空闲情况,方便脚本解析。nvidia-smi pmon -c 1:显示每个进程的GPU使用情况,可以看到是哪个进程在吃显存。
nvidia-smi -l 1 看看显存是不是被其他进程占用了。我遇到过好几次,都是因为之前跑的进程没关,导致显存被占满。
最后,咱们用一张图来总结本章的知识体系:
这张图把咱们今天讲的内容串起来了。从GPU型号确认,到驱动版本检查,再到CUDA/cuDNN兼容性,最后用 nvidia-smi 做实时监控。每一步都是环环相扣的。
好了,硬件和驱动这块就聊到这儿。记住一句话:别让硬件问题浪费你的时间。先把这些基础排查做扎实了,后面调模型才能事半功倍。