Slide 1 of 0

Verification steps

Reproduce the ladder
before you believe it.

The concurrency claim on the front page, restated as commands you can run on your own box, with every axis it depends on named so it can be falsified.

rungs won
8 / 8
margin
1.012× – 1.333×
checkpoint
unsloth/Qwen3.8-27B-NVFP4
hardware
NVIDIA GB10 Grace Blackwell, 121.7 GB unified
baseline
vLLM + MTP, vLLM 0.27.1
build
engine b39a6650 · 2026-10-12

Metrale Engine 1.0.0-beta-preview sustains higher mean decode throughput than vLLM + MTP (vLLM 0.27.1) on unsloth/Qwen3.8-27B-NVFP4, served on one NVIDIA GB10 Grace Blackwell, 121.7 GB unified, at every concurrency C = 1, 2, 4, 8, 16, 32, 64, 128 — ISL 128, OSL 1024, temperature 0, seed 42, mean tok/s over 3 timed reps (1 warmup discarded). Margins run 1.012× to 1.333×.

Scope

What is claimed, and what is not

Every noun in the claim is a knob someone could have turned. The fastest way to waste a week is to test something we never said.

measured on
NVIDIA GB10 Grace Blackwell, 121.7 GB unified dgx2 (spark-43fa). Every figure here was taken there, not extrapolated from it.
one checkpoint
unsloth/Qwen3.8-27B-NVFP4 dense 27B hybrid, 48 GDN + 16 attention layers. MoE and long-context models behave differently and are not claimed.
single box
no multi-node No TP, PP or EP story is being told here.
best baseline
vLLM + MTP, fp8 KV vLLM, no speculation is published beside it, plotted and not scored.
durability
gated, not asserted Absolute per-rung floors are committed in the engine and every pull request must clear them.

Result

8 of 8 rungs, 1.012× to 1.333×

Aggregate decode tokens per second, both engines, every rung. Log2 X because the rungs double; the table carries the exact figures and the spread the chart only implies.

1.333×at C=128: 478.11 vs 358.57 tok/s
1.196×at C=1: 23.59 vs 19.72 tok/s
3×timed reps per rung, 1 warmup discarded
Metrale Engine vLLM + MTP vLLM, no speculation config differs
0129258387516tok/s1248163264128concurrent requestsMetrale Engine · C=1 · 23.59 tok/s · mean of 3 repsMetrale Engine · C=2 · 41.02 tok/s · mean of 3 repsMetrale Engine · C=4 · 74.21 tok/s · mean of 3 repsMetrale Engine · C=8 · 125.95 tok/s · mean of 3 repsMetrale Engine · C=16 · 203.36 tok/s · mean of 3 repsMetrale Engine · C=32 · 291.01 tok/s · mean of 3 repsMetrale Engine · C=64 · 386.63 tok/s · mean of 3 repsMetrale Engine · C=128 · 478.11 tok/s · mean of 3 repsvLLM + MTP · C=1 · 19.72 tok/s · mean of 3 repsvLLM + MTP · C=2 · 37.11 tok/s · mean of 3 repsvLLM + MTP · C=4 · 71.61 tok/s · mean of 3 repsvLLM + MTP · C=8 · 124.48 tok/s · mean of 3 repsvLLM + MTP · C=16 · 197.03 tok/s · mean of 3 repsvLLM + MTP · C=32 · 283.48 tok/s · mean of 3 repsvLLM + MTP · C=64 · 361.39 tok/s · mean of 3 repsvLLM + MTP · C=128 · 358.57 tok/s · mean of 3 repsvLLM, no speculation · C=1 · 11.04 tok/s · mean of 3 repsvLLM, no speculation · C=2 · 21.34 tok/s · mean of 3 repsvLLM, no speculation · C=4 · 41.20 tok/s · mean of 3 repsvLLM, no speculation · C=8 · 78.18 tok/s · mean of 3 repsvLLM, no speculation · C=16 · 137.11 tok/s · mean of 3 repsvLLM, no speculation · C=32 · 219.50 tok/s · mean of 3 repsvLLM, no speculation · C=64 · 312.26 tok/s · mean of 3 repsvLLM, no speculation · C=128 · 390.42 tok/s · mean of 3 repsvLLM 0.27.1 · 2026-08-17vLLM 0.27.1 · 2026-08-16
Throughput in tok/s. Ratio is Metrale Engine over the matched vLLM + MTP configuration at that rung. The unmatched no-speculation vLLM leg is shown, not scored.
CMetrale EnginevLLM + MTPvLLM, no speculationRatio
123.5919.7211.041.196×
241.0237.1121.341.105×
474.2171.6141.201.036×
8125.95124.4878.181.012×
16203.36197.03137.111.032×
32291.01283.48219.501.027×
64386.63361.39312.261.070×
128478.11358.57390.421.333×

Reference

The fingerprint, and every axis pinned on both engines

Six lines decide whether anything after them is comparable; ten pins are what make the comparison fair. If your box differs on any of them you are measuring something else — fine, but say so.

Fingerprint

box
dgx2 (spark-43fa) — NVIDIA GB10 Grace Blackwell, 121.7 GB unified same box, same checkpoint, same client, back-to-back legs
checkpoint
unsloth/Qwen3.8-27B-NVFP4 dense 27B hybrid, 48 GDN + 16 attention layers
harness
bench/ladder38/harness_w55_conc_ladder.py campaign driver for the published ladder, sha256 pinned per leg
engine
Metrale Engine 1.0.0-beta-preview @ 4012c9b7e1 the certified commit as the record names it; every gate record names its own in git_sha
baseline
vLLM 0.27.1, vllm/vllm-openai:latest pinned by digest in Step 3, never by tag
aggregate
mean tok/s over 3 timed reps (1 warmup discarded) the figure every chart and table on this page prints

Parity — driven by one script, not two

context
2048 both
batch cap
128 both
gpu util
0.85 both
kv cache
fp8 both
prefix cache
on both
speculation
MTP K=4 both
thinking
disabled on both engines via chat_template_kwargs.enable_thinking=false
sampling
presence_penalty and frequency_penalty pinned to 0.0 on both engines
prompts
ISL 128 / OSL 1024, seed 42, temp 0
harness
one script, both legs, back to back

vLLM at its best, not its defaults: vLLM 0.27.1 registers this checkpoint's MTP weights, so the baseline runs vLLM's own Qwen3_5MTP, K=4 (num_speculative_tokens=3). The no-speculation leg is published beside it and is not what we claim against.

Steps 1 and 2

Prove the box, then build both artefacts

Every check here has been the reason a run was thrown away in this campaign. The container serves models; the binary measures them. You need both, from the tree the record names.

1 · preflight
nvidia-smi                       # GB10, driver 580+free -g                          # ~121 GB unified, not nvidia-smiexport PATH=/usr/local/cuda/bin:$PATHnvcc --version                   # must report CUDA 13.0docker run --rm --gpus all \  nvidia/cuda:13.0.0-base-ubuntu24.04 nvidia-smidf -h ~/.cache/huggingface       # weights land here, tens of GB

nvidia-smi reports memory as Not Supported on GB10: the 121 GB is a unified pool, so free is the instrument. CUDA ships outside PATH; without the export the cargo build dies in a build script rather than anywhere informative. The docker line proves the NVIDIA Container Toolkit is wired up, not just installed. Measure on an idle box: the gate refuses to self-start below 85% free host memory and tolerates at most one foreign compute process.

2 · clone, image, binary
git clone https://github.com/Metrale/metrale-inference.git metrale-enginecd metrale-enginedocker build -f docker/gb10/Dockerfile -t metrale-gb10 .sudo apt-get install -y build-essential pkg-config \  cmake clang libclang-devcargo build --release -p metrale-server --bin met./target/release/met --version./target/release/met benchmark list concurrency-sweep./target/release/met sync-recipes

Both builds run from the repository root with CUDA on PATH from Step 1. The first cargo build takes 15–30 minutes and leaves 3–5 GB under target/. Every record under .benchmarks/ names the commit it measured as git_sha, with a .sig beside it; check that commit out to rebuild the exact tree. The list line prints every parameter of the sweep with its default, the schema the next steps override; if it prints, the toolchain is sound. sync-recipes populates the recipe index the gate's self-start reads in Step 6.

Steps 3 and 4

Bring up both legs

Same box, same checkpoint, same client, back to back. The baseline is pinned by digest, not by tag; the subject is the whole certified configuration, rendered from the record the harness wrote.

3 · baseline: vLLM + MTP, fp8 KV
docker run --rm --gpus all --network host \  vllm/vllm-openai@sha256:0a51ea5b4ae2dc5d81890e5173f54203d2a3ae0cfffe51b8fd2afd4391bfd967 \  --model unsloth/Qwen3.8-27B-NVFP4 \  --max-model-len 2048 --max-num-seqs 128 \  --gpu-memory-utilization 0.85 \  --kv-cache-dtype fp8 --enable-prefix-caching \  --speculative-config '{"method":"mtp","num_speculative_tokens":3}'

num_speculative_tokens 3 is K=4, the same draft width the subject runs. Context 2048 and batch cap 128 are the pinned pair; changing either invalidates the comparison in both directions. The cap is load-bearing: vLLM sizes its KV blocks and scheduler budget from max_num_seqs, and a cap-32 pair inverted the ordering on the same box the same day (RESULTS.md, method note).

4 · subject: Metrale Engine 1.0.0-beta-preview, complete
METRALE_PREFILL_CODISPATCH=1 METRALE_FP8_ROWWISE=1 \METRALE_MTP_DCUT_RATIO=1.0 \METRALE_MTP_K_LADDER=1:3,2:1,4:2,8:2,16:1 \met serve unsloth/Qwen3.8-27B-NVFP4 --host 0.0.0.0 --port 8888 \  --model-name unsloth/Qwen3.8-27B-NVFP4 --max-seq-len 2048 \  --max-batch-size 128 --gpu-memory-utilization 0.85 \  --kv-cache-dtype fp8 --enable-prefix-caching true \  --ssm-cache-slots 8 --ssm-checkpoint-interval 32 --speculative \  --num-drafts 3 --mtp-quantization bf16 --scheduling-policy fifo \  --tool-call-parser qwen3_coder --disable-tool-grammar true \  --disable-thinking --request-timeout 0 --ssm-h-dtype f16-pool \  --gdn-fused-norm --ssm-batched-recurrent --ssm-tail-midchunk false \  --mtp-gate force --prefill-varlen-batch --no-tui

Do not trim this. 6 of these flags (--ssm-h-dtype, --gdn-fused-norm, --ssm-batched-recurrent, --ssm-tail-midchunk, --mtp-gate, --prefill-varlen-batch) are kernel and scheduling knobs whose defaults are the opposite of the certified values; serving without them measures a different engine. An abridged command run in this campaign landed under the published ladder, the gap widening with concurrency exactly as those knobs predict. With the full command the same box reproduced every rung.

Step 5

Measure: the chart's own driver, then the gate's instrument

Two instruments, not interchangeable. The campaign driver produced every number on the result slide; the gate's subcommand measures the gate's workload and is the only one that can mint a record.

5a · the published ladder, Metrale Engine 1.0.0-beta-preview leg
python3 -m venv .venv && .venv/bin/pip install aiohttp.venv/bin/python bench/ladder38/harness_w55_conc_ladder.py \  --url http://127.0.0.1:8888 --model unsloth/Qwen3.8-27B-NVFP4 \  --label metrale --out metrale_ladder.json \  --concs 1,2,4,8,16,32,64,128 \  --reps 3 --isl 128 --osl 1024 --warmup 1

Every knob is a required argument; the driver defaults nothing silently, so the command is the methodology. Swap --url and --label for the vLLM leg and run them back to back. Budget about an hour per leg: C=128 alone streams 131072 tokens per rep. The driver prints its sha256 on the first line and writes it as driver_sha256; the published engine legs carry 1c77e1d8e9 and the copy in the repository today hashes 4649c9b001. Record the hash you ran.

5b · the gate's instrument, both endpoints
met benchmark run concurrency-sweep \  --url http://127.0.0.1:8000 --model unsloth/Qwen3.8-27B-NVFP4 \  --param concurrencies=1,4,8,16 --param isls=512 --param osl=320 \  --skip-coherence-probe --format json > vllm.jsonmet benchmark run concurrency-sweep \  --url http://127.0.0.1:8888 --model unsloth/Qwen3.8-27B-NVFP4 \  --param concurrencies=1,4,8,16 --param isls=512 --param osl=320 \  --format json > metrale.json

Drives an endpoint that is already serving; it neither loads a model nor touches the GPU, so the binary that gates our pull requests is the binary that measures vLLM. stdout carries the record and stderr the progress. The prompt corpus is byte-identical to the driver's, so aggregate tok/s is comparable across the two; percentile rules are not, so never compare one instrument's TTFT against the other's.

Step 6

Mint a record: the command that gates every pull request

The same subcommand in its other mode. It serves the benchmark's own recipe on a free port, waits for a cold NVFP4 load, measures, tears down, and writes a signed record; --url and --pull-request-gate are mutually exclusive by design, so an experiment can never become evidence by accident.

one gate, then every gate the commit still owes
./target/release/met benchmark run concurrency-sweep \    --pull-request-gate --yes./target/release/met benchmark certify --dry-run    # the plan./target/release/met benchmark certify --yesmet benchmark --pull-request-gate-check    # what CI then runs

certify runs every gate the commit still owes and says whether the tree is certified when they are done; it stops on a failed verdict unless given --keep-going. Each run writes .benchmarks/<id>/<date>-<sha>.json carrying the metrics, the verdict, the hardware fingerprint, the exact command and the commit sha, with a .sig beside it. A record is voided by content: a change under crates/, kernels/, Cargo.toml, Cargo.lock, vendor/, 3rdparty_patches/, rust-toolchain.toml or jinja-templates/ invalidates it, a dirty tree fails, and an entry declaring no thresholds fails rather than passes.

42benchmarks registered
399signed records of 399 committed
46/46concurrency records passing

Floors CI holds for unsloth/Qwen3.8-27B-NVFP4

rungmin tok/smax J/token, GPU rail
C=1221.70
C=2381.00
C=4670.62
C=81100.44
C=161800.30
C=322600.23
C=643600.19
C=1284400.16
peak440—
completion tokens≥ 650—
vacuous cells≤ 0—

Absolute per-metric bounds committed beside the kernels, not a percentage band, re-cut only from fresh reps on the same instrument. The same certify command also runs the gates that judge something other than speed — bfcl-subset, agentic-webserver, ttft-warm-gate, ttft-cold-gate, serve-matrix — whose records are charted on the benchmarks page.

Mechanism

Where the margin comes from

Ask this before the numbers. A speedup with no stated mechanism and no known ceiling is a configuration artefact waiting to be found.

Speculation, width-laddered

MTP, K=4 (--num-drafts 3); self-disables above 32 concurrent sequences. The draft width is chosen per concurrency (1:3,2:1,4:2,8:2,16:1) rather than fixed, so verification cost never exceeds the win.

Prefill co-dispatch and fp8 row-wise

Prefill overlaps decode rather than stalling it, and row-wise fp8 moves fewer bytes on the bandwidth-bound path. Decode at this scale is a memory-traffic problem, so this is where a real win has to come from.

Why C=128 is the widest rung

The baseline's C=128 (358.57 tok/s) falls below its own C=64 when speculation stays on at high concurrency; the subject has already switched it off. The margin is a scheduling decision, which is why it reproduces.

The pin that is load-bearing

Batch cap 128 on both engines at every rung, independent of the concurrency driven. A matched cap-32 pair inverted the ordering on the same box the same day; re-measured at cap 128 the ordering held with non-overlapping distributions. If you re-cap to survive a hazard, say so beside the number and re-pin both engines.

Self-audit

Ten ways to fake this, answered

Heiser's benchmarking-crimes taxonomy, run against our own campaign. Three rows stay open, because a checklist with nothing open is marketing.

  • Unfairly tuned competitoraddressed Baseline is vLLM with MTP K=4 and fp8 KV, not vLLM at defaults. The default-config number (vLLM, no speculation) is published beside it and is not what we claim against.
  • Selective data rangeaddressed All 8 rungs published, C=1 to 128, including the ones we win by 1.012×.
  • No statistical treatmentaddressed 3 timed reps per rung with the spread printed; the C=32 A/B publishes every rep so the distributions can be checked for overlap.
  • Relative numbers onlyaddressed Absolute tok/s for both engines at every rung, two decimals, matching the repository record byte for byte.
  • Incomplete platform specaddressed GPU SKU, driver, container digest, harness sha256, engine build SHA and full launch flags for both legs.
  • Microbenchmark as end-to-endaddressed Every number is served over the OpenAI HTTP path with a real client. No kernel-level timing is claimed as serving throughput.
  • Best-of instead of representativeaddressed Re-measuring C=8 on a later build came out higher than the certified 1.012×; the certified figure is what is published. Every rung is quoted as a same-day A/B rather than against a stored number.
  • Single hardware, single modelopen One GB10 box, one 27B NVFP4 checkpoint. We publish what we measured there and label it as such; no figure here is an extrapolation to another SKU or model class.
  • Fleet drift over timeopen A fleet-wide shift moved both engines at C=32. The margin narrowed and held; the differential is published rather than the favourable snapshot.
  • Not third-party auditedopen Everything here is self-run. That is why the artifacts are pinned to the level an external auditor would ask for, and why we would rather you re-ran it than took it.

Evidence

The reproduction kit, and the notebook behind it

A reproduction that needs a conversation with us is not one. Everything below is already in the repository, and the campaign log records what failed as well as what held.

code
Metrale Engine 1.0.0-beta-preview every gate record names the commit it measured, and its .sig binds the two
baseline
container digest sha256, not a tag; the same digest across every leg
harness
sha256 in every output the script hashes its own source into the JSON it writes
weights
unsloth/Qwen3.8-27B-NVFP4 HF repository, pinned revision
seeds
seed 42, temp 0 constants in the harness, not flags
raw data
per-rung JSON every rep, not the aggregate, under bench/ladder38/
record
bench/ladder38/RESULTS.md the lab notebook, including what failed
  • retractionA regression claim was withdrawn once it turned out to be a cross-box comparison; the withdrawal sits in the file above the claim it replaced.
  • negativeHypotheses closed as negative results stay in the log, including the K-ladder A/B and a throughput metric rejected as a gate.
  • discardedCompleted runs measured on the wrong box were thrown away rather than kept as the better number.
  • excludedDriver version excluded by measuring across boxes and drivers; thermals excluded by re-baselining after a physical move.

Provenance

Licence and invariants, enforced rather than declared

The first question counsel asks about a serving engine is the licence; the second is what a machine refuses. Both, with the mechanism that keeps them honest.

licence
MIT OR Apache-2.0 permissive, at the user’s option, the pair most of the Rust ecosystem ships under
headers
SPDX line 1, every source file CI-enforced against .licenserc.yaml
dependencies
deny.toml allowlist licence policy as a lockfile, not a policy document
third party
THIRD_PARTY_NOTICES.md vendored code keeps its own licence and is never restamped
provenance
signed records, ancestry check unrecorded history is rejected at merge
structure
500-line cap per source file enforced in CI, alongside clippy at deny-warnings
correctness
serve matrix per image boot, coherence, greedy determinism and tool reliability before an image ships

Every number in this deck is read from the same generated records the front page renders. If the ladder is re-run and a rung is lost, these slides say so on the next build.

engine b39a6650 · 2026-10-12