From b5ba54d05f1a1cfa8d68b5a1f9b170df7948925f Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 11 Jul 2026 10:33:59 +0200 Subject: [PATCH] =?UTF-8?q?feat(local-llm):=20B0=20=E2=80=94=20GGUF=20Auto?= =?UTF-8?q?-Download=20via=20llama.cpp=20-hf=20(kein=20manuelles=20Ablegen?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Statt einer manuell abgelegten Datei zieht llama.cpp das Modell beim ersten Start selbst von Hugging Face (-hf Qwen/Qwen3-8B-GGUF:Q4_K_M, offizielles Repo verifiziert) und cached es unter xtts/models (persistent). Modell/Quant via LLM_HF_REPO/LLM_HF_QUANT in der .env wechselbar, kein Code. Diagnostic-Modellauswahl (on-demand laden/aktivieren mehrerer Modelle) als Folge-Baustein B0.5 via llama-swap ins Plan-Doc aufgenommen. Co-Authored-By: Claude Opus 4.8 --- .gitignore | 5 +++-- docs/plan-local-llm-router.md | 27 +++++++++++++++++++++++++++ xtts/docker-compose.yml | 16 ++++++++++++---- xtts/llm-adapter/README.md | 32 +++++++++++++++++--------------- 4 files changed, 59 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index 38aabd9..011ce34 100644 --- a/.gitignore +++ b/.gitignore @@ -80,5 +80,6 @@ __pycache__/ *.swp *.swo -# Lokale LLM-Modelle (Plan B) — GGUF sind mehrere GB, nicht ins Repo -xtts/models/*.gguf +# Lokale LLM-Modelle (Plan B) — GGUF/HF-Cache sind mehrere GB, nicht ins Repo +xtts/models/* +!xtts/models/.gitkeep diff --git a/docs/plan-local-llm-router.md b/docs/plan-local-llm-router.md index 487d2b5..9380048 100644 --- a/docs/plan-local-llm-router.md +++ b/docs/plan-local-llm-router.md @@ -85,6 +85,33 @@ Das lokale Modell braucht ARIAs Identität, sonst bricht es aus der Rolle Mini-Classifier? 3. **Tools lokal:** in v1 bewusst KEINE (alles Tool-artige → Claude) — ok? +## Folge-Baustein: Modell-Auswahl in ARIA Diagnostic (B0.5) + +Ziel: In Diagnostic ein Modell auswählen; ist es nicht da, lädt der Container +es on-demand und aktiviert es. Spiegelt zwei bestehende Muster: den +`whisperModel`-Hotswap (RVS-Config-Broadcast → Bridge hot-swapped) und die +kuratierte Claude-Tier-Liste aus `models.json`. + +**Kernproblem:** `llama.cpp`-Server serviert **ein** Modell pro Prozess — +„anderes aktivieren" = neu laden/swappen. + +**Lösung: `llama-swap`** (Proxy vor llama.cpp): kennt eine Liste von Modellen, +lädt bei Anfrage das gewünschte on-demand (Download via `-hf` beim ersten Mal), +swappt bei VRAM-Knappheit das alte raus. OpenAI-kompatibel — der llm-adapter +zeigt statt auf `llama:8081` auf `llama-swap`. + +**Bausteine:** +- `llama-swap`-Service in `xtts/docker-compose.yml` (ersetzt/ergänzt `llama`), + Config mit den verfügbaren Modellen (Name → `-hf`-Command). +- Kuratierte Liste `local_models.json` (analog `models.json`) — Diagnostic-UI + liest sie, zeigt Dropdown „Lokales Modell". +- Diagnostic → RVS-Config-Broadcast `localLlmModel` → llm-adapter setzt das + `model`-Feld seiner llama-swap-Requests → swap/Download passiert automatisch. +- Status zurück an Diagnostic (lädt / bereit / VRAM-OOM), analog whisper-Status. + +Bis dahin: **ein** Modell via `-hf` Auto-Download (B0, erledigt). Erst end-to-end +grün, dann dieser Komfort-Layer. + ## Nicht-Ziele - Kein echter Gemini-Live-Duplex-Klon (Text-Modell als Hirn). diff --git a/xtts/docker-compose.yml b/xtts/docker-compose.yml index dad59c0..64bcf34 100644 --- a/xtts/docker-compose.yml +++ b/xtts/docker-compose.yml @@ -93,10 +93,16 @@ services: # ─── Lokales LLM (Plan B, B0) — llama.cpp-Server (GPU) ──────── # Serviert Qwen3-8B (GGUF Q4_K_M) OpenAI-kompatibel auf :8081, NUR im # Compose-Netz (kein RVS direkt) — die Bruecke macht der llm-adapter. - # Modell-Datei nach ./models/ legen: siehe llm-adapter/README.md. + # + # AUTO-DOWNLOAD: llama.cpp zieht das GGUF beim ersten Start selbst von + # Hugging Face (-hf :) und cached es unter /models (persistent + # via Bind-Mount -> kein Re-Download bei Restart). Kein manuelles Ablegen + # noetig. Modell wechseln = LLM_HF_REPO/LLM_HF_QUANT in der .env aendern + + # Container neu. (Alternativ lokale Datei: command auf -m /models/x.gguf.) + # # VRAM auf der RTX 3060 (12 GB): whisper-small (~1-2) + f5tts (~1-2) + # qwen3-8b-q4 (~6) ~= 9-10 GB. Passt, aber knapp — bei OOM: LLM_CTX kleiner - # oder Modell auf Q4_K_S/IQ4 wechseln. + # oder Quant auf Q4_K_S/IQ4_XS wechseln. llama: image: ghcr.io/ggml-org/llama.cpp:server-cuda container_name: aria-llama @@ -108,9 +114,11 @@ services: count: 1 capabilities: [gpu] volumes: - - ./models:/models + - ./models:/models # HF-Download-Cache (persistent) + environment: + - LLAMA_CACHE=/models # llama.cpp legt -hf-Downloads hier ab command: > - -m /models/${LLM_GGUF:-qwen3-8b-q4_k_m.gguf} + -hf ${LLM_HF_REPO:-Qwen/Qwen3-8B-GGUF}:${LLM_HF_QUANT:-Q4_K_M} --host 0.0.0.0 --port 8081 -ngl 99 -c ${LLM_CTX:-8192} --jinja restart: unless-stopped diff --git a/xtts/llm-adapter/README.md b/xtts/llm-adapter/README.md index 123adaf..2d93361 100644 --- a/xtts/llm-adapter/README.md +++ b/xtts/llm-adapter/README.md @@ -11,27 +11,29 @@ das Tiefen-Hirn bleibt. Siehe `docs/plan-local-llm-router.md` im Repo-Root. - **`llm-adapter`** — verbindet sich per Token an den RVS (wie f5tts/whisper), nimmt `llm_request` entgegen, ruft `llama` lokal, antwortet `llm_response`. -## Modell besorgen (einmalig) +## Modell — Auto-Download (nichts manuell ablegen) -GGUF nach `xtts/models/` legen. Empfohlen: **Qwen3 8B, Q4_K_M**. +`llama.cpp` zieht das GGUF beim **ersten Start selbst von Hugging Face** und +cached es unter `xtts/models/` (Bind-Mount → kein Re-Download bei Restart). +Default: **Qwen3 8B, Q4_K_M** aus dem offiziellen Repo `Qwen/Qwen3-8B-GGUF`. -```bash -mkdir -p xtts/models -# z.B. von Hugging Face (huggingface-cli oder Browser-Download): -# Suche: "Qwen3-8B-GGUF" -> Datei qwen3-8b-q4_k_m.gguf -# Datei ablegen als: -# xtts/models/qwen3-8b-q4_k_m.gguf -``` - -Anderer Dateiname? In der `.env` der Gamebox setzen: +Modell/Quant wechseln = in der `.env` der Gamebox setzen (kein Code): ``` -LLM_GGUF=dein-modell.gguf -LLM_CTX=8192 # Kontextfenster (kleiner = weniger VRAM) +LLM_HF_REPO=Qwen/Qwen3-8B-GGUF # HF-Repo +LLM_HF_QUANT=Q4_K_M # Quant-Tag (Q4_K_M, Q5_K_M, Q8_0, …) +LLM_CTX=8192 # Kontextfenster (kleiner = weniger VRAM) ``` -Mistral statt Qwen testen (A/B): einfach ein Mistral-Small-3-GGUF ablegen und -`LLM_GGUF` umstellen — Ein-Datei-Wechsel, kein Code. +Mistral statt Qwen testen (A/B): `LLM_HF_REPO` auf ein Mistral-Small-3-GGUF-Repo +umstellen + Container neu — Ein-Zeilen-Wechsel, kein Code. + +> Der erste Start lädt mehrere GB — Log zeigt den Download-Fortschritt. +> Danach liegt das GGUF im Cache und der Start ist sofort. + +**Modell-Auswahl in ARIA Diagnostic** (on-demand laden/aktivieren mehrerer +Modelle) ist ein geplanter Folge-Baustein via `llama-swap` — siehe +`docs/plan-local-llm-router.md`. ## Start (auf der Gamebox)