2026-09-25.md 3.7 KB

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_ROCEALLREDUCE + 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.