- Debes ejecutar la demo de Stable Diffusion WebGPU en la versión más reciente de Chrome con las flags "Experimental WebAssembly" y "Experimental WebAssembly JavaScript Promise Integration (JSPI)" habilitadas.
- Cada paso de inferencia de la demo toma alrededor de 1 minuto, y ejecutar el decodificador VAE para generar una imagen requiere unos 10 segundos adicionales.
- Si dejas DevTools abierto, la demo se vuelve aproximadamente 2 veces más lenta.
- El modelo UNET usado en la demo se ejecuta solo en la CPU, y la pestaña del navegador puede congelarse, pero es un 10% más rápido que ejecutarlo en la GPU.
- La cantidad mínima de pasos para obtener resultados aceptables en la demo es 20. Sin embargo, para fines de demostración, 3 pasos son suficientes.
- Los archivos del modelo se almacenan en caché, así que no es necesario descargarlos cada vez que ejecutes la demo.
- Si aparece el error "protobuf parsing failed", puedes ir a Application -> Storage en DevTools y borrar los datos del sitio.
- Si aparece el error "sbox_fatal_memory_exceeded", significa que no hay suficiente RAM para ejecutar la demo. Puedes intentar recargar la pestaña o el navegador.
- La demo fue posible al portar StableDiffusionPipeline de Python a JS y al parchear onnxruntime y emscripten+binaryen para permitir asignar y usar más de 4 GB de memoria.
- Actualmente la demo no soporta multithreading y usa solo un núcleo de CPU, por eso es lenta. La falta de soporte para memoria de 64 bits mediante el constructor WebAssembly.Memory también es una limitación.
- La demo se ejecuta en la GPU, pero webgpu y onnxruntime están en una etapa temprana, así que todavía faltan muchas implementaciones. Los datos se transfieren continuamente entre la GPU y la CPU a través de JS, lo que ralentiza el procesamiento. Cuando más tareas tengan kernels de JS, la demo será más rápida.
- Puedes ejecutar la demo localmente usando el código disponible en GitHub.
- Con el onnxruntime parcheado se pueden ejecutar LLMs grandes con transformers.js, pero están limitados a 8 GB de memoria. Con ese paquete se pueden cargar pesos de hasta aproximadamente 4 GB.
- El autor ya había agregado antes aceleración por GPU a los bindings de node.js, así que planea enviar un pull request al repositorio de onnxruntime.
1 comentarios
Comentarios de Hacker News