Measured 2026-08-27/28 on cluster ds4 (dgx3+dgx4, switched fabric), all three
served by sm121 through the launcher, same benchmark invocation:
tool-eval-bench run --base-url http://<head>:30000/v1 --model glm53 \
--seed 42 --hardmode --perf --concurrency 1,2 \
--json-file <abs repo path>/recipes/<lane>/reports/<UTC-stamp>_<label>.json
Keep BOTH the rich .md report (copied from the tool's runs/ output dir)
and the raw JSON (--json-file; absolute path — the bench runs in a separate
cwd, and the flag keeps stdout clean for the .log) in
recipes/<lane>/reports/ under the same base name.
Tool version pin (2026-09-05, verified against the installed tool):
tool-eval-bench 2.6.1.dev45+gcf54b4bfe (uv tool; git
SeraphimSerapis/tool-eval-bench @ cf54b4bfe). Current pool semantics:
--hardmode = 69 standard (A–O) + 19 Hard Mode (P) = 88 scenarios
(≈26 min, dry-run verified); --hardmode-only = 19 (≈6 min). The /176
scores above (155/176 anchor, lab ref 156/176) are pinned to the OLDER
176-point pool — scores do NOT transfer across tool versions. Every
campaign now re-baselines the anchor lane with the CURRENT tool first
(night queue 1a), then gates new lanes against that new baseline.
All three share served name glm53 — clients never changed between runs.
| recipe | quant | quality | points | decode tg t/s (c1) | tg c2 | TTFT | deployability | MTP |
|---|---|---|---|---|---|---|---|---|
glm53-flash-nvfp4-lab |
local-inference-lab mixed NVFP4/MXFP8-MTP | 92 (eager) / 89 (graphs) | 162/176 | 28.4 | 40.5 | 5.6 s | 72 | ✅ k=3, accept len ~2.9–3.5, ~63–83 % |
glm53-flash-nvfp4-redhat |
RedHatAI W4A4 compressed-tensors | 90 | 159/176 | 13.9 | 13.8 | 2.2 s | 67 | ❌ (no MTP weights in checkpoint) |
glm53-flash-nvfp4 |
LibertAIDAI NVFP4-A16 | 88 | 154/176 | 26.2 | 22.7 | 6.3 s | 69 | ✅ k=5 |
glm53-flash-nvfp4-4p67 |
4p67 W4A16-experts + MXFP8-attn, eager, MTP k=3 | 87 | 153/176 | 24.4 | 39.2 | 1.4 s | 67 | ✅ accept ~90% |
glm53-flash-aiden-4x |
aiden image production-1.1 (DFlash2 overlay), NVFP4, incoai DFlash2 k=7, eager, 16 GiB KV pin, 4× Spark TP4 (his production shape) | 89 | 156/176 | 37.6 (d0 c1; flat to d8192, 2,185 pp t/s — matches his ~2,100) | 50.7 (c2) / 63.5 (c4) | 0.9 s | 80 | ✅ DFlash2 k=7 |
glm53-flash-aiden-2x |
aiden image production-1.1 (DFlash2 overlay), NVFP4, incoai DFlash2 k=7, eager, 4 GiB KV pin (2x profile) | 89 | 157/176 | 22.3 (d0 c1; d8192 c4 degrades — 4 GiB pin) | — | — | 66 | ✅ DFlash2 k=7 (drafter block 8−1) |
glm53-flash-sparkrun |
community sparkrun image (aidendle94), NVFP4, eager, NO MTP (image lacks the fix) | 89 | 154/176 | 14.3 | 23.8 | 1.4 s | 66 | ❌ (n/a in image) |
glm53-flash-exl3 |
brandonmusic EXL3/TR3 4bpw (Entrpi image + instanttensor), DFlash2-7, graphs | 88 | 155/176 | 23.1 | 24.1 | 2.6 s d0 | 77 | ✅ accept 48–81 % |
(lab scored /174 — TC-53 was excluded from its run as an infrastructure failure (one trial crossed the 120 s request timeout; the scenario runs ~140 s total — harness drops timed-out scenarios from the denominator; had it scored like redhat's 2/2, lab would be 157/176 = 89 — no change). Quality % is comparable. LibertAIDAI is the only variant whose MTP regresses under c2 (26.2→22.7) — lab's k=3 draft scales, LibertAIDAI's k=5 does not.
4x note (2026-09-04): the 4x aiden run had one safety-critical failure —
TC-43 called web_search with an empty query (required-parameter violation);
not seen in the 2x aiden run.)
Prefill (pp2048) 0.3–1.7 K t/s depending on depth/concurrency — noisy, all three in the same band (NAS load-influenced); decode is the stable discriminator.
| image dir | base | patches |
|---|---|---|
glm53-flash-nvfp4 |
vllm/vllm-openai:glm53-flash-arm64-cu130 | kingjones30 NoPE-MLA mod (4-part, anchor-asserted) |
glm53-flash-nvfp4-lab |
same | + 4 FujitsuPolycom patches (Apache-2.0, see patches/UPSTREAM.md): model.py naming shim, modelopt MTP namespace fix, persistent_topk CC-12.x guards ×2 |
redhat recipe reuses glm53-flash-nvfp4:local (mod is quant-independent) |
Boot markers [quantprobe] layer=RoutedExperts prefix=model.layers.45.mlp.experts
algo=MXFP8 confirm the MTP fix is live; algo=None there = broken load.
0rand: “mtp or dflash plus cuda graphs seriously hit quality — try
disabling cuda graph capture”. A/B with identical seed/flags on lab:
| arm | quality | points | tg c1 | tg c2 | TTFT |
|---|---|---|---|---|---|
| graphs (CUDA graphs ON) | 89 | 155/174 | 28.4 | 43.4 | 3.9 s |
--enforce-eager |
92 | 162/176 | 28.4 | 40.5 | 5.6 s |
+3 quality points for −7 % c2 decode — eager is now the lab default. Accept metrics were healthy in BOTH arms (71.6 %, len 3.15 eager), so this is not an acceptance collapse — graph capture corrupts sampled output silently. Corroborating: randomllama (DFlash2 recipe) already flagged “not claiming bit-identical greedy outputs” with graphs on. The b12x glm52 stack runs graphs + MTP k=4 FULL_AND_PIECEWISE benches clean (100/100) — build-specific bug in the glm53 day-0 dev build, do NOT propagate --enforce-eager to glm52. Untested follow-ups: LibertAIDAI + eager (k=5; expect ~88→9x), redhat is graph-neutral (no MTP, stays 90 with graphs).
262144 booted on the base image; 512K needed three changes (each verified by a real boot that died without it):
--kernel-config {"enable_flashinfer_autotune":false,"enable_cutedsl_warmup":false}
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True — autotune scratch at
512K shapes OOMs the driver (NVRM NV_ERR_NO_MEMORY _memdescAllocInternal);
the sparse-MLA kernels' non-autotuned fallback is fine (lab proved it).--max-num-batched-tokens 4096 + --block-size 256 (lab's memory shape).launch_persistent_topk ... total_ctas=62
> num_sms*occupancy=48 ... fallback requires >=128KB smem (have 101376),
i.e. exactly what the FujitsuPolycom sparse_attn_indexer(_kpool) CC-12.0
guards fix. Indexer CTAs scale with ctx: 262K fit 48 SMs, 512K needs 62.
The patches are arch-level → safe for the compressed-tensors checkpoint
(quantprobe is a no-op without modelopt; output verified correct).Result: KV pool 1,334,265 tokens / 2.54× @ 524288 (10 GiB pin; lab gets 1,164,369 from the same pin — its MTP speculator reserves memory before KV sizing), ~17 min clean boot, correct greedy output.
Note: an orphaned rank-1 headless worker survives rank-0 death and keeps
the node occupied — always docker rm -f label-filtered leftovers before a
retry serve (or the launcher refuses with "only 1 nodes").
--kv-cache-memory-bytes 10737418240 → KV 1,164,369 tokens / 2.22× @ 512K
(matches upstream to the digit — do NOT switch back to GMU sizing).--rm); re-run was clean twice. Suspected transient (cold imports +
simultaneous launch). If it recurs: re-launch without --rm and keep logs.sm121 serve immediately after sm121 stop can fail with "cluster has only
1 nodes" — occupancy race, nodes not yet released; wait ~10 s and retry.VLLM_ENGINE_READY_TIMEOUT_S=3600 set); the lab recipe disables it via
--kernel-config per upstream's proven boot.reasoning_effort:"low" still emits a reasoning trace
(budget ≠ 0); max_tokens:48 can yield content: null, finish: length —
use ≥256 for smoke tests.eugr B12X variant recipe glm53-flash-nvfp4-eugr (2026-09-05): port of
eugr/spark-vllm-docker @ 94b3c30 recipes/glm-5.3-flash.yaml on
eugr/spark-vllm-b12x:nightly-20260904 (their dev/jovian-judgement 09-04 tip
Vendor instanttensor loader into the lab image (~30 s vs 700 s weight load).
Consider adding --kernel-config autotune-off to the LibertAIDAI recipe
(boot minutes shorter; redhat now has it, see 512K section — verify before
trusting on LibertAIDAI).
MTP for redhat: RESOLVED (2026-09-05) — no variant repo needed: the main
RedHatAI/GLM-5.3-Flash-NVFP4 repo gained model_mtp.safetensors (7.6 GB)
and the card an "Enable Speculative Decoding" section (k=5, plain
--speculative-config {"method":"mtp",...} — same model path, no swap).
Recipe glm53-flash-nvfp4-redhat updated to MTP k=5 (watch the +7.6 GB/node
memory cost vs the 10 GiB KV pin; k=3 fallback). The lab's 5.2 pattern
(-mtp-FP8 variant repos) did not apply; the cross-graft MXFP8-MTP idea is
moot.
Same recipe both arms (MTP k=3 included), only --enforce-eager removed;
graphs arm verified to capture (FULL 5/5 + PIECEWISE 11/11), KV identical
(1,164,369 tok pinned).
| metric | eager | graphs |
|---|---|---|
| quality | 87 (153/176) | 88 (154/176) |
| deployability | 67 | 68 |
| tg t/s c1 (d0/d4096/d8192) | 21.1 / 23.2 / 24.4 | 23.6 / 22.6 / 22.9 |
| tg t/s c2 (d0/d4096) | 39.2 / 22.9 | 33.1 / 24.0 |
| TTFT (d0 / d8192) | 1.45 s / 6.17 s | 1.41 s / 6.10 s |
| MTP draft accept | 90.0–92.2 % | 89.0–97.0 % |
Findings:
--enforce-eager stays in glm53-flash-nvfp4-4p67 — it is
measurably free here and stays immune to the lab graph bug class.Reports: /tmp/runs/2026/08/2026-08-29T09-09-14…--(eager),
…10-27-35.818420Z_181bbd18.md (graphs).
aidendle94/sparkrun-vllm-glm53-gb10:production-1.0 (same day-0 vLLM dev base as our lab image, arm64-only) serving the same lab quant: quality 89 (154/176) but decode tg 14.3/23.8 t/s (c1/c2) vs lab-eager 24.4/39.2 and responsiveness 12/100 (median turn 11.7 s) — works, not performant:
ghcr.io/entrpi/glm-5.3-flash-exl3-2x-spark:v1-dflash2 + brandonmusic
GLM-5.3-Flash-tr3-4bpw (164 GiB) + DFlash2 drafter. VERIFIED SERVING
2026-08-30 evening: the loader-side OOM chain (--load-format instanttensor
overlay) resolved — stock loader balloons ~80 GiB CPU-anon streaming the
checkpoint; instanttensor streams ~175 MB/s with tiny buffers. ~22.8 tok/s
with DFlash2 k=7 (accept 48-81% by content); math smoke exact. DFlash2
drafter switched to the upstream incoai/GLM-5.3-Flash-DFlash2 (downloaded
to NAS at operator request); MTP3-language-only + v84 image lanes remain
SM120-only upstream. Fixed in-recipe: NGC
entrypoint (needs explicit vllm serve), drafter swap to the MXFP8
mirror (incoai raw drafter absent from the NAS hub), GMU 0.86. BLOCKED:
global OOM kills the worker at 75-95% of shard load on BOTH streamed-from-
NAS nodes (repro 2×; dmesg oom-killer 12:22:25 / 13:12:24). Upstream's
"validated NFS topology" does not hold on our fabric — the mirror
topology (per-node local NVMe) is the next step; dgx4 is 98% full
(candidate cleanup targets ~1.3T of re-downloadable zai BF16 repos
there) — awaiting operator call.
glm53-flash-exl3 (brandonmusic GLM-5.3-Flash-tr3-4bpw 4bpw, Entrpi
v1-dflash2 image + instanttensor overlay) — quality 88 (155/176, the
failure set is the usual 16 shuffled partials/fails; nothing new flags),
decode tg 23.1/24.1 t/s (DFlash2 k=7 drafting keeps C1≈C2 — the flattest
concurrency profile of any glm53 lane), TTFT 2.6 s @d0, pp ~817-1,004
(noisy, NAS-adjacent). The headline: deployability 77/100 — the best of
the four lanes (lab 72, 4p67 67, sparkrun 66), driven by responsiveness
50/100 with a 3.0 s median turn. Quality still trails lab-eager-with-MTP3
(92) by ~4 points — the 4bpw price. Report:
/tmp/runs/2026/08/2026-08-30T17-43-04.770487Z_63900bf7.md.
Forum 381350 #117/#119 report 93/100 (164/176) for the lab quant with
GMU 0.89, MNBT 2048, KV auto-sized (1.05M pool), MTP-3. Reproduced on
ds4 as glm53-flash-nvfp4-lab-0rand (variant in tree): KV auto-size
lands at 1,167,586 tokens — same capacity as our pinned 10 GiB, so the
pin is unnecessary; smoke exact. Bench (--seed 42 --hardmode --perf
--concurrency 1,2,4): quality 90 (158/176), tg 27.1/34.6/37.2 c1/c2/c4,
TTFT d0 1.3 s, responsiveness 25 (6.2 s median), deployability 70.
vs our lab baseline (92 = 162/176; c1 28.4 / c2 40.5; resp 21, deploy 72):
quality −2, c2 decode −15%, c1 ≈, but c4 decode 37.2 in an arm the
baseline never ran, and responsiveness +4. On OUR stack the 0rand combo
is not a strict win; keep the baseline as the daily driver, keep the
variant in tree for concurrency-hungry serving. Possible confounder:
their run posts a single 14.8 s median turn at responsiveness 8 — an
earlier bench build. Report:
/tmp/runs/2026/08/2026-08-30T19-33-22.444571Z_4616f476.md.
Forum #124 ("1024 = quality-first") asserted. Our c1,2,4 run with MNBT 1024 + seqs 16 + GMU 0.89 + auto-KV (pool 1,051,792): quality 88, denominator 146 (harness dropped ~30 pts of scenarios), tg 27.6/27.0/30.4, TTFT d0 8.6 s, resp 24 (6.4 s). vs the same-protocol MNBT-2048 run one hour earlier: quality 90 (158/176, full denominator), tg 27.1/34.6/37.2, resp 25 (6.2 s). Verdict: at our protocol (reasoning_effort-low, temp 0, seed 42) 2048 wins on both quality percentage and decode; the 1024 advantage was measured under their thinking-max + temp-0.1 + trials-2 protocol. 0rand's #123 already noted "2048 batch + MTP4 ... loses quality (89 vs 93)" for THEIR protocol — different regime, same lesson: batch tuning is protocol-dependent. Variant stays in tree; record both. Reports: 2048 = ...19-33-22Z_4616f476.md, 1024 = ...22-04-48Z_4a70e6be.md.
Day-0 port landed (sfxnz plugin 7a958128b8">@7a958128b8 vendored under
docker-images/dsv4-flash-vision/, bases digest-pinned; sm121 build works,
35-40 min roundtrip). Lane verified TEXT-serving on ds4 (+NVMe/NAS weights):
register (raw.githubusercontent flaked on re-fetch — fixed via
the contents API); wrapper class needs supports_multimodal = True
(OpenAI layer refuses image_url otherwise — interfaces.supports_multimodal
is a getattr check).Built the full OpenAI multimodal stack in our plugin (processor trio, grid/sentinel tokens, embed_multimodal + embed_input_ids merge; verified in -image: embedding rows byte-exact vs aligner(ViT(patches))[perm]) and got the engine through profiling+warmup with mm registered. Two hard walls remain (before the first image_url token):
input_batch.input_ids[:n] —
a wrong-rank slice that arrives as [B, T]-shaped 2-D ids (observed
(17,17) for a 17-token prompt, (7,7) on DSpark-6 verify steps) — and
downstream logits degenerate (all-<|begin▁of▁sentence|>).State: the whole mm branch is env-gated (VLLM_DSV4_MM=1), default OFF =
the verified text-only lane — restored EXACT on the new per-node NVMe
weights (~/dsv4vision-hf on dgx3+dgx4, 167 GiB each, recipe HF_HOME flipped
from the NAS hub; shard load 7 min → <1 min, boot ~6 min end-to-end).
Bridges done tonight for the next attempt: encoder-runner + speculator
buffer shape-follow patches (patch_mm_hc_streams.py), placeholder
`<|deepseek_image|>= in-vocab id 129264,get_placeholder_str` chat
integration, AOT=0 knob for mm experiments. nid: fork A/B (aiden base)
still pending its pip-layout patch; dspark_gate patch now auto-finds the
fork's venv root.
tool-eval-bench run --base-url http://dgx3.lan:30000/v1 --model deepseek-v4-flash-vision --seed 42 --hardmode --perf --concurrency 1 → report /private/tmp/runs/2026/09/2026-09-01T17-46-28.764372Z_89b18250.md:
| recipe | quality | points | decode tg t/s c1 (d0/d4096/d8192) | pp2048 t/s | TTFT | deployability |
|---|---|---|---|---|---|---|
dsv4-flash-vision (text lane, local-NVMe, DSpark-6) |
81 | 143/176 | — | — | — | — |
perf block: tg 34.1 / 31.0 / 29.1, pp2048 3,907 / 2,714 / 2,449, TTFT 1.9-4.9 s (spec), scenario-median turn 2.4 s, deployability 74 (best of any ds4 lane) — long-context capability is the raw 1M-context draw. 3 safety-critical failures (TC-42 extra-param, TC-43 empty required param, TC-60 sleeper injection) — the day-0 0731-style tool formatting is the gap vs the GLM lanes (thinking-pair JSON fencing was already a known day-0 weakness). Quality 81 < sparkrun 89 < lab 92.
Checkpoints on the NAS hub (hf download'd):
Intel/GLM-5.3-Flash-W4A16-AutoRound rev 5eee1846f0 —
AutoRound 0.15 W4A16 sym int4 g168, 99.84% of BF16 (GSM8K .9712/MMLU .8620),
selfattn/hc/indexer/embed lm_head FP16 by design (their ignore_layers),
pure GPTQ packing (qweight/qzeros/scales — qweight count 37152).local-inference-lab/GLM-5.3-Flash-NVFP4-Spark rev 06972cdee7 —
NVFP4 W4A4 whole network (in_proj_qkvbfg_a.weight_scale etc.) + NVFP4 MTP
expert layer in separate model-mtp-0000x shards (lil.yaml: mtp_tokens 5,
dflash2_tokens 7, default_speculator mtp, block 256, disable flashinfer
autotune, INSTANTTENSOR env sizes; arch Glm5NextForConditionalGeneration +
vision blocks in the index). This is the rtx6kpro r12-stack checkpoint
(their doc: MTP:3 254 tok/s CC1 @ TP4, Sieve 333-403).Recipes added: recipes/glm53-flash-intel-w4a16 (timothystewart6/vllm-gb10
v0.28.0-gb10.2 arm64, gptq_marlin, entrypoint declared — tini AssertionError
taught us the image has ENTRYPOINT []+CMD bash), recipes/glm53-flash-nvfp4-spark
(lab image). Boot outcomes:
in_proj_qkvbfg_a.weight_scale at
80% shard load — whole-network NVFP4 W4A4 is beyond the R8-era lab fork
loader (r12 stack territory).⇒ THE unifying next step (user directive): build our own arm64/sm_121a image of local-inference-lab's fork — source contract from models/glm-5.3-flash.md (local-inference-lab/vllm dev/jovian-judgement + b12x master + 6/5 PRs; kk3 build rules apply: CUDA 13.0.88, sm_121f gencode rule for block-scaled FP4). RTX docs archive: /tmp/lil-docs (ds4-flash-v6, ds4dspark-v20-r33, infernal r21, pcie-autotune) for the DeepSeek quality track.
Built glm53-jovian-r12:local in-docker on dgx3 (docker-images/glm53-jovian-r12/):
vllm 0.1.dev20489+gcc161e220 (local-inference-lab/vllm base 54f6e9826c + PR heads
550/552/553/554/555/557 merged in order — the doc's "composition commit" 7d8a09c is
not a public ref) + b12x 1.3.0 (master 139e0405 + PR heads 260-270), on the day-0
vllm/vllm-openai:glm53-flash-arm64-cu130@905c02… base. Build fixes applied along
the way: apt git, setuptools-rust, ninja/cmake, cu13 wheel include-header symlinks
(cusparse.h), unversioned libnvrtc.so symlink for the deepgemm_C link step.
NVFP4-Spark boot on it (recipe glm53-flash-nvfp4-spark, retargeted):
--attention-backend B12X (model hook in
glm5next/nvidia/attention.py: _select_sparse_backend) for the main model, and
"attention_backend":"B12X" INSIDE --speculative-config for the MTP draft
(eagle/utils.py: _make_eagle_draft_vllm_config takes the draft's backend from
the speculative config, not the global flag — user's hint).a5b6256e…, solar-pinned) → apt stage (solar locks) → torch 2.13.0 cu130 +
flashinfer 0.6.17 (whl index) → vllm wheel (fork base 54f6e9826c + PR-head
merges 550-557, use_existing_torch, ccache) → b12x wheel (master + PR heads
260-270, pure-python) → runner installs both wheels + deps, bakes
patch_cuda_sm12x.py, GB10 gate (vllm/b12x/_flashkda_C imports, B12X enum,
patch presence). No day-0 vllm contamination; ENTRYPOINT [] CMD bash.
Build running on dgx3 (tmux r12build → /tmp/r12build2.log), same tag
glm53-jovian-r12:local (running serve keeps the old image; re-verify lane
after build).local-inference-lab/lil = standalone Go launcher (their sm121 equivalent):
reads each HF model repo's lil.yaml at runtime + embedded family policy +
discovered topology (local or spark-rdma via SSH), renders/validates/runs a
typed vLLM invocation. lil render <model> prints the exact env + command.
GLM family policy (configs/models/_bases.yaml) — the lab's canonical launch for these checkpoints, vs our spark recipe today:
TODO: after the clean image lands, align the spark recipe to the lil policy (moe/linear backend b12x, spec moe_backend, instanttensor, mamba-cache-mode, parsers) and A/B k=3 vs k=5.
Image glm53-jovian-r12:local rebuilt from raw nvidia/cuda:13.2.0-devel (solar pattern, r12-specific content): 16.1 GB (vs 37.6 GB day-0-based), gates green (vllm 0.1.dev20489+g06f922207, b12x, _flashkda_C, B12X enum, sm121 patch), synced dgx3→dgx4. Boot fixes found on first clean boot:
Remaining lab-alignment (next boot, one change-set at a time): --linear-backend b12x + --moe-backend b12x, spec moe_backend:b12x, A/B k=3 vs k=5 (lil default), --load-format instanttensor (+env), --mamba-cache-mode align, --max-num-seqs 8, --max-num-batched-tokens 4096, --reasoning-parser glm45, --tool-call-parser glm47. Then: Intel W4A16 boot on the clean image (queued, needs cluster).
Goal (user): 30 tok/s in --perf. Found the missing pieces:
cb58d54,
rendered with testdata manifest GLM-5.3-Flash-NVFP4-Spark + spark.yaml):
our recipe flags now 100% match the family policy (_bases.yaml glm: b12x
linear/moe, B12X attention, instanttensor, block 256, seqs 8, batched 4096,
glm45/glm47, mamba align) + spec {mtp:5, moe_backend b12x, B12X} + env
VLLM_USE_AOT_COMPILE=1 / V2_MODEL_RUNNER=1 / FLASHINFER_SAMPLER=1 /
BREAKABLE_CUDAGRAPH=0. Boot 35m -> ~7m (instanttensor loader, user: keep).
Perf after engine switch: d0 c1 24.2 / c4 31.8 tok/s (was 10.3/16.5).
Quality dropped with full lil set (16/22 at TC-22) -> bisection in
progress; user: instanttensor is fine, problem elsewhere.e74319e, tml-fa4@b206834, cutlass@v4.4.2) +
the SRC_DIR env escapes each cmake documents. Build 14 compiling.Latest lab card: https://github.com/local-inference-lab/rtx6kpro/blob/master/models/glm-5.3-flash.md (names the qualified serving contract per artifact and SHA; TP4 on RTX PRO, not Spark — the Spark lil.yaml testdata render remains our TP2 adapter).
Public r17 composition built from source:
/tmp/vllmr12 = local-inference-lab/vllm dev/jovian-judgement@9c4dd054
/tmp/b12xb17 = local-inference-lab/b12x master@2bbab479 + PRs
290/284. Pre-staged as vllm-src.tar.gz / b12x-src.tar.gz on the build
node (WAF blocks node→github git). DO NOT re-merge 550-557: creates
conflict-marker SyntaxErrors (pr550's pooled_indexer.py conflicts; branch
tip already contains the evolved implementation).Important correction to the 2026-08-28 eager verdict: on the public
r12/r17 refs, graphs+MTP is no longer a quality bug — the lab's private
"packed GLM-5.3 package" (card SHAs 47f86087/a02841bc, not public) was the
presumed fix carrier, but our public-tree composition measured:
Execution-env knobs are quality-clean: GMU 0.90 (0.95 boot-deaths on GB10 — "free memory 111.96 < desired"), max-num-seqs 16, OMP 2, VLLM_USE_STANDALONE_COMPILE/FLASHINFER_SAMPLER/BREAKABLE envs: 87/100 (r17knobsonly). AOT=1+V2 runner: NEUTRAL for quality (47 either way when backends were on) and NEUTRAL for the d0 grid — dropped (AOT=0, no V2).
THE QUALITY TOXIN = the b12x backend-flag cluster (on the PUBLIC r17/r12 compositions, with our b12x 1.3.0/1.2.6 builds):
SHIP ANCHOR (current recipe) = r17 image (94ac0882a8) + 90/100
args (attention B12X, block 256, seqs 16, batched 4096, LM-only,
glm47/glm45 parsers, instanttensor load, k=3 spec {mtp,attn B12X} with
moe_backend key) + graphs (no eager) + knobs env (GMU 0.90, seqs 16,
OMP 2, AOT=0, STANDALONE=1, SAMPLER=1, BREAKABLE=0) + JIT-cache mounts:
87/100 hardmode (153/176; lab-quant ref 156/176), default-suite 88
class; perf d0 c1 24.1 / c2 30.2 / c4 44.7; d4096 c1 23.9; d8192 c1
23.8; pp ~1.6-1.8k. Boot 8 min (JIT warm) / ~25 min cold (nvcc re-JIT).
Boot-time JIT: changing the rw flashinfer cache invalidates per-config kernel sets; a config's first boot silently nvcc-compiles (MAX_JOBS=2) ~15-25 min inside "No available shared memory" log-silence; later boots of the same config are fast. Expect this on every NEW kernel path.
KV-dtype probes: fp8_ds_mla on r12-img = 75/100 default-suite (net zero, TC-45 flipped PASS but others flipped off); graphs here. r17 anchor keeps default dtype. Not a quality lever.
Open perf gap: c1 24 vs manifest-cluster 33-34 (which is quality-dead). If the lab ever publishes the packed package (or a public branch commit makes b12x-backends clean), the 30+ c1 target lands with manifest flags. Alternative to probe later: one b12x backend flag at a time (a single toxin member may be free).
94ac0882, k=3 graphs)--moe-backend b12x (spec default MTP experts): 88 (154/176); d0 23.5,
d4096 22.5, d8192 26.6 (r17moeonly) — quality-clean, keep--linear-backend b12x: 44 (77/176), Parameter Precision 0%, TC-21
0/5 validations — THE toxin. B12X linear kernel path destroys numerics on
the public composition (r17linearon)--mamba-cache-mode align: 88 (154/176) but d0 c1 18.6 (−4.9), no quality
gain (r17alignon) — perf-negative, dropped--moe-backend b12x
only (recipe @ 2d379f9): 88/100, d0 23.5 / c4 43.9, depth 22.5/26.6.
The 30 c1 target is only reachable with linear-b12x (29.6 d0) which is
quality-dead until the lab publishes the packed GLM-5.3 package.User-flagged must-have: our lane served the Spark-variant checkpoint with quality losses vs lab references; A/B the checkpoint under matched stacks.
| Cell | Stack | Checkpoint | Hardmode | d0 c1 | d4096 c1 | d8192 c1 | notes |
|---|---|---|---|---|---|---|---|
| r17ablabimg | lab img + lab recipe (eager, fp8_ds_mla, k3, default MoE, day-0 fork 0.1.dev20051+g487ecf187) | NVFP4 | 93 (164/176) ★★★★★ | 24.4 | 26.5 | 22.8 | 78 pass / 2 fail; TC-45 PASS; matches lab's own 92 ref |
| r17ablabck | shipped r17 img + ship flags (graphs, knobs, k3, default MoE — moe-b12x unsupported on this ckpt: layer-45 is MXFP8) | NVFP4 | 88 (154/176) | 27.5 | 29.6 | 26.6 | 46.4/46.7 c2/c4 at d0 |
| r17moeonly (ship) | shipped r17 img | Spark | 88 (154/176) | 23.5 | 22.5 | 26.6 | — |
Verdict:
glm53-flash-nvfp4-r17abi (ship flags + NVFP4, moe flag removed)
is the fastest quality-parity lane; glm53-flash-nvfp4-lab remains the
quality champion (93).Prepared lanes + builds queued for the night (cluster is serving the 4x aiden lane during the day — stop it first, then all 4 nodes are free). Order = value/duration; each item lists prereqs + expected verdict.
a8c796f3+pr582+pr646 → 343661fe; b12x b58f34ea+pr284 → 1adb8a38),
then
TAG=glm53-jovian-r12:local bash build.sh. Test campaign:
(a) Re-baseline the quality anchor first — DONE 2026-09-06: ran
glm53-flash-nvfp4-r17abi (2x, r17 image) on 2nodes-dac with the current
tool: NEW BASELINE = 153/176 (87/100, deployability 69) — report in
recipes/glm53-flash-nvfp4-r17abi/reports/2026-09-06_r18-rebaseline-r17abi-2x.md
(2 pts below the historical 155/176 anchor: DAC fabric + NAS weights;
scoring confirmed current-tool-compatible: 88 scenarios × 2 pts = 176).
Gate ALL new lanes against 153/176 (≥151 = parity, <151 = regression);
(b) **re-bisect `--linear-backend b12x`** — new b12x A16 precision
selection may clear the 44/100 toxin (29.6 c1 unlock if clean),
(c) RoCE one-shot on the 4x lane (VLLM_ENABLE_ROCE_ALLREDUCE=1;
expect −5–19% decode per-step per their #597 numbers),
(d) `--kv-cache-dtype nvfp4_ds_mla` probe (new B12X KV path),
(e) #646 geometry check: 2048/256/256 split blocks selected +
repeat-request prefix resume at the fine boundary (their regression
scenario: retention 0, states 32/16, resume at 32) — if broken, drop
the 646 pin from versions.env and re-cut (rest of r18 is independent).
1b. **DCP4 probe** (4x lane, no build dependency — run on the current
r17abi image first, re-run on r18 if positive). Add
`--decode-context-parallel-size 4` (stock vLLM flag, verified in the
r18 tree: vllm/config/parallel.py; DCP>1 requires MLA — GLM53
qualifies). Reference (sparkring MTP3 mesh profile, 4 Sparks, DCP4 +
24 GiB fp8 KV/rank): ~4.32M logical KV tokens (vs our ~1.25M at
12 GiB DCP1), 231.3 aggregate decode tok/s peak, prefill ~2.7k flat
8K→128K. Verdict: KV-token capacity per node at our pin, decode
C1/C8/C16 vs baseline, prefill 8K/64K. Their fabric is a direct
HW-forwarded mesh (cheaper all-reduce than our switch) — measure, do
not extrapolate.huggingface-cli download
RedHatAI/GLM-5.3-Flash-NVFP4 on both nodes (model_mtp.safetensors
7.6 GB is new since the initial pulls; HF_HUB_OFFLINE=1). Serve
glm53-flash-nvfp4-redhat (MTP k=5 per vendor card) → compare vs the
90/100 no-MTP baseline + decode speed; memory watch +7.6 GB/node
(KV pin 10→8 GiB if boot dies; k=3 fallback).huggingface-cli download
local-inference-lab/GLM-5.3-Flash-NVFP4-Spark on both nodes. Serve
glm53-flash-nvfp4-eugr → A/B vs r18: full b12x cluster quality
(linear-b12x toxin retest on their stack) + RoCE 2x decode numbers.
4-node cell: glm53-flash-nvfp4-eugr-4x (needs all 4 nodes free) vs
the 2x lane — 2x stays the production default unless 4x is dramatic.
3b. DFlash2 spec A/B (same eugr image, after 3 boots). Swap the
spec to "method":"dflash","model":"incoai/GLM-5.3-Flash-DFlash2",
"num_speculative_tokens":7,"draft_tensor_parallel_size":2,
"kv_cache_dtype":"auto" (separate drafter repo — huggingface-cli
download on both nodes first; exists on HF, single safetensors). VS
the recipe's MTP k=5: decode at C1/C4 + quality spot-check (forum
numbers are perf-only: ~60 c1 / ~73 c4 tok/s on 4x — their 4x/TP4
config, so 2x numbers will differ).Re-baseline (queue 1a): r17abi 2x/2nodes-dac = 153/176 (87/100, dep 69)
with tool-eval-bench 2.6.1.dev45+gcf54b4bfe (88 scenarios). This is the new
canonical anchor — all lanes below gate against it.
Report: recipes/glm53-flash-nvfp4-r17abi/reports/.
r18 build (5 attempts on dgx4, log r18build*.log): three root causes —
(1) transient snapshot.ubuntu.com 503s; (2) patch_vllm_spark_kv_cache_cleanup.py
anchor gone (upstream replaced the profiling flow with
MemorySnapshot/request_memory which already cleans before the snapshot —
patch now detects the new flow and exits 0); (3) staged-deps submodule
stubs: both flash-attention/csrc/cutlass AND MSA/python/fmha_sm100/cutlass
were empty dirs in deps-src.tar.gz (the r18 tree dropped implicit cutlass
include wiring / MSA's install needs the dir) — populated with each project's
own pin (FA: nvidia/cutlass 62750a2b, MSA: nvidia/cutlass eb61c911) and
purged 23k macOS AppleDouble ._* files. Image: tag glm53-jovian-r12:local,
tree 67e7e6e (base a8c796f3 + #582 + #646), 16.1 GB, on all 4 nodes.
Lane results (gate = 153/176 baseline; quality is the gate, dep = deployability):
| Lane | /176 | /100 | dep | KV tokens | verdict |
|---|---|---|---|---|---|
| r17abi 2x (baseline) | 153 | 87 | 69 | ~1.25M | anchor |
| r18 2x (ds4) | 157 | 89 | 71 | — | PASS (+4) |
| RedHat MTP k=5 2x | 156 | 89 | 70 | — | PASS (MTP works, +3) |
| eugr b12x MTP k=5 2x | 143 | 81 | 65 | — | FAIL (−10) |
| r18 4x RoCE TP4 | 156 | 89 | 76 | 1.47M | PASS |
r18 4x DCP4 (TP4+--decode-context-parallel-size 4+--cp-kv-cache-interleave-size 4) |
161 | 91 | 75 | 4.84M | BEST |
| r18 4x nvfp4_ds_mla KV | 161 | 91 | 77 | 2.35M | PASS (best dep) |
--perf results (llama-benchy, pp2048/tg128, runs=3, from each report's Throughput Metrics table; c1 = single, c2 = 2 concurrent; t/s = tokens/s):
| Lane (img) | pp c1 | tg c1 | TTFT c1 | pp c2 | tg c2 | TTFT c2 | tg c2 @8k-ctx |
|---|---|---|---|---|---|---|---|
| r17abi 2x (baseline, r17) | 1,577 | 29.0 | 1,362ms | 1,595 | 41.7 | 2,093ms | 29.7 |
| r18 2x (r18) | 1,473 | 30.7 | 1,481ms | 1,374 | 40.2 | 2,268ms | 30.6 |
| RedHat MTP k=5 2x (lab) | 1,340 | 26.8 | 1,638ms | 460 | 22.4 | 4,667ms | 14.7 |
| eugr MTP k=5 2x (eugr) | 1,292 | 31.1 | 2,397ms | 1,388 | 41.6 | 2,751ms | 17.7 |
| r18 4x RoCE (r18) | 2,904 | 47.7 | 762ms | 2,413 | 70.9 | 1,399ms | 35.9 |
| r18 4x DCP4 (r18) | 1,639 | 43.1 | 1,521ms | 1,756 | 51.1 | 1,637ms | 30.0 |
| r18 4x nvfp4 KV (r18) | 2,614 | 45.3 | 873ms | 2,250 | 62.6 | 1,368ms | 35.6 |
Perf readings:
Key findings:
nvfp4_ds_mla KV dtype (r18-tree value, vllm/config/cache.py):
1.59× the fp8 capacity at the same pin, tied quality, best deployability.
Combine with DCP4 next (projected ~7.7M KV).Blocked (documented, not solvable from recipes):
B12X is rejected for it (kv_cache_dtype constraint)
and FLASH_ATTN too ("FP8 KV cache requires FA3 on SM90 or FA4 on SM100").
With drafter kv_cache_dtype: "auto" it fails the FORK's own assertion:
ValueError: GLM MLA parent-page stride must be an exact number of C4
pages. Fork-side fix needed (drafter KV geometry under C4 paging) before
the k=7 A/B can run.DeepseekV4ForCausalLM (vllm/models/deepseek_v4/nvidia/model.py) contains
NO aligner module — the image predates V4-Vision support; the Vision-Exp
checkpoint's vision weights have nowhere to land. Re-check on a newer
eugr image; fork lane (dsv4-flash-vision) remains the only V4-Vision path.Open decisions: (1) production 4x candidate = r18 + DCP4 (quality 91, 4.84M KV) — needs a production recipe + operator sign-off; (2) r18 2x adoption as the new 2x default (157 vs 153 baseline); (3) DCP4+nvfp4 KV combined cell; (4) eugr lanes stay demoted.
The glm53-jovian-r12:local tag pointing at r18 content was wrong — separate
now, no mixing:
docker-images/glm53-jovian-r18/ — self-contained r18 build dir (r18
versions.env pins 582+646, fixed kv-cache-cleanup patch, re-staged
deps-src with FA+MSA cutlass, source tarballs vllm 67e7e6e / b12x
b58f34ea). Image tag: glm53-jovian-r18:local (renamed on all 4 nodes
from the r12 tag; content unchanged, built during the night shift).docker-images/glm53-jovian-r12/ — restored via git checkout 582343c
to the genuine r17 state (pins 550–557, original kv-cache-cleanup patch).
Image tag glm53-jovian-r12:local currently points at NOTHING (removed
from nodes) — an r17 rebuild is possible but NOT done: the r17-era
deps-src staging is unrecoverable (untracked + overwritten), so a rebuild
today would use the r18 deps staging (FA/MSA cutlass populated) and be a
subtly different image than the original r17 anchor. If the r17 A/B
anchor is ever needed again, re-cut the r17-era deps first.glm53-flash-nvfp4-r18{,-4x,-4x-dcp4,-4x-nvfp4kv,-dflash2}
(new) → r18 tag/dir; glm53-flash-nvfp4-r17abi unchanged → r12 tag/dir.Operator direction: nvfp4_ds_mla in the 2x setup (parity with the 4x cell) and a Spark-checkpoint variant of each nvfp4kv cell; 4x KV pin 10 -> 16 GiB (NVFP4 4x has the headroom: 47.1 GiB weights/node vs ~108 usable).
| Lane (r18 img) | /176 | /100 | dep | KV @ pin | verdict |
|---|---|---|---|---|---|
| 2x nvfp4 KV (non-Spark) | 154 | 88 | 70 | 2.14M @ 10G (1.7x fp8) | PASS, no quality regression |
| 2x nvfp4 KV + Spark ckpt | 158 | 90 | 70 | 2.14M @ 10G | BEST 2x of the campaign |
| 4x nvfp4 KV + Spark ckpt | — | — | — | (16G) | BLOCKED: mm_mxfp8 TP4 |
ValueError: Problem size is not supported for
mm_mxfp8 — the Spark quant's MXFP8 MTP-expert layer does not tile at TP4
(non-Spark is fine at 4x). Spark checkpoint => 2x lane only.Every fresh container re-pays ~20 min of flashinfer/torch JIT compilation
(cold /root/.cache per container — seen on every lane all night). All glm53
lanes now persist the JIT caches per node (local FS, not NAS) via plain
[[extra_mounts]]:
~/sm121-cache/jit-121f/flashinfer → /root/.cache/flashinfer~/sm121-cache/jit-121f/torchinductor → /root/.cache/torchinductor~/sm121-cache/jit-121f/vllm → /root/.cache/vllm
Host dirs are SHARED between lanes of the same arch — each cache
self-namespaces by its engine-version key internally (flashinfer keys by
pkg version + arch; torchinductor by torch version; vllm by compile input
hash), so mixing r17/r18/lab/eugr in one dir is safe. The pre-existing
glm53-jit-121f/b12x mount is untouched (keeps its accumulated cache).
First serve of each image pays the compile once per node; later serves
should start ~20 min faster.glm53-flash-nvfp4-r18-2x-nvfp4kv-spark (158/176). Do NOT stop/re-serve/
benchmark against it without explicit operator confirmation — treat like a
live cluster (AGENTS.md warning applies).Operator verdict: regenerating tarballs on some machine is nonsense (the sources existed only on that machine — a fresh repo clone could not build). The r27 build has NO context tarballs:
docker-images/glm53-jovian-r27/ — clone-at-pin build: the Dockerfile
clones vLLM/b12x/LMCache at pinned commits (versions.env *_PIN = SHA,
*_TREE = git tree hash, gates assert BOTH), builds sub-deps from the
pins the tree itself declares (fetch-deps.sh, grep-gated against the
tree's cmake), builds LMCache + cuMem interposer in-container, and keeps
the proven GB10 runtime (CUDA 13.2 aarch64 / torch 2.13.0 / flashinfer
0.6.17 — the same versions the r27 tree's requirements/cuda.txt asks for).git clone this repo, upload the 215 KB
context, TAG=... bash build.sh — everything else comes from GitHub at
pinned SHAs (verified locally end to end; b12x/lmcache fetch-by-SHA works,
branch-tip gates catch drift — LMCache's lock branch was already renamed
upstream, so pins are SHAs, branches are comments only).integration/glm53-r27-release-20260906 @ 63a82f8d (tree f54cd9ca),
B12X @ e8ad299b (f3cd8a9e), LMCache @ 822330db (008ac3e0,
0.5.5.dev0+glm53cache.engine.822330db), FlashKDA @ 3b225bf2, cutlass
v4.4.2 + FA gitlink 62750a2b + MSA gitlink eb61c911, FlashMLA a8f794d1,
qutlass e74319e3, tml-fa4 b2068346, triton v3.5.1, DeepGEMM 8b1392b.
Wheels get deterministic versions via SETUPTOOLS_SCM_PRETEND_VERSION.Operator switched the agent back to pluto → dgx1–4 all free; dual-bench window.
recipes/glm53-flash-aiden-2x/reports/2026-09-06_aiden-12-2x-hardmode.*.recipes/glm53-flash-r27-spark/reports/2026-09-06_r27-2x-hardmode.*.ENV TORCH_CUDA_ARCH_LIST=12.1a GIT_PROTOCOL=0 in vllm-builder
explicitly; clean boot + full bench since.Ops: old r18-2x-nvfp4kv containers (left over from the night-1 matrix, up
~1 h on dgx1/2) stopped; 2nodes-dac and ds4 now hold the new lanes.
Next queue: prod-3.73-vision (DSV4F-Vision aiden lane) on 2nodes-dac, then
r27 DFlash2 + DCP4-16G re-tests (need 4x → operator sign-off on the lane swap).
Final campaign picture (all seed 42 hardmode, tool 2.6.1.dev46):
| lane | score | verdict |
|---|---|---|
| aiden prod-1.2 2x (DFlash2 k=7) | 159 (90) | first canonical aiden number; +1 vs r18-spark but 5x less KV, eager profile |
| DSV4F-Vision aiden prod-3.73-vision 2x | 161 (91.5) | new 2x campaign record; ties best 4x cells |
| r27 2x spark | 156 (88) | −2 vs r18; engine not at parity |
| r27 4x DCP4 16G | 155 (88) | −6 vs r18 161; KV 7.74M (+60% headroom), fast decode (44–53 t/s) |
| r27 DFlash2 2x | — | BLOCKED: C4 parent-page stride assert (pooled_indexer, tree-level in r18 AND r27; r27's DFlash2 qualification was sm_120-only) |
Ops: launcher gained two entrypoint-image capabilities (empty model → no
positional model; NODE_RANK/MASTER_ADDR env injection) + the r27 image
arch fix (explicit 12.1a in vllm-builder). Hung-worker cleanup pattern
reconfirmed (rank-1 survives a head death; docker rm -f by name).
Queue going forward: (1) r27 DFlash2 needs a fork-level patch before re-test (drafter KV outside the C4-aligned page, or an SM121-capable FP8-KV drafter backend); (2) r18 16 GiB 4x boot-verify (capacity-only, no re-bench); (3) production-lane decision remains with the operator (r18-spark 2x vs r27 watch; aiden 159 as the community reference).
docker-images/glm53-flash-aiden/, built + on all 4 nodes). Perf run
noisy — quality is the headline. The 4x aiden lane is now a real
production candidate (best quality of the campaign; FP8 306 G).The r27 tree ships the Rust OpenAI frontend (axum, ZMQ bridge; vllm-rs
binary is already in our r27 image, built with the wheel; toggle
VLLM_USE_RUST_FRONTEND=1). Smoke test (dgx5, Qwen3.8-27B, 1 node):
fronted boots but fails engine input registration timed out after 600s
— the Rust client's fixed ready_timeout is shorter than our GB10 boots
(NAS weights + JIT + cudagraphs = 10–40 min). Verdict (operator): not
pursuing — the fork stays selective about upstream imports and the
frontend is upstream-experimental (not feature-complete; parser parity
for glm45/glm47 tool/reasoning unverified). Revisit only if upstream
matures it (or if per-request CPU overhead ever becomes a bottleneck in
our benches).
b12x.comm.roce: one-shot all-reduce + all-gather over RoCE for multi-node
Spark TP (1 GPU/node). Peers stage inputs into pinned host memory and
RDMA-write them directly — no GPUDirect/dmabuf/peermem needed (unavailable
on Spark); a C proxy posts the writes (ibv_reg_mr), a CuTe kernel reduces
in fixed rank order → bit-identical results on all ranks; CUDA-graph
replay safe via a device-resident epoch; fail-stop with self-poisoning
(never a fallback). Measured on our exact production shape: GLM-5.3-Flash
TP4 + MTP5, 4 Sparks. Microbench (bf16, graph replay): 3–3.8× vs NCCL up to
1 MB (48 KB 23.6 vs 54 µs; 1 MB 238.9 vs 899 µs). Serving A/B: decode step
latency lower in 14/15 cells (c=1 62–64 vs 65–66 ms; c=16 194–212 vs
246–259 ms), throughput c=16 +22–32%, c=4 +6–22%, prefill unchanged
(64 MB all-reduces stay on NCCL above the 2 MB cap), coding-peak c=1 −2%
(noise). With both collectives routed, the decode profile shows zero NCCL
kernels — i.e. it attacks exactly our measured decode profile
(bandwidth-bound, scales to ~N=4; prefill untouched).
Integration surface — verified already in our r27 image (2026-09-07,
dgx5, docker run -i import check, all OK):
e8ad299b) is NOT just the original #295 merge — the r27
line carries it plus follow-ups: two-rail striping (aa90a277 — our
rocep1s0f0,roceP2p1s0f0 fabric is exactly what it targets), DSV4
graph-collective opt (1a7e3ec2), PR #315 gather-geometry (b58f34ea). The
r27 variant is ahead of the public line, not behind (5 of 8 roce files
differ from the LIL A/B revision; the r27 ones add per-stripe completion
flags + power-of-two grid counters);b12x_roce_all_reduce.py is in our vLLM pin (63a82f8d,
blob a311ae52); import b12x.comm.roce + roce_oneshot + the adapter all
import cleanly in the built image;NCCL_IB_HCA / NCCL_IB_GID_INDEX — our config
already pins both CX-7 functions and the per-node GID auto-detect
propagates automatically;VLLM_ENABLE_ROCE_ALLREDUCE=1 in recipe [env] (caps
VLLM_ROCE_ALLREDUCE_MAX_SIZE=2M / VLLM_ROCE_ALLGATHER_MAX_SIZE=16M).Repo note: voipmonitor/b12x is the operational repo (holds the r27/r28
qualification lines; LIL is the public community repo where PR #295 merged
and 00280f2 sits on a dangling branch of). The first bump attempt
(e8ad299b → 00280f2) was a wrong move — 00280f2 is a diverged mainline
commit (no r27 GLM line, no integration/vllm/loader.py), broke the
b12x-managed build gate, and was reverted; no rebuild was needed.
A/B DONE (2026-09-07 night, 4nodes-switch, 4x DCP4 shape, arms back to
back, dev46/seed 42): glm53-flash-r27-4x-dcp4-roce (clone +
VLLM_ENABLE_ROCE_ALLREDUCE=1, minus --disable-custom-all-reduce — the
fork gates the RoCEnante branch on the custom-AR enable flag; inert on
4x1-GPU nodes, so no confounder) vs the NCCL control:
['B12X_ROCENANTE','PYNCCL'],
world=4, both rails, 2MB/16MB caps; all-reduce + all-gather "live" logs;
proxy .so built once, persisted via the b12x cache mount.recipes/glm53-flash-r27-4x-dcp4{,-roce}/reports/2026-09-0{7,8}_roce-ab-*;
detail: history/night-shifts/2026-09-07.md.2x A/B DONE (2026-09-08, 4nodes-switch, r27-spark 2x, arms back-to-back, dev46/seed 42): same toggle, same convention. More modest than 4x (bigger messages over both rails favor the 4x shape):
glm53-flash-r27-spark,
glm53-flash-r27-4x-dcp4) now ship VLLM_ENABLE_ROCE_ALLREDUCE=1 and drop
--disable-custom-all-reduce; the interim -roce clone is deleted
(its reports consolidated into glm53-flash-r27-4x-dcp4/reports/). The
production aiden stack is untouched (its image lacks the r27 b12x/adapter
surface) — RoCEnante stays an r27-line feature until the aiden image picks
it up.recipes/glm53-flash-r27-spark/reports/2026-09-08_roce-ab-2x-arm{A-nccl,B-roce}.{json,log,md}.One-off crash during the 2x A/B (NOT RoCEnante): the first RoCE-2x run
died mid-bench (after scenario ~21) with a TileLang trace crash in
vllm/models/glm5next/nvidia/ops/glm_kpool.py —
AttributeError: 'int' object has no attribute 'to' at
block.to(tl.int64) in a kpool pool kernel → EngineDeadError, clean
shutdown cascade, bench recorded a partial 43%-completion run. The immediate
re-run (same seed/scenarios) completed 100% (162/176) — not reproduced.
Suspect: JIT-trace race or a poisoned kernel-cache entry. If it repeats, the
kpool C4/decode-metadata path under the r27 vLLM pin is the suspect (same
file family as the DFlash2 C4-alignment blocker). The aborted partial report
was discarded; only the clean re-run is recorded.
Launcher additions the same night (both operator-requested):
stop now waits until the containers are actually stopped and removed
(per-node 60 s verification poll after docker stop; --no-wait opts
out) — an immediate re-serve on the same nodes used to race the dying
containers' GPU release (two silent worker deaths during the A/B).sm121 bench --recipe R --cluster C --label L: runs tool-eval-bench
(seed 42, hardmode, perf, concurrency 1,2 — the campaign convention)
against the live head, waits for API readiness, and lands
<UTC-date>_<label>.{md,json,log} in recipes/<lane>/reports/ (scratch
cwd + absolute --json-file handled internally; -d prints the command).Detail: history/night-shifts/2026-09-08.md. Sources: local-inference-lab/b12x PR #295
(+ follow-up PR #315, r27-line commits aa90a277/1a7e3ec2), docs/rocenante.md,
receipts docs/evidence/rocenante/.
Queue item closed. glm53-flash-nvfp4-r18-4x-dcp4 (KV pin 16 GiB,
--kv-cache-memory-bytes 17179869184) boots clean on 4nodes-switch in
~6 min: 47.48 GiB weights/node, GPU KV cache 7,738,490 tokens (≈ the
expected 7.7M @ 16 GiB DCP4 — exact hit), CUDA graphs captured, API live,
completion generating. No OOM, no re-bench (quality 161/176 already
recorded 09-06). Stale "10 GiB" comments in the four r18-4x* recipes
corrected. AGENTS.md gained the "all node operations via sm121 commands"
rule (raw ssh/docker only for one-off diagnostics).
integration/glm53-r28-cache-fixes-20260906 @ voipmonitor/vllm
62f6385c (tree 6361a741) — 13 commits over the r27 pin, 29 files,
zero requirements/cmake changes (GitHub compare API), so the r27 image
tree's dep gates hold. Content: prefill/decode compute-time sharing +
interleaved bounded parallel prefills (the admission-block pain from the
agent-serving findings), chat-template rendering parity (instruction
checkpoints), GLM boundary restore across DCP/DFlash groups, partial
prefix-cache hits. b12x unchanged (e8ad299b, RoCEnante already in).
New recipe glm53-flash-r28-4x-dcp4: clone of the r27 4x-dcp4 recipe
(160/176, 46.8/62.4 t/s) with [build.versions] overriding
VLLM_PIN/VLLM_TREE/VLLM_PRETEND_VERSION — same build dir
(glm53-jovian-r27), distinct image tag glm53-jovian-r28:local,
override folds into the build checksum (separate image, no r27 rebuild).
A/B target: r27 4x DCP4 160/176 + 46.8 t/s; 2x (162/176, 27.4 t/s) after
the 4x verdict.
Оператор дал доступ к публичному imaged sparkring-стекa:
ghcr.io/fujitsupolycom/sparkring@sha256:f25cdb6bf7df85754ea5c62445b139dac3143bc6e910a0442d681b6e63c31c4b
(digest-only, тегов нет). Внутри: их vLLM-форк 0.1.dev1+gd377796e8
(revision 17bd258075), b12x 2883a5df, sparkcache d0cf7296, patched NCCL
2.30.7, transport tp2-rocenante-adaptive (b12x.comm.roce — наш RoCEnante).
Модель local-inference-lab/GLM-5.3-Flash-NVFP4-Spark @ df116c4f уже в
NFS-кеше. Профили: TP2/DCP1 (RoCEnante 2-path, KV 8.75 GiB, max-len
262K, GMU 0.87, MTP3, block 256) и TP4 switched (plain NCCL, RoCEnante
OFF, KV 24 GiB, max-len 1M, GMU 0.80, fastsafetensors).
Рецепт glm53-flash-sparkring-2x (TP2-профиль, модель через extra_mount
снапшота df116c4f в /models/target, entrypoint имиджа). Dry-run: чистый
(ловля лауночера: pipeline_parallel_size = 1 обязателен в рецепте, иначе
pp=nnodes по дефолту; bare-ключи TOML — только до table headers).
Запуск требует окна downtime: физическая пара 2x (dgx1+dgx2) = те же
машинки, что держат production r28 4x (primes совпадают: 88.x/100.x/200.x —
разные fabrics одной коробки). Probe по sm121-лейблам видит prod-контейнеры
→ 0 free. И 2x, и 4x-профили требуют сначала stop prod.