232 lines
11 KiB
Markdown
232 lines
11 KiB
Markdown
# Qwen-Image-2.1 auf Athena
|
||
|
||
Stand: 21. September 2026. Qwen-Image-2.1 ist der produktive Bildworker des
|
||
Routers. FLUX.2 Klein 9B FP8 bleibt als gestoppter Rückfallcontainer erhalten.
|
||
|
||
## Gepinnter Stand
|
||
|
||
- ComfyUI: Commit `b0f4b7b294ce482a2e071d9d762c133d38c7aa07`
|
||
- Modell-Repository: `Comfy-Org/Qwen-Image-2.1`, Revision
|
||
`ace0edeb3791a594ddfa36ed5f41a178a394e921`
|
||
- Transformer: `qwen_image_2.1_int8_convrot.safetensors`
|
||
(`cb74113cb03faecd79611b01fd7fd642f0aa60d6f0b95086abee214d75eaa57d`)
|
||
- Textencoder: `qwen3vl_8b_int8_convrot.safetensors`
|
||
(`8bfd0f6e12abf2d2d697ecc888e5e90b0d6741d6708f05799f53afa560452e8f`)
|
||
- VAE: `qwen_image_2.1_vae_bf16.safetensors`
|
||
(`bb21f7473051e1ac368515dd3f2e15cd44d7a11748ee8823e1ddca3e4876b7c9`)
|
||
- Pipeline: 25 Schritte, CFG 1, Euler/Simple, `--lowvram`
|
||
- GPU: ausschließlich Athena-GPU 1, die RTX 5080 mit 16 GB
|
||
|
||
Die Gewichte liegen außerhalb von Git unter
|
||
`/data/models/Qwen-Image-2.1-ComfyUI`. Der Adapter
|
||
`platform/docker/qwen-image-worker/qwen_image_worker.py` stellt vor ComfyUI
|
||
die bestehende private Worker-API auf Port 8086 bereit. Der öffentliche
|
||
Routervertrag bleibt damit `/v1/images/generations` und `/v1/images/edits`.
|
||
Der Container läuft wie der Router mit UID/GID `10002:10002`, damit beide das
|
||
gemeinsame Bild-Volume ohne erweiterte Linux-Capabilities verwenden können.
|
||
|
||
## Lebenszyklus
|
||
|
||
Ein Bildauftrag läuft transaktional:
|
||
|
||
1. Der Router merkt sich das aktive Textprofil.
|
||
2. Der Profile Controller stoppt LLM, TTS und andere GPU-Spezialworker.
|
||
3. Bei einem Textauftrag startet `mike-ai-image-prompt-enhancer-t2i`, bei
|
||
Referenzbildern `mike-ai-image-prompt-enhancer-i2i` auf der RTX 3060.
|
||
4. Der offizielle Qwen-Enhancer schreibt den knappen Benutzertext um und wird
|
||
anschließend vollständig gestoppt.
|
||
5. `mike-ai-image-worker` startet Qwen Image auf der RTX 5080 und erzeugt das
|
||
Bild oder bearbeitet bis zu vier Referenzbilder.
|
||
6. Der Qwen-Worker wird vollständig gestoppt.
|
||
7. Das vorherige Textprofil und Qwen3-TTS werden wiederhergestellt.
|
||
|
||
Der Container ist außerhalb eines Auftrags gestoppt. Das ist der Sollzustand.
|
||
|
||
## Reproduzierbare Vorbereitung
|
||
|
||
```bash
|
||
cd /opt/mike-ai/stack
|
||
sudo ./scripts/prepare-qwen-image-21.sh
|
||
```
|
||
|
||
Das Skript lädt fehlende Dateien mit festen SHA-256-Prüfsummen, baut den
|
||
produktiven Qwen-Worker und legt Qwen, beide Prompt-Enhancer sowie FLUX
|
||
gestoppt an. Es lädt dabei kein Modell in den VRAM.
|
||
|
||
## Funktionsprobe über den echten Routerweg
|
||
|
||
```bash
|
||
curl -sS http://127.0.0.1:8081/v1/images/generations \
|
||
-H "Authorization: Bearer $ROUTER_API_KEY" \
|
||
-H 'Content-Type: application/json' \
|
||
-d '{
|
||
"model":"Qwen-Image-2.1-int8",
|
||
"prompt":"Fotorealistisches rotes Haus bei Tageslicht",
|
||
"size":"1024x1024",
|
||
"steps":25,
|
||
"guidance":1.0,
|
||
"response_format":"url"
|
||
}'
|
||
```
|
||
|
||
Nach dem Lauf müssen `mike-ai-image-worker`, beide Prompt-Enhancer und
|
||
`mike-ai-flux-image-worker` gestoppt sein und das vorherige LLM-Profil wieder
|
||
gesund laufen.
|
||
|
||
## OpenClaw 2026.9.5
|
||
|
||
OpenClaws eingebautes Werkzeug `image_generate` verwendet den separaten
|
||
Medienmodell-Eintrag. Er muss auf den OpenAI-kompatiblen Athena-Router zeigen:
|
||
|
||
```bash
|
||
openclaw config set agents.defaults.mediaModels.image.primary \
|
||
openai/Qwen-Image-2.1-int8
|
||
openclaw config set agents.defaults.mediaModels.image.fallbacks '[]' \
|
||
--strict-json
|
||
```
|
||
|
||
Der Provider `models.providers.openai.baseUrl` bleibt
|
||
`http://192.168.1.212:8081/v1`. `openclaw models set-image` ist hierfür nicht
|
||
der richtige Befehl: Er schreibt `agents.defaults.imageModel`, nicht den von
|
||
`image_generate` verwendeten Medienmodell-Eintrag. Ein alter Wert unter
|
||
`agents.defaults.imageModel` wird mit folgendem Befehl entfernt:
|
||
|
||
```bash
|
||
openclaw config unset agents.defaults.imageModel
|
||
```
|
||
|
||
Die leere Fallbackliste verhindert, dass OpenClaw bei einem lokalen Fehler
|
||
unbemerkt auf `openai/gpt-image-2` ausweicht.
|
||
|
||
OpenClaw überträgt Referenzbilder an `/v1/images/edits` als
|
||
OpenAI-kompatibles Multipart-Formular mit dem Feld `image[]`. Der Router
|
||
akzeptiert dort ein bis vier Referenzbilder und normalisiert numerische
|
||
Formularwerte wie `n` und `steps`. Der ältere JSON-/Base64-Weg bleibt für
|
||
bestehende Clients erhalten.
|
||
|
||
Beim ersten Wechsel von FLUX auf Qwen funktionierten Referenzbilder deshalb
|
||
nicht: Der neue Qwen-Pfad verstand zunächst nur den älteren JSON-/Base64-Weg.
|
||
Zusätzlich war anfangs `agents.defaults.imageModel` gesetzt, obwohl
|
||
OpenClaws `image_generate` den Eintrag unter
|
||
`agents.defaults.mediaModels.image` verwendet. Das waren Lücken der neuen
|
||
Qwen-Integration. Der zuvor produktive FLUX-Pfad war davon nicht betroffen.
|
||
|
||
## Produktionsvalidierung vom 21. September 2026
|
||
|
||
Beide öffentlichen Routerpfade wurden auf Athena mit dem produktiven Stack
|
||
geprüft:
|
||
|
||
- Text zu Bild: gültiges PNG mit 1024×1024 Pixeln, 25 Schritte,
|
||
`Qwen-Image-2.1-int8`; 48,9 Sekunden reine Bildpipeline und 71,6 Sekunden
|
||
für den vollständigen transaktionalen Routerlauf.
|
||
- Bildbearbeitung: gültiges PNG mit 1024×1024 Pixeln aus einem Referenzbild,
|
||
25 Schritte, `Qwen-Image-2.1-int8`; 76,3 Sekunden für den vollständigen
|
||
Routerlauf.
|
||
|
||
Nach beiden Aufträgen waren Qwen und FLUX gestoppt. `mike-ai-llama-medium`,
|
||
Qwen3-TTS, Router und Profile Controller liefen anschließend wieder gesund.
|
||
Damit sind Erzeugung, Referenzbildübergabe und Wiederherstellung des zuvor
|
||
aktiven Textprofils über den echten Routerweg bestätigt.
|
||
|
||
Zusätzlich wurde `image_generate` am 21. September 2026 über einen isolierten
|
||
OpenClaw-`agent exec`-Lauf geprüft. OpenClaw rief
|
||
`openai/Qwen-Image-2.1-int8` einmal auf; Athena erzeugte das PNG und stellte
|
||
Medium sowie Qwen3-TTS nach 72,5 Sekunden wieder gesund her.
|
||
|
||
Auch die Referenzbildbearbeitung wurde anschließend über das echte
|
||
OpenClaw-Werkzeug `image_generate` geprüft. OpenClaw übergab ein Referenzbild
|
||
als `image[]`; der Router erzeugte mit `Qwen-Image-2.1-int8` ein gültiges
|
||
PNG mit 1024×1024 Pixeln und meldete im Sidecar `mode: image-edit` sowie
|
||
`reference_images: 1`. Medium und Qwen3-TTS liefen nach dem Auftrag wieder
|
||
gesund, der Bildworker wurde erwartungsgemäß gestoppt.
|
||
|
||
## FLUX-Rückfallpfad
|
||
|
||
FLUX verwendet weiterhin das Image `mike-ai/image-worker:local`, die
|
||
bestehenden Modellverzeichnisse und den Container
|
||
`mike-ai-flux-image-worker`. Er hat das Controller-Label `flux-standby` und
|
||
kann deshalb nicht durch einen normalen Router-Bildauftrag gestartet werden.
|
||
Eine manuelle Diagnose ist nur über den allowlist-beschränkten Controllerpfad
|
||
`/workers/flux-standby/start` möglich. Für eine dauerhafte Rückschaltung müssen
|
||
Service-DNS, Modellname und Schrittzahl gemeinsam in Compose auf FLUX gesetzt
|
||
und anschließend Router und Controller neu ausgerollt werden. Keine dieser
|
||
Änderungen erfolgt automatisch.
|
||
|
||
Historische FLUX-Messwerte und Grenzen stehen in
|
||
[FLUX_9B_BETA.md](FLUX_9B_BETA.md) und
|
||
[FLUX_RESOLUTION_TEST_20260912.md](FLUX_RESOLUTION_TEST_20260912.md).
|
||
|
||
## Offizielle Prompt-Enhancer im produktiven Router
|
||
|
||
Qwen veröffentlicht zwei getrennte, auf Qwen3.5-VL 9B nachtrainierte
|
||
Prompt-Enhancer. Sie sind kein Bestandteil der Qwen-Image-Gewichte. Athena
|
||
startet automatisch die zum Auftrag passende Variante; OpenClaw ruft weiterhin
|
||
nur sein normales Werkzeug `image_generate` mit dem unveränderten Modellnamen
|
||
`openai/Qwen-Image-2.1-int8` auf.
|
||
|
||
- `mike-ai-image-prompt-enhancer-t2i` bereitet reine Textaufträge auf.
|
||
- `mike-ai-image-prompt-enhancer-i2i` wertet ein bis vier Referenzbilder
|
||
gemeinsam aus und trennt Identität, gewünschte Änderungen und neue Szene.
|
||
- Beide verwenden getrennte offizielle Systemprompts, `Q5_K_M`, llama.cpp
|
||
Build 10930, 16.384 Token Kontext und höchstens 2.048 Denktokens.
|
||
- Sie laufen ausschließlich und nacheinander auf der RTX 3060. Nach dem Rewrite
|
||
werden sie gestoppt; Qwen-Image rendert anschließend auf der RTX 5080.
|
||
- Falls der Client keine Größe vorgibt, übernimmt der Router das vom Enhancer
|
||
vorgeschlagene Seitenverhältnis und bildet es auf eine erlaubte Auflösung ab.
|
||
Eine ausdrücklich angegebene gültige Größe bleibt unverändert.
|
||
- Das Sidecar jedes PNG enthält `original_prompt`, den tatsächlich verwendeten
|
||
`prompt` und Modell, Quantisierung, Laufzeit und Verhältnis unter
|
||
`prompt_enhancer`. Verdeckte Denktokens werden nicht gespeichert.
|
||
- Ein fehlgeschlagener Rewrite bricht den Bildauftrag sichtbar ab. Der Router
|
||
sendet in diesem Fall keinen unaufbereiteten Ersatzprompt an Qwen-Image.
|
||
|
||
### Gepinnte Dateien
|
||
|
||
PE-I2I stammt aus `Qwen/Qwen-Image-2.1-PE-I2I`, Revision
|
||
`72927bc08afc99b7888ceb7d7d51a12db3700bbd`, und dem GGUF-Repository
|
||
`prithivMLmods/Qwen-Image-2.1-PE-I2I-GGUF`, Revision
|
||
`55b9c1a326599e142d59bcad8715d5601ccf8daa`. Die Dateien liegen unter
|
||
`/data/models/qwen-image-2.1-pe-i2i-q5`:
|
||
|
||
| Datei | SHA-256 |
|
||
|---|---|
|
||
| `Qwen-Image-2.1-PE-I2I.Q5_K_M.gguf` | `cb71f71fe5fe5938570d65a7c403fbcb1a9065dff9dd9a021f58aec42785b84e` |
|
||
| `Qwen-Image-2.1-PE-I2I.mmproj-bf16.gguf` | `8dedb71dbc3092dc47de9108ad373d68a12854e2527d59bd9399601738f3bce1` |
|
||
| `system_prompt.txt` | `e378fea686a1431581ba4c654d332ae96adad633f144ae738ec8ce9c4fd66439` |
|
||
|
||
PE-T2I stammt aus `Qwen/Qwen-Image-2.1-PE-T2I`, Revision
|
||
`f3ed7985c788ad75b3ab7223e0c4c51e2a43545b`, und dem GGUF-Repository
|
||
`prithivMLmods/Qwen-Image-2.1-PE-T2I-GGUF`, Revision
|
||
`e18d4a3e0830ab157770738b16830e6fcf5f57d4`. Die Dateien liegen unter
|
||
`/data/models/qwen-image-2.1-pe-t2i-q5`:
|
||
|
||
| Datei | SHA-256 |
|
||
|---|---|
|
||
| `Qwen-Image-2.1-PE-T2I.Q5_K_M.gguf` | `749f5652fd6e8b760ca860091f7a5bffa254a7954203ae5c9bcdf5f93197702f` |
|
||
| `system_prompt.txt` | `a77c9a06c59b120741141d9514b95682bb8761d02bec49ca61def7b2b3d9fb99` |
|
||
|
||
Der zuvor geprüfte PE-I2I-FP8-Checkpoint ist 13,54 GB groß und passt mit
|
||
Aktivierungs- und Laufzeitspeicher nicht in die 12-GB-RTX-3060. CPU-Offload war
|
||
unpraktisch langsam. Er wurde verworfen und entfernt. Der Q5-I2I-Worker belegt
|
||
etwa 7.167 MiB VRAM und ist deshalb der produktive Stand.
|
||
|
||
### Abnahme vom 21. September 2026
|
||
|
||
Der vollständige öffentliche Routerweg wurde nach der Integration zweimal
|
||
geprüft:
|
||
|
||
- Ein kurzer deutscher Textprompt wurde von PE-T2I in 36,6 Sekunden in einen
|
||
strukturierten englischen Produktionsprompt umgeschrieben. Qwen-Image
|
||
erzeugte das 1024×1024-PNG anschließend in 49,0 Sekunden.
|
||
- Ein hochgeladenes Referenzbild wurde von PE-I2I in 65,9 Sekunden aufbereitet.
|
||
Der Rewrite verlangte ausdrücklich eine neue Szene, neue Pose und Kleidung
|
||
sowie das Entfernen der alten Gegenstände. Qwen-Image erzeugte in 111,3
|
||
Sekunden ein neues 1024×1536-PNG: genau eine Person in einer Blumenwiese an
|
||
einer Autobahn, ohne Badewanne, Gitarre oder Gummiente.
|
||
|
||
Nach beiden Aufträgen waren der Bildworker und beide Enhancer gestoppt. Medium
|
||
und Qwen3-TTS liefen wieder gesund. Der erste I2I-Versuch deckte eine relative
|
||
Pfadauflösung bei temporären Multipart-Uploads auf; der korrigierte Pfad ist mit
|
||
einem eigenen Regressionstest abgedeckt. Insgesamt laufen 96 schnelle
|
||
GPU-freie Release-Tests.
|