Backend: - MTP-Drafter-Support (Multi-Token-Prediction): erkennt MTP-Köpfe neben dem Modell (mtp-*.gguf / *-assistant, arch gemma4-assistant), schreibt --model-draft … --spec-type draft-mtp --spec-draft-n-max statt draft-simple. _parse_model erkennt --model-draft/-md; drafts_for/set_spec_draft/find_compatible_draft MTP-bewusst. Backward-kompatibel (klassische Drafts unverändert). (config.SPEC_DRAFT_N_MAX) - register_model: cache-reuse/-cram als Default (Drift-Fix — neue Installs wie der hand-getunte Box-Stand), --parallel 2 nur noch für coder (kein ctx-Halbierungs-Footgun), Spec-Auto-Attach für alle Rollen self-guarding. - budget.reserved_gb auf die VERIFIZIERTE llama-swap-Gruppen-Swap-Semantik angeglichen: on-demand-Modelle verdrängen die brains-Gruppe und laufen allein (reservieren 0, voller GTT); brains-Member reservieren nur die übrigen Member. Tote _persist_members entfernt. Frontend: - SpecDraftModal zeigt MTP-Drafter mit MTP-Badge (DraftInfo.mtp). Docs: - docs/OPTIMIZATION_PLAN.md: vollständiges Audit + Umsetzungs-Log (W1/W2 Warm-Set, gemma ctx/fa/cache-reuse/MTP 52→70,8 t/s, fast --parallel 1, scout=GLM-4.6V-Flash), alles live gegen die Box verifiziert. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 KiB
Optimierungsplan MC2 — Rollen, Warm-Set & Durchsatz (Strix Halo)
Audit-Ergebnis + Maßnahmenplan. Erst Plan, dann Umsetzung nach Freigabe. Alles reversibel (Config-Backups vor jeder Box-Änderung). Stand: 2026-06-30. Quellen: Code-Audit (
backend/,frontend/) + Live-Box-Verifikation per SSH (/running, vollerconfig.yaml,free,du, t/s-Probe) +docs/AUDIT_KICKOFF.md/CLAUDE_CODE_BRIEF_lucy-brain-role.md.
0. TL;DR (Priorität nach echtem Impact)
- ✅ ERLEDIGT — Warm-Set korrigiert (W1/W2, 2026-06-30, live verifiziert):
brainsjetzt = gemma + embedding + vision (swap:false, persist:true, ~31 GB). Wichtige Korrektur durch Live-Test: das ursprünglich vermutete OOM-Risiko existiert NICHT — llama-swap swappt ganze Gruppen statt sie zu ko-laden (cross-group Load = Gruppe raus, neues Modell rein; kein Speicher-Überlauf). Der echte Punkt war ein anderer: vorher pinntebrainsauchfast(Chat-Lane-Hirn, kein Nutzen für Lucy → ~28 GB verschenkt), und in der reinengemma+embed-Variante hätte Lucys Sehen ihr Hirn verdrängt. Jetzt halten Hirn + Gedächtnis + Sehen zusammen warm (verifiziert: gemma & vision ko-resident, 37 GB, kein Evict). Reversibel. - MTP-Spec-Decoding für gemma: 53 t/s → erwartet ~80–100 t/s (1,5–2×, 0 Qualitätsverlust). Drafter-GGUF
fehlt auf der Box und MC2 kennt MTP-Drafter gar nicht (nur klassisches
draft-simple). [mittel] - coder-Spec-Draft verifizieren:
coder(Qwen3-Coder-Next) hat--spec-draft-model Qwen3-0.6B-Q8_0 --spec-type draft-simpleaktiv — ist dieser Draft wirklich vocab-kompatibel zu Qwen3-Coder-Next? Wenn nein, bremst/bricht Spec still. [Check] - Neues
scout-Modell (multimodaler Allrounder, Tools): HF-verifizierter Primärpick GLM-4.6V-Flash (9B) — Q4 ~6 GB + mmproj, natives Tool-Calling, schlägt unser vision-Modell. Alt: Gemma-4-12B. (Qwen3.5-VL-MoE verworfen — kein gepflegtes GGUF.) [Recherche/Download] - gemma-ctx 128k → 64k: kleiner Hebel (real nur ~2 GB, weil Gemmas KV winzig ist — s. §1.4), trotzdem sinnvoll (freigegeben). Kein Funktions-Risiko für agentische Turns. [risikoarm]
1. IST-Zustand (live verifiziert per SSH, 2026-06-30)
1.1 Rollen-Taxonomie — Code ist konsistent ✅
Der Brain-Rolle-Umbau aus CLAUDE_CODE_BRIEF_lucy-brain-role.md ist bereits umgesetzt (Commit dd99401).
hermes (= Lucys Hirn) ist als kanonische Rolle in ALLEN Quellen synchron: llamaswap.ROLE_IDS,
sources.ROLE_IDS+CATEGORIES, roles.py (_capability_suit/_pref/_reason), Frontend ModelBadges.ROLES.
Die „hermes-Altlast/Inkonsistenz" aus dem Brief existiert nicht mehr.
1.2 Brain-Warm-Flow — Code ist fertig ✅, Box bestätigt ✅
POST /api/models/{id}/role role=hermes → agent.set_agent_brain(): Alias + brains:{swap:false,persist:true}
- ttl 0 (altes Hirn raus/entspannt) + Hermes
model.default+ Gateway-Restart + Budget-Warnung.brain_status()prüft per/running. Box bestätigt das Akzeptanzkriterium:gemma-4-26B-A4B-itistready,ttl:0, Aliashermes, und ingroups.brains(swap:false, persist:true). Lucy bleibt warm — kein Kalt-Nachladen. ✅
1.3 Live-Config aller Rollen (/etc/llama-swap/config.yaml, globalTTL: 0)
| Rolle (alias) | Modell | Gewichte (du) | ctx | ttl | Besonderheiten |
|---|---|---|---|---|---|
| fast | Qwen3.6-35B-A3B | 22 GB | 65536 | 0 | --parallel 2, mmproj, --cache-reuse 256 -cram 16384, kein Spec, in brains |
| heavy | Qwen3.5-122B-A10B | 73 GB | 32768 | 600 | split-GGUF, --cache-reuse 256 -cram 16384, kein Spec |
| coder | Qwen3-Coder-Next | 46 GB | 131072 | 600 | --parallel 2, Spec aktiv (Qwen3-0.6B-Q8 / draft-simple) |
| coder-lite | Qwen3-Coder-30B-A3B | 18 GB | 131072 | 300 | --cache-reuse 256 -cram 16384 |
| vision | Qwen3-VL-8B-Instruct | 6 GB | 32768 | 300 | mmproj, in brains (gepinnt!) |
| embed | Qwen3-Embedding-0.6B | 1 GB | 8192 | 0 | --embedding --pooling last, in brains |
| hermes (Hirn) | gemma-4-26B-A4B-it | 17 GB (+1,2 mmproj) | 131072 | 0 | mmproj, --jinja, kein Spec, in brains |
groups.brains = {swap:false, persist:true, members:[embedding, vision, fast, gemma]}.
1.4 Speicher-Realität (GTT = 124 GB, amdgpu.gttsize=126976)
Wichtige Korrektur ggü. der reinen fit.py-Schätzung: mit NUR gemma@131072 geladen meldet die Box
25,9 GB used → gemma resident ≈ ~22 GB (≈17 Gewichte + 1,2 mmproj + nur ~4 GB KV). Gemma-4 nutzt
starke Sliding-Window-Attention → KV ist viel kleiner, als fit.py (kalibriert an Hermes-14B) vorhersagt.
Folge: gemma-ctx-Reduktion spart real nur ~2 GB; der echte Druck kommt vom Warm-Set, nicht vom Hirn-ctx.
llama-swap-Gruppen-Semantik (live verifiziert, korrigiert frühere Annahme): Eine swap:false-Gruppe hält
NUR ihre EIGENEN Member ko-resident. Ein Modell in einer ANDEREN Gruppe (heavy/coder = je eigene implizite
Gruppe) zu laden swappt die gesamte aktive Gruppe raus und lädt das neue Modell allein. persist:true
verhindert nur das Idle-TTL-Entladen, NICHT das Gruppen-Swapping. Folge: es gibt kein OOM durch
Ko-Laden (heavy lädt allein, 79 GB < 124 ✓) — aber das Hirn ist bei cross-group Loads (heavy/coder) nicht
geschützt: es wird mitgeswappt und lädt danach kalt nach (~Sekunden). Beweis: heavy laden → /running zeigte
nur heavy (78,7 GB), gemma weg trotz persist.
Konsequenz fürs Design (umgesetzt): Lucys zusammengehöriges Set (Hirn + Gedächtnis + Sehen) MUSS in DERSELBEN
swap:false-Gruppe stehen, sonst verdrängt schon Lucys eigenes Sehen ihr Hirn. → brains = gemma + embed + vision (~31 GB). heavy/coder/coder-lite/fast = on-demand (swappen die brains-Gruppe beim Laden raus — ok, das
sind separate Aktivitäten IDE/Delegation; Lucy lädt danach kurz nach).
1.5 Durchsatz (live gemessen)
gemma (Hirn): ~53 t/s Generierung, ~173 t/s Prompt (warm, kurzer Prompt). Solide Basis für ein 26B-A4B (4B aktiv) auf der bandbreitenlimitierten APU; MTP-Ziel ~80–100 t/s.
2. Verifikations-Status (war §2 „offen" — jetzt aufgelöst)
-
V1 (gemma in
brains:{swap:false}?) → JA ✅ (Akzeptanzkriterium erfüllt). -
V2 (t/s) → gemma 53 t/s gemessen ✅. fast/heavy/coder noch nicht gemessen (Laden würde Warm-Set stören).
-
V3 (Voll-Config) → komplett gelesen (§1.3) ✅.
-
V4 (GTT/Belegung) → GTT 124 GB, gemma-only 25,9 GB used ✅. Cross-group-Load swappt Gruppen (kein OOM, aber Hirn ungeschützt) — live verifiziert (§1.4). Behoben durch W1/W2.
-
V5 (coder-Spec-Draft) → AUFGELÖST ✅: Qwen3-0.6B-Q8 ↔ Qwen3-Coder-Next = gleicher
tokens_sha facf459…, n_vocab 151936,compatible: True. coder-Spec ist gültig & aktiv. (Bonus-Opportunität §9.2 F4.)
3. Maßnahmen je Rolle
3.1 ✅ Warm-Set / KO-Residenz — ERLEDIGT (2026-06-30, live verifiziert)
| # | Maßnahme | Status / Begründung |
|---|---|---|
| W1/W2 | brains:{swap:false,persist:true} = gemma + embedding + vision (~31 GB); fast raus (Chat-Lane-Hirn, kein Lucy-Nutzen, ~28 GB gespart) |
✅ angewendet via PUT /api/groups (Backup config.yaml.bak-20260630-152911). Verifiziert: gemma & vision ko-resident, kein Evict (37 GB used); gemma bleibt ready. |
| — | heavy/coder/coder-lite/fast = on-demand | Korrekt: kein OOM (Gruppen-Swap), Lucys Set bleibt zusammen warm. Trade-off: nach heavy-Delegation / IDE-Coding lädt Lucy kurz nach (~s). |
| Optional | fast wieder pinnen, falls Chat-Lane dauerwarm sein soll | +28 GB Pin, swappt aber bei jedem heavy/coder-Load eh raus → geringer Nutzen. Auf Wunsch nachrüstbar. |
3.2 hermes / Lucys Hirn — gemma-4-26B-A4B-it
| # | Maßnahme | Begründung / Zahlen | Risiko | Revert |
|---|---|---|---|---|
| H1 | ctx 131072 → 65536 | Spart real nur ~2 GB (Gemma-KV winzig), aber konsistent mit fast (hermes-fast-context-blocker) und Agent-Turns brauchen selten >64k. |
niedrig | ctx zurück |
| H2 | MTP-Spec-Decoding (s. §4) | 53 → ~80–100 t/s. Drafter ~0,4 B → Budget vernachlässigbar. | mittel | Spec-Flags raus |
| H3 | gemma sollte ggf. --cache-reuse 256 bekommen (wie fast/heavy/coder) — fehlt aktuell |
KV-Reuse über Turns → weniger Prompt-Reprocessing bei Agent-Ketten. | niedrig | Flag raus |
3.3 fast — Qwen3.6-35B-A3B (chat-Lane)
- ctx 65536,
--parallel 2, kein Spec (gut — vermeidet den qwen2.5-Vocab-Bruch). Belassen, aber W2 (raus aus dem harten Pin). Optional Qwen-Spec-Draft nur, wenn vocab-kompatibel zu Qwen3.6 (Check viagguf_meta).
3.4 heavy — Qwen3.5-122B-A10B
- 73 GB, ctx 32768, ttl 600, on-demand. Belassen. Profitiert direkt von W1/W2 (kann wieder laden). Kein Spec (kein etablierter kompatibler Qwen3.5-Draft) — erst prüfen, sonst lassen.
3.5 coder / coder-lite
- coder (Qwen3-Coder-Next, 46 GB, ctx 131072): Spec aktiv mit Qwen3-0.6B-Q8 → V5: Vocab-Kompatibilität verifizieren. Falls inkompatibel → Draft entfernen (still kein Speed-Gewinn, evtl. Fehlerquelle).
- coder-lite (Qwen3-Coder-30B-A3B, 18 GB, ctx 131072): coding-Lane-Default, schnell (3B aktiv). Belassen.
Hinweis: Alias heißt
coder-lite(Bindestrich) — die Lanes referenzierencoder_lite; sicherstellen, dass das Routing (router_logic.py/routing_policy.py) auf den richtigen Alias zeigt (Konsistenz-Check, kein Box-Risiko).
3.6 vision — Qwen3-VL-8B-Instruct
- 6 GB, ctx 32768. Belassen, aber W2 (verdrängbar statt hart gepinnt). Sehen ist bursty → on-demand/warm-soft reicht.
3.7 embed — Qwen3-Embedding-0.6B
- 1 GB, ttl 0, bleibt hart gepinnt (W1). Unantastbar — Mem0/Gedächtnis hängt dran.
3.8 scout — VAKANT → §5
4. MTP-Speculative-Decoding für gemma (Backend+UI-Erweiterung)
Problem: MC2 kennt nur klassische Drafts. spec_draft_flags() schreibt --spec-draft-model <d> --spec-type draft-simple; find_compatible_draft() scannt nur DRAFTS_DIR mit stumpfem
gguf_meta.compatible(). Ein MTP-Kopf (gemma-4-26B-A4B-it-assistant, Arch gemma4_assistant) wird nie
angeboten. Engine 9843 kann --spec-type draft-mtp ✓; alte --draft-max/-min sind entfernt →
--spec-draft-n-max/-n-min.
Schritte:
- Drafter beschaffen (Box, fehlt noch) — ⚠️ Brief-Korrektur (HF-verifiziert 2026-06-30): der Drafter
heißt NICHT
…-assistant. Inunsloth/gemma-4-26B-A4B-it-GGUFliegt er alsmtp-gemma-4-26B-A4B-it.gguf(Repo-Root, 0,46 GB) bzw.MTP/gemma-4-26B-A4B-it-Q8_0-MTP.gguf(0,46 GB; BF16/F16-Varianten 0,86 GB). Eine Datei nach/srv/models/gemma-4-26B-A4B-it-GGUF/laden (Q8-MTP = kleinste, ~0,46 GB). Flags (laut unsloth MTP/README):--model-draft <mtp.gguf> --spec-type draft-mtp --spec-draft-n-max 4(kein--spec-draft-n-minnötig; neuere llama.cpp auto-entdeckt die Root-mtp-*.gguf).-md= Kurzform. - Backend (
llamaswap.py): MTP-Pfad ergänzen — MTP-Drafter als gültigen, vocab-kompatiblen Draft erkennen (Arch/Name*-assistant*); beim Aktivieren-md <assistant.gguf> --spec-type draft-mtp --spec-draft-n-max N --spec-draft-n-min Mschreiben (statt--spec-draft-model/draft-simple)._parse_modelumdraft-mtp/-mderweitern (UI-Status). Flag-Namen mitllama-server --help(9843) gegenprüfen. - Frontend: Draft-Modal MTP-Drafter als empfohlene Option für gemma führen („MTP-Kopf, vocab-kompatibel ✓").
- Verifizieren: t/s vor/nach (Basis 53 t/s) gegen die Box.
Risiko mittel (neue Flag-Logik); voll reversibel.
5. Neues scout-Modell (Empfehlung)
Profil: multimodaler Allrounder, klein/MoE (schnell auf bandbreitenlimitierter Box), Tool-Calling, KO-Residenz-freundlich, distinkt von Hirn (gemma-4) und vision (Qwen3-VL-8B).
HF-verifiziert 2026-06-30 (Verfügbarkeit + Dateigrößen real geprüft, nicht geraten):
| Pick | Modell | Verifizierte Fakten | Hinweis |
|---|---|---|---|
| Primär | GLM-4.6V-Flash (9B) | GGUF da: unsloth/GLM-4.6V-Flash-GGUF (29 Quants, 12k+ dl), lmstudio-community, MaziyarPanahi. Q4_K_M = 6,17 GB + mmproj 1,84 GB ≈ 8 GB. Natives multimodales Function-Calling, 128k ctx. Benchmarks: schlägt Qwen3-VL-8B (= unser aktuelles vision-Modell) in fast allen Kategorien. |
9B dense (nicht MoE), aber bei 9B/6 GB trotzdem schnell. on-demand (nicht pinnen). Könnte perspektivisch sogar vision ablösen. |
| Alt A | Gemma-4-12B-it (dense, multimodal) | GGUF breit verfügbar: unsloth/gemma-4-12b-it-GGUF (1,4 Mio dl), google/…-qat, lmstudio. |
dense → auf Bandbreiten-Box etwas langsamer; Familien-Dopplung mit dem Hirn (auch Gemma-4). |
VERWORFEN: kein gut gepflegtes GGUF — nur EIN Nischen-Repo (jc-builds/Qwen3.5-9B-VLM-Q4_K_M, kein Trusted-Author). Meine frühere „familien-treu"-Empfehlung war ungedeckt. |
nicht nehmen. |
Vorgehen: GLM-4.6V-Flash (Q4_K_M ~6 GB + mmproj) via „Modelle finden"//api/models/install laden → Rolle
scout, on-demand → Mini-Benchmark (t/s + Vision+Tool-Prompt). Quellen (tagesaktuell, 2026-06):
VentureBeat: GLM-4.6V native tool-calling ·
zai-org/GLM-4.6V-Flash (HF) ·
GLM-4.6V Flash 9B Review/Benchmarks ·
SiliconFlow: schnellste OSS-Multimodal 2026.
6. KO-Residenz-Set (umgesetzt, live verifiziert)
Lucys Warm-Set (brains:{swap:false,persist:true}): gemma-Hirn + embedding + vision = ~31 GB.
Diese drei MÜSSEN zusammen in einer Gruppe sein (sonst verdrängt Lucys Sehen ihr eigenes Hirn — Gruppen-Swap).
Rein on-demand (swappen die brains-Gruppe beim Laden raus): fast, heavy, coder, coder-lite, scout.
Verifiziert: gemma+vision ko-resident (37 GB, kein Evict); heavy-Load swappt die Gruppe (kein OOM, 79 GB).
Hinweis budget.reserved_gb: das Modul nimmt an, fast/vision seien verdrängbar persist-Member, die NEBEN
dem Hirn warm bleiben. Real swappt llama-swap aber die ganze Gruppe → die reserved_gb-Mathematik ist für
cross-group-Loads zu konservativ (rechnet Hirn+Rest gleichzeitig, was nie passiert). Folge-Task (Code):
budget.reserved_gb an die echte Gruppen-Swap-Semantik angleichen (nur das brains-Set zählt als resident,
on-demand-Modelle laufen allein). Kein Box-Risiko, nur genauere ctx-Empfehlungen.
7. Reihenfolge / Risiko / Revert
| Schritt | Aktion | Risiko | Revert |
|---|---|---|---|
| 0 | ✅ Box-Backup config.yaml.bak-20260630-152911 |
– | – |
| 1 | ✅ W1+W2 brains = gemma+embed+vision (via PUT /api/groups), verifiziert |
niedrig | set_group zurück |
| 2 | H1 gemma ctx → 65536; H3 --cache-reuse 256 ergänzen |
niedrig | ctx/Flag zurück |
| 3 | V5 coder-Draft-Vocab prüfen; inaktive Spec entfernen | niedrig | – |
| 4 | §4 MTP: Drafter laden → Backend/UI-Erweiterung → gemma-cmd → t/s-Vergleich | mittel | Spec-Flags raus |
| 5 | §5 scout recherchieren/installieren/zuweisen (on-demand) | niedrig | Modell löschen |
8. Offene Entscheidungen (für dich)
- Warm-Set-Fix (W1/W2) jetzt umsetzen? — behebt die heavy-OOM-Gefahr, mein klare Empfehlung als Erstes.
- fast/vision verdrängbar via eigener Gruppe
swap:true(sie swappen sich gegenseitig) oder schlichtpersist:false? (Detail des Umbaus.) - MTP jetzt oder als eigener Block? (Code-Erweiterung Backend+UI + Drafter-Download.)
- scout-Pick: GLM-4.6V (Primär) oder familien-treu Qwen3.5-VL-MoE?
- gemma-ctx 65536 ist gesetzt (deine Wahl) — ok so.
9. Gesamtbild: Engine- (llama.cpp) & Router- (llama-swap) Flags — verifiziert gegen Build 9843
Der Brief deckte das nicht ab. Alle Aussagen hier gegen
llama-server --help(9843) + Live-Config geprüft.
9.1 Cross-cutting (alle Chat-Modelle): -ngl 999 -fa 1 --no-mmap -c <ctx> --jinja
-ngl 999✅ korrekt (volle Offload-Last in GTT auf der APU).-fa 1→ funktioniert, ist aber Legacy-Form. Aktuell:-fa [on|off|auto](Defaultauto). Auf-fa onnormalisieren (oder weglassen → auto), sonst Risiko bei künftigem Build. [niedrig]--no-mmap✅ bewusst (volle RAM-Residenz statt file-backed Pages; sinnvoll für warm gehaltene Modelle auf Unified Memory). Behalten.
9.2 Pro-Modell-Befunde & Hebel
| # | Befund | Hebel | Prio |
|---|---|---|---|
| F1 | gemma (Hirn) fehlt --cache-reuse 256 -cram 16384 — der Agent macht die meiste Multi-Turn-/Tool-Arbeit, nutzt aber nur den 8 GB-Default-Cache & kein KV-Reuse über Turns |
ergänzen → System-Prompt + History-KV werden wiederverwendet, weniger Prompt-Reprocessing, schnellere Folge-Antworten | hoch (Quick-Win) |
| F2 | --parallel 2 (fast/coder) ↔ Kontext: unified KV ist „enabled if slots auto" — mit explizitem --parallel 2 evtl. AUS → harte ctx-Teilung (fast 32k/Anfrage, coder 65k/Anfrage). -cram SOLL unified erzwingen, Help mehrdeutig |
V6: n_ctx_per_seq aus /props verifizieren (beim nächsten Load). Dann: --parallel 1/auto (volle ctx, wenn keine Nebenläufigkeit) oder explizit -kvu setzen |
mittel |
| F3 | KV-Quant -ctk q8_0 -ctv q8_0 nirgends — v.a. coder/coder-lite @131072 tragen große KV |
für die langen Coding-Kontexte testen → ~halbe KV bei min. Qualitätsverlust (FA-Interaktion prüfen) | mittel |
| F4 | coder-Spec ✅ kompatibel (verifiziert). Derselbe Draft (tokens_sha facf459) ist evtl. auch zu heavy (122B-A10B) & coder-lite kompatibel |
Spec-Decoding für heavy prüfen → 10B aktiv, dense-artig → spürbarer Durchsatz möglich. Via /api/models/drafts?target=<heavy.gguf> verifizieren |
mittel |
| F5 | fast trägt --mmproj (ist vision-fähig) — bewusst? +~1 GB |
wenn die Chat-Lane nie Bilder bekommt: mmproj sparen | niedrig |
| F6 | -b/-ub (batch/ubatch), -t (threads) ungenutzt = Defaults |
Prompt-Speed evtl. via -ub tunbar — messen statt raten, niedrige Prio |
niedrig |
9.3 llama-swap (Router-Ebene)
globalTTL: 0✅ ok (Modelle haben überwiegend explizite ttl).healthCheckTimeout: 300✅ reicht auch für heavy (~60 s Load gemessen). Gruppen-Swap-Semantik verstanden (§1.4), brains gefixt (§3.1).- Systemischer Befund (Code↔Box-Drift): MC2
config._DEFAULT_CMD_TEMPLATE=llama-server -m {model} --host … --port ${PORT} -c {ctx} -ngl 999 -fa 1 --no-mmap— kennt KEINE der auf der Box manuell ergänzten Optimierungen (--cache-reuse,-cram,--parallel, KV-Quant). Folge: neu über MC2 installierte Modelle bekommen diese Tunings NICHT automatisch → die Box driftet von der Code-Quelle weg. Fix (Code): sinnvolle Defaults ins Template /register_model(rollenabhängig), damit „Modelle finden" schon optimiert registriert. Optional: llama-swapmacrosfür wiederholte Flag-Blöcke (Wartbarkeit). [mittel]
9.4 Verifikationspunkte — aufgelöst (2026-06-30)
- V6 ✅: fast-Upstream
/props:total_slots:2, per-slot n_ctx 32768 →--parallel 2teilt den Kontext HART (kein unified-Sharing trotz-cram). Maßnahme F2 angewendet: fast →--parallel 1= per-slot n_ctx 65536 (verifiziert). coder bleibt--parallel 2(IDE-Concurrency, 65k/Req). - V7 ✅: Qwen3-0.6B-Draft (
tokens_sha facf459) → heavy INKOMPATIBEL (a5e1ccff, kein Spec möglich), coder-lite KOMPATIBEL (gleiche sha; aber MoE 3B-aktiv → Spec-Gewinn gering, vor Aktivierung benchmarken).
Umsetzungs-Log (Box, 2026-06-30, Backups vorhanden)
- ✅ W1/W2 brains = gemma+embed+vision (
config.yaml.bak-20260630-152911). - ✅ gemma F1+H1+fa-on: ctx 131072→65536,
-fa 1→-fa on,+ --cache-reuse 256 -cram 16384(bak-20260630-154842). Verifiziert: ready, ~52 t/s, 24,4 GB. - ✅ F2 fast
--parallel 2→1(voller 65k-Kontext, verifiziert). - ✅ MTP für gemma (
bak-20260630-155520): Draftermtp-gemma-4-26B-A4B-it.gguf(461 MB) geladen, cmd+ --model-draft … --spec-type draft-mtp --spec-draft-n-max 4. Verifiziert: 52 → 70,8 t/s (≈1,36×), Draft-Akzeptanz ~50 %, kein Crash, ready. - ✅ scout GLM-4.6V-Flash installiert (Q4 6,17 GB + mmproj 1,84 GB), role=scout, ttl 300, on-demand.
Verifiziert: lädt sauber (neue GLM-4.6V-Arch auf Engine 9843), 34,6 t/s, reasoniert korrekt
(
reasoning_content). Hinweis: ist ein Thinking-Modell → höhere Latenz für Kurzantworten; Vision (mmproj) geladen, aber Bild-Eingabe noch nicht getestet. Ggf. No-Think-Modus prüfen, falls als schneller Allrounder gewünscht.
Code-Änderungen (Dev-Repo F:, noch nicht deployt)
- ✅ MC2 MTP-Draft-Support (Brief-Deliverable). Verifiziert: py_compile OK, Logik-Test gegen echte GGUF,
Frontend
tsc --noEmitexit 0.config.py:SPEC_DRAFT_N_MAX(Default 4).services/llamaswap.py:_is_mtp_draft,_spec_flags_for_draft,_sibling_mtp_drafters(findet MTP-Köpfe NEBEN dem Modell);find_compatible_draft/spec_draft_flags/drafts_for/set_spec_draftMTP-bewusst;_parse_modelerkennt--model-draft/-md. Backward-kompatibel (klassische Drafts unverändert).- Frontend
api.ts(DraftInfo.mtp),SpecDraftModal.tsx(MTP-Badge). → gemmas MTP-Drafter erscheint im Spec-Modal automatisch als kompatibel + aktivierbar, schreibt die korrektendraft-mtp-Flags.
- ✅ CMD-Template-Drift (
register_model):--cache-reuse 256 -cram 16384als Default für alle Template-Modelle;--parallel 2nur noch fürcoder(kein ctx-Halbierungs-Footgun mehr); Spec-Auto-Attach MTP-bewusst + für alle Rollen self-guarding. Verifiziert: py_compile OK. - ✅
budget.reserved_gban Gruppen-Swap-Semantik angeglichen (_coresident_members=swap:false-Set; on-demand = läuft allein → reserviert 0, voller GTT; brains-Member = reserviert die übrigen Member). Verifiziert gegen echte Config: hermes→16,2 GB, heavy/coder/scout→0 GB (ondemand-alone). Tote_persist_membersentfernt. - ⬜ Deploy: Backend+Frontend müssen auf die Box (git push → box pull →
restart mission-control-2+ Frontend-Build). Box-config.yaml-Tunings sind davon unabhängig und bereits live.
10. Leitplanken (eingehalten)
- Features (Sehen/Hören/Sprechen/Embedding/Gedächtnis) + IDE-Lanes (chat/coding) bleiben funktionsfähig — W1/W2 macht sie sogar robuster (kein OOM mehr).
- Vor jeder Box-Config-Änderung Backup; llama-swap reloadt per
-watch-config. - Keine destruktiven Aktionen ohne Freigabe dieses Plans.