1 pontos por GN⁺ 2023-07-19 | 1 comentários | Compartilhar no WhatsApp
  • É 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

 
GN⁺ 2023-07-19
Comentários do Hacker News
  • A equipe da MLC já implementou suporte para Stable Diffusion e modelos de linguagem de grande porte.
  • Os navegadores evoluíram a ponto de conseguir lidar com tarefas complexas como o Stable Diffusion.
  • Para usar Stable Diffusion, é necessária a versão mais recente do Chrome com determinadas flags ativadas.
  • O Stable Diffusion também foi integrado a outros sites, como um gerador de fundos personalizados.
  • Considere usar service workers para evitar que a thread principal congele durante processos limitados pela CPU.
  • Entre os casos de uso do Stable Diffusion está a geração de imagens em tempo real sem recarregar a página.
  • Há potencial para aplicações futuras, como chatbots com WebGPU ou mineração de Bitcoin durante o tempo ocioso da GPU.
  • Alguns usuários estão esperando até que o WebGPU fique disponível no Firefox.
  • A possibilidade de uma internet sem anúncios foi levantada.