gemma-3n-E4BをPCで動かしてみる
ALGO ARTIS でソフトウェアエンジニア(主にフロントエンド)として働いている船岡 (@mochiya98)です。
2025 年 5 月 20 日、 Google I/O 2025
で Gemma 3n
がプレビュー版として発表されました。
MatFormer (Matryoshka の Mat。必要な時に必要な分だけ読み込む) を用いて実装されており、従来に比べて少ないメモリ消費で推論できることが特徴のモデルです。
しかしながら、公開されているモデルは特殊なフォーマットなため、スマホからの使用のみに限定され、PC からローカルで推論して試すことは難しい状況にありました。
でも、試してみたいよね?
はじめに
単純にモデルを使いたいだけなら Google AI Studio
や API 経由で使用するのが簡単です。
毎分 30 回、毎日 14,400 回呼び出せます。 実質無限。API でいいならローカルで動かす意味は無いです。
この記事は、速度やメモリ消費量を評価するためにローカルで動かしたい人向けの記事です。
参考: https://ai.google.dev/gemini-api/docs/rate-limits?hl=ja
また、よく混同されますが、 Gemma 3n
と Gemma 3
は別物です。Gemma 3n
は、より少ないリソースで実行できるよう最適化されています。
LiteRT-LM を使う
しばらくローカルで動かすのは難しいと思っていたのですが、根気強く探した結果、唯一それらしく動いたのが LiteRT-LM
でした。
これは Google 純正の Gemma を実行するための C++ ライブラリで、サンプルとして cli から実行して推論できる実装があり、ビルド済みバイナリが配布されています。
モデルには、LiteRT-LM 向けに公開されている gemma-3n-E4B
の量子化モデルを利用します。活性化層は float のままに、その他を int4 量子化したもので、ファイルサイズにして約 4GB です。
実際に以下のようなコマンドでこれを試してみると...
<path to binary directory>/litert_lm_main \
--backend=cpu \
--input_prompt=\"こんにちは!\"
--model_path=$MODEL_PATH
動いた。わーい。
しかしながら、ただのサンプルということもあり、1 つプロンプトを渡して実行するだけで、対話的に推論できません。毎回コマンドを実行する=毎回初期化してモデルを読み込むことになるので、これだけではイマイチです。無いなら作ってみよう。
WebSocket サーバー & Chat UI を実装する
ここまで来れば後は C++ライブラリということで、任意の実装すればいい...のですが。
C++をほとんど書いたことがないので、まぁ〜依存関係とかで苦労しそうだな〜とか思いながら、 LLM あればいけるやろ精神で休日と合間時間を使って実装を始めました。
(案の定依存関係で苦労しながら作業を進める...)
できた。結局 5 割ぐらいは依存関係の解決に時間を使いました。
Bazel を始めて使ったのですが、これは依存関係のつらみをある程度軽減してくれて、こういうのもあるんだなぁという気持ちになりました。
使ってみる
実装は以下のレポジトリにあります。
arm64-apple-macosx
向けのビルド済みバイナリを release/litert_lm_ws
に置いています。
(他の環境は、何も配慮していないので多分素直にはいかない)
とりあえずどんな感じか雰囲気だけ体験できるプレイバックデモを Github Pages に用意しています。
上のプレイバックデモは Apple M3 Pro で CPU 推論した時のものです。
CPU 推論なのにかなり速いですね。内容もそこそこ。そして消費メモリを見ると...
え、1GB 切り?凄すぎ。
コンテキストが小さく精度に課題はあるものの、約 4GB のモデルがこの消費メモリで動くのは、これまで考えられなかったことです。これまでは、スワップで激遅になったり、無茶苦茶な内容の文章しか出力されなかった記憶があります。
最後に
Gemma 3n
は、コンテキストや精度に課題はありつつも、その速度とメモリ消費量は未来を感じさせてくれるものでした。
今のローカル LLM はスペックの高い PC を必要としていますが、いずれ当たり前にエッジで LLM を動かす時代が来るかもしれませんね。
Discussion