router: Bildgenerierung mit FLUX.2 [klein] 4B Base (GPU-Hotswap)
- POST /v1/images/generations (OpenAI-kompatibel, prompt/size/n/seed/quality) - quality: standard=30 Steps (Default), high=50 Steps - Größen: 1024x1024, 1536x1024, 1024x1536, 1920x1088, 1088x1920 - GPU-Hotswap: Qwen stoppen -> FLUX laden -> Bild -> FLUX entladen -> Qwen wiederherstellen (exakt vorheriges Profil) - Zentrales GPU/Modell-Lock (Profilwechsel und Bild teilen sich das Lock) - Chat-Requests warten während Bild-Job (kein 502), Timeout CHAT_WAIT_TIMEOUT - Robuste Recovery: try/finally, Worker-Beendigung, VRAM-Check, Qwen-Readiness - /status: image.phase, image.worker, image.model_loaded, qwen.available, qwen.active_chats - GET /images, GET /images/<datei> (validiert, nur images/-Verzeichnis) - image_worker.py: FLUX-Worker (eigener Prozess, JSON-Protokoll, bf16 + enable_model_cpu_offload) - deploy: venv (torch/diffusers/transformers/accelerate), Modell-Download, Image-Dir, systemd-Unit mit Image-Umgebungsvariablen - dev: Mock-Worker, fake-systemctl, Benchmarks (GPU-Resident, Offload, Steps, Quality-Compare), 32 lokale Tests - README: Bildgenerierung, Hotswap, Recovery, Benchmarks (RTX 5080), Python-Pakete Benchmarks (RTX 5080, 16 GB, CPU-Offload): - 512x512 / 10 Steps: ~9.3 s - 1024x1024 / 30 Steps: ~31.3 s - 1024x1024 / 50 Steps: ~45.3 s - 1920x1088 / 50 Steps: ~91 s - Peak-VRAM: ~8.4-8.9 GB - Hotswap-Gesamtzeit: ~41-42 s (1024x1024 / 30 Steps)
This commit is contained in:
+1
-1
@@ -9,7 +9,7 @@ SSH_KEY="${SSH_KEY:-$HOME/.ssh/lmstudio_unraid}"
|
||||
STAGE="/tmp/ai-profile-router-$$"
|
||||
|
||||
mkdir -p "$STAGE"
|
||||
cp router/ai_profile_router.py deploy/install.sh deploy/mike-ai-profile-router.service "$STAGE/"
|
||||
cp router/ai_profile_router.py router/image_worker.py deploy/install.sh deploy/mike-ai-profile-router.service "$STAGE/"
|
||||
|
||||
echo "== Übertrage Dateien nach ${TARGET}:/tmp/ai-profile-router/"
|
||||
ssh -i "$SSH_KEY" "$TARGET" 'mkdir -p /tmp/ai-profile-router'
|
||||
|
||||
+38
-4
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
# AI Profile Router – Installation/Update auf dem Zielsystem.
|
||||
# Wird als root auf dem Zielsystem ausgeführt (per SSH, vgl. deploy.sh).
|
||||
# Erwartet ai_profile_router.py und mike-ai-profile-router.service
|
||||
# Erwartet ai_profile_router.py, image_worker.py und mike-ai-profile-router.service
|
||||
# im selben Verzeichnis wie dieses Skript.
|
||||
set -euo pipefail
|
||||
|
||||
@@ -11,6 +11,9 @@ SERVICE=mike-ai-profile-router.service
|
||||
OLD_SERVICE=mike-ai-local-llm-router.service
|
||||
OLD_DIR=/opt/mike-ai/local-llm-router
|
||||
BACKUP_DIR=/opt/mike-ai/.backup-ai-profile-router-$(date +%Y%m%d-%H%M%S)
|
||||
VENV="$INSTALL_DIR/venv"
|
||||
MODEL_DIR=/opt/mike-ai/models/FLUX.2-klein-base-4B
|
||||
IMAGE_DIR="$INSTALL_DIR/images"
|
||||
|
||||
echo "== AI Profile Router: Installation/Update =="
|
||||
|
||||
@@ -29,16 +32,47 @@ else
|
||||
fi
|
||||
|
||||
# --- 2. Neue Dateien installieren -------------------------------------------
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
mkdir -p "$INSTALL_DIR" "$IMAGE_DIR"
|
||||
install -m 0755 "$DIR/ai_profile_router.py" "$INSTALL_DIR/ai_profile_router.py"
|
||||
install -m 0755 "$DIR/image_worker.py" "$INSTALL_DIR/image_worker.py"
|
||||
install -m 0644 "$DIR/${SERVICE}" "/etc/systemd/system/${SERVICE}"
|
||||
|
||||
# --- 3. Service aktivieren und starten ---------------------------------------
|
||||
# --- 3. Python-Venv mit Bild-Abhängigkeiten ---------------------------------
|
||||
if [ ! -x "$VENV/bin/python" ]; then
|
||||
echo "-- Erstelle Python-Venv in $VENV"
|
||||
python3 -m venv "$VENV"
|
||||
fi
|
||||
echo "-- Installiere/aktualisiere Bild-Abhängigkeiten (torch, diffusers, ...)"
|
||||
"$VENV/bin/pip" install --quiet --upgrade pip
|
||||
"$VENV/bin/pip" install --quiet \
|
||||
torch \
|
||||
diffusers \
|
||||
transformers \
|
||||
accelerate
|
||||
|
||||
# --- 4. FLUX-Modell (nur wenn noch nicht vorhanden) --------------------------
|
||||
if [ -f "$MODEL_DIR/model_index.json" ]; then
|
||||
echo "-- FLUX-Modell vorhanden: $MODEL_DIR"
|
||||
else
|
||||
echo "-- Lade FLUX.2-klein-base-4B nach $MODEL_DIR (kann dauern)"
|
||||
"$VENV/bin/python" - <<'PY'
|
||||
import os
|
||||
from huggingface_hub import snapshot_download
|
||||
snapshot_download(
|
||||
repo_id="black-forest-labs/FLUX.2-klein-base-4B",
|
||||
local_dir="/opt/mike-ai/models/FLUX.2-klein-base-4B",
|
||||
local_dir_use_symlinks=False,
|
||||
)
|
||||
print("Modell-Download abgeschlossen")
|
||||
PY
|
||||
fi
|
||||
|
||||
# --- 5. Service aktivieren und starten ---------------------------------------
|
||||
systemctl daemon-reload
|
||||
systemctl enable "$SERVICE"
|
||||
systemctl restart "$SERVICE"
|
||||
|
||||
# --- 4. Verifikation ----------------------------------------------------------
|
||||
# --- 6. Verifikation ----------------------------------------------------------
|
||||
sleep 1
|
||||
if ! systemctl is-active --quiet "$SERVICE"; then
|
||||
echo "-- FEHLER: Service läuft nicht" >&2
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
[Unit]
|
||||
Description=Mike AI Profile Router (OpenAI-kompatibler Proxy, Port 8081)
|
||||
Description=Mike AI Profile Router (OpenAI-kompatibler Proxy + Bild-Orchestrierung, Port 8081)
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/python3 /opt/mike-ai/ai-profile-router/ai_profile_router.py
|
||||
ExecStart=/opt/mike-ai/ai-profile-router/venv/bin/python /opt/mike-ai/ai-profile-router/ai_profile_router.py
|
||||
Restart=on-failure
|
||||
RestartSec=3
|
||||
Environment=ROUTER_HOST=0.0.0.0
|
||||
@@ -15,6 +15,13 @@ Environment=PROFILE_SCRIPT=/usr/local/bin/llama-profile
|
||||
Environment=PROFILE_DIR=/etc/systemd/system/mike-ai-llama-ui.service.d
|
||||
Environment=SWITCH_TIMEOUT=600
|
||||
Environment=REQUEST_TIMEOUT=600
|
||||
Environment=LLAMA_SERVICE=mike-ai-llama-ui.service
|
||||
Environment=IMAGE_WORKER=/opt/mike-ai/ai-profile-router/image_worker.py
|
||||
Environment=IMAGE_PYTHON=/opt/mike-ai/ai-profile-router/venv/bin/python
|
||||
Environment=IMAGE_DIR=/opt/mike-ai/ai-profile-router/images
|
||||
Environment=IMAGE_WORKER_LOG=/opt/mike-ai/ai-profile-router/worker.log
|
||||
Environment=IMAGE_GEN_TIMEOUT=600
|
||||
Environment=IMAGE_VRAM_FREE_TIMEOUT=120
|
||||
NoNewPrivileges=true
|
||||
PrivateTmp=true
|
||||
|
||||
|
||||
Reference in New Issue
Block a user