v0.3.1: promote beta — DFlash repairs, Gemma/Maple, image and vision support - #730
Draft
Kaden-Schutt wants to merge 298 commits into
Draft
v0.3.1: promote beta — DFlash repairs, Gemma/Maple, image and vision support#730Kaden-Schutt wants to merge 298 commits into
Kaden-Schutt wants to merge 298 commits into
Conversation
resolve_tag matched a bare file name against entry.file but not a path whose final component is that file name, so `serve --model ~/.hipfire/models/qwen3.8-27b.mq5` (what serve_harness passes) got entry=None and no dflash sidecar: measured on hipx as tau=None / 37 tok/s under --speculation dflash while the same tag resolved the draft.
…e canonical target find_model_path canonicalizes, so a target that is a symlink into another directory (every ladder artifact on the bench boxes) has a parent with no draft in it and the registry sidecar was never found. load_params now takes the models dir and the resolver searches it first, then beside the target. Regression test with a symlinked target. Measured: serve_harness --speculation dflash on qwen3.8-27b.mq5 ran AR (tau=None, 37 tok/s) before; the direct-tag probe resolved the draft (tau=14.2).
Resolving a path-form model to its registry entry changed /health.model from the requested path to the tag. serve_harness's warm probe compares health.model to the launched path by realpath, so it never saw the serve as warm and killed/respawned it every 180 s (measured: two spawn attempts, zero turns). Keep the entry lookup for sidecars and policy; name the served model the way it was requested.
Measured on a 7900 XTX (serve_harness session_coding, greedy, thinking off, q8 KV): qwen3.8:27b-mq5 + its mq5 draft completes turns 1-2 (tau 3.6/3.5) then dies at turn 3, ctx ~4.9k, with spec_step hipMemCreate out of memory; every later turn is an empty response. The same session under AR passes all 8 turns (13.4k ctx, 38.1 -> 34.4 tok/s). 18.7 GB weights + ~5 GB fixed residency + 1.7 GB draft leaves no room for KV growth. Drop the sidecar from the 27B mq5/mq6 tiers (and qwen3.5:27b-mq6); mq4-tier and below keep theirs (measured 202 tok/s on qwen3.8:27b).
…ll declares hw-gate Fable seat on #686 (hardware probe): `hipfire rm qwen3.8:27b-mq4-pro` deleted qwen38-27b-dflash-mq4.hfq while qwen3.8:27b and qwen3.8:27b-mq4-xt — both declaring that sidecar — were still on disk; those siblings then ran AR under dflash_mode=auto or refused under `on`. Same shape for the mq3 draft (3 targets) and the 9B mq4 draft (3 targets). rm now removes a declared sidecar only when no OTHER registry entry declaring the same file still has its own target present in the models dir; otherwise it prints `keeping DFlash sidecar <file>: still declared by <tags>`. rm_command is a thin wrapper over rm_with_registry(&RegistryV1) so the rule is unit-testable without env or network. Tests: rm_keeps_shared_dflash_sidecar_while_sibling_target_present, rm_removes_dflash_sidecar_with_last_declaring_target, rm_without_dflash_declaration_leaves_draft_file_alone.
hw-gate Fable seat on #686: a daemon that went through one refused dflash_mode=on load held ~5.17 GB more VRAM with the next model resident than a clean daemon, compounding under serve's lazy retry. Cause: free_qwen35_bundle returns every buffer to the Gpu pool (free_tensor has no size cap, dispatch.rs:3261) and only unload_model drains it (lib.rs:3871-3872); a load that fails in finish_qwen35_load never reaches unload_model, so the whole target stayed pooled and the next load reused only the same-sized buckets. rollback_unfinished_qwen35 now mirrors unload_model: invalidate_graph_state + drain_pool after the frees. Covers all three callers: CASK eviction failure, dflash_mode=on draft failure, and the pre-existing mtp=on head failure (same leak, older than this PR).
… artifact hw-gate Fable seat on #686 (run 33889233321): resolve_tag matched any path by its final component, so `hipfire rm /elsewhere/qwen3.6-27b.mq4` — a different file sharing the basename — resolved to the qwen3.6:27b entry and deleted the installed model's triattn and DFlash sidecars while the model itself stayed; a same-basename foreign file loaded by path inherited the entry's sidecar and kv/max_seq policy. registry: resolve_tag drops the file_name() arm (a path is not a tag); bare entry.file names still resolve; new entry_for_file for exact matches. cli: registry_entry_for_path(paths, registry, input) — a path-form input resolves only when canonicalize(input) == canonicalize(models_dir/entry.file) for some entry, so the -xt symlink into ~/qcal still matches by target and a lookalike elsewhere never does. rm, run, bench, and serve (incl. the pre-warm thread) route through it. dflash_mode=on on a path with no entry and no explicit draft now fails closed: "DFlash draft required (dflash_mode=on) but <path> is not a registry-managed artifact; pass developer.dflash_draft or use the registry tag" (auto still serves it as a bare artifact) — closes Fable's earlier note that `on` ran AR silently there. The daemon only consumes CLI-lowered params and needs no change. cargo test -p hipfire-registry: 21 passed (2 new); -p hipfire-cli: 220 passed (4 new).
# Conflicts: # crates/hipfire-cli/map.md # crates/hipfire-runtime/map.md
…, pool drain on refused load, path-identity fail-closed) to staging Policy floor (registry/models.json, registry/v1.json) means the decide seat can never land this; merged by Main on the gate's hardware evidence after four rounds of Fable findings, all fixed and measured: - pool drain on refused load (d233d2a): 18,950 MB retained -> 281 MB, and the same daemon then serves qwen3.8+draft at -20 KB vs a clean daemon (hipx gfx1100) - shared-sidecar rm guard (def19e3): rm no longer deletes a sidecar another target still declares - path-basename identity (876cf28): registry_entry_for_path requires canonicalize equality, so a foreign /elsewhere/qwen3.6-27b.mq4 gets no sidecar and dflash_mode=on fails closed instead of running AR silently Enablement is unchanged: dflash_mode default stays off and the sidecar is resolved only under auto/on, so a paired draft on disk still never drafts until the user opts in. The only user-visible delta is pull size: +0.55 GB (9B) / +0.92-0.98 GB (27B). 249 tests pass in hipfire-registry + hipfire-cli at 397a366 (includes the beta merge with regenerated cli/runtime crate maps).
# Conflicts: # crates/hipfire-generate/map.md # crates/hipfire-loader/map.md
…ogy combinations before allocation) to staging
Fable's verdict was merge-staging; the only thing that stopped the seat was the recurring generated-map 409 (staging_merge_conflict hard floor on crates/hipfire-{generate,loader}/map.md). Merged by Main after merging beta in and regenerating those blocks with scripts/check-crate-maps.py. Run 33914516085: both lanes pass, and the decide phase ran the #683 repro on the 5x gfx1201 host rather than reading the diff:
- ornith-1.5:35b-a3b --tp 4 is refused at pre-warm with all four cards still at 32548 MB free, where master loads four ranks (~7.86 GB each) and only fails on the first request with 'EP arch mismatch'
- the one path the PR closes that master could reach — the batch-only EP route (batch_staging.rs:231-331) — segfaults inside libamdhip64 on master, 2/2 runs, so refusing it removes a crash rather than a serve path
- dense qwen3.5/3.6 TP through the same entry still loads two ranks and decodes coherently at 20.1 tok/s on the PR build
- LFM2 --continuous-batch-size 2 is byte-identical on both builds while master allocated an Lfm2DecodeBatchState nothing ever drove (batch.rs:180 returns false unconditionally); LFM2 --tp 2 refuses identically on both
Sol was needs-human on coverage, not on a regression: no Gemma4 or DeepSeek-V4/MiniMax fixture exists on this host, and those arms are arch/config-only code before device init. Recorded as unproven in the decision artifact, not as a claim. 70 tests pass in hipfire-loader + hipfire-generate at 5dbe4a9.
# Conflicts: # crates/hipfire-runtime/map.md
… axis) to staging Fable's verdict was merge-staging; blocked only by the recurring generated-map 409 (staging_merge_conflict on crates/hipfire-runtime/map.md). Merged by Main after merging beta in and regenerating that block. Run 33914554146: both lanes pass, and the decide phase measured the claims on the 5x gfx1201 host: - a 4x gfx1201 EP load of ornith-1.5:35b-a3b-mq4r on the PR daemon logged 'EP load: tp=4 arch=qwen35' after init_ep, completed on 4 ranks, then unloaded/reloaded/unloaded with rank-0 vram_free_mb 32548/25512/32400/25510/32398 -- the identical five numbers the master daemon produced from the same stdin, so the Ep mesh axis is a zero-runtime-delta rename as claimed - Gpus::init_ep is field-for-field init_tp except mesh: DeviceMesh::rect(Ep, n), and the mesh field is read only by constructors and tests Sol's needs-human was coverage, not regression: no AWQ/PARO Llama artifact was cycled with free-VRAM diagnostics, and the Qwen2 free_all path has no fixture on either lane. Both recorded as unproven rather than as claims. 21 tests pass in hipfire-runtime + hipfire-loader at a0aa126.
# Conflicts: # crates/hipfire-daemon/map.md # crates/hipfire-loader/map.md # crates/hipfire-loader/src/lib.rs
…fy and admit before teardown) to staging Fork PR (fivetide), so it is staged in this repo as staging/pr-682: PR head 95e0e65 merged with beta at a9f4ca8. That merge had a REAL semantic conflict in crates/hipfire-loader/src/lib.rs between #687's ep_admission and #682's admit_source; resolved by keeping #682's classify-once split (load_model_ep_admitted) and #687's shared ep_unsupported_arch_message(id) as the backstop arm so the message cannot drift. The resolution is proven on hardware (hiptrx gfx1201, daemon md5 99457c71e4e400793d3efede7278ac3f), not just compiled: - battery on the canonical qwen3.8-27b.mq4-xt (mq4v2) trunk: 5/5 turns, attractor 0, empty 0, runaway 0, recall satisfied on every turn, avg decode 29.5 tok/s - LFM2 (arch_id=11) --tp 2 refuses with exactly the shared constructor's text, 'EP not supported for arch_id=11 (expected 5|6 for Qwen3.5, 9 for DeepSeek V4 or 10 for MiniMax)', at [validation retryable=false rolled_back=false] with the serve process still alive - ornith-1.5-35b-a3b (arch_id=6) --tp 2 refuses through #687's rule at 32548 MB free / 32624 MB total, i.e. #682's restructure did NOT bypass the refusal that #687 added - the precise risk of that conflict - 48 tests pass in hipfire-loader + hipfire-daemon Fable's investigation (run 33921475093) closed every one of Sol's coverage gaps on hardware: six refusal classes all fire before teardown with the prior model still generating, while the BASE daemon answers 'no model loaded' after four of the six. Two floors, both human calls, both made: scripts/leanup-thresholds.txt is a policy path, and the ratchet raise daemon_lines <= 4155 -> 4176 is accepted - the logic landed in hipfire_loader::admission and what grew in the daemon is the call site plus emit_uncorrelated_error boilerplate that must live at the protocol boundary. If that ceiling is hit again, collapse the repeated emit blocks into a local helper first. Unproven and recorded as such: DS4 (arch 9) and MiniMax (arch 10) EP admission, and Qwen3.5-VL / LFM2-VL tower classification - no such artifact exists on either lane.
…robench Default stays device 0 / 960 GB/s (7900 XTX). Lets the same binary run on the gfx1151 8060S against its own LPDDR5X roofline.
gemm_mq4g256v2_residual_wmma is the gfx11-only kernel; on gfx1201 it fails to compile (gfx11 WMMA intrinsic). Production dispatch goes via gemm_hfq4g256_residual_mq4v2 which routes gfx12 -> _wmma_gfx12; the bench now calls the same entry so every card fires its real kernel. gfx1201 R9700 (640 GB/s): every projection at 82-107% of roofline, 64-layer sum 22.7 ms vs 21.1 floor = 1.07x. gfx12 verify is already at the wall.
Base gemm_mq4g256v2_residual_wmma launches one wave32 per 16x16 tile: at N=16, M=5120 only 320 waves over 96 CUs (~3.3/CU), 23-25% of roof. New GEN_RESID_KSPLIT_LDS(KW): KW waves own disjoint K-ranges of the same 16x16 tile, reduce fp32 accs through KW KiB LDS in fixed wave order, wave 0 applies the single Y +=. Grid ceil(M/16) x ceil(N/16), block 32*KW. Dispatch: exact gfx1100, non-replay/non-capture, batch<=16, kw table kw=4 (K<=8192) / kw=8 (K>8192) relaxed to dividing KW; else base. Parity gate relL2<=1e-5 (association differs: not bit-exact).
Gate was below the fp32 rounding floor (even single-joint kw2 gives 2.65e-5 at K=17408). Harness now also builds f64 truth per (shape,N) (exact kernel dequant, RN-even f16 X like the staging kernel, f64 ascending-K accumulation) and prints relL2(base,f64) | relL2(ks,base) | relL2(ks,f64) + maxAbs(ks,f64) + frac|ks-base|>1e-3, documenting that the split-K delta is association noise no farther from truth than base.
E2E showed the tier unreachable in production: the daemon captures the verify forward into a HipGraph after one warmup, and the !graphs.capture_mode guard (copied from mw_lds) baked the BASE kernel into every replayed cycle. Drop the capture guard for the ksplit tier only (keep !replay.is_recording() for Redline tapes; mw_lds untouched). Capture safety: deterministic fixed wave-order LDS reduction, no atomics, launch_maybe_blob records the blob ABI under capture, and the three ks symbols carry the replay.rs kernarg contract; graphs.rs and the verify-graph path key on nothing kernel-name-specific. Kill switch: HIPFIRE_RESIDUAL_KSPLIT_OFF=1 (flags.residual_ksplit_off, default false). Parity harness forces the base oracle through it now that capture_mode no longer diverts the tier.
Formatting on the two new examples, refreshed rdna-compute map.md, and the parity example now carries required-features = ["lab"] like every other rdna-compute example so the default build does not pay for it (ungated_examples ratchet stays at 48).
…erify tier New gemm_mq4g256v2_residual_wmma_gfx1100_ldsstage kernel: identical cooperative 16x512 slab fill and 8-wave K partition as the gfx12 ldsstage design, gfx11-shaped consume (4x half16 fragments per wave, w32 WMMA, interleaved C). Tier prefers it when K%512==0, else the ks table; HIPFIRE_RESIDUAL_KSPLIT_OFF=1 disables both, HIPFIRE_RESIDUAL_LDSSTAGE_OFF=1 forces ks4. Parity example gains an ldsstage arm under the same 5e-5 gate.
…AL_LDSSTAGE hipx (7900 XTX): ldsstage parity PASS (relL2 1.1e-5 out, 3.5e-5 down, both <= 5e-5, f64 floor matched) but lands at ~53% of roofline (out 34.2us vs 25 gate, down 94.6us vs 65 gate) — better than ks4's ~48% yet short of the 70% gate. Root cause: 126 VGPRs cap occupancy at 1 WG/CU on gfx1100 (ks4: 62 VGPRs, 4 WGs/CU); (256,2) compiles to identical VGPR/LDS/scratch, so no occupancy change there either. Per the miss-case clause: ks4 stays the default, ldsstage is opt-in; replaces the OFF flag with the ON flag.
The indexed HFQ4-G256 gate/up kernel assumed K/256 was divisible by four and dropped Gemma4 K=2816 groups 8..10. Add fixed eleven-group variants so the tail is evaluated without compiler-generated private scratch, retain gfx1100 cache-policy selection, and register the new symbols with replay metadata. Validated with Gemma4-26B-A4B artifact sha256 45da530b43e0e8ea2cffd77fe17c69bfb8dce3ec4dde2a26a9b68ad428d01f1c on gfx1100 and gfx1201: stable 1263-launch captures, HIP/PM4 exact shadow parity, and byte-identical greedy E2E output for prompt md5 43ca0d15712d3dfb777b51ae76d8fd5f. (cherry picked from commit 2038b9f)
The lowered MQ4 launcher (gemv_mq4g256_moe_gate_up_k8_indexed) always selected the generic wave32 kernel, whose hard-coded tail = 0 is only valid for K=2048. At K=2816 (eleven groups) it silently dropped groups 8..10 in every routed gate/up projection on the lowered MQ4 path. Mirror the 734 HFQ4 pattern: compile-time FIXED_GROUPS=11 kernels under uniquely named MQ4 symbols, K=2816 dispatch arm preserving the K=2048 generic and CDNA wave64 paths, and replay pointer/kernarg registration. Ported from aaa9d397e3dd806d4f219be02ecb41c44b67595b (rdna-compute kernel/GEMM/replay sections only; hipfire-generate/ar and Gemma lowered enablement left for PR667).
…6 tails Convert the proven maintainer_tail_smoke throwaway into tests/moe_gate_up_tail_parity.rs (ignored, GPU-only): MQ4/HFQ launchers x K2816/K2048 vs CPU dequant oracle, nonzero tail trap, nonfinite output assert, tol 1e-4 (~30x measured fixed noise, ~4 orders below the dropped-tail mode: pre-fix 2.02/5.20, fixed 2e-6/3e-6). Remove the source-text selector test (name/default assertions that a compile break would catch first); the numeric test owns the contract. Provenance: b7c612a49b2b3ffa9d01cc12729949704f133562. Map counts refreshed for the K2816 HFQ+MQ4 landing on beta.
gfx11 _w32 WMMA builtin needs wmma-256b-insts,wavefrontsize32 and does not compile for gfx1201, breaking the Maple batch router GEMM. Add gemm_f16_x_f16_wmma.gfx12.hip (half8 operands, _w32_gfx12, contiguous C map; same signature/grid/block/layout) and select it on has_wmma_w32_gfx12(), keeping the gfx11 path identical. Register both symbols in replay pointer_effects/kernarg-size (read,read,write / 48B) so graph/PM4 contracts hold.
Sibling-wave changes composed on behalf of Main (parent-verified: q4k rounding regression PASS, BF16 KV constructor success in actual matrix): - quant_q4: choose final Q4_K nibbles from stored F16 d/dmin (llama.cpp quantize_row_q4_K_ref parity) + half-integer boundary test. - saddle kv: new_gpu_bf16 routes through alloc_k_v_filtered (OOM-safe); doc corrected to rounded-F32 and default-Maple status.
- Regenerate 14 stale crate maps (maple wave + beta Gemma/MoE landings). - CHANGELOG Unreleased: Maple head overlays + BF16 KV tier, no quality/perf claims. - registry/v1.json verified content-identical to a fresh generator build (timestamp retained deliberately for bundled-wins precedence).
Manifest fulfillment uploads through the GPU buffer pool and rolls back to it, instead of raw hip.malloc paired with pooled frees which retained ~one model's VRAM per load/unload cycle. Cycle test now asserts the post-warmup plateau with pool-hit evidence; AWQ numerics rest on a quantized lm_head 2:1 divide-ratio oracle. Legacy loader path unchanged.
Beta ac44279 (Maple landing incl. 736/734, PR670 closed). Resolved additively: Unreleased keeps both the pooled-manifest-load note and the Maple/DFlash entries; runtime map regenerated from the merged tree. LoadCtx delta is comment-only; legacy AWQ attach seam keeps its signature. Manifest pooled fulfillment and post-norm AWQ ratio oracles preserved intact.
RATCHET-RAISE: daemon_lines 4398 -> 4408, traded for optional params.head overlay plumbing in the daemon load handler (9-line path extract + 1-line admission/preflight handoff of effective base+head before teardown; arch-free string control-plane for hipfire run --head). Measured daemon_lines is 4408.
Workspace + lock workspace packages 0.3.0 -> 0.3.1 (offline resolution; third-party versions untouched). CITATION version/date 0.3.1 / 2026-09-10. README: stable badge back to published v0.2.1, v0.3.1 as next-release candidate; install pins unchanged. CHANGELOG: fold Unreleased fixes (VCN JPEG prepass, loader pool txn, DFlash rollback, K2816 prerequisite, Maple #670) into v0.3.1 verbatim; history preserved, no new claims.
…Q8 batches Enable the 26B-A4B lowered route end to end: admission serves lowered loads, scratch/KV share the max_seq authority, batched prefill shares the single-token indexed MoE semantics (moe_token_indexed), and Q8 projections route through an explicit F32 batched path. Validated fixture gemma-4-26b-a4b-it.hfq4g128-maintainer.hf4 (see CHANGELOG Unreleased).
Beta at 35dbd64 (704 loader compose, 670 Maple, landed 734 kernel prerequisite + MQ4 counterpart + GPU parity test). Resolutions, all additive/source-grounded: - CHANGELOG Unreleased keeps beta's manifest/704, K2816-prereq, and Maple entries alongside the Gemma lowered-route entry. - replay kernarg arm takes beta's canonical mq4-k2816 placement; drops our duplicate line (pointer/test-list entries already single). - attention keeps both new KV writers: 667's kv_cache_write_q8_0_ring and beta's kv_cache_write_bf16 (+batched). - Kernel consts/launchers merged to single definitions with unchanged K2816 semantics (FIXED_GROUPS 11, generic tail 0 preserved). - All conflicted crate maps regenerated from the merged tree.
Batched prefill diverged from per-token decode on prompts longer than one flash tile while short prompts matched: 124-token prefill logits maxdiff 6.052170 with greedy divergence at continuation token 0. Causal isolation (maintainer fixture gemma-4-26b-a4b-it.hfq4g128-maintainer.hf4, gfx1201): all 124 L5 Q/K/V inputs and used K/V-cache rows compared exact across both arms (raw byte-preserving download; 1088B Q8 rows = 2 heads x 16 blocks x 34B), yet attention outputs differed 3.8146973e-6 at positions 1/123 with BOS exact. Only the batched HD512 Q-preload lane grouping and four-term dot association changed (attention_flash_q8_0_tile_batched.hip); no PhaseD, reducer, ABI, descriptor/window, or other-dimension changes. After the alignment: all 623 input/cache/output comparisons exact, all 360 sampled layer-stage comparisons exact across 30 layers and positions 0/1/123, all 262144 prefill logits byte-identical with 24 identical continuation tokens, reproduced on 15/124/370/1108-token prompts including multichunk and window wrap. The new fixture-free HD512 regression case fails the preimage kernel on all non-BOS rows and passes the candidate. Also: correct stale default-OFF comment for the now-default-ON lowered path; add the HD512 windowed-attention regression example.
# Conflicts: # CHANGELOG.md
RATCHET-RAISE: daemon_lines 4408 -> 4410, traded for Gemma4 (arch 13) bench_decode control-plane wiring in hipfire-daemon (fc59b59): admit arch_id 13 in the single-GPU guard, name Gemma4 in the unsupported error, and match BenchDecodeRoute::Gemma4 on the prime and step arms so lowered Redline probes share the Qwen3.5/Muse path. Net +2 (5 insertions / 3 deletions) vs beta 35dbd64; measured daemon_lines is 4410.
Reject lowered contexts below 128 before resident teardown and cap the sliding ring by the logical context. Retain actual owners through partial weights, scratch and KV construction, reclaim nested AWQ and initialization failures, and use pooled lowered weight uploads for repeat loads. Align oracle short-context and rollover geometry with production mixed Q8/asym3 KV. Verified on gfx1201: nine GPU failure/retry regressions, full workspace lib tests, release all-target and production builds, native 512 -> rejected 64 -> resident generation -> unload/reload 128 (Hello there! throughout), and oracle runs at 15 and 1108 IDs. Full runtime promotion receipts are tracked on PR 730; no performance claim. Ratchet tradeoff: daemon_lines 4410 -> 4411 solely passes max_seq as one additional argument to pre-teardown source admission; no architecture policy was added to the daemon. The existing bypass ceiling remains 257.
Collaborator
Author
|
Correction receipt for beta bfa1c90:
Temporary recovery instrumentation and temporary build artifacts were removed. Promotion remains draft: final-commit Qwen chain and Redline replay receipts remain outstanding, along with the required approving GitHub review. Master remains unchanged. Advisory Clippy still reports the pre-existing approximate-PI literal in test_dflash_hidden_scatter_gfx1100.rs:29. |
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.
v0.3.1 — beta → master
Maintainer-integrated candidate:
b8092f7c7fe0eb3dabccc28e8993ee10c3465fc6.Required CI passes; independent technical review requests changes. Keep draft; master is unchanged.
Remaining correction wave: reject unsupported small Gemma max_seq before allocation and cap the sliding ring correctly; roll back every partially constructed Gemma GPU owner; correct the oracle geometry and release claims. Existing numerical/serving passes do not establish those untested failure boundaries. GitHub also requires an approving review from another account; no bypass has been authorized.
Workspace/Cargo.lock and citation metadata are 0.3.1; independently versioned packages remain unchanged. README distinguishes this promotion from the last published release. This PR does not create a tag or publish a release.
Scope
c91f4b65is not part of perf(gfx11): optimize Qwen DFlash speculative verify #695 or this promotion.Gemma maintainer repair and proof
Prerequisite #734 lands before #667. Single-token and separate batched-prefill APIs share indexed MoE semantics; Gemma Q8 batched projections explicitly retain F32 math. The HD512 batched-attention Q preload and four-term dot association now match decode. No change to the other head dimensions, descriptor/window ABI, or final reduction. Temporary divergence probes were removed.
Fixture:
gemma-4-26b-a4b-it.hfq4g128-maintainer.hf4, 15,343,188,028 bytes, SHA25611cf46cba97f5e279d351f9d31cf4bdd78cb1fbc7c16da2433e6141ae7e07d53. Built from the locally available Google HF snapshot; this is not the author's unavailable artifact and is not a new registry publication.On gfx1201 / HIP 7.15:
Limits are explicit: eight-token serial harness capture exceeds the existing 4096-launch recorder budget and is not admitted by this report. The raw124-token parity prompt produces the same
[]loop in both arms—numerical parity is not coherence. Gemma serving statistics/finish metadata are absent in these reports; no token-rate claim is made. No new gfx1100/gfx1151 Gemma proof, broad quality admission, or performance claim.Combined product receipts
Canonical Qwen3.8-27B XT target SHA256
9f91556f7e0431a077d03756a7102d0154108757289e6e5fe9a2d204c0c9eeb7; draft SHA256d0a74a232a0e2166d889f823e91e0fbf778d21dd9668d7de055cdecb065401bc(both rehashed). DFlash battery and chain each5/5, all decoded answers inspected, all DFlash-active and normal stop; chain reaches998 context tokens with cached prefixes. Q8, greedy, thinking off, max_seq4096, max_tokens512. One cold-load warmup exceeded the harness's180s wait; retry completed, and the chain explicitly uses600s. No loading error or performance claim.Earlier per-PR receipts remain scoped to their tested artifacts: #736 six real GPU rollback tests; #734 four K2816/K2048×MQ4/HFQ numerical cases; #670 head/KV native matrix, invalid-head retention and window checks; #704 exact19-position manifest/legacy parity, real AWQ scaling and four-cycle post-warmup VRAM plateau. The tiny #704 fixture's stock512-token battery fails identically on unchanged beta and candidate; only its coherent scoped smoke is claimed. Maple does not support the Redline shadow route; no Maple PM4 proof is claimed.
Final unit validation exposed a synthetic Llama fixture disappearing before its legacy reopen. Tests now retain uniquely owned NamedTempFile fixtures through every read; no test serialization, ignored oracle, or weakened assertion. The test-only override is
G3_FIXTURE, outside the productionHIPFIRE_*configuration namespace.Ratchets and limitations
Declared
RATCHET-RAISE: daemon_lines 4155 -> 4410andRATCHET-RAISE: bypass_total 237 -> 257; the PR retainsratchet-raise. Leanup21/21, crate maps43/43, environment ownership and ratchet-diff against master pass.Windows-host proof for #737 was explicitly waived by the maintainer. Linux/gfx1201 GPU roundtrip passed; Windows execution is not claimed. #694 remains optional WIP, open and outside this promotion.
Disposition
After promotion, close superseded #682 #686 #687 #688 #689 #690 #691 #692 #695 #700 #701 #708 #725 #726 #728 #729 #680 #697. Preserve their branches and attribution. #667 is closed after its attributed beta integration; #734/#735/#736/#670/#704 and earlier superseded PRs already have integration receipts.
Final local gates and identities
cargo build --release --workspace --all-targets --locked: pass.cargo test --lib --workspace --locked --quiet: pass on b8092f7, including repaired concurrent Llama fixture ownership.00c1ca17422f3073e9a0f92b88d83bee(hipfire 0.3.1, b8092f7).90abfc926a93d9b3048ac5838a3eb122: byte-identical to the Gemma and canonical DFlash runtime receipts. Serving CLI at b5 was334296da4b4b0d271ceb13a718146d4e; intervening changes are test-only fixture ownership/dependency/maps._pr_smokes/release031-{gemma-battery,gemma-chain,gemma-redline2,final-gemma,final-qwen-battery,final-qwen-chain}.json; no benchmark rate is promoted.