feat(BACKEND-ROCM-QUANT-GATHER): gather packed embeddings on ROCm - #3097
Merged
localai-org-maint-bot merged 25 commits intoSep 11, 2026
Merged
Conversation
ROCm expands quantized embedding tables because its gather provider is absent. Define all 19 codec contracts and the public model path before changing residency. Require pinned runtime comparisons, memory evidence, and independent mutation review. The primary fixture download and fork model qualification remain pending. Refs mudler#3093 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: Codex:gpt-6-astra [Codex CLI]
A full-attention Qwen3.5 model loads but fails completion because the shared forward validates unused recurrent metadata against zero slots. Define the consumer checks, existing input-builder reuse, public red, pinned oracle workload, and mutation gates before implementation. This specification on row/ENG-QWEN35-FULL-ATTN-STATE tracks mudler#3098. Implementation and runtime verification remain pending. This commit changes no product code and makes no performance claim. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: Codex:gpt-6-astra [Codex CLI]
Full-attention Qwen3.5 models have no recurrent cache but receive legacy GDN metadata. Select validation and device preparation from the loaded layer consumers. Keep hybrid cache and metadata checks strict, and pass inert metadata into graph padding before copying indices. The operator reproduced the public red and verified twelve fresh-engine completions. Both registered siblings and graph drivers pass focused CPU gates. Thirty scratch mutations prove the tests detect removed guards and production calls. Pinned vLLM rejects the exact text-only GGUF configuration before an engine becomes usable. G4 stays pending in the row specification. This change makes no performance claim and tracks mudler#3098 on row/ENG-QWEN35-FULL-ATTN-STATE under draft PR mudler#3101. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: Codex:gpt-6-astra [Codex CLI]
The graph shape tests reject nonzero first offsets and descending internal offsets for both model siblings. Each case fails when its guard is deleted, so independent review can verify both offset guarantees. Production code remains unchanged. Record the repair evidence under issue mudler#3098. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: Codex:gpt-6-astra [Codex CLI]
The public Q8_K case reaches a materializer that still requires a dot kernel. Define an explicit embedding role and preserve the matrix default before changing that shared loader. Issue mudler#3093 owns the correction and its loader, public API, and mutation gates. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:gpt-6-astra [Codex]
The loader regression identifies an unknown-type refusal before the materializer. Define the existing Q8_K byte geometry and its reader gate before adding that trait. Preserve matrix refusals and correct the earlier cause attribution under issue mudler#3093. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:gpt-6-astra [Codex]
…ssion The full-attention-only runner test still expects the former forward-side GDN refusal. Specify its successful execution and state checks before correcting the test. Keep fixture geometry and runner topology unchanged. Refs mudler#3098 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:gpt-6-astra [Codex]
The reviewed consumer checks make the full-attention runner fixture succeed, so its old exception expectation now fails. Require completed execution, changed attention state, a valid sampled token, and request feedback. Preserve the existing fixture and keep GDN state absent. The focused case passes 18 assertions. All 41 CPU runner cases pass with 1914 assertions. Restoring unconditional dense GDN validation fails the corrected case at the original refusal. Product bytes remain unchanged. Refs mudler#3098 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:gpt-6-astra [Codex]
ROCm expands quantized embeddings because its operation table lacks a compressed gather. Register all 19 admitted codecs and decode selected rows directly into the caller's F32 or BF16 output. Keep the error record fixed at 16 bytes and validate full-width IDs before reading a packed row. Admit the existing Q8_K file geometry and distinguish embedding storage from matrix storage. The embedding role preserves packed decoder-only formats; the default materializer still requires a dot kernel and refuses embedding repacks. Bind allocation and launch to the queue's device. The gfx1100 operator passed all 15 final CTests and the required two-device witness. All 76 operation outputs meet the pinned oracle gates, including 68 byte-identical outputs. Matching traces preserve untraced outputs and show native selected-row decode with requested output and BF16 KV storage. The full staged preflight reports no failures and five argument-dependent skips. The separate CPU ISA audit passes. The row evidence names each skip and preserves the complete raw gate output. Keep the row ACTIVE. Original upstream fixtures await download authority. The pinned primary renderer refuses the exact bounded model, and both secondary models abort before tokens. Model token equality, matched oracle cache geometry, fresh mutation review, and reviewed-head operator gates remain pending. This change makes no performance claim. Refs mudler#3093. The branch retains the separately reviewed mudler#3101 prerequisite. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:gpt-6-astra [Codex]
The primary now runs the unchanged Q4_0 model through its registered text class with the original rotary width. Preserve the failed launches and successful compiled run as evidence for those harness corrections. Match the secondary cache padding with 16 native and primary blocks. Require new memory measurements and the complete token matrix. Scope a separate secondary allocation overlay with pristine codec controls and independent mutation review. Its model qualification remains pending. The record, command, symbol, role, evidence-hash, and whitespace checks pass. The full helper preflight is still running; its default-branch test already fails under this host's global main setting. No product code or test changes are included. A fresh implementer uses this committed spec. Refs mudler#3093. Issue mudler#2719 retains the separate native admission gap. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:gpt-6-astra [Codex]
The primary plugin restores its multimodal architecture key during loading. Select the pinned text class and preserve the original rotary width without changing the source or production execution defaults. Return plain JSON from the worker to capture live cache tensors safely. Match physical KV capacity at 16 blocks. Preserve all 19 public fixtures and compare every native quantized completion with its dense control. Retain the unused recurrent copy input in separate stock and fork source overlays. All 12 secondary completions match native tokens, and all 24 actual recurrent controls preserve tokens and logits byte-for-byte. The amended HIP build passes 15 CTests and the required two-device case. The CPU build passes six tests and skips two ROCm-only tests. Both recurrent graph mutations fail for their intended reasons. The primary observer measures an unchanged 65,536-byte BF16 cache during generation. The complete primary matrix, matching model traces, full staged preflight, fresh mutation review, and operator rerun remain required. The original upstream fixture download still awaits developer authority. Keep this row ACTIVE and preserve failed attempts with their receipts. Refs mudler#3093. No performance or global oracle-gateability claim changes. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:gpt-6-astra [Codex]
Define the complete report qualification before repairing the comparator. A primary exception after generation can preserve valid tokens and must not qualify the run. Refs mudler#3113. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:gpt-6-astra [Codex]
A primary exception after generation can preserve valid tokens and must not qualify the run. Require the exact successful status and reject any capture that carries an exception, exception_type, or traceback field on both the token and memory report paths, together with the sealed model and configuration bytes, prompt, repeat, resolved BF16 dtype, and the recorded runtime identities of the successful Q4_0 captures. Require an integer cache storage offset at the storage origin and verify that the complete strided view fits its storage before the existing allocator bounds check, then compare the extended view metadata before and after generation. Centralize the checks in qualify_primary and add the focused validator test, which keeps the successful Q4_0 reports as positive controls and mutates a copy with a post-generation exception. The synthetic matrix is a validator test, never an oracle measurement or model parity result. Refs mudler#3113. No product code, oracle pin, or model workload changes. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
Fresh review of 92813f4 found the focused validator negatively pinned only the exception guard. This round adds one negative case per qualification guard on both the token and memory report paths: status-only refusal, traceback-only and executed-with-exception records, wrong primary and plugin pins, wrong runtime identities, wrong model, config, prompt, and repeat seals, an FP32 resolved dtype, an FP8 request, non-greedy sampling, a changed capacity contract, and invalid storage geometry (nonzero, negative, float, and boolean offsets, shrunk storage, grown shape, an inactive allocator, a changed layout, and generation-time changes). Guard-removal mutations redden exactly their matching cases. The suite is registered in the preflight SUITES array and the CI python lane so a guard regression fails a standing gate. Refs mudler#3113. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
The comparison report carried a fixed scope line written for the generated corpus, so the original-fixture coverage run was labelled "synthetic". Make the scope a command-line argument whose default preserves the previous text, and re-run the comparison over the 32 verified upstream fixtures so the report's label matches its inputs. Refs mudler#3126. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
The 32 upstream fixtures are downloaded and verified, the 160 exported tensors pass the native-versus-plugin comparison inside the upstream tolerance, the 96-request primary matrix is classified (93 identical; three IQ3_S cases are the plugin grid defect reported upstream as vllm-gguf-plugin#129), the comparator review statuses are recorded, and the secondary matched-memory claim is scoped around the upstream 256-cell context padding. Refs mudler#3093. Refs mudler#3126. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
compare.py carried no standing coverage, so the `--scope` parameter added for the original-fixture label was unpinned and a later edit to its default would change the report's scope line without failing any gate. Run the whole tool over one synthesized Q4_0 case and read the written report back, asserting the exact previous literal for the command-line default and for the module API default, and asserting that an explicit `--scope` value reaches the report. Refs mudler#3126. Refs mudler#3093. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
… evidence roots The acceptance row claimed two fresh reviews without a retained report, and the bench evidence named two relative paths that resolve under different roots. Cite each operator-transcribed report with its path and sha256, the artifacts beside it, and what it concluded, and give each evidence path its absolute root. Refs mudler#3093. Refs mudler#3126. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
VikashLoomba
marked this pull request as ready for review
September 11, 2026 03:33
…ence the size gate cannot classify `pr-size` fails this pull request on three paths no class admits: the evidence arm matches exactly `docs/bench-evidence/<run-id>/<file>.<ext>` for the extensions it names, and `.patch` is one it deliberately does not name (`.agents/specs/gate-pr-size-bench-evidence.md` forbids a general suffix rule and requires each sibling artifact its own justified classification). Re-home the archive to the run directory, beside the seven sibling `*.tar.gz` captures whose `.gz` already classifies there, and record the two minimal diffs as documents, which classify at any depth. The archive bytes stay identical and its `capture-manifest.json` sha256 still matches, so no hash in the tree goes stale and no claim, number, or verdict moves. Refs mudler#3093. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
…d of a false absence `test_ops_quant_traits` special-cased id 15 and asserted `GgmlTraits(15)` throws, on the premise that Q8_K "never appears in a GGUF file". That premise is false, and c5bb0f1 falsified it in this same branch: the reader admits Q8_K's file geometry exactly as llama.cpp does at the recorded pin, where `ggml/src/ggml.c:879-884` carries a real traits row with a nonzero `type_size` and no `.vec_dot` or `.to_float`, and the file loader validates Q8_K row data as it reads a tensor (`src/llama-model-loader.cpp:1416` reaching `ggml/src/ggml-quants.c:5590-5598`). Replace the absence with the stronger TRUE assertions -- reader geometry, the id round-trip, no weight-side dot kernel, and not keep-quant capable through the public predicate the loader itself calls -- and correct the same stale absolute in the two `gguf_keep_quant` comments. The reader's `case 15` is unchanged. Refs mudler#3093. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
…K's file geometry Three comments still carried the belief that produced the stale `CHECK_THROWS` this branch repaired: that Q8_K never appears in a GGUF file. The reader admits id 15 and the decode-only embedding gather takes it packed, so the tree must not keep the claim that justified the old assertion — in a test case, in `vt/dtype.h`, or beside the loader's predicate. The `continue` in the byte-for-byte case stays, and its comment now says why it is there: the loader's `DequantGgufRowToF32` expansion path has no Q8_K arm. The IQ3_S matrix row also loses the `#L250` anchor the previous commit moved to 266. Refs mudler#3093. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
…ms and two stale anchors The falsified invariant this branch corrects still sat in a live production comment: `DequantQ8_K`'s header said Q8_K never appears in a GGUF file, which a reader would act on. A GGUF file can carry it, the reader admits id 15, and only the decode-only embedding gather takes it packed; the three lines stay three lines so every `cpu_quant_dequant.cpp` anchor the quantization matrix cites still resolves. The same commit re-points the two IQ2_XS/IQ4_XS `#L156` anchors at 172, the line the previous commit moved that TEST_CASE to; this branch is what made them stale, and the base borrowed no such debt. Refs mudler#3093. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
…er exists The `DqQ8_K` header claimed Q8_K "never appears as a FILE weight, so it can never reach the gather from the loader". This branch made that false: the reader now admits id 15 and `KeepQuantGatherDType` admits it, so a Q8_K embedding table does arrive from the loader. The code already says so — `cuda_quant_dot.cu:224` wires `X(kQ8_K, DqQ8_K)` into the gather dispatch and `:201` pins the 292-byte stride against the CPU block — so only the prose was wrong, and it now gives the real reason the decoder belongs here. Refs mudler#3093. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:deepseek-v4-flash [DeepSeek Harness]
Contributor
Author
|
CI triage after the repair push — head Two branch-local failures were repaired here, and the corrections they implied were carried through the rest of the tree:
The remaining red checks are red in the same way on
Both |
…is branch still carries OPEN This branch carries the six ENG-QWEN35-FULL-ATTN-STATE commits that landed separately as mudler#3101. That squash rewrote them under one new sha, so the only collision is the canonical issue record: main reads State CLOSED because mudler#3101 discharged it, and this branch still reads OPEN. Main's copy is the correct one and is taken verbatim; no product file conflicts. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5-1m [claude-code] # Conflicts: # .agents/issues/ENG-QWEN35-FULL-ATTN-STATE/ISSUE-GH-3098.md
…tes and never created Four commit bodies and the spec reference mudler#3113, and four commit bodies plus tests/scripts/test_rocm_quant_gather_compare.py reference mudler#3126, but neither had a canonical record anywhere under .agents/issues/. The pull request body states that the label defect "is filed and fixed in flow as mudler#3126", and nothing in the tree filed it. Local files are the issue authority, so a cited issue with no local record is an unowned reference rather than a tracked one. No gate catches this: check-agent-record.py resolves a bare `#N` and silently continues when it finds nothing, so the omission is invisible to preflight and to CI. Imported with scripts/agent-issue.py import-github so the quoted GitHub text is recorded as historical evidence and the local record is authoritative. Records only; no product code changes. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5-1m [claude-code]
mudler
added a commit
that referenced
this pull request
Sep 11, 2026
…ation Commit 96c5e47 reached main without a row/ branch, freezing the agent-record gate: every PR based on current main fails it. Advances the enforcement floor from e1b5df1 to 96c5e47, the third advance, forgiving that one unrepairable violation. Re-pins the floor test assertion in lockstep and adds the third-advance section to the spec. The spec change surfaced two untriaged _intake records (#558, #664) whose issue numbers appear in the forgiven-commits table. Both are already fixed by the tree; triaged #558 to BENCH-ORACLE-PIN-RECONCILE and #664 to GATE-WINDOWS-PORTABILITY-TARGET-SCOPE so the agent-record gate passes. The windows-msvc-cpu job fails at test_openai_api_server.exe (STATUS_STACK_BUFFER_OVERRUN) but is not a required check: PR #3097 merged while it was red. The macos, sanitize-address, and sanitize- thread failures named in #3135 were fixed by #3136, #3138, and #3141. This commit resolves the last blocking failure. Paths: checker data (scripts/ci-enforcement-floor.txt), test (tests/scripts/test_check_commit_trailers.py), document (.agents/specs/ci-enforcement-floor.md), record (.agents/issues/BENCH-ORACLE-PIN-RECONCILE/ISSUE-GH-558.md, .agents/issues/GATE-WINDOWS-PORTABILITY-TARGET-SCOPE/ISSUE-GH-664.md) Closes #3135 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:regolo/glm5.2 [maki]
This was referenced Sep 11, 2026
localai-org-maint-bot
added a commit
that referenced
this pull request
Sep 11, 2026
…radicts the canonical record (#3144) `GATE-PR-BODY-TRAILERS`. Refs ISSUE-LOCAL-01M298Q7PPM145DQA5C30GRYJA. ## What changed `squash_merge_commit_message = PR_BODY` makes a pull request body the landed commit message, so `Closes #N` in a body closes the GitHub mirror the moment the squash lands. Local files under `.agents/issues` are the issue authority, and nothing checked that the branch also carries `ISSUE-GH-N.md` reading `State: CLOSED`. The two authorities diverge at the merge, and the authoritative half is the one left reading OPEN. `scripts/agent-pr-body.py` now refuses such a body. It already fetches the live body and already runs before a merge, which is exactly when this matters. ## Why here, and why only closing keywords `check-agent-record.py` cannot catch it: it is offline and never sees a body, and `check_canonical_issue_references` silently `continue`s on an unresolvable bare `#N`. Making that strict was the obvious repair and is the wrong one. Measured over four open pull requests, bare citations lacking a local record run 6 of 7, 4 of 4, 8 of 8 and 10 of 11 — so failing them would fire the gate on ordinary work, which AGENTS.md names as the defect rather than the discipline. The rule therefore keys on the closing keyword alone. ## Evidence Red before: a body closing an issue with no record exits 1 naming the missing path. Green after: a bare `Refs #N` still exits 0. Both are committed as cases in `tests/scripts/test_agent_pr_body.py` (suite: 21 passed, 16 subtests), and the spec's `## Tests` table is updated because that table is compared with the loaded suite rather than sampled. Found live on four pull requests in one review pass: #3101 carried a closing keyword for #3098, whose record read OPEN; #3095 did the same for #3092 while that row's own gate table reads FAILING; #3096 carries five closing keywords against four OPEN records and one issue with no local record at all; #3097 likewise for #3093, against a spec saying the row is not ready to land. On its first live run against #3095 it also caught a closing keyword for #3106, which the human review pass and I had both missed — that record reads OPEN and its Resolution says it stays open until the reviewed production repair lands. The spec's `Kind` line is amended in the same change, because it claimed this row edits no checker rule and now it does. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5-1m [claude-code] Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
localai-org-maint-bot
added a commit
that referenced
this pull request
Sep 12, 2026
…3142) Commit 96c5e47 reached main without a row/ branch, freezing the agent-record gate: every PR based on current main fails it. Advances the enforcement floor from e1b5df1 to 96c5e47, the third advance, forgiving that one unrepairable violation. Re-pins the floor test assertion in lockstep and adds the third-advance section to the spec. The spec change surfaced two untriaged _intake records (#558, #664) whose issue numbers appear in the forgiven-commits table. Both are already fixed by the tree; triaged #558 to BENCH-ORACLE-PIN-RECONCILE and #664 to GATE-WINDOWS-PORTABILITY-TARGET-SCOPE so the agent-record gate passes. The windows-msvc-cpu job fails at test_openai_api_server.exe (STATUS_STACK_BUFFER_OVERRUN) but is not a required check: PR #3097 merged while it was red. The macos, sanitize-address, and sanitize-thread failures named in #3135 were fixed by #3136, #3138, and #3141. This commit resolves the last blocking failure. Paths: checker data (scripts/ci-enforcement-floor.txt), test (tests/scripts/test_check_commit_trailers.py), document (.agents/specs/ci-enforcement-floor.md), record (.agents/issues/BENCH-ORACLE-PIN-RECONCILE/ISSUE-GH-558.md, .agents/issues/GATE-WINDOWS-PORTABILITY-TARGET-SCOPE/ISSUE-GH-664.md) Closes #3135 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:regolo/glm5.2 [maki] Co-authored-by: Ettore Di Giacinto <mudler@localai.io>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Row
BACKEND-ROCM-QUANT-GATHER. Refs #3093.What changed
ROCm now keeps every admitted quantized embedding table packed and decodes selected rows directly into the caller's F32 or BF16 output. The provider covers all 19 codecs, preserves full-width ID checks, and binds the queue device before allocation and launch. The Qwen3.5 GGUF reader admits the existing Q8_K block geometry; its embedding materializer accepts decoder-only formats while ordinary matrix weights retain their dot-kernel requirement. Public load/completion tests reach every format and compare exact tokens and logits with same-binary dense controls.
Before starting
Issue #3093 tracks the missing ROCm quantized embedding registration. The committed spec and its reader/materializer amendments precede implementation. This row uses one pull request. Its spec owns the child inventory; the parent backend lifecycle remains unchanged.
The branch includes the separately reviewed full-attention prerequisite from #3101. Its later runner test correction is imported byte-for-byte from
694f04525174d0c2dac8030ba8f1398f2683ec82. The gather change does not modify that prerequisite's product implementation.Evidence
The gfx1100 operator executed all 15 final CTests without a skip. The primitive suite passes nine cases and 11,784 assertions; the public suite passes 2,850 assertions. All 456 completion files equal the full trace capture byte-for-byte. All 76 operation outputs meet the pinned primary/secondary gates; 68 are byte-identical, with the remaining eight within the original primary tolerance. The applicable secondary GET_ROWS geometry passes six exact F32/BF16-RNE comparisons. The required two-device queue, bounds, and recovery witness passes.
Matching rocprofv3 1.3.5 traces preserve each arm's untraced output bytes. Native operation allocations exactly match packed tables, I64 IDs, requested outputs, and constant 16-byte error buffers. The primary runs packed GPU selections followed by native decoders; its tensor memory counters are labeled separately from its profiler-visible allocator pool. A complete public trace passes 228 engines and 2,850 assertions, with BF16 KV reads/writes and exact token/logit repeats.
The commands and their receipts are retained in
native-final-v4-commands.jsonandnative-final-v4-operator-results.json. The operator ran:ctest --test-dir build-rocm-quant-gather --output-on-failure --verbose -R '^(test_rocm_embedding_quant|test_capi_rocm_embedding_quant|test_gguf_keep_quant|test_ops_embedding_quant|test_gguf_dequant|test_backend_cross_device|test_gguf|test_rocm_arch|test_rocm_backend|test_rocm_fp8_kv_cache|test_ops_rocm_silu_rounding|test_exl3_rocm|test_gemma4_rocm_fp8_seams|test_backend_multidevice|test_runner)$'The implementation head is
c5bb0f1f71f1db2bac5f436189a6a018fb62cbc3. Exact-SHA path classification, commit style, and trailer checks pass. All 4,233 committed source, test, and build files match the frozen review manifest.The complete library builds cleanly with HIP and CPU-only configurations. The CPU runner suite passes 41 cases and 1,914 assertions. Exact recipes, hashes, source anchors, oracle outputs, raw traces, and operator receipts are in
docs/bench-evidence/rocm-quant-gather/.scripts/agent-preflight.sh --staged --quietexits 0 with no failures and five argument-dependent skips. CPU ISA passes separately; ARM, CUDA code-generation, and CUDA Triton artifact checks do not apply to this HIP build.docs/FEATURES.md.Speed claims
Honest gaps
The bounded oracle comparison is qualified at this head: the comparator now rejects any primary record that carries an exception after generation and verifies the sealed model, configuration, prompt, repeat, dtype, and runtime identities plus the complete cache-view bounds before accepting a report. A focused validator test keeps the successful Q4_0 captures as its positive control and reddens when a post-generation exception is injected. A second review round then pinned every qualification guard with its own negative case on both the token and memory report paths (status-only refusal, exception and traceback shapes, wrong pins and runtime identities, wrong workload seals, FP32 dtype, an FP8 request, non-greedy sampling, a changed capacity contract, and invalid storage geometry), and registered the suite in the preflight SUITES array and the CI python lane so a guard regression fails a standing gate. The operator comparison of the 96-run primary matrix records 93 of 96 token-identical cases.
The three IQ3_S first-prompt mismatches are an ORACLE-SIDE codebook difference, not a native defect: native IQ3_S decode is bit-exact with the format-defining llama.cpp grid, while the pinned vLLM gguf plugin decodes 150 of 2048 codebook byte positions at 62 where the grid has 15 (effective magnitude 15.5 vs 15, +3.333%). A CPU substitution experiment (plugin-codebook rows placed into an otherwise identical dense model) reproduces the primary's exact divergent tokens, and stock llama.cpp reproduces the native tokens byte-for-byte. The finding, receipts, and two-sided citations are recorded with the row evidence, and it is reported upstream as vllm-gguf-plugin#129; that grid correction decides whether the three IQ3_S-p0 cases then pass or stay recorded oracle-blocked.
The original-fixture coverage is satisfied at this head. All 32 upstream fixtures were downloaded with the developer's authority and verified at 289,655,872 bytes; their 160 exported tensors over the 16 primary codecs were compared native-versus-plugin and pass with 320 outputs, 140 byte-exact, and every remaining element inside the unchanged upstream tolerance (
atol=0.01,rtol=0.04). IQ1_M and the F16 output case remain the documented exclusions, and Q8_K, MXFP4, and IQ1_XXXS stay with their separate secondary evidence. The comparison report now labels its own scope from the run rather than a fixed string; the label defect found during this round is filed and fixed in flow as #3126.This is ready for review. The exact Q4_0 model reaches the pinned primary renderer but it refuses
Qwen3_5TextConfigwhereQwen3_5Configis required, before tokens. The secondary llama.cpp oracles run through their committed one-lines_copyoverlay and match native on all 12 bounded requests; the pristine binaries abort on their first decode, and the upstream runtime pads the requested 64-cell context to its own 256-cell minimum, so the matched-memory claim is scoped to the native/primary pair (both 65,536 bytes) and the secondary runs claim tokens and logits only.The original 32 upstream fixtures await authority for their 289,655,872-byte download. Generated operation tables do not replace those fixtures. The fork's real 2.4T model qualification remains separately owed under #933. The row stays ACTIVE until the remaining gates pass. No CUDA/HIP combined-device execution is claimed.
Repairs after the review above, verified at this head.
d896102f1re-homes three evidence pathspr-sizecould not classify: the run's capture archive moves up beside its seven sibling archives with its sha256 unchanged (9f700062…a1bc7, still the valuecapture-manifest.jsonseals), and the two minimal-diff.patchartifacts become documents that reproduce each diff verbatim, record the original file's sha256, and point at the sealed full-context archive members.74baf8c08replaces the stale assertion that Q8_K never appears in a GGUF file — the reader'scase 15is correct and mirrors llama.cpp, which carries a real Q8_K traits row and validates its row data on load — with assertions that pin the reader geometry againstvt::BlockElems/BlockBytes, the id round-trip, and the properties that actually distinguish Q8_K: no weight-sidevec_dot, not keep-quant capable, and not taken by the generic composite.79176b72e,873807215andfb4d78049remove the same false claim from the four remaining comments that carried it, including the CUDA gather header that this branch is what made false, and repair the three line anchors this branch's own edits had made stale. A fresh reviewer mutated each guarantee in a scratch copy and returned PASS, including the classifier mutation that reproduces CI's unclassified-path error verbatim and the geometry,HasQuantDotKerneland restored-CHECK_THROWSmutations that each red the intended assertion; the operator independently reran the two CPU suites (10/10 cases and 6226/6226 assertions; 55/55 and 10350/10350).FOLLOWING_AGENTS_PROTOCOL
Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: Codex:gpt-6-astra [Codex CLI]