Voltar ao blog
tech 2026-02-05

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.