From dd5d1fd2cbde3fb4aec8ca70e6d1251a454c2914 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Wed, 28 Oct 2026 17:24:41 +0100 Subject: [PATCH] =?UTF-8?q?feat(llm):=20grosse=20MoE-Modelle=20auf=20klein?= =?UTF-8?q?en=20Karten=20=E2=80=94=20Experten=20in=20den=20Arbeitsspeicher?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bei MoE-Modellen (z.B. Qwen3-Coder-30B-A3B: 18,6 GB, davon 16,35 GB Experten) rechnet pro Wort nur ein kleiner Teil. llama.cpp kann die Experten in den RAM legen (--cpu-moe / --n-cpu-moe N), der Rest bleibt auf der Karte. Adapter: - Registry-Feld cpuMoe: 0 = Karte, -1 = alle Experten in den RAM, N = die der ersten N Schichten; -2 beim Laden = automatisch aufteilen. - Automatisch: liest nur den Kopf der GGUF bei HuggingFace (HTTP-Range, Tensor-Verzeichnis), rechnet Experten je Schicht + KV-Cache gegen den VRAM der Karte und legt so viele Experten auf die Karte wie passen (12 GB/32k: 16 von 48 Schichten auf der Karte, 32 im RAM). - Kontext-Auswahl: GB-Schaetzung fuer die Karte ohne ausgelagerte Experten; slot meldet moe, cpuMoe, ramMB. KV-Rechnung als _kv_bytes() geteilt. Diagnostic: MoE-Modell zu gross fuer die Karte → Rueckfrage "Experten automatisch aufteilen?"; pro Karte Auswahl Experten: Karte / automatisch / Arbeitsspeicher. Kontextwechsel rechnet die Aufteilung neu. Co-Authored-By: Claude Opus 5.5 --- diagnostic/index.html | 48 +++++++++- diagnostic/server.js | 1 + xtts/llm-adapter/adapter.py | 182 ++++++++++++++++++++++++++++++------ 3 files changed, 199 insertions(+), 32 deletions(-) diff --git a/diagnostic/index.html b/diagnostic/index.html index ac88cfc..7ccd9b7 100644 --- a/diagnostic/index.html +++ b/diagnostic/index.html @@ -9465,6 +9465,14 @@ rows.push(`
${escapeHtml(b.node)} · Karte ${escapeHtml(sl.gpu)}
${escapeHtml(sl.gpuName || '')}${vramGB ? ' · ' + vramGB.toFixed(0) + ' GB' : ''}${sl.vramUsedMB >= 0 ? ' · belegt ' + (sl.vramUsedMB / 1024).toFixed(1) + ' GB' : ''}${sl.ctx ? ' · Kontext ' + sl.ctx : ''}
+ ${sl.moe ? `
Experten (MoE): + ${sl.ramMB ? ' · ' + (sl.ramMB / 1024).toFixed(1).replace('.', ',') + ' GB im RAM' : ''}${sl.cpuMoe > 0 ? ' (' + sl.cpuMoe + ' Schichten)' : ''}
` : ''} ${sl.onCpu ? '
⚠ Modell läuft auf der CPU, Karte leer — Treiber zu alt? (bootstrap.sh --upgrade-driver)
' : ''}