perf(qwen36): Q8_0→Q4_K requant of GDN input projections (attn_qkv + attn_gate) (+11.5% @128)#267
Conversation
⚪ sparkinfer auto-eval —
|
| metric | value |
|---|---|
| label | eval:none |
| scored decode (512 ctx · 512-context · Qwen3.6) | 252.23 tok/s |
| vs same-box main | 251.87 tok/s → +0.1% (+0.4) |
| correctness (Qwen3.6 vs llama.cpp) | top-1 97.1% · KL 0.0161 |
| Qwen3.6 128-token no-regression gate | 255.02 tok/s vs main 254.72 tok/s · pass |
| Qwen3.6 512-context no-regression gate | 252.23 tok/s vs main 251.87 tok/s · pass |
| Qwen3.6 4k-context no-regression gate | 239.27 tok/s vs main 239.0 tok/s · pass |
| Qwen3-30B-A3B guard — accuracy | top-1 95.3% · KL 0.0196 · pass |
| Qwen3-30B-A3B guard — 128-token | 498.01 tok/s · pass |
| Qwen3-30B-A3B guard — 512-context | 473.04 tok/s · pass |
| Qwen3-30B-A3B guard — 4k-context | 395.27 tok/s · pass |
| Qwen3-30B-A3B guard — 16k-context | 331.54 tok/s · pass |
| Qwen3-30B-A3B guard — 32k-context | 262.01 tok/s · pass |
Within the significance gate — no verified speedup over same-box main.
RTX 5090 (sm_120) · 128/512/4k/16k/32k guarded · scored vs same-box main · strongest context scores · built from source · correctness vs llama.cpp. Automated — not merged; merge manually after review.
c42844c to
d771b0e
Compare
99f613b to
0af2761
Compare
✅ sparkinfer auto-eval —
|
| metric | value |
|---|---|
| label | eval:M |
| scored decode (128 ctx · 128-context · Qwen3.6) | 278.76 tok/s |
| vs same-box main | 254.72 tok/s → +9.4% (+24.0) |
| correctness (Qwen3.6 vs llama.cpp) | top-1 97.7% · KL 0.0165 |
| Qwen3.6 128-token no-regression gate | 278.76 tok/s vs main 254.72 tok/s · pass |
| Qwen3.6 512-context no-regression gate | 275.13 tok/s vs main 251.87 tok/s · pass |
| Qwen3.6 4k-context no-regression gate | 259.22 tok/s vs main 239.0 tok/s · pass |
| Qwen3-30B-A3B guard — accuracy | top-1 96.3% · KL 0.0337 · pass |
| Qwen3-30B-A3B guard — 128-token | 481.04 tok/s · pass |
| Qwen3-30B-A3B guard — 512-context | 458.7 tok/s · pass |
| Qwen3-30B-A3B guard — 4k-context | 385.49 tok/s · pass |
| Qwen3-30B-A3B guard — 16k-context | 326.91 tok/s · pass |
| Qwen3-30B-A3B guard — 32k-context | 254.88 tok/s · pass |
Verified speedup over same-box origin/main — 278.76 tok/s (main was 254.72 tok/s).
RTX 5090 (sm_120) · 128/512/4k/16k/32k guarded · scored vs same-box main · strongest context scores · built from source · correctness vs llama.cpp. Automated — not merged; merge manually after review.
|
The round's |
19b2c7f to
374d05e
Compare
|
The round's |
e0e6d65 to
e36ea94
Compare
❌ sparkinfer auto-eval —
|
| metric | value |
|---|---|
| label | eval:REJECT |
| Qwen3.5 score | eval-qwen35:REJECT (fail) |
| Qwen3.6 score | eval-qwen36:REJECT (fail) |
| Qwen3.5 vs same-box main | 291.58 tok/s → +0.1% (+0.2) |
| Qwen3.5 scored decode (512 ctx · 512-context) | 291.74 tok/s |
| Qwen3.5 correctness | top-1 95.5% · KL 0.0269 |
| Qwen3.5 128-token no-regression gate | 294.53 tok/s vs main 294.41 tok/s · pass |
| Qwen3.5 512-context no-regression gate | 291.74 tok/s vs main 291.58 tok/s · pass |
| Qwen3.5 4k-context no-regression gate | 282.76 tok/s vs main 282.76 tok/s · pass |
| Qwen3.6 vs same-box main | 411.07 tok/s → +0.0% (+0.0) |
| Qwen3.6 scored decode (512 ctx · 512-context) | 456.42 tok/s |
| Qwen3.6 correctness | top-1 0.0% · KL 99.0 |
| Qwen3.6 128-token no-regression gate | 463.37 tok/s vs main 417.33 tok/s · pass |
| Qwen3.6 512-context no-regression gate | 456.42 tok/s vs main 411.07 tok/s · pass |
| Qwen3.6 4k-context no-regression gate | 435.23 tok/s vs main 394.76 tok/s · pass |
| Qwen3.6 16k-context no-regression gate | 432.01 tok/s vs main 392.56 tok/s · pass |
| Qwen3.6 32k-context no-regression gate | 413.18 tok/s vs main 376.4 tok/s · pass |
| Qwen3.5 optimize | eval:REJECT · 291.74 tok/s · fail |
| Qwen3.5 optimize — Qwen3.6-35B-A3B guard accuracy | top-1 0.0% · KL 99.0 · FAIL |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 128 | 463.39 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 512 | 456.46 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 4k | 435.11 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 16k | 432.03 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 32k | 413.24 tok/s · pass |
| Qwen3.6 optimize | eval:REJECT · 456.42 tok/s · fail |
| Qwen3.6 optimize — Qwythos-9B (Q4_K_M) guard accuracy | top-1 95.5% · KL 0.0269 · pass |
| Qwen3.6 optimize — Qwythos-9B (Q4_K_M) 128 | 294.48 tok/s · pass |
| Qwen3.6 optimize — Qwythos-9B (Q4_K_M) 512 | 291.66 tok/s · pass |
| Qwen3.6 optimize — Qwythos-9B (Q4_K_M) 4k | 282.72 tok/s · pass |
Rejected — correctness gate: top1=0.0 (need >= 0.9), kl=99.0 (need <= 0.2).
RTX 5090 (sm_120) · 128/512/4k/16k/32k guarded · scored vs same-box main · strongest context scores · built from source · correctness vs llama.cpp. Automated — not merged; merge manually after review.
Re-benchmarked on RTX 5090 (75.152.195.46). vs gittensor-ai-lab#353-only main on same box: 128: 438.9 -> 489.3 tok/s (+11.5%) 512: 432.2 -> 481.7 tok/s (+11.4%) 4k: 415.7 -> 461.2 tok/s (+10.9%) 16k: 411.0 -> 455.6 tok/s (+10.9%) 32k: 394.2 -> 433.6 tok/s (+10.0%) Correctness (fuzzed prompt, teacher-forced vs llama.cpp): top-1 93.6%, KL 0.026 (gate >= 90%, <= 0.20). Full evaluate.sh + bidir harness pass locally. Prior eval:REJECT (top1=0, kl=99) was accuracy.sh infra failure, not model regression.
✅ sparkinfer auto-eval —
|
| metric | value |
|---|---|
| label | eval:XL |
| Qwen3.5 score | eval-qwen35:none (pass) |
| Qwen3.6 score | eval-qwen36:XL (pass) |
| Qwen3.5 vs same-box main | 294.23 tok/s → +0.1% (+0.2) |
| Qwen3.5 scored decode (128 ctx · 128-context) | 294.39 tok/s |
| Qwen3.5 correctness | top-1 93.5% · KL 0.0353 |
| Qwen3.5 128-token no-regression gate | 294.39 tok/s vs main 294.23 tok/s · pass |
| Qwen3.5 512-context no-regression gate | 291.62 tok/s vs main 291.66 tok/s · pass |
| Qwen3.5 4k-context no-regression gate | 282.74 tok/s vs main 282.68 tok/s · pass |
| Qwen3.6 vs same-box main | 411.16 tok/s → +11.0% (+45.3) |
| Qwen3.6 scored decode (512 ctx · 512-context) | 456.42 tok/s |
| Qwen3.6 correctness | top-1 95.3% · KL 0.031 |
| Qwen3.6 128-token no-regression gate | 463.27 tok/s vs main 417.52 tok/s · pass |
| Qwen3.6 512-context no-regression gate | 456.42 tok/s vs main 411.16 tok/s · pass |
| Qwen3.6 4k-context no-regression gate | 435.14 tok/s vs main 394.87 tok/s · pass |
| Qwen3.6 16k-context no-regression gate | 432.1 tok/s vs main 392.58 tok/s · pass |
| Qwen3.6 32k-context no-regression gate | 413.14 tok/s vs main 376.21 tok/s · pass |
| Qwen3.5 optimize | eval:none · 294.39 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B guard accuracy | top-1 95.3% · KL 0.031 · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 128 | 463.25 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 512 | 456.36 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 4k | 435.14 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 16k | 432.18 tok/s · pass |
| Qwen3.5 optimize — Qwen3.6-35B-A3B 32k | 413.21 tok/s · pass |
| Qwen3.6 optimize | eval:XL · 456.42 tok/s · pass |
| Qwen3.6 optimize — Qwythos-9B (Q4_K_M) guard accuracy | top-1 93.5% · KL 0.0353 · pass |
| Qwen3.6 optimize — Qwythos-9B (Q4_K_M) 128 | 294.36 tok/s · pass |
| Qwen3.6 optimize — Qwythos-9B (Q4_K_M) 512 | 291.64 tok/s · pass |
| Qwen3.6 optimize — Qwythos-9B (Q4_K_M) 4k | 282.75 tok/s · pass |
Verified speedup over same-box origin/main — 456.42 tok/s (main was 411.16 tok/s).
RTX 5090 (sm_120) · 128/512/4k/16k/32k guarded · scored vs same-box main · strongest context scores · built from source · correctness vs llama.cpp. Automated — not merged; merge manually after review.
|
✅ Auto-merged as the round's |
PR #267 was rewritten but data.json kept the July 6 eval, so record_merge never advanced landed_qwen36. Backfill the XL bidir eval, restore baseline_tps, and use ctx_128_tps for Qwen3.6 journey steps.
Backfill left polaris_receipt_url unset even though 0267-ca7028c has a TDX receipt; the proof column showed clipboard instead of shield. Teach backfill to pull polaris fields from sparkinfer-log receipt.json.
Summary
Load-time Q8_0 → Q4_K requant of the Qwen3.6 Gated-DeltaNet input projections —
attn_qkv(wqkv) andattn_gate(the z gate), shipped Q8_0 on all 30 GDN layers. These are the single largest per-token weight read in decode — larger than the full-attention q/o requantized by #353 or thessm_outof #355. This extends the merged #353 requant path to these two tensors, reading ~47% fewer bytes on those matvecs. Gated to the Qwen3.6 fingerprint; a strict no-op on every other model.Proof of speedup
sm_120)Decode tok/s (end-to-end,
qwen3_gguf_bench, Qwen3.6-35B-A3B UD-Q4_K_M, same-box A/B):Correctness
The GDN input projections feed the recurrent state, so the lossy Q4_K fit was validated carefully. Natural text (Project-Gutenberg-style corpus), 1500 teacher-forced positions, this PR (Q4_K) vs main (Q8_0):
All 30 GDN layers stay inside the accuracy gate with ~10x margin because the fit reuses the merged Lloyd-max coordinate-descent Q4_K quantizer (
proj_q4k_lloyd.cu, from #353). A plain affine fit is not accuracy-safe at full layer coverage on this tensor.SPARKINFER_ATTN_REQUANT_Q4K=attn_q,attn_outputrestores the #353-only behavior for A/B.Changes
runtime/src/models/qwen35.cpponly (+6/-1): extends the Qwen3.6 defaultSPARKINFER_ATTN_REQUANT_Q4Kmode toattn_q,attn_output,qkv,attn_gateand adds theattn_gatehandler toreq_attn_q4. No new kernel — after the stored type flips to Q4_K, the GDN qkv+z projection site already branches on tensor type and routes through the existinglaunch_mmvq_gdn_qkv_z_pack2(Q4_K fused) path automatically.Test plan
qwen3_gguf_bench+qwen3_gguf_scoreon RTX 5090 (sm_120)attn_q,attn_output)