diff --git a/backend/services/warmer.py b/backend/services/warmer.py index 2b43550..70993ad 100644 --- a/backend/services/warmer.py +++ b/backend/services/warmer.py @@ -1,20 +1,21 @@ """ -Hält das ganze WARM-SET (Hirn + Augen/vision + Gedächtnis/embed) dauerhaft warm. +Hält das ganze WARM-SET (Hirn + Gedächtnis/embed) dauerhaft warm. Die Augen (vision/VL-30B) +sind seit 07.07. ON-DEMAND (ttl 900, User-Entscheid) und gehören NICHT mehr zum Warm-Set. Hintergrund: llama-swap ist EIN-Gruppen-resident — lädt ein on-demand-Modell außerhalb der `brains`-Gruppe, wird die ganze Gruppe verdrängt. `persist: true` verhindert nur Idle-Unload, NICHT die Gruppen-Verdrängung; auch ein `-watch-config`-Reload (jede Config- Änderung/Deploy) verwirft das Set, ohne llama-swaps ExecStartPost-Warmup neu auszulösen. Dieser Wächter schließt die Lücke: ist die Box idle (nichts geladen), lädt er das ganze -Set über deploy/warmup.sh nach — NICHT nur das Hirn (sonst blieben Augen+embed kalt, live -vom Review-Wächter beobachtet). Während aktiver Last (irgendetwas geladen) hält er sich +Set über deploy/warmup.sh nach — Hirn UND embed (sonst bliebe embed kalt, live vom +Review-Wächter beobachtet). Während aktiver Last (irgendetwas geladen) hält er sich raus, verdrängt also nie ein gerade genutztes Modell. -warmup.sh deckt korrekt ab: fast+vision über /v1/chat/completions, embed über /v1/embeddings +warmup.sh deckt korrekt ab: fast über /v1/chat/completions, embed über /v1/embeddings (anderer Endpunkt!) und das Vorkauen des ~70-KB-Agent-Prompts. Es ist selbst-detachend. Abschaltbar/justierbar via Env: MC_REWARM_ENABLED=0, MC_REWARM_INTERVAL. Welche Modelle -warmup.sh lädt: MC_WARMUP_MODELS (Default 'fast vision') + MC_WARMUP_EMBED (Default 'embed'). +warmup.sh lädt: MC_WARMUP_MODELS (Default 'fast') + MC_WARMUP_EMBED (Default 'embed'). """ import asyncio diff --git a/deploy/llama-swap.config.yaml b/deploy/llama-swap.config.yaml index a0b8672..9a4280a 100644 --- a/deploy/llama-swap.config.yaml +++ b/deploy/llama-swap.config.yaml @@ -1,96 +1,89 @@ -# Auto-generiert von provision.sh - per Mission Control erweiterbar -healthCheckTimeout: 300 -globalTTL: 0 - -models: - Qwen3.6-35B-A3B: - # parallel 2 + c 131072: 2 Slots à 65k (Slot 2 = Mem0-Lern-Extraktion, blockiert Voice-Turns - # nicht mehr); KV Q8_0 macht das speicherneutral zu vorher (65k f16). Bench 2026-07-02: - # Q8_0 kostet 0 t/s, MTP n-max 3 = +26% vs. ohne Spec. - cmd: | - llama-server -m /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --parallel 2 -cram 16384 -ctk q4_k -ctv q4_k --spec-type draft-mtp --spec-draft-n-max 3 - ttl: 0 - aliases: - - hermes - - fast - # context = nutzbarer Kontext PRO REQUEST (c geteilt durch parallel-Slots). - capabilities: - in: [text] - out: [text] - tools: true - context: 65536 - Qwen3-Coder-Next: - cmd: | - llama-server -m /srv/models/Qwen3-Coder-Next-GGUF/Qwen3-Coder-Next-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 - ttl: 600 - aliases: - - coder - capabilities: - in: [text] - out: [text] - tools: true - context: 131072 - Qwen3-Embedding-0.6B: - cmd: | - llama-server -m /srv/models/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf --host 127.0.0.1 --port ${PORT} --embedding --pooling last -ngl 999 -fa on --no-mmap -c 8192 - ttl: 0 - aliases: - - embed - Qwen3-Coder-30B-A3B-Instruct: - cmd: | - llama-server -m /srv/models/Qwen3-Coder-30B-A3B-Instruct-GGUF/Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 - ttl: 300 - aliases: - - coder-lite - capabilities: - in: [text] - out: [text] - tools: true - context: 131072 - gpt-oss-120b: - # Wurde am 07.07. offiziell zum heavy Modell befördert. - cmd: | - llama-server -m /srv/models/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00001-of-00003.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 - ttl: 600 - aliases: - - heavy - capabilities: - in: [text] - out: [text] - tools: true - context: 32768 - Qwen3-VL-30B-A3B-Instruct: - # Lucys AUGEN (vision, seit 03.07. live via set_role/set_group): MoE 3B aktiv, versteht die - # Bildschirm-SZENE statt nur OCR. Als brains-Mitglied MUSS ttl:0 sein — persistent schuetzt nur - # gegen Verdraengung, NICHT gegen ttl-Selbstentladen (sonst faellt es alle 5 Min raus). - 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 --no-mmap --mmproj /srv/models/Qwen3-VL-30B-A3B-Instruct-GGUF/mmproj-F16.gguf --jinja - ttl: 0 - aliases: - - vision - capabilities: - in: [text, image] - out: [text] - context: 32768 - GLM-4.6V-Flash: - cmd: | - llama-server -m /srv/models/GLM-4.6V-Flash-GGUF/GLM-4.6V-Flash-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --mmproj /srv/models/GLM-4.6V-Flash-GGUF/mmproj-BF16.gguf --jinja - ttl: 300 - aliases: - - scout - capabilities: - in: [text, image] - out: [text] - tools: true - context: 131072 -groups: - brains: - swap: false - # llama-swap versteht NUR `persistent` (Verdrängungsschutz); `persist` ist der - # MC2-interne Lese-Key (API/UI) und wird von llama-swap ignoriert. Beide pflegen! - persist: true - persistent: true - members: - - Qwen3-Embedding-0.6B - - Qwen3-VL-30B-A3B-Instruct - - Qwen3.6-35B-A3B +# Auto-generiert von provision.sh - per Mission Control erweiterbar +healthCheckTimeout: 300 +globalTTL: 0 + +models: + Qwen3.6-35B-A3B: + # parallel 2 + c 131072: 2 Slots à 65k (Slot 2 = Mem0-Lern-Extraktion, blockiert Voice-Turns + # nicht mehr); KV Q8_0 macht das speicherneutral zu vorher (65k f16). Bench 2026-07-02: + # Q8_0 kostet 0 t/s, MTP n-max 3 = +26% vs. ohne Spec. (Q4_K-KV stand mal im Template, + # lief aber NIE live — bewusst bei Q8_0 geblieben: Qualität vor ein paar GB, seit der + # Warm-Set-Diät 07.07. ist RAM nicht mehr der Engpass.) + cmd: | + llama-server -m /srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --parallel 2 -cram 16384 -ctk q8_0 -ctv q8_0 --spec-type draft-mtp --spec-draft-n-max 3 + ttl: 0 + aliases: + - hermes + - fast + # context = nutzbarer Kontext PRO REQUEST (c geteilt durch parallel-Slots). + capabilities: + in: [text] + out: [text] + tools: true + context: 65536 + Qwen3-Coder-Next: + cmd: | + llama-server -m /srv/models/Qwen3-Coder-Next-GGUF/Qwen3-Coder-Next-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 + ttl: 600 + aliases: + - coder + capabilities: + in: [text] + out: [text] + tools: true + context: 131072 + Qwen3-Embedding-0.6B: + cmd: | + llama-server -m /srv/models/Qwen3-Embedding-0.6B-GGUF/Qwen3-Embedding-0.6B-Q8_0.gguf --host 127.0.0.1 --port ${PORT} --embedding --pooling last -ngl 999 -fa on --no-mmap -c 8192 + ttl: 0 + aliases: + - embed + gpt-oss-120b: + # heavy (B5-Entscheid 03.07.) + nächtlicher CHEF-GUTACHTER (04:30-Cron). 60 GB — + # passt seit der Warm-Set-Diät (07.07., vision on-demand) wieder NEBEN Hirn+embed. + cmd: | + llama-server -m /srv/models/gpt-oss-120b-GGUF/gpt-oss-120b-mxfp4-00001-of-00003.gguf --host 127.0.0.1 --port ${PORT} -c 32768 -ngl 999 -fa on --no-mmap --jinja --cache-reuse 256 -cram 16384 + ttl: 600 + aliases: + - heavy + capabilities: + in: [text] + out: [text] + tools: true + context: 32768 + Qwen3-VL-30B-A3B-Instruct: + # Lucys AUGEN — seit 07.07. ON-DEMAND (User-Entscheid: „Gehirn + Embedding reichen + # komplett; Vision nur wenn Lucy auf dem Desktop an ist oder die IDE-Lane sie braucht"). + # NICHT mehr in brains; ttl 900 = 15 Min Nachlauf nach dem letzten Blick. Die Lucy-App + # wärmt die Augen beim Start selbst an (useVoiceAgent-Warm-Gate). Vorher: warm, ttl 0 — + # das kostete ~19 GB Dauerbelegung und verdrängte den 60-GB-Chef-Gutachter. + 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 --no-mmap --mmproj /srv/models/Qwen3-VL-30B-A3B-Instruct-GGUF/mmproj-F16.gguf --jinja + ttl: 900 + aliases: + - vision + capabilities: + in: [text, image] + out: [text] + context: 32768 + GLM-4.6V-Flash: + cmd: | + llama-server -m /srv/models/GLM-4.6V-Flash-GGUF/GLM-4.6V-Flash-Q4_K_M.gguf --host 127.0.0.1 --port ${PORT} -c 131072 -ngl 999 -fa on --no-mmap --mmproj /srv/models/GLM-4.6V-Flash-GGUF/mmproj-BF16.gguf --jinja + ttl: 300 + aliases: + - scout + capabilities: + in: [text, image] + out: [text] + tools: true + context: 131072 +groups: + brains: + swap: false + # llama-swap versteht NUR `persistent` (Verdrängungsschutz); `persist` ist der + # MC2-interne Lese-Key (API/UI) und wird von llama-swap ignoriert. Beide pflegen! + persist: true + persistent: true + members: + - Qwen3-Embedding-0.6B + - Qwen3.6-35B-A3B diff --git a/deploy/warmup.sh b/deploy/warmup.sh index e4ef7f7..132c4e6 100644 --- a/deploy/warmup.sh +++ b/deploy/warmup.sh @@ -3,16 +3,17 @@ # Anfrage nicht kalt ist (llama-swap lädt sonst lazy bei Bedarf). # Eingehängt als ExecStartPost=-/usr/local/bin/llama-swap-warmup.sh in llama-swap. # -# `fast` = das Agent-Hirn (Qwen3.6-35B-A3B), `vision` = die Augen (Qwen3-VL-8B, ttl 0 seit -# 03.07. — gehört zum UI-Versprechen „Immer-bereit-Set"), `embed` = das Embedding-Modell -# (Qwen3-Embedding-0.6B, für Mem0/Gedächtnis). Alle in der brains-Gruppe (persistent), werden -# aber NICHT automatisch zusammen geladen — jedes Modell einzeln anstoßen, sonst bleibt es kalt. +# `fast` = das Agent-Hirn (Qwen3.6-35B-A3B), `embed` = das Embedding-Modell +# (Qwen3-Embedding-0.6B, für Mem0/Gedächtnis). Die Augen (vision/VL-30B) sind seit 07.07. +# ON-DEMAND (User-Entscheid) und gehören NICHT mehr ins Warm-Set — die Lucy-App wärmt sie +# beim Start selbst an. Modelle werden NICHT automatisch zusammen geladen — jedes einzeln +# anstoßen, sonst bleibt es kalt. # Embedding läuft im --embedding-Modus → anderer Endpunkt (/v1/embeddings, nicht chat). # Selbst-detachend: blockiert den Service-Start nicht. # NACH ÄNDERUNG: sudo cp deploy/warmup.sh /usr/local/bin/llama-swap-warmup.sh (root-Kopie!) set -u URL="${MC_LLAMA_SWAP_URL:-http://127.0.0.1:8080}" -BRAINS="${MC_WARMUP_MODELS:-fast vision}" +BRAINS="${MC_WARMUP_MODELS:-fast}" EMBEDS="${MC_WARMUP_EMBED:-embed}" if [ "${1:-}" != "--inner" ]; then