⚡ Qwen3.8-27B part 3 — the DFlash2 tier hierarchy: super, ultra, across speed and fidelity #1076
Replies: 2 comments 1 reply
|
One configuration-safety note that may be worth making explicit in the tier docs: For the current Qwen3.8 DFlash2 exports, A mismatch can load successfully because Suggestion: treat |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Follow-up to #1024, where the fast tier benches ~100 tok/s on 2× 3090.
This part isn't one more slug — it's a naming and a shape. Every Qwen3.8-27B tier now comes in three depths of speculation, on top of two weight classes:
vllm/qwen38-27b-dual-ultrafastdecodes code at 231 tok/s on 2× RTX 3090. Same two consumer cards, same 27B dense model. That is 2.3× the fast tier — from a drafter, not a bigger GPU.The shape
Two weight classes — the speed series (int4) and the fidelity series (fp8) — each now in three drafter depths:
super(DFlash2 + fp8 KV)ultra(DFlash2 + bf16 / FlashAttn)fastsuperfastultrafastmaxsupermaxultramaxsuper*swaps the built-in MTP head for an external DFlash2 block-drafter while keeping the base tier's fp8 KV. You keep the full context envelope; you gain code throughput; and because the drafter is external, it structurally sidesteps the built-in-MTP acceptance-collapse class entirely.ultra*runs that same drafter on bf16 KV + FlashAttention — the fastest decode path on Ampere — at the cost of context (bf16 KV is 2× fp8, so it doesn't fit 262K on two cards).One drafter serves all six DFlash2 slugs. It's keyed to the base architecture, not the weight quant, so the same
syvai/Qwen3.8-27B-DFlash2-W4A16drives both the int4 and the fp8 targets.The numbers — 2× RTX 3090, TP=2, verify-full 9/9 each
Canonical bench (3 warm + 5 measured), stock
vllm/vllm-openai:v0.27.1+ the vendored DFlash2 backport. Decode tok/s, narrative / code:Speed series (Frozenlock AutoRound INT4)
fastdual-fastdual-superfastdual-ultrafastFidelity series (official Qwen FP8)
maxdual-maxdual-supermaxdual-ultramaxAll 🧪 Experimental —
--forcerequired.multi4/multi8variants of every tier ship too, community-validated by design (this rig has exactly two 3090s, so the first person to boot one is the validation).Where the speed comes from — and why
ultratrades contextOne finding drives the whole hierarchy, and it's a hardware wall worth stating plainly.
On Ampere (sm_86), FlashAttention and fp8 KV cache are mutually exclusive — and it's a real kernel limit, not a config we forgot to flip. vLLM's
FLASH_ATTNbackend defers a quantized KV dtype to a capability check that requires FlashAttention 3 (Hopper) or 4 (Blackwell). Our 3090s run FA 2, which has no fp8-KV read path, so the moment you set fp8 KV, vLLM routes attention to FlashInfer instead.That splits the DFlash2 drafter (whose block attention wants FlashAttention) two ways:
super*keeps fp8 KV → runs on FlashInfer → keeps the full 262K envelope, at a decode cost (~40% vs the FlashAttn path).ultra*keeps FlashAttention → must use bf16 KV → fastest decode, but bf16 KV is 2× the size, so context drops.So the hierarchy isn't arbitrary — it's the two sides of one Ampere constraint.
super= "all the context, collapse-immune, faster than MTP."ultra= "maximum decode, shorter context."Why the fidelity duals cap lower
supermax(144K) andultramax(64K) cap well below their int4 cousins. The FP8 weights are ~29 GiB, and the external DFlash2 drafter costs ~2.6 GiB of KV pool that the built-in MTP head doesn't. On two 24 GB cards that leaves little room — bf16 KV especially. Themulti4/multi8variants recover the full 262K once the weights split across more cards.For 4+ GPU rigs — where the fidelity tiers stop compromising
Every tier above also ships in 4-card (
multi4, TP=4) and 8-card (multi8, TP=8) form — the same speed×fidelity × base/super/ultra matrix, twelve DFlash2 slugs in all. We can't bench them (the reference rig has exactly two 3090s), so they're community-validated by design — but if you have four or more cards, this is the topology the fidelity series was waiting for.On two cards the FP8 tiers are VRAM-starved; more cards remove the compromise. The official FP8 weights (~29 GiB) leave so little room on 2× 3090 that
supermaxcaps at 144K andultramaxat 64K — you trade context to keep FP8 precision. Split those weights across four or eight cards and the tradeoff disappears: FP8-precision weights and the full 262K context and the DFlash2 drafter, all at once. The dual fidelity tiers are the constrained version; multi4/multi8 is where full-quality FP8 finally gets the full window. (The int4 speed tiers already fit 262K on two cards — for them, more cards buy concurrency headroom, not context.)The DFlash2 tiers available at 4-/8-card — all 🧪 (
--force), no first-party numbers (the reference rig has two cards):vllm/qwen38-27b-multi4-superfastvllm/qwen38-27b-multi8-superfastvllm/qwen38-27b-multi4-ultrafastvllm/qwen38-27b-multi8-ultrafastvllm/qwen38-27b-multi4-supermaxvllm/qwen38-27b-multi8-supermaxvllm/qwen38-27b-multi4-ultramaxvllm/qwen38-27b-multi8-ultramaxThe base MTP tiers ship too:
vllm/qwen38-27b-{multi4,multi8}-fastand-{multi4,multi8}-max. Context on 4+ cards is a VRAM-math projection except @A1RM4X's measured 240,635 (multi4superfast/INT4 speed tier — see below).There's already a strong 4-card datapoint. @A1RM4X ran the full gate on 4× RTX 3090 (#1064): verify-full 9/9, stress to 240,635 tok (91% of 256K) at 0 MiB growth, soak PASS, code decode 190 tok/s, both 8-pack arms (120/150 no-think · 128/150 think).⚠️ That run was the INT4 speed tier on the incoai bf16 drafter (PR #1060), not the shipped syv-ai W4A16 — a strong cross-reference for the multi4-DFlash2 shape, not the exact shipped slug. The full-context-FP8 claim above follows from the VRAM math (weights split → room for 262K fp8 KV), not a first-party bench — a
bench.shonvllm/qwen38-27b-multi4-supermaxfrom any 4-card rig is what turns it from projection into a shipped row. (MTP base tier: #1025 96/119, #1004 103/135 — same 240K ceiling.)--gpu-memory-utilization 0.80(0.90 OOM'd the first prefill). More cards give you the room; don't assume the MTP tier's gmu carries over.Boot one, run
report.sh --full, and file it via the numbers-from-your-rig template — that's what turns 🧪 into a shipped row.Things worth knowing before you launch
⛔ No quality numbers yet. verify-full passes 9/9 on every dual slug, but the 8-pack, NIAH fill depth, and soak have not been run on any of these. Throughput without a quality number is half a picture — the c3 catalog leaves the 8pk column deliberately blank rather than imply the other half.
WITH_DFLASH_DRAFT=1when you runsetup.sh(it's ~1.2 GB, shared by every DFlash2 tier).SPEC_N=0.Launching these — the
c3cockpitEvery qwen3.8-27b slug — all four DFlash2 tiers × dual/multi4/multi8, plus the base MTP, single-card, and NVFP4 rows — is browsable and one-keystroke-launchable from
c3, the terminal cockpit. Filter to3.8, pick a row, press⏎to serve:Install + launch (from the repo checkout):
First run: press
S→ set your Model Dir + HuggingFace token →Ctrl+S, thenrto browse the catalog. Filter to3.8, select a slug,⏎serves it.c3 --leanhides the producer lane for a consumer-only view. c3 wraps the same launchers under the hood, so the DFlash2 tiers still need the external drafter on disk (WITH_DFLASH_DRAFT=1— see "Things worth knowing" above).Prefer the CLI? Every slug is also
bash scripts/switch.sh --force <slug>— that's the form the eval commands below use.Run the evals yourself
Same two-pass protocol as the fast-tier post (#1024) — behavioural quality (the 8-pack) + operational health. The flag-by-flag rationale (why
--sampling-from-server, the two independentcli-40timeouts, the failure-mode triage) is spelled out there and is identical here; below is the short form plus the one thing that's different: the DFlash2 slugs need the external drafter on disk —WITH_DFLASH_DRAFT=1 bash scripts/setup.sh(~1.2 GB, shared by all of them).One-time setup — three of the eight packs build a Docker sandbox once:
pip install git+https://github.com/noonghunna/benchlocal-cli.git git clone https://github.com/noonghunna/benchlocal-cli bash benchlocal-cli/tools/build-sandboxes.sh # ~30 GB free; prune if tightdataextract-15/hermesagent-20verifiers; older versions score wrong.Quality — both reasoning legs, each its OWN boot
Instruct is the shipped default (leg A = bare launch). Going back to instruct after a thinking run needs a reboot too, or the "instruct" leg is silently a second thinking leg.
Any DFlash2 slug substitutes:
vllm/qwen38-27b-{dual,multi4,multi8}-{superfast,ultrafast,supermax,ultramax}.Operational health
bash scripts/report.sh --full # verify + stress + soak + bench + agentic, redacted, ~43 minDon't pair it with
rebench-full.sh— same gates.What'd help
These slugs are all 🧪 — they have throughput and no quality numbers yet, so an 8-pack on any of them is what promotes it. Most wanted:
multi4-supermax/multi8-ultramax) — the full-context-FP8 claim above is VRAM math, not a bench.Submitting is easy — and we want it even if the slugs DON'T boot on your rig:
Drop either in a reply here or via the
numbers-from-your-rigtemplate. A rig report where a slug failed is as useful as one where it worked — a boot log + your GPU/driver/CUDA is exactly how we find the edges (CUDA-13 selector fallback, GPU-count, driver-branch mismatches).Credits
This tier stands on community work — we used their submissions as the starting point, then shaped the slugs to our product hierarchy (a lean W4A16 drafter for more context; the speed×fidelity × base/super/ultra matrix):
Both community PRs used the incoai bf16 drafter (11.6 GiB, which caps context at 131K); we chose the W4A16 requant to keep more of the window. We vendor all of this — we don't own it.
Pick by shape:
fast/maxfor the full 262K on a single stream;super*for +code throughput without giving up context;ultra*when you want the fastest decode and can live inside its context window. Speed series = int4 (smaller, faster); fidelity series = official FP8 (higher-precision weights).All reactions