# Night shift 2026-09-13 → 2026-09-14 Prepared 2026-09-13 ~21:30 UTC by the assistant. Operator brief: "посмотри обновления, поищи по форумам, готовь план для ночной смены". ## State at handoff | | | |---|---| | `4nodes-switch` | ON, **serving the eugr DS4.1 prod** (`dsv41-flash-4x-b12x`, started 13:31 UTC, 512K, DSpark k=5, Engram-on-disk + per-rank local sparse). This is the agent's own brain — **confirm before stopping**. | | `1node-5` (dgx5) | ON, idle — the build node (no RoCE / 10 GbE only, so it cannot join the 4x fabric: 5-node lanes are out). | | Checkpoint | `RedHatAI/GLM-5.3-MXFP4` downloading to the NAS: ~110 GB / 403.4 GB at **114 MB/s → ETA ~40 min**. Verify before P0. | | Kernel | all nodes on **6.17.0-1031-nvidia** — do NOT upgrade (see Updates #3). | | git | `git.kilork.org` still unreachable → commit locally; ~10 unpushed commits. | ## Updates found tonight (external) 1. **R37 lock published 2026-09-13** (lab, DS4.1): image `localinferencelab/vllm:jovian-judgement-community-20260913-r37`. The headline change is a **kernel-dispatch overhead removal** (repeated CPU arg-list expansion, mutable-schema inspection, scalar dtype allocations, tensor-equality calls) → **uncached 32K prefill +43.65%** (14,896 → 21,399 tok/s), C1 output +17.7%, verifier +11.9%, Sieve +8.2% (their RTX quartet; integrated, not per-PR). Also corrects the named `high` reasoning budget 50 → 75. Pins: vLLM `c687594b8a8` (tree `3fb88fdf…`), b12x `f1c4e9dd5b1` (tree `480ea232…`), LMCache `29bc5a2e` unchanged, DeepGEMM `8b1392b9`, torch 2.13.0 / flashinfer 0.6.17 — **no dependency resync needed**. → *GLM* stays at **R35** (still the latest qualified GLM lock); R37 is the DS4.1 lock. **Action: build profile written** → `docker-images/glm53-jovian-r27/profiles/jovian-r37-ds41.env` (P1). 2. **eugr `nightly-20260913`** image built (13:09 UTC, supersedes `nightly-20260910` = our DS4.1 prod image). Changelog not at the usual raw path (404) — read the repo/thread during the shift. Cheap A/B (P3). 3. **⚠ Kernel regression (forum #383023):** `7.0.0-1019-nvidia` breaks NCCL/RoCE — `ibv_reg_mr_iova2 failed with error Cannot allocate memory` during TP communication. Reproducible kernel-only A/B; root cause traced (2026-09-13) to **KHO's default scratch reservation marking ~9.3 GiB as unaccounted `MIGRATE_CMA`**; fix PR NVIDIA/NV-Kernels#590. Working: `6.17.0-1032` (and our `6.17.0-1031`). **Action: do not upgrade the kernel on any node; if a node ever shows RDMA ENOMEM, check `uname -r` first.** 4. **Forum #382897** ("DS4.1-Flash 552B on 4× Spark, 77.2 tok/s c1"): our upstream author (tonyd2wild — the repo our `dsv41-flash` image is built from). The 77 tok/s is a **warmed, streaming, counting-prompt peak** with up-to-5.95/6 draft acceptance; the same post lists **prose 23, reasoning 39, math 47, code 52** tok/s — i.e. our measured 47–49 tg on agentic traffic is consistent; peak-on-repetition ≠ agent workload (clickbait, as the operator suspected). Two useful nuggets: 203 GB of Engram stays on disk so 552B fits 4x, and **"2 GPUs were latched below 1 GHz — unplug the Spark to clear it, a reboot won't"** → add a clock check before benches. 5. New lab GLM docs: `models/glm-5.3-flash-spark-tp2.md` (09-12, Spark **TP2 + vision** serving & measured capacity — GLM-5.3-Flash is natively multimodal and all our GLM lanes are text-only `--language-model-only`; a possible capability lane later). Also `models/glm-5.1-mxfp4.md` and the `kld/glm-5.3-flash-*` quant-fidelity reports. 6. Other recent threads worth a skim only: #382939 (optimizing NVIDIA's official `nvidia/GLM-5.3-Flash-NVFP4` on 2x), #382697 / #382927 (2x vs 4x comparisons), #382584 / #381911 (DS4-Flash-Vision-Exp on 1x). ## P0 — GLM-5.3 (full) MXFP4 on 4× — the headline Recipe `recipes/glm53-full-mxfp4-4x` (r35 stack, DCP4, 512K, KV 8 GiB pin, GMU 0.85, no spec on the first boot). Read its header for the full memory plan; the arithmetic in one line: **93.9 GiB weights/node + ~12 GiB engine + 8 GiB KV + ~4 GiB activations ≈ 118 of 121.63 GiB**. ### P0.0 prerequisites (~10 min) 1. **Free the cluster** — only after confirming with the operator (it may be serving the agent): `sm121 stop --recipe dsv41-flash-4x-b12x --cluster 4nodes-switch`, wait ~12 s before any serve. 2. **Download complete**: `du -sh $NAS/models--RedHatAI--GLM-5.3-MXFP4` ≈ 403 GB and **141 shards** present (an `.incomplete` file = resume with `huggingface-cli download RedHatAI/GLM-5.3-MXFP4`). HF_HUB_OFFLINE=1 makes a missing shard a hard load failure. 3. **Clock check** (nugget #4): per node `nvidia-smi --query-gpu=clocks.sm,clocks_event_reasons.active --format=csv,noheader` — a SM clock latched below ~1 GHz invalidates every bench number. 4. `sm121 health --cluster 4nodes-switch`. ### P0.1 boot probe — conservative (~60–90 min) Edit the recipe args: **remove** `--decode-context-parallel-size 4` and `--cp-kv-cache-interleave-size 4`; set `--kv-cache-memory-bytes 4294967296` (4 GiB) and `--max-model-len 131072`. Then: ``` sm121 serve --keep --recipe glm53-full-mxfp4-4x --cluster 4nodes-switch ``` Poll with `docker logs --tail 2 sm121_glm53-full-mxfp4-4x_0` every 240–280 s. - Expect ~94 GiB/rank of weights (~10–20 min via instanttensor). - **ABORT SIGNAL — a second "Loading safetensors" pass**: that is the 2026-09-08 double-load pattern that OOM-thrashed all four nodes (sshd down, HA power-cycle). `sm121 stop` immediately; do not wait to see if it settles. - Success markers to record verbatim: `Model loading took X GiB`, the `GPU KV cache size: …` line, `Application startup complete`. - **The KV line is the most valuable number of the night** — it gives the real bytes/token for the full model (the parked estimate was ~54 KB/token; everything about 512K depends on it). - If the boot dies on memory: record the numbers and go to P0.4. ### P0.2 smoke + capability (~20 min) - Chat: `chat_template_kwargs: {"reasoning_effort":"low"}` (glm45 parser, glm47 tool parser). Check coherent content + a tool-call round-trip. - **Token-loop check** (the W4A4-on-new-arch risk): generate ~300 tokens and confirm no repeated-token degeneration. - Long-context sanity if the pool allows: filler + needle at the largest context that fits, temperature 0 (the operator's floor is 512K — this is the capability claim). ### P0.3 the 512K attempt (DCP4) — (~90 min + bench) Restore the DCP4 lines, `--max-model-len 524288`, KV pin 8 GiB. Boot again. - If it rejects DCP (the `GLM C4 DCP requires cp_kv_cache_interleave_size to be divisible by 4` / page-stride class that blocks DFlash2 on 2x) → the full model is DCP-incompatible; decision point (P0.4). - Verify the KV line reports concurrency at 524288. - Bench: `sm121 bench --recipe glm53-full-mxfp4-4x --cluster 4nodes-switch --label dev65-full-mxfp4-dcp4` (~2.5 h, under pty automatically). - Compare against the **GLM-5.3-Flash r35 prod anchor**: 163/176 (93), 1,554 pp / 49.6 tg / 1,544 ms TTFT @d0 c1, KV 8.06M @512K. A ~740B model beating that on quality would be the story of the week; matching prefill while holding 512K would already make it a capability lane. ### P0.4 fallbacks if it does not fit / degrades - Bench the P0.1 shape (no DCP, 131072, 4 GiB KV) as the honest capability datapoint. - 5–6 nodes are **not** available (dgx5 is 10 GbE-only, off the RoCE fabric), so 4x is the ceiling for this model tonight. - If it thrashes: `sm121 stop`; if the nodes do not recover, HA power-cycle (`sm121 power off/on --cluster 4nodes-switch`, ~3–5 min boot). - Record "full GLM-5.3 on 4x = does not fit / fits with N ctx" — a negative is a valuable result here (it retires the question). ### P0.5 teardown (10 min) `sm121 stop`; restore prod if wanted (`sm121 serve --recipe dsv41-flash-4x-b12x --cluster 4nodes-switch`); write the report + history entry + commit locally. ## P1 — build the R37 image (background, dgx5, no GPU contention) The profile is written and dep-checked: `profiles/jovian-r37-ds41.env` (vLLM `c687594b8a8`, b12x `f1c4e9dd5b1`, LMCache/FlashKDA/DeepGEMM unchanged, torch 2.13.0 / FI 0.6.17 same as our GB10 pins). 1. Create the recipe pair (copy, then swap 3 lines each): - `recipes/dsv41-flash-jovian-r36-4x` → `recipes/dsv41-flash-jovian-r37-4x` (`docker_image = "jovian-r37-ds41:local"`, `build_profile = "jovian-r37-ds41"`; keeps the composed_model local-Engram hardlinks + 512K + DSpark K7 args). - optionally `recipes/glm53-flash-r35-4x-dcp4` → `recipes/glm53-flash-r37-4x-dcp4` (same image, GLM args) — the image is two-layer, so one build serves both lanes. 2. `sm121 build --recipe dsv41-flash-jovian-r37-4x --build-node dgx5.lan` (~14 min warm buildx cache) → transfer to dgx1–4 (~4 min, 16 GB, parallel `docker save | ssh | docker load`). 3. Sanity checks in the image (read-only, cheap): `GlmMoeDsaForCausalLM` in `registry.py`, `mxfp4-pack-quantized` scheme, `liburing.so.2`, the b12x native loader present. 4. Note: the r35/r36 images now read as STALE against the build dir (it gained profiles) — warn-only, but a rebuild makes labels match. ## P2 — R37 A/B (needs the 4x cluster; only after P0) - `dsv41-flash-jovian-r37-4x`: boot 512K + DSpark K7 + local Engram, bench dev65 → compare with the **r36 datapoint** (154/176, 3,774 pp / 822 ms TTFT) and the **eugr prod** (167/176, 1,642 pp / 1,738 ms). Purpose: does R37's +43.65% prefill claim hold on GB10, and does it close the quality gap that kept the lab stack out of prod? This is the only route we have to a *faster* DS4.1 prod. - Optional GLM arm: same image with the r35 GLM args (MTP3/DCP4/512K) → does the dispatch fix lift GLM prefill too? Baseline 163/176, 1,554 pp. - Delete the r36 recipes once R37 is measured (keep both recipes until then). ## P3 — eugr nightly-20260913 (cheap, only if ≥3 h remain) Swap `docker_image` in `dsv41-flash-4x-b12x` (or a copy) to `eugr/spark-vllm-b12x:nightly-20260913`, boot, bench dev65 → A/B against the nightly-20260910 prod numbers (167/176, 1,642 pp). ~2.5–3 h total. ## Guardrails - **Never** `stop` / `power off` a serving cluster without the operator's OK. - `serve --keep` for every first/unknown boot (default `--rm` wipes crash logs); the 09-08/09-13 posts-mortems depended on it. - Poll in short loops (240–280 s); macOS has no `timeout` binary. - Bench convention: dev65 = 88 scenarios, seed 42, `--hardmode --perf --concurrency 1,2`; reports auto-land in `recipes//reports/` (manifest + recipe copy included). - OOM-thrash drill: container stays "Up", workers respawn forever, sshd can die on 2–3 nodes → `sm121 stop`, then HA power-cycle if needed. - One serve at a time on the 4x cluster (TP4 uses all four nodes; a stray second serve is an instant OOM). - Commit locally after every milestone (git server down). ## Open questions for the operator 1. OK to take the 4× cluster off prod tonight (agent downtime), and for how long? P0 needs the 4 nodes exclusively. 2. Priority if time is short: (a) the full-model capability datapoint, (b) R37 (build + A/B), (c) both? 3. If the full model cannot hold 512K on 4×, is a smaller context (131K–262K) acceptable for this lane, or is 512K a hard requirement (= the lane is dead on this hardware)? --- ## Amendments 2026-09-13 ~22:00 UTC (after reading the lab's GLM docs) Operator: build R37 first, then read `models/glm-5.3-flash-spark-tp2.md` and `models/glm-5.1-mxfp4.md` properly ("GLM-5.3 did not fundamentally change the architecture") and fold the logical consequences into the plan. ### R37 build started `sm121 build --recipe dsv41-flash-jovian-r37-4x --build-node dgx5.lan` (recipe created as a clone of the r36 one with image/profile swapped; the build fetches `c687594b8a8` from voipmonitor/vllm + `f1c4e9dd5b1` from voipmonitor/b12x with the HEAD/tree gates — both present upstream). Log: `/tmp/build-r37.log`. Next after it lands: transfer to dgx1–4, then P2. ### P0 amendment — the MXFP4 MoE backend must be explicit The r35/r37 tree's **default MoE backend is b12x** (r35 changelog). The lab's GLM-5.1 MXFP4 runbook says for MXFP4 GLM experts: `--moe-backend flashinfer_cutlass_afp8` → native **FlashInfer Cutlass MXFP4×MXFP8**; do **not** set `B12X_MOE_FORCE_A16`; GLM must get **standard SwiGLU** (gpt-oss alpha/beta/clamp defaults must not apply). The recipe now sets `flashinfer_cutlass_afp8` explicitly. - Already in our Sept tree (verified by image inspection): `oracle/mxfp4.py:297` maps that name to `FLASHINFER_CUTLASS_MXFP4_MXFP8`; `quantization/mxfp4.py` routes non-gpt_oss to the native `Mxfp4MoEMethod`; the gpt-oss SwiGLU gates in `experts/flashinfer_cutlass_moe.py:270-280` abstain — i.e. the June GLM-5.1 MXFP4 vLLM changes are merged. - RedHatAI ships `quant_method=compressed-tensors` / `mxfp4-pack-quantized` (`CompressedTensorsW4A4Mxfp4`), a *different* ingestion path from the lab's `quant_method=mxfp4` — hence the fallback order: `flashinfer_cutlass_afp8` → `b12x` (proven on our DS4.1 MXFP4 experts) → drop the flag and read the engine's selected backend from the log. - **Numerics gate either way**: a missing SwiGLU clamp (r33/r34 lesson) and W4A4 token-loop corruption both present as degenerate repetition. Run the P0.2 smoke with ~300 tokens and look at it, before any bench. ### P4 — capability lanes worth a logical slot (from the lab docs) **(a) LMCache RAM + filesystem tiers → long context on a tiny GPU KV pool.** Their TP2 GLM-5.3-Flash contract is `MAX_MODEL_LEN=1048576` with only `KV_CACHE_MEMORY_BYTES=4294967296` (4 GiB/rank) and a 1,048,320-token cold text run in 139.7 s, RAM restore 0.808 s, filesystem restore 1.279 s, zero recompute. Options (before the image name): `-e CACHE_MODE=lmcache -e LMCACHE_L1_SIZE_GB=64 -e LMCACHE_L2_ROOT=/cache/lmcache-l2`. Caveats: the 64 GiB L1 arena is **preallocated pinned host shm**, so host `/dev/shm` must be big enough (Docker `--shm-size` does NOT resize host shm); `LMCACHE_L2_ENABLED=0` = RAM-only; the `/cache` volume persists FS objects across container replacement; objects cover 4,096 global tokens, attention pages 2,048 tokens per DCP rank; checkpoint files are hashed at startup (first log delayed while weights are read — keep them immutable while serving). Why it matters for us: it decouples "≥512K context" from "GPU KV pool size" — exactly the wall the full MXFP4 model hits on 4×. Worth a lane on the r35 GLM Flash profile (cheap: env only, same image). **(b) GLM vision on 2 GPUs.** The lab's TP2/DCP2 GLM-5.3-Flash contract includes vision: one image per API request (across all turns), native ~8,000-feature ceiling, video disabled, full-image FlashAttention for the image pass, target KV FP8 + FP32 recurrent state, MTP3 probabilistic. Cold 1,048,320-token image input: correct answer in 143.0 s with **min free VRAM 232.31 MiB/GPU**. All our GLM lanes are text-only (`--language-model-only`) — this is a capability upgrade (screenshots/diagrams in agent traffic), and it is a documented, qualified contract rather than guesswork. **(c) Two conventions to copy into our recipes.** - Explicit `MAX_MODEL_LEN` + explicit `KV_CACHE_MEMORY_BYTES` (they never let a lane silently shorten context; `KV_CACHE_MEMORY_BYTES=auto` is for auto-profiling and `MAX_MODEL_LEN=-1` is the opt-in for accepting a shorter context; GMU does not resize an explicit KV allocation). We already pin both — keep it that way, and quote the KV line in every run report. - `CUBLAS_WORKSPACE_CONFIG=:4096:1` bounds the cuBLAS workspace to 4 MiB per handle → 140 MiB less live allocation per rank (they measured it; not a confirmed cure for every community cuBLAS crash). Cheap, consider for the full-model lane where every 100 MiB counts. **Important caveat from their doc:** "The memory mechanisms can also apply to TP4, but their magnitude depends on sharding and workload. **No TP4 memory or performance improvement is qualified by the TP2 measurements.** The TP2 NCCL configuration is not a TP4 recommendation." (They use 2 NCCL channels / 1 MiB buffer on TP2; we run 16 channels / 2 MiB on TP4 — do not copy the TP2 values.) **Reference numbers from that doc** (2× GB10, TP2/DCP2, MTP3, 4 GiB KV/rank, 1M ctx): 32K prefill 10,648.9 tok/s; C1 MTP3 median output 170.77 tok/s; verifier 67.5 steps/s; R2 vs R1 = +0.41% prefill / +4.52% C1. --- ## Progress 2026-09-13 ~22:20 UTC — both lanes are READY **P1 DONE — R37 image built and distributed.** `jovian-r37-ds41:local`, checksum label `9350429b719b85df3009ad4c8ac86d58f16bd0ede942b7ad67a0f4baa2d1aeba`, built on dgx5 in ~37 min (the deps layer was cold this time; the r36 build was 13m47s warm), transferred to all four nodes in ~4 min (4 parallel `docker save | ssh | docker load`), verified on dgx1: - vLLM `0.26.1rc0+glm53.r37.vllmc687594b` (the r37 composed pin) - b12x 1.3.0, `liburing.so.2 → 2.5` - `GlmMoeDsaForCausalLM` registered; `vllm/models/deepseek_v32/nvidia/` ships `model.py`, `mtp.py`, `b12x.py`, `glm52_low_latency_gemm.py` — i.e. the full-model arch, its MTP head AND a b12x path are all in the image. **P0 prerequisite DONE — the checkpoint is complete on the NAS.** `models--RedHatAI--GLM-5.3-MXFP4`: **141/141 shards, 0 `.incomplete`, 376 GiB** (= 403.4 GB decimal ✓ matches the HF index exactly). **Switch is the only thing left, and it needs a human decision.** `sm121 health --cluster 4nodes-switch` → all four nodes online, **0 free**, the eugr DS4.1 prod occupying them (`sm121_dsv41-flash-4x-b12x_0..3`, up 9 h). Both night lanes (P0 and P2) need the whole quartet, and stopping the prod interrupts whatever it is serving — possibly this agent's own model. So: confirm, then ``` sm121 stop --recipe dsv41-flash-4x-b12x --cluster 4nodes-switch # ~10 s # wait ~12 s sm121 serve --keep --recipe dsv41-flash-jovian-r37-4x --cluster 4nodes-switch # P2 # or the P0 ladder on glm53-full-mxfp4-4x ``` Suggested order now that both are ready: **P2 (R37) first** — it is a known-good configuration class (a boot is low-risk, ~50 min) and answers the +43% prefill claim on GB10; then **P0 (MXFP4)** with the whole remaining night, whose probe boot decides the capability question. Teardown/restore is P0.5. --- ## P0 in flight (interim, ~23:55 UTC) — full MXFP4 on 4x: PROBE PASSED, DCP4 ladder Boot ladder for `glm53-full-mxfp4-4x-probe` (no DCP, 131K, r35 img): 1. `--moe-backend flashinfer_cutlass_afp8` → argparse rejects it (not a CLI choice on r35; the CLI family is `flashinfer_cutlass`, the `_afp8` key is an oracle-level thing). 2. `--moe-backend flashinfer_cutlass` → accepted, but the flag is INERT for this checkpoint: the compressed-tensors W4A4-MXFP4 MoE scheme picks **MarlinExperts** on its own. The boot then died in the mxfp4 LINEAR kernel: the default priority [FlashInfer, Marlin, Humming, B12x] starts with the FlashInfer kernel, whose `is_supported()` wrongly accepts capability 121 (numeric `has_device_capability(100)` passes on GB10) while the cute-dsl mm_fp4 GEMM rejects it at runtime: `mm_fp4 does not support backend 'cute-dsl' with capability 121` (kv_b_proj dequant, mla_attention.py). 3. `--linear-backend b12x` → correct selection ("Using B12xMxFp4LinearKernel for MXFP4 GEMM"; verified per-component: family(120) True, b12x blockscaled OK, cute-dsl input-quantize works on 121) — but the UNCONDITIONAL b12x warmup crashes on this checkpoint's shapes: "Expected source and destination tensors to have the same rank, but got 3 and 4" (b12x dense_gemm via synthetic zero source). Filed-worthy for the lab. 4. **`--linear-backend marlin` + 8 GiB KV → BOOTED.** (A 4 GiB pin was rejected: the engine needs 6.58 GiB/rank for ONE 131072-token request → the full model's KV = **51.6 KB/token/rank**, fp8_ds_mla.) Pool: **159,232 tokens per 8 GiB pin** (52.7 KB/token), max concurrency 1.21x at 131K. Smoke: 27×43=1161 ✓, tool call exact in 4.2 s ✓, 35,157-token needle answered "73451" in 5.1 s (≈7.8K tok/s prefill) ✓, no degenerate repetition. **The 740B model works on 4× GB10.** 5. DCP4 first boot: `DCP sparse indexer currently supports only cp_kv_cache_interleave_size=1 (got 4)` — the x4 interleave is a Flash dense-MLA rule, not the DSA top-k path. Recipe fixed to interleave 1, rebooting. DCP4 512K pool estimate: 8 GiB/rank ÷ (52.7 KB/token ÷ 4) ≈ 650K tokens ≥ 524288 ✓. Then smoke + dev65 bench `dev65-full-mxfp4-dcp4`, then P2. --- ## Night shift results (final, 2026-09-14 ~02:45 UTC) ### P0 — full GLM-5.3 (RedHatAI MXFP4, ~740B) on 4× GB10: WORKS (131K lane) Booted, smoke-passed, benched (label `dev65-full-mxfp4-131k`, report in `recipes/glm53-full-mxfp4-4x-probe/reports/`): - **Quality 158/176 (90**, their 100-scale "91 Excellent", 1 safety warning TC-51, 87/88 scored). - **Perf pp2048/tg128**: d0 c1 **934 pp / 19.0 tg / 2,124 ms**, c2 867/26.5/ 3,185; d4096 c1 896/22.6/6,285; d8192 c1 877/22.8/10,406. - KV: **52.7 KB/token/rank** (fp8_ds_mla), pool 159,232 tokens per 8 GiB pin, max concurrency 1.21× at 131K. Load ~10 min at ~600 MB/s from NAS. - MoE = MarlinExperts (scheme's own pick; `--moe-backend` is inert for the compressed-tensors path), linear = Marlin via `--linear-backend marlin` (the b12x warmup crashes on this checkpoint's shapes; the flashinfer kernel wrongly claims sm_12x support — both documented in the recipe). - **512K is BLOCKED on 4×**: DCP4 is the only way 512K fits (26.3 GiB aggregate KV), and the DCP>1 sparse-decode path crashes identically on BOTH r35 and r37: after "DCP sparse indexer currently supports only cp_kv_cache_interleave_size=1 (got 4)" → interleave=1 → graph-capture dummy run dies in deepseek_v32/attention.py:596 with "shape '[16, 16, 512]' is invalid for input of size 524288" (the ×4 DCP factor; the dcp_manager.combine path is gated on use_pcp, which we do not set). Upstream bug to file with the lab. The 512K route for this model is the LMCache RAM/FS tiers (P4a below) or the DCP fix. ### P2 — R37 DS4.1 on 4×: prefill champion, quality regressed (Report `recipes/dsv41-flash-jovian-r37-4x/reports/`, label `dev65-r37-ds41-4x`; image label 9350429b, built on dgx5, 37 min.) - **Perf**: d0 c1 **3,830 pp / 46.4 tg / 832 ms** vs prod 1,642/47.0/1,738 → **prefill +133% (2.3×), TTFT 2.1× better, decode flat** (the dispatch removal is a prefill win; the lab measured it on RTX, GB10 matches and beats). c2: 2,688 pp / 71.8 tg. - **Quality 150/176 (85), safety-capped** (4 warnings: TC-51/74/82 + one more — the same long-horizon cluster as the r36 K7 run). - **Verdict: eugr DS4.1 (nightly-20260910) stays prod of record for agent quality; R37 is the prefill/batch champion** (long-context, low-interactivity workloads, or until the quality regression is fixed). ### P3 skipped (eugr nightly-20260913 A/B) The marginal nightly diff is not worth pulling an unverified external image in the last hours before teardown; R37 already answers the "newer tree" question decisively. ### Teardown - dgx5 powered off ~22:33 UTC (operator authorized, at shift start). - 4nodes-switch: R37 lane stopped, then `sm121 power off --cluster 4nodes-switch` (operator's instruction for end of shift). No prod restore — the operator re-serves manually in the morning. ### Morning recommendations (priority order) 1. **File the DCP>1 sparse-decode bug** (repro: full GLM-5.3 MXFP4, DCP4, interleave 1, both r35 and r37 images; exact messages above) — this is the only thing standing between the full model and 512K on 4×. 2. **512K via LMCache tiers** on the full model (the lab's own pattern: small GPU KV + 64 GiB L1 pinned shm + /cache FS; check host /dev/shm capacity first — Docker --shm-size does not resize host shm). 3. **R37 as the prefill lane** for batch/long-context; keep eugr for agent traffic. A/B an eugr nightly that inherits the r37 dispatch work if/when the lab merges it. 4. The b12x-mxfp4-linear warmup rank bug + the flashinfer is_supported sm_12x false-positive (both workarounds are in the recipe; file both). 5. Push all local commits when git.kilork.org recovers. --- ## Morning shift (2026-09-14, ~05:50-07:00 UTC) ### Operator request: bring prod up; R37 makes suspicious typos "как будто оно не попадает в лексику" — check that nothing was exported/quantized/ serialized wrong. ### Finding 1: R37 tree runtime-quantizes the LM head by default (NOT the cause, but real) - `envs.py`: `VLLM_MXFP8_LM_HEAD` default **"1"** — "Quantize eligible unquantized LM heads on b12x by default; =0 opts out." Implementation: `model_executor/layers/vocab_parallel_embedding.py` (sets `runtime_lm_head_quantization = "mxfp8"` for unquantized, untied LM heads). - The eugr/tonyd2wild prod image (nightly-20260910 base) has NO such feature — prod runs a BF16 head. Added `VLLM_MXFP8_LM_HEAD = "0"` to the R37 recipe (commit 902e989). Boot without the "Quantizing LM head shards to MXFP8" line = opt-out confirmed; KV pool shrank 10.39M -> 10.19M tokens (head now BF16 = more memory) — indirect confirmation. - **But the typos persist** with the BF16 head (verbatim/greedy probes below). ### Typo evidence (R37 lane, temp=0 greedy, ~06:20 UTC) Long 300-word Russian generation: "данних. Етот цыфровой оазис среди вечной мерзлоти... навикации... иследований... критically важной точкой опори... видлели колосальное количество енергии" (10+ mangled words in ~150 words). Code sample: "возврощает", "валідный" (Ukrainian і), "должин быть словарём". Identifiers check: all 5 near-identical config keys emitted correctly (code structure intact; it's the vocab surface layer that wobbles). ### Bisect (in progress at 06:30) Flag diff vs every clean lane: R37 contract uniquely adds `--linear-backend b12x` (prod: b12x MoE only, default linear; GLM r35 clean lane: B12X attention + instanttensor, default linear). Boot A = r37 image WITHOUT `--linear-backend b12x`. If typos persist -> Boot B: prod's spec config (K5 probabilistic/block, adaptive off) instead of K7 greedy/standard/adaptive-on; Boot C: full prod arg set on the r37 image (tree vs contract). ### Naming correction (operator question) Our prod 4x image is NOT eugr: `dsv41-flash-b12x:local` = thin wrapper over `dsv41-flash:local` = digest-pinned `vllm/vllm-openai` arm64 nightly + tonyd2wild overlay chain (dsv41-feat@e47aa780 + 7 boot-10 patches + FlashInfer 0.7.0rc1, all built in this repo). "eugr" was my sloppy label inherited from the `deepseek-v4-flash-eugr*`/`glm53-flash-*eugr*` lane naming; from now on: "DS4.1 prod" for the tonyd2wild lane, "eugr" only for the eugr-image lanes. ### Boot D interrupted: cluster-wide outage (~07:27 UTC) During Boot D (r37 + prod contract, engram off), all 4 nodes went unreachable mid-load (~3 min after container start): "Host is down" / "No route to host" from the live gateway (192.168.88.1 up), HA (192.168.88.232) alive but returning 401 to the known token. Earlier in the window one ping to dgx1 got through (1/2, 2 ms) - the nodes died abruptly, not degraded. All 4 boxes at once, in the middle of a 4x parallel NFS load. Suspects: PDU/segment power trip, or a physical event; nothing sm121 did can take a node's management NIC down (the serve had already passed container start and was at the API-wait stage). Polling for recovery; Boot D test is the only remaining bisect step. HA check (~07:38): switch.dgx1-4 = ON, sw6_mt/sw7_fan ON (dgx5-8 off as expected). So the nodes are powered but the 88.x management path is dead - either the nodes hung/crashed under load (powered but kernel dead) or the management segment/switch failed. Cannot distinguish from the Mac (no route to 200.x). Physical check needed: power-cycle the nodes or check the management switch. ## GLM-5.3 eugr 2x re-bench (2026-09-14 ~09:20 UTC, dev66-glm53-eugr-2x-0910) Operator redeployed `glm53-flash-eugr-2x` on dgx1+dgx2 (2nodes-dac) after the outage (he powered on only 1+2; dgx3/4/5 stay off by choice). Same image as the 09-11 run: eugr/spark-vllm-b12x:nightly-20260910, model local-inference-lab/GLM-5.3-Flash-NVFP4-Spark, 1M ctx, KV pool 1,162,277 tokens. Result: **161/176 (91, ★★★★★)**, 1 safety warning (TC-51, same as the other lanes). Perf d0 c1: **1,326 pp / 28.1 tg / 1,458 ms TTFT** (c2: 1,308/33.9/ 2,157); d4096 c1 1,663/30.5/3,369; d8192 c1 1,762/31.8/5,297. vs anchors: eugr 2x 09-11 166/176 (same stack, -5 = variance); r28 2x (our image) 158/176, 1,475 pp / 27.2 tg / 1,362 ms — eugr wins quality, r28 wins prefill by ~11%, decode/TTFT near-tie. Verdict unchanged: eugr 2x = quality lane, r28 = prefill lane (2x). Also this morning: report/web "running" status was stale for the r37 lane — the run-ledger (.lock) `running` record from the killed Boot D serve was never closed (sm121 stop can't verify with dgx3/4 offline). Closed the record per mark_stop semantics + docker rm'd the exited r37 containers on dgx1/2. Systemic options on the table: (1) report cross-checks ledger against the live probe, (2) `sm121 runlock close ` offline command. ## Report stale-status + sm121 runlock (2026-09-14, ~11:40 UTC) Operator asked for both fixes after the r37 false-"up": 1. `sm121 report --serve` now cross-checks the run ledger against a live fleet probe every refresh tick (30 s, only when an open run exists): an open run whose recipe has no running container on any reachable node is rendered orange "stale" with a `sm121 runlock close ` tooltip instead of green "up". Inconclusive (unknown cluster, unreachable node) stays green. tmux deploys are never probed. `src/report/stale.rs` (mark_stale + 4 unit tests), serve.rs refresh hook, page.html state cell. 2. `sm121 runlock list|close ` — offline ledger management (the `mark_stop` file op without node verification). RunlockCommands lives in runlock.rs (cli.rs at the 500-line cap). All gates green (310 tests). Live-verified: eugr 2x shows up (probe sees the containers), r37 shows stopped.