⚡ Qwen3.8-27B part 2 — the fast tier lands at 105 tok/s, plus NVFP4 #1024
Replies: 5 comments 2 replies
|
Am legit wanting to try and run the 8-pack soon. Have not yet at because in the past had issues getting it to run. Was using an INT8 quant of Qwen3.8 just before your PR. Just did a quick bench comparing the two. It performs just like Qwen3.6 did on my 2x3090s (which is too be expected). Its nice to have that big prefill boost back again :) qwen3.8-27b — int4 (w4a8) vs int8 (w8a16)
Each table compares one factor between the two runs.
Decode speedMean decode tokens/s (measured runs). int4 leads by a wide margin in both workloads.
Prefill speedMean prefill tokens/s (client-side, cache-busted). The gap is far larger than for decode.
Notes
|
|
能支持一下这个作者的项目么,他量化的版本真的很好:DavidAU/Qwen3.8-27B-Cold-Fusion-GAIN-V1.1-NM-DAU-NEO-MAX-MTP-GGUF |
|
A 32 GB single card for single-nvfp4 — never booted, anywhere. |
|
老哥来活了,Ornith-1.5-35B-A3B,这个模型有点厉害哦,有ornith-ai/Ornith-1.5-35B-A3B-MLX-4bit,您有空给支持一下vllm呗。 |
|
Ran the super/ultra tiers for three days on 2× RTX 3090 @250w (PCIe, no NVLink) under real agent traffic — bare venv v0.27.1 + the vendored backport applied manually, Frozenlock target, drafter n=7, thinking-low default, temp 1.0. The tier table above holds at shallow context but inverts with depth. Same server, same day, decode tok/s by KV depth:
At 165K the drafter is still healthy (AL 3.0–4.3) — the forward itself slows to ~4 steps/s (~230ms/step). Suspect FA2 × this model's head_dim 256 on sm_86 — which would also explain why the backend list doesn't even offer FLASH_ATTN when fp8 KV is set. If right, the super/ultra crossover sits around 20–40K, so ultra is a fresh-short-chat tier; agent workloads live past the crossover. Might deserve a header note. Also validated on superfast: max_num_seqs=2 with the boot-log kv-cache-memory suggestion (pool 460K) serves 200K+50K concurrent decode at 107 tok/s aggregate; prefix caching in mamba align mode is exact and turns turn-2 of a 150K chat into seconds (the "misses" I chased were a client mutating the prompt head). One HOL note: at max_num_batched_tokens=8192 a cold 165K prefill starves the co-running decode to ~0.2–1 tok/s (one token per ~5s chunk); 2048 + long_prefill_token_threshold=1024 keeps it visibly alive. Venv gotchas for anyone else off-docker: Frozenlock: no acceptance collapse through ~50K+ cumulative gen tokens here. |
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 #993, where we shipped five
Qwen3.8-27B slugs and deliberately withheld every number because the bench had run on a silently
degraded config.
Here are five more slugs — and this time, numbers.
vllm/qwen38-27b-dual-fastdecodes at 105.01 tok/s on 2× RTX 3090. That is a 27B dense model,262K context, on two consumer cards from 2020.
72.4 tok/s, and its run-to-run spread is 13.9%, so treat the prose figure as indicative. Both
numbers come from the same canonical bench on the config as shipped.
The new slugs
vllm/qwen38-27b-dual-fastvllm/qwen38-27b-multi4-fastvllm/qwen38-27b-multi8-fastvllm/qwen38-27b-single-nvfp4vllm/qwen38-27b-dual-nvfp4All 🧪 Experimental —
--forcerequired.Only
dual-fastanddual-nvfp4have booted here. The 4- and 8-card slugs arecommunity-validated by design: this rig has exactly two 3090s, permanently, so the first person
to boot one is the validation.
single-nvfp4needs a 32 GB card and has never run anywhere.The numbers —
vllm/qwen38-27b-dual-fast2× RTX 3090, TP=2, W4A8 + MTP n=4, fp8 KV @262144, stock
vllm/vllm-openai:v0.27.1,3 warm + 5 measured.
⛔ What we have NOT measured on this slug: 8-pack quality, NIAH fill depth, soak. No quality
claim is being made. Throughput without a quality number is half a picture and we would rather say
so than imply the other half.
Where the speed comes from
Two independent findings, each measured single-variable on this checkpoint.
1. W4A8 — int8 activations
Same INT4 weights, but the matmul runs on INT8 tensor cores instead of dequantising to FP16:
is free" as a 3.6 finding that did not transfer. It's a trade: buy prefill, pay decode.
It works on this checkpoint only because it is auto-round-packed
[k/8, n], which is what ourvendored negative-scale fold assumes — a compressed-tensors sibling hard-fails the same patch.
W4A8=0reverts to 16-bit activations.2. MTP depth — the knee is n=4
Full sweep, one boot per rung, W4A8, 262K:
picking a draft depth from acceptance length selects n=6, which is wrong. Use throughput.
fallback on this model.
Things worth knowing before you launch
⚡ This slug draws more power than anything else in the catalog. W4A8 moves the bottleneck from
memory-bandwidth to compute, MTP n=4 raises the duty cycle, and TP=2 synchronises both cards so
their current spikes coincide. One user hit hard power-offs
(#1019) on a 1500 W supply — a multi-rail
one, where per-rail OCP trips long before the PSU's total rating. Combining to a single 12 V rail
fixed it. If you're on a split-rail supply or a marginal one, either combine the rails or run
W4A8=0. Note that a GPU power cap does not protect you here: caps average over roughly amillisecond and the transients are shorter.
index in the GDN spec-decode path that can kill the engine under sustained multi-turn traffic. It is
open upstream and still present in v0.27.1 (we bumped and re-checked). Mitigate with
SPEC_N=0.Our own reports: #758 /
#838.
peak VRAM 1.75 GB over the budget and requests began failing. For concurrent serving set
SPEC_N=0and raiseMAX_NUM_SEQS— measured ceiling is ~49 tok/s aggregate at 10K context.NVFP4 on Ampere is a compatibility path, not a fast one.
dual-nvfp4boots and passesverify-full 9/9, but sm_86 has no FP4 tensor cores, so vLLM serves it through the Marlin W4A16
fallback — the boot log says so twice. We publish no TPS for it, deliberately: any number would
be a Marlin figure wearing an NVFP4 label. Its real case is Blackwell, and the first sm_120 boot is
the validation we actually want.
Thinking mode defaults to⚠️
mediumeffort, not the template'sxhigh.mediuminjects noreasoning instruction at all — it is the un-nudged baseline.
xhighappends "think carefully,validate key assumptions…", which is what makes it slow.
highis not valid and raises attemplate render; only
xhigh/medium/lowexist.#993's llama.cpp numbers are still withheld. That re-bench on
-ts 0.55,0.45is still owed —nothing here changes it.
👁️ Bonus: vision and video input work
Not planned, discovered while validating: the qwen3.8 slugs serve images and video with no extra
flags. Verified with colour and layout discrimination at temperature 0, and a 3.25 s clip whose
frame order came back correct — including the blended transition frame.
Video cost is linear and it's what bounds usable length (default
fps=2):⭐ Hour-scale video fits the native 262,144 window at 256×256 — no rope extension needed.
Input only: it consumes media and emits text. Smoke test only — no vision quality gate.
Getting it
Run it
Useful env:
W4A8=0(16-bit activations) ·SPEC_N=0(no drafter) ·ENABLE_THINKING=true·
MAX_NUM_SEQS=N.Run the evals yourself
Two non-overlapping passes: behavioural quality (the 8-pack) and operational health. Everything
below is vLLM — all five slugs in this post are vLLM, so unlike #993
there is no engine branching.
One-time setup — three of the eight packs run in Docker sandboxes that build 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 tightWithout the images the 5 deterministic packs still run; the 3 sandboxed ones skip with a warning.
dataextract-15andhermesagent-20. You may get incorrect or lower scores if using older versions.Quality — both reasoning legs
Instruct is the shipped default, so leg A is the bare launch — no env vars.
going back to instruct after a thinking run needs a reboot too. Skip it and the "instruct" leg is
silently a second thinking leg: both arms score alike and the A/B reads as a clean null. benchlocal
catches this — per-pack
thinking_validityin the saved JSON.ENABLE_THINKINGflips the template only — the sampler does not follow it. Miss the threesampler vars and you run reasoning at
presence_penalty 1.5, which the model card warns causeslanguage mixing. Tracked in #1014; when that
lands this collapses to one variable.
Any slug substitutes:
vllm/qwen38-27b-{dual,multi4,multi8}-fast·vllm/qwen38-27b-{single,dual}-nvfp4.Why each flag
These aren't decoration — each exists because its absence produced a wrong number for us:
--sampling-from-servertemperature=0. Without it you measure greedy decoding, not the shipped config.--max-tokens 4096token_limitfailures that look like wrong answers.--thinking-max-tokens 16384--timeout-per-case 600timeoutfailures that read as content misses.REASONING_EFFORT=reasoning_effort, so it is the caller's choice. Since #1029 these composes also default tolowserver-side, but pin it anyway so the run records what it measured.highraises on vLLM; onlyxhigh/medium/lowexist.--repeat 3--sampling-from-serverboth legs are sampled, so single draws aren't quotable.timeoutandtoken_limitare harnessartifacts; only
verifier_fail/wrong_answerare the model. A score that looks catastrophic isoften a budget that was too small. Note also that benchlocal retries model verdicts 3× by
default but does not retry timeouts — so a
timeoutrow is a single sample against a clock.cli-40has a second, independent timeout — setBENCHLOCAL_MODEL_TURN_TIMEOUT=900on thethinking leg. The two govern different layers:
--timeout-per-caseBENCHLOCAL_MODEL_TURN_TIMEOUTBecause the sandbox cap is flat, whether you hit it is arithmetic: one 16,384-token thinking answer
takes
16384 / decode_TPSseconds, so anything slower than ~55 tok/s busts it. At this slug's105 tok/s you have room; on a slower rig you do not.
Operational health
bash scripts/report.sh --full # verify + stress + soak + bench + agentic, redacted, ~43 minDon't pair that with
rebench-full.sh— they re-run the same gates.What'd help
multi4-fast/multi8-fasthave never run. First boot is the validation.single-nvfp4— never booted, anywhere.Report via
numbers-from-your-rig, orbash scripts/report.sh --fullfor a redacted paste-readybundle.
Credits
entire fast tier runs on.
PSU finding, which is in the launch notes above because of that report.
All reactions