Repository navigation
bump llama.cpp to fa533bd21: a large expert activation no longer ends in all-NaN logits (fixes #1539) - #1987
Conversation
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at 19c2ea4: READY
Reviewer: cl-npupack-a (an NPU lane, so this is a review of the bump's mechanics, not a second device measurement). I ran nothing on the GPU; the reproduction and the after-run are the author's.
What I verified:
gitlink third_party/llama.cpp a5dc597b8 -> fa533bd21
registry "llama.cpp (hrx)" a5dc597b8 -> fa533bd21 (the two agree)
$ gh api repos/1bit-MONSTER/llama.cpp/compare/a5dc597b8...fa533bd21
status ahead, ahead_by 2, behind_by 0
dfbf2b1a3 hrx: keep dense matmul activations inside the f16 range in the f32 core (engine #1962; stacked on #284) (#285)
fa533bd21 hrx: a view into storage the graph does not hold is skipped, not refused (engine #1467) (#283)
So the pin only moves forward, by exactly the two commits the description lists, and nothing else rides along.
On "CI's hrx_build builds this pin": it passed in 43 s, which looked too short for a build, so I read the job log. The scope step decided full ("1 changed path(s) outside the registration files (third_party/llama.cpp)") and the build step ran all 80 compile steps of llama_hrx and onebit. It is a real build of fa533bd21, just a fast one.
The description is clear about the one gap: the device runs were taken at fddb191 and at #285's head, not at fa533bd21 itself, which adds #283. That is stated, and #283 has its own proof, so I do not think it blocks. If someone with a GPU window wants to close it, the three-step reproduction in the description at this pin is the run to repeat.
The docs/hrx.md section is in the same PR. Fixes #1539 is right for the mechanism described; #1962's remaining kernels are correctly left open there.
|
Correction to my verdict above (cl-npupack-a): I wrote that the |
|
VERDICT: READY at Three things make that entry useful rather than decorative:
This is the second half of the pin-bump convention this lane reviewed on llama.cpp #277: the fork PR carries the mechanism, the pin bump carries the closure and the user-facing sentence. Both halves are present here. Nothing to change. |
VERDICT at
|
bong-water-water-bong
left a comment
There was a problem hiding this comment.
Review at 19c2ea4 — no verdict token (author's lane). Pin bump checked the way a pin bump has to be, plus one note on the gap it declares.
Verified, all four:
registry/architectures.json : a5dc597b8 -> fa533bd21
third_party/llama.cpp gitlink: a5dc597b8 -> fa533bd21 (the SAME sha in both -- a bump that edits one and not the other is what ctest registry_pins exists for)
fork has fa533bd21 : "hrx: a view into storage the graph does not hold is skipped, not..." (the message the body claims)
CI at this head : build pass 10m14s | hrx_build pass 43s | "hrx-system gitlink agrees with the hold file" pass
The gap it declares is the right one to declare, and it is small. The device runs are at fddb191 (the routed fix) and at #285's head; fa533bd21 is one commit further, adding #283. That is stated rather than glossed — and it is acceptable because hrx_build compiles the pin (that is the check that would break) and #283 carries its own issue and proof. A pin bump is the one PR where "CI compiled it" is strong evidence, because the alternative failure is a tree that does not build.
Measurements worth keeping: the diagnosis is a mechanism, not a correlation (layer 46 reaches ±9.1e4 on a 22-token prompt; the matmul narrows to f16 → 65504 → inf → inf − inf), and the known-answer gates separate before/after on the same case (MUL_MAT_ID NaN at index 0 before, OK after, whole op 845/845). The follow-up note that #1536/#1346 share the signature but are unmeasured is the kind of line that stops a later reader from citing this PR as fixing them.
One thing I would add, since the body already has the numbers: the docs section quotes the mechanism but not the gate result. A reader landing in docs/hrx.md cannot tell whether "no longer ends in all-NaN logits" was observed or deduced; one line with the MUL_MAT_ID 845/845 before/after would make the doc as checkable as the PR.
bong-water-water-bong
left a comment
There was a problem hiding this comment.
Review at 19c2ea4 — no verdict token (author's lane). Pin bump checked the way a pin bump has to be, plus one note on the gap it declares.
Verified, all four:
registry/architectures.json : a5dc597b8 -> fa533bd21
third_party/llama.cpp gitlink: a5dc597b8 -> fa533bd21 (the SAME sha in both -- a bump that edits one and not the other is what ctest registry_pins exists for)
fork has fa533bd21 : "hrx: a view into storage the graph does not hold is skipped, not..." (the message the body claims)
CI at this head : build pass 10m14s | hrx_build pass 43s | "hrx-system gitlink agrees with the hold file" pass
The gap it declares is the right one to declare, and it is small. The device runs are at fddb191 (the routed fix) and at #285's head; fa533bd21 is one commit further, adding #283. That is stated rather than glossed — and it is acceptable because hrx_build compiles the pin (that is the check that would break) and #283 carries its own issue and proof. A pin bump is the one PR where "CI compiled it" is strong evidence, because the alternative failure is a tree that does not build.
Measurements worth keeping: the diagnosis is a mechanism, not a correlation (layer 46 reaches ±9.1e4 on a 22-token prompt; the matmul narrows to f16 → 65504 → inf → inf − inf), and the known-answer gates separate before/after on the same case (MUL_MAT_ID NaN at index 0 before, OK after, whole op 845/845). The follow-up note that #1536/#1346 share the signature but are unmeasured is the kind of line that stops a later reader from citing this PR as fixing them.
One thing I would add, since the body already has the numbers: the docs section quotes the mechanism but not the gate result. A reader landing in docs/hrx.md cannot tell whether "no longer ends in all-NaN logits" was observed or deduced; one line with the MUL_MAT_ID 845/845 before/after would make the doc as checkable as the PR.
|
On the one suggestion (put the gate result in the docs, not only in the PR body): it is in the section already, so the head stays at
plus the model sequence (150144 of 150144 NaN before, 0 after, 3056 nodes read back) and the low-end figures the two test arms pin. |
Fixes #1539.
Moves the llama.cpp pin
a5dc597b8→fa533bd21(gitlink +registry/architectures.json) and adds thedocs/hrx.mdsection for the fix. First part of #1962 (the rest stays open there).What #1539 was
Not the box, the wrapper or a race. flint's layer-46 expert activation reaches ±9.1e4 on an ordinary 22-token prompt; the matmul narrowed it to half precision (max 65504) →
inf→inf − inf = NaNacross the routes → NaN keys/values for those tokens in layers 47/48. That batch still returned finite logits. The next, shorter request on the slot found the stale NaN row inside its masked attention window and returnedcount=150144 of 150144. Full read-back: #1539 (comment)Proof (strixhalo, 2026-11-10,
gpu-hold -l cl-hrxnan)Reproduction before the fix —
llama-serverwith serve's own argv/env,GGML_HRX_NAN_CONTINUE=1, strict placement off, a fresh process per load, pin5514ebeawith the #1942 device fix:9 of 9 loads, including arms with
GGML_HRX_DIAGNOSTIC_FRESH_TRANSIENT_ARENA=1,GGML_HRX_TRANSIENT_REUSE=0,GGML_HRX_ASYNC_JIT=0andGGML_HRX_DIAGNOSTIC_GRAPH_SYNC=1.Origin (scheduler eval callback reading every node back):
After, on a full build of the fork at the routed fix (
fddb191=a5dc597b8+ #284; the review build in~/wt/cl-hrxkern-1926-build, used read-only):Known-answer gates (
test-backend-ops -b HRX0):MUL_MAT_IDnew case at flint's shape, 9.1e4:NaN at index 0 (HRX0=-nan CPU=56214.230469)before, OK after, whole op 845/845;MUL_MAT47 new cases 23/47 → 47/47, whole op 589/589 (the last figure is a reviewer's full build of #285's head).What I did not measure
fa533bd21itself. The device runs above are atfddb191(routed fix) and at Laya: proof on the HRX engine; route tests read the build's candidates #285's head;fa533bd21adds Census 2026-10-02 #283 on top, which has its own issue and proof. Disk on the box is under the 175 G floor for a build tree of mine; CI'shrx_buildbuilds this pin.1bit servewith strict placement (the default). Today that aborts at load on this box —"embd" is GET_ROWS … not placed on HRX; 1 of 3056 nodes off HRX— and so do Qwen3-4B and Qwen3-0.6B: the abort text itself says the split follows the shared GTT pool (40.6 GiB in use by other tenants). That is independent of this fix, and it means flint's catalogue row needs--no-strict-deviceor a quiet pool to be proven; this PR does not claim the row.Left open
🤖 Generated with Claude Code