1 Punkte von GN⁺ 2023-12-25 | 1 Kommentare | Auf WhatsApp teilen
  • 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-txt2img und demo/realtime-img2img; die Img2Img-Demo nutzt im Webbrowser einen Live-Webcam-Feed oder Bildschirmaufnahme
  • Die Nutzung erfolgt durch Wrapping der StableDiffusionPipeline von 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.10 oder venv genannt
  • 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
  • Installation für Nutzer
  • Unter Windows kann bei Installation der stabilen Version zusätzlich die Installation von pywin32 erforderlich sein
  • Die Docker-Installation zielt auf eine für TensorRT vorbereitete Umgebung ab und wird nach docker build mit der Option --gpus all ausgeführt

Demos und Nutzungsbeispiele

  • Beispiele lassen sich im Verzeichnis examples ausfü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 StableDiffusionPipeline von Diffusers zu laden und anschließend mit StreamDiffusion zu wrappen
  • Das Img2Img-Beispiel lädt das Modell KBlueLeaf/kohaku-v2.1 und konfiguriert den Stream mit t_index_list=[32, 45]
    • Wenn das Modell kein LCM ist, werden load_lcm_lora() und fuse_lora() verwendet
    • Für zusätzliche Beschleunigung wird Tiny VAE von madebyollin/taesd genutzt
    • Mit enable_xformers_memory_efficient_attention() wird der speichereffiziente Attention-Mechanismus von xformers aktiviert
  • Das Txt2Img-Beispiel verwendet t_index_list=[0, 16, 32, 45]; für Text-zu-Bild wird die Nutzung von cfg_type="none" empfohlen
  • Die Anzahl der Warm-up-Durchläufe sollte mindestens len(t_index_list) x frame_buffer_size betragen

TensorRT-Beschleunigung

  • Für schnellere Generierung kann der Code zur Aktivierung von xformers durch TensorRT-Beschleunigungscode ersetzt werden
  • Verwendet wird accelerate_with_tensorrt aus streamdiffusion.acceleration.tensorrt
  • Die Beispielkonfiguration übergibt stream, "engines" und max_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 wird
    • similar_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_type von StreamDiffusion angegeben 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_type lauten wie folgt
    • Kein CFG: "none"
    • Normales CFG: "full"
    • RCFG Self-Negative: "self"
    • RCFG Onetime-Negative: "initialize"
  • delta hat einen dämpfenden Effekt, der die Wirkung von RCFG reguliert

Verwendete Modelle und Ressourcen

1 Kommentare

 
GN⁺ 2023-12-25
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.

    • Ich warte darauf, dass das meine Arbeit übernehmen kann, damit ich es auf meinem PC laufen lassen und an Slack anbinden kann. Dann bekommt mein Arbeitgeber ungefähr dieselben Ergebnisse wie von mir per Hand, ich bekomme mein Gehalt, ohne tatsächlich Arbeitszeit aufzuwenden, und kann mich endlich auf meine Hobbys konzentrieren. Darauf läuft es doch am Ende hinaus, oder?
    • Das gesamte Open-Source-AI-Ökosystem fühlt sich im Moment so an. Fast jeden Tag gibt es einen neuen Fortschritt, der etwas möglich macht, das vorher als unmöglich galt, und es ist wirklich schwer, mit den Änderungen Schritt zu halten.
    • Als Frontend-Entwickler verstehe ich jetzt die Leute, die sich darüber beschwert haben, dass sich die Frontend-Welt zu schnell verändert, um mitzuhalten.
    • Diese Software entwickelt sich schneller weiter, als ich apt-get install ausführen kann.
    • Das erinnert mich an Incremental Games (https://www.reddit.com/r/incremental_games/). Aber mit solchen Spielen sollte man besser gar nicht erst anfangen. Sie können einem den Urlaub ruinieren.
  • Ich habe gerade die Demo realtime-text2img ausprobiert, 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\screen fü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.

    • Ich frage mich, wie die tatsächliche Qualität, Vielfalt und Prompt-Treue sind. Ich habe seit ein paar Tagen keinen Zugriff auf meine GPU und kann es daher nicht selbst prüfen.
      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?

    • Ich habe es nicht selbst ausprobiert, aber meiner Vermutung nach ist Batch-Verarbeitung nicht nötig.
      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.py von realtime-txt2img das 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?

    • Es ist Video-Input. Laut Artikel reduziert der stochastische Ähnlichkeitsfilter die Transformationsarbeit, wenn sich ein Frame im Video-Input nur wenig vom vorherigen unterscheidet, und senkt so die GPU-Last. Die roten Frames im GIF oben sind ein Beispiel dafür.
    • Auf GitHub ist derzeit ein Issue offen, um ControlNet-Support hinzuzufügen, also scheint es nicht ControlNet zu sein. Es sieht einfach nach img2img mit Prompt und rcfg-Scale aus.
    • Heißt das dann, dass links das Originalbild und rechts das Ergebnisbild ist?
  • Wie viele fps erreicht es auf Apple Silicon?

    • MPS-Unterstützung gibt es nicht, also 0.
      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.
    • Ich lasse SDXL Turbo mit DrawThings auf einem M1 Pro mit 32 GB RAM laufen.
      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.
    • Mindestens etwa 1/8 davon sollte drin sein, aber wenn es auf Apple mit mindestens 24 fps läuft, wäre das enorm. Mit etwas Interpolation könnte es vielleicht machbar sein.
      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?