Google Tensor NPU(DarWINN)的直接访问工具集,经过逆向工程,横跨两代:Tensor G2(Pixel 7,代号 Janeiro)和 Tensor G3(Pixel 8,代号 Rio)。
我原本想在手机上运行 LLM 推理,并希望利用 Tensor NPU 来加速。为此,我必须反向研究 NPU 的实际驱动方式,因为它没有公开的 API——只有 Google Camera 和签名系统服务才被允许使用它。
在这个过程中,我发现 NPU 对 LLM 没有帮助,在任一代处理器上都是如此:语言模型解码受内存带宽限制,而 NPU 与 CPU 共享同一内存总线,因此最终速度并不快(在 G2 上,NPU 约 1.81 毫秒/块 vs CPU 约 1.57 毫秒;在 G3 上约 2.01 毫秒 vs 约 1.66 毫秒,针对一个真实 Transformer FFN 块而言)。对于我自己的用例来说,这在一代芯片上都是死胡同——LLM 在 CPU 上运行更好。
但访问工具本身是可行的,而且 NPU 确实是它为之构建的工作负载(视觉/CNN 模型,权重可放入片上 SRAM)的强大加速器。它虽然没帮到我的项目,但其他从事设备端视觉或 NPU 研究的人可能会觉得它有用——所以我以 MIT 许可证发布它。
| 文件夹 | 内容 | 需要 Root? |
|---|---|---|
on-device-llm/ | 实际的 LLM 服务设置(llama.cpp + Qwen2.5-1.5B),下面的 NPU 工作尝试加速的就是这个。在两款手机上测量了 tokens/秒。 | 否 |
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 未被使用以及如何访问被锁定的硬件的人。
两款芯片的 NPU 暴露了 相同的 DarWINN API v2 接口(AddInput/AddOutput/Submit),但有一个重要区别: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。按原样共享,无担保,希望对某些人有帮助。