RTX 4090D + llama_cpp:CUDA 卡死屏幕后,我转向了 Vulkan

0 阅读7分钟

本以为是显卡驱动问题,折腾半天才发现,真正的解法是我从未想过的 Vulkan。


写在前面:一次令人绝望的屏幕卡死

事情是这样的。

我的配置:RTX 4090D,24G 显存,64G 内存,Windows 10。本地跑 llama_cpp 加载 Qwen3.6-27B 模型,一切顺风顺水了好一阵子。

直到某天,我升级了 cuda 版本,问题来了——

cd llama-b9190-bin-win-cuda-12.4-x64
llama-server.exe -ngl 65 -c 145000 -ctk q8_0 -ctv q8_0 --reasoning off -m ../Qwen3.6-27B-IQ4_XS.gguf

屏幕直接卡死。不是程序崩溃,不是黑屏闪退,而是整个系统冻结,鼠标键盘全部失灵,连 Ctrl+Alt+Del 都调不出来,只能长按电源键强制关机。

这种体验,用一次就够了。


折腾之路:从升级驱动到怀疑人生

出了事之后的第一反应,当然是升级显卡驱动。

尝试结果
升级最新 NVIDIA 驱动无效,依然卡死
降级 CUDA 到 11.8最新版 llama cpp官方没有对应的Release,自己配置编译太麻烦
换 CUDA 13.1 版本试试无效,问题依旧

使用deepseek智能搜索功能,AI回答 RTX 4090D 在 Windows 10 下,与 CUDA 新版的某些 kernel 确实存在兼容性 bug。但降级太麻烦,而且之后llama_cpp的新版本出了新功能又要折腾,太麻烦了。

一个小插曲:有朋友建议我换 Linux,说 Windows 下跑 CUDA 本来就容易出问题。但我日常工作全在 Windows 上(还要打Windows上的游戏),为了跑个模型换系统,成本太高了,pass。


柳暗花明:Vulkan 版本

就在我准备妥协降级 CUDA 11.8 试一下的时候,突然注意到 llama_cpp 的 release 页面里,除了 CUDA 版本,还有一个 Vulkan 版本

说实话,第一反应是怀疑——Vulkan?那不是图形渲染 API 吗?跑 AI 推理?靠谱吗?

抱着"反正不会比现在更糟"的心态,下载试试:

cd llama-b9208-bin-win-vulkan-x64
llama-server.exe -ngl 65 -c 145000 -ctk q8_0 -ctv q8_0 --reasoning off -m ../Qwen3.6-27B-Q4_K_M.gguf

然后,奇迹发生了:

  • 不再卡死,稳定运行了很长一段时间,没有任何异常
  • 推理速度居然比 CUDA 版本还快
  • 显存占用也合理,27B Q4_K_M 量化模型稳稳跑在 22G 左右

那种感觉,就像你一直在用一把钝刀切菜,突然有人递给你一把锋利的厨刀,还说"这刀不要钱,随便用"。


为什么 Vulkan 能跑得这么好?

这恐怕是很多人和我一样的疑问。Vulkan 不应该是画图的吗?怎么跑到 AI 推理里来抢 CUDA 的饭碗了?

我来整理一下我了解到的原因:

1. Vulkan 不只是图形 API

很多人对 Vulkan 的印象还停留在"OpenGL 的继任者,用来渲染 3D 图形的"。但实际上,Vulkan 从设计之初就定位为一个通用并行计算平台,而不仅仅是图形 API。

Vulkan 提供了一个叫 Compute Shader 的机制,它允许开发者在 GPU 上运行任意并行计算任务,和 NVIDIA 的 CUDA、AMD 的 OpenCL 做的是同一件事——利用 GPU 的海量并行核心来加速计算。区别在于:

特性CUDAVulkan ComputeOpenCL
开发者NVIDIAKhronos 联盟Khronos 联盟
支持厂商仅 NVIDIANVIDIA、AMD、Intel、移动端NVIDIA、AMD、Intel、移动端
跨平台有限(主要 Linux/Windows)极佳(Windows/Linux/macOS/Android/iOS)较好
底层控制极高极高较高
AI 生态成熟度最成熟(CUDA 是事实标准)新兴,llama.cpp 带头推进一般

简单说,Vulkan Compute Shader 就是"非 NVIDIA 专属的 CUDA"。

2. llama.cpp 的 Vulkan 后端做得相当成熟

llama.cpp 项目对 Vulkan 后端投入了大量精力。它的 Vulkan 实现并不是简单地把计算任务扔给 GPU 就完事了,而是针对 LLM 推理做了大量优化:

  • 矩阵乘法优化:LLM 推理的核心是大规模的矩阵乘法。llama.cpp 的 Vulkan 后端实现了高度优化的矩阵乘计算,支持各种量化格式(Q4、Q5、Q8 等等),能充分利用 GPU 的计算单元
  • 内存管理:针对大模型推理时的显存瓶颈,Vulkan 后端实现了精细的内存分配策略,减少内存碎片和传输开销
  • 异步执行:Vulkan 的原生异步特性被充分利用,推理过程中的计算和数据传输可以并行执行,减少 GPU 等待时间
  • 管线融合:多个推理步骤可以在同一个管线中执行,减少状态切换的开销

3. RTX 4090D + CUDA 的兼容性痛点

这正是我遇到的核心问题。RTX 4090D 是面向中国市场的特供版本,和标准版 4090 在核心配置上有差异。有社区用户发现:

  • CUDA 的某些 kernel 编译产物在 4090D 上会触发 GPU hang,导致整个系统级死锁
  • 这不是驱动能修复的问题,而是 CUDA toolkit 层面和硬件微码之间的兼容性 bug
  • 降级到 CUDA 11.8 可以绕过问题,但代价是放弃对新特性的支持,而且配置繁琐

而 Vulkan 走的是完全不同的路径。它不依赖 CUDA toolkit,而是通过 NVIDIA 的 NVK(NVIDIA Vulkan) 驱动直接与 GPU 通信。这条路径绕开了有问题的 CUDA kernel,自然不会触发同样的 bug。

4. 性能对比:Vulkan 真的比 CUDA 慢?

在我自己的 RTX 4090D 上,实测结果如下(Qwen3.6-27B-Q4_K_M 模型):

指标CUDA 12.4Vulkan
推理速度 (token/s)~41 token/s~41 token/s
稳定性运行数小时后卡死长时间运行稳定
显存占用~22G~22G
CPU 占用较高较低

Vulkan 版本在推理速度上和CUDA差不多。这背后的原因:

  • NVIDIA 在 Vulkan 上的持续投入:NVIDIA 近年来大幅提升了 NVK 驱动的性能,在不少场景下已经能与 CUDA 掰手腕

当然,公平地说,在大规模训练场景下,CUDA 依然是王者。但在本地推理这个细分领域,Vulkan 已经足以和 CUDA 抗衡。

5. Vulkan 的跨平台优势

这一点虽然和我的直接需求无关,但值得提一下:

场景CUDAVulkan
NVIDIA 显卡
AMD 显卡
Intel Arc 显卡
macOS (Apple Silicon)✅ (MoltenVK)
移动端 GPU

如果你希望你的 AI 应用能跑在不同的显卡上,Vulkan 是唯一选择。llama.cpp 选择大力投入 Vulkan 后端,看中的也正是这一点。


我的最终方案

llama_cpp 本地推理
├── 显卡: RTX 4090D (24G)
├── 后端: Vulkan (替代 CUDA)
├── 模型: Qwen3.6-27B-Q4_K_M (27B 量化版)
└── 命令: llama-server.exe -ngl 65 -c 145000 -ctk q8_0 -ctv q8_0 --reasoning off -m ../Qwen3.6-27B-Q4_K_M.gguf

简单总结:

问题解决方式
CUDA 版本导致系统卡死换用 Vulkan 版本,彻底绕过问题
推理速度Vulkan 版本和 CUDA 差不多
担心稳定性长时间运行无异常,安心使用

给你的建议

如果你也遇到了 CUDA 版本在 Windows 上跑 llama_cpp 不稳定的问题,我的建议是:

建议说明
先试 Vulkan下载 llama.cpp 的 Vulkan 版本,替换 CUDA 版本,命令参数基本一样,开箱即用
不必纠结"图形 API 跑 AI"Vulkan 的 Compute Shader 就是为并行计算设计的,llama.cpp 的 Vulkan 后端已经非常成熟
4090D 用户特别注意如果用的是 RTX 4090D,优先选 Vulkan,CUDA 的坑暂时绕开
AMD/Intel 显卡用户Vulkan 是你唯一的选择,而且体验不差

这次折腾让我学到了一个重要教训:不要默认 CUDA 就是唯一答案。在本地 AI 推理这个场景下,Vulkan 已经是一个成熟、稳定、高性能的替代方案。有时候,换个思路,问题就迎刃而解了。

写于 Vulkan 版本稳定运行一周之后。llama_cpp 在后台安静地跑着,风扇声音轻柔,再也没有出现过卡死。世界很安静,推理速度还更快了,这就是最好的结果。


参考资料