Переглянути джерело

night plan: R37 image built+distributed (label 9350429b) and the MXFP4 checkpoint complete on the NAS - both lanes ready, switch needs the go-ahead

Alexander Korolev 1 місяць тому
батько
коміт
501e627b2b

+ 40 - 0
history/night-shifts/2026-09-13.md

@@ -286,3 +286,43 @@ 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.

+ 4 - 4
specs/tech-architecture/web-dashboard.md

@@ -153,10 +153,10 @@ UI outgrows ~2–3k lines.)
     rewrites the page's own absolute paths, its SSE stream and viewer links
     move with it, and marks the body `embed`) so there is one implementation
     of the panel, not two. The *hosted* copy drops its own `<h1>` branding
-    (the window bar names it) and shows its live chip only when the stream is
-    broken — the panel and the dashboard are two independent SSE streams
-    (`/recipes/events` refreshes report rows, `/events` the fleet), so the
-    chip is a fallback, not a duplicate.
+    (the window bar names it) and its live chip entirely: `/events` and
+    `/recipes/events` are two streams of the **same** axum server, so their
+    liveness can never disagree — the dashboard header owns the indicator,
+    the panel would only duplicate it.
   - `raw {kind: config|recipe:name|effective}` — verbatim content, monospace,
     copy button, JSON pretty for `effective`.
 - **Window manager** (vanilla, `ui.html`): absolute windows, drag by

+ 5 - 5
src/report/page.html

@@ -51,13 +51,13 @@
   @keyframes ring { 0% { transform: rotate(0) } 20% { transform: rotate(13deg) } 45% { transform: rotate(-11deg) } 70% { transform: rotate(6deg) } 100% { transform: rotate(0) } }
   #bell.ring svg { animation: ring 0.6s ease; transform-origin: 50% 0; }
   .dim { color: gray; }
-  /* Embedded in the dashboard's Recipes window: the window bar already
-     carries the title and the dashboard header carries the live indicator,
-     so the page drops its own branding and shows its live chip only when
-     the stream is actually broken. */
+  /* Embedded in the dashboard's Recipes window: the window bar carries the
+     title and the dashboard header carries the connection indicator. Both
+     SSE streams come from the same server (only the paths differ), so the
+     panel's own chip can never disagree with it — it is pure duplication. */
   body.embed h1 { display: none; }
   body.embed #bar { margin-top: 8px; }
-  body.embed #live:not(.dim) { display: none; }
+  body.embed #live { display: none; }
 </style>
 </head>
 <body>

+ 2 - 2
src/web/ui.playwright.mjs

@@ -355,8 +355,8 @@ ok(
   (await recipes.locator("h1").isVisible()) === false,
 );
 ok(
-  "recipes: embedded page hides the live chip while the stream is fine",
-  (await recipes.locator("#live").isVisible()) === false,
+  "recipes: embedded page drops its live chip (same server, same liveness)",
+  (await recipes.locator("#live").evaluate((e) => getComputedStyle(e).display)) === "none",
 );
 ok(
   "recipes: embedded page keeps its filter controls",