feat(fv-ml1): rebalance GPUs 0/1 by usage; contexts to published maximums; gen-small default output cap

Layout: GPU 0 = cyberprev (KV 16 -> 15 GiB, 1.29x), erp-seat (moved from
GPU 1, KV 8.49 -> 5.5 GiB, 1.32x), voices (ctx 8,192 -> 40,960, its native
maximum, KV 6 GiB, 1.07x), coder (moved from GPU 1, ctx 16,384 -> 32,768,
the card maximum, 2.35x), parakeet-nemo. GPU 1 = gen-small (moved from
GPU 0, 5.5 GiB, 1.76x), meromero-rp (22 GiB, 1.32x), intern-decision.

Sizing rule: KV >= 1.25x max context rounded up to 0.5 GiB, checked against
7 days of LiteLLM traffic and the engines' own KV-usage logs. Each card keeps
spare memory for its bursty tenant (parakeet's cap on GPU 0, intern-decision's
32k call on GPU 1). YaRN extensions are not enabled: they do not fit, and the
Qwen cards warn static YaRN degrades short prompts.

gen-small gets --override-generation-config max_new_tokens 32768. It applies
only to requests that omit max_tokens (vLLM get_max_tokens) and answers 9
runaway ~260k-token replies in 7 days; the longest normal reply was 6,357.

Applied with playbooks/fv-ml1-rebalance-20261005.yaml (boot-check guard and
health/KV verification per seat); all nine seats healthy, gateway smoke
tests pass.
This commit is contained in:
vh
2026-10-05 22:51:17 -07:00
parent 6851ecbd0b
commit c35f6510bf
15 changed files with 319 additions and 25 deletions
+15 -5
View File
@@ -124,7 +124,7 @@ _As of 2026-10-05 ~2035 PT. The newest subsection is first; older subsections ca
- **Scheduled / to verify:** 10-05 0815 + 0900 infra-hermes jobs (sfsrv-ana `pre-pbs4` snapshot delete after its 04:00 backup; drop `pve/root-pre-pve9` on pfi-pve + esh-pve) — outcome not checked in this session, read `scripts/ops-log tail`; esh-nas-pve `nvme/ROOT@pre-pve9` destroy ~10-10 (ours); 10-11 0540 first weekly sudo-io archiver run (check it), 10-11 0900 infra-hermes deletes the two one-off PBS VM vzdumps. Never `zpool upgrade` any pool yet.
- **Worldtree memory gate 20261004T143011Z FAILED** (one run filed the forbidden `u-negative-ephemeral` fact; an esh-pve reboot overlapped run 1). Whether the 2026-10-05 0730 run repeated it was not checked here; it is a regression check with worldtree-dev, not a gate.
- **Small clean-ups, ours, untracked:** stale LiteLLM aliases `erp-tune-v2` and `gemma4-26b-a4b-it-base`; ana-docker's Traefik (`readTimeout` 10m) and CrowdSec (`use_wal`, bouncer `updateMaxFailure: 3`) configs live only on the host, not in `stacks/`; TEI weights revision unpinned on esh-ml1 + nh3-ml1; a stray nginx `.bak` on pfi-tacticalrmm.
- **fv-ml1 KV pins APPLIED 2026-10-05 2131–2139 (Prime's call; `playbooks/fv-ml1-kv-pin-20261005.yaml`, elway all green).** Diagnosis: on GPU 1, `vllm-meromero-rp` sized KV from util 0.52, and vLLM's profile is corrupted by co-booting neighbours (non-torch 8.11 → 1.74 → −0.56 GiB; KV 20.37 → 26.74 → 29.04 GiB). The 0234 Docker-move restart cost GPU 1 ~2.5 GB (Beszel step), so intern-decision's 32k calls were ~2.4 GB short. GPU 0 has no step: it CREEPS for 1–2 days after a boot and plateaued at ~60 MiB free (Beszel 10-03→10-05). The 10-01 "~1.05 GB free" was a just-after-restart read. Changes: meromero KV pinned **22 GiB** (346,436 tokens, 1.32×), util 0.52 → 0.47 (boot check only); coder pinned **1,104,674,816 B** (77,056 tokens, unchanged); gen-small KV **8 → 5.5 GiB** (461,215 tokens, 1.76×) so parakeet-nemo STAYS on GPU 0. **GPU 3 stays clear for ad-hoc work (Prime).** Result: GPU 1 Free 3,981 → **11,801** MiB (~5.4 GB spare at intern-decision's 32k peak); GPU 0 Free 495 → 5,039 right after boot, projected plateau ~2.6 GB, which covers parakeet's 3,840 MiB cap with ~0.9 GB to spare. ⚠ **Verify the GPU 0 plateau ~10-07/08** from Beszel (`stats.g.0.mu` × 1.024). Downtime: char-rp ~2 min, coder ~1 min, gen-small ~4 min (57 s compile miss). .env backups `*.env.bak-20261005-kvpin`. **Park 75 (TTS stack → fv-ml1) DROPPED** by Prime 2026-10-05 2115 (comment 63).
- **fv-ml1 GPU 0/1 REBALANCED 2026-10-05 2226–2249 (Prime: "accept all that" + "context up to published maximums if at all possible"; `playbooks/fv-ml1-rebalance-20261005.yaml`, elway all green, gateway smoke tests pass).** It follows the 2131 KV pins (meromero 22 GiB, coder pinned, gen-small 5.5 GiB). Why: on a shared card util-sized KV is a co-boot lottery, and GPU 0 creeps to ~60 MiB free after a boot. Rule: KV ≥ 1.25× the seat's max context, rounded up to 0.5 GiB. Two exceptions: meromero and gen-small keep Prime's numbers, and voices gets 1.07× (short prose traffic). Usage basis: 7 days of LiteLLM logs (gen-small 22,396 calls; sec 400; char-rp-fast 55; char-rp 14) plus the engines' own KV logs. **Layout:** GPU 0 = cyberprev, erp-seat, voices, coder, parakeet-nemo (4,036 MiB free right after; ~2.3 GB spare at parakeet's cap; cyberprev may still creep). GPU 1 = gen-small, meromero-rp, intern-decision (10,864 free; ~3.3 GB spare at the 32k peak once gen-small settles). Contexts raised: coder 16,384 → **32,768** (card max), voices 8,192 → **40,960** (native max). YaRN extensions were NOT enabled (gen-small/cyberprev to ~1M, voices to 131k). They don't fit, and Qwen's own cards warn static YaRN hurts short prompts. intern-decision stays at 32,768 (card default 8,192; base config 262k; ~0.21 MiB/token of VRAM). **gen-small default output cap 32,768** (`--override-generation-config`; an explicit max_tokens still wins, verified in vLLM `get_max_tokens`). It answers 9 runaway ~260k-token replies in 7 days (albok-nemi ×6, all-agents-local ×3, all from nh3-dev); albok-dev told 2250. ⚠ **Verify both cards' plateaus ~10-07/08** from Beszel (`stats.g.<n>.mu` × 1.024). .env backups `*.env.bak-20261005-rebal`. Earlier the same night: KV pins 2131–2139 (`playbooks/fv-ml1-kv-pin-20261005.yaml`; diagnosis in commit 269c80f). Park 75 dropped by Prime 2115.
- **Open, Prime's calls (unchanged from 10-03):** QNAP LCD visual check (`services/qnap-lcd/`); NH3 Mac mini (`Mac-mini`, 00:c5:85:13:e0:92, 10.100.10.121, asleep since 10-03 ~1407) wake fix on site: `sudo pmset -a sleep 0 disksleep 0 displaysleep 10 womp 1 autorestart 1 powernap 0`, ideally Ethernet; Booth unreachable from 10.100.10.166 (Prime's Wi-Fi MacBook; resume only on his word; lead: SSID client isolation / proxy-ARP); Uptime Kuma has nothing on Miranda's chain (svos :8770, hermes-gateway); mask `openipmi.service` on esh-nas-pve; run `playbooks/pve-nag-patch.yaml` on esh-pve-2 when it is plugged back in.
### Parakeet speech seat: unified-en under NeMo, LIVE (2026-10-01)
@@ -152,11 +152,21 @@ _As of 2026-10-05 ~2035 PT. The newest subsection is first; older subsections ca
- **Legacy archive:** DESTROY it whole by **2026-10-30**, or at retirement-done, or on a subject-erasure request, whichever comes first. The runbook is in the detail file.
- **TODO:** re-sweep both api logs after real traffic. After the b193 push, remove the retired config keys (list: detail file, "Post-b193 config retirements").
### fv-ml1 GPU layout (as of 2026-10-05)
### fv-ml1 GPU layout (as of 2026-10-05 2249)
- **GPU 0:** cyberprev (KV 16 GiB pinned), gen-small (KV 5.5 GiB pinned since 2026-10-05), voices (KV 1.5 GiB), parakeet-nemo (rest 2,108 MiB, cap 3,840). Plateau target ~2.6 GB free (verify ~10-07/08).
- **GPU 1:** vllm-coder, erp-seat, meromero-rp (all KV byte-pinned since 2026-10-05), plus intern-decision (cap 14.4 GiB, 32k tokens, peak 15,220). Free 11,801 MiB at rest → ~5.4 GB spare at its peak.
- **GPU 2:** `vllm-flash-next` alone (gen / gen-large and 6 other aliases, util 0.96, ~96.4 GB). Live since 2026-09-14; henge park 49 is stale.
| GPU | seat | max ctx | KV | KV tokens | concurrency |
|---|---|---|---|---|---|
| 0 | cyberprev (sec) | 262,144 | 15 GiB | 336,935 | 1.29× |
| 0 | erp-seat (char-rp-fast) | 262,144 | 5.5 GiB | 346,436 | 1.32× |
| 0 | voices | 40,960 | 6 GiB (bf16) | 43,680 | 1.07× |
| 0 | coder (coder-fast) | 32,768 | 1.03 GiB | 77,056 | 2.35× |
| 0 | parakeet-nemo | audio | rest 2,108 MiB, cap 3,840 | — | — |
| 1 | gen-small (+summarizer/classifier) | 262,144 | 5.5 GiB | 461,215 | 1.76× (default output cap 32,768) |
| 1 | meromero-rp (char-rp) | 262,144 | 22 GiB | 346,436 | 1.32× |
| 1 | intern-decision | 32,768/call | cap 14.4 GiB, peak 15,220 | — | — |
| 2 | flash-next (gen, gen-large, +6) | 262,144 | — | 344,155 | 1.31× |
Every vLLM seat on a shared card (GPU 0, GPU 1) has byte-pinned KV (`--kv-cache-memory`), so util only gates the boot check and is set just above each footprint. flash-next is alone on GPU 2 and stays util-sized (0.96).
- **GPU 3:** clear for ad-hoc work (Prime, 2026-10-05); no always-resident tenant goes here. On-demand tenants: Blender, Scriberr (0 idle, ~5.5 GB per job), and MIA auto-rig (one-shot `scripts/mia-run`, peak 3.4 GB, added 2026-10-01 for dread-dev). When a full-size seat claims GPU 3, Scriberr steps aside to **irv-ml1's A6000**, not back to GPU 1.
### intern-decision (replaced SemIf on 2026-09-30)