Method: what was frozen, what ran, in what order

Each engine ran as its author ships it, plus a short list of local settings, on one machine. For each checkpoint the comparison protocol was frozen before its comparison runs; settings experiments were declared as follow-ups before their own requests and are labelled outside the protocols. The K3.25 analysis had a separate review after the runs; the K4 run did not.

What was measured, in plain words

K3.25: frozen protocol and order

K4: frozen protocol and order

The frozen K4 protocol also included a third engine, not reported here; its memory limits set the concurrency grid and the long-output cap.

Which vLLM fork

"vLLM fork v0.9.2" is tpurtell's v0.9.2 release image (digest ea0430aa…) started with the v0.9.0 repository's start.sh through its IMAGE override (the launcher is otherwise unchanged); the K4 launches set MODEL_PROFILE=k4 in the same launcher.

The protocol files

What was scored

PanelWindowsTokens per window (min / median / max)Scored positions per windowTotal scoredHistory behind each scored token, tokens (min / median / max)TextReference
P-A BF16 teacher panel (brandonmusic)252,048 / 2,048 / 2,048all 2,047 (rows 0-2046)51,1751 / 1,024 / 2,047the dataset's 25 qualification windows; general, legal, agentic code and reasoning domains; same corpus as the calibration windows K4's producer published (document-disjoint), so it can favour K4zai-org/GLM-5.3-Flash-BF16 @ a6c167b6, full-vocabulary FP32 logits
P-B tpurtell's fidelity set (cuteafd-fidelity, glm5_flash v2)64513 / 2,777.5 / 14,403last 512; generated positions (primary) per window 6 / 248 / 51215,104 generated1,084 / 5,751.5 / 14,402replies written by the official FP8 model after conditioning and repository-source context; blocks A-E (B: long code reading)a BF16 run of zai-org/GLM-5.3-Flash-BF16 @ a5b45eb4, stored as its top 1,024 ids plus a tail bin
Q2 long human-written text1832,768 / 65,536 / 131,072last 4,09673,72828,672 / 63,487.5 / 131,0713 PG-19 books and 3 Apache-2.0 vLLM source files, each at 32K, 64K and 128K tokensnone

The K4 run scored the same panels and positions with top-20 measures. Teacher dataset identity and hashes: q/pa/PROVENANCE.json.

Setup

Hardware. 2× NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition (300 W), driver 595.84, Linux 7.0, IOMMU in pass-through mode. Besides the engine under test, the only processes on the GPUs were desktop graphics clients (about 2 GB on GPU 1), the same for both engines.

vLLM fork (V1)CuteAFD (C1)CuteAFD control (C0, Block Q only)
Enginetpurtell/glm-5.3-flash-ext3-2x-rtx v0.9.2 (tag f18f51f5)tpurtell/cuteafd v3.0.1 (9098781f)same as C1
Imageghcr.io/tpurtell/glm-5.3-flash-exl3-4bpw-2x-rtx:v0.9.2, index sha256:ea0430aa772e8cedfef1cdf80c30f4962ba43bb0991ac329950067ba1375f3e2ghcr.io/tpurtell/cuteafd-coordinator:v3.0.1@sha256:392db7c0bdd39ec5aacda800f9a3ada70342721a2357ad1ec09ad0ef5981459asame as C1
Checkpointwrldsuksgo2mars/GLM-5.3-Flash-EXL3-K3.25-v1 @ 0490d2f708b12145f6516555ab066aaeb401cd21wrldsuksgo2mars/GLM-5.3-Flash-EXL3-K3.25-Core-FP8 @ d31ebc921f1f098b4a56d37aaccb3cdef4096184K3.25-v1 @ 0490d2f7, GLM5_FLASH_FP8_MODEL_ID=off
Expert bytesK3.25-v1identical to K3.25-v1: 150,047 of 150,047 base tensors byte-checkedK3.25-v1
ProjectionsBF16official FP8 E4M3 (179 tensors)FP8, quantized at load
DrafterDFlash2, 3 draft tokens fixed, BF16, incoai/GLM-5.3-Flash-DFlash2 @ bf582e4eDFlash2, same checkpoint, adaptive depth, FP8 draftersame as C1
KV cacheFP8 MLA, 4,707,515 tokensFP8 MLA latent, 4,726,784 tokens
Request limit16 (max-num-seqs)16 (CONCURRENCY default)
Startup to ready382 s with the JIT caches persisted on this setup (697 s without)89 s (kernels compiled ahead of time)
Prefix cacheon, align mode (reuse in 4,352-token blocks, F2)on (engine default)
Attention and indexerMLA layers owned whole by one GPU (split:25); FP8 index keysMLA split by token across both GPUs (context); BF16 index keysas C1
LogitsBF16 before log-softmaxFP32as C1
Local deltasGPU memory utilization 0.95 (upstream 0.97, which does not start beside the desktop); listen address; launched with the v0.9.0 repository's start script and the v0.9.2 imagelisten address 127.0.0.1:8001, request logging off (USAGE=off), MAX_OUTPUT_TOKENS=393216, the infiniband guardas C1

Block Q additionally needs each engine's scoring path: CuteAFD's bench endpoint (ENABLE_BENCH=on, an API key, FULL_PREFILL_LOGITS=on), and on vLLM a prompt-logprob capture plugin (repro/stage0/capture-vllm). The FP8 projections in Core-FP8 are reproducible from K3.25-v1's BF16 tensors with amax/448 128×128 block scales (99.99998% of E4M3 codes equal): results/2026-10-26-cuteafd-setup-checks. Exact launch files: repro/cuteafd/ and repro/REPRODUCE.md. GPU telemetry from 2026-10-27 01:06 on (after both engines' Block T): both GPUs at the 300 W cap while busy, GPU 0 median 1,890 MHz and 87 °C (telemetry/).

The K4 measurement used the same engines, images, drafter and machine with brandonmusic's GLM-5.3-Flash-tr3-4bpw (brandonmusic/GLM-5.3-Flash-tr3-4bpw @ a5fee929) on both arms; its arms, declared differences and settings are in METHOD.md.

Confounds

What else differs between the two arms, and how each block handles it.

ConfoundWhat differsHow it is handled
Thinking-off renderingCuteAFD renders off as <think></think>; vLLM's template ignores the flagBlocks T and L run thinking on for every request (amendment A2), so both engines get the same prompt.
Chat templateByte-identical Z.ai template on both; prompt token counts differ by one only when thinking is offThinking on everywhere; each request's real prompt_tokens is recorded. Block Q uses raw token ids, no template.
Prefix cacheCuteAFD restores repeated prompts from its cache; vLLM's align mode reuses whole 4,352-token blocks only, not the last two of a prompt (F2)Every Block T and L prompt starts with a per-request nonce line, so no prompt is served from cache; one small cell measures cached prompts on purpose. vLLM's prompt-logprob requests skip the cache lookup.
FP8 vs BF16 arithmeticCuteAFD: MLA, shared and dense projections, KDA projections and output head in FP8; vLLM: BF16 GEMMs. KV FP8 on both; router output FP32 on bothPart of what is compared: each engine as its author ships it. C0 isolates the projection source inside CuteAFD; follow-up F1 the optional FP8 paths. A vLLM arm on Core-FP8 would need a loader change and is not run.
DeterminismCuteAFD repeats are byte-identical; vLLM's rows beyond the first 2,045-token prefill chunk vary from run to run (every capture ran alone, so this is not batching)CuteAFD is paired against the mean of three vLLM runs from two launches (F3); within-engine repeats are reported next to every difference.
Prefill shapevLLM chunks prefill at about 2,048 tokens; CuteAFD prefills token 0 alone, then up to 8,192 rows over 2 lanesRecorded per arm, not forced.
P-B trailing context rowsThe panel's trailing context rows (excluded from the primary metrics) are 30 copies of one unrelated file; there, KL is 0.7-3.1 nat between engines and up to 1.96 nat between two vLLM runsThese rows react strongly to any numerical change, so they are not used as a precision probe; only generated rows are primary, as tpurtell's rule specifies.
Teacher context limitNo BF16 reference beyond 14,403 tokens (P-B's longest window)Beyond 14K, Q2 compares the engines with each other and with their own repeats; it does not say which is closer to BF16.
Load conditionCuteAFD's scoring path takes an exclusive bench slotBlock Q is scored on idle servers only; batch-dependent numerics are covered only by the router route test.
SpeculationvLLM drafts 3 tokens per step with a BF16 drafter; CuteAFD drafts adaptively with an FP8 drafterBoth as shipped. vLLM accepts 1.53 of 3 drafted tokens per step (drift subset); CuteAFD's API exposes no acceptance counter.
Order and driftEngines run one after the other on one machineOrder V then C; a drift repeat of 16 cells on each engine, hours later: medians within ±2%, single cells up to about ±13%. GPU telemetry from 01:06 on: both GPUs at the 300 W cap while busy.
Request inputsPer-request nonces differ between the engines (prompt bodies identical); the 128K code prompts contain control-token strings that vLLM parses and CuteAFD keeps as text (24 tokens)Reported per cell; the effect on throughput is small. The drift repeats reuse each engine's own nonces, so they are byte-identical to that engine's earlier cells.
Other arithmetic and geometryAttention placement (vLLM split:25, CuteAFD context), index-key format (FP8 vs BF16), KDA output sharding, logits (BF16 vs FP32), prefill chunkingPart of each engine as shipped; listed so the precision differences are not read as one cause. F1 tests the switches CuteAFD exposes.

Fixtures are not comparable across model families, and NLL is per tokenizer; every number here is one model family and one tokenizer.

Limits

Two prompt-set sizes are small (Block L n=2 per prompt; Q2 6 documents); teacher-anchored precision stops at 14.4K; decode-shaped scoring not run; CuteAFD scoring cannot run under load; vLLM Block T ran before GPU telemetry began.

Timeline

Chronological, times UTC−7. K3.25 checkpoint first (results/2026-10-26-cuteafd-vs-vllm), then K4.

2026-10-26:

2026-10-27:

2026-10-27 (evening), K4 checkpoint (results/2026-10-27-k4-vllm-cuteafd; no separate review of this run):

2026-10-28:

Status

Other runs

Not part of the comparison above. Exploratory runs and checks are labelled as such in their folders and never share a table with the measured results.

RunKindWhat it is
2026-10-26-cuteafd-setup-checkscheckCore-FP8 expert bytes and FP8 projections checked against K3.25-v1; CuteAFD source audit
2026-10-26-e1-router-routeexploratoryCuteAFD router logits across its 160/161-row route switch (one GPU, one kernel)
2026-10-27-long-context-pilotexploratoryNeedle retrieval at 256K, 512K and 1M tokens, both engines, K3.25 (one request per prompt and engine)
2026-10-27-vllm-startup-cachemeasurementvLLM v0.9.2 startup time with and without persisted JIT caches, and CuteAFD's for comparison