Bump the llama.cpp submodule to d7ff3afb9, which fixes the non-flash-attention
attention path on HRX0 so MoE models whose full context exceeds HRX0's 32768
flash-attention KV cap no longer fail with HTTP 500 "Compute error.":
- tensor_storage_relative_offset now accepts zero-byte (empty) source tensors,
so empty per-expert FFN views pass the graph-cache validation.
- the fused attention-output and routed-FFN dispatches only request the in-place
buffer alias when both source and target are transient (the layer output is an
external buffer), avoiding "value alias target is not transient".
- the MoE router SUM_ROWS/CLAMP claim is narrowed to the top-k router chain, so
GLM-4.7-Flash's sigmoid router no longer leaves an unsupported SUM_ROWS on HRX0.
Together with the #97 context default this makes serve_e2e pass on
Qwen3-Coder-30B-A3B-Instruct Q4_K_M and Qwen3.6-35B-A3B Q8_0, and a 2048-token
prompt returns HTTP 200 (was 500) on Qwen3-Coder-30B-A3B and GLM-4.7-Flash.
Fixes #95.
Problem
tests/serve_e2e.sh build/1bit <model> hrxreturned HTTP 500{"error":{"code":500,"message":"Compute error."}}for MoE models whose full context exceeds HRX0's flash-attention KV cap (32768 tokens). At 262144 tokens HRX0 declines flash attention, llama.cpp disables FA for the whole model, and the non-FA attention path fails to compile on HRX0:Root cause & fix (in the
llama.cppsubmodule,1bit-MONSTER/llama.cpp@d7ff3afb9)Three bugs in the HRX backend's non-FA path:
Zero-byte alias validation —
tensor_storage_relative_offsetrejected a zero-byte (empty) source tensor whenever a degenerate view into it had a non-zero offset (relative_offset > ggml_nbytes(source)→8192 > 0). Empty per-expert FFN views then failed graph-cache validation withmetadata does not match. Fixed by accepting a zero-byte source when the view is also zero-byte.Invalid in-place alias — the fused attention-output and routed-FFN dispatches requested an in-place buffer alias (
residual_input → output) whose target is the layer output (l_out), an external/persistent buffer, soalias_storagefailed withvalue alias target is not transient. The dispatches now only request the in-place alias when both source and target are transient, otherwise they fall back to non-fused ops.Sigmoid-router SUM_ROWS — GLM-4.7-Flash's sigmoid MoE router left an unsupported
SUM_ROWSon HRX0. Narrowed theSUM_ROWS/CLAMPclaim to the top-k router chain (SOFT_MAX → ARGSORT → GET_ROWS), so a sigmoid router leaves those nodes to another backend.Verification
tests/serve_e2e.sh build/1bit <model> hrxpasses (answers "Paris") on Qwen3-Coder-30B-A3B-Instruct Q4_K_M and Qwen3.6-35B-A3B Q8_0 (no regression).Notes / remaining gaps
answers Parischeck: the 500 is gone (HTTP 200), but the reply is wrong. This is a separate correctness bug in a fused batched dispatch (correct at small ubatch, wrong at larger ubatch), being investigated in parallel — it is not the 500 "Compute error." this PR fixes.-fa offflag still fails on the non-FA attention postprocess (qwen attention postprocess matcher rejected node): the non-FA attention input reshape has no standalone dispatch. The default serve (FA declined at full context) exercises the non-FA path and works.