StreamDiffusion: Eine Pipeline-Level-Lösung für interaktive Echtzeit-Generierung
(github.com/cumulo-autumn)- StreamDiffusion ist eine Pipeline, die diffusionsbasierte Bilderzeugung für interaktive Echtzeit-Generierung verbessert und darauf abzielt, die Performance bestehender Verfahren zur diffusionsbasierten Bilderzeugung zu steigern
- Zu den Kernfunktionen gehören Stream Batch, Residual Classifier-Free Guidance, Stochastic Similarity Filter, IO Queues, Vorab-Berechnung von KV-Caches sowie Tools zur Modellbeschleunigung
- In einer Umgebung mit RTX 4090, Core i9-13900K und Ubuntu 22.04.3 LTS erreichte SD-turbo bei 1 Denoising-Step Txt2Img 106,16 fps und Img2Img 93,897 fps
- Echtzeit-Demos befinden sich unter
demo/realtime-txt2imgunddemo/realtime-img2img; die Img2Img-Demo nutzt im Webbrowser einen Live-Webcam-Feed oder Bildschirmaufnahme - Die Nutzung erfolgt durch Wrapping der
StableDiffusionPipelinevon Diffusers; schnellere Ausführung lässt sich durch LCM-LoRA-Merging, Tiny VAE, xformers und TensorRT-Beschleunigung konfigurieren
Ziel und Performance von StreamDiffusion
- StreamDiffusion ist eine Diffusions-Pipeline für interaktive Echtzeit-Generierung
- Ziel ist es, Performance-Verbesserungen für aktuelle diffusionsbasierte Verfahren zur Bilderzeugung bereitzustellen
- Das Paper ist auf arXiv 2312.12491 und Hugging Face Papers verlinkt
- Die Messumgebung für die Bilderzeugung mit der vorgeschlagenen Pipeline war wie folgt
- GPU: RTX 4090
- CPU: Core i9-13900K
- OS: Ubuntu 22.04.3 LTS
- Performance-Tabelle
- SD-turbo: Denoising-Step 1, Txt2Img 106,16 fps, Img2Img 93,897 fps
- LCM-LoRA + KohakuV2: Denoising-Step 4, Txt2Img 38,023 fps, Img2Img 37,133 fps
Kernfunktionen
-
Stream Batch
- Vereinfacht die Datenverarbeitung durch effiziente Batch-Verarbeitung
-
Residual Classifier-Free Guidance
- Ein verbesserter Guidance-Mechanismus, der redundante Berechnungen reduziert
-
Stochastic Similarity Filter
- Verbessert die Effizienz der GPU-Nutzung durch eine fortgeschrittene Filtertechnik
-
IO Queues
- Verwaltet Eingabe- und Ausgabeoperationen effizient und unterstützt dadurch eine flüssigere Ausführung
-
Pre-Computation for KV-Caches
- Erhöht die Verarbeitungsgeschwindigkeit durch Optimierung der Caching-Strategie
-
Model Acceleration Tools
- Nutzt verschiedene Tools zur Modelloptimierung und Performance-Steigerung
Installation und Ausführung
- StreamDiffusion kann per pip, conda oder Docker installiert werden
- Als empfohlene Python-Umgebung werden etwa eine conda-Umgebung auf Basis von
python=3.10odervenvgenannt - Die Beispiele für die PyTorch-Installation unterscheiden zwischen CUDA 11.8 und CUDA 12.1
- CUDA 11.8:
torch==2.1.0,torchvision==0.16.0,xformers - CUDA 12.1:
torch==2.1.0,torchvision==0.16.0,xformers
- CUDA 11.8:
- Installation für Nutzer
- Neueste Version empfohlen:
pip install git+https://github.com/cumulo-autumn/StreamDiffusion.git@main/…] - Stabile Version:
pip install streamdiffusion[tensorrt] - Die TensorRT-Erweiterung wird mit
python -m streamdiffusion.tools.install-tensorrtinstalliert
- Neueste Version empfohlen:
- Unter Windows kann bei Installation der stabilen Version zusätzlich die Installation von
pywin32erforderlich sein - Die Docker-Installation zielt auf eine für TensorRT vorbereitete Umgebung ab und wird nach
docker buildmit der Option--gpus allausgeführt
Demos und Nutzungsbeispiele
- Beispiele lassen sich im Verzeichnis
examplesausführen - Die Echtzeit-Txt2Img-Demo befindet sich im Verzeichnis
demo/realtime-txt2img - Die Echtzeit-Img2Img-Demo befindet sich im Verzeichnis
demo/realtime-img2img- Im Webbrowser kann ein Live-Webcam-Feed oder eine Bildschirmaufnahme genutzt werden
- Der grundlegende Ablauf besteht darin, die
StableDiffusionPipelinevon Diffusers zu laden und anschließend mitStreamDiffusionzu wrappen - Das Img2Img-Beispiel lädt das Modell
KBlueLeaf/kohaku-v2.1und konfiguriert den Stream mitt_index_list=[32, 45]- Wenn das Modell kein LCM ist, werden
load_lcm_lora()undfuse_lora()verwendet - Für zusätzliche Beschleunigung wird Tiny VAE von
madebyollin/taesdgenutzt - Mit
enable_xformers_memory_efficient_attention()wird der speichereffiziente Attention-Mechanismus von xformers aktiviert
- Wenn das Modell kein LCM ist, werden
- Das Txt2Img-Beispiel verwendet
t_index_list=[0, 16, 32, 45]; für Text-zu-Bild wird die Nutzung voncfg_type="none"empfohlen - Die Anzahl der Warm-up-Durchläufe sollte mindestens
len(t_index_list) x frame_buffer_sizebetragen
TensorRT-Beschleunigung
- Für schnellere Generierung kann der Code zur Aktivierung von xformers durch TensorRT-Beschleunigungscode ersetzt werden
- Verwendet wird
accelerate_with_tensorrtausstreamdiffusion.acceleration.tensorrt - Die Beispielkonfiguration übergibt
stream,"engines"undmax_batch_size=2 - Die TensorRT-Erweiterung ist erforderlich, und der Engine-Build benötigt Zeit
- Nach dem Build der Engine läuft die Ausführung schneller als in den vorherigen Beispielen
Stochastic Similarity Filter
- Der Stochastic Similarity Filter reduziert bei Videoeingaben die Transformationsarbeit, wenn sich gegenüber dem vorherigen Frame nur wenig geändert hat
- Durch weniger Transformationsarbeit wird die GPU-Last verringert
- Die Nutzung erfolgt durch Aufruf von
stream.enable_similar_image_filter() - Konfigurierbare Parameter
similar_image_filter_threshold: Ähnlichkeitsschwelle zwischen vorherigem und aktuellem Frame, bevor die Verarbeitung pausiert wirdsimilar_image_filter_max_skip_frame: Maximal zulässiger Abstand während der Pause, bevor die Transformation wieder aufgenommen wird
Residual CFG
- RCFG ist eine Methode zur approximativen Umsetzung von CFG mit einer Rechenkomplexität, die mit dem Fall ohne CFG konkurrenzfähig ist
- Kann über das Argument
cfg_typevonStreamDiffusionangegeben werden - Es gibt zwei RCFG-Typen
- RCFG Self-Negative: Variante ohne Angabe eines Negative Prompt
- RCFG Onetime-Negative: Variante, bei der ein Negative Prompt angegeben werden kann
- Vergleich der Rechenkomplexität
- Kein CFG: N
- Normales CFG: 2N
- RCFG Self-Negative: N
- RCFG Onetime-Negative: N+1
- Die Werte für
cfg_typelauten wie folgt- Kein CFG:
"none" - Normales CFG:
"full" - RCFG Self-Negative:
"self" - RCFG Onetime-Negative:
"initialize"
- Kein CFG:
deltahat einen dämpfenden Effekt, der die Wirkung von RCFG reguliert
Verwendete Modelle und Ressourcen
- Die Video- und Bild-Demos des Repositorys wurden mit LCM-LoRA + KohakuV2 sowie SD-Turbo erzeugt
- Das KohakuV2-Modell kann bei Civitai und Hugging Face heruntergeladen werden
- SD-Turbo ist auch als Hugging Face Space verfügbar
1 Kommentare
Meinungen auf Hacker News
Das arXiv-Paper gibt es hier: https://arxiv.org/abs/2312.12491
Ich denke, man könnte es schneller machen als die Standardmessungen auf einer 4090. Mit SDXL Turbo kam ich ohne Optimierung bei einem Iterationsschritt auf bis zu 10 fps.
Verbesserungen wie der stochastische Ähnlichkeitsfilter, der unnötige Generierung verhindert, wirken aber nützlich, um schnelle Ergebnisse zu bekommen, ohne die GPU dauerhaft auf 100 % festzunageln.
Es wirkt fast unrealistisch. Es fühlt sich an, als seien 10 Jahre in einem Jahr vergangen.
apt-get installausführen kann.Ich habe gerade die Demo
realtime-text2imgausprobiert, und npm für das Frontend zu verwenden wirkt für diesen Zweck übertrieben. Ich habe es so geändert, dass statt 16 Bildern nur 1 Bild erzeugt wird, und es läuft auch auf einem RTX-3080-Laptop gut. Vermutlich kommen etwa 2 Bilder pro Sekunde heraus.Edit: Die Demo
examples\screenfühlt sich fast wie Echtzeit an. Im Fenster steht 4 fps, aber ich weiß nicht genau, was das bedeutet.Edit: Allerdings ist die Denoising-Stärke von img2img sehr niedrig, sodass sich das zurückgegebene Bild nur minimal vom Original unterscheidet.
Papers zu generativen Modellen sind immer schwer einzuschätzen, bevor man sie selbst ausführt. Schließlich müssen den Reviewern Ergebnisse gezeigt werden, daher landen zwangsläufig ausgewählte Resultate darin. Ich finde das nicht gut, aber so ist derzeit die Realität.
Wird hier ein kleiner Autoencoder verwendet? Artspew hat das auch gemacht und höhere FPS erreicht, aber kein TensorRT genutzt, dafür Triton, und die Qualität war miserabel. Cool war es trotzdem.
Jedenfalls ist es beeindruckend, selbst wenn die Qualität deutlich schlechter ist als gezeigt, aber in der Praxis ist das schwer zu wissen.
Ich frage mich, ob 100 fps bedeutet, dass man alle 10 ms eine neue Eingabe liefern und alle 10 ms eine neue Ausgabe erhalten kann. Oder muss man Eingaben bündeln und als Batch verarbeiten, um diesen durchschnittlichen Durchsatz zu erreichen?
Der langsame Teil bei Modellen ist das Laden des Modells. Sobald das Modell geladen ist, kann man die gewünschte Eingabe schicken.
Mein Bauchgefühl sagt mir, dass das Parsen und Senden der Bilddaten hier nicht der Flaschenhals sein dürfte.
Es lief fast sofort genau wie in der Dokumentation beschrieben. Die meisten Demos dieser Art stürzen ab und werfen irgendwelche merkwürdigen, tiefen Fehler, aber diese war in Ordnung.
Gut gemacht. Einen Versuch ist es wert. Wenn man etwas erstellen möchte, das nicht nach Anime aussieht, kann man in
server.pyvonrealtime-txt2imgdas Modell ändern. Zum Beispiel funktioniert auch https://huggingface.co/runwayml/stable-diffusion-v1-5 gut.Die Ergebnisse sind wirklich schnell. Nicht großartig, aber schnell. Wenn man mit LCM-LoRA auf SDXL umstellt, https://huggingface.co/latent-consistency, könnten bessere Ergebnisse herauskommen, aber ab dann wird es schwierig, und man läuft in die oben erwähnten rätselhaften Crashes. Das ist der Punkt, an dem echte Arbeit nötig wird.
Meine Umgebung ist 4090/3990x/CUDA 12.2/debian sid, je nach Setup kann es also anders aussehen.
Wie funktioniert die Demo, in der sich die weibliche Figur in den Frame hinein und wieder heraus bewegt? Ist das ControlNet?
Wie viele fps erreicht es auf Apple Silicon?
Allerdings ist ein M1 Max 64 GB Studio im gleichen Preisbereich, refurbisht derzeit etwa 1.800 Dollar, bei generativer KI mit SD1.5 und SDXL ungefähr 13-mal langsamer als eine RTX 4090 24 GB.
Ein Bild mit 512x512 und 5 Schritten wird in 5 Sekunden erzeugt. Refiner, Upscaler und Face Restoration nutze ich nicht.
Soweit ich weiß, ist DrawThings noch nicht für SDXL Turbo oder Pipeline-Generierung optimiert.
Zum Vergleich: Wenn ich mit SDXL Base+Refiner und aktivierter Face Restoration ein Bild mit 2k x 2k und 50 Schritten erstelle, dauert das etwa 120 Sekunden.
Besonders bei Anime-Stil zeichnet man im Grunde ohnehin nur jedes zweite Frame, daher könnte man wohl auch mit 12 fps auskommen.
Gibt es irgendwo ein Video, das man sich ansehen kann?