74f596b1d3
Re-quantizes the fleet `gen` seat from weight-only NVFP4A16 to a mixed-precision build: NVFP4 W4A4 for layers 0-55 MLPs, FP8 W8A8 for the attention projections / linear_attn / lm_head / layers 56-63 MLPs, FP8 KV cache. Replicates the scheme of unsloth/Qwen3.8-27B-NVFP4 on the abliterated weights. The queued task named this "W4A8" (NVFP4 weights + FP8 activations). That checkpoint cannot be served: vLLM 0.24's compressed-tensors dispatcher (compressed_tensors.py:704-713) accepts NVFP4 weights with either no input quantization (W4A16, which forces the Marlin kernel) or NVFP4 input quantization (W4A4) -- anything else, FP8 included, raises ValueError at load. CompressedTensorsW4A8Fp8 is INT4 weights gated on an exact-sm90 check, so it is closed on Blackwell twice over. The ~20% intuition was correct; the scheme name was not. Getting FP8 into the mix has to be done per-layer-group. Established the gain before spending GPU time: unsloth's build was already on-box, so serving it as a probe measured +19.1% over our seat at identical MTP acceptance -- a kernel-level result, no requant needed to learn it. Measured, cache-busted, bs=1: decode 80.12 -> 94.53 tok/s (+18.0%) MTP acceptance 47.8% -> 47.7% (unchanged) perplexity (n=6) 6.941 -> 7.059 (+1.7%) abliteration 4/4 -> 4/4 (preserved) weights on disk 27.7 -> 22.5 GB (-19%) Surface test green on the live seat: plain chat, vision, tool calling, thinking split, 36K-token needle retrieval, streaming. All 7 LiteLLM aliases verified routing. GEN_GPU_MEM_UTIL 0.45 -> 0.43: the new weights are 5.2 GB smaller, and at 0.45 the seat absorbed that slack as KV, leaving meromero-charrp 0.18 GiB short of its budget on the shared GPU0 -- it crash-looped. Handing the space back leaves gen 422K tokens of KV (1.6x its 262K context) and both seats co-resident at 89.8/97.9 GB. Also records two measured negatives so they are not re-chased: GEN_SPEC_TOKENS is already optimal at 3 (swept 2/3/4/5 -> 77.1/80.1/78.7/ 75.9 tok/s), and vLLM's prompt_logprobs are ~uniform while speculative decoding is on, so perplexity must be measured with spec off. Pipeline, acceptance harness and raw measurements land in services/gen-seat-mixed-quant/. Rollback is one .env line; the previous build is untouched at /tank/aimodels/qwen38-27b-uncensored-nvfp4.
35 lines
1.5 KiB
Markdown
35 lines
1.5 KiB
Markdown
# gen-seat — the fleet `gen` seat (ana-ml2 GPU0, :8015)
|
|
|
|
Serves **`qwen3.8-27b-uncensored`** (JonathanColetti/Qwen3.8-27B-Uncensored,
|
|
Heretic-abliterated Qwen3.8-27B, vision-intact, 262K context) plus the
|
|
`-thinking` served-name for the reasoning split.
|
|
|
|
Backs **7 LiteLLM aliases**: `gen`, `gen-reasoning`, `summarizer`,
|
|
`summarizer-large`, `classifier`, `image-judge`, `qwen-image-bench`. Treat any
|
|
change here as fleet-wide.
|
|
|
|
- **Quant:** in-house **mixed-precision** — NVFP4 W4A4 for layers 0-55 MLPs,
|
|
FP8 W8A8 for attention / `linear_attn` / `lm_head` / layers 56-63 MLPs, FP8 KV.
|
|
~94.5 tok/s decode at bs=1, MTP n=3 @ ~48% acceptance.
|
|
- **Speculative decoding:** `qwen3_5_mtp`, `num_speculative_tokens=3` (measured
|
|
optimum — see the quant service README).
|
|
- **Tunables:** `.env` on the host. ⚠ it is mode 0600 / lkraven-owned, so every
|
|
`docker compose` call against this stack needs `sudo` — without it compose
|
|
cannot read `.env`, fails with `permission denied`, and leaves the old
|
|
container running while appearing to have succeeded.
|
|
|
|
## Pipeline, acceptance gate, and rollback
|
|
|
|
All of it — the recipe, the `re:^mtp.*` foot-gun, the benchmark harness, the GPU0
|
|
budget interaction with `meromero-charrp`, and the rollback command — lives in
|
|
[`services/gen-seat-mixed-quant/README.md`](../../services/gen-seat-mixed-quant/README.md).
|
|
|
|
## Deploy
|
|
|
|
```bash
|
|
scripts/deploy-stack.sh ana-ml2 gen-seat # diffs vs live, prompts y/N
|
|
# on host:
|
|
ssh infra-ops@10.250.50.54
|
|
cd /opt/docker/compose/gen-seat && sudo docker compose up -d vllm-gen
|
|
```
|