Rodando modelos de IA no navegador com ONNX Runtime
Rodando modelos de IA no navegador com ONNX Runtime
Por anos, “IA no navegador” parecia uma demo de brinquedo: um classificador minúsculo em MNIST, talvez um style transfer que derretia seu laptop. Isso mudou quando o ONNX Runtime Web amadureceu e os caminhos WebGPU/WebGL ficaram confiáveis o suficiente para cargas reais de imagem. No Ai2Done, usamos modelos baseados em ONNX para alimentar funcionalidades como aprimoramento e segmentação no dispositivo, porque enviar fotos do usuário para uma GPU remota contradiz tudo o que defendemos.
Por que ONNX, especificamente?
O formato ONNX desacopla a criação do modelo da implantação. Pesquisadores treinam em PyTorch ou em outra ferramenta, exportam para ONNX, e nós consumimos um único artefato que o ONNX Runtime consegue otimizar para diferentes execution providers. No navegador, isso significa que conseguimos mirar no WebGPU quando disponível e fazer fallback gracioso quando não estiver.
Conceitualmente, o loop de inferência se parece com isto:
// Pseudocódigo: carregar a sessão, alimentar tensores, ler tensores de saída
const session = await ort.InferenceSession.create("/models/segmentation.onnx");
const feeds = { input: inputTensor };
const results = await session.run(feeds);
const mask = results.output; // usado por canvas / WASM glue
As camadas Go e WASM do nosso stack permanecem finas: movem bytes, expõem progresso e mantêm as regras de negócio em internal/apps/ai2done/tool — não dentro do runtime do modelo.
Memória, tensores e honestidade
Redes neurais são famintas. Uma suposição errada — carregar um modelo de “tudo em resolução máxima” num laptop de cinco anos — causa crashes de aba e usuários irritados. Mitigamos isso com:
- Quantização do modelo quando a qualidade permite
- Carregamento progressivo para a UI continuar responsiva
- Tetos claros no tamanho da entrada, com mensagens visíveis ao usuário
Essa é a mesma filosofia que aplicamos ao WASM de PDF e vídeo: respeitar os limites do navegador em vez de fingir que a web é um datacenter.
Privacidade como garantia técnica
Quando a inferência roda localmente, a história da privacidade se escreve sozinha. Sua imagem nunca chega aos nossos discos para aprimoramento — não porque prometemos suavemente em um banner, mas porque não existe caminho de upload na arquitetura para essa operação. Essa distinção importa para ambientes regulados e para qualquer um que simplesmente não queira fotos de férias na GPU de um estranho.
Onde Go entra
Ainda amamos Go para orquestração, servir estático e embedar bundles WASM. O modelo mental é limpo: Go entrega o app, JS faz a ponte com o ONNX, WASM cuida de transformações determinísticas quando código compartilhado com o servidor tem valor. Limites DDD mantêm cada camada honesta — lógica de domínio em tool/, serviços coordenando requisições, sem templates “espertos”.
Depurando drift do mundo real
Modelos se comportam diferente entre dispositivos: perfis de cor, disponibilidade de WebGPU e peculiaridades de ponto flutuante podem mudar as saídas sutilmente. Investimos em testes de golden file em entradas representativas e em feedback do usuário sem telemetria (literalmente: “relatar problema” sem exfiltrar pixels) para pegar casos de borda.
Olhando à frente
ML no dispositivo continuará melhorando à medida que os navegadores exponham mais performance e os modelos encolham. O Ai2Done continuará surfando essa onda sem transformar sua mídia em dados de treinamento de outra pessoa. Se você é engenheiro avaliando ONNX no navegador, nosso conselho é simples: trate memória e fallbacks como requisitos de primeira classe, e seus usuários sentirão a diferença.