Demo Stable Diffusion WebGPU
(islamov.ai)- Demo pembuatan gambar Stable Diffusion yang berjalan langsung di browser, beroperasi berbasis WebGPU dan WebAssembly tanpa server terpisah
- Dapat digunakan setelah mengaktifkan flag "Experimental WebAssembly" dan "Experimental WebAssembly JavaScript Promise Integration (JSPI)" di Chrome terbaru
- Menghasilkan gambar dengan menerima input Prompt, Negative Prompt, dan jumlah inference step; file model di-cache sehingga tidak perlu diunduh ulang setiap kali
- Hasil dari patch pada onnxruntime, emscripten, binaryen untuk alokasi memori di atas 4GB serta porting StableDiffusionPipeline Python ke JS
- Saat ini masih lambat karena belum mendukung multithreading dan operasi WebGPU belum diimplementasikan, tetapi menunjukkan potensi peningkatan melalui implementasi kernel JS dan dukungan memory64 di masa mendatang
Persyaratan menjalankan
- Perlu mengaktifkan flag Experimental WebAssembly dan Experimental WebAssembly JavaScript Promise Integration (JSPI) di browser Chrome terbaru
- Model files di-cache sehingga tidak perlu diunduh ulang saat berkunjung kembali
Input dan cara kerja
- Item input yang disediakan: Prompt, Negative Prompt, dan jumlah inference step
- Karena menggunakan PNDM Scheduler, step sebenarnya diproses dari nilai input i menjadi i+1
- Setiap step memakan waktu sekitar 1 menit, dan menjalankan VAE decoder untuk pembuatan gambar membutuhkan tambahan sekitar 10 detik
- Jika DevTools dibuka, kecepatan keseluruhan menjadi sekitar 2 kali lebih lambat
- UNET hanya berjalan di CPU; 10% lebih cepat daripada GPU, sementara di GPU tidak menghasilkan keluaran yang benar dan membuat tab browser berhenti merespons
- Jumlah step minimum untuk mendapatkan hasil yang dapat diterima adalah 20, sedangkan untuk tujuan demo 3 step juga tidak masalah
FAQ
-
Error protobuf parsing failed
- Di DevTools, buka Application → Storage lalu jalankan "Clear site data"
-
Error sbox_fatal_memory_exceeded
- Kondisi RAM tidak mencukupi untuk menjalankan SD; coba atasi dengan memuat ulang tab atau browser
-
Cara implementasi
- StableDiffusionPipeline dari Python di-port ke JS
- onnxruntime dan emscripten+binaryen (toolchain compiler WebAssembly) di-patch untuk mendukung alokasi dan penggunaan memori di atas 4GB
- Jika pull request terkait masuk ke rilis, siapa pun dapat mengompilasi dan menjalankan kode yang menggunakan memori di atas 4GB di browser
-
Penyebab lambat
- Karena multithreading belum didukung, masih hanya menggunakan satu core CPU
- Pembuatan memori 64-bit dengan SharedArrayBuffer melalui constructor WebAssembly.Memory tidak memungkinkan
- Mengusulkan perubahan spesifikasi flag "memory64", dan setelah diadopsi berencana mem-patch engine V8 untuk mendukungnya
-
Apakah berjalan di GPU
- Berjalan di GPU, tetapi WebGPU pada onnxruntime masih tahap awal sehingga banyak operasi belum diimplementasikan
- Data terus-menerus ditransfer melalui JS antara CPU dan GPU
- Jika kernel JS diimplementasikan untuk sebagian besar operasi, kecepatan dapat meningkat drastis
-
Apakah bisa dijalankan secara lokal
- Bisa, dan kode halaman tersebut tersedia di repositori stable-diffusion-webgpu-minimal
-
Apakah bisa menjalankan LLM besar dengan transformers.js
- Paket onnxruntime yang sudah di-patch (@aislamov/onnxruntime-web64) dapat digunakan, tetapi tidak dijamin berfungsi di semua kasus
- Build tersebut dibatasi pada memori 8GB sehingga dapat memuat bobot hingga sekitar 4GB
-
Rencana pull request ke repositori onnxruntime
- Direncanakan akan dilakukan, sebagai pekerjaan kedua setelah sebelumnya menambahkan akselerasi GPU pada binding node.js
1 komentar
Komentar Hacker News
Tim MLC sudah menjalankan ini sejak Maret: https://github.com/mlc-ai/web-stable-diffusion
Yang lebih mengesankan, mereka kemudian bahkan menambahkan dukungan untuk berbagai large language model: https://webllm.mlc.ai/
“Memuat 3.5GB dan menggunakan RAM 8GB”
Menarik melihat browser menjadi seperti ini. Web telah memakan sistem operasi
Bahkan jika diunduh dan dijalankan langsung tanpa browser, ukuran unduhan dan penggunaan RAM-nya kemungkinan hampir sama
Ada sisi yang menjadi lebih sederhana saat pengalaman seperti ini diberikan lewat browser, dan sepertinya tidak ada cara yang lebih mudah daripada ini untuk menjalankan Stable Diffusion, jadi saya harap proyek seperti ini terus didukung
Ternyata perlu Chrome terbaru dengan flag
Experimental WebAssemblydanExperimental WebAssembly JavaScript Promise Integration (JSPI)aktif, jadi sepertinya saya harus menunggu sampai masuk ke Firefoxchrome:flagsyang diminta di Brave, tapi tetap tidak berjalan. Saya belum pernah mengunduh Chrome di Mac M1 saya, dan tidak berniat memulainya sekarangIni juga sudah diimplementasikan di sini: https://websd.mlc.ai/#text-to-image-generation-demo
MLC melakukan generasi kode WebGPU dan auto-tuning dengan Apache TVM, dan performanya juga cukup bagus
Saya mengintegrasikan Stable Diffusion dari MLC-AI ke situs web saya sebagai generator latar belakang kustom. Data modelnya diambil dari Hugging Face
https://dustinbrett.com/
Untuk pekerjaan yang terikat CPU, mungkin layak mempertimbangkan penggunaan service worker agar thread utama tidak macet
Berikutnya chatbot WebGPU? Chat ala ChatGPT di browser memakai GPU saya?
Semakin bagus sebuah large language model, biasanya semakin besar penggunaan RAM/VRAM-nya, sehingga terutama sulit di WebGPU
Sudah diimplementasikan
Penasaran, ini dipakai untuk apa?
Yang saya tahu, ini menghasilkan gambar di browser, bukan di server. Yang terpikir oleh saya hanya kita tidak perlu me-refresh halaman untuk mengubah atau membuat gambar baru.
Mungkin itu berarti situs web dengan desain visual yang berubah secara real-time jadi mungkin, dan kalau perubahan fungsionalnya juga berarti, itu bisa sangat keren. Hanya saja saya tidak yakin seberapa berguna Stable Diffusion untuk membuat komponen UI atau elemen visual sebuah situs
Prompt sensitif tidak akan bocor ke pihak jauh yang entah siapa
Adakah metrik yang membandingkan performa di WebGPU dengan performa eksekusi native?
Sepertinya itu karena komputasi GPU untuk VAE sebagian besar sudah diimplementasikan, sedangkan untuk UNET belum. Pada kasus yang terakhir, browser terus melempar data bolak-balik antara GPU dan CPU di setiap langkah
Jika cukup cepat, ini bisa dipakai untuk merender gambar secara lokal untuk penggunaan personal. Situs web bisa hanya mengirim prompt, lalu setiap pengguna merender gambar yang berbeda.
Kalau begitu, bagaimana urusan hak ciptanya? Apakah modelnya sendiri yang menjadi objek hak cipta, atau justru keseluruhan kerangkanya runtuh?
Dan saya rasa banyak web designer tidak akan menerima risiko bahwa model salah menafsirkan prompt, menghasilkan output yang terdistorsi dengan jumlah jari yang salah, atau secara tidak sengaja membuat konten seksual atau kekerasan dalam konteks yang tidak dimaksudkan.
Saat ini, banyak model gambar generatif biasanya memilih yang terbaik dari sepuluh gambar atau lebih, dan sisanya yang dibuang sebenarnya bisa cukup buruk.
Agar situs web bisa diilustrasikan secara dinamis dalam penggunaan sehari-hari, kualitas dan prediktabilitas model harus jauh lebih tinggi daripada sekarang.
Namun saya juga tidak ingin mengatakan bahwa kita tidak akan pernah sampai ke sana. Model-model terbaru sudah melakukan hal-hal yang beberapa tahun lalu dianggap mustahil untuk dibayangkan. https://xkcd.com/1425/ Jika dibandingkan dengan itu, bagi pembaca yang lebih muda mungkin bahkan sulit menjelaskan masalah latar belakang yang menjadi bahan lelucon tersebut!