摘要

本机 RTX 3090 + Ubuntu 22.04,torch 2.11.0+cu130 一上来就报 The NVIDIA driver on your system is too old (found version 12020),本以为是 PyTorch 安装错了,没想到真正的元凶是 NVIDIA 驱动版本。本文完整记录了从 535 升级到 580.159.03 的全过程,包括 libnvidia-* 依赖冲突、dpkg held package 拦截以及 Wayland EGL 缺失的坑,最终让 torch.cuda.is_available() 顺利返回 True,并附上对 vLLM 0.22.1 用户的后续建议。


一、问题背景

最近升级了 PyTorch 到 2.11.0+cu130,本以为性能会原地起飞,结果一运行就遇到这个熟悉的警告:

UserWarning: CUDA initialization: The NVIDIA driver on your system is too old
(found version 12020). Please update your GPU driver ...
torch.cuda.is_available()
False

环境信息:

  • GPU:NVIDIA GeForce RTX 3090
  • 系统:Ubuntu 22.04.5 LTS
  • PyTorch:2.11.0(CUDA 13.0 构建)
  • vLLM:0.22.1

found version 12020 意味着当前驱动最高支持到 CUDA 12.2,PyTorch 需要的 CUDA 13.0 完全不在能力范围内。一句话:驱动太老了,必须升级。


二、第一反应:升级 PyTorch 反而是弯路

第一直觉是装错了 PyTorch 版本。想着既然驱动只支持到 12.2,那就回退到 cu121

python -m pip uninstall -y torch torchvision torchaudio
python -m pip install torch torchvision torchaudio \
  --index-url https://download.pytorch.org/whl/cu121

但 vLLM 0.22.1 在依赖里强约束torch,回退版本直接 pip check 报错。为了一个旧驱动去改整个推理栈是不划算的,所以正确方向是:升级 NVIDIA 驱动。


三、查清驱动现状

nvidia-smi

输出关键信息:

Driver Version: 535.129.03
CUDA Version: 12.2

535 系列最高只支持 CUDA 12.2,PyTorch 2.11+cu130 需要 CUDA 13.0,必须使用 580+ 系列驱动(CUDA 13 引入的最低版本)。

查看可用的 580 驱动

apt-cache policy nvidia-driver-580

仓库里有:

nvidia-driver-580:
  候选: 580.159.03-0ubuntu0.22.04.1

版本合适,可以装。


四、第一道坎:apt 依赖冲突

直接安装会失败:

sudo apt install nvidia-driver-580

报错显示 libnvidia-cfg1-535libnvidia-gl-535nvidia-driver-535 等包互相冲突,原因是旧的 535 用户态库还留在系统里。

解决方法:先卸载 535 整套。

sudo apt remove --purge -y \
  nvidia-dkms-535 \
  nvidia-driver-535 \
  nvidia-compute-utils-535 \
  nvidia-utils-535 \
  nvidia-kernel-common-535 \
  nvidia-kernel-source-535 \
  'libnvidia-cfg1-535' \
  'libnvidia-common-535' \
  'libnvidia-compute-535' \
  'libnvidia-decode-535' \
  'libnvidia-encode-535' \
  'libnvidia-extra-535' \
  'libnvidia-fbc1-535' \
  'libnvidia-gl-535' \
  xserver-xorg-video-nvidia-535

注意:i386 版本的 libnvidia-*-535:i386 也要一起删,否则多架构库里残留的旧库仍然会顶住 580 的安装。


五、第二道坎:535 包被 hold

执行上面那条命令时再次失败:

下列软件包有未满足的依赖关系:
 nvidia-dkms-535 : 依赖: nvidia-kernel-source-535 ...
E: 错误,pkgProblemResolver::Resolve 发生故障

这是因为系统中存在 apt-mark hold 的旧包。apt install -s 会忽略 hold,而真实的 install 不会,所以模拟和实际结果不一致是经典症状。

查看所有被 hold 的包

apt-mark showhold

本机一长串 NVIDIA 包全在 hold 列表里。直接全部解锁:

sudo apt-mark unhold $(dpkg --get-selections | awk '$2=="hold" {print $1}')

六、第三道坎:libnvidia-egl-wayland1 装不进去

再次安装 nvidia-driver-580,提示:

libnvidia-gl-580 : 依赖: libnvidia-egl-wayland1 但是它将不会被安装

模拟一下:

apt install -s libnvidia-egl-wayland1

模拟成功,但实际失败。说明有别的包在 hold 这个 Wayland EGL 桥。再次定向解锁:

sudo apt-mark unhold libnvidia-egl-wayland1

然后:

sudo apt install -y libnvidia-egl-wayland1
sudo apt install -y nvidia-driver-580
sudo reboot

注意:Wayland EGL 桥不依赖你是否用 Wayland 桌面,是 GL 渲染时需要用到的运行时库,所以即便纯服务器环境也得装。


七、收尾验证

nvidia-smi

在这里插入图片描述

nvcc --version

在这里插入图片描述

python -c "import torch; print(torch.cuda.is_available())"

在这里插入图片描述

至此,PyTorch 2.11+cu130 终于能正确识别 GPU,vLLM 0.22.1 也能在 3090 上正常启动推理服务了。


八、复盘清单

  1. 报错先看版本号found version 12020 不是 PyTorch 的问题,是驱动。
  2. 驱动优先于 PyTorch:遇到 cu12x / cu13x 报错时,升级驱动几乎总是最优解,降级 PyTorch 会污染整个推理栈。
  3. CUDA 13 → 驱动 580+:这是 NVIDIA 官方为 CUDA 13 发布的最低分支,别再用 535、545、550
  4. apt-mark hold 是隐藏 Boss:残留的 hold 会让模拟与实际结果不一致,apt-mark showhold 永远是排查第一步
  5. i386 多架构库别忘删:交叉架构库是依赖冲突的常见源头。
  6. 完整 reboot 不可省:仅重启终端不会加载新内核模块,驱动升级必须全机重启。

九、给 vLLM 用户的额外建议

  • 升级完驱动后建议跑一次 python -m pip check,确认 vLLM 0.22.1 的依赖树仍然一致。
  • 3090 显存 24GB,跑 7B/13B 量化模型没问题,跑 70B 走 CPU offload 比较勉强。
  • 如果升级到 PyTorch 2.11 后出现 triton 编译错误,先 pip install -U triton,再考虑 TORCH_CUDA_ARCH_LIST="8.6" python -m vllm.entrypoints.openai.api_server ... 这种方式强制编译到 3090 的 SM 8.6。

十、结语

驱动问题看起来是“环境层面”的小事,但实际处理起来经常被一堆 hold 列表和 i386 残留搞得焦头烂额。希望这篇记录能帮你少走几个坑。如果你在升级过程中遇到别的卡点,欢迎在评论区贴出 apt-mark showholdnvidia-smi 以及 pip show torch 的输出,咱们一起拆招。

祝你的 RTX 3090 在 PyTorch 2.11 + vLLM 0.22.1 上跑出漂亮的 tokens/s!


标签

#PyTorch #NVIDIA驱动 #vLLM


本文为原创内容,版权归作者所有,转载需注明出处。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐