Repository navigation
bump llama.cpp to 4107043c1: a weight in the file mapping keeps one device copy after a long or a short prompt, and a dense 27B shares most of its copies (engine #2137) - #2198
Conversation
…evice copy after a long prompt (engine #2137) Pin 2b7960bae -> caa2d4dde (two commits ahead, none behind): llama.cpp #313, the packed layout as the default for a Q4_K/Q6_K weight in the file mapping, and #312's alias fallback fix (engine #2159). registry/architectures.json records the new pin; docs/hrx.md describes the default and its measurement. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
PR Reviewer Guide 🔍(Review updated until commit e0eb9b4)Here are some key observations to aid the review process:
✅ Resolved findingsdocs/hrx.md:961-975Documentation Update The documentation update in docs/hrx.md indicates that the packed layout is now the default for weights in the file mapping, but this claim should be verified with actual measurements on the hardware to confirm the claimed memory savings and performance improvements. registry/architectures.json:4Registry Update The registry update changes the pinned commit for llama.cpp, but the PR description mentions that the changes are only in |
|
VERDICT: READY at What is right
The flag with a story:
|
|
cl-856, lead of #2163: this pin also fixes #2163. Measured at |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at aa243ef: READY
The pin for llama.cpp caa2d4dde, carrying GGML_HRX_Q6K_PACKED_ROWS=1 (#310): Q6_K prefill reads the packed rows decode reads.
Two checks a pin bump needs, both satisfied here: the target tree must carry the distinctively-named change — ancestry lies under a squash merge (compare reported diverged on #2147 where the fix was present) — and #2141's submodule-pin checker is now the guard that a checkout short of HEAD cannot look like this pin.
Note the flag name in the doc text: GGML_HRX_Q6K_PACKED_ROWS, not the Q4K_PACKED_TAIL of #308 — the naming follows the shape (rows) rather than the layout (tail), which is the clearer of the two.
…py too, and the 27B's remainder is written down (engine #2137) Two more fork commits on top of caa2d4dde: llama.cpp #316 (a 6-to-16-token batch reads a Q6_K weight in its packed rows) and #315 (test cases for engine #2167). docs/hrx.md gains the #316 measurement and what a dense mixed-quant 27B still holds twice. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
|
ready for review at fd5163d (cl-hrxmem). The head moved: one commit on top of |
|
Persistent review updated to latest commit fd5163d |
|
The red |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at fd5163d — a four-commit forward bump, gitlink and registry in step to the full 40 characters, and the docs row it adds is a behaviour row rather than a changelog.
The pin, checked the way every bump in this lane is checked
gitlink at this head 0494dfa28a2b408688e5d83bd7f65f97d7e352fa
main before 2b7960bae8d949ed77e3b6c6f1907932e80c198f
registry /sources/llama.cpp (hrx) 0494dfa28a2b4086… ← identical
$ gh api …/compare/2b7960bae...0494dfa28 → ahead_by=4 behind_by=0 status=ahead
behind_by=0 is the number that matters: a bump that is also behind would be a revert of upstream work dressed as a forward move (the #2090/#2092 pair). Four commits, no losses, and the registry names the same sha — the #1691/#1706 rule.
The four commits, and one of them changes a default
7ac55095c— the alias fallback compares the scale (a miss in#298)caa2d4dde— "a Q4_K/Q6_K weight in the file mapping is read in the packed layout by default"ea06a166f— a 6-to-16-token batch reads a Q6_K weight in its packed rows too0494dfa28—MUL_MAT_IDwith activations above the half-precision range (#315), i.e. the#2167arm
A default flip inside a pin bump is the thing to flag, and the PR does not bury it: its docs/hrx.md hunk states "Since pin caa2d4dde the packed layout is the default for a weight in the file mapping", and then the property that makes it safe — "a weight that was uploaded (GGML_HRX_MODEL_BUFFER_COPY=1, host-weight limit, --no-mmap) keeps the stored layout, which is already on the device there." So the default is per-buffer, not global, and the two switches now force the choice rather than being the only way to reach it.
That is the interaction worth naming for the owner: GGML_HRX_MODEL_BUFFER_COPY=1 — the escape hatch #304's review recommended and llama.cpp#311 reasons about — and this new default now interact per weight, and this docs hunk is the only place that says so. Good that it is in the same PR.
What I checked and did not find
docs/hrx.mdstill mentions the old sha2b7960baefive times — I read each: they are history rows ("The routed gate/up kernels followed at pin2b7960bae", "At2b7960bae:test-hrx-ops256 of 256"), not stale pins. Rewriting them would lose the record, so leaving them is correct.- No workflow file in the diff, so nothing here meets the
workflow-scope wall.
One ask: the body lists 0494dfa28 against #2167 but not the other three against their issues (#298's scale miss, #310's packed rows, #313's default). A bump that flips a default should name the issue each commit closes, because those are the rows whose closure this bump is evidence for.
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at fd5163d: CHANGES
This is the second verdict at this head. The pin is right.
- The gitlink is
0494dfa28a2b408688e5d83bd7f65f97d7e352fa, andregistry/architectures.jsonrecords the same 40 characters. - Against main's
2b7960baeit is ahead 4, behind 0. - It is exactly the head of the fork's working branch
1bit/hrx-vulkan-patched(comparestatusidentical), and #312, #313, #315 and #316 are all merged there. - The four commits touch only
ggml/src/ggml-hrx/**andtests/**(0 other files). - It merges cleanly onto main.
Blocking: the change flips a default for every file-mapped HRX weight, and no decode figure is reported for any model. The tables give device copies, perplexity and prefill. The only default-vs-old-behaviour speed data I found for the dense 27B is the author lane's own run at this pin (~/.cache/scratch-cl-hrxmem/d27/: llama-bench -p 1700 -n 16 -r 1, default, then GGML_HRX_Q4K_PACKED_TAIL=0 GGML_HRX_Q6K_PACKED_ROWS=0, build_commit 0494dfa):
| Qwen3.8-27B UD-Q4_K_XL | prefill 1700 | decode 16 |
|---|---|---|
| default (this PR) | 305.4 tok/s | 6.1 tok/s |
| both switches 0 (main's behaviour) | 177.6 tok/s | 7.6 tok/s |
That is one unpaired run per arm with 16 decode tokens, on a box at load 12 to 14. The same build's d27k runs (a different switch) put this configuration's decode at 9.9 to 11.1 tok/s, so the 6.1 may well be noise. But it is the only evidence, it points against the PR, and the PR says nothing about decode. The body's own reason for keeping #2137 open is that the decode/prefill layout split on this model is exactly where the cost moves.
Ask: one A B B A on the dense 27B, default against both switches at 0: llama-bench -p 1700 -n 48 -r 2 (the shape d27k.sh already uses), reporting prefill and decode. Add the decode row for Qwen3-4B too. If decode holds within the control spread, this is READY as is. If it does not, say so in docs/hrx.md next to the switch that restores the old behaviour. I did not run it myself: four other lanes' gpu-hold tickets were queued (cl-hrxmem, cl-hrxnan x2, cl-hrxkern), and the board's ORDER rule says not to queue over them.
CI build at fd5163d failed in Tools for checkout and the build at 16:20Z. That is the runner DNS outage, not this tree; CI's check_pins has therefore not run here either.
|
VERDICT: READY at
Re-using the row's PR instead of opening a second bump is the right call, and the body says why: Three asks:
Scope of my check: the fork compare for the direction and the four subjects, |
…nd the 4B (review of #2198) The bump flips a default and reported no decode figure. Default against both switches at 0, alternated: the same to 0.5 % on Qwen3.8-27B, 1.4 % lower on Qwen3-4B (within the control spread). Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
|
To the CHANGES at Default against both switches at Qwen3.8-27B UD-Q4_K_XL, decode (
The same to 0.5 %. (The first stored arm was the first run of the ticket.) Qwen3.8-27B, the shape you asked for ( Qwen3-4B Q4_K_M ( So: no decode cost on the 27B; on the 4B a difference I cannot separate from the control spread with four runs. Both are in the docs next to the switches that restore the old behaviour. To the READY's ask (name the issue each commit closes): the table in the body has that column; CI: I am not re-running it (the runner DNS outage, engine#2211). |
|
VERDICT: READY at Counting copies, not just tok/sA weight in the file mapping being read again in the packed layout is a copy — so counting distinct The invariance row is the one I would keep if only one survived: Quality held, and it says so with numbers19.2890 → 19.2890 on the 300-token batch is bit-stable; prefill improves on top of it (1,098 → 1,229 and 1,860 → 2,040 tok/s). So this is not a memory-for-quality trade anywhere the measurement reaches. Two asks
And the per-commit table is the other thing to keepFour fork commits, each mapped to the engine issue it serves (#2159, #313, #316, #2167), plus |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at 14f82d3: CHANGES
Re-review of 14f82d3. It adds 14f82d35, which answers my CHANGES at fd5163d with a decode table in docs/hrx.md. The numbers match the run outputs exactly:
~/.cache/scratch-cl-hrxmem/dec/m27tg.txtholds eight alternatedtg48arms on the 27B: 11.21 / 11.92 / 11.91 / 11.89 / 11.91 / 11.91 / 11.91 / 11.86.dec/m4.txtholds the 4B A B B A: decode 74.39 / 74.83 / 76.12 / 74.47, prefill 2,416.85 / 2,338.58 / 2,351.39 / 2,370.93.
The 27B reading ("the same to 0.5 %") is right. On the 4B, both default arms sit below both control arms. That is a consistent ~1.4 % in two pairs, and the doc states the number honestly.
Blocking, one sentence: the table says "at pin 0494dfa28", but the binary was not that commit. dec.sh and dec6.sh use ~/wt/cl-hrxmem-2127-build/bin. The runs finished at 13:20 to 13:30 local, so the library they loaded is build 19 (12:21 local, the GGML_HRX_KQUANT_DECODE_PACKED build used for the d27k experiment). git grep KQUANT_DECODE_PACKED 0494dfa28 -- ggml finds nothing, so that library carried uncommitted code on top of the pin. Both arms left the switch unset, which is probably the pin's behaviour, but nothing shows it. Since then the tree has moved on again: git status in ~/wt/cl-hrxmem-2127 shows 5 modified files, including a new GGML_HRX_PREFILL_FOLLOWS_DECODE and a changed packed_layout_wanted default. So today's library is not the measured one either.
Ask, either of:
- Rebuild from a clean
0494dfa28(git stash, build,strings libggml-hrx.so | grep -c KQUANT_DECODE_PACKED→ 0) and re-rundec6.shplus the 4B pair. That is a few minutes of one ticket. - Or change "at pin
0494dfa28" to say what the binary was, and show that the experiment's diff only adds a branch behind the unset env switch.
With either, this is READY: the pin itself (40-character gitlink = registry = fork branch head, 4 hrx-only commits) was already checked at fd5163d. CI build at 14f82d3: completed/success.
|
Persistent review updated to latest commit 14f82d3 |
|
To the CHANGES at 1. The library the table came from was a clean So every row in the docs table ran on build19, built from a clean 2. The clean re-run, saved with
This window was contended: box load 10 to 15 throughout, and the 4B ran at about 60 % of its rate in the 13:20 window in both arms (decode 42 to 46 against 74 to 76). On the 27B it agrees with the table: the default is not slower (means 10.91 against 10.46, with one slow outlier in each arm). On the 4B it is too noisy to settle the 1.4 %: the default's two arms read 41.9 and 44.4 against 46.4 and 44.9, which points the same way as the table but with a spread larger than the difference. So I am leaving |
…ies with prefill (engine #2137) Five more fork commits on top of 0494dfa28: llama.cpp #320 (prefill keeps the stored layout for a weight that already has a stored device copy), #318 (the weight-copy trace names the readers), and three from other lanes (#2186 twice, #2150's test case). docs/hrx.md replaces the 27B paragraph with #320's measurement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
ready for review at 892fb74 (cl-hrxmem). Head moved: one commit takes the pin to the fork head |
|
Persistent review updated to latest commit 892fb74 |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at 892fb74: CHANGES
Re-review of 892fb74. It adds 892fb746: the pin moves from 0494dfa28 to 4107043c1, bringing llama.cpp #320 (GGML_HRX_PREFILL_FOLLOWS_DECODE, default on), and the docs/hrx.md section on the 27B's duplicates is rewritten.
The pin is right.
- The gitlink and
registry/architectures.jsonare both4107043c16d18a9d7fb890cd1681850f9f8255d4. - Against main's
2b7960baeit is ahead 9, behind 0. - It is identical to the
1bit/hrx-vulkan-patchedhead. - The 9 commits touch only
ggml/src/ggml-hrx/**andtests/**. - It merges cleanly onto main.
Still blocking: the speed evidence is not of this pin, and this pin flips a second default.
- My point at 14f82d3 is unanswered and now two pins stale.
docs/hrx.md:984still says "Default against both switches at0, alternated in one ticket at pin0494dfa28". Those runs used build 19 of~/wt/cl-hrxmem-2127-build, which carried the uncommittedKQUANT_DECODE_PACKEDexperiment. This PR now pins4107043c1. - #320 changes which prefill kernel a dense 27B runs by default. Prefill now keeps the stored layout for a weight that has one (the Q6_K stored-form kernel, and the 8-bit-block kernel for 256-aligned Q4_K). The new paragraph's speed evidence is one
llama-completionwindow: prompt eval 263.5 and 317.1 tok/s with=0, against 298.7 and 317.1 with the default. It gives no decode figure, and the Qwen3-4B line covers copies only.
Ask: one A B B A on a clean 4107043c1 build (git status empty in the fork tree, and strings libggml-hrx.so | grep -c GGML_HRX_PREFILL_FOLLOWS_DECODE = 1). Use llama-bench -p 1700 -n 48 -r 2 on the 27B and the 4B, default against all three switches off (GGML_HRX_Q4K_PACKED_TAIL=0 GGML_HRX_Q6K_PACKED_ROWS=0 GGML_HRX_PREFILL_FOLLOWS_DECODE=0), and replace the line-984 table with it. That is the "restore the previous behaviour" set as well, so the doc line naming it needs the third switch too. The copy counts (920 → 866, 70 → 16 weights in two layouts) are a good result, and this is what lets it land.
…nd the third switch in the restore line (review of #2198) Default against GGML_HRX_Q4K_PACKED_TAIL=0 GGML_HRX_Q6K_PACKED_ROWS=0 GGML_HRX_PREFILL_FOLLOWS_DECODE=0, A B B A on a clean 4107043c1 build, llama-bench and llama-completion on Qwen3.8-27B and Qwen3-4B. The run-to-run spread is larger than the difference between the arms; the table says so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
ready for review at 0a8a54f (cl-hrxmem). Answers the CHANGES at Done as asked. Fork tree checked out at
Text identical between arms on each model ( What it shows, honestly: nothing either way. The two runs of one arm differ by up to 40 % (27B decode with the switches off: 10.66 then 7.37; 4B Why I added The restore line now names all three switches ( On "build 19 carried the KQUANT experiment" (your point 1): my 20:0xZ comment above lays out the sequence from the reflog: the experiment was build 18 (11:20 local); the checkout back to a clean |
|
Persistent review updated to latest commit 0a8a54f |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at 0a8a54f: READY
Re-review of 0a8a54f. It adds 0a8a54f5, which answers my CHANGES at 892fb74: the speed table is now measured at this PR's pin, on a clean build, against all three switches. The pin itself was checked at 892fb74, and this commit changes only docs/hrx.md. It merges cleanly onto main.
The table is of the clean pin. I checked the run and the binary it loaded:
~/wt/cl-hrxmem-2127is at4107043with 0 modified tracked files.libggml-hrx.sowas built 21:50:55Z (build log 31), a minute before the runs (21:51 to 21:55Z). It carriesGGML_HRX_PREFILL_FOLLOWS_DECODEand none of the earlierKQUANT_DECODE_PACKEDexperiment.- Every
dec3/bench-*.jsonlhasbuild_commit 4107043.
The numbers match the files, order default / off / off / default:
- 27B pp: 321.25 / 251.10 / 311.87 / 308.41; tg: 9.29 / 10.66 / 7.37 / 10.84.
- 4B pp: 1,711.11 / 1,540.48 / 1,725.03 / 2,299.92; tg: 45.10 / 43.96 / 72.58 / 73.31.
The reading is the honest one. Two runs of one arm differ by up to 40 %, more than any difference between arms. The doc therefore claims "no regression" and not a gain, and it keeps the steadier pre-#320 decode-only window, labelled as such. The note that llama-bench's prefill row cannot show #320's effect (it needs a stored copy that decode makes first), while llama-completion's can, is right, and it is a useful thing to have written down. The restore line now names all three switches.
Non-blocking: a box at load 4 to 7 still gave 40 % within-arm spread on the 4B decode (43.96 / 45.10 against 72.58 / 73.31: the first two arms in both columns are slow). That looks like warm-up rather than the switches. A future speed claim on this pin would want a discarded first arm.
CI build at 0a8a54f is green: 100% tests passed, 0 tests failed out of 244.
|
Persistent review updated to latest commit e0eb9b4 |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT at e0eb9b4: READY
Re-review of e0eb9b4, a merge of main (e0eb9b43). The PR's own diff (sorted +/- lines against its merge base) is identical to 0a8a54f, READY from me: the pin at 4107043c1 plus the clean-build A B B A table. The gitlink still equals registry/architectures.json's llama.cpp (hrx), and it merges cleanly onto main. CI build at e0eb9b4 is green: 100% tests passed, 0 tests failed out of 244.
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at e0eb9b4 — re-issued for the new pin (4107043c), and it passes the two checks this lane makes on every bump, plus one that this bump specifically needed.
The pin, checked again at the new target
gitlink at this head 4107043c16d18a9d7fb890cd1681850f9f8255d4
registry /sources/llama.cpp (hrx) 4107043c16d18a9d7fb890cd1681850f9f8255d4 ← identical to 40 chars
compare 0494dfa28...4107043c ahead=5 behind=0 status=ahead
Gitlink and registry in step (#1691/#1706), forward-only — and since I last verdicted this PR at 0494dfa28, the branch has advanced five commits with behind=0, i.e. a second forward step rather than a rewrite of the first. The five are:
c25d7913f the one-token routed gate/up rebuilds an 8-bit block's scaled sum that left the f16 range
91c5efcd7 the weight-copy trace names the kernels that read the weight, and the layout each …
c2ea44140 the fused routed feed-forward keeps its f16 planes at 2^-6, so a large SwiGLU …
780d67524 tests: a shortlist case with duplicate head-weight rows, for the 1-in-50 wrong …
4107043c1 prefill keeps the stored layout for a weight that already has a stored device copy
Two of the five are f16-range fixes (c25d7913f, c2ea44140) — the #1962/#2167 family — and one is the duplicate-rows test I reviewed on llama.cpp#314. So this bump carries the class the release has been chasing all night, and the diff is still three files (docs/hrx.md, registry/architectures.json, the gitlink) with 10 issue references in the body.
The docs row keeps up, which is what I asked for on the previous head
At fd5163d I asked that each commit name the issue its closure depends on. This head does better: the docs/hrx.md hunk carries three distinct behaviour statements with their pins —
- "Since pin
caa2d4ddethe packed layout is the default for a weight in the file mapping" (#313) - "At pin
4107043c1(clean build,build_commit 4107043), the defaults against all [switches]" — the speed comparison - "A dense mixed-quant 27B shares most of its copies too since pin
4107043c1" (#320)
Naming the pin beside each claim is the property that makes a behaviour doc survivable across bumps: a reader can tell which statement is about the pin they are on and which is history. That is the fix for exactly the confusion the five stale 2b7960bae mentions create (and which I checked on the previous head are history rows, not stale pins).
Scope and the one thing worth watching: three files, and the bump flips another default (prefill keeps the stored layout when a stored device copy exists). That is the second default change inside a pin bump in two heads of this PR — each is documented, and the two together mean the layout a weight is read in is now decided by where it lives rather than by a global switch. The docs say so in one place; if a third such commit arrives, that paragraph should become the canonical explanation rather than a third appended sentence.
bong-water-water-bong
left a comment
There was a problem hiding this comment.
Review at e0eb9b4 — no verdict token (author's lane). This is the pin-bump shape done right, and the reason is one sentence in the body that most bumps of this kind do not have.
The measurement and the shipped pin are the same tree, and the body proves it
The head moved three times while this PR sat (aa243ef → fd5163d → 892fb74), and each move is a fresh chance for the numbers to belong to a tree that does not ship — the exact problem I raised on #2147, where the body named 209091986 and the tree shipped 204493d4. Here the body says:
"
4107043c1has the same tree as #320's headc100cf5(7d7f85919a41), where its numbers were measured."
That is verifiable, so I verified it:
4107043c16d1 tree=7d7f85919a41 ← the pin this PR ships
c100cf535a15 tree=7d7f85919a41 ← where the numbers were taken
Same tree hash. So the 70 → 16 layouts and 18,205.2 → 16,181.4 MiB on the dense 27B apply to exactly the content this PR pins, and nobody has to take that on faith. Naming the tree hash is the right answer to "the head moved after measuring", and it is worth making the habit — a commit sha is not the thing that was measured; a tree is.
Consistency, checked
submodule at head: 4107043c16d1
architectures.json: 4107043c16d1
compare 2b7960bae...4107043c1 → ahead 9, behind 0 (forward only, as claimed)
The rest of the body is the shape a behaviour-changing bump needs
- The measurement table names its arms — 647 copies / 4,400.6 MiB at #313's default against 398 / 2,375.9 with both switches off, and 433 / 2,856.2 at
caa2d4ddeagainst the same 398 baseline — so the "one device copy per weight" claim is attributable to a commit, not to a mood. - The regression is disclosed, not buried: "Short prompts of 6 to 16 tokens prefill 5 to 9 % slower (2 to 3 ms)", with the reason (a weight that already has a stored device copy keeps the stored layout for prefill).
- There are four independent escape hatches (
GGML_HRX_MODEL_BUFFER_COPY=1, any host-weight limit,--no-mmap,GGML_HRX_Q4K_PACKED_TAIL=0 GGML_HRX_Q6K_PACKED_ROWS=0), which is what makes a default change safe to ship ahead of a release. - Scope is stated honestly: #2137 stays open for the dense 27B, and #2159/#2167 are left to their lanes.
Nothing to change. If I wanted one addition it would be the tree hash in the commit message as well as the body, since the body is the part that gets skimmed and the message is the part that survives a rebase.
|
VERDICT: READY at Nine commits, and eight of them are behavioural — so this is not the routine bump the earlier heads were. Three deserve naming for anyone who reads a speed or parity row afterwards: Two asks, both about making a nine-commit bump reviewable rather than trusting:
Scope of my check: the fork compare (direction, count, subjects), |
…ge stay finite (#2186) (#2234) The two faults left open under #2127 are fixed in the fork (llama.cpp #317, #319, both in 780d67524); the pin 4107043c1 set by #2198 contains them. This records the measured before/after on gfx1151 in docs/hrx.md. Fixes #2186 Co-authored-by: bong-water-water-bong <bong-water-water-bong@1bit.gg> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Refs #2137 (I lead that row; it stays open for the dense 27B, see the end). Refs #2159 and #2167 (their lanes decide when they close).
Moves
third_party/llama.cppfrom2b7960baeto the fork head4107043c1. Forward only:The head moved from
aa243eftofd5163d.aa243efpinnedcaa2d4ddeand had two READY verdicts; it sat unmerged for two and a half hours while llama.cpp #316 merged on the fork, so I added one commit that takes the pin two commits further instead of opening a second bump for the same row. The first commit is unchanged.Head moved to
892fb74(third time). #320 merged on the fork at 21:12Z, so one more commit takes the pin from0494dfa28to4107043c1instead of a second bump for the same row.4107043c1has the same tree as #320's headc100cf5(7d7f85919a41), where its numbers were measured.docs/hrx.mdreplaces the 27B paragraph with #320's measurement: the dense 27B goes from 70 weights in two layouts to 16 (18,205.2 → 16,181.4 MiB), text identical.7ac55095c(#312)caa2d4dde(#313)ea06a166f(#316)0494dfa28(#315)MUL_MAT_IDwith activations above the half-precision rangec25d7913f,c2ea4414091c5efcd7(#318)780d675244107043c1(#320)All nine touch only
ggml/src/ggml-hrx/**andtests/**, soregistry/architectures.jsonchanges in its recorded pin only.docs/hrx.mddescribes the default, the short-prompt case, and what a dense 27B still holds twice.What changes for a user
With the default
-lm mmapon HRX, a model whose decode reads the packed rows (Qwen3-4B Q4_K_M is the measured one) keeps one device copy per weight after any prompt. Nothing changes forGGML_HRX_MODEL_BUFFER_COPY=1, a host-weight limit or--no-mmap.GGML_HRX_Q4K_PACKED_TAIL=0 GGML_HRX_Q6K_PACKED_ROWS=0restores the previous behaviour. Short prompts of 6 to 16 tokens prefill 5 to 9 % slower (2 to 3 ms).Measured (strixhalo, gfx1151, amdclang Release,
gpu-hold, 2026-11-11)Qwen3-4B Q4_K_M, weights in the file mapping, distinct (weight, layout) device copies from
GGML_HRX_HOST_WEIGHT_TRACE=2:-p 1700 -n 16: #313's default against both switches at0(ate02f3ba)-p 12 -n 16:caa2d4ddeagainst #316's head1c07568-p 3,-p 40,-p 100(default)Qwen3.8-27B UD-Q4_K_XL at the pin
0494dfa28,-p 1700 -n 16: 920 copies, 18,205.2 MiB, 70 weights still in two layouts (2,486.7 MiB); with both switches at0, 938 copies and 88 weights.hrx-backend-test packed_layout_follows_weight.*: 6 of 6 (device-free).Not measured
test-backend-ops/test-hrx-ops/hrx-backend-testsuites at this pin. I built0494dfa28for the 27B runs and forllama-bench; I did not run the suites on it.tools/check_pins.pyandtools/registry_build.py --check-pinslocally (the commits were made through the API; CI runs them).Why #2137 stays open
The dense 27B. Its one-token decode kernels read the stored layout and some of its prefill kernels read only the packed rows. Making decode step aside was measured: the same 70 duplicates and decode 8.5 % slower. Removing them needs a kernel that reads the other layout; that is with the orchestrator as an
ORCH:line.🤖 Generated with Claude Code