Stable Diffusion WebGPU demosu
(islamov.ai)- Tarayıcıda doğrudan çalışan Stable Diffusion görüntü üretim demosu; ayrı bir sunucu olmadan WebGPU ve WebAssembly tabanlı çalışıyor
- Kullanmak için en güncel Chrome sürümünde "Experimental WebAssembly" ve "Experimental WebAssembly JavaScript Promise Integration (JSPI)" bayraklarının etkinleştirilmesi gerekiyor
- Prompt, Negative Prompt ve inference step sayısını alarak görüntü üretiyor; model dosyaları önbelleğe alınır, bu yüzden her seferinde yeniden indirilmeleri gerekmez
- 4GB'ı aşan bellek ayırma için onnxruntime, emscripten, binaryen yamalandı ve Python'daki StableDiffusionPipeline JS'ye taşındı
- Çoklu iş parçacığı desteği olmaması ve WebGPU işlemlerinin tam uygulanmamış olması nedeniyle şu anda yavaş, ancak ileride JS kernel implementasyonu ve memory64 desteği ile iyileştirilebileceği belirtiliyor
Çalıştırma gereksinimleri
- En güncel Chrome tarayıcısında Experimental WebAssembly ve Experimental WebAssembly JavaScript Promise Integration (JSPI) bayraklarının etkinleştirilmesi gerekir
- Model files önbelleğe alınır; site yeniden ziyaret edildiğinde tekrar indirilmeleri gerekmez
Girdi ve çalışma şekli
- Girdi olarak Prompt, Negative Prompt ve inference step sayısı verilir
- PNDM Scheduler kullanıldığı için gerçek step, girilen i değerinden i+1 olarak işlenir
- Her step yaklaşık 1 dakika sürer, görüntü üretimi için VAE decoder çalıştırılması da ek olarak yaklaşık 10 saniye alır
- DevTools açıkken genel hız yaklaşık 2 kat düşer
- UNET yalnızca CPU'da çalışır; GPU'dan %10 daha hızlıdır ve GPU'da doğru sonuç üretmediği için tarayıcı sekmesini kilitler
- Kabul edilebilir sonuç almak için gereken minimum step sayısı 20'dir, ancak demo amacıyla 3 step de kullanılabilir
SSS
-
protobuf parsing failed hatası
- DevTools'ta Application → Storage bölümüne gidip "Clear site data" çalıştırın
-
sbox_fatal_memory_exceeded hatası
- Bu, SD çalıştırmak için gerekli RAM'in yetersiz olduğu anlamına gelir; sekmeyi veya tarayıcıyı yeniden yüklemeyi deneyin
-
Uygulama yöntemi
- Python'daki StableDiffusionPipeline JS'ye taşındı
- onnxruntime ile emscripten+binaryen (WebAssembly derleyici araç zinciri) yamalanarak 4GB üstü bellek ayırma ve kullanım desteği sağlandı
- İlgili pull request'ler sürümlere yansıdığında herkes tarayıcıda 4GB'tan fazla bellek kullanan kodu derleyip çalıştırabilecek
-
Yavaşlığın nedeni
- Henüz çoklu iş parçacığı desteği yok, bu yüzden yalnızca tek bir CPU çekirdeği kullanılıyor
- SharedArrayBuffer üzerinden 64 bit bellek, WebAssembly.Memory constructor aracılığıyla oluşturulamıyor
- "memory64" bayrağı için bir spesifikasyon değişikliği önerildi; kabul edildikten sonra V8 motoru yamalanarak destek eklenecek
-
GPU'da çalıştırma durumu
- GPU'da çalışıyor, ancak onnxruntime'ın WebGPU desteği henüz erken aşamada olduğu için birçok işlem uygulanmamış durumda
- Veriler JS üzerinden sürekli olarak CPU ile taşınıyor
- Çoğu işlem için JS kernel'leri implemente edildiğinde hız büyük ölçüde artabilir
-
Yerelde çalıştırma mümkün mü
- Evet; ilgili sayfanın kodu stable-diffusion-webgpu-minimal deposunda sağlanıyor
-
transformers.js ile büyük LLM çalıştırmak mümkün mü
- Yamalanmış onnxruntime paketi (@aislamov/onnxruntime-web64) kullanılabilir, ancak her durumda çalışacağı garanti edilmez
- Bu build 8GB bellekle sınırlıdır, bu nedenle yaklaşık 4GB ağırlığa kadar yükleme yapılabilir
-
onnxruntime deposuna pull request planı
- Planlanıyor; daha önce node.js binding'lerine GPU acceleration eklenmesinin ardından bu ikinci çalışma olacak
1 yorum
Hacker News yorumları
MLC ekibi bunu daha mart ayında çalıştırmıştı: https://github.com/mlc-ai/web-stable-diffusion
Daha etkileyici olan, sonrasında birkaç büyük dil modeli desteği de eklemiş olmaları: https://webllm.mlc.ai/
“3,5 GB yüklüyor ve 8 GB RAM kullanıyor”
Tarayıcının bu noktaya gelmesi ilginç. Web, işletim sistemini yuttu
Tarayıcı olmadan doğrudan indirip çalıştırsanız da indirme boyutu ve RAM kullanımı neredeyse aynı olurdu
Bu deneyimi tarayıcıyla sunmanın işleri basitleştiren tarafları var; Stable Diffusion çalıştırmak için bundan daha kolay bir yol da yok gibi görünüyor, bu yüzden böyle projelerin desteklenmeye devam etmesini isterim
Experimental WebAssemblyveExperimental WebAssembly JavaScript Promise Integration (JSPI)bayrakları açık olan en yeni Chrome gerekiyormuş; o halde Firefox’a gelmesini bekleyeceğimchrome:flagsayarlarını açtım ama yine de çalışmadı. M1 Mac’lerime Chrome indirmiş değilim; şimdi başlamaya da niyetim yokBurada da zaten uygulanmış: https://websd.mlc.ai/#text-to-image-generation-demo
MLC, Apache TVM ile WebGPU kod üretimi ve otomatik ayarlama yapıyor; performansı da oldukça iyi
MLC-AI’nin Stable Diffusion’ını web siteme özel arka plan üreticisi olarak entegre ettim. Model verileri Hugging Face’ten geliyor
https://dustinbrett.com/
CPU’ya bağlı işler için ana iş parçacığının donmaması adına service worker kullanmayı düşünmek mantıklı olabilir
Sırada WebGPU chatbot mu var? Tarayıcıda kendi GPU’m ile ChatGPT tarzı sohbet mi?
Büyük dil modelleri, model iyileştikçe daha çok RAM/VRAM tükettiği için WebGPU’da özellikle zorlu
Zaten uygulanmış durumda
Merakımdan soruyorum, bu ne için kullanılır?
Bildiğim kadarıyla görüntüyü sunucuda değil tarayıcıda üretiyor. Aklıma gelen tek şey, bir görüntüyü değiştirmek ya da yeniden üretmek için sayfayı yenilemeye gerek kalmaması.
Bu, görsel tasarımı gerçek zamanlı değişen web sitelerini mümkün kılabilir demek olabilir; işlevsel olarak da anlamlı biçimde değişebiliyorsa epey havalı olurdu. Yine de Stable Diffusion’ın bir sitenin UI bileşenlerini veya görsel öğelerini üretmede ne kadar yararlı olacağından emin değilim
Hassas prompt’lar uzaktaki birilerine sızmaz
WebGPU’daki performans ile native çalıştırma performansını karşılaştıran ölçütler var mı?
VAE için GPU işlemlerinin çoğu zaten uygulanmış, ama UNET için öyle değil gibi. İkincisinde tarayıcı her adımda verileri sürekli GPU ile CPU arasında taşıyor
Yeterince hızlıysa kişisel kullanım için görüntüleri yerelde render etmekte kullanılabilir. Web sitesi yalnızca prompt’u iletir ve her kullanıcı için farklı görüntüler render edebilir.
O noktada telif hakkı ne olur? Modelin kendisi mi telif hakkına tabidir, yoksa sistem mi çöker?
Ayrıca birçok web tasarımcısının, modelin prompt’u yanlış yorumlaması, yanlış sayıda parmak içeren bozuk sonuçlar üretmesi ya da istenmeyen bağlamlarda cinsel/şiddet içerikli şeyleri kazara oluşturması riskini kabul edeceğini sanmıyorum.
Günümüzde birçok üretici görüntü modelinde genellikle ondan fazla sonuç arasından en iyisi seçilir; atılanların geri kalanı gerçekten oldukça kötü olabilir.
Web sitelerini rutin olarak dinamik biçimde illüstre etmek için modelin kalitesi ve öngörülebilirliği bugünkünden çok daha yüksek olmalı.
Yine de bunun asla o noktaya gelemeyeceğini söylemek istemem. Son modeller, birkaç yıl önce hayal bile edilemez sanılan şeyleri şimdiden yapıyor. https://xkcd.com/1425/ ile karşılaştırınca, genç okurlara o şakanın arka planındaki problemi açıklamak bile zor olabilir!