At the end of the original campaign, a single league table would have hidden the most useful result. Several models accepted a million-token prompt; fewer retained the planted fact as a conversation grew; and adding one more user could undo an impressive single-user decode rate. We put those measurements beside each other to choose the next deployment test, not to declare an overall best model.
Where we ended up
We started with eight H200 NVL GPUs arranged as two NVLink quads, 2 TB of host RAM and 12 TB of NVMe. The configurations below reached different milestones on that node. The fresh-document measurements follow the campaign filters; the ramp intentionally reuses prior context, and its MiniMax row remains provisional. Combining the evidence in one table does not make every row equally validated.
Read the first two quality columns as different experiments. The fresh-document check sends one large prompt and tests recall at sampled positions. The conversation ramp grows from 32K toward 1M over ten turns and asks for the original hidden fact again each time. The ramp report explains the requests. Neither is a broad reasoning evaluation, and completing one does not certify the other.
| Model | Weights · KV | GPUs | 1M prompt: needle found | 1M conversation: needle (1 user · 2 users) | Last turn alone: first token · decode | $ per 1M conversation | GSM8K |
|---|---|---|---|---|---|---|---|
| Qwen3.8-Flash-Next | FP8 weights · BF16 KV | 4 | 3/3 | 9/10 · 20/20 | 14 s · 147 tok/s | $0.45 | not measured |
| GLM-5.3-Flash | FP8 weights · BF16 KV | 4 | 3/3 | 1/10 · 2/20 | 7 s · 144 tok/s | $0.32 | not measured |
| DeepSeek-V4-Flash FP8 (sgl-project) | FP8 weights (sgl-project build) · FP8 KV | 4 | 3/3 | 8/10 · 14/20 | 20 s · 129 tok/s | $0.60 | not measured |
| DeepSeek-V4-Flash-0731 FP8 (AtlasCloud) | FP8 weights (AtlasCloud cast of DeepSeek's FP4 experts) · FP8 KV | 4 | 3/3 | 6/10 · 13/20 | 19 s · 129 tok/s | $0.60 | 0.960 (n=250) |
| Qwen3.6-35B-A3B | FP8 weights · FP8 KV | 4 | 3/3 (963K-token prompt, YaRN ×4) | 8/10 · 12/20 | 34 s · 58 tok/s | $0.94 | not measured |
| Qwen3.8-27B | FP8 weights · FP8 KV | 4 | 3/3 (4th attempt; also 3/3 on 1011-044415) | stopped at 917K | - | - | 0.740-0.744 (n=250) |
| MiniMax-M3 (provisional) | MXFP8 weights (W8A16 on Hopper) · FP8 KV | 8 | 2/3 (FP8 KV; 3/3 with BF16 KV (run 1010-192440)) | 10/10 · 20/20 | 20 s · 56 tok/s | $1.58 | 0.936 (n=250) |
| DeepSeek-V4-Pro-0813 | FP4 experts as published (W4A16 Marlin on Hopper) + FP8 dense · FP8 KV | 8 | 3/3 | 10/10 · 20/20 | 35 s · 43 tok/s | $2.35 | not measured |
| GLM-5.3 | FP8 weights · FP8 KV | 8 | 3/3 | 10/10 · 20/20 | 58 s · 35 tok/s | $5.27 | not measured |
Sources for every cell: needle columns from results/runs/<run>/niah.log (three depths, 10/50/90%) and results/ramp1m.csv; speed and cost from results/ramp1m.csv at $3.50 per GPU-hour (Part 11 explains the price); GSM8K from results/quality/quality.jsonl, only where we ran it. Layouts and engines are in Parts 4 and 5. We didn't run the same accuracy test on every model, so this isn't a quality ranking.
Every result we publish has to come from a server that passed a needle check at the same context length with a score of at least 0.67. The MiniMax-M3 server that ran the ramp to 1M (minimax_m3__fx_tep8_recipe__1024k__vllm__1010-081133, FP8 KV) found the one-shot 1M needle 2 times out of 3 (0.667), just under the bar, so by our own rule its rows are unpublishable. We keep its numbers, marked provisional, because the ramp checked the needle on every turn itself and found it each time, the same treatment as in the ramp episode and Part 5. A later MiniMax-M3 server with BF16 KV found the 1M needle 3/3 (Part 13) but didn't run the ramp.
Three different claims about a million tokens.
- 01 · CapacityThe engine accepts the request
A configured limit and a completed prefill establish that this workload fits.
- 02 · RetrievalThe answer survives the context
A hidden-fact check tests specific recall, at the sampled positions and prompts.
- 03 · ConversationThe next turn still works
A growing conversation exercises repeated turns, retained state and competing users.
Passing one does not establish the others. None of these checks alone measures broad reasoning or production reliability.
The last turn changed when another user arrived

User concurrency is the theme we kept coming back to, and at 1M it bites hardest. With one conversation, the fastest models answer a ~1M-token turn in 7-14 s and then write at well over 100 tokens per second. Add a second user growing their own conversation and two things happen:
- The second request waits. One of the two users waits roughly twice as long for the first token, while the other conversation also has new tokens to prefill. The timing is consistent with shared-resource interference; we did not collect a scheduler trace for every step.
- Decode stalls behind prefill. The user already receiving output slows while the other request prefills. The measurements show the interference, though they do not isolate a single scheduler mechanism. The worst case was DeepSeek-V4-Flash FP8 (sgl-project): 129 tokens/s alone, 7 with a second user, about 18× slower.
The slowdown made prefill/decode separation worth testing: give the two kinds of work separate GPU groups and pay the cost of transferring state between them. The key question was whether isolation would repay that cost on this two-quad node. Part 8 records the short-prompt tests that fitted into the campaign.
Only a short-prompt version of that test fitted in the time we had. Splitting GLM-5.3-Flash across the two quads gave one user 3.6 ms per output token, but 7.4 s to the first token even for a 1K-token prompt (provisional: no 256K needle check exists for that server). The Qwen3.8-27B split ran after a one-line fix: slightly faster decode than the same model aggregated on the same eight GPUs, but a slower first token and less output (Part 8). Neither ran at 1M, so whether a split fixes the stall above is still untested on this node.
Which result we would use for which decision
These are readings of our own numbers on this node and these engine versions, not general rankings.
- Fastest 1M conversations on four GPUs: Qwen3.8-Flash-Next and GLM-5.3-Flash. GLM-5.3-Flash is the fastest and cheapest, but it recalled the hidden fact on only 1 of 10 turns of the growing conversation (it passed the 1M one-shot test). Qwen3.8-Flash-Next recalled 9/10 alone and 20/20 with two users.
- Complete recall on these sampled 1M checks: GLM-5.3 and DeepSeek-V4-Pro, both 3/3 on the one-shot test and 10/10 and 20/20 on the growing conversation, both on eight GPUs. MiniMax-M3 also recalled 10/10 and 20/20 and was quicker and cheaper than both on the last turn, but its server scored 2/3 on the one-shot test, so its numbers are provisional.
- Many users, short prompts: small mixture-of-experts models as one-GPU copies. Qwen3.6-35B-A3B reached the lowest cost per token we measured (Part 11), and one copy per GPU beat splitting a model across GPUs (Part 6).
- A dense model you want on one GPU: Qwen3.8-27B FP8, one copy per GPU. It reaches 1M on one GPU only slowly (about 9 minutes to the first token of a fresh 1M prompt), so we'd keep it at 256K.
- DeepSeek-V4-Flash: the two community FP8 builds behaved almost identically on speed; the AtlasCloud FP8 cast improved measured prompt latency versus the original FP4 release, but the unequal GSM8K sample sizes do not establish equivalent quality (Part 13).
The original campaign still had open questions
| Item | Status | Why |
|---|---|---|
| E09 draft-model training, E10 fine-tuning | dropped | Dropped early by the campaign owner: this series is inference only. |
| GLM-5.3 on SGLang across 8 GPUs | dropped | Didn't fit before the Sunday 15:00 cut-off. |
| GLM-5.3-Flash 8-GPU layouts (TP4×DP2, TP8, TP8+DCP8) | dropped | Same cut. So its PD split has no aggregated 8-GPU baseline (Part 8). |
| DeepSeek-V4.1-Flash FP8 cast | failed | Failed to boot on the vLLM images we had, including a nightly. The published H200 recipe uses the original FP4-expert checkpoint, not an FP8 cast: [S86] |
| DSpark speculative decoding on the V4-Flash FP8 build | failed | Boot failure on SGLang's dev-dspark image: the FP8-expert checkpoint isn't supported there (Part 13). |
| CUDA snapshot restore | blocked | No CRIU CUDA plugin on the node (Part 10). |
| NVMe RAID KV tier | not measured | The working set fit in HBM, so the tier was never read (Part 10). |
| gpt-oss-120b CPU KV offload | not run | The 400 GB-per-copy launch ran the host out of memory; the 96 GiB-per-copy retry was dropped for time (Part 10). |
| Qwen3.8-27B conversation to 1M | partial | Reached 917K tokens before its time cap; the one-shot 1M test passed 3/3. |
| LMCache KV offload | no gain | Two crashes on the hybrid model, then 0% hits for reasons we didn't find (Part 10). |
What we would carry into the next run
- Check the topology first. Two NVLink quads joined by PCIe change every layout decision (Part 1).
- Set the IOMMU to passthrough before anything else; cross-socket GPU copies failed until we did (Part 1).
- Start from the engine's or publisher's recipe, then read the issue tracker. Every model here started from a published recipe (Parts 2, 4 and 5), and most of our fixes came from issue trackers (Part 7).
- Audit your benchmark for prefix-cache hits. A reused random seed made some of our "250K" prompts come back from cache in under a second (Part 7).
- Grow conversations to 1M, don't just send one 1M prompt. GLM-5.3-Flash passed the one-shot test and failed the growing one (ramp episode).
- Count users × context, not context. It decides when you need KV offload (Part 10) and what a token costs (Part 11).
- Don't split one model across the islands if replicas will do (Part 6).
- Speculative decoding paid most with a published drafter for the exact model: DFlash more than doubled 16-user coding output on Qwen3.6-35B, while n-gram drafting made Qwen3.8-27B slower (Part 9).
- Keep the vLLM compile cache on a volume; it was the biggest cold-start saving we measured (Part 10).
- Label precision honestly. FP8, MXFP8, MXFP4 and FP4 behave differently on Hopper (Part 13).
The tables and charts retain their workload conditions and run references. The original evidence is in the campaign’s results/ directory. Keeping the failures there mattered as much as saving the best result: otherwise the next person would repeat the same invalid comparisons.
One last question before choosing a checkpoint
The table labels still hid an assumption: that two files called FP8 would use comparable storage and execution paths. They did not. Part 13 opens the tensor headers and checks what the labels actually mean.
Later follow-up: the “failed” and “dropped” entries above describe the original campaign, not the final state of this project. The afterword adds the missing GLM replica baseline and the completed DeepSeek-V4.1 native, DSpark and two-replica tests. They use different workloads and context limits, so their new numbers stay outside this million-token comparison.
Sources
Bracketed ids [S..] refer to the campaign bibliography (docs/SOURCES.md). Numbers not attributed to a source are our own measurements on this node.
- [S86] vLLM project (recipes), https://recipes.vllm.ai/deepseek-ai/DeepSeek-V4.1-Flash