Files
esh-pfi-infrastructure/docs/pfi/llm-seat-catalog.md
T
vh dfa91a8eaf docs(fv-ml1): add curated LLM seat catalog (lineage/provenance/cards/speed) + bench script
Adds docs/pfi/llm-seat-catalog.md, the durable hand-curated record of what each
seat IS -- lineage, provenance, model-card facts, quantization, speculative
decoding, licenses, and measured warm tok/s + deep-prefill depth results with
their harness and date. It complements the auto-generated
fv-ml1-gpu-seat-inventory.md (live placement/KV/concurrency): the two split by
volatility, and the catalog defers to the inventory for any live number.

Adds scripts/seat-bench.py so the catalog's speed/depth numbers are reproducible
(warm decode tok/s, n=3, conc=1, median; deep prefill at ~0.97x max-model-len
with an allocator-log OOM scan). Serial by design -- concurrent deep prefills
would confound both OOM and tok/s.

Captures the 2026-09-14 measurements: all six generative seats prefill to ~255K
(coder ~16K) with zero OOM/CUBLAS/illegal-memory; warm decode 62.7-337.3 tok/s;
per-seat VRAM. seat-inventory.py now cross-links the catalog in its footer.
2026-09-14 10:45:31 -07:00

9.1 KiB
Raw Blame History

LLM seat catalog — fv-ml1

The durable, curated record of what each LLM seat IS: lineage, provenance, model-card facts, quantization, speculative decoding, and measured speed/depth.

This file is hand-curated and complements the generated inventory. The two split by volatility:

file owns updated by
fv-ml1-gpu-seat-inventory.md live placement, VRAM, KV tokens, concurrency, quant format, gateway aliases scripts/seat-inventory.py (read-only, auto)
this file durable lineage, provenance, cards, licenses, measured tok/s + depth results, "why this seat" by hand, on seat change or re-bench

Where they overlap (ctx, concurrency, VRAM), the inventory is authoritative for the live number; the values here are point-in-time and dated. If they disagree, the inventory won and this file is stale — fix it.

Keeping this current

Update this file whenever a seat changes — model swap, quant change, context/KV edit, or a new seat. Two commands regenerate the inputs:

scripts/seat-inventory.py            # live placement/KV/concurrency (docs/pfi/fv-ml1-gpu-seat-inventory.md)
scripts/seat-bench.py                # warm tok/s + deep-prefill OOM check (serial; prints the numbers below)

⚠ Speed and depth numbers are measurements, not facts about the weights — they carry a date and a harness. Re-run seat-bench.py after any context/KV/quant/spec change and update the table with the new date. A number without its harness is not a result (see the measurement-discipline note at the bottom).


Summary (measured 2026-09-14, harness below)

seat GPU model ctx conc. warm tok/s VRAM depth verified OOM
cyberprev (sec) 0 Qwen3.8-27B cyber-SFT (abliterated base) 262,144 1.37× 136.6 47.1 GiB 259,722 tok none
gen-small 0 Qwen3.6-35B-A3B Heretic 262,144 2.56× 254.8 36.1 GiB 254,526 tok none
gen (flash-next) 2 Qwen3.8-Flash-Next (orcarouter) 262,144 1.31× 170.7 95.3 GiB 254,273 tok none
char-rp 1 G4-MeroMero-v2-31B (Gemma4 dense) 262,144 1.22× 62.7 42.3 GiB 254,858 tok none
char-rp-fast 1 G4-MeroMero-26B-A4B (Gemma4 MoE) 262,144 2.04× 225.2 27.0 GiB 254,823 tok none
coder 1 Qwen2.5-Coder-1.5B (base) 16,384 4.70× 337.3 5.6 GiB 15,905 tok none

Support (non-generative): reward Skywork-Reward-V2-Llama-3.1-8B (9.2 GiB, GPU1), embed Qwen3-Embedding-0.6B (3.4 GiB, GPU1), rerank bge-reranker-v2-m3 (2.1 GiB, GPU1). gen (flash-next) is on GPU2 and off-limits to rearrangement; GPU3 is reserved scratch (empty).


Seats

cyberprev — the sec / sec-reasoning seat (GPU 0, :8025)

  • Serves gateway: sec, sec-reasoning. Displaced mog-sec 2026-09-14.
  • Lineage: Qwen/Qwen3.8-27B → hotdogs/Qwen3.8-27B-abliterated (abliterated base) → offensive-security tool-calling LoRA trained on hotdogs/cyber-sft-agent-qwen38 (8,400 rows, 22 pentest tools: nmap/sqlmap/metasploit/hydra/…), merged @ scale 1.0 = hotdogs/Qwen3.8-27B-abliterated-cyber-preview → in-house name-repair (the raw export shipped 850/1199 body tensors with a tripled language_model. prefix — an unsloth export bug, see reference_unsloth_tripled_prefix_export_bug) → house mixed NVFP4 quant → /tank/aimodels/cyberprev-nvfp4-mixed-v2.
  • It is a cyber SFT finetune, NOT "an abliteration" — the abliteration is inherited from the base; the new capability is the cyber tool-calling SFT. Card: tool-call format 0/6→6/6, correct tool 0/6→6/6, general capability held (KL 0.04 general / 0.81 tool = surgical re-target). "Will not refuse" per its card.
  • Quant: compressed-tensors mixed — NVFP4 W4A4 on MLP layers 0-55, FP8 W8A8 on attn/linear_attn/lm_head/MLP 56-63, FP8 KV. 15 MTP tensors grafted (bf16), vision tower + re:^mtp.* in ignore. Pipeline: services/gen-seat-mixed-quant/.
  • Speculative: dflash k=7 (drafter qwen38-27b-dflash2-drafter), ~2.77 mean accept len.
  • Context: native 262,144, depth-probed clean to 259,722 tokens (non-repeating prompt). Notable: same base arch as the retired mog-sec, which crashed above ~163,840 on processing depth — cyberprev does not.
  • License: apache-2.0.

gen-small — the fast A3B tier (GPU 0, :8026)

  • Serves gateway: gen-small, gen-small-reasoning, and backs summarizer + classifier (the bulk/triage aliases). Stood up 2026-09-14.
  • Model: llmfan46/Qwen3.6-35B-A3B-uncensored-heretic-Native-MTP-Preserved-NVFP4-Experts-Only → /tank/aimodels/qwen36-35b-a3b-heretic-nvfp4.
  • Lineage: Qwen/Qwen3.6-35B-A3B (3B-active MoE, 256 experts, hybrid GDN+attn) → Heretic v1.3.0 abliteration (MPOA — Magnitude-Preserving Orthogonal Ablation, the house-favorite method) → NVFP4 experts-only quant. 3.8 was requested but there is no general Qwen3.8 A3B (the 3.8 MoEs are Flash-Next and the 2.4T), so this is the 3.6 fallback.
  • Card: 88% fewer refusals (10/100 vs 83/100 original) at 0.0015 KL divergence (quality preserved). 19 MTP tensors preserved (native).
  • Quant: modelopt NVFP4, experts-only (256 experts NVFP4; attn/shared-expert/ linear_attn bf16). Serves as-is, no re-quant.
  • Speculative: qwen3_5_mtp k=3, measured 69.6% acceptance / 3.09 mean length — MTP is a clear win here.
  • Context: native 262,144, depth-clean to 254,526. Cheap KV (A3B + fp8) → 2.56× concurrency on only 8 GiB KV.
  • License: apache-2.0 (per base Qwen/Qwen3.6-35B-A3B).
  • Why: high-volume, low-caliber work (summarization, classification, triage) belongs on a fast 3B-active seat, not the premium gen seat.

gen — flash-next (GPU 2, :8022) — off-limits to rearrangement

  • Serves gateway: gen, gen-large, gen-reasoning, summarizer-large, classifier-large, image-judge, chat-judge, qwen-image-bench.
  • Model: orcarouter/Qwen3.8-Flash-Next-Uncensored-NVFP4 → in-house PLE bf16→FP8 conversion + layer_types rename → /tank/aimodels/qwen38-flash-next-orcarouter-nvfp4-plefp8. See reference_qwen4exp_ple_loader_branch_order.
  • Lineage: Qwen/Qwen3.8-Flash-Next (176B total: 125B main + 51B n-gram PLE table, ~6B active) → orcarouter uncensored NVFP4 → in-house PLE→FP8 so vLLM's Qwen4ExpPLEEmbeddingMethod selects the FP8 path.
  • Architecture: the only seat whose weights don't fit its card — the 51B PLE table lives in pinned host RAM, read over CUDA UVA. GDN linear-attn + QSA hybrid.
  • Quant: compressed-tensors mixed (W8A16 attn / W4A16 experts) + FP8 PLE.
  • Speculative: MTP k=3, ~60.4% acceptance.
  • Context: 262,144, depth-clean to 254,273. Fastest prefill of the fleet (27.7s/254K).

char-rp — the char quality tier (GPU 1, :8016)

  • Serves gateway: char-rp, char-rp-reasoning.
  • Model: /tank/aimodels/meromero-v2-nvfp4-work/G4-MeroMero-v2-31B-NVFP4A16 — in-house build, Gemma4 dense, 60 layers, heretic-abliterated, compressed-tensors NVFP4 W4A16.
  • Speed: 62.7 tok/s warm — the slowest seat, inherent to a dense 31B; this is the quality tier. Deep prefill 267s/254K (slowest). Gemma4 sliding-window attn (window 1024) keeps KV cheap at depth.
  • Context: 262,144 @ 1.22×, depth-clean to 254,858.

char-rp-fast — the char speed tier (GPU 1, :8021)

  • Serves gateway: char-rp-fast.
  • Model: /tank/aimodels/G4-MeroMero-26B-A4B-it-uncensored-heretic-NVFP4A16 — in-house build, Gemma4 MoE (26B-A4B), heretic-abliterated, compressed-tensors NVFP4A16.
  • Speed: 225.2 tok/s warm — the throughput answer to char-rp's quality. 2.04× concurrency (KV pinned ~8.5 GiB). Depth-clean to 254,823.
  • Context: 262,144 @ 2.04×.

coder — FIM code-completion (GPU 1, :8020)

  • Serves gateway: coder-fast. Backs Zed edit-predictions.
  • Model: Qwen/Qwen2.5-Coder-1.5B (base, unquantized), fp8 KV.
  • Speed: 337.3 tok/s (smallest model, fastest). Context 16,384 @ 4.70×.
  • Note: util-sized; the ~4.7× overshoots the "2-3×" intent because the 1.5B weight+overhead floor (~4.2 GiB) sits just under the util knob's resolution. Hitting ≤3× reliably needs a --kv-cache-memory byte pin (compose change), deferred.

Benchmark harness (state it with any number above)

  • warm decode tok/s: greedy (temperature 0), conc=1 (single stream), n=3 reps, median, fixed ~40-word prompt → 300 output tokens. Decode throughput — generation is never prefix-cached, so reps are valid; spread was <1% on every seat.
  • deep prefill / OOM: one non-repeating random prompt at ~0.97× max-model-len, 8 output tokens. PASS = returns AND the seat's allocator log shows no OOM / CUBLAS / illegal-memory across the probe window (verified 2026-09-14, 0 hits on all seats).
  • Measured serially (one seat at a time) — no cross-seat contention. These are clean, uncontended, single-stream ceilings; real aggregate throughput under concurrency is higher per-GPU and lower per-request. Re-derive with scripts/seat-bench.py.