
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时可能触发
解决步骤
- 立即绕过:在运行命令中添加
--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 - 根本修复:升级到包含 PR #24954 修复的 llama.cpp 版本(commit 在 be4a6a63e 之后,建议重新构建)。该 PR 修改了 HMX matmul 的流水线触发条件,避免了小剩余 batch 时的 hang。
- 手动修补(风险较高,可优先尝试但需谨慎): 如果无法升级,可尝试修改
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,且能正常打印模型回答,则问题已解决。



