Misc. bug: –mlock does not work on 7900 xtx and possibly all amd gpus

用户在 Windows 11 上使用预编译的 llama.cpp Vulkan 或 HIP 版本(llama-b9754-bin-win-vulkan-x64 和 llama-b9754-bin-win-hip-radeon-x64),通过 llama-server 加载模型并启用 --mlock

Misc. bug: --mlock does not work on 7900 xtx and possibly all amd gpus

Misc. bug: –mlock does not work on 7900 xtx and possibly all amd gpus

快速结论:该问题发生在 Windows 系统下使用 AMD GPU(如 7900 XTX)运行 llama.cpp 的 Vulkan 或 HIP 后端时,模型在空闲约 10 秒后 VRAM 内容被移出到系统内存,即使启用了 --mlock 也无法阻止。最可能的原因是 WDDM 驱动对无显示器连接的 GPU 的 VRAM 回收机制,而非 llama.cpp 本身的 bug。优先排查 GPU 是否连接了显示器,并考虑使用虚拟显示器锁头(dummy plug)作为临时解决方案。

问题场景

用户在 Windows 11 上使用预编译的 llama.cpp Vulkan 或 HIP 版本(llama-b9754-bin-win-vulkan-x64 和 llama-b9754-bin-win-hip-radeon-x64),通过 llama-server 加载模型并启用 --mlock 参数。当模型加载完成后,等待约 10 秒空闲时间,模型的所有内容会从 7900 XTX 的 VRAM 转移到系统内存中,导致再次调用模型时需要等待约 10 秒才能恢复工作。

该问题仅在 AMD GPU 上复现,同时安装的 NVIDIA RTX 5090(连接显示器)未出现此问题。

报错原文

--mlock has no effect. After about 10 seconds of idle ALL of the model is swapped from the 7900 xtx's Vram into system memory space over about 10 seconds where it remains until the model is called to do work where it most swap back resulting in around a 10 second delay before the model starts working every time.

原因分析

可能原因:该问题是由于 Windows 显示驱动模型(WDDM)的内存回收机制导致的,而非 --mlock 或 llama.cpp 的 bug。具体解释如下:

  • WDDM 将没有连接显示器的 GPU 视为“纯计算设备”。当该 GPU 空闲几秒钟后,驱动程序会自动将其专用 VRAM 内容迁移到系统 RAM 中(在任务管理器中显示为“缓存的”内存),以释放 VRAM 供其他潜在用途。
  • --mlock(以及 Windows 的 VirtualLock)只能锁定系统内存页面,无法控制 GPU 驱动的 VRAM 管理。因此即使启用了 --mlock,VRAM 内容仍然会被迁移。
  • NVIDIA RTX 5090 不会出现此问题,是因为它连接了显示器,被 WDDM 视为“显示附加 GPU”,其 VRAM 被锁定。
  • 报告者后来提到问题自行消失,推测可能与打开 AMD Adrenalin 监控页面和 HWinfo 有关,但具体原因不明。问题可能与 GPU 驱动内部状态或电源管理有关。
  • 报告者还观察到一个伴随现象:任务管理器中两个 GPU 每隔约 10 秒会短暂显示 100% 使用率(但实际不增加功耗),当 VRAM 停止分页时,该现象也同时消失。这可能是 WDDM 回收机制导致的伪报。

注意:报告者最终关闭了 Issue,确认这很可能不是 llama.cpp 的 bug。

环境排查

  • 操作系统:Windows 11
  • llama.cpp 版本:b9754(Vulkan 和 HIP 预编译版本),后续在 b9873 Vulkan 版本上确认问题仍然存在
  • AMD 显卡:7900 XTX(报告者推测可能影响所有 AMD GPU)
  • AMD 驱动版本:whql-amd-software-adrenalin-edition-26.6.4-win11-b
  • 其他 GPU:NVIDIA RTX 5090(连接显示器,无问题)、第三张 7900 XTX(通过 USB4 连接,无问题)
  • 命令行参数:启用 --mlock--no-mmap--gpu-layers 89

解决步骤

注意:以下解决方案来自社区讨论,并非官方修复。请自行评估风险。

  1. 优先尝试:报告者自行修复的方法(原因不明)
    • 打开 AMD Adrenalin 监控页面和 HWinfo,同时运行。
    • 报告者表示此操作后问题神秘消失,但不确定具体修复机制。此方法可能不具可重复性。
  2. 可优先尝试:虚拟显示器锁头(Dummy Plug)方案
    • 购买一个廉价的 HDMI 或 DisplayPort 虚拟显示器锁头(Headless Ghost Dongle),插入 7900 XTX 的显示器接口。
    • 在 Windows 显示设置中,将虚拟显示器配置为“扩展这些显示器”(Extend these displays),不要选择“复制”。
    • 可选:在高级显示设置中将虚拟显示器的分辨率设为 800×600,刷新率设为 24Hz,以降低帧缓冲区开销(约 300MB,对于 24GB 显卡可忽略)。
    • 原理:使 WDDM 将 7900 XTX 视为连接显示器的 GPU,从而锁定其 VRAM。
  3. 如果问题再次出现或需要更彻底的方案:
    • 考虑升级或降级 AMD 显卡驱动,尝试不同版本的 Adrenalin 驱动。
    • 检查电源管理设置:在 Windows 电源选项中,将 PCI Express 链接状态电源管理设置为“关闭”。
    • 在 AMD Adrenalin 软件中,检查 GPU 的电源管理和节能设置。

验证方法

加载任意模型后,等待 10-30 秒空闲时间,然后调用模型进行推理。观察是否仍然存在约 10 秒的初始延迟。同时使用任务管理器或 GPU-Z 监控 VRAM 使用率,确认模型数据在空闲期间是否仍保留在 VRAM 中。如果延迟消失且 VRAM 使用率保持不变,则问题已解决。

参考来源

ggml-org/llama.cpp #25313

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 12075

发表回复

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