feat(local-llm): B0 — GGUF Auto-Download via llama.cpp -hf (kein manuelles Ablegen)
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 <noreply@anthropic.com>
This commit is contained in:
+3
-2
@@ -80,5 +80,6 @@ __pycache__/
|
|||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
|
|
||||||
# Lokale LLM-Modelle (Plan B) — GGUF sind mehrere GB, nicht ins Repo
|
# Lokale LLM-Modelle (Plan B) — GGUF/HF-Cache sind mehrere GB, nicht ins Repo
|
||||||
xtts/models/*.gguf
|
xtts/models/*
|
||||||
|
!xtts/models/.gitkeep
|
||||||
|
|||||||
@@ -85,6 +85,33 @@ Das lokale Modell braucht ARIAs Identität, sonst bricht es aus der Rolle
|
|||||||
Mini-Classifier?
|
Mini-Classifier?
|
||||||
3. **Tools lokal:** in v1 bewusst KEINE (alles Tool-artige → Claude) — ok?
|
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
|
## Nicht-Ziele
|
||||||
|
|
||||||
- Kein echter Gemini-Live-Duplex-Klon (Text-Modell als Hirn).
|
- Kein echter Gemini-Live-Duplex-Klon (Text-Modell als Hirn).
|
||||||
|
|||||||
+12
-4
@@ -93,10 +93,16 @@ services:
|
|||||||
# ─── Lokales LLM (Plan B, B0) — llama.cpp-Server (GPU) ────────
|
# ─── Lokales LLM (Plan B, B0) — llama.cpp-Server (GPU) ────────
|
||||||
# Serviert Qwen3-8B (GGUF Q4_K_M) OpenAI-kompatibel auf :8081, NUR im
|
# Serviert Qwen3-8B (GGUF Q4_K_M) OpenAI-kompatibel auf :8081, NUR im
|
||||||
# Compose-Netz (kein RVS direkt) — die Bruecke macht der llm-adapter.
|
# 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 <repo>:<quant>) 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) +
|
# 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
|
# 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:
|
llama:
|
||||||
image: ghcr.io/ggml-org/llama.cpp:server-cuda
|
image: ghcr.io/ggml-org/llama.cpp:server-cuda
|
||||||
container_name: aria-llama
|
container_name: aria-llama
|
||||||
@@ -108,9 +114,11 @@ services:
|
|||||||
count: 1
|
count: 1
|
||||||
capabilities: [gpu]
|
capabilities: [gpu]
|
||||||
volumes:
|
volumes:
|
||||||
- ./models:/models
|
- ./models:/models # HF-Download-Cache (persistent)
|
||||||
|
environment:
|
||||||
|
- LLAMA_CACHE=/models # llama.cpp legt -hf-Downloads hier ab
|
||||||
command: >
|
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
|
--host 0.0.0.0 --port 8081
|
||||||
-ngl 99 -c ${LLM_CTX:-8192} --jinja
|
-ngl 99 -c ${LLM_CTX:-8192} --jinja
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
+17
-15
@@ -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),
|
- **`llm-adapter`** — verbindet sich per Token an den RVS (wie f5tts/whisper),
|
||||||
nimmt `llm_request` entgegen, ruft `llama` lokal, antwortet `llm_response`.
|
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
|
Modell/Quant wechseln = in der `.env` der Gamebox setzen (kein Code):
|
||||||
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:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
LLM_GGUF=dein-modell.gguf
|
LLM_HF_REPO=Qwen/Qwen3-8B-GGUF # HF-Repo
|
||||||
LLM_CTX=8192 # Kontextfenster (kleiner = weniger VRAM)
|
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
|
Mistral statt Qwen testen (A/B): `LLM_HF_REPO` auf ein Mistral-Small-3-GGUF-Repo
|
||||||
`LLM_GGUF` umstellen — Ein-Datei-Wechsel, kein Code.
|
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)
|
## Start (auf der Gamebox)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user