社内のデータを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が、行列演算のような重い処理まで書けるかどうかです。
どちらも「できる」ところまでは確認できました。実用の速度に届かせるのはこれからです。
検討されている方へ
手元で動かす構成が向いているのは、扱うデータを外に出せない場合と、通信が不安定な場所で使う場合です。逆に、応答の速さや回答の質が最優先なら、現時点では外部のモデルを使い、渡す情報を絞る設計にするほうが現実的です。
どちらが適しているかは、扱うデータと求める応答時間で決まります。判断の材料が必要でしたら、お問い合わせからご相談ください。