Plan (user): DSV4.1-Flash base → NAS, stop MiMo Pro 8x, MiMo-V2.6-Flash-RL 2x (SGLang), time permitting Qwen Int4 1x / Aiden DSV4.1 4x, full power off at the end of the shift.
hfrs download of deepseek-ai/DeepSeek-V4.1-Flash (510 GB)
found already running on dgx1 (PID 677687); my duplicate hf process killed
(lock-blocked). Final state on NAS: 476G, 48 safetensors,
refs/main = dba1be0a40aa45a94ad051997016db3960a90277
(/mnt/nas/ai/huggingface/hub/models--deepseek-ai--DeepSeek-V4.1-Flash).sm121 stop --recipe mimo26-pro-rl-8x --cluster
8nodes-switch); nodes freed.mimo26-flash-rl-2x, mimo26-spark:a14,
model staged on dgx1+2 local, 166 GB each): first boot failed
("SG17 RoCEnante requires the TP8 Gloo exchange group") → removed
SGLANG8_ROCE_ALLREDUCE from the recipe env. Boot OK: KV 340,736 tokens,
ctx 327680. Smoke OK (math, tools, needle 132K ×2, code C1 71.7-78.7 t/s vs
vLLM ref 70.5). Bench: 161/176 (91/100, ★★★★★) — TC-74 (safety-critical)
failed. Report recipes/mimo26-flash-rl-2x/reports/2026-09-25_231142_sglang-2x-first.*.
Committed+pushed (5bd465a). Stopped to free dgx1+2.dsv41-flash-4x-sglang-aiden16): image
aidendle94/sparkrun-sglang-dsv41-gb10:production-1.6 (33.3 GB) pulled on
dgx4 → synced to dgx1-3. Full flag/env set extracted from the aidenle.com JS
bundle./opt/nvidia/nvidia_entrypoint.sh
(banner + exec "$@") — args pass through, not the culprit.[[extra_mounts]] block landed before
args = [...]; the bare args key silently parsed into the table and was
dropped (the recipe served with no flags — server_args showed all
defaults: ep_size 1, mem_fraction 0.885, no speculative). Fix: [[…]]
headers after all bare top-level keys. (Already documented in AGENTS.md
"TOML section order".)SPARK_ENGRAM_ROWS ranges to tile [0, N) exactly per layer — layer 1 has
384,006,168 rows, layer 14 has 384,016,682 (384016682/4 is not integer).
The wrapper (repo: recipes/dsv41-flash-4x-sglang-aiden16/aiden4x-launch.sh,
deployed to /home/kilork/aiden4x-launch.sh on dgx1-4) reads both N from
the checkpoint's safetensors headers at launch and tiles floor/ceil.Booted: 524K ctx, EP4+TP4, dsv4 attention, DSpark block 5, fp8 KV, KV pool 9.5M full tokens/node (Aiden's fleet: ~4.2M). Smoke: count-20 exact, tools OK, 155K-token needle OK.
return_token_ids=true + stream=true → HTTP 400 on this SGLang build
(sgl-project/sglang#30917). tool-eval-bench already works around it for
sglang backends (--extra-body return_token_ids=false), so the bench's
requests were valid.libengram_rows.so; a fresh context
touches thousands of new rows, each a random NFS read. Prefix-cached
repeats touch cached rows → fast.engram_local.py). Agent traffic (short, repeated system prompts)
sits in the cached regime and is fast; long fresh-context loads are slow.
The committed perf table for this lane reflects the fresh-context penalty.
If the lane becomes production, either accept the penalty or obtain
Aiden's local-copy setup.--perf-only, label aiden16-perf-rerun): 189 t/s d0
c1 (same pattern), confirms it's systematic, not a one-off.qwen38-flash-next-int4)azampatti/Qwen3.8-Flash-Next-125B-A5B-INT4-AutoRound (122 GB,
123 files) downloaded on dgx5 (the node's hf CLI was missing →
uv tool run hf — first attempt lost, hf: command not found).hf download on this node wrote
/home/kilork/hf-local/models--… (top level, no hub/). The mod expects
hub/models--…/refs/main → added a relative symlink
hub/models--… → ../models--…. An absolute symlink dangles inside the
container (the mount root differs: host /home/kilork/hf-local vs
container /root/.cache/huggingface).recipes/qwen38-flash-next-int4/mods/
flashnext-int4-b12x/: run.sh, build_views.py, patch_b12x.py,
vllm_fp8_hybrid.py) — launcher uploads it per node and mounts /mods:ro;
it checks the snapshot, builds /workspace/flashnext/{model,draft-k10}
(symlink views + small JSON, zero copy) and patches the container's vLLM
(fp8-hybrid, int4-head, index-filter, draft-scale, fla fixes).model as the
positional arg; with model = "<repo id>" + args[0] = "/workspace/…"
vLLM got two positionals (unrecognized arguments: /workspace/…). Fix:
model = "" (the launcher skips the positional) + the view in args.dba1be0a).reports/.uv tool run hf on a node without the hf CLI works (installs
huggingface_hub in an ephemeral env); a plain hf in a nohup bash -c is
not on PATH → "command not found", and the download "completes" instantly
with 0 bytes (check the log, not just the .done file — this one wrote the
.done from a failed wrapper).hf download --cache-dir <dir> on this node's huggingface_hub version
creates a legacy layout (no hub/ subfolder) — plan the symlink
accordingly; keep container-visible symlinks relative.return_token_ids + streaming is a
hard 400 (was ignored before sgl-project/sglang#30917); tool-eval-bench
v2.7.0 handles it.User re-engaged: finish the two recipes (Aiden + Qwen) with complete results, then the new EXL3 2x task (temporary 2 GB headless-RAM unlock via recipe scripts).
#
on line 29 → tomllib Expected '=' after a key. Repaired, validates
(38 args / 40 env).--json-file implies --json → _run_json dispatch path drops
throughput_samples → the "## Throughput Metrics" section is absent from
the md (and the perf data from the JSON); the table survives only in the
.log. Fixed launcher-side: src/bench_report.rs
(ensure_throughput_section) re-attaches the llama-benchy table parsed
from the bench .log into the copied .md (harness pin untouched).
Retroactively applied to the Aiden …_015216 and Qwen …_022931 reports.
Commit 4546237.dsv41-flash-exl3-2x, coolbho3k rc2 image
ghcr.io/coolbho3k/deepseek-v4.1-flash-exl3-3bpw-2x-dgx-spark:20260917-rc2):
/mnt/nas/ai/huggingface/hub/…, hub layout). The 2x pair serves from
the NAS; drafter overlay coolbho3k/DeepSeek-V4.1-Flash-DSpark-EXL3-3bpw
downloaded too (small, done first).878e0ee):
model must be mounted at exactly /model (drafter in /model/draft,
engrams in /model/engrams), drafter overlay at
DS41_DRAFT_EXL3_PATH=/draft-exl3, engine call
serve.py serve /model --config conservative.yaml --worker-cls
combined_worker.CombinedWorker --disable-custom-all-reduce …, hard
serving cgroup guard (9 GiB / no-swap / ≤6 CPU), 2 GB display reserve
(nvidia_drm modeset=1 fbdev=0) for the 1.75 GiB display-pool KV.devices = [...]
(--device d:d), memory_limit/cpus (→ --memory/--memory-swap/--cpus),
built-in scripts unlock_display_ram / restore_display_ram (temporary
per-boot remod, no UEFI/modprobe.d/initramfs changes; restore on stop),
--cluster auto now honors recipe.cluster on the docker path (tmux
path already did — parity fix)./home/kilork/exl3-model → current refs/main snapshot) bound ro at
/model / /draft-exl3; 41 DS41/NCCL envs; 200G pair dgx1+dgx2
(powered on for this), 1M ctx, GMU 0.92, C2.qwen38-flash-next-int4, dgx5, port 30000, qwen3.8)User report: model works for a while, then emits random numbers/garbage; "appears around 30% of the context"; still happening at report time.
Investigation (controlled repro attempts, all via API on 192.168.88.43:30000):
content=null cases in early probes were my own artifact: max_tokens
(50–80) truncated the reasoning channel (105–145 tokens) before content.VLLM_MARLIN_USE_ATOMIC_ADD=1 (experimental Marlin
atomic-add path, n<2048/k≥2048 layers) — kernel analysis: slice-0 zeroes
the torch::empty output then sets a lock, other slices atomicAdd after
a lock wait; zeroing→lock write lacks a GPU memory fence → potential
race. A/B (restart each way): perf within noise (decode 47.5 vs 51.9
tok/s, conc1 339 vs 303, conc4 253 vs 195), quality 0/40 both states →
not conclusively the cause; flag left as the recipe shipped (1)./tmp/qwen_monitor.py (probe every 2 min →
/tmp/qwen-monitor.log) as a tripwire.Standing: if garble recurs, need exact time + a sample to correlate with engine log / dmesg. dgx3 kept up as hot spare (was off before).
Prebuilt external image missing on the target node → docker run silently
pulls from Docker Hub over the internet → the launcher's SSH command timeout
kills the pull ("context canceled" in dockerd) but the serve still logs
"✅ VLLM started" and waits 1800 s for an API that never comes. Needs a
pre-run image presence check (or node-to-node sync) + honest error.
config.toml 1node-4 node entity was switch.dgx3 (copy-paste) → fixed to
switch.dgx4 (the 1node-3 node keeps switch.dgx3).
Root cause (after ~10 red herrings: NFS dentry races, concurrency, cgroups,
launcher-flag diffs — all disproven by flag-for-flag replicas): the DS41
runtime opens the shard files with O_NOFOLLOW (ssd_vocab_rows.py:68
os.open(self.path, O_RDONLY|O_CLOEXEC|O_NOFOLLOW)). With symlink-based
staging, the final path component IS a symlink → open(2) returns ELOOP
("Too many levels of symbolic links") deterministically — the kernel's
ELOOP for O_NOFOLLOW, not a loop at all.
Fix: no symlinks in the container. New recipe field
extra_mounts_manifest = "/tmp/sm121-exl3-mounts.txt": the before-serve hook
generates a per-node host<TAB>container list (one bind per real file,
161 model + 10 draft entries, resolved to the final hub blob), the launcher
reads it over SSH after the hooks and appends it as read-only binds. The
container sees regular files only → O_NOFOLLOW is satisfied.
Result: EXL3 2x boots (shards stream from the NAS, ~15 min), API live on
dgx1:30000 as deepseek-v41-flash-exl3, smoke 127×89 + Paris correct.
The intermittent Qwen garble (empty replies, degenerate text, special-token leakage in tool-call markup) was tracked all day. The trail:
stopReason: stop at 36-229 tokens (the model stopped itself
mid-degeneration). Engine logs at those moments: no warnings, no Xid, no
OOM.qwen-min / qwen-prod entries.eugr/spark-vllm-b12x:latest, which we had pulled as
nightly-20260925 (digest c9e22735). The validated pin
(azampatti repo config.env) is nightly-20260913 (8e7e0621). So every
nightly from 09-14..09-25 is suspect; the 165/176 bench ran on the
suspect image (the 88-scenario pool just doesn't hit the degenerate tail).Fix: both Qwen boxes now serve the pinned digest (pulled node-side, ~25 GB
each), recipe docker_image pinned with a comment (no floating tags),
bench baseline params restored (MTP k=4, atomic-add 1). Launcher fix:
get_image_digest now accepts digest refs (docker image ls silently
returns nothing for @sha256: refs — would have made every pinned prebuilt
recipe fail). Re-bench pending (label int4-auto-1x-pinned).
Verdict: re-bench on the pinned image scored 94/100 (164/174) — same quality as the suspect-image baseline (93), so the fix costs nothing. The user's live agent session on dgx5.lan has since run clean ("works like a clock") — the long-context degeneration that had hit ~5 sessions/day is gone. dgx3.lan turned off after the bench; fleet: dgx5 (qwen3.8, pinned) + dgx1/2 (EXL3 2x) live.