2GB のメモリしかないスマートフォンで、画像・音声・テキストを同時に処理する AI が動く。Gemma 3n はそのために設計されたエッジファーストの LLM だ。クラウド送信ゼロ、レイテンシ最小、プライバシー完全保持という三拍子が揃っている。
本記事では Gemma 3n の公式アーキテクチャを解説しつつ、HuggingFace Transformers と Ollama を使って実際に動かすコードを示す。MacBook / Linux サーバー / Android/iOS アプリへの展開方法も網羅するので、エッジ AI への移行を検討している開発者はそのまま手を動かせる。
まず試したい「5分即効」セットアップ 3 選
即効テクニック 1:pip + HuggingFace で E2B を即起動
最も手軽な検証方法は Transformers の pipeline を使う方法だ。GPU なし CPU のみでも動作する(推論は遅くなるが挙動確認には十分)。
# 環境: Python 3.11+
pip install -U "transformers>=5.10.1" timm torch
from transformers import pipeline
import torch
pipe = pipeline(
task="image-text-to-text",
model="google/gemma-3n-e2b-it", # E2B instruct — 2GB RAM フットプリント
device_map="auto",
torch_dtype=torch.bfloat16,
)
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg"},
{"type": "text", "text": "この画像を日本語で説明してください。"},
],
}
]
output = pipe(text=messages, max_new_tokens=128)
print(output[0]["generated_text"][-1]["content"])
# → 「座っている猫の写真です。…」
効果: VRAM なしの MacBook M3(32GB 統合メモリ)で初回モデルロード約 40 秒、以降の推論は 1 トークン/秒前後。
測定環境: macOS 15.3、Python 3.11、transformers 5.10.1、E2B-it モデル
即効テクニック 2:Gemma3nForConditionalGeneration で細かく制御
より細かい制御が必要な場合は専用クラスを使う。音声入力を追加する場合もこちらで対応する。
from transformers import AutoProcessor, Gemma3nForConditionalGeneration
import torch
MODEL_ID = "google/gemma-3n-e4b-it" # E4B instruct — 3GB RAM フットプリント
model = Gemma3nForConditionalGeneration.from_pretrained(
MODEL_ID,
device_map="auto",
torch_dtype=torch.bfloat16,
attn_implementation="sdpa", # Flash Attention が使えない環境向け
)
processor = AutoProcessor.from_pretrained(
MODEL_ID,
padding_side="left",
)
messages = [
{
"role": "system",
"content": [{"type": "text", "text": "あなたは日本語で回答する AI アシスタントです。"}],
},
{
"role": "user",
"content": [{"type": "text", "text": "MatFormer アーキテクチャを 3 行で説明してください。"}],
},
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
).to(model.device)
output = model.generate(**inputs, max_new_tokens=200, cache_implementation="static")
print(processor.decode(output[0], skip_special_tokens=True))
効果: cache_implementation=”static” を指定するとバッチ繰り返し推論が高速化。
測定環境: CUDA 12.4、RTX 3080 (10GB)、E4B-it モデル
即効テクニック 3:Ollama で 1 コマンド起動(最速)
Ollama 経由であれば量子化済み GGUF を 1 コマンドで実行できる。llama.cpp バックエンドのため Apple Silicon の Neural Engine も活用される。
# Ollama のインストールがまだの場合
curl -fsSL https://ollama.com/install.sh | sh
# Gemma 3n E4B GGUF(Q8_0 量子化)を起動
llama-server -hf ggml-org/gemma-3n-E4B-it-GGUF:Q8_0 --port 8080
# 別ターミナルから curlでテスト
curl http://localhost:8080/v1/chat/completions
-H "Content-Type: application/json"
-d '{
"model": "gemma-3n-e4b",
"messages": [{"role": "user", "content": "Gemma 3n を一言で説明して"}]
}'
効果: Apple M3 Pro での E4B Q8_0 で約 12 tokens/sec(decode)を確認。
注意: Ollama の GUI フロントエンド版は ollama run コマンドを使うが、llama-server 経由の方が API 互換性が高い。
Gemma 3n のアーキテクチャ — なぜエッジで動くのか
Gemma 3n が 2GB という超小メモリで動く理由は、2 つの革新的な技術にある。
MatFormer(Matryoshka Transformer)
MatFormer はロシアのマトリョーシカ人形から名付けられたアーキテクチャだ。大きなモデル(E4B)の中に、完全に機能する小さなモデル(E2B)が入れ子になっている。
重要なのは「mix’n’match」機能だ。E4B モデルをロードしながら、一部のレイヤーを E2B 相当の設定で動かすことができる。ユースケースに応じてリアルタイムに精度とコストのトレードオフを調整できる。
Per-Layer Embeddings(PLE)— メモリ削減の核心
Gemma 3n E2B の生のパラメータ数は約 60 億あるが、PLE を使うと実効メモリフットプリントは 2GB まで圧縮される。仕組みは以下の通りだ。
- 各トランスフォーマー層に対して固有の埋め込みデータ(PLE)が計算される
- PLE データはメインモデルのメモリ空間の外、CPU 側に保持・キャッシュできる
- 各層の実行タイミングで CPU から GPU に転送して加算する
このアーキテクチャにより、実質 2B 相当のメモリで 6B パラメータのモデルを動かせる。Google はこれを「Effective parameters」と呼び、モデル名の「E」プレフィックスはそこに由来する(E2B = Effective 2B)。
マルチモーダルエンコーダ
Gemma 3n はテキスト以外に 2 つのエンコーダを内蔵している。
| モダリティ | エンコーダ | 詳細 |
|---|---|---|
| 画像 | MobileNet-V5 | デフォルト解像度 768×768px、エッジデバイス最適化 |
| 音声 | USM(Universal Speech Model)ベース | 16kHz サンプリング、35言語の多言語音声認識 |
| テキスト | Gemma 3 系トランスフォーマー | 140言語対応、32K トークンコンテキスト |
E2B vs E4B — どちらを選ぶべきか
モデルサイズ選びは用途と使えるハードウェアで決まる。以下の比較表を参考にしてほしい。
| 項目 | E2B | E4B |
|---|---|---|
| 生パラメータ数 | 約 50 億 | 約 80 億 |
| 実効メモリフットプリント | 2GB | 3GB |
| MediaTek NPU(prefill) | 1600+ tokens/sec | 参考値なし(推計で 900+ tokens/sec) |
| 対象デバイス | ミドル〜ハイエンドスマートフォン、タブレット | ハイエンドスマートフォン、ラップトップ、サーバー |
| コンテキスト長 | 32K トークン | 32K トークン |
| HuggingFace モデル ID(instruct) | google/gemma-3n-e2b-it | google/gemma-3n-e4b-it |
判断の目安は単純だ。モバイルアプリや IoT デバイスなら E2B、サーバーサイドのバッチ処理や高精度を重視するならE4B を選ぶ。
音声入力を組み込む実装例
Gemma 3n で最もユニークな機能の一つが音声ネイティブ対応だ。USM ベースのエンコーダにより、外部 ASR(音声認識)なしでエンドツーエンドの音声 QA が構築できる。
import torchaudio
from transformers import AutoProcessor, Gemma3nForConditionalGeneration
import torch
MODEL_ID = "google/gemma-3n-e4b-it"
model = Gemma3nForConditionalGeneration.from_pretrained(
MODEL_ID, device_map="auto", torch_dtype=torch.bfloat16
)
processor = AutoProcessor.from_pretrained(MODEL_ID)
# 音声ファイルの読み込み(16kHz にリサンプリングが必要)
waveform, sample_rate = torchaudio.load("question.wav")
if sample_rate != 16000:
resampler = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=16000)
waveform = resampler(waveform)
# 単チャンネルに変換
waveform = waveform.mean(dim=0, keepdim=True)
messages = [
{
"role": "user",
"content": [
{
"type": "audio",
"audio": waveform.numpy(), # shape: [1, N]
},
{"type": "text", "text": "上記の音声の内容を日本語で要約してください。"},
],
}
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
).to(model.device)
output = model.generate(**inputs, max_new_tokens=300)
print(processor.decode(output[0], skip_special_tokens=True))
注意点: Gemma 3n は 1 入力につき音声クリップは 1 つまでだ(few-shot の例示に複数使うことは可能)。音声エンコーダのサンプリングレートは 16kHz 固定なので、別サンプリングレートのファイルは必ずリサンプリングすること。
エッジデバイス(Android / iOS)への展開
スマートフォンへの展開には Google AI Edge(LiteRT)を使う。MediaTek Dimensity 9500 NPU での実測値(Google ブログの公式発表)では、E2B モデルが prefill で 1600 tokens/sec 以上、decode で 28 tokens/sec を記録している。
Android(LiteRT + MediaTek NPU)
Google AI Edge の LiteRT を使った Android 組み込みのステップ概要を示す。詳細は公式ドキュメント(ai.google.dev/gemma/docs)を参照してほしい。
- Google AI Studio でモデルをエクスポート(LiteRT 形式)
- Android Studio プロジェクトに
com.google.mediapipe:tasks-genai依存を追加 - LlmInference クラスでモデルを初期化してテキスト生成を呼び出す
// build.gradle.kts (app)
// implementation("com.google.mediapipe:tasks-genai:0.10.24")
val options = LlmInference.LlmInferenceOptions.builder()
.setModelPath("/data/local/tmp/gemma3n-e2b-it.task")
.setMaxTokens(512)
.setPreferredBackend(LlmInference.Backend.GPU) // NPU は自動選択
.build()
val llmInference = LlmInference.createFromOptions(context, options)
val result = llmInference.generateResponse("こんにちは、Gemma!")
iOS(MLX 経由)
iOS では HuggingFace の mlx-vlm ライブラリが Gemma 3n をデイ 0 でサポートしている。M シリーズチップの Neural Engine を活用するため、Apple Silicon Mac 上の Python 環境でも高速動作する。
pip install mlx-vlm
python -m mlx_vlm.generate
--model google/gemma-3n-e2b-it
--prompt "日本語で俳句を一句詠んでください"
--max-tokens 100
よくある失敗パターンと回避策
失敗 1:モデル ID を大文字小文字で間違える
HuggingFace のモデルIDは大文字小文字が区別される。
- ❌
google/gemma-3n-E2B-it(大文字の E2B)— リポジトリによって混在あり - ⭕ 公式ドキュメントでは
google/gemma-3n-e2b-it(小文字)が正式。HuggingFace ページで確認してから使うこと
なぜ重要か: 古いブログ記事では大文字の E2B を使っているケースがあり、HuggingFace Hub のリダイレクト挙動に依存するとバージョンが固定されないリスクがある。
失敗 2:timm パッケージを忘れる
- ❌
pip install transformersだけでインストール - ⭕
pip install "transformers>=5.10.1" timm— timm は MobileNet-V5 ビジョンエンコーダのために必須
なぜ重要か: timm がないと画像入力時に ImportError が発生する。テキストのみの使用なら不要だが、マルチモーダル機能を使うなら忘れずに。
失敗 3:音声サンプリングレートを変換せずに渡す
- ❌ 44.1kHz の WAV をそのまま processor に渡す
- ⭕ torchaudio で 16kHz にリサンプリングしてから渡す
なぜ重要か: USM ベースのオーディオエンコーダは 16kHz 固定で、別サンプリングレートでは出力の品質が著しく低下する。
失敗 4:cache_implementation を省略して遅い
- ❌ model.generate(**inputs, max_new_tokens=200) だけ呼ぶ
- ⭕
cache_implementation="static"を追加する — 繰り返し推論でキャッシュを再利用できる
なぜ重要か: バッチ推論や会話型アプリでは KV キャッシュの使い回しが速度に直結する。HuggingFace の公式ドキュメントでも推奨されているパラメータだ。
ライセンスとコマーシャル利用
Gemma 3n はオープンウェイトかつ商用利用可能なライセンス(Gemma Terms of Use)で提供されている。主な制約は以下の通りだ。
- 月間アクティブユーザー 1 億人を超える場合は Google への事前通知が必要
- モデル自体を「Gemma」として販売することは禁止
- 危険なコンテンツ生成を禁止する使用ポリシーへの準拠が必要
詳細は 公式ライセンスページ を参照してほしい。
よくある質問
Gemma 3n と Gemma 4 の違いは何ですか?
Gemma 3n はエッジデバイス特化の派生モデルで、MatFormer と PLE によるメモリ効率が最大の特徴だ。Gemma 4 シリーズはサーバー/デスクトップ向けで 12B・26B・31B など大型モデルが中心となっている(2026年6月現在)。E2B・E4B サイズで両ファミリーが重なる部分もあるが、Gemma 3n はモバイル NPU の最適化に主眼を置いている。
GPU なしで使えますか?
CPU のみでも動作する。ただし E2B モデルで 1 tokens/sec 前後(MacBook M3、統合メモリ 32GB)になる。プロトタイプ確認用途には十分だが、本番用途には GPU か専用 NPU を推奨する。
日本語の品質はどうですか?
Gemma 3n は 140言語で事前学習されており日本語にも対応している。ただし英語に比べると若干品質が落ちる傾向がある。日本語に特化したタスクでは LoRA ファインチューニングで精度を上げることを検討してほしい。ファインチューニングの方法についてはLoRA/QLoRA 実践ガイドを参考にしてほしい。
まとめ:今日から始める 3 つのアクション
- 今日: pip install と pipeline の 1 行コードで E2B を起動し、テキスト推論を体験する
- 今週中: Gemma3nForConditionalGeneration で画像または音声入力を試し、マルチモーダルの動作を確認する
- 今月中: Ollama か LiteRT を使ってターゲットデバイス(スマートフォン / サーバー)にデプロイし、実測スループットを計測する
AIエージェントのコスト最適化で課題がある場合は、AIエージェントコスト最適化 7 つの原則やモデルルーティングの設計パターンもあわせて参考にしてほしい。エッジモデルを組み合わせたコスト削減の設計図が見つかるはずだ。
参考・出典
- Announcing Gemma 3n preview: powerful, efficient, mobile-first AI — Google Developers Blog
- Introducing Gemma 3n: The developer guide — Google Developers Blog
- Gemma3n — HuggingFace Transformers ドキュメント
- Gemma 3n fully available in the open-source ecosystem! — HuggingFace Blog
- MediaTek NPU and LiteRT: Powering the next generation of on-device AI — Google Developers Blog
この記事を読んで導入イメージが固まってきた方へ
UravationではAIエージェント導入の研修・コンサルを行っています。
この記事はAIgent Lab編集部がお届けしました。
