AGENTS.md: frank-primary section rewritten for the R9V cutover

Fleet topology row + full endpoint section now describe the R9V
radiance shape (on-host 104-key state, shim laws, launcher-driven
serve, docker-wait self-healing, measured numbers); llama.cpp section
retired into the runbook pointer. Bench note: mask fails on a relinked
unit symlink - stop is enough, redeploy restores.
This commit is contained in:
Frank
2026-09-27 04:39:30 -07:00
parent ca6ba6d0e9
commit efff47a75d
+66 -56
View File
@@ -24,7 +24,7 @@ merge absorbed the former `vllmScripts` repo, history preserved).
| Target | Service | Runtime | Model | Port | | Target | Service | Runtime | Model | Port |
|--------|---------|---------|-------|------| |--------|---------|---------|-------|------|
| Dankserver | `frank-primary` | unsloth llama.cpp b11030-mix prebuilt (ROCm gfx120X, bundled runtime, root systemd unit) | unsloth Qwen3.8-Flash-Next-GGUF Q_8 (175.30 GiB, 6 split parts) with the shared Q_8 MTP head (depth 2) chained behind `ngram-mod`, BF16 vision (mmproj), layer split `-ts 1,1` across both R9700s with the routed experts + 51B-param n-gram table computed in host RAM (`-ot exps=CPU,per_layer_token_embd.weight=CPU` — the shared-head borrow path needs the last), 262144 ctx single stream (1 slot), mmap on, `--cache-ram 16384` | 7770 | | Dankserver | `frank-primary` | R9V radiance-vLLM fork `drwolfen/radiance-vllm-qwen4exp` (docker-pinned image bundle `2dac17a2`, docker→podman shim, root systemd unit) | Dyluhn/Qwen3.8-Flash-Next-Uncensored-R9V-IQ4_XS (92.39 GiB, 3 GGUF shards) with the blockfp8 MTP4 head (depth 4) and F16 mmproj, TP=2 tiered experts (UVA pinned host copy 43 GiB rank 0 + 16 GiB PLE pinned reserve; PLE n-gram `ssd` mmap; budgets 146.25/78.75 GiB by device), CED on, 196608 ctx single stream, tool parser `qwen3_coder`, reasoning channel `reasoning` | 7770 |
| Dankclaw | `frank-large` | unsloth llama.cpp b11030 prebuilt (ROCm gfx1151, root systemd unit) | unsloth Qwen3.8-27B-GGUF:UD-Q8_K_XL (27B dense, 31.5 GiB) with the z-lab DFlash2 Q4_K_M drafter (depth 4) on the gfx1151 iGPU (Strix Halo LPDDR, 114 GiB GTT), 262144 ctx single stream (1 slot), q8_0 KV, text only | 7770 | | Dankclaw | `frank-large` | unsloth llama.cpp b11030 prebuilt (ROCm gfx1151, root systemd unit) | unsloth Qwen3.8-27B-GGUF:UD-Q8_K_XL (27B dense, 31.5 GiB) with the z-lab DFlash2 Q4_K_M drafter (depth 4) on the gfx1151 iGPU (Strix Halo LPDDR, 114 GiB GTT), 262144 ctx single stream (1 slot), q8_0 KV, text only | 7770 |
| Dankclaw | `frank-small` | mainline llama.cpp master 37b53fd (root systemd unit) | HauhauCS Gemma4-12B-QAT-Uncensored-Balanced Q4_K_M (BF16 mmproj + MTP assistant sidecar, `draft-mtp,ngram-mod`) on the RTX 3090, 1048576 pool / 4 slots of 262,144, q8_0 KV, the fleet's fastest vision endpoint | 7771 | | Dankclaw | `frank-small` | mainline llama.cpp master 37b53fd (root systemd unit) | HauhauCS Gemma4-12B-QAT-Uncensored-Balanced Q4_K_M (BF16 mmproj + MTP assistant sidecar, `draft-mtp,ngram-mod`) on the RTX 3090, 1048576 pool / 4 slots of 262,144, q8_0 KV, the fleet's fastest vision endpoint | 7771 |
@@ -231,9 +231,13 @@ merely wedged kernel usually still answers ARP.
`sudo systemctl stop frank-large && sudo systemctl mask frank-large` `sudo systemctl stop frank-large && sudo systemctl mask frank-large`
- Dankclaw `frank-small` (root unit, llama.cpp on the 3090): - Dankclaw `frank-small` (root unit, llama.cpp on the 3090):
`sudo systemctl stop frank-small && sudo systemctl mask frank-small` `sudo systemctl stop frank-small && sudo systemctl mask frank-small`
- Dankserver `frank-primary` (root unit, llama.cpp on the 2x R9700): - Dankserver `frank-primary` (root unit, R9V radiance on the 2x R9700):
`sudo systemctl stop frank-primary && sudo systemctl mask frank-primary` `sudo systemctl stop frank-primary && sudo systemctl mask frank-primary`
2. Bench. 2. Bench.
NOTE: `systemctl mask` FAILS on a relinked unit (the unit file in
`/etc/systemd/system/` is itself a symlink into the checkout — mask
refuses to replace it). Stop is enough for the bench window; the deploy
restores the unit, so re-deploy after benching instead of unmasking.
3. Unmask and start; verify `curl http://192.168.0.<host>:7770/health`. 3. Unmask and start; verify `curl http://192.168.0.<host>:7770/health`.
**CRITICAL:** never `systemctl disable` a system unit on these hosts — it **CRITICAL:** never `systemctl disable` a system unit on these hosts — it
@@ -341,66 +345,72 @@ ubatch 2048 OOMs the draft's pp buffer, and why draft depth 4 + poll
Runbook: `serverAppConfigs-docs/LLM/frank-small-gemma4-12b.md`. Runbook: `serverAppConfigs-docs/LLM/frank-small-gemma4-12b.md`.
Rollback: [[frank-small-qwen38-gsq-rco]]. Rollback: [[frank-small-qwen38-gsq-rco]].
### frank-primary — llama.cpp Qwen3.8-Flash-Next Q8_0 (Dankserver, ACTIVE) ### frank-primary — R9V radiance-vLLM Qwen3.8-Flash-Next-Uncensored IQ4_XS (Dankserver, ACTIVE)
unsloth llama.cpp **b11030-mix prebuilt** (ROCm gfx120X, commit `6ba30d05b`, The **R9V radiance-vLLM fork** (`drwolfen/radiance-vllm-qwen4exp`, docker-pinned
bundled ROCm runtime at `/home/dank/GitPackages/unsloth-llama-b11030/`, **root prebuilt image bundle `r9v-qwen38-flash-next-wmma@sha256:2dac17a2…`) serving
systemd unit** `scripts/frank-primary.service`, `User=dank`) serving `Dyluhn/Qwen3.8-Flash-Next-Uncensored-R9V-IQ4_XS` (abliterated weights,
`unsloth/Qwen3.8-Flash-Next-GGUF` at **Q_8** — 175.30 GiB across six split 92.39 GiB, 3 GGUF shards) with the blockfp8 MTP4 head (depth 4) and F16
parts under `/home/dank/models/Qwen3.8-Flash-Next-GGUF/Q8_0/`, fetched by mmproj on **both** Radeon AI PRO R9700s (gfx1201, BDFs `0000:03:00.0` /
`scripts/download-frank-primary.sh` (per-file sha256 + byte-count verified) — `0000:07:00.0`), one stream at **196,608 ctx**, **TP=2 tiered experts**
on **both** Radeon AI PRO R9700s. Replaced the Lucebox DS4.1 quadlet (hours (UVA pinned host copy ~43 GiB on rank 0 + 16 GiB PLE pinned reserve; PLE
old) on 2026-09-26, which had replaced radiance frank-medium the same day. n-gram table on `ssd` mmap residency; per-device offload budgets
146.25/78.75 GiB), **CED on** (split-16 projector engagement at >=8192-token
prompts), tool parser `qwen3_coder`, reasoning channel `reasoning`. Cut
over 2026-09-27 from the llama.cpp b11030 endpoint (downtime ~1 h 24 m) at
Frank's direction.
**Placement: compute the experts in RAM, never stream them.** Layer split **The tuned shape lives on-host, not in the repo.** The profile's setup run
`-ts 1,1` with `-ngl 999`; the routed experts and the 51B-param n-gram qualified a 104-key `R9V_*` config (placement, budgets, parsers, CED) into
(PLE) table are overridden to CPU (`-ot `/home/dank/r9v-state/uncensored/setup.json` (`ready: true`); the repo env
exps=CPU,per_layer_token_embd.weight=CPU`) and computed file `scripts/frank-primary.env` carries ONLY production overrides
from the mmap page cache — the x4-pair law (streaming over PCIe loses at (`R9V_HOST_BIND=0.0.0.0`, `R9V_HOST_PORT=7770`,
3.7 t/s; computing in RAM does not care). `per_layer_token_embd.weight=CPU` `R9V_SERVED_MODEL_NAME=frank-primary`, `R9V_CONTAINER_NAME=frank-primary-r9v`,
is REQUIRED by the shared MTP head's borrow path (a GPU-resident borrow `R9V_EXPECTED_GPU_BDFS`). Never copy tuned values from the state into the
crashes the draft load with `invalid vector subscript`). Dense weights, repo — it would drift from the qualification.
attention, the BF16 projector and the MTP head sit on the cards (~29 GiB);
mmap must stay on (`--no-mmap` forces the table into anonymous memory →
silent cgroup kill) and the PLE tensor must never carry a GPU target
(23 → 13.4 t/s when tried). `--cache-ram 16384`; KV is the hybrid
DeltaNet/QSA pattern, a fraction of the dense-model cost.
**Spec chain `draft-mtp,ngram-mod`, depth 2.** The shared Q_8 head **Serving = the fork's own launcher through a docker→podman shim.** The R9V
(`MTP/mtp-Qwen3.8-Flash-Next-shared-Q8_0.gguf`, 2,786,568,256 B — unsloth's tooling is docker-pinned; the shim at
recommended pairing) loads via `--model-draft` and borrows the target's `/home/dank/GitPackages/radiance-vllm-qwen4exp/.podman-shim/docker` carries
embedding tensors; `ngram-mod` chains behind it (draftless, so legal). three laws: (1) the bundle is a containerd/OCI docker-save, so docker keys
The dankclaw UD-IQ4_XS deployment of the same model family ran this head the image by its OCI manifest digest while podman keys by config digest but
at depth 2 with 0.83–0.92 acceptance. ngram-mod prints no startup banner — preserves the manifest digest in `RepoDigests` — the shim answers
identify it behaviourally (`draft_n` > 0 where text repeats). `image inspect sha256:X` from RepoDigests and rewrites bare `sha256:X` run
refs to `repo@sha256:X`; (2) podman inspect answers
`HostConfig.LogConfig.Config: null` where docker returns the log-opts map
(the fork's doctor crashes on it) — the shim records `run --log-opt` pairs
and normalizes inspect output; (3) podman lacks docker's `SecurityOptions`
/`ServerVersion` info fields — the shim answers them.
**Vision explicit, reasoning deepseek-format.** `--mmproj` names the BF16 **Unit and self-healing.** Root systemd unit (`scripts/frank-primary.service`,
projector (this build never autoloads one — a server without the flag comes `User=dank`, `LimitMEMLOCK=infinity`) — the tiered-expert UVA host copy pins
up healthy and text-only and answers image requests 500). `--jinja` with the ~43 GiB and the PLE reserve 16 GiB, and a root unit grants the pin budget
GGUF's embedded template; `--reasoning-format deepseek` fills via PID1 (a rootless quadlet would be capped by the user manager's limit).
`reasoning_content`. The Qwen3.8 template gates `reasoning_effort` to The serve script (`scripts/serve-frank-primary.sh`) gates the setup state
`{xhigh, medium, low}` — folded by `reasoningEffortMap` in `models.yml`. (ready + paths), the pinned image (RepoDigests), the PLE byte count
One stream, full 262,144 ctx (`PARALLEL_SLOTS=1`); greedy server default, (`stat -c %s`), every GGUF shard + the mmproj and the GPU device nodes,
Qwen-recommended sampling rides `compat.extraBody` per request. `--flash-attn clears a stale container, then execs the fork's `scripts/launch.sh` through
on`, batch 8192 / ubatch 512 (the measured ROCm optimum class), port 7770, the shim and **blocks on `docker wait`** — the launcher `--detach`es, so
alias `frank-primary`. without the wait a crashed engine is a green unit; `docker wait` cannot stop
the container child, hence `ExecStop=podman stop -t 120
frank-primary-r9v`. The deployer's `deploy_llm_primary` gates state/image/
PLE/shards, `podman rm -f`s the container, waits out :7770, relinks/enables/
restarts the unit and health-gates with the MainPID check (the false-green
stray law).
Files: `scripts/frank-primary.service` (root unit, relinked to Verified at cutover: setup PASS=28/WARN=3/FAIL=0 (20/20 artifacts
`/etc/systemd/system/`), `scripts/serve-frank-primary.sh` (validates binary sha256-verified, PLE at pinned size); first-start doctor battery PASS=34/
+ all 6 parts + drafter + mmproj, then `exec`s llama-server), WARN=8/FAIL=0 including pinned-UVA reads, H2D copies and the TP all-reduce
`scripts/frank-primary.env` (tunables; the bind address is `BIND_HOST` — verified INSIDE serving workers; wire: alias `frank-primary`, `/health` +
never a bare `HOST`, HIP reads it). The deployer's `deploy_llm_primary` `/metrics` 200, non-thinking PONG, thinking → `reasoning`, tool_calls
gates every artifact at its declared byte count (`stat -c %s`, never `wc -c`), round-trip, vision ('red' for a red PNG), needle recall exact at 111,647
retires the lucebox quadlet to `~/.AGENTTRASH/20260926-llamacpp-cutover/`, prompt tokens (95% depth, ~4.5k tok/s effective prefill), decode 59–96
waits out port 7770, relinks/enables/restarts the root unit and waits up to tok/s (draft-acceptance dependent). MemAvailable floor 56.3 GiB.
1800 s for `/health` (cold start page-ins ~175 GiB).
Runbook: `serverAppConfigs-docs/LLM/frank-primary-llamacpp-qwen38-flash-next-q8.md`. Runbook: `serverAppConfigs-docs/LLM/frank-primary-r9v-radiance-qwen38-uncensored.md`.
Rollback: the lucebox DS4.1 material on host (image Rollback: the llama.cpp trio at commit `4992e5a` (unit/env/serve) and the
`localhost/lucebox-rocm:gfx1201` + the 377 GiB payload + the archived GGUF payload on disk — see [[frank-primary-llamacpp-qwen38-flash-next-q8]];
quadlet files in `dankserver/.AGENTTRASH/20260926-llamacpp-cutover/`) — see a rollback is a redeploy.
[[frank-primary-lucebox-ds4]]; the Qwen payload stays fetched, so a
forward re-swap is a redeploy.
## Key Lessons Learned ## Key Lessons Learned
Durable operational lessons from the fleet's history. Full detail in the Durable operational lessons from the fleet's history. Full detail in the