bilder: Hirn und Coder sehen selbst - ueber Bild-Zwillinge, Text bleibt mit Draft schnell
Ampel / ampel (push) Failing after 21s
Ampel / ampel (push) Failing after 21s
llama.cpp kann Draft-Beschleunigung und Bilder nicht zusammen (HTTP 500 "failed to process speculative batch", b11057 und b11157 geprueft; speculative.n_max=0 je Anfrage hilft nicht). Darum bekommen Hirn und Coder je einen Bild-Zwilling: gleiche Gewichte plus Projektor, ohne Draft (vision, coder-bild), in einer eigenen llama-swap-Gruppe, die den Coder nicht verdraengt. Probe 24.09.: beide 8/8 Bildmerkmale; Hirn-Zwilling 68 t/s, Coder-Zwilling 12,5 t/s. Bild-Weiche v3 im Gateway: Bild im aktuellen Schritt geht an den Zwilling der Rolle, aeltere Bilder werden einmal beschrieben (gemerkt) und als Text mitgeschickt, damit der Rest einer Agenten-Aufgabe wieder beim schnellen Modell laeuft. Qwen3-VL gibt "vision" ab, der Coder verliert den Projektor, der mit Draft nur HTTP 500 lieferte. Radar misst die Bildfaehigkeit des heutigen Modells ueber dessen Zwilling (sonst gewaenne jeder bildfaehige Kandidat mit "versteht Bilder"). Pruefstand: Coder darf vor dem Aendern lesen (Version 3). Modelle-Seite zeigt "Bilder: ja" ueber den Zwilling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
2cc1e1cc47
commit
91aa16eee1
@@ -62,7 +62,7 @@ HERMES = os.path.expanduser("~/.local/bin/hermes")
|
||||
CTX_STANDARD = 65536
|
||||
# Stand der Proben. Ändern sich Aufgaben oder Werkzeuge, ist eine gecachte Baseline nicht mehr
|
||||
# vergleichbar — baseline() misst dann neu. Bei jeder Änderung an den Proben hochzählen.
|
||||
PRUEFSTAND_VERSION = 2
|
||||
PRUEFSTAND_VERSION = 3 # 24.09.: Coder darf vor dem Ändern lesen (Bild im Ablauf)
|
||||
# Flags wie am 17.09. (der Kontext kommt je Kandidat dazu): voller GPU-Offload, Flash-Attention,
|
||||
# kein mmap (--load-mode none, das alte --no-mmap gibt es seit b10936 nicht mehr), ein Slot,
|
||||
# KV-Cache q8_0 wie im Betrieb.
|
||||
@@ -709,6 +709,15 @@ def _bild_im_ablauf(basis: str, modell: str, rolle: str, url: str, frist: float
|
||||
]
|
||||
j = chat(basis, modell, verlauf, WERKZEUG_TOKENS, werkzeuge, frist=frist)
|
||||
aufrufe = _nachricht(j).get("tool_calls") or []
|
||||
lesen = next((a for a in aufrufe if (a.get("function") or {}).get("name") == "read"), None)
|
||||
if rolle != "hirn" and lesen and not trifft(aufrufe, erwartet):
|
||||
# Ein guter Coding-Agent liest die Datei, bevor er sie ändert (24.09.: der Coder tat genau das und
|
||||
# galt als gescheitert). Dann den Inhalt liefern und nach dem nächsten Schritt fragen.
|
||||
verlauf += [{"role": "assistant", "content": "", "tool_calls": [lesen]},
|
||||
{"role": "tool", "tool_call_id": lesen.get("id") or "call_lesen",
|
||||
"content": 'PORT = 8080\nHOST = "0.0.0.0"\n'}]
|
||||
j = chat(basis, modell, verlauf, WERKZEUG_TOKENS, werkzeuge, frist=frist)
|
||||
aufrufe = _nachricht(j).get("tool_calls") or []
|
||||
return {"ok": trifft(aufrufe, erwartet), "aufrufe": _aufrufe_kurz(aufrufe),
|
||||
"antwort": "" if aufrufe else _text(j)[:160]}
|
||||
|
||||
@@ -734,8 +743,10 @@ def messe_bild(basis: str, modell: str, rolle: str, frist: float | None = None)
|
||||
# --- Gesamtprüfung ---------------------------------------------------------------------
|
||||
|
||||
def pruefe(rolle: str, basis: str, modell: str, *, bild: bool = False, frist: float | None = None,
|
||||
protokoll=log) -> dict:
|
||||
"""Alle Proben der Rolle gegen ein laufendes Modell (Kandidat auf :5899 oder Baseline über llama-swap)."""
|
||||
protokoll=log, bild_modell: str | None = None) -> dict:
|
||||
"""Alle Proben der Rolle gegen ein laufendes Modell (Kandidat auf :5899 oder Baseline über llama-swap).
|
||||
bild_modell: wer die Bild-Probe macht, wenn es nicht das Modell selbst ist — seit 24.09. sehen Hirn und
|
||||
Coder über ihren Bild-Zwilling (vision, coder-bild), weil Draft und Bild in llama.cpp nicht zusammengehen."""
|
||||
if rolle not in ALIAS:
|
||||
raise ValueError(f"Unbekannte Rolle {rolle!r}")
|
||||
t0 = time.time()
|
||||
@@ -755,7 +766,7 @@ def pruefe(rolle: str, basis: str, modell: str, *, bild: bool = False, frist: fl
|
||||
werte["bild"] = None
|
||||
if bild:
|
||||
try:
|
||||
werte["bild"] = messe_bild(basis, modell, rolle, frist)
|
||||
werte["bild"] = messe_bild(basis, bild_modell or modell, rolle, frist)
|
||||
except Zeitende:
|
||||
raise
|
||||
except Exception as e:
|
||||
@@ -948,7 +959,7 @@ def _schreibe_json(pfad: str, daten: dict) -> None:
|
||||
|
||||
def baseline(rolle: str, cache_pfad: str, *, kennung: str, bild: bool = False, frist: float | None = None,
|
||||
max_alter_tage: int = 30, basis_url: str = SWAP_URL, modell: str | None = None,
|
||||
protokoll=log) -> dict | None:
|
||||
protokoll=log, bild_modell: str | None = None) -> dict | None:
|
||||
"""Werte des heutigen Modells der Rolle, höchstens alle max_alter_tage neu gemessen.
|
||||
kennung = welches Modell mit welchen Flags (ändert sie sich, wird neu gemessen).
|
||||
Rückgabe {"kennung", "zeit", "werte"} oder None, wenn es weder Cache noch Messung gibt."""
|
||||
@@ -960,7 +971,8 @@ def baseline(rolle: str, cache_pfad: str, *, kennung: str, bild: bool = False, f
|
||||
return passend
|
||||
protokoll(f" Baseline {rolle} wird neu gemessen ({modell or ALIAS[rolle]} über llama-swap)")
|
||||
try:
|
||||
werte = pruefe(rolle, basis_url, modell or ALIAS[rolle], bild=bild, frist=frist, protokoll=protokoll)
|
||||
werte = pruefe(rolle, basis_url, modell or ALIAS[rolle], bild=bild, frist=frist, protokoll=protokoll,
|
||||
bild_modell=bild_modell)
|
||||
except Zeitende:
|
||||
raise
|
||||
except Exception as e:
|
||||
|
||||
@@ -27,6 +27,24 @@ models:
|
||||
out: [text]
|
||||
tools: true
|
||||
context: 65536
|
||||
Qwen3.6-35B-A3B-Bild:
|
||||
# 24.09.2026: Bild-Zwilling des Hirns — dieselben Gewichte plus Bild-Projektor, aber OHNE Draft. llama.cpp
|
||||
# scheitert mit Draft UND Bild an „failed to process speculative batch“ (HTTP 500; b11057 und b11157 geprüft,
|
||||
# auch speculative.n_max=0 je Anfrage hilft nicht). Das MC2-Gateway schickt nur Anfragen mit einem Bild im
|
||||
# aktuellen Schritt hierher; ältere Bilder ersetzt es durch eine Beschreibung von hier, damit der Rest der
|
||||
# Aufgabe beim schnellen Hirn mit Draft bleibt. Probe 24.09.: 8/8 Bildmerkmale, Bildschirm-Aufgabe im
|
||||
# Agenten-Ablauf richtig, 67,9 t/s @13k (Hirn mit Draft 105,8). Projektor aus dem Original-Repo
|
||||
# (Qwen3.6-35B-A3B-MTP-GGUF) — er passt zur abliterierten Variante. Löst Qwen3-VL als `vision` ab.
|
||||
cmd: |
|
||||
llama-server -m /srv/models/Qwen3.6-35B-A3B-Uncensored-GGUF/Qwen3.6-35B-A3B-Uncensored-HauhauCS-Aggressive-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 65536 -ngl 999 -fa on --load-mode none --mmproj /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/mmproj-BF16.gguf --jinja --parallel 1 -cram 8192 -ctk q8_0 -ctv q8_0 --reasoning-budget 2048
|
||||
ttl: 900
|
||||
aliases:
|
||||
- vision
|
||||
capabilities:
|
||||
in: [text, image]
|
||||
out: [text]
|
||||
tools: true
|
||||
context: 65536
|
||||
Qwen3.8-27B:
|
||||
# Qwen 3.8 27B: Dichtes 27B-Modell mit hybrider Linear-Attention (48/64 Schichten linear),
|
||||
# nativem Multimodal-Support (mmproj-BF16) und Tool-Calling via --jinja.
|
||||
@@ -36,19 +54,35 @@ models:
|
||||
# 17.09.2026: Uncensored-Variante (JonathanColetti, Heretic-Abliteration: KL 0,12, Refusals 98->12/100, Benchmarks -0,5)
|
||||
# mit demselben DFlash2-Draft (Akzeptanz 0,82 @13k). Prüfstand: 30,4 t/s @13k (Original 26,2), Tools 6/6, Coding 3/3,
|
||||
# Hermes-Smoke grün. Original bleibt in Qwen3.8-27B-GGUF liegen — Rückweg = beide Pfade zurück.
|
||||
# 24.09.2026: ohne --mmproj. Bild UND DFlash2 ergaben immer HTTP 500; Bilder gehen jetzt an den Zwilling
|
||||
# Qwen3.8-27B-Bild (Alias coder-bild), der Text bleibt hier mit Draft schnell.
|
||||
cmd: |
|
||||
llama-server -m /srv/models/Qwen3.8-27B-Uncensored-GGUF/Qwen3.8-27B-Uncensored-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --load-mode none --mmproj /srv/models/Qwen3.8-27B-Uncensored-GGUF/mmproj-Qwen3.8-27B-Uncensored-F16.gguf --jinja --parallel 1 -cram 16384 -ctk q8_0 -ctv q8_0 --spec-type draft-dflash --spec-draft-model /srv/models/Qwen3.8-27B-DFlash2-GGUF/Qwen3.8-27B-DFlash2-Q4_K_M.gguf
|
||||
llama-server -m /srv/models/Qwen3.8-27B-Uncensored-GGUF/Qwen3.8-27B-Uncensored-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --load-mode none --jinja --parallel 1 -cram 16384 -ctk q8_0 -ctv q8_0 --spec-type draft-dflash --spec-draft-model /srv/models/Qwen3.8-27B-DFlash2-GGUF/Qwen3.8-27B-DFlash2-Q4_K_M.gguf
|
||||
ttl: 5400
|
||||
aliases:
|
||||
- coder
|
||||
- heavy
|
||||
capabilities:
|
||||
in: [text, image]
|
||||
in: [text]
|
||||
out: [text]
|
||||
tools: true
|
||||
# --parallel 1 = der Coder bekommt den ganzen Slot (34a9862, am laufenden Prozess
|
||||
# gegengeprueft). Er hat nur einen Verbraucher; Lucy/explore nutzen hermes, review heavy.
|
||||
context: 131072
|
||||
Qwen3.8-27B-Bild:
|
||||
# 24.09.2026: Bild-Zwilling des Coders (dieselben Gewichte plus Projektor, ohne DFlash2 — Grund siehe
|
||||
# Qwen3.6-35B-A3B-Bild). Nur für Anfragen mit einem Bild im aktuellen Schritt (Screenshot der App o. Ä.).
|
||||
# Probe 24.09.: 8/8 Bildmerkmale, 12,5 t/s @13k (Coder mit Draft 30,4).
|
||||
cmd: |
|
||||
llama-server -m /srv/models/Qwen3.8-27B-Uncensored-GGUF/Qwen3.8-27B-Uncensored-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --load-mode none --mmproj /srv/models/Qwen3.8-27B-Uncensored-GGUF/mmproj-Qwen3.8-27B-Uncensored-F16.gguf --jinja --parallel 1 -cram 16384 -ctk q8_0 -ctv q8_0
|
||||
ttl: 900
|
||||
aliases:
|
||||
- coder-bild
|
||||
capabilities:
|
||||
in: [text, image]
|
||||
out: [text]
|
||||
tools: true
|
||||
context: 131072
|
||||
Muse-Glimmer-30B:
|
||||
# Meta Muse Glimmer 30B: Dichtes 30B-Agenten-Modell mit DFlash-Speculative-Drafting
|
||||
# und 1.8B Perception Multimodal Projector. Ideal als Runtime-Debugger & Fehler-Diagnostiker.
|
||||
@@ -85,8 +119,7 @@ models:
|
||||
cmd: |
|
||||
llama-server -m /srv/models/Qwen3-VL-30B-A3B-Instruct-GGUF/Qwen3-VL-30B-A3B-Instruct-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --load-mode none --mmproj /srv/models/Qwen3-VL-30B-A3B-Instruct-GGUF/mmproj-F16.gguf --jinja
|
||||
ttl: 900
|
||||
aliases:
|
||||
- vision
|
||||
# 24.09.2026: `vision` an den Hirn-Zwilling abgegeben (Qwen3.6-35B-A3B-Bild); ohne Rolle, wird gelöscht.
|
||||
capabilities:
|
||||
in: [text, image]
|
||||
out: [text]
|
||||
@@ -111,3 +144,14 @@ groups:
|
||||
- Qwen3-Embedding-0.6B
|
||||
- Qwen3-Reranker-0.6B
|
||||
- Qwen3.6-35B-A3B
|
||||
bild:
|
||||
# 24.09.2026: die Bild-Zwillinge von Hirn und Coder. swap: true = höchstens einer von beiden geladen;
|
||||
# exclusive: false = das Laden verdrängt den Coder NICHT (sonst kostete jedes Bild in einer OpenChamber-
|
||||
# Sitzung den Coder samt Prompt-Cache). Speicher im schlimmsten Fall: Warm-Set 27 + Coder 29 +
|
||||
# Zwilling ~25 GB = ~81 GB. Nachts entlädt das Modell-Radar alles außerhalb des Warm-Sets.
|
||||
swap: true
|
||||
exclusive: false
|
||||
persistent: false
|
||||
members:
|
||||
- Qwen3.6-35B-A3B-Bild
|
||||
- Qwen3.8-27B-Bild
|
||||
|
||||
Reference in New Issue
Block a user