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:
@@ -31,13 +31,14 @@ CYBER_SERVED_NAME_THINK=cyberprev-27b-thinking
|
||||
# 0.40 of the card, sharing GPU 0 with mog-sec. KV pinned in bytes (8 GiB) so the
|
||||
# figure is reproducible regardless of what else is resident at start time.
|
||||
CYBER_GPU_MEM_UTIL=0.40
|
||||
CYBER_KV_CACHE_MEMORY=8589934592
|
||||
# 2026-10-05 rebalance: 15 GiB (~337k tokens, 1.29x at 262,144). Live max use seen: 57% of 16 GiB.
|
||||
CYBER_KV_CACHE_MEMORY=16106127360
|
||||
|
||||
# ⚠ 163840, NOT native 262144. Inherited from mog-sec, which crashed five times
|
||||
# learning that the KV pool's capacity and the card's processing depth are different
|
||||
# numbers. Raising this requires a deep-prefill probe with a NON-REPEATING prompt on
|
||||
# THIS checkpoint — a repeated prompt hashes to cached blocks and never prefills deep.
|
||||
CYBER_MAX_MODEL_LEN=163840
|
||||
CYBER_MAX_MODEL_LEN=262144
|
||||
CYBER_MAX_NUM_SEQS=16
|
||||
CYBER_MAX_NUM_BATCHED_TOKENS=4096
|
||||
CYBER_KV_CACHE_DTYPE=fp8
|
||||
|
||||
@@ -4,12 +4,13 @@ ERP_MODEL=/tank/aimodels/G4-MeroMero-26B-A4B-it-uncensored-heretic-NVFP4A16
|
||||
ERP_SERVED_NAME=G4-MeroMero-26B-A4B-it-uncensored-heretic-NVFP4A16
|
||||
ERP_CHAT_TEMPLATE=/tank/aimodels/G4-MeroMero-26B-A4B-it-uncensored-heretic-NVFP4A16/chat_template.jinja
|
||||
ERP_PORT=8021
|
||||
ERP_GPU_ID=1
|
||||
# 2026-10-05 rebalance: GPU 0, KV pinned 5.5 GiB (~346k tokens, 1.32x); util = boot check only.
|
||||
ERP_GPU_ID=0
|
||||
# 0.35 x 97.9 GiB = 34 GiB. GPU1 had ~47 GiB free on 2026-09-08 (scriberr/embed/rerank/coder/reward resident).
|
||||
ERP_GPU_MEM_UTIL=0.30
|
||||
ERP_GPU_MEM_UTIL=0.25
|
||||
ERP_MAX_MODEL_LEN=262144
|
||||
ERP_MAX_NUM_SEQS=32
|
||||
API_KEY=
|
||||
# 8.49 GiB -> 534,649 KV tokens -> 2.04x a 262,144 context (operator's KV = 2x rule).
|
||||
ERP_KV_CACHE_MEMORY=9114000000
|
||||
ERP_KV_CACHE_MEMORY=5905580032
|
||||
ERP_MOE_BACKEND=auto
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# erp-seat — ERP-tune seat on ana-ml2 (GPU1, `:8021`)
|
||||
# erp-seat — ERP-tune seat on fv-ml1 (ex ana-ml2; GPU0 since 2026-10-05, `:8021`)
|
||||
|
||||
Serves the latest gated ERP LoRA merge as an **NVFP4A16** (weight-only) compressed-tensors
|
||||
checkpoint so the GX10 is free to train the next run.
|
||||
@@ -38,7 +38,7 @@ flip plus `docker compose up -d`.*
|
||||
json_schema` (guided decoding) 18/18 on this seat** — that is the deterministic path for a
|
||||
forced call; `tool_choice: auto` works normally. A parser plugin that re-enables guided JSON
|
||||
would also need JSON extraction in the engine-parser path; not attempted.
|
||||
- **GPU1 is shared** — check real usage (`nvidia-smi --query-compute-apps=pid,used_memory`) before
|
||||
- **GPU0 is shared** (since 2026-10-05: cyberprev, voices, coder, parakeet-nemo; KV pinned 5.5 GiB = 346,436 tokens, 1.32×) — check real usage (`nvidia-smi --query-compute-apps=pid,used_memory`) before
|
||||
raising `ERP_GPU_MEM_UTIL`; the flag sizes KV, not CUDA context.
|
||||
- **Rollback / next run:** point `ERP_MODEL` + `ERP_SERVED_NAME` at the next quant dir, keep the
|
||||
previous on disk. Deploy with `scripts/deploy-stack.sh ana-ml2 erp-seat`.
|
||||
|
||||
@@ -151,7 +151,7 @@ services:
|
||||
- homepage.group=AI - Inference
|
||||
- homepage.name=char-rp-fast (MeroMero 26B-A4B, NVFP4A16 MoE)
|
||||
- homepage.icon=mdi-fire
|
||||
- homepage.description=MeroMero A4B abliterated RP seat, NVFP4A16 weight-only, vision intact (fv-ml1 GPU1)
|
||||
- homepage.description=MeroMero A4B abliterated RP seat, NVFP4A16 weight-only, vision intact (fv-ml1 GPU0)
|
||||
- homepage.href=http://10.251.50.54:${ERP_PORT:-8021}/docs
|
||||
|
||||
networks:
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
# gen-small-seat — Qwen3.6-35B-A3B Heretic (llmfan46), fv-ml1 GPU 0, :8026.
|
||||
# gen-small-seat — Qwen3.6-35B-A3B Heretic (llmfan46), fv-ml1 GPU 1 (since 2026-10-05), :8026.
|
||||
# Copy to .env on the host at /opt/docker/compose/gen-small-seat/.env.
|
||||
|
||||
GEN_SMALL_IMAGE=vllm/vllm-openai:nightly-e9d1398d9edfd90fcc1cf783805240e3effec013
|
||||
API_KEY=
|
||||
|
||||
# ── Placement ── shares GPU 0 with cyberprev (sec). KV pinned in bytes so the two
|
||||
# ── Placement ── shares its card with other seats. KV pinned in bytes so the two
|
||||
# co-resident seats don't fight over a util fraction.
|
||||
GEN_SMALL_GPU_ID=0
|
||||
# 2026-10-05 rebalance: moved to GPU 1 (with meromero-rp and intern-decision).
|
||||
GEN_SMALL_GPU_ID=1
|
||||
GEN_SMALL_PORT=8026
|
||||
GEN_SMALL_CONTAINER_NAME=vllm-gen-small
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# gen-small-seat — a fast, cheap "gen-small" seat: Qwen3.6-35B-A3B (3B active MoE),
|
||||
# Heretic-abliterated, on fv-ml1 GPU 0, :8026.
|
||||
# Heretic-abliterated, on fv-ml1 GPU 1, :8026.
|
||||
#
|
||||
# WHY: a tiny-active (A3B = ~3B active of 35B total) gen tier for high-volume / low-latency
|
||||
# work, complementing the big gen seat (flash-next :8022). Operator-directed 2026-09-14.
|
||||
@@ -59,6 +59,13 @@ services:
|
||||
# attention footprint make this cheap; tuned to a sane concurrency band, not max.
|
||||
- --kv-cache-memory
|
||||
- "${GEN_SMALL_KV_CACHE_MEMORY:-5905580032}"
|
||||
# Default output cap (2026-10-05, Prime). A request that OMITS max_tokens stops at 32,768
|
||||
# instead of max_model_len - prompt; an explicit max_tokens still wins (vLLM get_max_tokens:
|
||||
# request value first, generation-config max_new_tokens only as the fallback). Reason: 9
|
||||
# runaway replies in 7 days, each ~260k tokens over 20+ min (albok-nemi, all-agents-local),
|
||||
# while the longest normal reply was 6,357 tokens.
|
||||
- --override-generation-config
|
||||
- '{"max_new_tokens": 32768}'
|
||||
- --max-model-len
|
||||
- "${GEN_SMALL_MAX_MODEL_LEN:-262144}"
|
||||
- --max-num-seqs
|
||||
|
||||
@@ -92,6 +92,9 @@ service. This container may therefore use its rest (8,812 MiB) plus GPU 1's nvid
|
||||
> 3,981 MiB, about 2.4 GB short of a 32k call. Fixed 2131–2135 the same night: meromero and coder now pin KV in
|
||||
> bytes (`playbooks/fv-ml1-kv-pin-20261005.yaml`), and `Free` reads **11,801 MiB**, a 20,613 MiB budget, so
|
||||
> ~5.4 GB is spare at the 15,220 peak. The static seats can no longer drift across restarts.
|
||||
> **Later that night (2226–2249), the GPU 0/1 rebalance** (`playbooks/fv-ml1-rebalance-20261005.yaml`) left this
|
||||
> card with gen-small, meromero-rp and this service only. `Free` read 10,864 MiB right after, and should settle
|
||||
> near ~9.7 GB once gen-small's post-boot growth levels off. That is a ~18.5 GB budget, so ~3.3 GB spare at the 32k peak.
|
||||
|
||||
Measured on the live service (per-process nvidia-smi every 0.1 s; single `noul` question unless noted; n=3, deterministic):
|
||||
|
||||
|
||||
@@ -83,12 +83,13 @@ HF_TOKEN=
|
||||
# and the keyless zed-fim-proxy (stacks/zed-fim-proxy). util 0.06 (~5.7 GB) holds
|
||||
# the 1.5B fp16 + fp8 KV; 8192 ctx is ample for FIM (KV = 13.75x concurrency).
|
||||
CODER_PORT=8020
|
||||
CODER_GPU_ID=1
|
||||
# 2026-10-05 rebalance: GPU 0; context raised to the card-published maximum (32,768).
|
||||
CODER_GPU_ID=0
|
||||
CODER_MODEL=Qwen/Qwen2.5-Coder-1.5B
|
||||
CODER_SERVED_NAME=qwen2.5-coder-1.5b
|
||||
CODER_MAX_MODEL_LEN=8192
|
||||
CODER_MAX_MODEL_LEN=32768
|
||||
CODER_KV_CACHE_DTYPE=fp8
|
||||
CODER_GPU_MEM_UTIL=0.055
|
||||
CODER_GPU_MEM_UTIL=0.06
|
||||
# KV pinned 2026-10-05 (77,056 tokens; see compose.yaml). Util now only gates the boot check.
|
||||
CODER_KV_CACHE_MEMORY=1104674816
|
||||
CODER_MAX_NUM_SEQS=32
|
||||
|
||||
@@ -16,7 +16,7 @@ model on the box, currently three services:
|
||||
|
||||
**Server:** ana-ml2
|
||||
**Ports:** `8001` (embed), `8002` (rerank), `8003` (reward) — all configurable via `.env`
|
||||
**GPU:** all three services share GPU 1 by default (configurable)
|
||||
**GPU:** only `vllm-coder` is live in this stack; since 2026-10-05 it runs on GPU 0 (`CODER_GPU_ID`) at the card-published maximum context of 32,768 (KV pinned 77,056 tokens, 2.35×). The embed/rerank/reward services here are retired
|
||||
|
||||
## Why one process per service
|
||||
|
||||
|
||||
@@ -69,7 +69,13 @@ separately.
|
||||
|
||||
## Placement warnings
|
||||
|
||||
⚠ **GPU 0 is now at 96.0 of 97.9 GB.** This seat's 10.7 GB went into the last real gap on
|
||||
> **2026-10-05 rebalance:** context raised 8,192 → **40,960** (Qwen3-4B's native maximum: the card's 32,768
|
||||
> plus its 8,192 prompt reserve; 131,072 would need YaRN, which the card says hurts short prompts). KV pinned
|
||||
> 6 GiB bf16 = 43,680 tokens (1.07×), util 0.16, resident ~15.4 GB. Still GPU 0, now beside cyberprev,
|
||||
> erp-seat, coder and parakeet-nemo. The LoRA voices were trained on short prose; long-context behaviour
|
||||
> with an adapter is unmeasured.
|
||||
|
||||
⚠ *(historical, pre-2026-10-05)* **GPU 0 is now at 96.0 of 97.9 GB.** This seat's 10.7 GB went into the last real gap on
|
||||
fv-ml1: GPU 1 has ~5.7 GB, GPU 2 has ~2.4 GB, and GPU 3 is a held reserve for a future
|
||||
full-card seat (`flash-next` alone needs 93 of 96 GiB). **There is no room for another seat
|
||||
here without a placement decision.**
|
||||
|
||||
@@ -87,11 +87,11 @@ services:
|
||||
- --port
|
||||
- "8000"
|
||||
- --gpu-memory-utilization
|
||||
- "${VOICES_GPU_MEM_UTIL:-0.12}"
|
||||
- "${VOICES_GPU_MEM_UTIL:-0.16}"
|
||||
- --kv-cache-memory
|
||||
- "${VOICES_KV_CACHE_MEMORY:-2147483648}"
|
||||
- "${VOICES_KV_CACHE_MEMORY:-6442450944}"
|
||||
- --max-model-len
|
||||
- "${VOICES_MAX_MODEL_LEN:-8192}"
|
||||
- "${VOICES_MAX_MODEL_LEN:-40960}"
|
||||
- --max-num-seqs
|
||||
- "${VOICES_MAX_NUM_SEQS:-8}"
|
||||
- --dtype
|
||||
|
||||
Reference in New Issue
Block a user