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,那就得升级驱动。

避坑指南: 我曾经在Ubuntu上直接用apt安装驱动,结果装了个470的老版本,导致CUDA 11.8死活跑不起来。后来老老实实去NVIDIA官网下载.run文件手动安装,才解决问题。所以,别偷懒,去官网下。

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
核心原则: CUDA版本决定上限,cuDNN版本决定效率。两者版本差太多,要么跑不起来,要么跑得慢。我建议你固定一个组合,比如CUDA 11.8 + cuDNN 8.9,然后所有项目都用这个,省心。

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使用情况,可以看到是哪个进程在吃显存。
我的经验: 当模型报OOM(Out Of Memory)时,别急着调代码。先跑 nvidia-smi -l 1 看看显存是不是被其他进程占用了。我遇到过好几次,都是因为之前跑的进程没关,导致显存被占满。

最后,咱们用一张图来总结本章的知识体系:

硬件与驱动排查 GPU型号与显存 lspci / nvidia-smi NVIDIA驱动版本 nvidia-smi 第一行 CUDA与cuDNN nvcc / cudnn.h nvidia-smi 命令详解 显存使用 (Memory-Usage) GPU利用率 (GPU-Util) 实时监控 (-l 参数) 排查起点:先确认硬件,再检查驱动

这张图把咱们今天讲的内容串起来了。从GPU型号确认,到驱动版本检查,再到CUDA/cuDNN兼容性,最后用 nvidia-smi 做实时监控。每一步都是环环相扣的。

好了,硬件和驱动这块就聊到这儿。记住一句话:别让硬件问题浪费你的时间。先把这些基础排查做扎实了,后面调模型才能事半功倍。

可可精品资料库