- Das Stable-Diffusion-WebGPU-Demo muss in der neuesten Version von Chrome mit aktivierten Flags für „Experimentelles WebAssembly“ und „Experimentelle WebAssembly JavaScript Promise Integration (JSPI)“ ausgeführt werden.
- Jeder Inferenzschritt des Demos dauert etwa 1 Minute, und für die Ausführung des VAE-Decoders zur Bilderzeugung werden zusätzlich etwa 10 Sekunden benötigt.
- Wenn DevTools geöffnet ist, wird das Demo etwa doppelt so langsam.
- Das im Demo verwendete UNET-Modell läuft nur auf der CPU; der Browser-Tab kann einfrieren, ist aber 10 % schneller als die Ausführung auf der GPU.
- Die minimale Anzahl an Schritten für akzeptable Ergebnisse im Demo beträgt 20. Zu Demonstrationszwecken reichen jedoch 3 Schritte aus.
- Die Modelldateien werden zwischengespeichert, sodass sie nicht bei jeder Ausführung des Demos erneut heruntergeladen werden müssen.
- Wenn der Fehler „protobuf parsing failed“ auftritt, können Sie in DevTools unter Application -> Storage die Site-Daten löschen.
- Wenn der Fehler „sbox_fatal_memory_exceeded“ auftritt, steht nicht genügend RAM zur Verfügung, um das Demo auszuführen. Sie können versuchen, den Tab oder den Browser neu zu laden.
- Das Demo wurde ermöglicht, indem StableDiffusionPipeline von Python nach JS portiert und onnxruntime sowie emscripten+binaryen gepatcht wurden, damit mehr als 4 GB Speicher zugewiesen und genutzt werden können.
- Derzeit unterstützt das Demo kein Multithreading und verwendet nur einen CPU-Kern, weshalb es langsam ist. Eine weitere Einschränkung ist die fehlende Unterstützung für 64-Bit-Speicher über den
WebAssembly.Memory-Konstruktor.
- Das Demo läuft auf der GPU, aber webgpu und onnxruntime befinden sich noch in einem frühen Stadium, daher ist vieles noch nicht implementiert. Daten werden fortlaufend über JS zwischen GPU und CPU übertragen, was die Verarbeitung verlangsamt. Wenn mehr Aufgaben JS-Kernel erhalten, wird das Demo schneller werden.
- Das Demo kann lokal mit dem auf GitHub verfügbaren Code ausgeführt werden.
- Mit dem gepatchten onnxruntime lassen sich große LLMs mit transformers.js ausführen, allerdings begrenzt auf 8 GB Speicher. Mit diesem Paket können Gewichte von bis zu etwa 4 GB geladen werden.
- Der Autor hat zuvor bereits GPU-Beschleunigung zu den node.js-Bindings hinzugefügt und plant daher, einen Pull Request für das onnxruntime-Repository einzureichen.
1 Kommentare
Hacker-News-Kommentare