- É necessário executar a demo do Stable Diffusion WebGPU na versão mais recente do Chrome com as flags "Experimental WebAssembly" e "Experimental WebAssembly JavaScript Promise Integration (JSPI)" ativadas.
- Cada etapa de inferência da demo leva cerca de 1 minuto, e executar adicionalmente o decodificador VAE para gerar a imagem leva cerca de 10 segundos.
- Se o DevTools estiver aberto, a demo fica cerca de 2 vezes mais lenta.
- O modelo UNET usado na demo roda apenas na CPU, e a aba do navegador pode travar, mas ele é 10% mais rápido do que executá-lo na GPU.
- O número mínimo de etapas para obter resultados aceitáveis na demo é 20. No entanto, para fins de demonstração, 3 etapas já são suficientes.
- Os arquivos do modelo são armazenados em cache, então não é preciso baixá-los toda vez que a demo for executada.
- Se ocorrer o erro "protobuf parsing failed", você pode ir em Application -> Storage no DevTools e limpar os dados do site.
- Se ocorrer o erro "sbox_fatal_memory_exceeded", isso significa que não há RAM suficiente para executar a demo. Você pode tentar recarregar a aba ou o navegador.
- A demo foi possível ao portar o StableDiffusionPipeline de Python para JS e ao aplicar patches em onnxruntime e emscripten+binaryen para permitir alocar e usar mais de 4 GB de memória.
- Atualmente, a demo é lenta porque não oferece suporte a multithreading e usa apenas um núcleo de CPU. A falta de suporte a memória de 64 bits por meio do construtor WebAssembly.Memory também é uma limitação.
- A demo roda na GPU, mas webgpu e onnxruntime ainda estão em estágio inicial, então muito trabalho ainda não foi implementado. Os dados são transferidos continuamente entre GPU e CPU via JS, o que deixa o processamento lento. Quando mais trabalho passar a ter kernels JS, a demo ficará mais rápida.
- É possível executar a demo localmente usando o código disponível no GitHub.
- Também é possível executar LLMs grandes com transformers.js usando o onnxruntime com patch, mas isso fica limitado a 8 GB de memória. Com esse pacote, é possível carregar até cerca de 4 GB de pesos.
- Como o autor já teve experiência anterior adicionando aceleração por GPU ao binding do node.js, ele planeja enviar um pull request para o repositório do onnxruntime.
1 comentários
Comentários do Hacker News