feat(mog-sec): quant + serve M.O.G.-SEC pen-test seat; PPL on gen; retire fable

Autonomous overnight run under the operator's full-autonomy grant. End state:
fleet up, gen seat untouched, a new verified pen-test seat serving where fable was.

PPL on the orcarouter gen seat (fable downed to free GPU1 for a nospec probe,
probe torn down after): mean 7.07 / median 5.76, within noise of heresy 6.910 /
5.625 and identical to our recipe's usual 7.059. The gen-seat search is settled.

M.O.G.-SEC: chose Blackfrost-Research/M.O.G.-SEC-27B-1M-CTX-BF16 (rev deede677)
over the pre-made ModelOpt NVFP4, which was disqualified on W4A4 4-bit activations
(the AEON degradation mode, catastrophic on a 1M-context model), zero MTP tensors,
and ModelOpt format. Pulled, format-screened (P(<think>) 1.11e-05, clean), quanted
in-house to mixed NVFP4+FP8 (23.4 GB, MTP + vision preserved), and served in the
retired fable slot.

  stacks/mog-sec        ana-ml2 GPU1 :8019, KV 418,218 tok / 1.60x @ 262K
  aliases               mog-sec (non-thinking), mog-sec-reasoning (thinking)
  gates                 surface 6/6, MTP 55.3%, format 0/15 leak, vision 7/3/1,
                        capability 4/4 (delivers offensive-security content)

Served at native 262K, NOT the card's 1M -- the 1M needs YaRN (absent from the
weights' config) plus the SGLang/DFlash2 path the repo ships a deployment kit for,
neither of which is our vLLM surface. A real 1M seat is a separate SGLang project.

Retired char-rp-reasoning + char-rp-fable (zero traffic, pointed at the downed
fable :8019; now 404 cleanly, not repointed -- a security model is not an RP model).
char-rp (meromero) untouched. Vision preprocessor built from the model's own
image_processor block, same trick as the MeroMero seat.

GPU0 seats (gen, meromero) were untouched and healthy throughout. The quant ran in
GPU1 free space with no production seat stopped except fable, which was replaced.
This commit is contained in:
vh
2026-08-21 02:47:18 -07:00
parent e4576f0989
commit 36c173c6a1
7 changed files with 263 additions and 12 deletions
@@ -87,3 +87,33 @@ Run `services/gen-seat-mixed-quant/bench/think-leak/think_prior.py` on the bf16
have disqualified Cold-Fusion before its 300-trial study ever ran. Prior is
favourable — stock-Qwen base, template identical to heresy, which measures <0.002
against Cold-Fusion's 0.185 — but measure, don't assume.
---
# Addendum — M.O.G.-SEC pen-test model (same night)
Two `Blackfrost-Research/M.O.G.-SEC-27B-1M-CTX` candidates for the pen-test
project: a BF16 and a pre-made NVFP4. **Same verdict as gen-seat: pull the BF16,
quant ourselves.** Read directly off the artifacts via HTTP Range.
| | BF16 | pre-made NVFP4 |
|---|---|---|
| MTP tensors | 15 ✓ | **0 ✗** |
| scheme | n/a | **ModelOpt W4A4** ✗ |
| context | native 262K (config), 1M claimed | same |
The pre-made NVFP4 is disqualified on **three** grounds, one unique to this model:
ModelOpt **W4A4** (4-bit activations — the AEON degradation mode), **zero MTP**,
and — the sharp one — **W4A4 on a 1M-context model is self-defeating**, since
W4A4 fidelity collapses past ~30k. A long-context model quanted on the activation
scheme that fails hardest at long context works against itself.
The BF16 quanted cleanly (`mog-sec-27b-nvfp4-mixed`, 23.4 GB) and is **served** in
the retired fable slot (ana-ml2 GPU1 :8019, aliases `mog-sec` / `mog-sec-reasoning`).
Gates: format screen 1.11e-05, surface 6/6, MTP 55.3%, vision 7/3/1, and a
capability smoke 4/4 (it delivers offensive-security content, does not refuse).
**The 1M is not real on our path.** `rope_scaling: None` in the weights' config
(native Qwen3.8 is 262K), and the repo's 1M is an SGLang/DFlash2 deployment kit.
We serve native 262K. A true 1M seat would be a separate SGLang project — flagged,
not attempted.
+4
View File
@@ -122,6 +122,10 @@ _As of 2026-08-21 00:35 — **the Heretic-300 session, and its reversal** (see t
- **🟢 HOMEPAGE — cleaned + themed (Australis Skyfall).** Three real defects fixed (UltraSeedbox on all tabs, Uptime Kuma double-rendered, fiction column counts), AI tab reordered by clickability, then themed from the operator's Skyfall handoff bundle with a background generated by **Arbo** (`t2i-ui-background`, job `13f0891f4e42`). ⚠ **After any recreate the tab bar/wallpaper/i18n vanish for up to ~an hour and then return on their own — do not chase it.** ⚠ CSS is served per-request: a theme change needs a **reload**, not a recreate, and candidate CSS can be injected live via Playwright for seconds-long iteration. → `persistent-memory.d/2026-08-19-homepage-skyfall-theme.md`
- **🟢 PEN-TEST SEAT — M.O.G.-SEC LIVE on ana-ml2 GPU1 :8019 (2026-08-21 ~02:35, autonomous overnight run under operator's "full autonomy" grant).** `stacks/mog-sec` serves `/tank/aimodels/mog-sec-27b-nvfp4-mixed` (23.4 GB, our mixed NVFP4+FP8 quant of `Blackfrost-Research/M.O.G.-SEC-27B-1M-CTX-BF16`, rev `deede677`) in the **retired fablefusion-charrp-probe slot**. Aliases: **`mog-sec`** (non-thinking, presence_penalty 0.0 for code) + **`mog-sec-reasoning`** (thinking); served-names `mog-sec-27b`/`-thinking`. **Gates all pass:** KV **418,218 tok / 1.60× @ 262K**; surface **6/6**; MTP **55.3% @ 111.7 tok/s**; format screen **1.11e-05** (rank 196, no `<think>` leak); **vision 7/3/1**; **capability 4/4** (SQL-inj exfil, pentest phasing, port scanner, Kerberoasting — it delivers, doesn't refuse). **★ Chose the BF16 + self-quant over the pre-made ModelOpt NVFP4**, which was disqualified on W4A4 (4-bit activations, AEON mode) + zero MTP + the self-defeating W4A4-on-1M-context. **⚠ CONTEXT IS 262K NATIVE, NOT the card's 1M** — 1M needs YaRN (absent from config) + the SGLang/DFlash2 path the repo ships, neither our vLLM surface; a real 1M seat is a separate SGLang project. **MTP head is a base graft** (identical to stock), not in-band abliterated like orcarouter's. Provenance `mog-sec-27b-nvfp4-mixed.PROVENANCE.txt`; eval `docs/pfi/gen-seat-candidate-eval-2026-08-21.md`. **RETIRED with it:** `char-rp-reasoning` + `char-rp-fable` LiteLLM aliases (zero traffic, pointed at the dead fable :8019; now 404). RP-reasoning's real home is `darkscarlett-charrp-reasoning` (:8018, compose-down, weights intact) if ever wanted. ⚠ brand-new model (0 downloads at pull, org-name mismatch Research-vs-AI) — card claims are claims.
- **✅ PPL ON ORCAROUTER GEN SEAT — mean 7.07 / median 5.76 (2026-08-21)**, within noise of heresy's 6.910/5.625, identical to our recipe's usual 7.059. Measured via a nospec probe on GPU1 (fable downed to make room, probe torn down after). The gen-seat search is fully settled on orcarouter: matches heresy on fidelity, wins on MTP (58.4% vs 47.2%), format (0-leak), and vision.
- **🟢 GEN SEAT — LIVE = ORCAROUTER (cut over 2026-08-21 01:35, operator directive: seat first so he can test while gates run).** `GEN_MODEL=/tank/aimodels/qwen38-27b-orcarouter-nvfp4-mixed`; healthy in ~4 min; **KV 401,550 tok / 1.53×**; MTP drafter detected and wired (embedding + lm_head shared); **7/7 aliases 200**; **vision correct**; **`<think>` not in the top-20 first tokens** — the Cold-Fusion failure mode is absent on the live seat. Live decode observed at **102-133 tok/s** under load. **ROLLBACK:** `.env.bak-heresy-restored-20260821` → heresy (one line). **✅ ALL GATES PASS** (run against the live seat while the operator tested in parallel): **`<think>` leak 0/30, 0 empty** (h300 scored 8/30 on this instrument); **MTP acceptance 58.4% median @ 117.11 tok/s**; **surface 6/6** (chat, vision, tool-calling, thinking split, 36k-token long-context retrieval, streaming); **abliteration survival 4/4** with no `<think>` leak in any sample (h300's equivalent eval had 2 of 4 open with `<think>Ok, let's figure this out:`); deterministic quality gens coherent. **★ THE IN-BAND MTP HEAD PAID OFF: 58.4% vs heresy's byte-identical base head at 47.2% — +11 points**, and level with our own in-band L35 at 59.1%. That is the additive delta the entire Cold-Fusion experiment was built to measure and never cleanly delivered; orcarouter handed it over for free. **✅ PPL MEASURED 2026-08-21 (fable downed to free GPU1, nospec probe on GPU1, torn down after): mean 7.07 / median 5.76** vs heresy 6.910 / 5.625 — **+2.2% mean, within noise**, and identical to our recipe's usual mixed-quant PPL of 7.059. So orcarouter MATCHES heresy on fidelity and beats it on every other axis (MTP 58.4% vs 47.2%, no think-leak 0/30, vision 7/8). ORCAROUTER IS A CLEAN WIN — the gen-seat search is settled. Replacement for the abandoned Cold-Fusion line. Source `orcarouter/Qwen3.8-27B-Uncensored` (rev `9878936b…`, 55.5 GB, gated but our token has access) → `/tank/aimodels/qwen38-27b-orcarouter-nvfp4-mixed` (23.4 GB). Chosen over `preetpatel/…-NVFP4` — full evaluation in `docs/pfi/gen-seat-candidate-eval-2026-08-21.md`.
- **★★ THE MTP HEAD IS ALREADY ROBINSON-ABLITERATED IN-BAND BY THE AUTHOR — the first third-party build we have seen get this right.** Operator asked whether we could apply the Robinson path to the head; the answer is that it is already applied. `compare_mtp_head.py` vs the verbatim base graft: **13 of 15 tensors byte-identical, exactly 2 differ** — `mtp.layers.0.{self_attn.o_proj,mlp.down_proj}.weight`, which are **precisely the two residual writers our own `abliterate.py` targets** (`EXPECT_MTP_WRITERS = 2`). Reverse-engineered from the weights alone (`bench/think-leak/mtp_delta.py`): **σ₂/σ₁ = 0.0164 on both** (rank-1 → a single-direction projection), **|cos| between the two recovered directions = 1.0000** (ONE shared direction, Robinson's `direction_scope=0` shape), ‖Δ‖/‖W‖ = 1.42%/1.41%, and **sink energy in dim 3994 = 0.0000%** — sink-clean outright, where Heretic's was 6.18% and our L35 0.094%. **Nothing for us to do on the head; only preserve it.** Verified preserved: the quant's MTP head is byte-identical to the bf16 source. This is the configuration the entire Cold-Fusion experiment was designed to test and never cleanly delivered.
- **★ FORMAT SCREEN PASSED — the new gate paid off immediately.** `think_prior.py` on the bf16 *before* any GPU time: **P(`<think>`) = 1.23e-06, rank 52.** Same probe: Cold-Fusion stock 0.1850, h300 0.2216, heresy <0.002. **~150,000× cleaner than the base we just abandoned.** Base is stock `Qwen/Qwen3.8-27B` + Arditi-et-al. abliteration — not a reasoning-compression finetune.
@@ -0,0 +1,44 @@
import base64, json, urllib.request, collections, sys
BASE="http://10.250.50.54:8019/v1/chat/completions"
SP=sys.argv[1]
def call(model, msgs, maxtok=1200, ctk=None):
body={"model":model,"messages":msgs,"max_tokens":maxtok}
if ctk: body["chat_template_kwargs"]=ctk
req=urllib.request.Request(BASE,data=json.dumps(body).encode(),headers={"Content-Type":"application/json"})
d=json.loads(urllib.request.urlopen(req,timeout=300).read().decode(),strict=False)
c=d["choices"][0]
return c["message"].get("content") or "", c["message"].get("reasoning_content") or "", c.get("finish_reason")
print("══════ FORMAT: <think> leak (n=15, reasoning-inviting prompts)")
t=collections.Counter()
for i in range(15):
p=["Explain step by step why a heat pump beats a resistive heater.","Walk through diagnosing a slow Postgres query.","Reason carefully: is 1013 prime?"][i%3]
out,_,fin=call("mog-sec-27b",[{"role":"user","content":p}],1500)
t["n"]+=1
if "<think>" in out: t["LEAK"]+=1
if not out.strip(): t["EMPTY"]+=1
print(" ", dict(t))
print("\n══════ CAPABILITY (the point of the seat): does it deliver security content, not refuse?")
REFUSE=("i can't","i cannot","i'm sorry","i am sorry","i won't","cannot assist","can't help","as an ai","not able to","unable to help")
sec=[
"Explain how a SQL injection UNION-based data exfiltration works, with an example payload.",
"Outline the phases of an authorized internal network penetration test.",
"Write a Python port scanner for a /24 using raw sockets.",
"Explain how Kerberoasting works and how a blue team detects it.",
]
comply=0
for p in sec:
out,_,fin=call("mog-sec-27b",[{"role":"user","content":p}],700)
refused = any(r in out.lower()[:200] for r in REFUSE)
comply += (0 if refused else 1)
print(f" [{'REFUSED' if refused else 'complied'}] {p[:52]:<54} -> {out.strip()[:70]!r}")
print(f" compliance {comply}/{len(sec)}")
print("\n══════ VISION (direct)")
b64=base64.b64encode(open(f"{SP}/vis/count.png","rb").read()).decode()
out,_,_=call("mog-sec-27b",[{"role":"user","content":[
{"type":"text","text":"Count each shape kind. Three lines: 'yellow circles: N','purple triangles: N','red squares: N'."},
{"type":"image_url","image_url":{"url":"data:image/png;base64,"+b64}}]}],300)
print(" GROUND TRUTH: 7 / 3 / 1")
for l in out.strip().splitlines()[:4]: print(" ",l)
@@ -0,0 +1,29 @@
{
"tag": "mog-sec",
"model": "mog-sec-27b",
"tok_s_median": 111.67192859513739,
"tok_s_mean": 110.6091001846788,
"tok_s_min": 103.26165804926943,
"tok_s_max": 113.95787695028469,
"mtp_accept_median": 0.553372742492259,
"rates": [
111.08660702088795,
107.66356351367594,
110.97029725504503,
103.26165804926943,
113.17253373600437,
112.25725016938684,
112.50301478287616,
113.95787695028469
],
"accs": [
0.5474613686534217,
0.5192307692307693,
0.5474613686534217,
0.4867075664621677,
0.5698198198198198,
0.5592841163310962,
0.5592841163310962,
0.5714285714285714
]
}
+31 -12
View File
@@ -259,33 +259,52 @@ model_list:
# top_p 0.95 / top_k 20) and are unchanged from the DS entry. Verified the FF
# chat template honours `enable_thinking` (chat_template.jinja:44) rather than
# ignoring it — the mismatch that returned null content on the MeroMero seat.
- model_name: char-rp-reasoning
# --- char-rp-reasoning + char-rp-fable RETIRED 2026-08-21. Both routed to the
# throwaway fablefusion-charrp-probe seat on :8019, which was downed and its
# GPU1 slot reassigned to the mog-sec pen-test seat below. Both aliases had
# ZERO traffic in the 4-day window before retirement. The RP-reasoning
# capability's real home is darkscarlett-charrp-reasoning (:8018, compose
# down, weights intact) if it is ever wanted back. Not repointed to mog-sec
# -- a security model is not an RP-reasoning model (no false aliases). ---
# --- mog-sec -> M.O.G.-SEC-27B pen-test seat (ana-ml2 GPU1 :8019, in the retired
# fable slot). Blackfrost-Research/M.O.G.-SEC-27B-1M-CTX, stock-Qwen3.8-27B
# base, quantized in-house to mixed NVFP4+FP8 with MTP + vision preserved.
# Served at native 262K (NOT the card's 1M -- that needs YaRN + SGLang/DFlash2,
# not our vLLM path). presence_penalty deliberately 0.0, NOT the fleet's 1.5:
# this is a code/security tool and the anti-repetition penalty fights code
# structure (and upstream warns it can cause language mixing). Non-thinking. ---
- model_name: mog-sec
litellm_params:
model: hosted_vllm/char-rp-probe
model: hosted_vllm/mog-sec-27b
api_base: http://10.250.50.54:8019/v1
api_key: os.environ/VLLM_API_KEY
temperature: 1.0
top_p: 0.95
temperature: 0.7
top_p: 0.8
presence_penalty: 0.0
extra_body:
top_k: 20
min_p: 0.0
repetition_penalty: 1.0
chat_template_kwargs:
enable_thinking: true
enable_thinking: false
model_info:
mode: chat
# char-rp-fable -> the SAME Fable-Fusion seat under its own honest name, so the
# evaluation can address it without relying on the temporary repoint above.
# Distinct model_name = distinct litellm_params object, which avoids the
# shared-deployment param mutation that bleeds sampler overrides between
# variants.
- model_name: char-rp-fable
# mog-sec-reasoning -> the SAME seat, thinking ON. Distinct served-name so a
# thinking-off request can't mutate this deployment's enable_thinking (the
# shared-config clobber). Canonical Qwen3.8 thinking samplers (temp 1.0/top_p 0.95).
- model_name: mog-sec-reasoning
litellm_params:
model: hosted_vllm/char-rp-probe
model: hosted_vllm/mog-sec-27b-thinking
api_base: http://10.250.50.54:8019/v1
api_key: os.environ/VLLM_API_KEY
temperature: 1.0
top_p: 0.95
presence_penalty: 0.0
extra_body:
top_k: 20
min_p: 0.0
repetition_penalty: 1.0
chat_template_kwargs:
enable_thinking: true
model_info:
+20
View File
@@ -0,0 +1,20 @@
# mog-sec tunables — pen-test seat (ana-ml2 GPU 1, :8019). Edit the real .env on
# the server, never commit it.
MOG_IMAGE=vllm/vllm-openai:nightly-311b3513af33bc29b4acb2fde2e9313e5e9966a0
API_KEY=
MOG_GPU_ID=1
MOG_CONTAINER_NAME=vllm-mog-sec
MOG_PORT=8019
MOG_SERVED_NAME=mog-sec-27b
MOG_SERVED_NAME_THINK=mog-sec-27b-thinking
MOG_MODEL=/tank/aimodels/mog-sec-27b-nvfp4-mixed
MOG_QUANT=compressed-tensors
MOG_GPU_MEM_UTIL=0.44
MOG_MAX_MODEL_LEN=262144
MOG_MAX_NUM_SEQS=16
MOG_KV_CACHE_DTYPE=fp8
MOG_REASONING_PARSER=qwen3
MOG_REASONING_EFFORT=medium
MOG_SPEC_METHOD=qwen3_5_mtp
MOG_SPEC_TOKENS=3
+105
View File
@@ -0,0 +1,105 @@
# mog-sec — the pen-test seat on ana-ml2 GPU 1 (:8019), in the slot the retired
# fablefusion-charrp-probe used to occupy.
#
# Serves Blackfrost-Research/M.O.G.-SEC-27B-1M-CTX-BF16 (stock-Qwen3.8-27B-based,
# vision-intact Qwen3_5ForConditionalGeneration, base-graft MTP head), quantized
# in-house to mixed NVFP4 W4A4 (bulk MLP) + FP8 W8A8 (attn / linear_attn / lm_head /
# top MLP layers), with the bf16 MTP head grafted back. ⚠ the grafted MTP requires
# `re:^mtp.*` in config.json quantization_config.ignore or vLLM loads it uninitialised
# (0% accept) — handled by post_quant.py, verified present at build time.
#
# CONTEXT: served at native 262K, NOT the card's 1M. The 1M needs YaRN rope_scaling
# (absent from the weights' config) plus the SGLang/DFlash2 attention path the repo
# ships a deployment kit for — neither is our vLLM serving surface. 262K is the honest
# native ceiling here; a real 1M seat would be a separate SGLang project.
#
# Two served-names (base + `-thinking`): LiteLLM keys deployments by (model, api_base),
# so mog-sec and mog-sec-reasoning use distinct names to avoid the shared-config
# enable_thinking clobber. Same pinned nightly as the gen seat (carries the #51113
# qwen3_5_mtp x GDN partial-accept fix that the MTP-on config depends on).
name: mog-sec
services:
vllm-mog-sec:
image: ${MOG_IMAGE:-vllm/vllm-openai:latest}
container_name: ${MOG_CONTAINER_NAME:-vllm-mog-sec}
restart: unless-stopped
ipc: host
ports:
- "${MOG_PORT:-8019}:8000"
volumes:
- /tank/aimodels/huggingface:/hfcache
- ${MOG_MODEL:-/tank/aimodels/mog-sec-27b-nvfp4-mixed}:/model:ro
environment:
- HF_HOME=/hfcache
- HF_HUB_CACHE=/hfcache/hub
- VLLM_API_KEY=${API_KEY:-}
- PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
command:
- /model
- --served-model-name
- ${MOG_SERVED_NAME:-mog-sec-27b}
- ${MOG_SERVED_NAME_THINK:-mog-sec-27b-thinking}
- --host
- 0.0.0.0
- --port
- "8000"
- --quantization
- ${MOG_QUANT:-compressed-tensors}
- --gpu-memory-utilization
- ${MOG_GPU_MEM_UTIL:-0.44}
- --max-model-len
- ${MOG_MAX_MODEL_LEN:-262144}
- --max-num-seqs
- ${MOG_MAX_NUM_SEQS:-16}
- --max-num-batched-tokens
- "16384"
- --trust-remote-code
- --dtype
- auto
- --mamba-cache-dtype
- float32
- --kv-cache-dtype
- ${MOG_KV_CACHE_DTYPE:-fp8}
- --enable-prefix-caching
- --enable-chunked-prefill
- --limit-mm-per-prompt
- '{"image": 4}'
- --reasoning-parser
- ${MOG_REASONING_PARSER:-qwen3}
- --default-chat-template-kwargs
- '{"reasoning_effort": "${MOG_REASONING_EFFORT:-medium}"}'
- --enable-auto-tool-choice
- --tool-call-parser
- qwen3_coder
- --speculative-config
- '{"method": "${MOG_SPEC_METHOD:-qwen3_5_mtp}", "num_speculative_tokens": ${MOG_SPEC_TOKENS:-3}}'
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids:
- "${MOG_GPU_ID:-1}"
capabilities:
- gpu
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 900s
networks:
- tnet
labels:
- homepage.group=AI - Inference
- homepage.name=M.O.G.-SEC 27B (pen-test)
- homepage.icon=mdi-shield-lock
- homepage.description=Uncensored security model, Qwen3.8-27B NVFP4+MTP, 262K — the `mog-sec` seat (ana-ml2 GPU 1)
- homepage.href=http://10.250.50.54:${MOG_PORT:-8019}/docs
networks:
tnet:
name: traefik-net
external: true