ソースを参照

agents: re-cut measured results + node-to-node transfer / hf-cache / pkill gotchas

Alexander Korolev 1 ヶ月 前
親
コミット
20a3c768c9
1 ファイル変更、42 行追加、0 行削除
  1. 42 0
      AGENTS.md

+ 42 - 0
AGENTS.md

@@ -530,6 +530,30 @@ fork) measured ~2.3× slower on this box despite the forum's 52-87 tok/s claims
 `specs/tech-architecture/qwen38-recipe-state.md` for the full measured matrix,
 why each decision was made, and how to re-benchmark.
 
+### GLM-5.3-Flash NVFP4 re-cut (measured)
+
+`local-inference-lab/GLM-5.3-Flash-NVFP4` was **re-cut in place on 2026-09-16**
+(the old ~186 GB upload is gone): 199.4 GB = 36 expert shards + 4 nonexpert +
+4 MTP shards. Structure is identical to the Spark checkpoint (verified from
+`model.safetensors.index.json`): `model.language_model.layers.*` with SPLIT GDN
+naming, a `model.visual.*` tower (skip via `--language-model-only`), MTP head
+embedded at layer 45 — so the JJ-fork engine requirements are the same as the
+Spark lanes (r35 + `VLLM_DISABLED_KERNELS`; r38 pool-deadlock on 2x still
+applies). Lanes: `glm53-flash-nvfp4-lab` (2x, same dir as the old pre-re-cut
+lane — it had no reports/lock) and `glm53-flash-nvfp4-lab-4x` (4x).
+
+Measured 2026-09-20 (r35, harness dev65, seed 42, hardmode):
+- **2x: 164/176 (93/100) — the family best** (old 186 GB cut: 89/100; Spark r35
+  2x: 92). The operator's "they improved it" hunch was right. But the re-cut is
+  heavier: ~99 GiB weights/rank leaves only **2.4 GiB KV at GMU 0.88**, which
+  cannot hold one 524K request (needs 3.73 GiB) → the 2x lane is capped at
+  **256K context** (needs ~1.9 GiB; bench contexts are far below that).
+- **4x: 159/176 (90/100)**, decode 54-68 t/s (2× the 2x), KV 49.3 GiB →
+  7.35M-token pool @524K. The 4x loses 5 pts to the 2x (TC-43/45/49/68/80/88
+  flakes); TC-51 fails on both (known harness recurring).
+- Weights live on all 4 nodes' local NVMe (`hf-local`, snapshot
+  `175ae8ce`); dgx1 is the tightest host (~55 GB free after the model).
+
 ## Config fields
 
 Config resolution: `--config <path>` > `./config.toml` (cwd) > the global
@@ -613,3 +637,21 @@ the detect command per node and renders `NCCL_IB_GID_INDEX=auto`.
 - **Clippy warnings**: solve by refactoring the code (extract structs, reduce arg count, restructure logic). Do **not** add `#[allow(...)]` attributes. If the only viable fix is an allow attribute, consult the user for guidance.
 - **tool-eval-bench runs happen in a separate working dir, never in this repo** — its output (e.g. `data/benchmarks.sqlite`) is not for this repo; a stray run here pollutes the working tree. Campaign **reports** ARE committed, next to the lane they benchmark: `recipes/<name>/reports/<UTC-stamp>_<label>.md` (copied from the tool's runs dir) **plus the raw JSON** — pass `--json-file <abs repo path>/recipes/<name>/reports/<UTC-stamp>_<label>.json` in the run command (absolute path: the bench runs in a separate cwd; the flag also keeps stdout clean for the `.log`); same base name for both. Quality-gate semantics are version-sensitive (`--hardmode` = 69+19 = 88 scenarios in 2.6.1.dev45; the older 176-pt pool is retired) — see the bench header in `specs/tech-architecture/glm53-recipe-state.md`; re-baseline the anchor lane before comparing new lanes.
 - **Harness version is pinned — do not `uv tool upgrade` casually.** `tool-eval-bench` is a uv tool (`~/.local/share/uv/tools/tool-eval-bench`) installed from `SeraphimSerapis/tool-eval-bench.git`; the receipt is rev-pinned at `6be685f0e` (v2.6.1.dev65, the campaign baseline since 2026-09-11 — the 167/176 record run is on it). The 19 dev46→dev65 commits (09-06..09-08) were **scoring-credit fixes** (correct behavior was being failed), so dev46 baselines (all GLM lanes: r28 158, r31 159, sparkring) read slightly low next to dev65 runs; cross-harness deltas include that bias. Reports stamp the harness version in the header — **A/B runs must share a harness version**. To move the pin deliberately: `uv tool install --reinstall --force "tool-eval-bench[tui,perf] @ git+https://github.com/SeraphimSerapis/tool-eval-bench.git@<rev>"` then re-baseline the anchor lane.
+- **Bulk data moves node-to-node, never through the Mac** — the Mac→node link
+  is ~32 MB/s (a 200 GB transfer via the Mac takes hours); node-to-node over the
+  200G fabric does ~547 MB/s per stream. Node-to-node SSH works (the shared
+  key is on every node; `ssh kilork@<200.x-ib-ip>` from a node; dgx4 has two
+  RoCE IPs — 200.19 *and* 200.20 — use the `ib_ip` from config). Pattern for a
+  large HF download: one `hf download` on the roomiest node (dgx4, 1.9 TB),
+  then each target PULLS: `nohup bash -c "ssh <node> 'tar -hcf - -C <modeldir> snapshots trees refs' | tar xf - -C <modeldir>" &` (`-h` dereferences so targets don't need the hub blob layout). `hf download` on a node = `~/.local/bin/hf` (dgx2) or `uv tool install huggingface_hub` (others).
+- **huggingface_hub ≥0.34 (the `hf` CLI) moved blobs to the hub level** —
+  `hub/blobs/<xx>/<sha>` shared across models, per-model dirs are symlink trees
+  (snapshot → per-model blob → hub blob). `du`/`find -type f` on a model dir
+  only sees the small real files (~19 GB of the 199 GB) — judge completeness
+  by `df` deltas or hub-level `du`. The 09-20 re-cut download migrated dgx4's
+  cache layout this way (the Spark model there is hub-blob-backed now).
+- **`pkill -f` over ssh self-matches** — the pattern also matches the remote
+  shell's own `-c` command line, so `pkill -f "hf download"` kills the script
+  itself mid-run (and a `nohup … hf download …` line in the same command makes
+  the later pkill match again). Use the `[b]racket` trick for the pattern and
+  run kill and launch in separate ssh calls.