🤑

「Gemma 3n」×「 Jetson Orin Nano 」試したが、ダメだった話

に公開

お疲れ様です。オートロの福田です。今回も、オートロのインターン生が試したことを発表していきたいと思います。Gemma 3n を公式が用意する前に自前で実行しようとしてダメだった話になります。まだ Android しか対応していなかったようで、試してみてって言って調べもせずに依頼して反省です。


こんにちは。オートロ株式会社でインターンをしております釜土です。
今回は、Nvidiaが販売している「Jetson Orin Nano」という生成AIスーパーコンピューター開発キットを用いて、Googleが2025年5月20日に発表したAIモデルである「Gemma 3n」をローカル環境で走らせることに挑戦した体験を、ひとつの記事としてまとめました。


この記事では、Jetson Orin Nanoの使い方、AIモデルの導入方法、そして開発中に得られた気づき・工夫したポイントなどを中心にご紹介します。

小型スーパーコンピューターで最新AIモデルは作動するのか

Gemma 3n とは

Gemma 3n は、Google DeepMind が Gemma 3 モデルファミリーの一員として公開した「モバイルファースト」な軽量大規模言語モデル(LLM)です。特にスマホやエッジデバイスなどリソース制約のある環境でのローカル推論を念頭に設計されており、以下の特徴を持ちます:

  • 低フットプリント
    約4 B(40億)アクティブメモリサイズで、必要に応じて品質とレイテンシーをトレードオフできるサブモデル分割をサポート。
  • オフライン・プライバシー重視
    ネットワーク不要で動作し、ユーザーデータをデバイス内に保持する設計。
  • マルチモーダル対応
    テキストと画像の入力を統合して解析・応答。将来的には動画や音声もサポート予定。
  • 高効率推論
    モバイル/エッジ向けに最適化されたアーキテクチャで、仕組みを小型デバイスでも高速に回せるようコ・デザイン。

現在は早期プレビュー版として提供されており、オンデバイス AI 機能を搭載した次世代アプリケーション開発を後押しします。

以下の表で、従来の Gemma(Gemma 3)と Gemma 3n、および代表的な他の大規模言語モデル(例:GPT-3.5 や LLaMA 2)との主な違いをまとめました。

項目 従来の Gemma (Gemma 3) Gemma 3n 他の AI モデル(例:GPT-3.5 / LLaMA 2)
パラメータ数 約 8 B 約 4 B(サブモデルでさらに分割可能) GPT-3.5: ~175 B
LLaMA 2: 7 B/13 B/70 B
実行環境 主にクラウド(サーバー) スマホ・エッジデバイス(Jetson Orin Nano 等)対応 主にクラウド
(一部 7 B モデルは高スペック端末でオンデバイス可)
ネットワーク要件 常時オンライン オフライン単独動作可 常時オンライン(モデルサイズが大きく、端末単独動作は難しい)
入力モダリティ テキスト テキスト+画像
(将来音声・動画も計画)
テキストのみ(別途カスタム実装でマルチモーダル化可能)
推論速度 中程度(クラウド GPU/TPU 前提) 高速(端末上で低レイテンシ動作を最適化) GPT-3.5: 標準的(クラウド依存)
LLaMA 2: 7 B は中~高速、13 B 以上は低速
メモリ/ストレージ 数十 GB(クラウド) 数百 MB~数 GB(デバイスの制約内に収まる) GPT-3.5: 数百 GB(クラウド)
LLaMA 2: 7 B は ~14 GB、13 B は ~26 GB
プライバシー データ送受信が必要 完全デバイス内完結、ユーザーデータを外部に送らない クラウドサーバーで処理→データ外部流出リスクあり
ライセンス/公開状況 Google 提供・限定公開 早期プレビュー公開 GPT-3.5: 商用 API(閉鎖)
LLaMA 2: オープンソース(GPL 相当)
カスタマイズ性 限定的(Google 提供の API 経由) サブモデル分割やファインチューニングが可能 GPT-3.5: プロンプト操作中心
LLaMA 2: 自前でファインチューニング可能
主なユースケース クラウド連携アプリ、チャットボット オンデバイス AI、リアルタイム画像認識+会話 高度な対話サービス、大規模データ分析、研究用途

Jetson Orin Nanoとは

Jetson Orin Nano は、NVIDIA の組み込み向け AI プラットフォーム「Jetson」シリーズの最新モデルのひとつで、エッジデバイス上での大規模なディープラーニング推論を想定して設計されています。主な特徴は以下のとおりです。

  • SoC(System on Chip) に NVIDIA Ampere アーキテクチャを採用し、CUDA コア+Tensor コアを統合
  • AI 推論性能:最大 40 TOPS(INT8)
  • CPU:6 コア ARM Cortex-A78AE
  • メモリ:8 GB LPDDR5
  • 消費電力:10 ~ 15 W の範囲で動的制御
  • 開発キット形式:コンパクトなキャリアボード同梱。PCIe/M.2 スロットやカメラ/ディスプレイインターフェイスも装備

これによって、ファクトリーオートメーションやロボティクス、スマートシティ、オンデバイス生成 AI(例:小型ロボットのリアルタイム音声/映像生成)など、高い推論性能を要するエッジ用途に最適です。

他の「小型生成AIスーパーコンピューター」との比較

項目 Jetson Orin Nano Jetson Xavier NX Google Coral Dev Board Intel Neural Compute Stick 2
SoC NVIDIA Orin Nano (Ampere) NVIDIA Xavier NX (Volta) NXP i.MX 8M + Edge TPU Intel Myriad X VPU
CPU 6× ARM Cortex-A78AE 6× ARM Carmel 4× ARM Cortex-A53 —(ホスト CPU 必須)
AI エンジン 512 CUDA コア+32 Tensor コア 384 CUDA コア+48 Tensor コア Edge TPU(4 TOPS) 1 TOPS
メモリ 8 GB LPDDR5 8 GB LPDDR4 1 GB LPDDR4 ホスト側メモリを利用
AI 推論性能 約 40 TOPS (INT8) 約 21 TOPS (INT8) 約 4 TOPS (INT8) 約 1 TOPS (FP16)
消費電力 10 ~ 15 W(動的制御可) 10 ~ 15 W 約 2 W 約 1 W
価格(開発キット) 約 USD 199 約 USD 399 約 USD 149 約 USD 70
フォームファクタ キャリアボード一体型(M.2/MIPI/PCIe 搭載) キャリアボード一体型(M.2/MIPI/PCIe 搭載) シングルボード USB スティック
用途例 エッジ生成 AI、ロボティクス、スマートシティ等 産業用エッジ AI、ロボティクス、医療機器 軽量エッジ推論、IoT センサーノード 既存 PC/Raspberry Pi への AI アクセラレータ

Jetson Orin Nano の起動方法

**ここでまず最初の関門がありました。**どんなトラブルがあったかは当項目の後半で説明します。

まず、箱から本体と充電器を取り出します。

キーボード、マウス、モニターと接続するためのケーブル、マイクロSDカードは自分で用意する必要があります。

SDカードにはJetpackイメージをフラッシュする必要があります。Jetpackとは、NVIDIA Jetson デバイス(Orin 系を含む)向けに「OS+AI コンピュートスタック」をまとめて“フラッシュ”できるシステムイメージです。JetPack 6.0 イメージをフラッシュするだけで、最新の Linux カーネルや Ubuntu、GPU ドライバ、深層学習/マルチメディアライブラリ、そしてデバッグ・プロファイリングツールまで、Jetson デバイス開発に必要なソフトウェアスタックが丸ごと導入できるのが最大の特徴です。

Jetpack6.0は公式サイトからインストールでき、「JETSON ORIN NANO DEVELOPER KIT」というボタンをクリックするとインストールボタンが出てきます。

「jp60dp-orin-nano-sd-card-image.zip」という14.11GBのファイルをインストールしたあと、SDカードをJetpackをインストールしたパソコンに繋ぎ、balenaEtcherというアプリを使用してフラッシュするのが一番楽な方法だと思います。ファイルがかなり大きいので、数十分から1時間ほど時間がかかります。

フラッシュが終わったらSDカードをJetson Orin Nanoに挿入して、Jetson本体とキーボード、マウスを接続して、モニターとケーブルを接続して電源を入れればJetpack6.0を使用して起動画面が表示される、と思っていました…

何回電源を差し抜きして、ケーブルの接続を確認しましたが、一向に起動画面が表示されませんでした。SDカードの破損も確認しましたが SDカードには異常がなく、調べてみると

  • JetPack 6.0 単独フラッシュでは起動しない
    → 古いブートローダー/ファームウェア(u-boot)が 6.0 を認識できないため。
  • JetPack 5.1.3 で一度起動して「update & upgrade」
    → ブートローダーやファームウェア、カーネルなど基盤部分を最新化。
  • 再度 JetPack 6.0 をフラッシュすると正常起動
    → 6.0 の要件を満たした環境下であれば、Ubuntu 22.04 ベースのシステムが立ち上がる。

ということだと判明。半信半疑でJetpack 5.1.3 をインストールし、SDカードの中身を全て消してJetpack 5.1.3をフラッシュして恐る恐る Jetson Orin Nano にSDカードを差してみると、起動開始!

その後、設定(言語、キーボード、地域など)が終わると、やっとJetson Orin Nanoを使い始めることができます。

Updating JetPack 6.1 to JetPack 6.2 on Jetson Orin Nano (SSD Installation)

でもJetpack5.1.3で起動した環境にあまり用はないので、鑑賞に浸るのも束の間、Terminalを開いて

sudo apt update
sudo apt upgrade -y
sudo reboot

この3つのコマンドを実行し終わったら電源を落とし、SDカードを抜いてパソコンに差し、再度SDカードの初期化とJetpack6.0のフラッシュを行います。すると今度はJetpack6.0を利用してJetson Orin Nano を使用することができます。

開発開始

そして、ようやく本来の目標である「Jetson Orin Nano × Gemma 3n の実験環境」が整いました。

ここからは、実際に MediaPipe Edge をインストールし、さらに Google の生成AIモデル「Gemma 3n」をローカルで動かすチャレンジに移ります。

模索①:Pythonローカル実行環境でトライ 〜Transformers + PyTorch〜

Transformers と PyTorchを使う手法は、モデルをあらかじめダウンロードし、手元のGPU/CPU上で推論させる方法です。依存ライブラリはtransformersとtorch(場合によってはsentencepieceも必要です。)で、CUDA/cuDNN/TensorRT の整備が必要で、大きいモデルはダウンロードに時間がかかるしメモリの消費も Jetson Orin Nano の8GB というメモリを考えると懸念点ですが、ネットワーク接続が不要でオフライン動作ができるというメリットがあります。

似た手法で Hugging Face側のサーバー上にあるモデルを使用して、REST/gRPC API でテキストを送り、生成結果だけを取得する方法もあるのですが、オフライン環境での利用はできず、今回はローカル環境でオフラインでも作動できることが目標なので採用しませんでした。

Transformers + PyTorchの手法では、

python3 -m venv venv-jp6
source venv-jp6/bin/activate

pip install --upgrade pip

pip install \
  transformers \
  accelerate \
  numpy \
  huggingface_hub
 
wget https://developer.download.nvidia.com/compute/redist/jp/v60/pytorch/torch-2.4.0a0+07cecf4168.nv24.05.14710581-cp310-cp310-linux_aarch64.whl
pip install torch-2.4.0a0+07cecf4168.nv24.05.14710581-cp310-cp310-linux_aarch64.whl

まずは上記の通りに、仮想環境を構築して必要なライブラリを揃えました。

python3 -c "import torch; print(torch.cuda.is_available())"

次に上記のコマンドでJetson上の GPU(CUDA)が正しく認識され、Gemma などの推論が GPU 上で可能かどうかを確かめました。

うまくいけば “True“ と表示されるはずです。

次に、GemmaシリーズはHuggingfaceを使用して走らせるつもりでしたが、Huggingface上でアクセストークンを作り、Gemmaシリーズを使用する許可を取る必要があるので、

pip install huggingface_hub[cli]
huggingface-cli login

とTerminalに入力し、入手したアクセストークンをペーストすることで使用許可をもらいます。

今回使用したモデルは、Google DeepMindが開発した Gemma 3n-E4B-it-litert-preview です。

モデルの基本情報

  • モデル名: Gemma 3n-E4B-it-litert-preview
  • 開発元: Google DeepMind
  • 対応モダリティ: テキスト、画像(音声・動画は今後対応予定)
  • 量子化: dynamic_int4(4bit量子化済み)
  • トークン数制約: 入力・出力ともに最大32Kトークンまで対応
  • アーキテクチャ: Matformer(ネスト化対応型)、選択的パラメータ活性化技術(実質2B〜4B相当の軽量化)

このモデルは、Google の Gemini系モデルの技術を活かし、スマートフォンなどのリソース制約デバイスでも動作できることを目指したプレビュー版です。このモデルを使用し、Gemmaを走らせる Python スクリプトを作成して実行しました。

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

model_id = "google/gemma-3n-E4B-it-litert-preview"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype=torch.float16)

inputs = tokenizer("こんにちは、自己紹介してください。", return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=50)

print(tokenizer.decode(outputs[0], skip_special_tokens=True))

SDカードの容量問題

しかし実行に至る前にに問題に直面します。32GBのSDカードを使っていたのですが、Jetpackのフラッシュと上記のライブラリのインストールだけで容量がいっぱいになってしまったのです。Transformers + PyTorch の手法はモデル自体(重みファイル)をあらかじめダウンロードし、手元の GPU/CPU 上で推論するので、Gemma 3n のような大きめのモデルは容量を空けないとダウンロードできませんでした。

# APTキャッシュの削除
sudo apt clean

# 使われていないパッケージの削除
sudo apt autoremove -y

# ローカルキャッシュの削除
rm -rf ~/.cache/*

# ゴミ箱の中身を空にする
rm -rf ~/.local/share/Trash/*

上記のようなコマンドで容量を開けることを図りましたが、今後プロジェクトを進めるに当たって、どこかしらのタイミングで必ず容量不足に陥ることが明らかだったので、64GBのSDカードに変えて、1から構築をやり直しました。もし今後 Jetson Orin Nano のようにSDカードを使用してプロジェクトを進める方がいましたら、絶対にSDカードはケチらない方がいいと個人的には感じました。

SDカードを変えて再度構築

SDカードを64GBのものに変えて、Pythonスクリプトの実行まで辿り着き、実行を試みるとエラーによって阻まれてしまいました。

エラーログから見えた問題点

実行すると以下の2つの大きな問題に遭遇しました。

  • NumPy 2.x系の互換性問題:PyTorch/transformersの一部がNumPy 1.x前提のため、NumPyをダウングレードする必要があった。
pip install "numpy<2"

最後の壁:Gemma 3nの実ファイル未整備

最終的に出たエラーログは、

AttributeError: 'NoneType' object has no attribute 'encode'

などの tiktoken 依存部分の失敗。**Gemma 3nはHugging Faceにまだ完全公開されていない(tokenizer.model未整備)**ため(2025年6月10日現在)、Google内部プレビュー版Gemma 3nは、transformersでそのまま動きませんでした

模索②:コンテナ/CLI ベース 〜Ollama〜

Ollama とは?

Ollama は Docker コンテナやネイティブバイナリで動作する CLI ツールで、モデルのダウンロード・管理・実行を一貫してローカルで完結できます。
さまざまなフォーマットをサポートしていて、llama.cpp や GGUF フォーマットに加えて、Gemma 系モデルも、Gated でなければ直接 pull して自己ホスト可能です。設定や依存関係が少なく、Jetson のようなリソース制約デバイスでも比較的スムーズに動くというメリットもあります。2025年4月3日にYoutubeチャンネル「Google for Developers」が公開した動画でも、Ollamaを使用して Jetson Orin Nano で Geema 3 を動かしていました。

curl -fsSL https://ollama.ai/install.sh | sh

まずは Ollama をインストールして、自分は下記のコマンドで Docker イメージを pull してエイリアスで簡易実行しました。

docker pull ollama/ollama:latest

alias ollama='docker run --rm -it --gpus all --name ollama \
  -v $HOME/.ollama:/root/.ollama \
  -v $PWD:/workspace ollama/ollama:latest'

その後まずは動画の通りに、

ollama pull gemma3:4b
ollama run gemma3:4b

Gemma3 モデルを動かしてみました。

会話は問題なく行うことができるのですが、Google AI Studio で公開されているものに比べるとかなり遅いです。画像認識を試してみたかったので、エドワード・ヘンリー・ポトハストという画家の作品である、「A Holiday」を読み込ませて作品名と画家を当てさせようとしてみました。

Gemma3はエドワード・ヘンリー・ポトハストが描いた別の作品である「Children on the Beach」だと回答して、それ自体はかなりニアピン回答なのですが、画家の名前は関西学院大学の創立者であるウォルター・ラッセル・ ランバスを回答しました。画家名に関しては知識データベースの問題な気がしますが、画像認識はかなりの精度だと言っていいと思います。

肝心の Gemma 3n は?

Gemma3 モデルで遊ぶのもそこそこに、Gemma 3n モデルを Ollama Library で探したのですが、2025年6月10日現在、まだ Gemma 3n モデルはありませんでした。

Edge タスクファイル(.task)実行 〜MediaPipe GenAI(Python)〜

MediaPipe GenAI(Python)とは?

MediaPipe GenAI(Python)は、Google が提供する .task 形式の量子化モデル(Gemma 3n E4B など)を Python 上で手軽に呼び出し、オンデバイスで大規模言語モデル(LLM)の推論を行うための API です。従来の Transformers+PyTorch のように巨大なフレームワークを組むことなく、軽量な Python モジュール1本でモデルをロードし、チャット形式やテキスト生成が可能になります。MediaPipe GenAI の特徴と利点は以下の通りです。

  • .task ファイル対応
    TensorFlow Lite ベースのランタイムで動く.taskファイルをそのまま読み込める
  • エッジデバイス最適化
    CPU/GPU(TFLite Delegate)どちらにも対応し、Jetson などの小型デバイスでも高速推論
  • シンプルな API
    BaseOptionsLlmInferenceOptionscreate_from_options()chat() の4ステップで完結

まずはHugging Facegoogle/gemma-3n-E4B-it-litert-previewページの Files and versions から gemma3n_e4b_int4.task をダウンロードし、それをプロジェクトディレクトリに移動します。

chmod 644 ./models/gemma3n_e4b_int4.task

上記のコマンドでファイルパスと読み込み権限を確認したのち、サンプル Python スクリプト run_genai.py を作成しました。

from mediapipe.tasks.python import core
from mediapipe.tasks.python import genai

model_path = "models/gemma3n_e4b_int4.task"

base_options = core.BaseOptions(model_asset_path=model_path)

llm_options = genai.LlmInferenceOptions(base_options=base_options)
# (オプションで top_k/top_p/temperature も設定可)
# llm_options.decoding_options.top_k = 64
# llm_options.decoding_options.top_p = 0.95
# llm_options.decoding_options.temperature = 1.0

llm_task = genai.LlmInference.create_from_options(llm_options)

result = llm_task.chat("こんにちは、自己紹介してください。")
print("Model Response:", result.text)

あとは下記のコマンドで mediapipe-genai をインストールして python スクリプト を実行すればコンソールにモデルからの返答テキストが出力されるという寸法です。

pip install mediapipe-genai
python run_genai.py

**しかし、mediapipe-genai のインストールに失敗してしまいました。**調べてみると、 Jetson Orin Nano の ARM64環境では mediapipe-genai は公式に提供されていませんでした。mediapipe-genai は Google の Android/iOS/Edge 向けライブラリで、Google が公開している .task ファイル向けのAPIは Android/Edge対応であり、Pythonではそもそも必要とされている genai.LlmInferenceOptions というAPIはないようです。Android Studio でのアプリ実装を考えている方はこの手法で実行できるはずです。

模索③:Edge タスクファイル(.task)実行 〜MediaPipe Edge(C++/TFLite)〜\

MediaPipe Edge とは?

Google がオープンソースで公開している MediaPipe Edge は、C++/Bazel ベースのフレームワークで、TensorFlow Lite(TFLite)をバックエンドにした高速なエッジ推論パイプラインを提供します。
特に .task 形式で配布される Gemma 3n E4B のような量子化モデルを、そのまま読み込んでローカル実行できるのが大きな特徴です。

  • 軽量ランタイム:TFLite エンジン+Delegate(CPU/GPU)で高速に動作
  • C++ ネイティブ:Python のオーバーヘッドなしで最小限のバイナリを生成
  • Bazel 管理:依存ライブラリ(FlatBuffers/Protobuf/TensorFlow Lite/OpenCV 等)を自動取得
  • .task ファイル対応:MediaPipe GenAI タスク API を C++ から直接呼び出せる

まずは、ビルドツールのインストールから行いました。

sudo apt update
sudo apt install -y build-essential git pkg-config \
     openjdk-11-jdk curl unzip zip \ 
     protobuf-compiler libprotobuf-dev libabsl-dev \
     libopencv-dev
curl -Lo /usr/local/bin/bazelisk \     
	https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-linux-arm64 
sudo chmod +x /usr/local/bin/bazelisk 
sudo ln -sf /usr/local/bin/bazelisk /usr/local/bin/bazel 

次に、MediaPipe Edge ソースをクローンしました。

git clone https://github.com/google-ai-edge/mediapipe.git mediapipe_edge 
cd mediapipe_edge git fetch --all --tags 
git checkout tags/v0.10.0 -b release-v0.10.0 

クローンが終われば、モデル(.task)ファイルを適切な場所に配置します。

mkdir -p models 
cp /path/to/gemma-3n-E4B-it-int4.task models/gemma3n_e4b_int4.task 
chmod 644 models/gemma3n_e4b_int4.task 

実際に走らせるためのコードサンプルはC++で書く必要があるのでC++ サンプルコードの作成examples/genai_cpp/run_gemma3n_e4b.cc を作成し、以下のように記述します

#include <iostream>
#include "mediapipe/tasks/cc/genai/llm_inference/llm_inference.h"
#include "mediapipe/tasks/cc/core/base_options.h"

using namespace mediapipe::tasks::genai;
using mediapipe::tasks::core::BaseOptions;

int main() {
  BaseOptions base_options;
  base_options.mutable_model_asset_buffer()->load_from_file(
    "models/gemma3n_e4b_int4.task");

  LlmInferenceOptions llm_options;
  llm_options.mutable_base_options()->CopyFrom(base_options);
  // llm_options.mutable_decoding_options()->set_top_k(32);
  // llm_options.mutable_decoding_options()->set_top_p(0.9f);

  auto status_or = LlmInference::CreateFromOptions(llm_options);
  if (!status_or.ok()) {
    std::cerr << "Failed: " << status_or.status().message();
    return -1;
  }
  auto llm = std::move(status_or).value();

  auto result = llm->Chat("こんにちは、自己紹介してください。");
  std::cout << result.text() << std::endl;
  return 0;
}

BUILD ファイルの定義する必要があり、mediapipe_edgeの中にexamples/genai_cppというファイルを作ってあげて、examples/genai_cpp/BUILD に以下を記述します:

load("//mediapipe/framework:mediapipe.bzl", "mediapipe_cc_library")

cc_binary(
    name = "run_gemma3n_e4b",
    srcs = ["run_gemma3n_e4b.cc"],
    deps = [
        "//mediapipe/framework:calculator_framework",
        "//mediapipe/tasks/cc/genai/llm_inference:llm_inference_lib",
        "@org_tensorflow_lite//:tensorflow_lite",
        "@com_google_absl//absl/strings",
        "@com_google_protobuf//:protobuf_lite",
        "@com_google_flatbuffers//:flatbuffers",
        "@mediapipe//third_party/glog:glog",
    ],
    linkopts = ["-pthread"],
)

これら全てが終わったらやっと、Bazel でビルドと実行が行えます。

# 必要なら LD_LIBRARY_PATH を通す
export LD_LIBRARY_PATH=/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH

bazel build -c opt --copt="-O3" \
    //examples/genai_cpp:run_gemma3n_e4b

./bazel-bin/examples/genai_cpp/run_gemma3n_e4b

長かった試行錯誤の末、C++にまで手を出してやっと Gemma3n Jetson Orin Nano で動かすことができると思ったのですが、

ModuleNotFoundError: No module named 'mediapipe.tasks.genai' 

というエラーに直面しました。調査したところ、このモジュールは Google の社内専用で、まだ外部向けには正式リリースされていないようです。

今後の展望:Gemma 3n E4B を正常に動かすために

1. 今後どうすれば Gemma 3n をローカルで走らせられるか

  1. MediaPipe Edge GenAI LLM ライブラリの正式リリースを待つ
    • mediapipe/tasks/cc/genai/llm_inference モジュールが含まれる v0.11.0 以降を取得
    • Bazel で //mediapipe/tasks/cc/genai/llm_inference:llm_inference_lib をビルドすれば、.task ファイルを直接ロード可能に
  2. Python バインディング(mediapipe-genai)の ARM64 wheel 提供
    • pip install mediapipe-genai が Jetson Orin Nano 上で通るよう、aarch64 向け wheel の公開を希望
    • 依存の tiktokensentencepiece も合わせてメンテナンスを
  3. Gemma 3n E4B の .task ファイルの整備
    • ファイル名・フォーマットを安定版として公開(例:gemma3n_e4b_int4.task
    • MediaPipe のサンプルリポジトリに同梱し、パス一発で参照できるように
  4. Hugging Face Transformers 側の対応
    • transformers>=5.0GemmaTokenizerALL_PARALLEL_STYLES の None チェック問題を解消
    • Python 上でも Gemma 3n のインポート → 推論 → 結果取得がシームレスに
  5. コンテナ/CLI(Ollama)でも Gemma 3n E4B に対応
    • Ollama が gemma3n:e4b を pull/run できるよう GGUF 形式の公開
    • Jetson 向けの最適化バイナリを提供してもらう

2. どのようなバージョンアップがあれば走るか

コンポーネント 現状 必要なバージョン/変更点
JetPack / CUDA / cuDNN JetPack 6.0, CUDA 12.2, cuDNN 8.9 → JetPack 6.1+(CUDA 12.2→13.0 に対応)
TensorRT 8.6.2.3 → 8.9.x(GPU Delegate の安定化・最適化向け)
TensorFlow Lite(Bazel) Bazel 自動フェッチ → TFLite 2.13+(ARM64 ビルドの最適化版)
MediaPipe Edge / GenAI v0.10.0(genai 未対応) → v0.11.0+(//tasks/cc/genai モジュール追加)
mediapipe-genai (Python) wheel 未提供 mediapipe-genai-0.1.0a0-aarch64.whl の公開
Transformers / tiktoken v4.x(None 判定バグあり) → v5.x(Gemma 3n トークナイザ統合&バグフィックス)
Hugging Face Hub CLI v0.x(PATH 問題など) → v0.14.x (huggingface-cli login が仮想環境でも動作)
Ollama / llama.cpp gemma3:4b のみ gemma3n:e4b (GGUF 量子化モデル) の追加サポート

これらのアップデートが揃えば、

  • 完全オフライン かつ C++/Python 双方から .task ファイルを呼び出せる
  • Jetson Orin Nano 上でも安定した GPU Delegate 推論が可能
  • Hugging Face や Ollama など、好みのインターフェイスで Gemma 3n を自由に試せる

といった状態が実現します。次世代のオンデバイス LLM 実行環境へ、もう一息です!

オープン開発チーム

Discussion