Misc. bug: Memory leak in the Vulkan engine

该报错是 llama.cpp 的 Vulkan 推理引擎在处理大量图像输入时出现内存泄漏,每次 Chat Completion 请求会额外增加约 300MB 显存/内存占用,直到系统内存耗尽被 Ubuntu OOM 杀掉。优先排查是否使用了 Vulkan 后端,以及是否调用的是 OpenAI 兼容接

快速结论:该报错是 llama.cpp 的 Vulkan 推理引擎在处理大量图像输入时出现内存泄漏,每次 Chat Completion 请求会额外增加约 300MB 显存/内存占用,直到系统内存耗尽被 Ubuntu OOM 杀掉。优先排查是否使用了 Vulkan 后端,以及是否调用的是 OpenAI 兼容接口进行批量图像处理。

适用环境:Linux 操作系统;llama.cpp 的 llama-server 模块;Vulkan 推理引擎;Qwen3-VL-2B 多模态模型;通过 OpenAI 兼容接口(/v1)发起 Chat Completion 请求;Java 客户端程序批量发送 base64 编码的 JPEG 图像。

最快修复方案:暂无确认的一步修复方案。已确认该 Issue 仍处于 bug-unconfirmed 状态,官方维护者表示需要更多复现细节才能定位。

注意事项:该问题仅在 Vulkan 引擎下被复现,尚未确认 CUDA 或其他后端是否存在同样问题。内存泄漏发生在每次图像请求后,累积到系统内存上限会导致进程被终止,目前没有官方补丁或配置项能够直接规避。

问题场景

用户通过 llama.cpp 的 llama-server 启动 Vulkan 推理引擎,加载 Qwen3-VL-2B-Instruct-UD-Q5_K_XL.gguf 多模态模型及对应视觉编码器(--mmproj mmproj-F32.gguf)。随后使用一个 Java 程序(基于 OpenAI Java SDK)通过 OpenAI 兼容接口持续向服务器发送约 500 张 JPEG 图像,请求模型生成标题、描述和关键词。每次请求完成后,进程内存占用持续增长约 300MB,直至 Ubuntu 系统因内存耗尽强制终止进程。

报错原文

Misc. bug: Memory leak in the Vulkan engine

原因分析

可能原因:Vulkan 推理引擎在处理多模态输入(尤其是图像张量)时,未能正确释放 GPU 缓冲区或主机侧内存映射,导致每次请求后残留约 300MB 不可回收内存。由于该问题仅在一次请求中涉及单张图像(约 500 张图片顺序发送),且每个请求都完整走完生成流程,可以排除上下文长度累积(-c 8192 固定)造成的线性增长,更可能指向 Vulkan 后端的资源生命周期管理缺陷。

目前该 Issue 尚未被官方确认(标签为 bug-unconfirmed),没有足够的崩溃栈或日志定位到具体渲染管线或内存分配器。请求中使用的 --image-min-tokens 1024--image-max-tokens 4096 以及 --kv-unified 参数是否与泄漏相关,仍需进一步验证。

环境排查

  • 确认 llama.cpp 构建时是否启用了 Vulkan 后端(-DGGML_VULKAN=ON),以及在运行 llama-server 时是否明确指定 Vulkan 设备。
  • 检查 Vulkan 驱动版本,建议使用最新 Mesa(RadV)或厂商驱动,排除驱动层内存回收异常。
  • 记录启动参数,重点核对 --load-mode mmap+mlock--kv-offload 的影响,mmap+mlock 会锁定内存页,可能导致内存回收行为与默认模式不同。
  • 确认系统内存总量及可用内存,观察进程 RSS(Resident Set Size)是否在每次请求后单调递增。
  • 如果可能,使用 CUDA 后端运行相同模型与请求,对比内存曲线,判断是否为 Vulkan 特有缺陷。

解决步骤

  1. 复现并记录日志:使用 Issue 中提供的启动参数运行 llama-server,添加 --log-file--log-timestamps,连续发送 10-20 次图像请求,观察内存曲线并保留日志。
  2. 缩小参数范围:尝试去掉 --load-mode mmap+mlock 改用 --load-mode mmap,或去掉 --kv-offload,观察内存泄漏是否仍然存在。
  3. 对比后端:如果系统有 NVIDIA GPU 或 CPU 后端可用,分别用 --n-gpu-layers 0(纯 CPU)和 CUDA 后端运行相同测试,验证泄漏是否仅存在于 Vulkan。
  4. 更新 llama.cpp 版本:检查最新 release 或 master 分支,确认是否有针对 Vulkan 内存管理的修复提交。
  5. 降低并发或批量大小:在客户端程序中加入请求间隔或限制每批请求数,观察内存回收是否有延迟,以暂时规避 OOM 风险(非根本修复)。
  6. 提交补充信息:若确认 Vulkan 专属问题,将该 Issue 更新为 confirmed,并附上详细的 server.log 和内存曲线截图,帮助维护者定位。

验证方法

修复或规避后,使用相同测试脚本连续发送至少 100 张图像请求,监控 llama-server 进程的 RSS 值。若内存占用在请求间隔期间没有持续净增长,或总占用保持在模型加载后初始值的固定倍数(如 2 倍以内),则视为已解决。若改用 CUDA 或 CPU 后端后内存曲线平稳,可进一步确认问题根因在 Vulkan 引擎。

参考来源

ggml-org/llama.cpp #28008

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21235

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注