Commit Graph

318 Commits

Author SHA1 Message Date
noonghunna
ffbcb64dcf docs(multi-max): caveat — fp8 KV flip needs fresh 4-card re-validation
The prior 4-card validation (@Whamp #446) was on the OLD int8-PTH KV. #595 flips
to fp8/e4m3; the fp8 config is validated on the 2-card dual-max proxy (all gates
green) but not yet re-confirmed at TP=4. Request a fresh 4-card report before
upgrading ⚠️ caveats -> .

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-06 15:00:52 +00:00
noonghunna
fabf9ce1ea feat(qwen): flip multi-max to fp8/e4m3 KV + weights-conditional Ampere compat
Follow-up to #594 (which flipped dual-max int8-PTH -> fp8). Mirrors it on the
4-card tier and makes the registry/compat model reflect reality:

- multi4/fp8/mtp.yml: KV default int8_per_token_head -> fp8 (+ header, mirrors
  dual-max: fp8->e4m3, FlashInfer, scale=1.0, not-e5m2)
- registry kv_format: dual-max + multi-max int8_per_token_head -> fp8_e4m3
  (jesse's #594 changed only the compose, leaving the registry stale) + de-stale
  the status_notes (fp8 KV, 8-pack 109 ties 107, soak p50 125.5)
- compat.py C5: weights-conditional rule. fp8_e4m3 KV is allowed on Ampere
  (sm>=8.6) ONLY for fp8-weights checkpoints (FlashInfer path). Non-fp8 weights
  (Gemma W4A16) still route to Triton (needs SM89+) and stay correctly rejected.
  No rtx-3090 profile change -> Gemma protection intact via the profile.
- test-launch-compat: assert BOTH directions (Qwen fp8-weights passes, Gemma
  gemma-mtp-tp1 still fails C5) so the rule + registry stay in sync.
- DTYPE_MATRIX: cite vLLM's fp8-KV blog (scale=1.0 = near-lossless lower bound;
  Qwen3.5-27B matches baseline AUC @1M) + document the weights-conditional rule.

Validated: dual-max + multi-max validate-variant PASS with fp8_e4m3 on 2x/4x
3090; gemma-mtp-tp1 still rejected. 11 compat/registry guards green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-06 14:55:01 +00:00
noonghunna
605b8a6f94 docs(dual-max): accurate fp8/e4m3 KV header — scale=1.0, FlashInfer, quality tie, soak PASS
Comment-only polish on the KV flip (no runtime change):
- fp8 -> e4m3 runs at scale=1.0 (checkpoint is weight-only; calculate_kv_scales
  is disabled on Qwen3-Next hybrid), not "loads the checkpoint's scales"
- must be `fp8` not `fp8_e5m2` (e5m2 hard-rejected with fp8 checkpoints)
- backend FlashInfer (int8-PTH is TRITON_ATTN-only) -> flat decode at depth
- quality 109 ties int8-PTH 107; soak-continuous PASS (0 growth, 509 MB margin)
- fix comparison-table column spacing

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-06 14:02:25 +00:00
JesseB-Kit
6eaeb2bd44 feat: switch dual-max KV from int8_per_token_head to fp8 2026-07-06 12:58:08 +02:00
noonghunna
cbe544a3c6 Record multi-fast's measured 4-card quality (108/150, @ryanmpelletier #584)
@ryanmpelletier rebuilt the benchlocal sandboxes and ran the full 8-pack on
his 4x 3090 (v0.24.0, thinking-off): TOTAL 108/150 — within +-1 of the 109/150
we carry from the 2-card fast tier (vllm/dual). So multi-fast's quality is now
MEASURED TP-invariant on real 4-card hardware, not assumed.

- baselines.yml: ryan's 4x3090-pcie submission gains quality_8pk: 108/150 +
  quality_env (harness provenance — the first quality ingest into a submission
  row, the friction-#8 / slice-3e hook: a quality number carries its harness
  fingerprint so it's reproducible).
- compose header Quality: 'open follow-up' -> the measured 108/150 confirmation.

Closes the last open item on the multi-fast promotion (bench + soak + quality
all confirmed on 4-card). Does NOT touch multi-max's caveat (that needs an
fp8 4-card report, not INT4).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-06 09:42:47 +00:00
noonghunna
796ceaf6af Promote vllm/qwen-27b-multi-max to Production w/ caveats (@Whamp #446)
The 4-card FP8 max tier is byte-identical to the now-production
vllm/qwen-27b-dual-max apart from TP=4 + gpu-count. We can't self-validate
(2-card dev rig), so it rides @Whamp's cross-rig full chain — #446, 4x 3090:
verify-full + verify-stress 7/7 + soak-continuous PASS (85/102).

Status experimental -> ⚠️ Production w/ caveats (registry 'caveats' + header
Caveats line + drift guard green). The caveat, stated honestly: that
validation was on an OLDER engine (pre-v0.24.0 pin) + a non-standard rig
(aikitoria P2P kernel, mixed x4/x16/x8/x16 lanes), single report — no clean
v0.24.0 4-card datapoint yet. A fresh one (like @ryanmpelletier's for
multi-fast) upgrades it to bare .

No baseline row inducted: @Whamp's number is under-specified (engine version
unstated, non-standard rig), so inducting it as THE bar would mislead — the
status_note carries the provenance + caveats instead. No DEFAULTS change.
Removed the now-contradictory '🧪 Experimental until a ≥4x host validates it'
prose from the header.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-06 09:13:58 +00:00
noonghunna
7174ad91c4 Promote vllm/qwen-27b-dual-max to Production (soak completes the gate)
The FP8 max-accuracy tier had bench (83.1/108.2) + quality (107/150) on the
2x3090 reference rig but no soak-continuous run — the one missing gate item.
Ran the full operational gate fresh on the v0.24.0 pin:
  - verify-full 9/9
  - verify-stress: all 6 rungs, fillable to 240,636 tok clean (91%)
  - soak-continuous PASS: 0 err / 0 growth / 100% retention, p50 decode 85
That clears the production bar.

- registry + compose header: status experimental -> production (drift guard
  green). status_note also de-staled: dropped the '~56 TPS' probe / 'slowest of
  the three' framing (corrected to decode 83/108, the slow axis is PREFILL/TTFT
  from MarlinFP8 W8A16 on Ampere, not decode) + the full-gate results.
- baselines.yml: row comment notes the soak PASS completing the gate.
- No DEFAULTS[(qwen,vllm,dual)] change -> vllm/dual (fast) stays the dual
  default; dual-max just joins the actionable list as the max-fidelity tier.

Bonus for the 5090 crowd: dual-max is now a non-experimental config, so the
launch command drops --force (bash scripts/switch.sh vllm/qwen-27b-dual-max).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-06 01:12:42 +00:00
noonghunna
7e474f4c2b DeepGEMM: cover fp8-dynamic weights too (agents-a1) — all fp8 slugs 5090-safe
#588 fixed the fp8-weights DeepGEMM crash but the _deepgemm_env gate (and my
guard) matched weights_variant == 'fp8' EXACTLY — missing agents-a1, whose
weights are 'fp8-dynamic' (compressed-tensors FP8). Those are genuine FP8
weights that route FP8 GEMM, so a 5090 running vllm/agents-a1-dual would still
hit the 'recipe not found' crash the whole framework is meant to prevent.

- _deepgemm_env gate: weights_variant == 'fp8' -> startswith('fp8'), catching
  both 'fp8' and 'fp8-dynamic' (compressed-tensors). INT4/AWQ/W8A8/bf16 never
  route FP8 GEMM so they stay correctly excluded.
- agents-a1 compose: add the - VLLM_USE_DEEP_GEMM pass-through.
- test-deepgemm-fp8-parity: broadened to startswith('fp8') so it now covers
  agents-a1 (5 fp8-family composes) + any future fp8-* variant.
- test-launch-compat: new case — fp8-dynamic on 5090 injects VLLM_USE_DEEP_GEMM=0.

Now ALL fp8-family vLLM slugs are 5090-safe via the launcher (dual-max,
multi-max, dual-lmcache, diffusiongemma-dual, agents-a1). Convention: fp8
weight variants must be named fp8-* for the gate/guard to catch them.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-05 23:20:06 +00:00
noonghunna
f3b55a03af fp8 composes: add VLLM_USE_DEEP_GEMM pass-through parity + drift guard
#580 added the consumer-Blackwell DeepGEMM auto-disable pass-through to
dual-max, but the other fp8-weights vLLM composes — hand-maintained
parallel copies, no extends/include — had silently drifted without it:
multi-max, dual-lmcache, diffusiongemma-dual. On a 5090 / PRO 6000 / GB10
(sm_120/121) the launcher's _deepgemm_env injects VLLM_USE_DEEP_GEMM=0, but
with no receiving line docker-compose drops it → the fp8-GEMM 'recipe not
found' boot crash #580 fixed for dual-max (disc #571).

- Add the  pass-through (+ the shared comment) to all
  three. All 4 fp8-weights vLLM composes now carry it.
- NEW test-deepgemm-fp8-parity: asserts every fp8-weights vLLM compose has
  the pass-through — REDs on the exact drift class that caused this (verified
  it fails when the line is removed, passes when restored). Scope matches the
  _deepgemm_env gate (weights_variant==fp8 + vllm engine); INT4/AWQ/bf16 never
  invoke DeepGEMM so they're correctly excluded.

Removes ONE 5090 blocker (fp8 crash) — NOT a blanket 'runs on 5090': beellama
composes stay broken on sm_120 (Anbeeld#85, CUDA 12.4), llama.cpp/INT4 on
sm_120 remain unvalidated (no 5090 on the reference rig).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-05 22:46:20 +00:00
noonghunna
b8f2d2b927 Promote vllm/qwen-27b-multi-fast to Production + induct 4x3090 baseline (#584)
@ryanmpelletier's flawless 4x 3090 report (#584) is the cross-rig
validation the compose header required ('until a real >=4x 3090 host
validates it'): v0.24.0, no power caps, all x16, verify-full 9/9,
verify-stress needles clean to 240K, soak-continuous PASS, bench n=5.
Third concordant 4-card validation (after @alanspires 6xVFIO + @Whamp),
first on v0.24.0.

- registry + compose header: status experimental -> production (both, drift
  guard green). No DEFAULTS[(qwen,vllm,multi4)] entry -> no resolver cascade;
  promotion just moves it onto the actionable list. Quality is TP-invariant,
  carried from the vllm/dual proxy (109/150); 4-card 8-pack is the open
  confirmation (report.sh runs none).
- baselines.yml: vllm/qwen-27b-multi-fast gains its 4x3090-pcie submission
  (tier: submitted; decode 74.76/90.83, prefill 1288->1175, KV pool
  1.77M/6.77x, NIAH 240K). Submission-only by construction - the 2-card
  reference rig can never produce a local 4-card row.
- BENCHMARKS.md: ryan's row (all-x16 74.8/90.8 beats @Whamp's mixed-lane
  59/74 on the same fp8-KV config -> PCIe lane width matters for TP=4).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-05 22:33:26 +00:00
noonghunna
fd56fe7ad5 dual-max: induct 2x3090 baseline row + correct the stale ~56 TPS probe
The dual-max FP8 2x3090 decode bench (83.1/108.2, v0.24.0, 2026-06-30) lived
only in BENCHMARKS.md:122 + disc #515 (c17490565) — never inducted into
baselines.yml, so c3 / the registry-emit join showed only guybrush01's
2x5090 submission and no local bar. Surfaced while diagnosing #585.

- baselines.yml: vllm/qwen-27b-dual-max gains its primary tier: local row
  (83.1/108.2 · TTFT 158 · prefill 1364->875 · 8-pack 107/150 · NIAH 240K ·
  v0.24.0 = current pin -> FRESH); guybrush's 2x5090 submission preserved.
- compose header + DUAL_CARD.md: the stale '~56 TPS' probe (and the now-false
  'slowest of the three' framing) -> real decode 83/108; the genuine
  tradeoffs (smallest KV pool 295K/1.13x, slowest prefill/TTFT 158ms from
  FP8's compute-heavy Marlin W8A16 dequant) kept. BENCHMARKS.md already
  corrected; this closes the two spots that still read ~56.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-05 22:07:39 +00:00
noonghunna
deb58a5f55 fp8w on Blackwell: auto-disable DeepGEMM + --force the arch-ab arm
Two fixes from guybrush01's fp8-weights 5090 run (disc #571), which needed both
to boot the fp8w arm on consumer Blackwell.

1) VLLM_USE_DEEP_GEMM: vLLM's DeepGEMM fp8-GEMM path is built for Hopper (sm_90)
   + datacenter Blackwell (sm_100/103). Consumer Blackwell (5090 / PRO 6000 /
   GB10, sm_120/121) has no recipe and hard-fails "recipe not found" at boot.
   Add _deepgemm_env: for fp8-weights slugs, inject VLLM_USE_DEEP_GEMM=0 on the
   consumer SMs (sm_120/121 confirmed-broken; sm_89 Ada added proactively — it
   routes fp8 via Marlin/CUTLASS so disabling is a harmless no-op that pre-empts
   the same wall for 4090 owners). Hopper/datacenter untouched. dual/fp8/mtp.yml
   gains a pass-through env; both launchers whitelist the export.

2) arch-ab.sh fp8w arm: add --force. vllm/qwen-27b-dual-max is status=experimental
   so switch.sh gates it without --force.

test-launch-compat locks 5090/Ada-down / Hopper-keep / non-fp8-skip / user-pin.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-05 07:21:34 +00:00
noonghunna
65c150d562 Phase 2 (concurrency-only): memory-envelope MAX_NUM_SEQS injection + probe
The #246 Phase 2 first pass — spend a bigger card's KV pool on
concurrency, weights-invariant. Ships the machinery + measurement; the
32 GB envelope rows land from volunteer probe runs (baselines-style
plumbing-first).

Why concurrency-only (agreed 2026-07-05, design doc): most headline
configs are already at 262K model-max on 24 GB (GGUF single, dual vLLM),
so the extra 32 GB pool serves MORE STREAMS, not more context. The
context lever (bigger max_model_len) only helps single-card vLLM and is
Cliff-2b-capped anyway — deferred.

- Composes: `--max-num-seqs` parametrized to `${MAX_NUM_SEQS:-N}` on the
  two pilot slugs (dual=2, minimal=1). Weights-invariant, default kept.
- envelopes.yml (empty): measured per-(slug, card-class) `max_num_seqs`,
  born-from-measurement (a `validated` block is required — no guesses).
- launch_compat.py `_envelope_env`: injects MAX_NUM_SEQS from a row when
  it EXCEEDS the compose default; 24 GB / no-row / heterogeneous /
  user-env-set -> no-op. Both launchers whitelist MAX_NUM_SEQS.
- test-envelopes: schema + injection contract (inject / no-row /
  heterogeneous / user-env-wins / no-gain).
- concurrency-probe.sh: the measurement — N concurrent long streams x R
  rounds, separating expected pool-fill from a real leak (post-warm
  growth). Live-validated N=2 on the dual-3090 (0 MB post-warm growth,
  all rounds clean — the shipped default is sound).

Reuses the Phase 1 injection seam; independent of the KV verdict.
Full scripts gate 67/67.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-05 05:01:23 +00:00
noonghunna
717cb431a9 Un-track A1's compiled torch cache — it crashed Blackwell boots
Root cause of club-3090 #548, pinned from the stack trace: A1's
promotion accidentally committed the whole torch_compile cache (3,667
files, ~20 MB) compiled on THIS sm_86 rig, and the compose warm-start
mount fed it to every fresh pull. On sm_120 the AOT graph (baked
against Marlin-processed FP8 layers -> reads layer.workspace) loads
onto Cutlass-processed layers -> AttributeError -> restart loop.
vLLM's AOT cache key doesn't include arch/kernel selection, so the
cross-arch hit is silent (upstream issue to follow; UPSTREAM.md row
updated with the pinned mechanism).

Fix = the house pattern every other model already has: cache contents
gitignored (cache/.gitignore + README), directory kept for the mount,
local files untouched (our warm-start intact). Fresh users pay one
~60-90s compile on first boot and warm-start locally thereafter --
against THEIR OWN silicon's kernel selection.

Also retires the recurring dirty-tree noise from best_config files
updating during our own runs.

Full scripts gate 65/65.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-04 22:54:50 +00:00
noonghunna
5ea64bc539 Re-gate beellama/gemma-dflash on the official pin; fix rebench-full n=3
The single-card Gemma-4 default was the catalog's only default with no
baseline row (wave-2 PRIORITY gap). Full gate on Anbeeld's OFFICIAL
v0.3.2-preview digest (the current beellama-local pin), rebench tag
gemma-dflash-regate:

- decode 44.91 narr / 79.76 code (n=5, CV 2.1%/5.6%), TTFT 115 ms
- NIAH ladder clean to 117,513 tok (91% of 128K); ceiling margin 929 MB
  (< 1024 MB bar -> caveat stays, but up from ~177 MB pre-v0.3.2)
- 8-pack current harness: 108/150 off / 113/150 on (+5 in-band wash,
  think-off default re-confirmed)
- soak PASS (p50 59.8, 100.6% retention, 0 growth, 0/100 silent-empty)

Row seeded via catalog-baseline.sh (first non-vLLM engine through the
producer flow); BENCHMARKS row + compose header (Quality + margin
numbers) updated to match.

Tooling fallout the gate exposed:
- rebench-full.sh hardcoded RUNS:-3/WARMUPS:-1, silently under-running
  the bench protocol on every orchestrated gate. The A1 "n=3 env leak"
  attribution was wrong -- it was this line (baselines comment
  corrected). Fixed to protocol 5/3; n=3 had flattered gemma-dflash
  code TPS by +8%.
- catalog-baseline.sh counted prefill-probe run-lines into its bench-n
  gate (read n=8 for an n=5 log); now reads the summary headers.

Full scripts gate 64/64.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-04 19:28:03 +00:00
noonghunna
ff96f89506 agents-a1: hardware-metadata header + Blackwell caveat (#548 follow-up)
The A1 compose shipped (#546) without the 'Hardware metadata' block every
sibling carries, so preflight_compose_gpu_fit logged 'WARN: compose has
no hardware metadata; allowing boot' and skipped enforcement — visible in
guybrush01's #548 report. Add the block (min-vram 24 / gpu-count 2 /
TP 2 / Requires-sm 8.0+ — Marlin FP8 weight-only needs sm_80, unlike the
sibling's INT4 7.5+); preflight now parses + enforces (live rc=0).

Also propagate the #548 finding as Caveats (4): Blackwell sm_120 hits an
upstream vLLM v0.24.0 kernel-selection bug at boot ('QKVParallelLinear'
has no attribute 'workspace' — Cutlass W8A8 selected, a Marlin-path
attribute expected). Workaround shipped as a commented env line
(VLLM_TEST_FORCE_FP8_MARLIN=1 — forces the exact weight-only path this
compose's gate validated; verified present in the v0.24.0 image) +
mirrored into the registry status_note so switch.sh's NOTE carries it.

Gates: compose_meta_get parses all 4 keys; docker compose config valid;
test-compose-status-drift / registry-disk / preflight-gpu-fit green;
full scripts gate green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-04 11:34:53 +00:00
noonghunna
6926dfde48 Promote Agents-A1 to the catalog: vllm/agents-a1-dual (production w/ caveats)
InternScience's 35B agentic MoE (Qwen3-Next MoE arch; the card declares its
OWN base -> own model entry, not a qwen fine-tune slug), served from the
official FP8-dynamic compressed-tensors checkpoint on stock vLLM v0.24.0,
dual 3090 TP=2, full 262K. The agentic thinking-ON specialist.

First model onboarded END-TO-END through the Bring & Validate lane (T2
producer-zero): pull.sh route-C sibling swap (post deriver fix) ->
generate-compose -> documented swap -> full gate -> ④ vs-bar -> ⑤ scaffold.

Full gate PASS (rebench tag agents-a1-fp8-dual, 2026-07-03):
- bench 153.9/154.0 decode TPS (n=5, CV 0.1%, TTFT ~130ms), ~22.0 GB/card
- verify-stress 8/8 — staggered NIAH exact-recall to 240K (91%), VRAM Δ0
- soak PASS (0 growth, 0/100 silent-empty, 99.8% retention)
- 8-pack --full OFF 105/150 · ON 110/150 (post benchlocal #79+#81 harness):
  toolcall 15/15 OFF · IF 15/15 ON · cli-40 thinking-ON 23/40 (the stack's
  highest; base 17/40) · hermes 12/20 OFF, REGRESSES to 9/20 thinking-ON
  (verified model behavior — disclosed as caveat 1)

vs qwen3.6-35b-a3b: general capability TIES (ON 110=110), decode −13% —
NOT a general upgrade; reach for it on tool/CLI-agent work thinking-ON.

Catalog wiring: compose dual/fp8-dynamic/fp8.yml (non-default KV named per
convention; OWN port 8072 — sibling-shared ports masquerade the slug in
estate detection); model profile (geometry verified == 35B-A3B from
config.json; mtp_num_hidden_layers=0 — safetensors header shows 0 mtp
tensors, config's 1 is an inherited default); registry entry status=caveats;
kv-calc agents-a1 spec + alias (fit-all prices, calibration 100%);
weights.py aliases (hf auto-fetch); LiteLLM route :8072; BENCHMARKS section;
count bumps (registry 57, disk 58, models 11).

Full catalog suite 60/60 (1 = known worktree-fixture submit-bench).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-03 03:50:14 +00:00
noonghunna
7e9f5cb930 serve: neutral primary model name (qwen3.6-27b / gemma-4-31b), keep -autoround alias
The shared served-model-name `qwen3.6-27b-autoround` (from #490) mislabels the
non-autoround 27b scenes (fp8 dual-max, lmcache): /v1/models advertises
"autoround" while `root` points at qwen3.6-27b-fp8. Same class on gemma-4-31b —
after the v0.24.0 consolidation the default is cyankiwi qat-AWQ-INT4 (bf16 KV),
yet the LiteLLM route still targeted `gemma-4-31b-autoround` (a latent #482 drift).

Fix WITHOUT breaking anything, via vLLM multi-served-name:
- Every 27b scene now serves `qwen3.6-27b <its-quant-name>`; every gemma-31b
  scene serves `gemma-4-31b <its-quant-name>`. The neutral name is PRIMARY
  (honest /v1/models id); the quant-specific name is retained as a live ALIAS.
- LiteLLM: add `qwen3.6-27b` / `gemma-4-31b` canonical public routes; keep the
  `-autoround` routes as back-compat aliases (same upstream). Repairs the gemma drift.
- Migrate our own MODEL= defaults + docs (bench/verify/quality/launch/setup, c3,
  tui-core, EXAMPLES, ...) to the neutral name. Weights slugs (`-autoround-int4`)
  untouched; CHANGELOG + results/ history left as-is.

Retiring the `-autoround` alias entirely is a deliberate later step once nothing
still asks for it.

Live-verified on-rig (single/minimal, stock v0.24.0): /v1/models lists BOTH names
(root=...-autoround-int4); chat to `qwen3.6-27b` AND `qwen3.6-27b-autoround` both
return 200; `qwen3.6-27b-fp8` correctly 404s. Full shell gate 59/59 (1 = known
worktree-fixture); c3 pytest 41 passed; served-name arg-order + YAML validated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-02 11:28:31 +00:00
noonghunna
126e5c5afb hygiene(qwen composes): align stale Engine-profile headers vllm-nightly-clean -> vllm-stable
3 active qwen composes (qwen/minimal, qwen/dual/fp8-mtp, qwen-35b-a3b/dual/fp8)
carried a stale `# Engine-profile: vllm-nightly-clean` docstring — the registry
moved them to vllm-stable (the nightly-clean successor, #254) but the header
comments weren't updated. Cosmetic only: the launcher injects VLLM_IMAGE from the
registry engine's install.spec, NOT from this header (confirmed: launch/preflight
don't parse Engine-profile for resolution). Also corrected the qwen-35b prose that
still said "v0.22.0" (image is v0.24.0) + the "aligning tracked in #254" note (#254
shipped). No functional change — the nightly images were purged; nothing launched them.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-02 09:09:09 +00:00
noonghunna
a6373533e1 Merge pull request #539 from noonghunna/feat/diffusiongemma-v0.24.0
DiffusionGemma → stock vLLM v0.24.0 (drop the :gemma branch digest)
2026-07-02 13:37:39 +05:00
noonghunna
68c6ea80fb bump(diffusiongemma): :gemma branch digest -> stock vLLM v0.24.0
The DiffusionGemma arch is NATIVE in v0.24.0 (PR #45163 merged 2026-06-12), so
the vllm-diffusion-gemma engine drops the mutable/branch :gemma digest for the
same pinned stable tag the rest of the stack uses. The 3 Ampere/TP fix-mounts
STAY (not in #45163): marlin.py + marlin_utils_fp8.py (sm_86 fp8 MoE Marlin
K-pad — #45295's dense marlin-pad in v0.24.0 does NOT cover marlin_moe_wna16)
and diffusion_gemma.py (TP-vocab; native #45163 copy is still TP=1).

Also fixes the compose for v0.24.0's arg-parser: the bare positional model must
be the --model flag (the entrypoint prepends --disable-custom-all-reduce).

Live-validated 2026-07-02: the actual compose boots + serves coherent at TP=2 on
stock v0.24.0 (Paris / primary colors / 42). Suite 59 pass / 1 pre-existing
(test-submit-bench worktree-fixture-absent).

- engine vllm-diffusion-gemma.yml: install.spec :gemma@digest -> v0.24.0 + provenance
- compose base.yml: image default -> v0.24.0 + --model flag fix + header
- patches.yml dgemma-gemma-image-fixes: reason/drift_guard/drop_when -> v0.24.0
- BENCHMARKS + UPSTREAM #45163 row: reflect the bump

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-02 08:23:39 +00:00
noonghunna
f7214fb4d3 docs(gemma-31b): reflect the v0.24.0 bf16 consolidation
README + DUAL_CARD: single bf16 vllm/gemma-31b-dual @224K default (stock
v0.24.0, overlay-free); the v0.22.0 int8-PTH/bf16-mtp/qat-w4a16 composes are
deprecated. UPSTREAM #40391 row: the 31b DEFAULT moved to bf16 (int8-PTH craters
recall on v0.24.0 without #40391); the #40391/#42006 overlays + vllm-gemma-stable
STAY for the 26b-a4b-single + the deprecated 31b composes. 262K int8-PTH returns
overlay-free when #40391 merges.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-02 08:05:25 +00:00
noonghunna
6cfcbc6bc0 consolidate(gemma-31b): single bf16 dual slug on v0.24.0, retire v0.22.0 composes
vllm/gemma-31b-dual now serves cyankiwi QAT-AWQ-int4 + bf16 KV @224K on stock
vLLM v0.24.0 (base.yml), OVERLAY-FREE — folds onto vllm-stable, retiring the
31b's vllm-gemma-stable dependence. Promoted to ⚠️ Production w/ caveats
(validated 2026-07-02: verify-full 9/9, verify-stress→210K @ 1162MB VRAM
margin, bench ~59 TPS, soak PASS).

bf16 not int8-PTH: on v0.24.0 int8-PTH allocates 262K but silently craters
recall past ~32K (needs PR #40391, open/unmerged upstream — the same cyankiwi
weights recall clean to 112K+ on v0.22.0+#40391). int8-PTH 262K returns free
when #40391 merges. MTP disabled (Gemma-4 MTP x tools broken on v0.24.0,
vLLM #39043 / #42006 closed-unmerged).

- remove the broken #537 int8.yml (recall cliff); base.yml replaces it
- DEFAULTS (gemma-4-31b,vllm,dual) -> vllm/gemma-31b-dual
- deprecate gemma-int8-mtp / gemma-bf16-mtp / qat-w4a16 (registry + header)
- fix 2 false "gemma int8-PTH native @262K" claims in vllm-stable.yml
- repoint launch/preflight/setup/switch hints off the deprecated slugs
- update resolver + setup-picker fixtures; add BENCHMARKS row

Suite: 59 pass / 1 pre-existing (test-submit-bench worktree-fixture-absent).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-02 07:58:13 +00:00
noonghunna
dea457968e fold(gemma-12b): dual-bf16 onto vllm-stable v0.24.0, MTP-off
gemma4_unified is native in stock v0.24.0 (#44429 merged) — the 12b dual
folds off the ephemeral :gemma4-unified image onto overlay-free vllm-stable.
Image -> v0.24.0, engine -> vllm-stable, +gemma4-unified to the engine's
supported_model_families. MTP disabled + caveat (Gemma-4 MTP×tools broken,
#39043/#42006); verified on-rig: MTP-off serves + tools 3/3 (KV 496K).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-01 12:13:25 +00:00
noonghunna
93b1642ada fold(gemma-26b): MTP-off on v0.24.0 dual (Gemma-4 MTP×tools broken)
gemma-26ba4b-dual already serves on vllm-stable v0.24.0, but with MTP on
its tool-calls break (upstream vLLM #39043; MTP fix #42006 unmerged) —
verified on-rig: MTP-off tools PASS (944K KV, streaming 3/3, no leak),
MTP-on tools FAIL. Drop --speculative-config + document the re-enable
caveat; registry drafter -> None. (Also fixes broken 26b tool-calls that
master currently ships.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-01 11:55:06 +00:00
noonghunna
2535bb9a3d feat(gemma): v0.24.0 overlay-free 31b dual (cyankiwi, MTP-off)
Gemma-4-31B onto stock vLLM v0.24.0, overlay-free on vllm-stable — the
first slice of the gemma consolidation (Option A1).

- New dual/qat-awq-int4/int8.yml: cyankiwi QAT-AWQ-INT4 weights (lm_head
  excluded → dodges the v0.24.0 tie_weights crash that autoround hits),
  int8-PTH KV @262K, util 0.965 (bf16 lm_head margin), native gemma4
  tool+reasoning parsers. Overlay-free: #40391 (KV page-align) is native
  in v0.24.0; #42006 N/A.
- MTP DISABLED with a documented re-enable caveat: Gemma-4 MTP x tool-calling
  is broken on v0.24.0 (upstream vLLM #39043; MTP fix #42006 closed-unmerged).
  A/B-proven on-rig: MTP-off tools PASS, MTP-on tools FAIL. Re-enable when a
  stable vLLM ships the fix.
- Registry: vllm/gemma-31b-dual on vllm-stable; qat-awq-int4 weights map.
- vllm-stable.features.int8_per_token_head -> true: #40391 is native in
  v0.24.0, so gemma int8-PTH no longer needs the overlay-carrying engine.

Live-validated dual on stock v0.24.0: 267K KV pool, coherent, streaming
multi-tool 3/3 (all args, no leak). Suite green (registry/compat/diagnose).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-07-01 10:28:29 +00:00
noonghunna
3291b6099f Bump vllm-stable v0.22.0 → v0.24.0 (overlay-free; marlin-pad native) (#533)
* Bump vllm-stable v0.22.0 → v0.24.0 (engine spec + 10 compose defaults)

Live-validated on 2x3090: TP=2 clean, MTP accept 3.51, KV 622K/2.37x,
NIAH to 240K, soak Cliff2b PASS, toolcall 11/15 / instructfollow 15/15.
marlin-pad confirmed unneeded (native via #45295/#45176).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm

* arch_patches: add vllm-stable@v0.24.0 loads:true rows (keep v0.22.0 as history)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm

* tests: assert v0.24.0 for vllm-stable pins (gemma stays on v0.22.0)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm

* docs: record vllm-stable v0.24.0 bump (BENCHMARKS row + UPSTREAM pin status)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm

---------

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 01:23:06 +05:00
noonghunna
c4bd45581c Document LMCache RAM gate formula (L1 + 28) in compose caveat
The caveat said "~58 GB free" as a flat number, but preflight_lmcache_ram
actually hard-fails the launch unless MemAvailable >= L1 + 28 GB (the +28
covers vLLM + OS), computed from the live L1 so it tracks the
LMCACHE_L1_GB override (l1=10 -> ~38 GB). The static Requires-min-ram-gb:
58 header is documentation only — nothing in scripts/ reads it; the guard
keys off the lmcache-l1-gb header. Also note the gate is --force-proof.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm
2026-06-27 20:48:15 +00:00
noonghunna
83141f29af Standardize 27b served-model-name → qwen3.6-27b-autoround (#490)
The LiteLLM gateway routes qwen3.6-27b-autoround → :8010, but the fp8 /
awq / lmcache 27b scenes served scene-specific names (qwen3.6-27b-fp8,
qwen3.6-27b-awq-bf16-int4). Bring one of those up as the :8010 primary
(e.g. via gpu-mode PORT override) and the gateway 404s on a served-name
mismatch (#482).

Standardize every 27b serving scene's --served-model-name to the
canonical qwen3.6-27b-autoround so the route matches whichever scene is
on :8010. The quant still differs by compose path/port — only the served
name is unified. Weights --model paths are untouched. Document the
invariant in services/litellm/config.yaml.

Full test suite green (58/58).

Closes #482


Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 21:25:38 +05:00
noonghunna
cc1e0a2251 Add Ornith-1.0-35B experimental slug (ik-llama/ornith35b-dual) (#479)
DeepReinforce agentic-coding RL fine-tune of Qwen3.6-35B-A3B (same qwen35moe arch, no MTP head, text-only). ik_llama dual 3090, Q8_0, full 262K, drafter-free ngram (opt-in). Gate PASS: ~108.8/108.6 TPS, verify-stress 8/8, soak PASS, 8-pack 105/105. Ties the base on the 8-pack (110), EDGES it on aider (15/30 vs 12-13) -> coding-leaning lane. Catalog suite 58/58 green.


Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 08:54:51 +05:00
noonghunna
6cdefab1f3 Add Ornith-1.0-9B experimental slug (ik-llama/ornith9b-single) (#477)
DeepReinforce agentic-coding RL fine-tune — Qwen3-Next dense-FFN HYBRID (arch=qwen35: 8 full-attn + 24 GDN/DeltaNet layers, NON-MoE), single 3090, Q4_K_M + q8_0 KV, full 262K (KV only 4.25 GiB — just 8/32 layers carry full-attn GQA KV; 13.4 GiB total). Drafter-free ngram self-spec on ik_llama (works despite the DeltaNet hybrid). Full gate PASS: bench ~102 TPS, verify-stress 8/8, soak PASS, 8-pack 91/150 off / 95 on. 🧪 niche only — gemma-4-12b beats it on quality (105) + speed; pick for the lean 13.4 GiB footprint. Catalog suite 58/58 green.


Claude-Session: https://claude.ai/code/session_01EfF565T9eSLaqGzidyJ1Pm

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 06:01:56 +05:00
noonghunna
7b0c4d4abc docs(lmcache): fold cross-rig findings — warm-L2 compute-bound + aborted-prefill caveat
From alexpolo1's bare-metal 2x 3090 + NVMe re-run (#423, 2026-06-24, after #454):

1. Warm-L2 rehydrate is COMPUTE-bound, not disk-bound (5.30 s = 405 ms disk +
   37 ms H2D + ~4.8 s Mamba/GDN-state recompute) — a faster SSD won't speed
   warm-load on this hybrid; the L2 tier buys persistence/capacity, not warm
   speed. Closes the lmcache.yml "L2 latency not yet measured on-rig" caveat.
2. An aborted prefill banks only the completed prefix (46/320) — LMCache
   commits a session's blocks only on request completion, so the first long
   prefill must run to completion or it re-prefills from scratch.

INTERNALS.md LMCache section + lmcache.yml header. Comment/prose only.
2026-06-24 17:59:17 +00:00
noonghunna
c90e4f2e18 fix(lmcache): forward env tuning knobs 2026-06-21 20:03:56 +00:00
noonghunna
b2cede650f Merge pull request #433 from steamEngineer/feat/lmcache-nvlink-detect
feat(lmcache): NVLink auto-detect + Compose v5 entrypoint fix
2026-06-18 22:38:19 +05:00
noonghunna
491226fead Add NVLink auto-config to qwen3.6-35b-a3b dual (Production — rebench-gated)
Port the standard NVLink auto-detect (detect_nvlink mount + NVLINK_MODE
+ conditional custom-all-reduce entrypoint, v5.1-safe escaped form) to
the 35B-A3B dual production default. Unlike the escape-fixes, this adds
an explicit --disable-custom-all-reduce on the PCIe branch where there
was none before (it relied on the image default + NCCL_P2P_DISABLE=1).

Almost certainly PCIe-neutral — vLLM auto-disables custom all-reduce
without P2P on consumer 3090s — but this is the only commit in the PR
that changes the validated PCIe path on a  Production compose, so it
wants a rebench-full confirm on a free rig before being treated as
validated. Parses + resolves correctly + passes the guard suite
(47/47); not yet re-benched (rig busy). Hold/merge this commit on the
rebench result.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:17:27 +00:00
noonghunna
7481aa7351 Add NVLink auto-config to gemma-4-26b-a4b + diffusiongemma duals
These two dual vLLM composes lacked the standard NVLink auto-detect the
other dual composes carry (detect_nvlink mount + NVLINK_MODE + the
conditional custom-all-reduce entrypoint). Port it with the v5.1-safe
escaped form. PCIe-behaviour-neutral on this rig; enables the NVLink
path on NVLink rigs.

- gemma-4-26b-a4b (Experimental): reference-identical port (stock image,
  --model flag form).
- diffusiongemma (Experimental): the :gemma image's ["vllm","serve"]
  entrypoint is overridden so it can source detect_nvlink; the former
  static VLLM_DISABLE_CUSTOM_ALL_REDUCE=1 is replaced by the conditional
  --disable-custom-all-reduce flag.

Both parse + resolve correctly on Compose v5.1.4 and pass the guard
suite (47/47). The NVLink branch is untested here (PCIe rig); the
diffusiongemma :gemma-image entrypoint override in particular wants a
boot-check on NVLink hardware.

Also document why qwen3-omni is exempt rather than missing: it is
stage-parallel (thinker->GPU0, talker+code2wav->GPU1), so there is no TP
all-reduce to toggle and the cross-stage connector uses host shared
memory — re-enabling P2P would regress, not help.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:17:16 +00:00
noonghunna
9a188b816b Fix NVLink auto-detect dead on Docker Compose v5.1+
Compose v5.1+ interpolates entrypoint strings at parse time, so the
un-escaped ${_NVLINK_ENABLED:-0} in these composes' boot scripts was
resolved to "0" (the host env lacks the var) BEFORE the container ran,
making `if [ "0" = "1" ]` always false. detect_nvlink.sh still ran, but
its result was ignored: every one of these dual/multi vLLM composes
silently took the PCIe branch regardless of hardware. On an NVLink rig
running Compose v5.1+, NVLink never engaged.

Escape the three entrypoint-bash tokens ($${_NVLINK_ENABLED:-0},
$${VLLM_ENFORCE_EAGER:+...}, "$$@") so Compose passes them through and
bash expands them at runtime. PCIe-behaviour-neutral (both the broken
and fixed forms resolve to the PCIe branch on a PCIe rig); the fix only
restores the NVLink path on NVLink rigs. Same root cause as the lmcache
fix in #429/#433, applied repo-wide.

Confirmed via `docker compose config` on Compose v5.1.4: all 9 now
resolve to a live ${_NVLINK_ENABLED} instead of a baked 0. Guard suite
47/47.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:17:04 +00:00
Ryan Ludwig
ea833ad134 feat(lmcache): add NVLink auto-detection to dual-lmcache compose
Port detect_nvlink.sh from dual-max: mount script, NVLINK_MODE env, ipc: host, and conditional --disable-custom-all-reduce. On PCIe path unset PYTORCH_CUDA_ALLOC_CONF after detect_nvlink because expandable_segments is incompatible with LMCacheMPConnector. Experimental — needs on-rig validation on NVLink rigs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 23:03:29 -07:00
Ryan Ludwig
ebcd7fc707 Fix LMCache compose entrypoint for Compose v5 interpolation
Docker Compose v5.1+ interpolates dollar signs in inline entrypoint scripts. Bash array expansion is invalid Compose syntax and blocks switch.sh before the container starts. Escape dollar signs as doubled dollar signs so bash receives the intended script at runtime.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-17 22:52:31 -07:00
noonghunna
79173b12d5 Record measured pi-reasoning rebench-full results + BENCHMARKS row
Full rebench-full (--with-8pack-thinking=both) completed 2026-06-18 for
llamacpp/qwen27b-pi-reasoning-single. Replaces the earlier inferred "≈ base
50/59 @370W" note (+ the PENDING-ladder caveats) with the measured numbers, and
adds the BENCHMARKS.md single-card row.

- Bench @370W: 47.9/55.3 decode narr/code (n=5, CV<2%); @230W cap 28.5/32.9.
- verify-stress 8/8 (NIAH->183K), 8-pack 104/150 off / 106/150 on, soak PASS
  (0 MiB growth, 0/100 silent-empty, p50 54.5, 102% retention).
- MTP head NOT weaker than base: matched-power A/B dead-even (73% vs 72% accept);
  47.9/55.3 @370W ~on par with base 50.3/58.9. Power-sensitive (mainline -42%
  370->230W) — the earlier "slow" 28/33 was the rig's 230W cap, not the model.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 02:23:00 +00:00
noonghunna
78c4038850 Correct pi-reasoning bench framing: 230W power-cap artifact, MTP head ≡ base
The merged llamacpp/qwen27b-pi-reasoning-single docs claimed its embedded MTP
head was "~45% below base / weaker" — that was a power-cap measurement artifact,
not a model property. A matched-power A/B (230W, same engine/KV/n=2/prompt) shows
the head performs IDENTICALLY to the base Qwen3.6-27B MTP head: 73% vs 72% draft
acceptance, 41.2 vs 41.2 t/s. The base llamacpp/default 50.3/58.9 figure I
compared against is a 370W BENCHMARKS number; mainline is -42% from 370->230W, so
the comparison was only valid at matched power (cf. the ik-llama/iq4ks-mtp
BENCHMARKS row, which documents exactly this trap). The 28.5/33.4 decode numbers
are correct AS 230W measurements; at 370W this config matches base's 50/59.
Corrected the status_note, compose header, and weights manual_note.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 23:46:31 +00:00
noonghunna
5da4eab12e Add llamacpp/qwen27b-pi-reasoning-single (Qwen3.6-27B Pi-style coding agent, mainline llama.cpp + MTP) (#425)
bytkim/Qwen3.6-27B-MTP-pi-reasoning Q4_K_M GGUF (embedded MTP head) — a "Pi-style"
reasoning-supervised CODING / terminal-agent fine-tune — on MAINLINE llama.cpp
(server-cuda-b9246, PR #22673), single 3090, q4_0/q4_0 KV + MTP, reasoning-ON.

- New compose: models/qwen3.6-27b/llama-cpp/compose/single/pi-reasoning-q4km/mtp.yml
- Registry slug llamacpp/qwen27b-pi-reasoning-single (experimental, port 8063).
- Weights entry pi-reasoning-q4km; drafter qwen-mtp-builtin (spec_method mtp).

CONFIG FOLLOWS THE MODEL CARD: temp 1.0 / top-p 0.95 / top-k 0 / min-p 0 (NOT the
stack's 0.6/20), reasoning ON, q4_0/q4_0 KV, --jinja -ngl 99 -fa. Card recommends
MTP n=3; on-rig A/B found n=2 marginally faster (within noise) — kept n=2,
MTP_DRAFT_N_MAX=3 matches the card. presence-penalty 1.5 is a documented knob for
the card's DIRECT/instruct (REASONING=off) mode.

CONTEXT (measured 2026-06-17, GPU0/GPU1): default 200K-alloc fills ~188K usable with
correct needle recall (22.7 GB / ~1.8 GB free; ~23 t/s decode at ~188K depth). Do NOT
alloc 262K — the FA scratch grows with the allocation, so 262K OOMs at ~176K (LESS
usable than 200K); full 262K usable is beellama-only. Author tested only 128K, so
128-188K is engine-proven but past the card's validated window (CTX_SIZE=131072 for
strict compliance).

BENCH (canonical bench.sh n=3, thinking-off, short-prompt): narrative 28.5 wall / 28.7
decode, code 32.9 / 33.4, PP 743 tok/s — ~45% below base llamacpp/default (50/59) on
identical engine/KV/MTP, i.e. this fine-tune's embedded MTP head is weaker. Engine A/B:
mainline ~25% faster than a beellama q4_0/q4_1 path → mainline chosen. Stays
experimental (--force): verify-stress / soak / quality ladder pending.

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 03:56:28 +05:00
noonghunna
ff4bbbc09d LMCache: in-repo L2 default + LMCACHE_L2=1 toggle, preflight disk-check, corrected sizing (#422)
* LMCache: in-repo L2 default + LMCACHE_L2=1 toggle, preflight disk-check, corrected sizing

- LMCACHE_L2=1 enables the L2 disk tier at a gitignored repo-root lmcache-kv/ (zero
  config); LMCACHE_L2_ADAPTER still fully overrides. L2 stays OFF by default.
- preflight_lmcache_ram now also soft-warns on low L2 disk space at the L2 host dir.
- CORRECTED capacity (measured > estimated): the LMCache offload cache is
  ~131 KB/token MEASURED (lmcache_mp_l1_memory_usage_bytes 4.93 GB + 4.6 GB on L2
  disk, 36,808-token session) — ~7x the GPU's 18.9 int8-PTH rate, which only sets
  max servable context. Prior docs used 18.9 for capacity and overstated it ~7x:
  --l1-size-gb 30 holds ~4 x 50K sessions (not ~33), <1 full 262K.
- Added a RAM/disk-vs-context sizing table to INTERNALS.md.
- Measured L2 rehydrate: 4.8s vs 43s cold re-prefill (~9x), cross-restart persistence
  confirmed; use the fs adapter (not nixl_store — this image's NIXL is broken).

Refs #133.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* LMCache: document fp8 serde is broken on this model (no reduced-size L2 yet)

Measured 2026-06-17: LMCache's fp8 serde shape-errors on this model's KV
('[2,16,1584,260]' invalid — wrong layout for the hybrid GDN/head_dim-256/int8-PTH
source), 60 serialize fails, L2 stays empty. CacheGen-MP is 'coming soon'. So L2 is
uncompressed (~131 KB/token); the fp8-serde toggle was NOT wired (it doesn't work).
Re-test trigger noted. Refs #133.

---------

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 00:06:54 +05:00
noonghunna
9901129781 Correct LMCache L2 docs with measured numbers (fs adapter, ~125 KB/token, 4.8s rehydrate)
Measured the L2 disk tier on-rig (#133 follow-up): rehydrate 4.8s vs 43s cold
re-prefill (~9x) for a 37K session, cross-restart persistence confirmed
(0 L1 / 46 L2 retained keys post-restart). Two corrections to the shipped docs:
- L2 disk footprint ~125 KB/token measured (~33 GB per 262K session), not the
  4.72 GB GPU-KV figure (L2 stores ~7x lower-density).
- Use the fs adapter, not nixl_store — this image's NIXL backend is broken.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 16:13:36 +00:00
noonghunna
3531fd3551 Add opt-in LMCache KV-offload compose (vllm/qwen-27b-dual-lmcache, incubating) (#421)
Layers an LMCache tiered persistent prefix-KV cache (MP/HMA connector) onto the
dual-max fidelity profile (FP8 + int8-PTH KV + MTP n=3 @262K). Controlled A/B
shows ZERO decode penalty (74 narr / 94 code TPS == without LMCache, MTP intact
~83% accept); reuses cached prefix KV across long / multi-session workloads
(cold->warm TTFT ~7-8x) instead of re-prefilling.

- New vllm-lmcache engine profile: lmcache/vllm-openai DIGEST-pinned (the tag is
  mutable — bundled vLLM 0.22.1-dev then 0.23.1-dev under the same tag).
- preflight_lmcache_ram guard: rejects --l1-size-gb over-allocation even under
  --force (the l1=100-on-94GB host-OOM that forced a reboot, #133).
- env-gated L2 disk tier hook (LMCACHE_L2_ADAPTER, off by default).
- INTERNALS.md RAM/disk sizing section; registry entry + count bumps; full
  guard suite green.

Incubating (hidden, --force to launch): runs LMCache's third-party image with a
newer vLLM than our v0.22.0 pin; L2 latency unmeasured on-rig; 38 GB on-demand.

Refs #133.

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 20:46:38 +05:00
noonghunna
8b3aa13f54 docs(vibethinker-3b): add measured one-shot-coding scores (HE+ 97%, LCB 83%)
Code packs run 2026-06-16 (tool-free — sandbox executes the model's code, no
tool-calls): humaneval-plus-30 29/30 (97%), lcb-v6-30 25/30 (83%, 2 losses =
token_limit on the hardest). Substantiates the 'strong one-shot/competition
coding' characterization with our own numbers (matches the authors' ~96% LeetCode).
Folded into the llamacpp compose Quality field + registry status_note.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 21:08:40 +00:00
noonghunna
d3cacfad0c feat(vibethinker-3b): add llamacpp/vibethinker-3b-single (Q8, incubating)
The performance-max VibeThinker path — prithivMLmods Q8_0 GGUF on mainline
llama.cpp, single 3090, q8_0 KV, full 131K, -b 4096 -ub 2048. A sibling to
the vLLM bf16 compose (#418), and the better one on every axis.

Why it's better than the vLLM sibling:
- ~166 TPS decode (vs ~110 vLLM bf16), ~6.2 GB at full 131K (vs ~9.8 GB),
  prefill ~6,630 tok/s (-b 4096/-ub 2048 = +20%), boot ~9s.
- Q8_0 is near-lossless → quality INTACT, where vLLM's fp8 weight-quant broke
  this quant-sensitive 3B (non-terminating empty output). KV quant is fine
  (storage-only); fp8 *weights* are the problem.

Validated 2026-06-16 (tool-free packs, temp 0.6, thinking-on):
  gsm-symbolic-30 100% · instructfollow-15 100% · reasonmath-15 80% ·
  structoutput-15 80% · dataextract-15 40%.
  dataextract is a genuine extraction ceiling — full temp sweep {0:27%,
  0.6:40%, 1.0:27%} can't lift it (value mismatches persist). A reasoning
  specialist, not an extractor. No tool-calling. verify-full 5/9 by design.

Wiring: registry entry + dense-family added to llama-cpp-local engine +
prithivmlmods-q8 weights variant + disk/registry counts (51/52). No MTP head
in the GGUF (plain qwen2 conversion) → no spec-dec. Guard suite 47/47.

Status: 🐣 incubating (hidden from switch.sh --list; --force to launch).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 19:53:05 +00:00
noonghunna
35a69650fe feat(catalog): add 🐣 Incubating status tier + VibeThinker-3B (incubating)
Introduce a new pre-experimental status tier, `incubating`, for composes that
work but aren't ready for the actionable list — niche specialists or models
that fail the standard functional gate by design. Incubating composes are
HIDDEN from `switch.sh --list` by default (revealed by `--list --all`) and
launch-gated behind `--force` (non-functional), so a half-validated model is
catalogued and discoverable without cluttering the recommended set.

Tier wiring (reuses the existing status plumbing — no new emit column):
- compose_registry.py: `incubating` in STATUS_VALUES + `🐣` in COMPOSE_STATUS_EMOJI
  (stays out of FUNCTIONAL_STATUSES → --force-gated, never auto-defaulted)
- switch.sh: both --list filters skip incubating unless --all, with a
  `(+N incubating hidden — --all)` header note
- AGENTS.md: Status enum row + Caveats-required references
- docs/ADDING_MODELS.md: new rule — NEW MODELS START at 🐣 Incubating, promote
  up the enum (🐣🧪⚠️/) as they earn the actionable list

First occupant — VibeThinker-3B (WeiboAI, Qwen2 dense reasoning fine-tune):
- `vllm/vibethinker-3b-single` — bf16 weights + fp8_e5m2 KV, single 3090,
  full 131072 ctx, mem_util 0.40 (~9.8 GB, single-concurrency sized),
  --reasoning-parser qwen3, no tool-calling
- Live-validated 2026-06-16: serves clean correct reasoning/code (~110 TPS),
  qwen3 parser splits <think>. fp8 WEIGHTS rejected (break the quant-sensitive
  3B: non-terminating empty output). Always-reasoning + no-tools → fails
  verify-full's fixed-small-budget checks (5/9) by design → incubating, not gate-passing.

Guard suite 47/47 green (nex-n2-mini parked aside; it's an unrelated local experiment).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 15:03:06 +00:00
noonghunna
186ab9b2b6 feat(qwen3.6-27b): add beellama/carnice-v2-dual-q8-mtp dual compose (#403)
Dual-GPU Carnice-V2-27B Q8_0 + embedded MTP head on beellama v0.3.2-preview
(layer-split -ts 0.55,0.45, q8_0/q8_0 KV, 262K). The dual / quality-max
follow-through requested in discussion #403.

Validated via rebench-full (2026-06-16, 2x 3090 PCIe):
- bench n=5: narr 40.7 / code 44.0 decode TPS, TTFT ~79 ms, PP 1197 t/s
- verify-full all-pass; verify-stress 8/8 (NIAH ladder -> 240K)
- soak fresh 20x5 PASS (0 growth, 0/100 silent-empty, p50 42.2, 100% retention)
- 8-pack think-OFF 103/150 / think-ON 105/150 (wash; in-band vs qwopus-coder)

Key decisions (measured A/Bs, captured in compose header + learnings):
- q8_0 KV over the requested kvarn6: +17% prefill (1003 vs 860 t/s; escapes
  KVarN software-compression compute, q4=q8=1004 so it's the path not the
  bit-width), higher fidelity, reference-aligned, fits 262K on dual. KVarN's
  compression only pays off on a tight single card.
- MTP-only; DFlash ruled out (only base-27B drafters exist -> ~10% accept on
  the fine-tune; no Carnice-matched drafter).
- n=2 = +13% validated opt-in (DRAFT_N_MAX=2); n=1 default.
- -b/-ub/--no-mmap A/B'd flat -> KV type was the only prefill lever.

Status: experimental (beellama v0.3.2 is a rolling pre-release; #455 un-park gate).

Catalog wiring: registry entry + qwen3.6-27b.yml carnice-v2-q8 weights variant
+ disk-count bump. Full guard suite green (47/47).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 11:57:35 +00:00
noonghunna
2abe025513 Add llamacpp/hauhaucs-35ba3b-dual uncensored MTP compose (🧪) (#410)
Wires morikomorizz/Qwen3.6-35B-A3B-Uncensored-HauhauCS-MTP (Q6_K_P GGUF
with an embedded nextn MTP head) as a dual-card mainline llama.cpp b9570
compose: -ts 0.55,0.45, q8_0 KV, MTP n=3, 262K, reasoning-on by default.

The MTP head loads clean on mainline ("speculative decoding context
initialized") — the prior HauhauCS-MTP ret=-3 was an ik-llama/older-build
issue, not the model arch. The -ts 0.55,0.45 split rebalances the MTP draft
card (even 1,1 skews ~3 GB at 262K).

Validated 2026-06-14: verify-stress 8/8 (NIAH ceiling ladder -> 240K),
bench.sh n=3 @262K (narr 113.4 / code ~150 decode TPS, CV<1%), soak fresh
20x5 PASS (0 growth, 0/100 silent-empty, p50 162.4, 99.6% retention),
8-pack think-OFF 103/150 / think-ON 105/150 (wash). n=3 vs n=1 @262K =
-9% prose / +10% code (code-leaning default by request; n=1 prose-best via
MTP_DRAFT_N_MAX=1).

Status 🧪 Experimental: community GGUF (digest-unpinned) + uncensored.
No DEFAULTS row — opt-in only. Guard suite green.

Co-authored-by: noonghunna <10742901+noonghunna@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 06:28:08 +05:00