
Google Tensor クラック
Google Tensor NPU(DarWINN)向けの直接アクセスツールキット。2世代にわたってリバースエンジニアリングされています:Tensor G2(Pixel 7、コードネーム Janeiro)と Tensor G3(Pixel 8、コードネーム Rio)。
私はスマートフォンで LLM 推論を動かすことを試みており、Tensor NPU を使って高速化したいと考えていました。NPU には公開 API がなく、Google Camera と署名済みシステムサービスのみが使用を許可されているため、NPU が実際にどのように駆動されるのかをリバースエンジニアリングする必要がありました。
その過程で、NPU はどちらの世代でも LLM には役に立たないことを学びました。言語モデルのデコードはメモリ帯域幅に制約され、NPU は CPU と同じメモリバスを共有するため、結局速くなりません(実在の transformer FFN ブロックで、G2 では NPU が約 1.81 ms/ブロック 対 CPU が約 1.57 ms/ブロック。G3 では約 2.01 ms 対 約 1.66 ms)。私自身のユースケースでは、これは両チップとも行き止まりでした——LLM は CPU の方がよく動きます。
しかし、アクセスツール自体は動作し、NPU は 確かに、それが作られたワークロード(重みがオンチップに収まるビジョン/CNN モデル)に対しては強力なアクセラレータです。私のプロジェクトには役立ちませんでしたが、オンデバイスのビジョン処理や NPU 研究を行っている他の人には有用かもしれません——そこで MIT ライセンスで公開します。
| フォルダ | 内容 | Root 必要? |
|---|---|---|
on-device-llm/ | 後述の NPU 関連の作業が高速化しようとしていた、実際の LLM サーバー構築(llama.cpp + Qwen2.5-1.5B)。両方のスマートフォンで tokens/sec を測定済み。 | いいえ |
g2-pixel7/ | Tensor G2(Pixel 7、Janeiro)NPU アクセス — 完全な SDK、スタンドアロン C++ ランナー、カスタムモデルの実行、双方向の実証。当初のリバースエンジニアリング作業。 | はい |
g3-pixel8/ | Tensor G3(Pixel 8、Rio)NPU アクセス — G3 の異なる(ハンドルベースの)Buffer API に移植された双方向の実証と、再測定された FFN 帯域幅の結論。 | はい |
スマートフォンでローカル LLM を動かしたいだけなら、on-device-llm/ から始めてください——これが実用的で root 不要の部分です。g2-pixel7//g3-pixel8/ フォルダは、なぜ NPU が使われないのか、そしてロックされたハードウェアにどうやってアクセスしたのかに興味がある人向けです。
2つのチップの NPU は同じ DarWINN API v2 サーフェス(AddInput/AddOutput/Submit)を公開していますが、1つ重要な点で異なります。G2 は生のテンソルポインタを返すのに対し、G3 はテンソルを不透明な Buffer* ハンドルでラップし、独自の SizeBytes/MapToHost/FlushCache API を通じてアクセスする必要があります。実際に何が変わるかは g3-pixel8/README_DEMO.md を参照してください。
google-edgetpu NNAPI アクセラレータ経由でロード可能(チャネルごとの重みは拒否されます)。on-device-llm/ は Termux だけで十分です——root 不要。NPU フォルダには、Magisk で root 化した Pixel 7(Tensor G2)または Pixel 8(Tensor G3)· Android 14/16 · Frida 17.x · 対象プロセス com.google.android.GoogleCamera · libedgetpu_util.so が必要です——研究と学習のための、自分のハードウェアへのデバイス所有者としてのアクセスです。
MIT。現状のまま共有します。無保証です。どなたかの役に立てば幸いです。