Google の Gemma 3 に、270M という極端に小さいモデル (gemma3:270m、298MB) が出た。ここまで軽いなら、サーバー無しでブラウザーの中だけで動くのでは?と思って遊んでみたもの。
リポジトリ
仕組み
Ollama は Go で書かれたサーバーなので、そのまま wasm にはできない。代わりに Hugging Face の Transformers.js を使う。中身は ONNX Runtime で、WebGPU があればそれで、無ければ WASM (CPU) で動く。
モデルは onnx-community/gemma-3-270m-it-ONNX。ブラウザーが直接ダウンロードして Cache API に置くので、2 回目からはすぐ動く。

作ったもの
UI は Svelte 5。バンドラーも dev サーバーも Bun だけで済ませた (bun-plugin-svelte)。モデルは Web Worker の中で動かして、UI を止めないようにしている。
返事は速い。ストリーミングは面倒だったので、結果が揃ってから一度に出す。
分かったこと
「300MB」のはずが、実際に落ちてくるのは 1GB ほどある。Wi-Fi で試すこと
メモリーを使い切るとタブごと固まる。リロードすれば直る
Svelte と一緒にバンドルすると、Transformers.js の初期化が落ちることがあった
自作の UI ライブラリー KoyUI を使って構築しようとしたら、プロダクションビルドで import.meta.env.MODE を参照して落ちていた。define で文字列に置き換えて回避
使用技術
Transformers.js (ONNX Runtime、WebGPU)
Svelte 5
Bun
Cloudflare Workers