feat(chatterbox-fast): Phase 3 scaffold — Dockerfile, compose, .env.example

Container artifacts to deploy alongside the live chatterbox (:8196) on irv-ml1.
- Dockerfile: thin overlay FROM local/chatterbox:v1 (sibling's image, has the
  chatterbox lib + torch + fastapi) + COPY scheduler.py app.py; runs uvicorn.
- compose.yaml: mirrors the sibling chatterbox stack (runtime: nvidia +
  NVIDIA_VISIBLE_DEVICES; host IP:port, no traefik-net — these GPU TTS services
  aren't traefik-fronted). Port 8197, /health healthcheck, homepage labels,
  reuses /worktank/chatterbox/{cache,reference_audio}.
- .env.example: GPU default device 1 (A6000) — turbo is fp32, 3090 free VRAM is
  tight; port reservations; perf-lever toggles.

Not yet deployed — awaiting operator go (shared GPU host, runs beside production).
This commit is contained in:
vh
2026-06-01 23:30:36 -07:00
parent a95aa75947
commit 5c8d174f8e
4 changed files with 135 additions and 1 deletions
+14 -1
View File
@@ -39,8 +39,21 @@ regardless of chunking. That is why this is the chatterbox-specific answer.
| `test_scheduler.py` | GPU-free simulation: asserts no-starvation + ratchet. `python test_scheduler.py` or `pytest`. |
| `app.py` | FastAPI server: model holder + `POST /tts` (StreamingResponse) + `GET /health`. |
| `bench.py` | Client: ground-truth TTFB + real 1×-consumer starvation check; saves `.wav` for A/B. |
| `Dockerfile` | Thin overlay: `FROM local/chatterbox:v1` + our two modules. |
| `compose.yaml` · `.env.example` | Deploy on irv-ml1 alongside the live `chatterbox`. |
Phase 3 will add `compose.yaml`, `Dockerfile`, `.env.example`.
## Deploy (Phase 3)
```bash
scripts/deploy-stack.sh irv-ml1 chatterbox-fast # push compose+code to the host
# then on irv-ml1, in /opt/docker/compose/chatterbox-fast/ (after copying .env):
docker compose build && docker compose up -d
```
`Dockerfile` is `FROM local/chatterbox:v1` (the sibling stack's image — must exist
on irv-ml1) + `COPY scheduler.py app.py`. GPU pin and voices/cache paths come from
`.env` (see `.env.example`). Default GPU is **device 1 (A6000)** — turbo loads fp32,
so the 3090's tight free VRAM likely won't fit; measure before pinning device 0.
## API