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:
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
# Fake systemctl für lokale Tests: verwaltet den Mock-llama.cpp-Prozess.
|
||||
# Simuliert: systemctl stop|start|status <service>
|
||||
#
|
||||
# Umgebungsvariablen (vom Router geerbt):
|
||||
# FAKE_SYSTEMD_PIDFILE PID-Datei des Mocks (Default /tmp/mock_upstream_pid)
|
||||
# FAKE_SYSTEMD_PORT Mock-Port (Default 18080)
|
||||
# FAKE_SYSTEMD_PROFILE_DIR Profil-Dir für den Mock
|
||||
# FAKE_SYSTEMD_MOCK Mock-Skript (Default dev/mock_upstream.py)
|
||||
# FAKE_SYSTEMD_LOG Log-Datei (Default /tmp/mock_upstream_fake.log)
|
||||
|
||||
CMD="${1:-}"
|
||||
PIDFILE="${FAKE_SYSTEMD_PIDFILE:-/tmp/mock_upstream_pid}"
|
||||
PORT="${FAKE_SYSTEMD_PORT:-18080}"
|
||||
PROFILE_DIR="${FAKE_SYSTEMD_PROFILE_DIR:-}"
|
||||
MOCK="${FAKE_SYSTEMD_MOCK:-dev/mock_upstream.py}"
|
||||
LOG="${FAKE_SYSTEMD_LOG:-/tmp/mock_upstream_fake.log}"
|
||||
|
||||
is_running() {
|
||||
[ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null
|
||||
}
|
||||
|
||||
case "$CMD" in
|
||||
stop)
|
||||
if is_running; then
|
||||
kill "$(cat "$PIDFILE")" 2>/dev/null || true
|
||||
rm -f "$PIDFILE"
|
||||
for _ in $(seq 1 50); do
|
||||
is_running || break
|
||||
sleep 0.1
|
||||
done
|
||||
fi
|
||||
exit 0
|
||||
;;
|
||||
start)
|
||||
if ! is_running; then
|
||||
MOCK_PROFILE_DIR="$PROFILE_DIR" MOCK_PORT="$PORT" \
|
||||
python3 "$MOCK" >>"$LOG" 2>&1 &
|
||||
echo $! > "$PIDFILE"
|
||||
fi
|
||||
exit 0
|
||||
;;
|
||||
status)
|
||||
is_running && exit 0 || exit 3
|
||||
;;
|
||||
*)
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user