From 22a49784596e63d8080603618b7ac0e60592877e Mon Sep 17 00:00:00 2001 From: claude Date: Sun, 9 Aug 2026 01:07:55 +0400 Subject: [PATCH] Say that the card takes one supervisor (V-486) Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013ptwopxyo3Z2kwFckHkLvN --- CLAUDE.md | 11 ++++++++++- docs/offload.md | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 80e5e59..594bbc5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -57,10 +57,19 @@ mavsttd loads, over 200 Golos clips Verbatim, though that corpus cannot separate the two. **whisper.cpp cannot load CW2 at all.** It reads its language count off the vocabulary size, and CW2's 51897 tokens shift seven special token ids. So it is not a second -endpoint on mavgpud. It is its own transformers service on port 8081. `stt.HTTPTranscriber` +endpoint on mavgpud. It is its own transformers service on port 8081 +(`deploy/cw2/serve.py`), which Maven reaches directly. `stt.HTTPTranscriber` posts raw PCM to it with a bearer token, because audio is the most sensitive thing that crosses this seam. The switch is `workstation.stt` in `deploy/mavend.json`, and deleting the block sends every utterance to mavsttd. +**mavgpud runs that service as a second child.** That is not an optimisation. CW2 is a +ROCm process on the same card, so it registers on the KFD like any contender. Under its own +systemd unit it made mavgpud evict llama-server every few seconds. That took the +gemma-4-12b arm down for eight minutes on 2026-08-09 before anyone noticed. The card needs +one owner. Any GPU service added beside this daemon has the same defect, so add it to +`cmd/mavgpud` and not to systemd. CW2 is on the yield clock and not the idle one. At 1.6GB +it denies the card to nobody, and unloading it would only send the next voice turn to the +homesrv floor. Text-to-speech has not moved and piper on homesrv is still the only synthesizer. ## Build & test diff --git a/docs/offload.md b/docs/offload.md index 66b9bb1..922f709 100644 --- a/docs/offload.md +++ b/docs/offload.md @@ -105,6 +105,17 @@ how we find out whether the blind spot is real. untouched. The model, the context size, the layer count and the MTP flags are the owner's business and not this daemon's schema. +**Every GPU service on that box belongs under this supervisor**, added to +`cmd/mavgpud` rather than to systemd beside it. The rule was learned on +2026-08-09. The CW2 transcriber ran as its own user unit and registered on the +KFD like any ROCm job. So the supervisor read its own transcriber as a +contender. It yielded the card every few seconds and the gemma-4-12b arm was +down for eight minutes before anyone looked. So the supervisor takes a `stt` +block and starts CW2 itself. Yielding is all or nothing, because a job that +wants the card wants all of it. Idle unloading is not. It applies to +llama-server, which holds 8GB. CW2 holds 1.6GB, and unloading it would cost the +next voice turn its quality for nothing. + ## What stays on homesrv, permanently The **embedder** (multilingual-e5-small, ONNX, CPU). It backs the classifier, which @@ -156,13 +167,17 @@ builds it, beside `modelSeam` and at the same place in `wireVoice`, so the voice path and the meeting recorder still share one transcriber. The remote is not a second endpoint on mavgpud. whisper.cpp cannot load -CrisperWhisper 2.0 at all. It derives its language count from the vocabulary +CrisperWhisper 2.0 at all. It reads its language count off the vocabulary size, and CW2's 51897 tokens shift seven special token ids. So CW2 runs under transformers as its own service on port 8081, and `stt.HTTPTranscriber` is the second transport for the same seam. It posts raw PCM with the format in headers. It carries a bearer token, because audio is the most sensitive thing that crosses here. +It is a second endpoint on nothing, but it is a second **child** of mavgpud, and +that part is not optional. See the supervisor section above for why: a ROCm +service the supervisor does not own is a contender it yields to. + The margin is the reason: CW2 turbo scores 10.4% WER in Russian against 27.5% for the `ggml-small.bin` mavsttd loads, over 200 Golos clips (`docs/evals/2026-08-09-crisperwhisper2-russian-wer.md`). Text-to-speech has not