LLMをブラウザの中だけで動かす 1bitモデルとWASMで、データを外に出さない実行を試す

社内のデータをAIに読ませたいけれど、外部のAPIへは送れない。この相談は頻繁にいただきます。選択肢のひとつが、モデルそのものを利用者の手元で動かす方法です。

実際にどこまでできるのかを確かめるため、1bitのLLMをブラウザのWebAssemblyだけで動かした実装を公開しています(bonsai-almide、デモ)。

1bitモデルという選び方

使っているのはBonsai 1.7Bというモデルです。28層で、重みの持ち方が変わっていて、128個の重みごとに共有の倍率をひとつ、あとは重みごとに符号1ビットだけを持ちます。1つの重みあたり実質1.125ビットで、ファイル全体で248MBに収まります。

多くの1bitモデルは、通常どおり訓練したものを後から圧縮しています。こちらは最初から1bitで訓練されたもので、この形でしか出ない軽さが出ています。

ブラウザの中で完結する

配布するプログラム本体(WASM)は32KBです。モデルの248MBは初回に一度だけ取得し、ブラウザのIndexedDBに保存します。二回目以降は読み込みだけで動きます。

推論はすべてブラウザのタブの中で行われるため、入力したテキストはどこへも送信されません。WASMのサンドボックスの外に出る経路そのものがない、という形の守り方になります。サーバーを置く必要もありません。

速度は、正直に遅いです

計測した数値を載せます。

実行環境 速度
ブラウザ(WASM、倍精度) 1.5秒/トークン
手元のMac(ネイティブ) 1.38秒/トークン
参考:WebGPUの実装 51トークン/秒

GPUを使う実装と比べると76倍ほど遅く、会話の応答を待つ用途にはまだ向きません。CPUだけで倍精度の計算をしている以上、この位置が自然なところです。

改善の道筋は決まっていて、WASMのSIMD命令を使う、計算を8bit整数に落とす、WebGPUを使う、という順に手を入れていきます。

何を確かめるための実装か

二つあります。ひとつは、利用者の環境から一切データを出さずに言語モデルを動かす構成が、実際に組めるかどうか。もうひとつは、自社開発の言語Almideが、行列演算のような重い処理まで書けるかどうかです。

どちらも「できる」ところまでは確認できました。実用の速度に届かせるのはこれからです。

検討されている方へ

手元で動かす構成が向いているのは、扱うデータを外に出せない場合と、通信が不安定な場所で使う場合です。逆に、応答の速さや回答の質が最優先なら、現時点では外部のモデルを使い、渡す情報を絞る設計にするほうが現実的です。

どちらが適しているかは、扱うデータと求める応答時間で決まります。判断の材料が必要でしたら、お問い合わせからご相談ください。

まずはお気軽にご相談ください。目的や課題を丁寧にヒアリングし、
ご予算や納期に合わせた最適なご提案をいたします。

まずはお気軽にご相談ください。
目的や課題を丁寧にヒアリングし、
ご予算や納期に合わせた最適な
ご提案をいたします。

無料相談はこちら