Browse Source

history: 09-25 shift — MiMo-V2.6-Pro-RL 8x bring-up (build, sync, serve from NAS, smoke pass)

Alexander Korolev 4 weeks ago
parent
commit
759910ef68
1 changed files with 71 additions and 0 deletions
  1. 71 0
      history/night-shifts/2026-09-25.md

+ 71 - 0
history/night-shifts/2026-09-25.md

@@ -0,0 +1,71 @@
+# Shift 2026-09-25 (day) — MiMo-V2.6-Pro-RL 8× Spark bring-up
+
+## Context
+
+User: new model to try on 8 nodes — rhys101's SGLang variant of the NVIDIA
+forum thread 384064 (github.com/rhys101/MiMo-V2.6-Pro-RL-Spark-8, build a14).
+Also: user reverted dgx1's HF symlink to the NAS (NAS is back, 7.4T with data),
+and wiped all docker images from dgx1.
+
+## Power + state survey
+
+- All 8 nodes powered on (`sm121 power on --cluster 8nodes-switch`, HA relays
+  incl. sw6_mt for the MikroTik). NAS read speed single-stream ~171 MB/s.
+- Symlink matrix: dgx1 → NAS (user-fixed); dgx2–4 → hf-local (as before);
+  dgx5–8 → NAS (never changed). `--hf-cache` flag (new, `51b7404`) makes the
+  symlink question moot for a given serve.
+- Images: dgx1 wiped (only sglang dev-qwen38-next-local left); dgx2 the
+  richest (r35/r38/r39/lab/karmic); dgx5–8 stale (r27/r35/r36/r37 + dsv41).
+
+## MiMo bring-up (rhys101 repo @ 2f3e5fd, build a14)
+
+- Model already on the NAS: `XiaomiMiMo/MiMo-V2.6-Pro-RL` @ `73875d00` (the
+  exact pinned revision), 146 top-level files, `dflash/` subfolder present.
+  Not on any node locally (535 GB/rank would not fit on dgx1–3/5 anyway).
+- Vendored the build tree into `docker-images/mimo26-spark/` (Dockerfile +
+  12 patches + third_party/b12x + runtime + fp8 tile tables + versions.env
+  pinning the base digest + versions.lock.json). `d5663ec`.
+- Recipe `mimo26-pro-rl-8x`: sglang, TP8 (launcher-generated via
+  `distributed_backend = "mp"`), all of the repo's SERVE_ENV flags as `args`,
+  `{{dflash}}` path ref for the draft weights, env: SGLANG8_ROCE_ALLREDUCE +
+  MIMO26_* + NCCL extras.
+- **TOML trap hit (again):** `args = [...]` written after `[[extra_mounts]]`
+  parses *into* the extra_mounts table — args silently dropped from the
+  docker command. Reordered (bare keys first). Lesson: in recipe TOML, bare
+  keys always precede table headers.
+- Launcher change: dry-run `--speculative-draft-model-path` now shows the
+  raw `{{name}}` placeholder (the old "descriptive path" was substituted
+  into the dry-run command, misleading); `substitute_path_refs` skips a
+  name==path pair. Removed dead `path_ref_placeholder`.
+- Build on dgx4.lan: 14m20s, label `5b92eae1`. Note: `--build-node dgx4`
+  does NOT work — node names carry the `.lan` suffix (`dgx4.lan`).
+- Sync dgx4→7 peers sequential, ~4.5–6 min each (~35 min total).
+- Serve with `--hf-cache /mnt/nas/ai/huggingface --keep`: all 8 containers up
+  at 10:44. Model loads **from the NAS per rank** (535 GB each, ~110 MB/s
+  per rank, ~1h+ wall). The launcher's 1800 s readiness wait timed out as
+  expected (run closed at 1801 s in the ledger — cosmetic; containers stay
+  with `--keep`). API came up on its own.
+
+## Smoke (all pass)
+
+- Text + reasoning split: reasoning/content channels clean, `mimo` parsers OK
+- Tool call: `get_weather({"city":"Paris"})` exact
+- Vision: red/blue 64×32 test → "Red" (correct; image_tokens 8)
+- Decode: **~50 tok/s C1** (512 tok, two runs: 50.0 / 49.6) — consistent with
+  the repo's a13 C1 per-category range (prose 40.3 … format 99.5, mean 69.1)
+
+## Next / open
+
+- Run ledger closed (1801 s timeout); `sm121 stop` still works via labels.
+- Candidate follow-ups: node-to-node fan-out of the model for fast re-boots
+  (fits only on dgx4/6/7/8 + tight elsewhere); bench (repo's mimobench.py vs
+  our tool-eval-bench); C8 aggregate.
+
+## Ops notes
+
+- `--build-node` takes the full node name (`dgx4.lan`), not the bare host.
+- A serve that outgrows the 1800 s readiness wait fails the launcher but,
+  with `--keep`, leaves the containers running and the API functional.
+- py-spy (pip in-container) + `cat /proc/<pid>/io` is the fast way to tell
+  "loading slowly" from "stuck" — check the WORKER pid (sglang::scheduler_TP0),
+  not the parent (pid 54) which only reads config.