Eval bug: Hexagon HMX matmul hangs on small remainder batch during prefill

用户在 Android 设备(Snapdragon,Hexagon HTP v73)上,使用 llama.cpp (version 9775, built with Clang 21.0.0 for Android aarch64) 的 llama-completion 工具加载 Qwen3-4B

Eval bug: Hexagon HMX matmul hangs on small remainder batch during prefill

Eval bug: Hexagon HMX matmul hangs on small remainder batch during prefill

快速结论:此问题发生在 Android 设备(Snapdragon)上运行 llama-completion 时,使用 Hexagon HTP 后端且默认 --ubatch-size 的场景下,prompt 预填充(prefill)阶段会卡死。优先尝试增大 --batch-size 2048 --ubatch-size 2048 或更新到包含 PR #24954 修复的版本(>= commit be4a6a63e 之后的版本)。

问题场景

用户在 Android 设备(Snapdragon,Hexagon HTP v73)上,使用 llama.cpp (version 9775, built with Clang 21.0.0 for Android aarch64) 的 llama-completion 工具加载 Qwen3-4B Q4_0 GGUF 模型。当使用默认的 --ubatch-size(默认值为512)进行 prompt 预填充时,程序卡死(hang)。通过添加 --batch-size 2048 --ubatch-size 2048 参数可以绕过此问题。触发问题需要特定长度的 prompt(issue 中提供了一个自包含的测试 prompt,长度足以触发 split prompt prefill 路径)。

报错原文

(无明显错误日志输出,表现为程序 hang 住,无进度或退出)
注:用户未提供具体错误信息,仅描述为 hangs during prompt prefill on Hexagon HTP with the default physical ubatch size.

原因分析

根据 issue 作者调试结果,问题根因指向 Hexagon HMX matmul 异步流水线(async pipeline)在处理小 remainder batch 时的缺陷。具体来说,当预填充阶段的 batch size 较小(例如默认 n_ubatch=512 时,剩余部分 batch 可能小于某个阈值),HMX matmul 的流水线调度异常,导致设备侧卡死。作者在本地测试通过修改 ggml/src/ggml-hexagon/htp/hmx-matmul-ops.c 中的流水线触发条件,将阈值从 m > 32 改为基于 2 * HMX_FP16_TILE_N_ROWS,可消除问题。最终修复由 PR #24954 提供。

环境排查

  • 工具版本:llama.cpp commit be4a6a63e (version 9775) 或更早版本
  • 后端:Hexagon HTP (HTP v73)
  • 硬件:Snapdragon 设备(Hexagon HTP0)
  • 模型:Qwen3-4B Q4_0 GGUF 格式
  • 操作系统:Android
  • 关键参数:默认 --ubatch-size(默认为512),未显式指定 --batch-size 时可能触发

解决步骤

  1. 立即绕过:在运行命令中添加 --batch-size 2048 --ubatch-size 2048 参数,例如:
    LD_LIBRARY_PATH=./lib \
    ADSP_LIBRARY_PATH=./lib \
    GGML_HEXAGON_OPPOLL=1 \
    ./bin/llama-completion \
      -m /data/local/tmp/gguf/Qwen3-4B-Q4_0.gguf \
      -sysf /data/local/tmp/llama_system_prompt.txt \
      -f /data/local/tmp/repro_prompt_self_contained.txt \
      --single-turn \
      --simple-io \
      --no-display-prompt \
      -t 4 \
      --ctx-size 2048 \
      -fa on \
      --batch-size 2048 \
      --ubatch-size 2048
  2. 根本修复:升级到包含 PR #24954 修复的 llama.cpp 版本(commit 在 be4a6a63e 之后,建议重新构建)。该 PR 修改了 HMX matmul 的流水线触发条件,避免了小剩余 batch 时的 hang。
  3. 手动修补(风险较高,可优先尝试但需谨慎): 如果无法升级,可尝试修改 ggml/src/ggml-hexagon/htp/hmx-matmul-ops.c 中流水线条件,将 m > 32 改为基于 2 * HMX_FP16_TILE_N_ROWS 的阈值。但此修改未经广泛测试,仅作为实验性方案。

验证方法

使用相同的命令(不添加 --batch-size 2048 --ubatch-size 2048)运行上述测试 prompt,观察是否在 prefill 阶段正常完成并输出结果。若程序不再 hang,且能正常打印模型回答,则问题已解决。

参考来源

ggml-org/llama.cpp #24963

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 9639

发表回复

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