- ต้องรันเดโม Stable Diffusion WebGPU บน Chrome เวอร์ชันล่าสุด โดยเปิดใช้แฟล็ก "Experimental WebAssembly" และ "Experimental WebAssembly JavaScript Promise Integration (JSPI)"
- ในแต่ละขั้นตอนการอนุมานของเดโมจะใช้เวลาประมาณ 1 นาที และใช้เวลาเพิ่มอีกราว 10 วินาทีในการรัน VAE decoder เพื่อสร้างภาพ
- หากเปิด DevTools ค้างไว้ เดโมจะทำงานช้าลงประมาณ 2 เท่า
- โมเดล UNET ที่ใช้ในเดโมจะรันบน CPU เท่านั้น และแท็บเบราว์เซอร์อาจค้างได้ แต่เร็วกว่าการรันบน GPU อยู่ 10%
- จำนวนขั้นตอนขั้นต่ำเพื่อให้ได้ผลลัพธ์ที่ยอมรับได้ในเดโมคือ 20 ขั้นตอน อย่างไรก็ตาม สำหรับจุดประสงค์ในการสาธิต 3 ขั้นตอนก็เพียงพอ
- ไฟล์โมเดลจะถูกแคชไว้ จึงไม่จำเป็นต้องดาวน์โหลดใหม่ทุกครั้งที่รันเดโม
- หากเกิดข้อผิดพลาด "protobuf parsing failed" สามารถไปที่ Application -> Storage ใน DevTools แล้วล้างข้อมูลไซต์ได้
- หากเกิดข้อผิดพลาด "sbox_fatal_memory_exceeded" แปลว่ามี RAM ไม่เพียงพอจนไม่สามารถรันเดโมได้ อาจลองรีโหลดแท็บหรือเบราว์เซอร์
- เดโมนี้เกิดขึ้นได้จากการพอร์ต StableDiffusionPipeline จาก Python ไปเป็น JS และแพตช์ onnxruntime กับ emscripten+binaryen เพื่อรองรับการจัดสรรและใช้งานหน่วยความจำเกิน 4GB
- ขณะนี้เดโมยังไม่รองรับมัลติเธรดและใช้เพียง CPU core เดียว จึงทำงานช้า การขาดการรองรับหน่วยความจำ 64 บิตผ่านตัวสร้าง WebAssembly.Memory ก็เป็นข้อจำกัดเช่นกัน
- เดโมรันบน GPU แต่ webgpu และ onnxruntime ยังอยู่ในระยะเริ่มต้น จึงยังมีงานอีกมากที่ยังไม่ได้ถูกนำไปใช้ ข้อมูลถูกส่งไปมาระหว่าง GPU และ CPU ผ่าน JS อย่างต่อเนื่อง ทำให้การประมวลผลช้าลง เมื่อมีงานเพิ่มเติมที่มี JS kernel เดโมก็จะเร็วขึ้น
- สามารถรันเดโมแบบโลคัลได้ด้วยโค้ดที่มีให้บน GitHub
- สามารถใช้ onnxruntime ที่ถูกแพตช์แล้วเพื่อรัน LLMs ขนาดใหญ่ด้วย transformers.js ได้ แต่จะถูกจำกัดไว้ที่หน่วยความจำ 8GB และสามารถโหลดน้ำหนักโมเดลได้สูงสุดประมาณ 4GB ด้วยแพ็กเกจนั้น
- ผู้เขียนเคยมีประสบการณ์เพิ่ม GPU acceleration ให้กับ node.js bindings มาก่อน จึงมีแผนจะส่ง pull request ไปยังรีโพซิทอรี onnxruntime
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News