flash-next-seat: full 262K context, KV pinned at a measured 14 GiB, gen-large on the gateway

Operator-directed: raise context to the model's native maximum and take as much KV
as the card safely allows, and expose the seat through LiteLLM as `gen-large`.

  max_model_len     131,072  ->  262,144
  KV cache             8.76  ->  14.00 GiB  (332,721 -> 560,654 tokens)
  concurrency      2.54x@128K ->  2.14x@262K

⚠ 16.00 GiB WAS TRIED FIRST AND IS TOO AGGRESSIVE. A 155,497-token non-repeating
prefill drove GPU 2 to 97,074 of 97,887 MiB and the caching allocator logged "OOM on
device 0 while trying to allocate 488636416 bytes (free: 422117376)" -- 466 MiB wanted
against 403 MiB free. The request completed, so nothing failed visibly; that is one
step before the shape that crashed stacks/mog-sec twice on 2026-09-10 (~1.04 GiB
wanted, ~600 MB free). Backed off to 14.00 GiB, which re-probes clean: zero allocator
warnings, a 155,557-token prefill in 14.2 s, and 2,085 MiB still free at peak.

The reason the first estimate was wrong is worth keeping, because it is not obvious
and it inverts the usual advice: --kv-cache-memory makes vLLM SKIP MEMORY PROFILING
ENTIRELY and ignore --gpu-memory-utilization. The profiler was the thing accounting
for deep-prefill activation, so pinning bytes switched off the protection that the
pin was supposed to formalise. vLLM's own "--kv-cache-memory=18745235968 (17.46 GiB)
to fully utilize gpu memory" line is computed from a profile measured at
max-num-batched-tokens depth and sits 3.5 GiB above what a 150K-token request
survives; open #54764 compounds it, since PLE short-conv prefill pads every request
in a batch to the batch-MAX query length.

max-num-batched-tokens stays at 8192 -- it is what bounds the activation peak, and
doubling max_model_len left the profiled peak unchanged at 1.65 GiB precisely because
the peak tracks chunk size, not context length.

Gateway: `gen-large` added to the LiteLLM model_list, pointing at fv-ml1:8022. One
alias on purpose -- a single alias cannot trip the shared-config enable_thinking
mutation footgun, which needs two over the same (model, api_base). Sampling is the
checkpoint's own declared set (temp 1.0 / top_p 0.95 / top_k 20); presence_penalty,
min_p and repetition_penalty are left unset because the checkpoint declares no
canonical value for them. Verified registered for both the infra-ops admin key and
the shared all-agents key, since a new model behind a scoped allowlist 403s silently.

Also adds services/flash-next-mtp-bench/ -- the MTP measurement campaign and its
rationale. MTP stays off, but on "not yet measured here" rather than on vLLM's
4xH100 recipe number, which is a cross-harness comparison and not evidence about a
TP=1 Blackwell seat.
This commit is contained in:
vh
2026-09-12 23:49:06 -07:00
parent 3132a16ca0
commit 7e62a07341
5 changed files with 387 additions and 15 deletions
+40
View File
@@ -221,6 +221,46 @@ model_list:
enable_thinking: true
model_info:
mode: chat
# gen-large -> Qwen3.8-Flash-Next ABLITERATED-NVFP4 (fv-ml1 GPU 2, :8022,
# flash-next-seat stack). Operator-requested test alias, added 2026-09-13.
#
# 176B total / ~6B active ultra-sparse MoE: a 125B main model plus a 51B n-gram (PLE)
# lookup table that lives in PINNED HOST RAM and is read by the GPU over CUDA UVA, so
# only ~74 GiB is resident on the card. 512 experts, 10 live per token; GDN linear
# attention on 36 of 48 layers, Qwen Sparse Attention on the other 12.
#
# SAMPLING IS THE CHECKPOINT'S OWN, not hand-tuned. generation_config.json declares
# temperature 1.0 / top_p 0.95 / top_k 20, and vLLM already applies them as the seat's
# defaults (it logs the override at boot). Restated here so a caller reading this file
# sees the EFFECTIVE values instead of inferring them. presence_penalty, min_p and
# repetition_penalty are deliberately UNSET — the checkpoint declares no canonical
# value for them, so none is invented.
#
# REASONING IS ON, at the seat's `medium` default. The Qwen3.8 chat template defaults
# to `xhigh`, where CoT length grows with conversation depth and has a long tail; the
# seat pins `medium` instead. Per-request chat_template_kwargs.reasoning_effort wins.
#
# ONE alias ON PURPOSE. The seat also serves a `-thinking` name, but a single alias
# cannot hit the shared-config enable_thinking mutation footgun -- that needs two
# aliases over the same (model, api_base) pair. If a thinking/non-thinking split is
# ever wanted, add gen-large-reasoning against the `-thinking` served name, the way
# gen / gen-reasoning are split above.
#
# NOT a speed upgrade over `gen` -- adopt for quality. Context is capped at 128K here,
# not the model's native 262K, and MTP speculative decoding is off pending a
# measurement on this hardware. Both are explained in
# stacks/flash-next-seat/README.md and services/flash-next-mtp-bench/README.md.
- model_name: gen-large
litellm_params:
model: hosted_vllm/qwen3.8-flash-next-uncensored
api_base: http://10.251.50.54:8022/v1
api_key: os.environ/VLLM_API_KEY
temperature: 1.0
top_p: 0.95
extra_body:
top_k: 20
model_info:
mode: chat
# char-rp -> MeroMero-v2 NON-THINKING prose seat (:8016, vLLM, meromero-charrp stack on
# ana-ml2 GPU 0). G4-MeroMero-v2-31B NVFP4A16, **Gemma-4 base** (google/gemma-4-31B-it),
# 256K ctx, in-house quant. Replaced the GGUF/llama.cpp Magidonia-24B seat 2026-08-12.