
Google Tensor Cracks
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와 동일한 메모리 버스를 공유하므로 결국 더 빨라지지 않습니다(실제 트랜스포머 FFN 블록 기준 G2에서 NPU ~1.81 ms/블록 vs CPU ~1.57 ms, G3에서는 ~2.01 ms vs ~1.66 ms). 제 사용 사례에서는 두 칩 모두 막다른 길이었습니다 — LLM은 CPU에서 더 잘 실행됩니다.
하지만 액세스 도구 자체는 작동하며, NPU는 본래 만들어진 용도인 비전/CNN 모델(가중치가 온칩에 들어맞음)에서는 분명 강력한 가속기입니다. 제 프로젝트에는 도움이 되지 않았지만, 온디바이스 비전이나 NPU 연구를 하는 다른 사람들에게는 유용할 수 있어 MIT 라이선스로 공개합니다.
| 폴더 | 내용 | 루트 필요? |
|---|---|---|
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/부터 시작하세요 — 루트가 필요 없는 유용한 부분입니다. 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 가속기를 통해 로드 가능합니다(per-channel 가중치는 거부됨).on-device-llm/은 Termux 외에 아무것도 필요 없습니다 — 루트 불필요. NPU 폴더에는 Magisk로 루팅된 Pixel 7(Tensor G2) 또는 Pixel 8(Tensor G3) · Android 14/16 · Frida 17.x · 대상 프로세스 com.google.android.GoogleCamera · libedgetpu_util.so가 필요합니다 — 연구와 학습을 위한, 자신의 하드웨어에 대한 기기 소유자 액세스입니다.
MIT. 있는 그대로 공유되며 보증이 없습니다. 누군가에게 도움이 되기를 바랍니다.