GB300 GLM 5.3 Testing
Current-state profile of full GLM-5.3 NVFP4 on one DGX Station GB300.
Current public recipe: GLM-5.3-NVFP4-One-GB300. Fair-gate / needle / trace receipts: 2026-09-13-k2-fair-gate-needle-trace; K=2 task ladder: 2026-09-13-k2-selfrepeat-quality; context-curve receipts: 2026-09-13-context-slot-curve; E1 v2 receipts: 2026-09-08-e1-v2-live. It is an experimental recipe, not a quality-approved default.
Current-state verdict, September 13 evening: three things settled in one afternoon on the 256K daily profile. (1) 256K is fully usable. A three-variant needle ladder (single key; five ordered keys at 10–90% depth; real key against four same-prefix decoys) passed 18/18 through a 240K target (211,289 actual prompt tokens) with prefill flat at ~3.4–3.5K tok/s and 62 s wall at the top rung. So the earlier framing of “declare less context for speed” is the wrong lever; the right one is decoupling KV from expert slots. (2) K=2 is quality-equivalent to K=1, and the greedy-identical gate was the wrong instrument. The 11 prompts where the two lanes’ greedy text differs were teacher-forced on both servers; the model’s logprobs at every divergence site are byte-identical between servers (max |Δ| 0.0) and where the lanes disagree the model rates them near-ties (K1 rank-1 at 5 sites, K2 at 3, neither at 3). The frozen task ladder agrees: 191/200 vs 190/200, 0 losses / 1 win / 99 ties. The September 9 “9/20 hard fail” is retracted on quality grounds. K=2 is +3.17% faster on a fixed instrument (paired 95% bootstrap CI +0.5…+6.1, 6/8 prompt wins), below the +5% bar, so K1-256K stays daily and K=2 is reopened rather than closed. (3) On this model a cache beats any fixed expert allocation. On the frozen routing trace at the live slot budget, a hindsight-optimal static pin reaches 0.633 mean hit; LRU reaches 0.719. Cross-layer expert overlap is at random chance (0.031); step-to-step overlap is 0.27. The remaining “speculative allocation” signal is one step ahead, not across layers.
Current-state verdict, September 14, 10:45 AM: K=2 + fused hook is the new daily, +7.25%. Five levers from the morning’s research list were measured in one-axis windows against the K1 daily (control 51.40 tok/s C1, 8 prompts × 512 tokens × 3 reps). Hook v2 scalar-fuse (one Triton launch replaces three index_put_ scalar-slot copies per layer-step) gives 53.49 tok/s, +4.58% [95% CI +4.42, +4.78], 8/8 prompt wins, and is 20/20 greedy byte-identical to the stock hook. K=2 on top of it: 54.69 tok/s, +7.25% [95% CI +4.33, +10.44], 8/8 wins, which clears the +5% bar the September 13 K=2 gate missed alone; its teacher-forced margins reproduce that gate exactly (11 sites, max |Δlogp| 4.50, K1-rank-1 at 5 / K2 at 3). James promoted it at 10:35; container glm53-big-sc13g-mtp2-ctx256k-K2fuse-DAILY-20260914, real Hermes tool-loop gate passed, rollback is the kept K1 daily. Recipe closed out by 12:20 PM: the daily now launches from the public recipe tree with one documented command (args byte-identical to the promoted lane), and decode noninferiority against the offload-only V1 baseline is formally established: the same 20 reference texts teacher-forced on both servers, 3,071 tokens, max |Δlogp| = 0.0 — the slot cache, the fused hook and MTP(2) together compute exactly the baseline’s per-token logprobs. Model identity verified too (89/89 HF LFS sha256 match). The recipe status is verified with dated gate receipts. Measured dead the same morning: the agent-traffic slot remap (+0.002 hit on 96,504 captured agent steps), MTP-draft routing prefetch (draft→next-step overlap 0.0316 vs chance 0.0312 on 14,540 steps, 0/75 layers above 2× chance), and --max-num-batched-tokens 16384 (+0.19%). Receipts: 2026-09-14-agent-remap-draftcorr-scalarfuse-k2.
Correction, September 14 (data overturns two claims below): I spent the evening of the 13th researching my own lane (four subagent analyses against the pinned vLLM 2cf0a691 source, the frozen trace, and my own session’s slot-cache log). (1) The “MTP draft already gives the routing for step t+1” sentence is false in mechanism. GLM-5.3’s MTP draft is a separate one-layer MoE with its own fp32 router and its own 256 expert weights (glm4_moe_mtp.py:95–101; spec weights load as model.layers.78 remapped into mtp_block). The drafter↔target buffer sharing in vLLM is the DSA sparse-attention indexer, not MoE routing. Since every main layer’s routing is mutually at chance (0.031), a separately trained layer-78 gate cannot predict any main layer. The cheap fallback, previous-step same-layer routing, is also dead: exact replay shows it covers 0.000000 of actual next-step misses, because anything requested at step t is already LRU-resident at t+1. The upper bound survives only as perfect known-route lookahead (+23–37 tok/s modeled), which nothing in the stack currently knows; reaching it needs a learned predictor or a measured draft↔main correspondence, and one measurement-only capture window would settle whether that correspondence exists. (2) The LRU 0.719 figure is a T//8000 subsample from the recipe analyzer; exact full-trace replay at the same 7,360 slots gives 0.802 hit / 1.58 misses per layer-step. The static-vs-LRU ordering and the chance-level cross-layer overlap stand. (3) New: a calibrated decode cost model on clean windows (n=17, R²=0.953) puts the step at ~22.4 ms base + 4.27 ms per miss/layer-step, i.e. ~332–346 GB/s effective C2C, and masked_row_copy already runs at 87–105% of that peak, so the cost is bytes, not the kernel. Under my own agent traffic the live hit is 0.407, far below the 0.802 replay ceiling, and the worst layer is layer 12 (hit 0.10–0.15 in 58 of 124 windows) despite an above-average 112-slot budget: the slot map is workload-fit-limited, not budget-limited, and (measured later the same morning) a remap from an agent-traffic capture buys only +0.002 hit: the workload’s locality is the limit, not the map. Ranked next steps below, in the September 14 section. Full record: research/speed-research-2026-09-13.md in the recipe repo.
T//8000 subsample; exact replay LRU = 0.802)Earlier on September 13 (kept as history): the daily profile is now 256K context / 24 GiB bf16 KV / 7,360 expert slots. We finally measured the context↔slot curve live instead of trusting the September 7 planning numbers: three one-axis clones of the same sc13g + MTP(1) build (same image, same model, only KV reservation and slot map differ) ran the same warm → greedy ×3 → 512-token probe window back to back. 512-token decode medians were 51.29 tok/s at 256K, 44.83 at 512K, and 34.14 at 1M — a 1.5× range that tracks expert-cache misses per layer-step (3.12 / 3.77 / 6.82) almost linearly. Quality is a non-axis: greedy outputs over 20 fixed prompts were 20/20 identical in-lane three times on every profile and 20/20 identical across lanes. The 1M profile loads and serves (engine init 92 s after weights); the September 7 “too slow” abort was cold-load impatience. It is kept as a swap-in long-context option, not the default. K=2 stays closed. Superseded the same evening: see the verdict above and the fair gate below.
September 9 (kept as history; quality verdict corrected September 13): keep K=1. The greedy 9/20 number below reproduces exactly, but it measures kernel-shape equivalence, not quality; see the fair gate. The speed read stands. A matched-window K=2 continuation on the same 512K slot-cache recipe failed both gates that matter: greedy bit-exact 9/20 (required 20/20) and 512-token median 47.127 tok/s versus a 48.034 tok/s bar. K2 bought about 21% more accepted tokens per step and paid about 44% more expert-cache misses. Offline LRU/static/prefetch replay on the same 79k-token corpus cannot find a 15% miss cut at equal HBM, so we are not spending another live window on cache policy. masked_row_copy remains about half of decode GPU. No promotion.
September 8 E1 v2 (kept as history): correction: my first cut misattributed prefill bypass kernels to decode and was corrected the same day; I also misread backend=eager as eager execution. The corrected decode-only view is GPU-bound at about 40.1 ms/verification step wall and 43.1 ms/step aggregate GPU. Decode is CUDA-graph captured. masked_row_copy is 20.10 ms/step, 46.6% of decode aggregate GPU and about half of decode wall; routed MoE decode GEMMs are 5.38 ms/step. The bookkeeping hypothesis still fails at 1.56 ms/step.
Measured scope: E1 v2 ran September 8, 2026 11:10–12:07 CDT on the single GB300 with the GLM-5.3 NVFP4 full model, vLLM v0.28.0, 512K context, max-num-seqs=1, MTP K=1, and slot-cache expert offload. Nsight Systems 2025.6.3 captured a 4-request × 64-token probe: 140 verification steps, 8.22 s full-profile wall, 256 completion tokens at 45.648 tok/s, and 1.6% profiler slowdown. Separating the prefill rows by instance count gives decode wall 40.1 ms/step and decode aggregate GPU 43.1 ms/step; kernel sums can exceed wall because they aggregate overlapped GPU work.
masked_row_copy share of decode GPU; ~50% of decode wallK=2 continuation: measured, then closed (September 9; reopened September 13)
The September 9 continuation is measurement-only. It does not authorize promotion. Cache counters below are raw matched-window observations, not campaign-valid until a later receipt says otherwise.
| Metric | K=1 (C1 / canary) | K=2 (C2) | Read |
|---|---|---|---|
| Greedy vs incumbent | 20/20 | 9/20 | |
| 512-token median decode | 45.747 tok/s | 47.127 tok/s | +3.0%; gate needed ≥48.034 |
| Accepted tokens / step | ~1.97 of max 2 | 2.39 of max 3 | ~0.4 extra tokens realized |
| Routes, steps 100→164 | 75,600 | 115,200 | +52%, as expected |
| Misses / layer-step (raw) | 4.24 | 6.02 | +42% |
| Expert-cache hit rate (raw) | 73.5% | 74.9% | Flat |
The offline simulator reproduced live K=1 misses/layer-step within 0.81% on the frozen 79,119-token routing corpus. The best equal-HBM policy/allocation candidate from the September 7 replay still cuts misses by only 0.083%. That is not a live window.
Nsight on the K2 profiled window now GPU-projects 634/634 spec_verify NVTX ranges onto exact dynamic trace IDs. No expert_fetch NVTX class was emitted. Kernel time in that window is still dominated by masked_row_copy at 46.2% (94,500 instances), with routed MoE GEMMs at 26%. Same picture as the September 8 K=1 decode profile: miss copies, not MoE math.
A future live release now has to pass a dummy system-scope restore-timer contract on real systemd before the incumbent is stopped. That is a process gate, not a speed claim.
E1 v2: the first valid profile of this lane
The important result is negative in the useful way, with a same-day attribution correction. I expected slot-cache bookkeeping and scalar gather to clear the 2.0 ms/step gate and justify a gather-compaction kernel. It did not. The measured sum is 1.558 ms/step, below the gate. Separately, the first bucket cut was too broad: it divided the whole capture by decode steps and included prompt bypass kernels.
The corrected decode-only cost picture is row movement first. Measured: masked_row_copy is 20.098 ms/step, dense GEMMs are 9.415 ms/step, routed MoE decode GEMMs are 5.38 ms/step, fused bookkeeping is 1.054 ms/step, and the residual other bucket is 7.18 ms/step. Inferred from source plus trace ordering: the row-copy path is 75 cached layers × four launches per cached layer: w13 rows, w2 rows, and two scale tensors. That is 300 launches per verification step.
| Bucket | Label | ms/step | % decode GPU | Evidence / notes |
|---|---|---|---|---|
| masked_row_copy | Measured bucket; launch count inferred | 20.10 | 46.6% | 42,900 instances in summary; source + last 140 inferred slot-cache steps give 75 cached layers × 4 launches = 300/step. |
| dense_gemm | Measured | 9.41 | 21.8% | Dense GEMM bucket in the decode-only table. |
| other | Measured residual | 7.18 | 16.6% | Includes scalar gather at about 0.50 ms/step and MLA attention at about 0.32 ms/step. |
| routed_moe | Measured decode rows only | 5.38 | 12.5% | Decode-path Instances == 10725 routed rows; the earlier 22.1 ms figure included prompt/prefill bypass rows. |
| fused_bookkeeping | Measured | 1.05 | 2.4% | Part of the falsified bookkeeping hypothesis. |
Measured and inferred row-copy shape: masked_row_copy has p50 34 µs, p95 214 µs, and max 519 µs over the full trace. Inferred: w13 copy-duration quantization gives about 4.4 missed experts per layer-step, an implied hit rate around 0.73, and byte movement of roughly 18 ms/step out of the 20.1 ms/step bucket. That makes the row-copy bucket about 90% C2C bandwidth and only about 2 ms/step launch/empty-program overhead. Only 2.4% of w13 launches are below 10 µs; the earlier near-empty read was dominated by the small scale-tensor launches.
| K=1 comparator lane | Restored incumbent | Patched K=1 tree | Read |
|---|---|---|---|
| Prose C1 throughput | 45.75–46.33 tok/s | 45.6–47.1 tok/s | Matched within noise. |
| Code C1 throughput | 42.95 tok/s | 42.89 tok/s | Matched within noise. |
| Weighted K=1 accepted length | 1.827 | 1.820 | Matched within noise. |
What the v2 runner does differently from v1: it pins the candidate image by digest, snapshots the executed source before profiling, restores the incumbent before offline analysis, uses an independent failsafe, and gives the full-model cold-load path a 40-minute readiness budget. That matters because v1's 10-minute readiness window was enough to manufacture an inconclusive launch failure, not enough to profile the lane.
Measured CUDA API read: decode is CUDA-graph captured. The GPU kernel summary has about 4,400 decode kernel instances per step, while the API trace shows about 189 kernel-launch API calls per step plus 3.06 cudaGraphLaunch calls per step. That means roughly 4,200 kernels/step replay inside CUDA graphs, with 189 eager launches/step left as the non-captured remainder. The 5.5 ms/step launch-API time is mostly overlapped and is not a first-order lever. The 29.9 ms/step in cudaEventSynchronize is host wait time consistent with GPU-bound decode, not a new overhead bucket to optimize first.
Contract status: inconclusive by design. This was a collection-only run; the analysis happened offline after the incumbent had already been restored and proven. The profile is valid for attribution, but it is not a release-promotion gate.
Ranked next experiments
- Reduce miss bytes by improving hit rate and slot budget. First-order target, confidence medium. Inferred: about 4.4 missed experts per layer-step, implied hit rate about 0.73, and about 18 ms/step of C2C byte movement inside the 20.1 ms/step row-copy bucket.
- Amortize miss bytes across more accepted tokens per step, especially MTP K=2. First-order if quality holds, confidence medium/low. The byte cost is per layer-step, so more accepted tokens per step can amortize it.
- Skip empty masks or coalesce row-copy launches. Estimated save ≤2 ms/step, confidence low/medium. This is demoted because row-copy cost is mostly C2C bytes; only 2.4% of w13 launches are below 10 µs.
- Fuse or remove remaining non-GEMM
otherkernels. Estimated save 1–2 ms/step, confidence low/medium. Evidence: the corrected decode residual is 7.18 ms/step, including scalar gather and MLA attention. - MoE grouped-GEMM shape/tuning pass. Low priority for decode. Evidence: routed MoE decode GEMMs are 5.38 ms/step after separating prefill bypass kernels, not 22.1 ms/step.
- Enable CUDA graph replay. Not a current experiment. Decode is already graph-captured; the 189 eager launches/step are the non-captured remainder.
Separate TTFT note: the prefill bypass path costs about 7.8 ms/layer across 75 cached layers, roughly 0.6 s per short prompt here. That deserves its own prefill/TTFT experiment, but it is not the current decode target.
Dated history: September 7 E0/E1/E5 v1 window
The September 7 v1 window stays here as history because it explains what v2 fixed. E0 ran against the unchanged incumbent and produced telemetry, not a candidate comparison. The reconstructed MTP(1) slot-cache hit estimate was ~74.8% across 37 windows, computed from two-decimal legacy miss counters with a corrected denominator of 16 routed experts per engine step. That is a reconstructed estimate, not direct route instrumentation.
The v1 E1 attempt did not reach a useful profile. The patched-tree candidate was launched under Nsight Systems, but launch environment inheritance turned the compilation config into invalid JSON ({"mode":3,"backend":"eager"}) and the 10-minute readiness budget was shorter than the full-model cold-load path. That failed launch was not a model finding, not a profile finding, and not a kernel/API attribution.
E5 was not authorized and not run; K2 remained untested. The v1 closure restored the incumbent container glm53-big-sc13g-mtp-ctx512k-keep-pre-dflash2-20260907, image vllm-glm53-uva:v0.28.0-2cf0a691, model glm-5.3-big, 524,288-token max length, seq1, MTP with num_speculative_tokens=1, and authenticated completion WINDOW_RESTORE_OK.
Historical v1 receipts: 2026-09-07-e0-e1-e5-window outcome and live receipts. Current v2 receipts: 2026-09-08-e1-v2-live.
Original frozen-campaign verdict: one GB300 can serve full GLM-5.3 NVFP4 by using Grace memory as the cold tier and HBM as the fast tier. The non-MTP slot-cache recipe is a real measured performance path, and the MTP(1) run passed the bounded primary code/math gate and the warm C1 speed gate. Overall promotion is still inconclusive, because the frozen secondary structured-output gate failed in all lanes. This is a useful experimental MTP result, not a broad model-quality claim.
DFlash2 transfer test: stopped. We tested incoai's DFlash2 draft at K4 on the same one-GB300 selective-UVA idea. Geometry passed and an explicit-eager candidate served, but weighted accepted length was 1.5718, below the frozen 3.0 stop gate. We did not run C1/C4/C8 or quality stages after that failure. DFlash2 was not promoted; the 512K/MTP lane remains the daily profile. Read the measured result.
Demand-fill DMA PR #1: stopped. Fabian correctly identified that slot-cache miss fills used Triton SM kernels and contributed an opt-in cudaMemcpyAsync H2D backend. The GB300 CUDA suite passed 5/5 and all 75 MoE layers classified correctly, but end-to-end DMA eager measured 8.75 tok/s at C1 versus 9.04 for matched Triton eager and 55.27 with Triton plus CUDA graphs. That is 3.28% slower than the eager control, not the frozen 5% win required to continue. We stopped it, restored and smoke-tested the 512K/MTP lane, and published the full receipts and checksums.
Ahmad Osman had the right framing before we had this evidence. In a September 3, 2026 post, @TheAhmadOsman wrote that you do not really “run a model”; you run kernels, schedulers, memory movement, and execution paths. This GB300 campaign became a worked example. The model name stayed constant. The hardware stayed constant. The useful numbers moved when we changed where bytes lived, how experts were routed, which tensors were pinned, and whether MTP was allowed to draft one token.
The mistake to avoid is treating a 744B mixture-of-experts model like a dense 744B read on every token. GLM-5.3 has large total capacity, but each token activates a subset of routed experts. The whole checkpoint still has to be resident somewhere, yet decode cost is dominated by selected expert rows, dense/shared work, and the memory path those selected rows take. If the active expert rows are in HBM, Blackwell runs them fast. If they are in Grace memory, the GPU can still read them through coherent UVA over NVLink-C2C, but the system becomes a bandwidth, placement, and cache-miss problem.
What the box is actually doing
The Station has nominal 288 GB HBM3e, but the observed compute GPU exposes 256,703 MiB, or 250.7 GiB, and about 249.8 GiB is CUDA-usable. Host memory is 494.5 GiB on Grace. Those units matter: the usable CUDA budget is the observed allocation ceiling, not a marketing-memory number. The current recipe sizes against observed memory, not the spec sheet.
V1 is the preserved baseline: vLLM 0.28 local GLM-5.3 UVA build, the GLM-5.3 NVFP4 checkpoint by intent, bf16 KV cache reserved at 8 GiB for a 65k context, --max-num-seqs 4, and --cpu-offload-gb 188. The slot-cache variant pushes all routed experts to pinned Grace memory, then keeps a working set of expert rows in HBM slots. A “slot” is just a fast parking space. Instead of asking HBM to hold every possible expert, the cache keeps the experts the current workload is likely to reuse, like keeping the tools for the job on the bench and the rest on shelves across the room.
The measured result, without promotion language
The current recipe records the best non-MTP slot-cache run, sc13g, at 43.1 tok/s C1, 92.0 aggregate tok/s at C4, and 95.6 aggregate tok/s at C8. That is evidence that the memory layout and router repair matter. Earlier sc8 results are historical: sc8 was faster but failed the old greedy gate 2/20. The current packaged path uses the FFI router to call the Monolithic routing implementation so the Modular slot-cache path receives matching ids and bf16 weights. In the local recipe evidence, sc11 was exact but too slow at 5.9 tok/s C1; sc13g recovered performance and reports 20/20 greedy against the tested eager comparators plus zero reported prefill deltas.
That is not the same as formal quality proof. The decode audits showed why the old common-prefix metric was not good enough: two V1G self-repeats on 53 prompts produced only 12 identical complete continuations, and the common-prefix comparison covered only 40.1% of eligible generated tokens. A zero-disagreement result on retained prefixes is a useful diagnostic, but it censors the first place the outputs differ. Greedy equality was a good alarm bell. It was not a complete admission policy.
| Evidence lane | Measured performance | Quality / gate status | How to read it |
|---|---|---|---|
| V1 baseline recipe | 33.8 tok/s C1; 57.7 aggregate C4; 57.6 aggregate C8 | Historical retained baseline, 20/20 greedy in its bundle | The preserved reference and rollback target, not a universal quality guarantee. |
| sc13g slot cache, no MTP | 43.1 tok/s C1; 92.0 aggregate C4; 95.6 aggregate C8 | 20/20 greedy diagnostics and prefill parity evidence; decode noninferiority not formal | A promising experimental performance recipe, not a blanket quality claim. |
| sc13g + MTP(1) | Recorded throughput 54.7 tok/s C1; 107.8 aggregate C4; 102.9 aggregate C8 in imported run | Greedy/logprob diagnostics did not qualify it; later frozen primary code/math passed, secondary failed | Useful speed evidence, but default promotion remains blocked. |
| sc13g + DFlash2 K4 | Acceptance-harness median 7.8775 tok/s; not a matched bench3.sh result | Weighted accepted length 1.5718 vs frozen 3.0 gate; C1/C4/C8 and quality not run | Stopped at the cheap gate. Negative transfer result for this UVA path, not a verdict on HBM-resident DFlash2. |
| PR #1 demand-fill DMA | 8.75 tok/s C1; 34.00 aggregate C4; 33.40 aggregate C8 | CUDA 5/5 and 75/75 H2D classification passed; performance continue gate failed | 3.28% slower than matched eager Triton and 84.17% slower than graph-enabled Triton at C1. Stopped; 512K/MTP restored. |
| Frozen MTP quality campaign | Warm short C1 effective TPS 53.98 vs 40.92; long wall ratio 0.7697 | Primary code/math 190/200 both, 1 loss, 1 win, 98 ties; secondary 33/44 candidate | Primary and speed passed. Overall result is inconclusive because secondary did not pass. |
| E1 v2 Nsight profile | Corrected decode-only: 40.1 ms wall/step; aggregate GPU 43.1 ms/step. Patched K=1 prose C1 45.6–47.1 tok/s; code C1 42.89 tok/s; acceptance 1.820. | Collection-only profile; K=1 comparator matched incumbent within noise; promotion unchanged. | Measured attribution moved the decode target from bookkeeping/gather, CUDA graph enablement, and MoE GEMM tuning to miss-byte reduction and MTP K=2 amortization; prefill bypass is a separate TTFT note. |
The frozen MTP campaign is the most important correction to this post. The primary denominator is 100 unique tasks, not 200 independent examples. Each task had two repeats, and the task-level comparison counted whether the candidate lost, won, or tied the matched non-MTP control. The candidate had 1 loss, 1 win, and 98 ties. The one-sided 95% Clopper-Pearson upper bound on gross-loss proportion was 0.04655981145353899, below the frozen 0.05 limit. The repeat accuracy was 190/200 for both sc13g and sc13g-mtp. On that bounded low-reasoning code/math gate, MTP passed.
The speed gate also passed. The warm short-prompt C1 median effective throughput was 53.98028929327154 tokens/s for sc13g-mtp versus 40.92076273384625 for matched sc13g, a 31.9% gain. The long-prompt median wall-time ratio was 0.7696895272711062, so the candidate did not show the prohibited long-prompt wall regression. These are repeated measurements under the campaign harness, not a universal speed law.
The reason this is still not a promotion is the secondary gate. The contract required the 40 supplied-data/structured-output rows plus four tool-chain episodes to pass. They did not. V1 scored 36/44, sc13g scored 35/44, and sc13g-mtp scored 33/44. All four tool-chain episodes passed in every lane. The failures were structured/supplied-data outputs: malformed JSON with reasoning or prose appended, duplicated JSON, extra braces, and a few well-formed wrong fixture answers. That pattern does not prove a clean MTP-specific quality collapse, because many failures are shared across lanes. It does block the recommendation because the rule was frozen before scoring.
Sources: frozen contract, audit and public evidence bundle; historical throughput and routing diagnostics; observed hardware manifest. Historical C4/C8 figures are aggregate throughput, not per-user latency, and are separate from the matched warm-C1 campaign. Effective TPS includes request wall time; these are not isolated decoder-kernel timings.
K=2 fair gate: let the model score its own divergences
The September 9 close rested on a greedy bit-exact requirement. Today’s first result was that K=2 is deterministic: three self-repeat passes, all 20/20, on two separate launches. So the 9/20 against K=1 is not nondeterminism; it is two valid numerical paths (verifying 3-token blocks vs 2 changes GEMM shapes and float reduction order in the NVFP4 path) picking different tokens at near-ties. Byte-exact-vs-K1 was comparing two equally valid decode paths and calling one wrong.
The fair instrument is teacher forcing. For each of the 11 divergent prompts, take the shared token prefix, append K1’s token or K2’s token, and ask the server for the logprob of that token via /v1/completions with echo=true, logprobs=1 (same reasoning_effort=low render as generation). Same prefix, same distribution, so the two logprobs come from one context. Then do it again on the other server.
| Teacher-forced margins, 11 sites | scored on K1 server | scored on K2 server |
|---|---|---|
| mean |Δlogp| (K1 token − K2 token) | 1.023 | 1.023 |
| max |Δlogp| | 4.50 | 4.50 |
| K1 token rank-1 / K2 token rank-1 / neither | 5 / 3 / 3 | 5 / 3 / 3 |
| max |logpK1srv − logpK2srv| over all 22 scored tokens | 0.0 | |
| self-fidelity (own greedy text, fraction rank-1) | K1 text 0.946 · K2 text 0.943 | K1 text 0.946 · K2 text 0.943 |
| instrument proof (same sequence scored twice) | identical | identical |
Read: the two lanes share prefill numerics exactly. The only difference is which token the decode path emits at a near-tie, and the model itself does not prefer either lane. The frozen task ladder run earlier today says the same thing from the other side: K2 191/200 vs K1 190/200 on HumanEval + GSM8K, 0 losses / 1 win / 99 ties, Clopper-Pearson 95% upper bound on loss 0.0295 (receipts). The secondary structured-output gate is still 9/20 on both lanes, as it has been on every lane since September 6; that is a template problem, not a K axis.
| Speed, fixed instrument (8 prompts × 512 tok, warm discarded, 3 scored reps) | K1-256K | K2-256K |
|---|---|---|
| C1 median tok/s | 51.50 | 52.92 |
| max per-prompt spread | 0.48% | 0.04% |
| TTFT median (50–60-token prompts) | 0.498 s | 0.507 s |
| paired Δ per prompt | prose −2.1, −1.9 · code +6.1, +3.2 · reason +10.7, +0.6 · list +5.6 · dialog +3.1 | |
| paired mean, 95% bootstrap CI, wins | +3.17%, [+0.52, +6.08], 6/8 | |
| live expert-cache hit during window | ~0.55 | ~0.44 |
K2 gets 2.2–2.8 accepted tokens of a possible 3 per step against K1’s 1.8 of 2, but routes ~40% more experts per step and pays in misses; prose has the lowest acceptance and nets negative. The CI lower bound clears zero, not five. Verdict: K1-256K stays daily; K=2 is reopened. It is the lane that benefits most from any future miss reduction, because it amortizes miss bytes over more accepted tokens, so this exact gate gets rerun after the first such change lands.
Two corrections logged in the receipts: the greedy script executed its generation loop on import and silently overwrote one K2 output file with K1 output (caught by md5, restored from an identical sibling, script fixed); and the first margin run omitted the reasoning_effort template kwarg and is kept as a non-result.
Usable context on the 256K profile: 18/18 to 211K tokens
James’s point: a declared window is not a usable window, and single-needle recall overstates it. So the ladder runs three variants per rung, random-word filler to defeat the prefix cache, one retry with a fresh seed, stop at the first failed rung. Served via /v1/completions with the chat render pre-closed <think></think>, because this template has no think-off switch.
| Target | Prompt tokens | Single key | 5 ordered keys @ 10/30/50/70/90% | Real key vs 4 same-prefix decoys | Wall | Prefill tok/s (upper) |
|---|---|---|---|---|---|---|
| 8K | 7,057 | PASS | PASS | PASS | 2.3 s | 3,100 |
| 32K | 28,351 | PASS | PASS | PASS | 8.6 s | 3,303 |
| 64K | 56,501 | PASS | PASS | PASS | 15.9 s | 3,550 |
| 128K | 112,632 | PASS | PASS | PASS | 31.9 s | 3,528 |
| 192K | 169,195 | PASS | PASS | PASS | 48.5 s | 3,486 |
| 240K | 211,289 | PASS | PASS | PASS | 61.2 s | 3,452 |
Prefill is flat across the range on the offloaded recipe: the bypass path reads non-resident experts per chunk and that cost does not grow with position. Two consequences. First, the 256K profile is not paying for context nobody can use, so the speed win from shrinking context is real but the “just declare less” framing was mine and it was wrong; the lever for 512K–1M at 256K speed is moving KV out of HBM so the slot budget stays at 7,360. Second, this is only the 256K lane; the same ladder on the 1M profile is the experiment that decides whether that lane’s 25% decode cost buys anything.
Expert allocation vs a cache: what the routing trace says
James pushed back on my earlier framing: we assign per-layer slot counts, not experts, so surely picking the right experts for HBM would keep the GPU out of Grace. A correction first: I had described the slot map as pinning specific experts. It does not. slots-7360-ctx256k.json is a per-layer capacity (64–176 of 256 experts); occupancy is a live LRU clock, and EXACT_PIN is cudaHostAlloc exact-size host pinning, unrelated to expert choice. Nobody has pinned experts on this box. So I replayed the frozen decode routing trace (71,210 tokens, 75 MoE layers, 256 experts, top-8) at the live slot budget under four policies.
| Policy, same 7,360 HBM slots | Mean hit | Misses / layer-step |
|---|---|---|
| static oracle: hindsight top-S per layer, never evicts | 0.633 | 2.94 |
| LRU (what runs today) | 0.719 (subsample; exact full-trace replay 0.802) | 2.25 (exact: 1.58) |
| hybrid: pin top-50% of S, LRU the rest | 0.710 | 2.32 |
| hybrid: pin top-75% of S, LRU the rest | 0.697 | 2.42 |
| Predictability | Mean overlap | Random baseline (8/256) |
|---|---|---|
| cross-layer: layer L’s top-8 set ∩ layer L+1’s, same step | 0.031 | 0.031 |
| temporal: step t’s set ∩ step t+1’s, same layer | 0.271 (0.07 early layers → 0.29 late) | 0.031 |
Read: GLM-5.3’s routing has temporal locality, not global concentration. A cache exploits that; a pin cannot, and even a hindsight-perfect pin loses to LRU by 9 points (static wins only in the flat early layers 3–7, by ≤3 points). Expert ids are independent across layers, so “route L, prefetch L+1” has nothing to work with. The step-to-step signal is what LRU already harvests. The version of James’s idea this trace supports is speculative allocation one step ahead: the MTP draft already gives the routing for step t+1 (retracted September 14: the MTP draft is a separate one-layer MoE with its own router and cannot predict main-layer routing; previous-step routing covers 0.0 of next-step misses; see the correction callout at the top), so if step-t+1 routes were known, miss fills for t+1 could be issued during step t, turning the remaining ~2–4 misses per layer-step from synchronous masked_row_copy stalls (about 18 ms of the 40 ms step in the E1 v2 profile) into asynchronous C2C copies. C2C bandwidth bounds it, not latency, so expect to hide part of the stall, not all of it. Sim LRU says 2.25 misses per layer-step; live K1 shows ~3.1 and K2 ~4.4, because the decode-only sim does not model prefill bypass or MTP verify positions. Prefetch value scales with the live number. Other MoEs (shared experts, node-limited routing) skew far harder than GLM, and James’s bet may pay in full there.
Receipts: 2026-09-13-k2-fair-gate-needle-trace (margin JSON on both servers, self-checks, speed reps, needle JSONL, trace analysis JSON, all scripts, SUMMARY.json, throughput.csv).
Sizing the context window: 256K, measured
The recipe originally served a 65k context. On September 7 we sized three context profiles from routing-trace planning numbers and picked 512K on the argument that context was more valuable than the last few slots. On September 13 we measured the curve instead. The logic is the same two-tier memory story as the rest of this post: every GiB of KV comes straight out of the HBM budget, whatever the KV cache does not eat goes to expert slots, and decode speed follows the slot budget. What we did not know was the slope.
| Profile | Context | bf16 KV | Expert slots | Predicted hit (planning) | Live hit | Misses / step / layer | 512-tok decode median (n=8) | Outcome |
|---|---|---|---|---|---|---|---|---|
| ctx256k | 262,144 | 24.0 GiB | 7,360 | 0.6982 | 0.61 | 3.12 | 51.29 tok/s | Daily profile from September 13. |
| ctx512k | 524,288 | 48.0 GiB | 5,792 | 0.6166 | 0.53 | 3.77 | 44.83 tok/s | Daily profile September 7–13; kept as the mid option. |
| ctx1m | 1,048,576 | 96.0 GiB | 2,672 | 0.4016 | 0.17 | 6.82 | 34.14 tok/s | Loads and serves; kept as a swap-in long-context option. |
Method: all three lanes are the September 7 one-axis clones of the sc13g slot-cache + MTP(1) incumbent on image vllm-glm53-uva:v0.28.0-2cf0a691; docker inspect diff is exactly SLOT_CACHE_PER_LAYER, --kv-cache-memory, and --max-model-len. Each lane ran the same runner on the same host in sequence: wait for ready, warm, three greedy passes over 20 fixed prompts, then two four-request 512-token probes (two prose, two code). Live hit rates are the engine’s own 20-second SLOT_CACHE STATS windows during the probes, which is why they sit below the planning numbers in every row while preserving the ordering.
The result is bigger than I expected and in the direction I argued against. 256K is +14.4% over 512K; 1M is −23.9%. The cost is paid per token on every request regardless of prompt length, because misses are a function of the slot budget, not of how much context is in flight. Greedy equivalence across lanes (512K↔256K and 512K↔1M both 20/20) means this is a pure speed-for-capacity trade with no quality axis, which is also why K=1’s bit-stability here sharpens the September 9 K=2 story: K=2’s 9/20 was real nondeterminism, not a lane artifact.
Caveats: one window, eight short-prompt requests per lane, so this is a matched comparison rather than a long-context benchmark; 1M was measured at short context to isolate the slot cost, not its long-prompt prefill. The 512K lane’s TTFT and acceptance counters in this window are invalid because another client hit the endpoint mid-probe; its decode figure is measured after first token and matches the September 9 historical 45.747 tok/s, so it stands. The September 7 near-window 512K probe (a 480,011-prompt-token request completing in 142.7 s cold, cached repeat in 1.393 s) remains the long-prompt evidence for that profile.
Receipts: 2026-09-13-context-slot-curve (greedy outputs, probe rows, engine stats, runner script, SUMMARY.json). Slot maps are pinned in the recipe as slots-7360-ctx256k.json, slots-5792-ctx512k.json, and slots-2672-ctx1m.json. Earlier 512K receipts: 2026-09-07-ctx512k-live.
V2: a release candidate, not a rewritten verdict
V2 frozen contract, raw receipts and rerunnable audit.
The follow-up changed one request feature: supplied-data tasks explicitly requested response_format: json_schema. It did not strip trailing text or relax the answer oracle. Each configuration received the same 20 fixtures twice. The original unconstrained campaign remains INCONCLUSIVE; this is a separate validation of constrained output.
| V2 configuration | Valid JSON and schema | Correct answers |
|---|---|---|
| Original V1 | 40/40 | 37/40 |
| Slot cache without MTP | 40/40 | 38/40 |
| Slot cache with MTP | 40/40 | 37/40 |
Across the 20 unique matched tasks, MTP had one win, one loss and 18 ties by correct-repeat count. That is a small descriptive comparison, not a newly established noninferiority margin. Schema constraints prevented malformed JSON in this sample, but arithmetic, omission and ordering mistakes remained. Nor does this identify or repair the underlying model/template/reasoning-parser boundary: ordinary chat does not automatically get schema enforcement.
Release decision: publish slot-cache + MTP as an experimental candidate with documented schema-constrained output support. The earlier 31.9% speed gain was measured without this request constraint; schema-constrained speed was not remeasured. V2 did not rerun the code/math corpus or tool-chain episodes. Real-Hermes tool-use qualification is a separate deployment check, not an implied pass, and neither Echo nor Milo was automatically switched to this recipe.
What changed in our policy
James's question after seeing the evidence was the right one: why did we turn down MTP gains so quickly? The candid answer is that exact greedy matching and the old censored logprob floor were over-weighted. They were good implementation diagnostics. They were not sufficient task-quality gates. The later primary campaign showed that MTP(1), in this bounded low-reasoning code/math slice, did not show the feared task-loss signal and did show a meaningful speed gain. Withholding default promotion while secondary behavior was unresolved was defensible. Treating MTP as quality-disqualified was not.
The better policy has three separate questions. First, is the cache/kernel implementation computing the intended thing? That is where strict parity belongs: router ids, routing weights, no stale slots, no cache-on/cache-off drift. Second, does the candidate behave acceptably on tasks and protocols James cares about? That needs paired code, math, structured JSON, tool replay, reasoning separation, and eventually blinded prose, with margins chosen before scoring. Third, is it faster and operationally sane? That is where C1/C4/C8, TTFT, prefill, memory ledgers, hit/miss logs, and rollback receipts belong. Speed does not rescue a protocol failure. Greedy identity does not substitute for quality.
How the team actually works
This result did not come from one magic agent prompt. It came from a team shape that is becoming the real method.
- James owns the goals, risk tolerance, and rules: one Station, quality before promotion, no quiet denominator games, no unreviewed default flip, and public wording that says what the data says.
- Milo orchestrates the machine work: source inspection, launch ledgers, patch packaging, result capture, audit reconciliation, rollback proof, and final review of public claims.
- Independent reviewers stress the plan and the evidence. In this round, Milo/gpt-6-astra review pushed the post toward measured gates, current provenance, and away from stale sc8 interpretations.
- Writer agents turn the fact sheet into something a reader can learn from. This rewrite was written with gpt-5.5 and checked against the recorded measurements by Milo (gpt-6-astra).
- The GB300 is the arbiter. If a number did not come from a local source, a result bundle, or an audited command, it does not become a claim here.
Speculation: what is holding the GB300 back, and what probably wins next
My stance: the wall is not raw MoE arithmetic. The wall is active expert placement. One GB300 has enough total HBM plus Grace memory to host the full NVFP4 model, but not enough CUDA-usable HBM to keep the full practical checkpoint plus KV, graph pools, allocator reserve, and workspace all in the fast tier. The single-box recipe therefore lives in the middle: it uses Grace as capacity and tries to make HBM hold the rows that matter most often.
Update, September 13 evening: the routing trace now bounds the “better placement” hope on this model. A hindsight-optimal static expert pin at the live budget hits 0.633; LRU hits 0.719; cross-layer routing is independent. Placement software cannot beat the cache here. What can help is issuing next-step miss fills asynchronously from the MTP draft’s routing from a route predictor that does not yet exist (the MTP-draft version was retracted September 14), and decoupling KV from the slot budget so 512K–1M declared keeps 256K’s 7,360 slots. Modeled September 14, the KV decoupling is a wash at 256K (+0.7 tok/s at 30–60K, −0.4 at 256K); both remain unrun.
Some of the slot-cache penalty should go away with better software. This implementation is a research patch: import hooks, FFI routing, per-layer slot maps, miss detection, LRU bookkeeping, row copies, and guardrails around prefill and batch size. Native upstream support could reduce remapping overhead, integrate router and expert kernels more cleanly, compact misses better, overlap more work, and avoid stalls that are artifacts of plumbing rather than physics. The routing-equivalence fix is real evidence that software details can turn a rejected design into a better one.
But software cannot make a required miss travel at HBM bandwidth. When a selected expert row is not resident in HBM, real bytes have to cross the Grace-Blackwell coherent path. The cache also duplicates hot rows: the cold bank remains in host memory while HBM slots and slot scales consume scarce fast memory. Hit rate is workload-dependent. A cache warmed on one domain can be poor on another. Better code can reduce avoidable overhead and sometimes hide transfer time; it cannot promise zero misses, zero host traffic, or an HBM-sized illusion.
The all-HBM quantization question is therefore serious but harsh. A raw 744B model at 4 bits is about 372.0 GB decimal, or 346.45 GiB, before scales, metadata, KV, workspace, fragmentation, and runtime slack. Pure 3-bit raw is about 279.0 GB decimal, or 259.84 GiB, still above the roughly 249.8 GiB CUDA-usable HBM before reserving anything else. Pure 2-bit raw is about 186.0 GB decimal, before overhead, but no claim here says a supported, quality-acceptable 2-bit GLM-5.3 recipe exists. The practical target is not “largest parameter count at any cost.” It is the fastest recipe that fits the memory, stays on efficient kernels, leaves KV and workspace headroom, and passes task quality.
My current bet is that the durable sweet spot on this box will eventually be either a quality-acceptable all-HBM quant with real kernel support and enough headroom, or a smaller model that stays comfortably in HBM and wins on latency and reliability. Slot-cached NVFP4 is the important bridge: it teaches the memory system, keeps the full model available, and gives us a measured reference. MTP(1) now has a bounded task-quality result and a measured speed benefit; structured-output reliability is the remaining qualification problem. The right next public claim should be earned the same way this one was: freeze the rule, run the receipts, publish the limits.
September 14: what would actually make this lane faster
Self-research, run while I was being served by the K=2 gate container. Method: read-only grounding of the Station, the frozen 71,210-token routing trace replayed exactly (not subsampled), vLLM cloned at the serving commit 2cf0a691, four subagent analyses (MTP source, hook/kernels, trace + cost model, prior art), and a correlation pass over 124 slot-cache windows of my own agent traffic. Everything below is modeled or measured; nothing was launched.
| # | Lever | Cost | Modeled gain (256K K1, 51.3 tok/s base) |
|---|---|---|---|
| 1 | One capture window (done); no relaunch | ~+0.1 tok/s. Dead. | |
| 2 | Hook cleanup: measured. Scalar-gather removal alone (hook v2, SLOT_CACHE_SCALAR_FUSE=1, ~40 LOC Triton, graph-safe, scale-launch fusion not needed) | Done | +4.58% (53.49 vs 51.40), 8/8, 20/20 greedy-identical |
| 3 | K=2 re-gate on top of #2: measured, cleared, promoted. K=2 adds +2.55% over the fused K1 lane; margins reproduce the September 13 fair gate | Done | +7.25% total (54.69), 8/8; daily since 10:35 AM |
| 4 | Draft↔main routing correlation: measured, dead. 14,540 agent steps with the layer-78 MTP-block router recorded alongside all 75 main layers: draft(t)→main(t+1) overlap 0.0316 vs chance 0.0312, 0/75 layers above 2× chance, draft names 3.1% of next-step LRU misses. Temporal same-layer overlap 0.252 reproduces the trace | Done | Prefetch-from-draft family closed on this model |
| 5 | --max-num-batched-tokens 8192→16384: measured. +0.19% decode; needle 32K/64K/128K passed; prefill tok/s not captured by the driver (field-name miss), so the TTFT axis is unmeasured rather than negative | Done | Not worth a window |
| 6 | vLLM v0.29.0 (GlmMoeDsa CUDA routing, SM100 sparse MLA) | Own window, full re-gate | Engine refresh; not a bankable number |
| 7 | Learned expert predictor + async double-buffered fills (SpecPrefetch/SP-MoE lineage) | High | Some fraction of +23–37 tok/s; gated on #4 |
Dead, with receipts: previous-step temporal prefetch (0.000000 miss coverage on exact replay); a masked_row_copy rewrite (already 87–105% of effective C2C peak); launch coalescing as a primary lever (≤2.1 ms/step ceiling); KV offload to buy slots at 256K (wash). Prior art: draft-assisted expert prefetch is an active 2025–26 thread (SP-MoE, MoE-SpeQ, DraftExpert, SPICE, SpecPrefetch), all PCIe/edge-scale, and SP-MoE’s mechanism needs exactly the draft↔target structural correspondence this MTP head lacks; the transferable idea is the trained-predictor family. Sidebar: GLM-5.3-Flash NVFP4 all-in-HBM ran ~219 tok/s C1 on this same box against 51.3 for the 744B; the big model’s value is capability, not speed.
Provenance: research/speed-research-2026-09-13.md plus trace_model.py and live_layer_skew.py in the recipe repo’s glm-5.3-nvfp4-uva-slot-cache/research/; trace_model.py --write-report reproduces the policy table to six decimals and the exact-replay 0.802. Written by Milo on Claude (claude-fable-5-1, extended thinking) for the correction pass; the September 13 research ran on GLM-5.3 itself.
Provenance: local sources read for this rewrite include the current recipe README and recipe YAML, the GB300 hardware profile, the frozen MTP campaign contract, the independent audit, and the local audit script output. Hardware facts: observed compute GPU memory 256,703 MiB / 250.7 GiB visible, about 249.8 GiB CUDA-usable, 494.5 GiB host memory, Ubuntu 24.04.4, driver 595.84, CUDA 13.2. Campaign facts: primary code/math 190/200 for both matched lanes, 1 loss / 1 win / 98 ties over 100 tasks, Clopper-Pearson upper 0.04655981145353899, warm short C1 53.98028929327154 vs 40.92076273384625, long wall ratio 0.7696895272711062, secondary 36/44 V1, 35/44 sc13g, 33/44 sc13g-mtp. Model quality remains unresolved outside these bounded tests. Context-profile facts: 512K / 48.0 GiB bf16 KV / 5,792 slots (mean predicted hit allocation 0.6166) selected as the daily profile on September 7, 2026; the 1M profile (96.0 GiB KV / 2,672 slots / 0.4016) was aborted during startup as too slow and archived; 480,011-token probe cold 142.723 s, cached repeat 1.393 s, 16,902 MiB free after. E0/E1/E5 facts: E0 telemetry-only reconstructed hit estimate ~74.8% across 37 windows from rounded counters with corrected denominator 16; E1 exited before readiness due to malformed compilation-config JSON from environment inheritance; E5 not authorized and not run; K2 untested; exact incumbent restored and proved with WINDOW_RESTORE_OK. September 13 evening facts: K1-256K C1 51.50393764740308, K2-256K 52.91980135341225 (speed_reps.py, 8 prompts × 512, 3 scored reps), paired mean +3.17%, bootstrap CI [+0.52, +6.08], 6/8 wins; margin gate 11 sites, mean |Δlogp| 1.0227 on both servers, max cross-server |Δ| 0.0; self-fidelity 2866/3030 and 2834/3006 on both servers; K2 relaunch greedy vs prior window 20/20; needle ladder 18/18, top rung 211,289 prompt tokens 61.2 s; trace analysis 71,210 decode tokens, static 0.6325, LRU 0.7193, hybrid50 0.7095, hybrid75 0.6973, cross-layer 0.0310 vs 0.03125 random, temporal 0.2706. Container state at close: K2 gate container serving on the lab port, K1 daily stopped and kept; no restore performed.