Stable-Diffusion-WebGPU-Demo
(islamov.ai)- Eine Demo zur Stable Diffusion-Bildgenerierung, die direkt im Browser läuft und ohne separaten Server auf Basis von WebGPU und WebAssembly funktioniert
- Nutzbar nur, wenn in der aktuellen Chrome-Version die Flags "Experimental WebAssembly" und "Experimental WebAssembly JavaScript Promise Integration (JSPI)" aktiviert sind
- Erzeugt Bilder anhand von Prompt, Negative Prompt und der Anzahl der Inference-Schritte; Modelldateien werden zwischengespeichert, sodass sie nicht jedes Mal erneut heruntergeladen werden müssen
- Entstanden durch Patches an onnxruntime, emscripten, binaryen zur Speicherzuweisung über 4 GB sowie durch ein JS-Port von Pythons StableDiffusionPipeline
- Derzeit langsam wegen fehlender Multithreading-Unterstützung und noch nicht implementierter WebGPU-Operationen, aber mit Aussicht auf Verbesserungen durch JS-Kernel-Implementierung und memory64-Unterstützung
Ausführungsanforderungen
- Im aktuellen Chrome-Browser müssen die Flags Experimental WebAssembly und Experimental WebAssembly JavaScript Promise Integration (JSPI) aktiviert werden
- Model files werden gecacht, daher ist bei einem erneuten Besuch kein erneuter Download nötig
Eingaben und Funktionsweise
- Als Eingaben stehen Prompt, Negative Prompt und die Anzahl der Inference-Schritte zur Verfügung
- Durch die Verwendung des PNDM Scheduler wird die tatsächliche Schrittzahl vom Eingabewert i zu i+1 verarbeitet
- Jeder Schritt dauert etwa 1 Minute; für die Ausführung des VAE decoder zur Bilderzeugung kommen zusätzlich etwa 10 Sekunden hinzu
- Wenn DevTools geöffnet sind, wird die Gesamtgeschwindigkeit etwa halbiert
- UNET läuft nur auf der CPU, ist dort 10 % schneller als auf der GPU und liefert auf der GPU keine korrekten Ergebnisse, wodurch der Browser-Tab hängen bleibt
- Die minimale Schrittzahl für akzeptable Ergebnisse liegt bei 20; für Demo-Zwecke sind auch 3 Schritte ausreichend
FAQ
-
Fehler
protobuf parsing failed- In DevTools zu Application → Storage wechseln und "Clear site data" ausführen
-
Fehler
sbox_fatal_memory_exceeded- Es steht nicht genug RAM für die Ausführung von SD zur Verfügung; versuche, den Tab oder den Browser neu zu laden
-
Implementierungsweise
- Pythons StableDiffusionPipeline wurde nach JS portiert
- onnxruntime sowie emscripten+binaryen (WebAssembly-Compiler-Toolchain) wurden gepatcht, um Speicherzuweisung und -nutzung über 4 GB zu unterstützen
- Sobald die zugehörigen Pull Requests in Releases enthalten sind, kann jeder im Browser Code kompilieren und ausführen, der mehr als 4 GB Speicher verwendet
-
Ursachen der langsamen Geschwindigkeit
- Es gibt noch keine Multithreading-Unterstützung, daher wird nur ein CPU-Kern verwendet
- Über den
WebAssembly.Memory-Konstruktor kann kein 64-Bit-Speicher mit SharedArrayBuffer erzeugt werden - Es wurde eine Änderung der Spezifikation für das "memory64"-Flag vorgeschlagen; nach Annahme soll Unterstützung durch einen Patch der V8-Engine folgen
-
Ob GPU-Ausführung möglich ist
- Die Ausführung erfolgt auf der GPU, aber WebGPU in onnxruntime befindet sich noch in einer frühen Phase, daher sind viele Operationen nicht implementiert
- Daten werden fortlaufend über JS zwischen CPU und GPU übertragen
- Sobald für die meisten Operationen JS-Kernel implementiert sind, ist eine deutliche Geschwindigkeitssteigerung möglich
-
Ob lokale Ausführung möglich ist
- Ja, der Code dieser Seite wird im Repository stable-diffusion-webgpu-minimal bereitgestellt
-
Ob sich mit transformers.js große LLMs ausführen lassen
- Das gepatchte onnxruntime-Paket (@aislamov/onnxruntime-web64) kann verwendet werden, allerdings ist die Funktionsfähigkeit nicht in allen Fällen garantiert
- Dieser Build ist auf 8 GB Speicher begrenzt und kann Gewichte bis etwa 4 GB laden
-
Geplante Pull Requests für das onnxruntime-Repository
- Sind vorgesehen; es ist die zweite Arbeit nach dem früheren Hinzufügen von GPU-Beschleunigung zu den node.js-Bindings
1 Kommentare
Hacker-News-Kommentare
Das MLC-Team hatte das schon im März zum Laufen gebracht: https://github.com/mlc-ai/web-stable-diffusion
Noch beeindruckender ist, dass sie danach sogar Support für mehrere große Sprachmodelle hinzugefügt haben: https://webllm.mlc.ai/
„Lädt 3,5 GB und verwendet 8 GB RAM“
Interessant, dass Browser so geworden sind. Das Web hat das Betriebssystem aufgefressen
Wenn man es ohne Browser direkt herunterlädt und ausführt, wären Download-Größe und RAM-Nutzung fast identisch
Solche Erfahrungen im Browser anzubieten vereinfacht manches, und es scheint keinen einfacheren Weg zu geben, Stable Diffusion auszuführen, daher hoffe ich, dass solche Projekte weiter unterstützt werden
Offenbar braucht man die neueste Chrome-Version mit aktivierten Flags für
Experimental WebAssemblyundExperimental WebAssembly JavaScript Promise Integration (JSPI), also warte ich wohl, bis das in Firefox ankommtchrome:flagsin Brave aktiviert, aber es lief trotzdem nicht. Auf meinen M1-Macs habe ich Chrome noch nie heruntergeladen und habe auch jetzt nicht vor, damit anzufangenHier ist es ebenfalls schon implementiert: https://websd.mlc.ai/#text-to-image-generation-demo
MLC nutzt Apache TVM für WebGPU-Codegenerierung und Auto-Tuning, und die Performance ist ziemlich ordentlich
Ich habe Stable Diffusion von MLC-AI als benutzerdefinierten Hintergrundgenerator in meine Website integriert. Die Modelldaten kommen von Hugging Face
https://dustinbrett.com/
Bei CPU-gebundenen Aufgaben könnte man überlegen, Service Worker zu verwenden, damit der Main Thread nicht blockiert
Ist das Nächste dann ein WebGPU-Chatbot? ChatGPT-artiger Chat im Browser auf meiner GPU?
Große Sprachmodelle brauchen bei besseren Modellen viel RAM/VRAM und sind auf WebGPU besonders anspruchsvoll
Ist bereits umgesetzt
Nur aus Neugier: Wofür nutzt man das?
Soweit ich weiß, werden Bilder im Browser statt auf dem Server erzeugt. Mir fällt dazu vor allem ein, dass man die Seite nicht neu laden muss, um Bilder zu ändern oder neue zu erzeugen.
Das könnte bedeuten, dass Websites möglich werden, deren visuelles Design sich in Echtzeit verändert, und wenn sich auch funktional etwas sinnvoll ändern kann, wäre das ziemlich cool. Ich bin mir nur nicht sicher, wie nützlich Stable Diffusion für die Erzeugung von UI-Komponenten oder visuellen Elementen einer Website wirklich ist
Sensible Prompts gelangen nicht an irgendjemanden in der Ferne
Gibt es Kennzahlen, die die Performance auf WebGPU mit nativer Ausführung vergleichen?
Wahrscheinlich liegt das daran, dass der Großteil der GPU-Berechnungen für VAE bereits implementiert ist, für UNET aber nicht. Im zweiten Fall schiebt der Browser bei jedem Schritt ständig Daten zwischen GPU und CPU hin und her
Wenn es schnell genug ist, könnte man es privat nutzen, um Bilder lokal zu rendern. Eine Website könnte nur den Prompt übermitteln und pro Nutzer unterschiedliche Bilder rendern.
Wie wäre dann das Urheberrecht an diesem Punkt? Ist schon das Modell selbst urheberrechtlich geschützt, oder bricht das ganze System auseinander?
Und ich glaube nicht, dass viele Webdesigner das Risiko akzeptieren würden, dass das Modell Prompts falsch interpretiert, verzerrte Ergebnisse mit falscher Anzahl von Fingern erzeugt oder versehentlich sexuelle bzw. gewalttätige Inhalte in unpassenden Kontexten produziert.
Bei vielen generativen Bildmodellen heute wählt man meist das beste aus zehn oder mehr Bildern aus, und der Rest, den man verwirft, kann tatsächlich ziemlich schlecht sein.
Damit Websites routinemäßig dynamisch illustriert werden können, müssten Qualität und Vorhersagbarkeit der Modelle deutlich höher sein als heute.
Ich will damit nicht sagen, dass wir da nie hinkommen. Neuere Modelle leisten bereits Dinge, die vor ein paar Jahren noch als unvorstellbar galten. Verglichen mit https://xkcd.com/1425/ könnte es für jüngere Leser sogar schwierig sein, das Hintergrundproblem des Witzes überhaupt noch zu erklären!