Просмотр исходного кода

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 месяц назад
Родитель
Сommit
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,
 **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;
 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.
 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
     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
     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
     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,
   - `raw {kind: config|recipe:name|effective}` — verbatim content, monospace,
     copy button, JSON pretty for `effective`.
     copy button, JSON pretty for `effective`.
 - **Window manager** (vanilla, `ui.html`): absolute windows, drag by
 - **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) } }
   @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; }
   #bell.ring svg { animation: ring 0.6s ease; transform-origin: 50% 0; }
   .dim { color: gray; }
   .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 h1 { display: none; }
   body.embed #bar { margin-top: 8px; }
   body.embed #bar { margin-top: 8px; }
-  body.embed #live:not(.dim) { display: none; }
+  body.embed #live { display: none; }
 </style>
 </style>
 </head>
 </head>
 <body>
 <body>

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

@@ -355,8 +355,8 @@ ok(
   (await recipes.locator("h1").isVisible()) === false,
   (await recipes.locator("h1").isVisible()) === false,
 );
 );
 ok(
 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(
 ok(
   "recipes: embedded page keeps its filter controls",
   "recipes: embedded page keeps its filter controls",