Add dual-GPU FLUX 9B image pipeline
This commit is contained in:
+25
-4
@@ -6,8 +6,9 @@ flowchart LR
|
||||
H -->|OpenAI API| R[Profile Router<br/>Athena :8081]
|
||||
R --> P[Profile Controller]
|
||||
P --> Q[genau ein llama.cpp-Profil<br/>Qwen Fast / Medium / Large / Ultra / Uncensored]
|
||||
R --> I[FLUX.2-klein-4B<br/>RTX 5080, Text + Editing]
|
||||
R --> T[XTTS RTX 3060<br/>Piper CPU-Fallback]
|
||||
R --> I[FLUX.2 Klein 9B FP8 Beta<br/>RTX 5080 Transformer]
|
||||
I --> E[Qwen3-8B NF4 Textencoder<br/>RTX 3060 während Bildauftrag]
|
||||
R --> T[Qwen3-TTS RTX 3060<br/>Piper CPU-Fallback]
|
||||
R --> STT[Whisper.cpp large-v3-turbo<br/>CPU, lokale Spracherkennung]
|
||||
|
||||
H --> U[MUA / Unraid MCP]
|
||||
@@ -46,9 +47,29 @@ Kontextgröße:
|
||||
| Medium | 160.000 Token |
|
||||
| Large | 192.000 Token |
|
||||
| Ultra | 262.144 Token |
|
||||
| Beta 1 | 192.000 Token |
|
||||
| Uncensored | 80.000 Token |
|
||||
|
||||
## Exklusiver Bildmodus
|
||||
|
||||
Text- und Bildinferenz teilen sich dieselben GPUs und laufen deshalb nicht
|
||||
gleichzeitig. Der Wechsel ist transaktional:
|
||||
|
||||
1. Router merkt sich das aktive Textprofil.
|
||||
2. Profile Controller stoppt alle llama.cpp-Profile und Qwen3-TTS.
|
||||
3. Bild-Worker lädt Qwen3-8B als NF4-Textencoder auf die RTX 3060 und den
|
||||
FLUX.2-Klein-9B-FP8-Transformer auf die RTX 5080.
|
||||
4. Nach dem Prompt-Encoding werden die Embeddings zur RTX 5080 übertragen.
|
||||
5. Vor dem VAE-Decoding werden Textencoder und Transformer freigegeben.
|
||||
6. Der Worker wird gestoppt; anschließend starten Qwen3-TTS und das vorherige
|
||||
Textprofil wieder. Piper bleibt als CPU-Fallback verfügbar.
|
||||
|
||||
Der Bild-Worker ist lazy und besitzt `restart: "no"`; im normalen Textbetrieb
|
||||
belegt er daher keinen VRAM. Container werden über eindeutige Docker-Labels
|
||||
gefunden, nicht über zufällige Container-IDs.
|
||||
|
||||
Die visuelle Fassung liegt als `athena-architecture-map.png` neben dieser Datei.
|
||||
Eine zweite Detailkarte, `athena-gpu-allocation-map.png`, zeigt die
|
||||
profilabhängige Layer-Verteilung auf RTX 5080 und RTX 3060 sowie die festen
|
||||
GPU-Zuordnungen von FLUX.2, Vision-Projektor und XTTS.
|
||||
profilabhängige Layer-Verteilung auf RTX 5080 und RTX 3060. Die PNG-Karten
|
||||
zeigen noch den Stand vor dem 9B-Bildpfad; die aktuelle textuelle Beschreibung
|
||||
in diesem Dokument ist verbindlich.
|
||||
|
||||
@@ -1,6 +1,29 @@
|
||||
# Aktueller produktiver Laufzustand
|
||||
|
||||
Stand: 3. September 2026
|
||||
Stand: 7. September 2026
|
||||
|
||||
## FLUX.2 Klein 9B FP8 Beta
|
||||
|
||||
Die bisherige 4B-Bildinferenz wurde testweise durch FLUX.2 Klein 9B FP8
|
||||
ersetzt. Athenas Profile Controller stellt dafür einen exklusiven Zwei-GPU-Pfad
|
||||
bereit:
|
||||
|
||||
- RTX 5080: 9B-FP8-Diffusionstransformer und VAE-Decoding
|
||||
- RTX 3060: Qwen3-8B-Textencoder in NF4
|
||||
- Qwen3-TTS und aktives llama.cpp-Profil werden für den Bildauftrag pausiert
|
||||
- Piper bleibt währenddessen als CPU-TTS verfügbar
|
||||
- nach Abschluss werden TTS und das vorherige Textprofil wiederhergestellt
|
||||
|
||||
Ein vollständiger Aufruf über Athenas OpenAI-kompatiblen Router wurde mit
|
||||
HTTP 200, einem korrekt gespeicherten 1024×1024-PNG und anschließender
|
||||
Wiederherstellung von Qwen3-TTS und `qwen-fast` erfolgreich geprüft. Ein
|
||||
isolierter Vergleich ergab ungefähr 14,6 Sekunden Bildlaufzeit mit dem
|
||||
GPU-Textencoder gegenüber 102,1 Sekunden mit CPU-Textencoder. Diese Werte sind
|
||||
eine lokale Einzelmessung und keine allgemeine Modellgarantie.
|
||||
|
||||
Das Modell ist nicht kommerziell lizenziert. Die Bedingungen der beiden
|
||||
zugriffsbeschränkten Black-Forest-Labs-Repositories müssen vor dem Download
|
||||
akzeptiert werden. Details stehen in [FLUX_9B_BETA.md](FLUX_9B_BETA.md).
|
||||
|
||||
## Lokale Spracherkennung
|
||||
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
# FLUX.2 Klein 9B FP8 Beta auf Athena
|
||||
|
||||
Stand: 7. September 2026
|
||||
|
||||
## Zweck und Status
|
||||
|
||||
Der Bildpfad ersetzt testweise FLUX.2 Klein 4B durch das größere
|
||||
FLUX.2-Klein-9B-Modell. Ziel sind bessere Prompttreue, räumliche Beziehungen,
|
||||
Objektkonsistenz und Referenzbild-Bearbeitung. Der Pfad ist technisch
|
||||
funktionsfähig, bleibt aber bis zu weiteren Qualitäts- und Editing-Tests als
|
||||
Beta bezeichnet.
|
||||
|
||||
Der OpenAI-kompatible Modellname lautet:
|
||||
|
||||
```text
|
||||
FLUX.2-klein-9B-fp8-beta
|
||||
```
|
||||
|
||||
## Modellartefakte und Lizenz
|
||||
|
||||
Verwendet werden zwei gepinnte, zugriffsbeschränkte Hugging-Face-Repositories:
|
||||
|
||||
| Zweck | Repository | Revision | Lokaler Pfad |
|
||||
|---|---|---|---|
|
||||
| Pipeline-Komponenten, Qwen3-Textencoder und VAE | `black-forest-labs/FLUX.2-klein-9B` | `92196c8e11f7b6cf2b7493e037d8c5345c559216` | `/data/models/FLUX.2-klein-9B-components` |
|
||||
| FP8-Transformer | `black-forest-labs/FLUX.2-klein-9b-fp8` | `902d9d510b51533e07729f19211414a3648b77d2` | `/data/models/FLUX.2-klein-9B-fp8` |
|
||||
|
||||
FLUX.2 Klein 9B steht unter der FLUX Non-Commercial License. Vor dem Download
|
||||
müssen die Bedingungen beider Repositories im verwendeten Hugging-Face-Konto
|
||||
akzeptiert werden. Ein Token gehört ausschließlich in die durch
|
||||
`HF_TOKEN_FILE` angegebene, für root lesbare Datei; niemals in Git oder
|
||||
`stack.env`.
|
||||
|
||||
## GPU-Aufteilung
|
||||
|
||||
| Phase | RTX 5080, 16 GB | RTX 3060, 12 GB |
|
||||
|---|---|---|
|
||||
| Text-/Sprachbetrieb | aktives Qwen3.8-27B-Profil | Qwen3-TTS; Vision je nach Profil |
|
||||
| Prompt-Encoding | FLUX-Transformer und VAE | Qwen3-8B-Textencoder, NF4 |
|
||||
| Denoising | FLUX-Transformer | Textencoder wird nicht mehr benötigt |
|
||||
| VAE-Decoding | VAE; Transformer zuvor freigegeben | Textencoder zuvor freigegeben |
|
||||
|
||||
Der Profile Controller stoppt vor dem Start des Bild-Workers alle
|
||||
llama.cpp-Profile und den mit `com.mike-ai.tts-worker=qwen3` markierten
|
||||
Qwen3-TTS-Container. Dadurch bleibt genügend VRAM für beide Bildkomponenten.
|
||||
Nach dem Bildauftrag startet er Qwen3-TTS und das zuvor aktive Textprofil
|
||||
wieder. Der TTS-Gateway kann während des Wechsels auf Piper ausweichen.
|
||||
|
||||
## Aktuelle Grenzen
|
||||
|
||||
- genau 1024 × 1024 Pixel
|
||||
- genau vier Inferenzschritte
|
||||
- Guidance Scale 1,0
|
||||
- ein Bildauftrag gleichzeitig
|
||||
- höchstens vier bereits lokal gespeicherte Referenzbilder
|
||||
- Textencoder-Maximum 128 Token
|
||||
- Bildbearbeitung wird vom Worker angenommen, ist aber noch gesondert
|
||||
Ende-zu-Ende zu qualifizieren
|
||||
|
||||
## Installation und Aktualisierung
|
||||
|
||||
In `/root/mike-ai-install.env` müssen diese Werte gesetzt sein:
|
||||
|
||||
```bash
|
||||
HF_TOKEN_FILE=/root/.cache/huggingface/token
|
||||
FLUX_COMPONENT_DIR=/data/models/FLUX.2-klein-9B-components
|
||||
FLUX_TRANSFORMER_DIR=/data/models/FLUX.2-klein-9B-fp8
|
||||
```
|
||||
|
||||
Anschließend lädt der normale Installer nur die benötigten Komponenten und die
|
||||
gepinnten FP8-Gewichte. Bestehende, vollständige Dateien werden nicht erneut
|
||||
geladen:
|
||||
|
||||
```bash
|
||||
cd /opt/mike-ai/stack
|
||||
sudo ./install.sh --config /root/mike-ai-install.env
|
||||
```
|
||||
|
||||
## Funktionsprobe
|
||||
|
||||
Der Router ist nur über das private Netz erreichbar. Ein minimaler Test lautet:
|
||||
|
||||
```bash
|
||||
curl -fsS http://192.168.1.212:8081/v1/images/generations \
|
||||
-H "Authorization: Bearer $ROUTER_API_KEY" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{
|
||||
"model":"FLUX.2-klein-9B-fp8-beta",
|
||||
"prompt":"A yellow toy excavator on the left and a red toy truck on the right, studio photo",
|
||||
"size":"1024x1024",
|
||||
"steps":4,
|
||||
"guidance":1.0,
|
||||
"seed":9072026
|
||||
}'
|
||||
```
|
||||
|
||||
Danach müssen folgende Zustände wiederhergestellt sein:
|
||||
|
||||
```bash
|
||||
docker ps --format '{{.Names}} {{.Status}}' \
|
||||
--filter name=mike-ai-router \
|
||||
--filter name=mike-ai-qwen3-tts \
|
||||
--filter name=mike-ai-llama
|
||||
docker ps -a --filter name=mike-ai-image-worker \
|
||||
--format '{{.Names}} {{.Status}}'
|
||||
nvidia-smi
|
||||
```
|
||||
|
||||
Erwartet werden ein gesunder Router, gesundes Qwen3-TTS, genau ein gesundes
|
||||
llama.cpp-Profil und ein mit Exit-Code 0 beendeter Bild-Worker.
|
||||
|
||||
## Hermes
|
||||
|
||||
Hermes auf Unraid verwendet einen persistenten Benutzer-Provider
|
||||
`athena-local`. Seine Konfiguration muss auf denselben Modellnamen zeigen:
|
||||
|
||||
```yaml
|
||||
image_gen:
|
||||
provider: athena-local
|
||||
model: FLUX.2-klein-9B-fp8-beta
|
||||
max_parallel_requests: 1
|
||||
```
|
||||
|
||||
Der Provider lebt in Hermes-Appdata und bleibt bei normalen Container-Updates
|
||||
erhalten. Er gehört nicht in die Desktop-App und muss auf weiteren Clients
|
||||
nicht erneut installiert werden. Die versionierte Quellfassung liegt unter
|
||||
[`integrations/hermes-athena-image`](../integrations/hermes-athena-image).
|
||||
|
||||
## Rollback
|
||||
|
||||
Vor der Beta-Bereitstellung wurden auf Athena diese Rückfall-Images angelegt:
|
||||
|
||||
```text
|
||||
mike-ai/image-worker:4b-rollback-20260907
|
||||
mike-ai/profile-controller:rollback-20260907
|
||||
```
|
||||
|
||||
Die zugehörige Deployment-Sicherung liegt auf Athena unter:
|
||||
|
||||
```text
|
||||
/data/deploy-backups/20260907-flux9b-beta
|
||||
```
|
||||
|
||||
Die vorherige Hermes-Konfiguration und der alte Provider liegen auf Unraid
|
||||
unter:
|
||||
|
||||
```text
|
||||
/mnt/nvme-storage/appdata/Hermes-Agent/backups/flux9b-beta-20260907
|
||||
```
|
||||
|
||||
Ein Rollback darf nicht blind erfolgen: Zuerst aktives Profil, laufende
|
||||
Anfragen und vorhandene Image-Tags prüfen, dann nur Image-Worker,
|
||||
Profile Controller und Hermes-Provider auf den gesicherten Stand zurücksetzen.
|
||||
@@ -15,6 +15,12 @@ Sie bleiben auf der Daten-SSD oder werden anhand der gepinnten Angaben in
|
||||
`config/install.env.example` erneut geladen. Die Dashboard-Historie liegt
|
||||
dauerhaft unter `/data/llama-dashboard`.
|
||||
|
||||
Für FLUX.2 Klein 9B müssen vor einem erneuten Download die Bedingungen der
|
||||
beiden Black-Forest-Labs-Repositories im Hugging-Face-Konto akzeptiert sein.
|
||||
Außerdem muss die in `HF_TOKEN_FILE` angegebene Token-Datei wiederhergestellt
|
||||
oder neu erzeugt werden. Der Token selbst ist absichtlich nicht Bestandteil
|
||||
des Git-Repositories oder des Athena-Backups.
|
||||
|
||||
Portainers lokale Konfiguration liegt im Docker-Volume `portainer_data` und
|
||||
wird zusammen mit den übrigen nicht reproduzierbaren Volumes gesichert und
|
||||
wiederhergestellt.
|
||||
|
||||
Reference in New Issue
Block a user