Misc. bug: OpenVINO GPU code paths are silently disabled on GPU.N machines, causing wrong results and performance drops

在多 GPU 机器上使用 llama.cpp 的 OpenVINO 后端时,如果 OpenVINO 把设备枚举为 GPU.0、GPU.1 这种带编号的名字,后端内部大量与字符串 "GPU" 的精确比较会失配,导致设备回退 CPU、部分算子没有按限制路由、KV cache 留在主机、GQN 快速 at

快速结论:在多 GPU 机器上使用 llama.cpp 的 OpenVINO 后端时,如果 OpenVINO 把设备枚举为 GPU.0、GPU.1 这种带编号的名字,后端内部大量与字符串 “GPU” 的精确比较会失配,导致设备回退 CPU、部分算子没有按限制路由、KV cache 留在主机、GQN 快速 attention 未启用,最终表现为结果错误和大上下文下解码性能骤降。优先检查 GGML_OPENVINO_DEVICE 的取值以及日志里是否出现 fallback 提示。

适用环境:llama.cpp 0.4.1-dev(build 11003,commit 37b53fd45),Clang 24.0.0,Linux x86_64(Linux Mint 22.3,kernel 6.18.17),OpenVINO 2026.5.0,Level Zero 驱动 1.17.0,Intel Arc Pro B70(dGPU)+ Intel UHD Graphics 770(iGPU)。受影响模块为 libllama(core library)。Issue 标签为 bug-unconfirmed。

最快修复方案:暂无确认的一步修复方案。维护者已合并并关闭相关 PR,建议升级到包含该修复的 llama.cpp 版本后重新验证;在升级前,可按下方步骤用设备枚举与基准测试确认是否命中该问题。

注意事项:Issue 本身标注 bug-unconfirmed,且评论仅说明对应 PR 已合并关闭,未给出具体 commit、版本号或逐条验证结果,因此修复细节需以合并后的代码为准。复现性能差异时需要使用对当前机器有效的 ZE_AFFINITY_MASK,否则对比数据不可比。

问题场景

用户在多 GPU 机器上运行 llama.cpp 的 OpenVINO 后端(如 llama-bench、test-backend-ops,加载 Qwen2.5-7B-Instruct-Q4_K_M 等模型)时触发。OpenVINO 会将多个设备枚举为 GPU.0、GPU.1 等带点编号的名字,而 llama.cpp 的 OpenVINO 后端中有约 20 处把设备名与字符串 “GPU” 做精确比较(可通过 git grep "== \"GPU\"" 查看),因此在设备名带编号的机器上出现两种都不理想的配置后果。

报错原文

GGML OpenVINO Backend: device GPU is not available, fallback to CPU
OpenVINO: using device CPU
  OPENVINO0: OpenVINO Runtime (64030 MiB, 64030 MiB free)

[MUL_MAT_ID] ERR = 81.610077935 > 0.000500000

相关测试结果原文:90 out of 92 cases fails, 2 not supported, 0 passes;MUL_MAT_ID 抛出 ov::Exception。

原因分析

根本原因是设备名匹配逻辑与 OpenVINO 实际返回的设备名不一致:

  • 当设置 GGML_OPENVINO_DEVICE=GPU 时,后端比较失败并回退到 CPU,日志输出 device GPU is not available, fallback to CPU,GPU 实际未被使用。
  • 当设置 GGML_OPENVINO_DEVICE=GPU.N(如 GPU.0、GPU.1)时,与 “GPU” 的比较返回 false,模型确实在 GPU 上执行(因为 ov::Core::get_available_devices() 返回带点的名字并能被找到),但引发一连串副作用:部分本应因已知限制路由到 CPU 的算子仍在 GPU 上执行,导致失败或结果错误;KV cache 留在主机而非设备;flash_attn_ext.cpp#L130 处的快速 GQN attention 在 GPU.N 上从未被启用,大上下文时性能显著下降。

该问题据报告从该后端最初版本起就存在。注意 Issue 标注为 bug-unconfirmed,上述结论来自报告者描述。

环境排查

  • 确认 llama.cpp 版本与 commit:0.4.1-dev(build 11003,commit 37b53fd45)。
  • 确认 OpenVINO 版本:2026.5.0。
  • 确认 Level Zero 驱动版本:1.17.0。
  • 确认 GPU 型号与是否为多 GPU 环境:Intel Arc Pro B70(dGPU)+ Intel UHD Graphics 770(iGPU)。
  • 确认操作系统与内核:Linux Mint 22.3,kernel 6.18.17。
  • 确认编译器:Clang 24.0.0,目标 Linux x86_64。
  • 确认设备枚举名称是否带编号(GPU.0、GPU.1 等)。
  • 注意:报告者提到需使用一个不含 PR #28549 所暴露阻塞问题(prompt 超过 512 tokens 报 res = -3)的 llama.cpp tag。

解决步骤

  1. 查看当前 OpenVINO 设备枚举名:GGML_OPENVINO_DEVICE=GPU.0 llama-bench --list-devices 2>&1 | grep "OpenVINO: using",确认输出是否为 OpenVINO: using device GPU.0。
  2. 验证使用 “GPU” 会回退 CPU:GGML_OPENVINO_DEVICE=GPU llama-bench --list-devices 2>&1 | grep OpenVINO,若出现 GGML OpenVINO Backend: device GPU is not available, fallback to CPU 和 OpenVINO: using device CPU,即命中该问题。
  3. 用算子测试确认正确性异常:GGML_OPENVINO_DEVICE=GPU.1 test-backend-ops test -b OPENVINO0 -o MUL_MAT_ID -p "type_a=f16,",观察是否出现大量失败及巨大误差。
  4. 用基准测试对比性能(注意使用对当前机器有效的 mask):
    A="-m $HOME/models/Qwen2.5-7B-Instruct-Q4_K_M.gguf -ngl 999 -p 512 -n 128 -d 128,4096 -r 3"
    GGML_OPENVINO_DEVICE=GPU.1 llama-bench --device OPENVINO0 $A
    ZE_AFFINITY_MASK=0 GGML_OPENVINO_DEVICE=GPU llama-bench --device OPENVINO0 $A
  5. 确认问题后升级到包含对应合并 PR 的 llama.cpp 版本(可优先尝试),再重复上述验证。

验证方法

升级后重新执行设备枚举命令,确认不会再出现 device GPU is not available, fallback to CPU 的异常回退;重复 test-backend-ops 的 MUL_MAT_ID 测试,确认失败用例和 [MUL_MAT_ID] ERR = ... 报错消失;再用 llama-bench 在相同 mask 与参数下对比 tg128 @ d4096 等指标,确认大上下文解码性能恢复到与 “GPU” 命名场景相近的水平(报告者观测到 GPU.1 时 tg128 @ d4096 为 9.6,而 Arc 作为 GPU 时为 41.1)。

参考来源

ggml-org/llama.cpp #29235

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27740

发表回复

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