glm53-flash-eugr-2x (eugr b12x nightly-20260910) on the
2nodes-dac pair. This lane is running and must NOT be stopped until
the operator says so (explicit instruction 09-17).sw6_mt on (prepared for the 8x work, see below).specs/bugs/BUG-2026-09-14-r37-ds41-text-garbling.md.sm121 runlock list|close + report stale
cross-check (commits 2f71763, 706b7a5).--speculative-config '{"model":"RedHatAI/GLM-5.3-speculator.dspark",
"num_speculative_tokens":8,"method":"dspark"}'. Trained on vllm
0.28.0 / speculators 0.8.0.dev196 — our r37 tree reports 0.26.1rc0 but
has the integration (grep-verified: DSparkDraftModel method
resolution in config/speculative.py:1333/1404, speculators config
loader at transformers_utils/configs/speculators, draft_model field,
model registered in models/registry.py). Needs --trust-remote-code
(repo carries config.py custom code) — the full recipe already sets it.
Drafter trained on BF16-target hidden states; we serve MXFP4 — acceptance
may shift a bit; that's part of what the A/B measures.bab43db6, 09-15) — the lab's qualified
launch manifests. Only change: Qwen3.8-Flash-Next-NVFP4 dropped
limit_per_prompt: image: 1. Extracts that matter:
DeepSeek-V4-Flash (rev 60d8d707): lab policy = MTP k=2 (moe mxfp4,
probabilistic/standard), GMU 0.91, seqs 64, batched tokens 8192 —
very different from our prod contract (dspark K5, GMU 0.85, seqs 8).
NOTE: this is V4-Flash, not our V4.1-Flash; the 0731 variant carries the
DSpark head.DeepSeek-V4-Flash-Vision-Exp: dspark K7 + adaptive_verification — the
lab qualified the vision lane we have an image for.GLM-5.3-NVFP4 (lab's FULL GLM-5.3, 433 GB): NVFP4 routed experts +
BF16 MTP expert layer, MTP k=3 model:target, B12X attention,
long_prefill 2048, async_scheduling, FULL_AND_PIECEWISE + custom_ops
all, CUDA_DEVICE_MAX_CONNECTIONS 32, no GMU pin. Their qualified
full-model lane — we never ran spec on the full model.GLM-5.3-Flash-DFlash2-MXFP8 (1.2 GB, kind: draft): MXFP8 DFlash2
drafter variant, compatible with the NVFP4/Spark Flash models.nightly-20260913 (built from
the lab's dev/infernal-invocation — a NEWER lab branch than our r37
tree 3fb88fdf); non-b12x line pushed nightly-20260917. Changelog
highlights: Qwen3.8-Flash-Next solo recipe with VLLM_PLE_TABLE_MEMORY=
disk (1M+ KV at GMU 0.8), Vision-Exp B12X + DSpark, GLM Flash b12x
loader.ghcr.io/tonyd2wild/
vllm-glm53-flash:sm121-v11-dflash2 (+ sm121-v8 base): 5 SM121 fixes
(NoPE-MLA sparse backend, FlashInfer 0.6.17→0.6.18 FA2 NaN, dep re-pins,
PDL gating, indexer top-k init) + fp8 KV unlock. Measured TP2 @262K:
DFlash2 46.9 tg/s (74.1% acceptance, 2.15×), TP4/1M sibling 68.5 tg/s,
pool 2.62M. A third independent stack for the GLM Flash lane.torch.unique gather →
~700 ms stalls; fixed-shape no-dedup gather + raised fused temp rows)
are good context for the lab issues doc.RedHatAI/GLM-5.3-speculator.dspark downloaded to the shared HF cache
(2.3 GB, snapshot 198b3ced) ✓sw6_mt turned on via the HA relay —
the 200G fabric is invisible without the switch (operator: the switch
relay is a separate HA entity, not implied by node power).enp1s0 + enP2p1s0); port0 of each carries
a 200.x IP and both are on ONE L2 domain (a single 16-port 200G switch,
cross-ping verified with sudo ping). Dual-rail 2×200G per node is already
the current 4nodes-switch convention (NCCL_IB_HCA=rocep1s0f0,
roceP2p1s0f0). Per-node ib_ip = NIC A port0: dgx5=200.11, dgx6=200.10,
dgx7=200.23, dgx8=200.25 (plus the 100.x/101.x DAC pair on dgx1/2 port1,
untouched). All 16 switch ports link UP./mnt/nas (nfs4 nas.lan:/sna, nconnect=8) validated ✓. dgx7/8:
fixed — the fstab line + /mnt/nas were missing; added (sudo
available, NAS exports /sna *), mounted, 65 HF repos visible ✓.8nodes-switch cluster added to config.toml (dgx1–8, ranks 0–7,
entities switch.dgxN, sw6_mt blocking + sw7_fan non-blocking) with
[nccl."8nodes-switch"] = the dual-rail copy of 4nodes-switch. All 8
nodes share one ED25519 host key (cloned Ubuntu image) — same pinned
SHA256:aUXh… as dgx1–4; (security footnote: per-node key regen later).sm121 health --cluster 8nodes-switch: 8/8 online, all free ✓.serve --cluster 8nodes-switch --fit 8 renders correctly:
TP8/nnodes 8/ranks 0–7, GID auto-detect on all 8, before_serve hooks ×8,
MASTER_ADDR=200.15 ✓.--build-node + checksum-label sync; no manual
docker save|ssh|docker load — an abandoned manual copy attempt left no
residue, verified).STATUS (09-18 ~13:45 UTC): recipe glm53-full-mxfp4-4x-dspark8 up on
4nodes-switch, quality gate PASSED (RU 300-word text clean, 6/6 identifier
probe), bench dspark8 running.
Boot log (6 boots, 12:21 → 13:34):
fp8_ds_mla KV dtype — the target's MLA layer
rewrites the shared cache_config.cache_dtype (mla_attention
_canonicalize_sparse_mla_kv_cache_dtype) and the selector has no backend
for (head 64, bf16, fp8_ds_mla, non-MLA). Explicit --kv-cache-dtype
fp8_e4m3 did NOT help (overridden back to fp8_ds_mla).--kv-cache-dtype-skip-layers sliding_window (the r37 flag for
exactly this: skipped layers use auto/bf16 KV; the target's DSA layers are
not sliding-window so they keep fp8_ds_mla) → attention init passed, but
the draft SlidingWindowSpec inherited a second pollution: the target's
cache_config.skip_page_size_padded (shared-page padding) < the draft's
bf16 page → assert page_size_padded >= unpadded_page_size_bytes in
kv_cache_interface.py.patches/patch_dspark_draft_page.py (anchor patcher, in-container
mod via the shared HF cache sm121-patches/; the draft spec passes
page_size_padded=None — its KV group is independent and must use its
own page size). Tested throwaway-container first (check→apply→check).198b3ced; the repo is in the shared HF cache, HF_HUB_OFFLINE).dev67-full-glm53-dspark8 (13:43 → 14:31 UTC, dev65+g6be685f0e,
seed 42, hardmode, c1+c2): 153/176 (87/100, ★★★★) — within run variance
of the no-spec anchor 158/176 (−5, same as eugr 161 vs 166). 8 fails, all
wrong_args/missing_step, no garbling: TC-22/TC-68 invalid JSON, TC-43 empty
query, TC-45 tool_choice, TC-38 crowded namespace 2/4, TC-51 (safety, the
same send_email-before-confirm quirk eugr 2x had), TC-80 + TC-87 (★★★★★
preconditioned update / cursor integrity).
Perf vs anchor (no-spec 158/176, 934 pp / 19.0 tg / 2,124 ms):
recipes/glm53-full-mxfp4-4x-dspark8/reports/2026-09-18_134322_dspark8.*.--engram-config
removed) → typo probe. Clean → the lab's engram disk-read path is the
cause; garbled → tree numerics; either way finalize
BUG-2026-09-14-r37-ds41-text-garbling.md and file it with the lab.dev/infernal-invocation, one lab-branch
newer than our r37. Clean text → the r37/DS4.1-alt line revives on the
newer tree.Gate: CLEARED — all 8 nodes up + validated, 8nodes-switch in config,
health green. The launcher syncs missing images at serve time.
DSV41_ENGRAM_DISK/DSV41_ENGRAM_LOCAL/DSV41_ENGRAM_DIR and the
/var/tmp/engram-local mount entirely — the baked engram.py patch's
disk mode is env-gated and defaults to off (in-memory path). The engine
prints the per-rank layout at boot (the recipe header documents it), so
nothing needs pre-staging. Aggregate KV ~2× (10.4M → ~20M tokens) — the
capacity/1M-context lane for prod traffic.
Non-goals at 8x: DCP8 (the DCP>1 crash applies; only 131K-style DCP1 is
qualified).deepseek-ai/DeepSeek-V4-Flash 60d8d70">@60d8d70 (~510 GB) — a
multi-hour NAS download; start early if the operator wants it.sw6_mt are ON as prep. First serve of the night is a
clean slate.sm121 serve --keep for first/unknown boots; short-timeout polling.--build-node
docker save|ssh|docker load.