Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Google Edge TPUのエコシステムをまとめてみた

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

はじめに、

この記事は、Google (Coral)が販売している Edge TPU のエコシステムについてまとめたものです。

このブログでも何度も取り上げた Google Edge TPU 。USB ドングルだけでなく、mini PCIe, M.2, M.2 dual, SOM, Moduleで提供されています。また、デバイスを搭載して、Coral Dev Board および Coral Dev Boad Mini もあります。
その Google Edge TPU を使う上でのソフトウエアの多くはオープンソースとして、github にて公開されています。

今年の正月にこんなツイートをしたので、見た方もいると思います。

このツイートで書いた

  • pycoral
  • libcoral
  • libedgetpu

までは、Coral の github にて公開されています。

  • linux gasket driver
  • apex drvier

については、Linux (githubで公開されています)の中にあります。

これらソフトウェアは、Runtimeと呼ばれるソフトウェアで、TensorFlow Liteもモデルを Google Edge TPU用に変換する Edge TPU Compiler に関してはソースコードは公開されていません。
しかしながら、Linux の中にある apex driver を解析することでいろいろなことがわかります。

処理の流れ

Google Edge TPUで処理をさせるためには次の2つのステップが必要です。

1. TensorFlow Liteモデルを Google Edge TPU用の TensorFlow Liteモデルに変換する
既に変換済みのモデル(ここ)を使う場合はこのステップは必要ありません。
TensorFlow LiteモデルをGoogle Edge TPU に読ませる TensorFlow Liteモデルに変換するには、専用の(Offline) Compiler(Edge TPU Compiler) を使います。

2. Pycoral あるいは、libcoral を使って、アプリケーションを作成する。

それでは、順番にそれぞれのソフトウェアを見ていきましょう。

ソフトウェア

coral からのソフトウェアは、ここ、説明等があります。

Edge TPU Compiler

Edge TPU Compiler | Coral

TensorFlow Liteモデルの中のOpの内、Google Edge TPU 内で連続して実行できるものを切り出し、大きなOp (edge-tpu-custom) にラップしたモデルに変換するのが Edge TPU Compiler の働きです。Edge TPU Compilerにて、入力となるTensorFlow Liteモデルの中で連続して実行できるOpの中には複数のOp を1つのOpに融合(Fusion)したものに置き換えたりもします。現時点では、1つのモデルの内、1つの塊しか Google Edge TPU 内で実行できませんが、複数の Google Edge TPU を使うことはできます。

Pycoral : Python API

https://github.com/google-coral/pycoral

Pycoral は、Google Edge TPU に TensorFlow Liteモデルを読み込ませて、推論をするための Python APIです。

Pycoral の使い方については、Run inference on the Edge TPU with Pythonというドキュメントがあります。
また、各 Python API のドキュメントは、ここ にあります。
コンソールからちょおっと使ってみたいときにはとっても便利なものだと思います。

例題には、

  • 物体検出:detect_image.py
  • 物体識別:classify_image.py

などがあります。

ここで使っている学習済みモデルは、ここ にあります。

libcoral : C++ API

ibcore

Google Edge TPU に TensorFlow Liteモデルを読み込ませて、推論をするための C++ APIです。C++ のアプリケーションなどに組み込むことができます。
libcoral の使い方については、Run inference on the Edge TPU with C++というドキュメントがあります。
また、各 C++ API のドキュメントは、ここ にあります。

x86-64, ARM-v7(RasPi/2/3/4など), ARM-v8(Google Coral Dev Board) などで ビルドできます。ビルド時には、Docker も利用できます。

この2種類のAPIを使うことで、いろいろなところで Google Edge TPU が利用できると思います。

また、Colab tutorials for Coral では、Google Cloud上の Colab にて、Tutorial もあります。

libedgetpu : Edge TPU runtime library

https://github.com/google-coral/libedgetpu

このlibedgetpuは、Runtimeに相当するものです。libedgetpuが最初に公開されたときはバイナリバージョンでソースコードは公開されていませんでした。
その後、2020年11月のFrogfishにて、ソースコードgithub にて公開されました。

libedgatpu は、libcoral から呼び出され、次に説明する Linux 内にある gasket driver と apex driver の橋渡しをします。
driver ディレクトリにあるdriver.[h,c]がLinux内にある gasket driver と apex driver に対していろいろなことを行い、ハードウェアである Edge TPU を制御しています。

このようなハードウェアを制御する部分のRuntimeのソースコードが公開されるのは非常にまれなことです。ソースコードを解析することでどのようにEdge TPUを制御しているかがわかるかもしれません。

libcoral同様に、x86-64, ARM-v7(RasPi/2/3/4など), ARM-v8(Google Coral Dev Board) などで ビルドできます。ビルド時には、Docker も利用できます。

Linux 内にある gasket driver と apex drvier

この2つの driver は、linuxdrivers/staging/gasket ディレクトリに存在します。
gasket driver を経由して、apex ドライバが呼び出されます。この gasket driver は、PCIe 用のデバイスドライバです。USBタイプの Google Edge TPU のものではありません。

apex_driver.c がデバイスドライバの本体で、PCIのBAR[2]にいろいろなレジスタがあるのがわかります。

関連ブログ:Google Edge TPUのlibedgetpuの中とApexデバイスドライバの関係
関連ブログ:Google Edge TPU のデバイスドライバを見つけました
関連スライド:Pixel Visual Core device driver source code analysis

ハードウェア

ここでは、ハードウェア側の Coral Dev Board/Coral Dev Board Mini と Edge TPU 本体について、見ていきます。

Coral Dev Board/Coral Dev Board Mini

Google Edge TPU がボード上に実装された Coral Dev Board および Coral Dev Board Mini があります。
これらのボードの Schematics and layoutgithub にて、公開されています。

Dev Board Mini については、SoC(MediaTek 8167s)は PCIe Gen2 を持っていないので、USB 2.0 で Edge TPU と接続しています (上記の回路図でも USB 2.0で接続されています)。また、Data Sheet にも載っていました。

ASUS Tinker T

ASUS Tinker Edge T は、CoralのSOM(1GBメモリ版)を搭載したボード。

AI-pITX-100-GC

Al-plTX-100-GC は、i.MX8搭載だけどメモリが8GBもあるボード。

Google Edge TPU の中身

クラウド用学習チップである Google TPU v2とv3に関しては、ざっくりでありますが、内部がどんな感じになっているかまでは公開されています。
一方、Google Edge TPU ついては、そのような情報は公開されていません。

しかしながら、Googleで検索すると、いろいろと出てきます。
その一つが、Google Edge TPU の中には、Corex-A53x2が入っているようです。
また、Linux の apex デバイスドライバの中を解析してみると、DRAMのon/off という記述があります。Google Edge TPU は DRAM は off (付いていない)ですが、
Pixel 4に搭載されている Pixel Neural Core では、Google Edge TPU のコアと同じようなものが入っていて、こちらはチップにDRAM(LPDDR4)が付いています。

関連ブログ:Google Edge TPUには、Cortex A53x2が入っていた
関連ブログ:Pixel Visual CoreのASIC内では、Headless Androidが走っている!
関連ブログ:Pixel Visual Coreのデバイスドライバのソースコード解析のスライド
関連ブログ:やっぱり入っていた Pixel 4に、Edge TPUが

最後に、

簡単ではありますが、Google Edge TPUのエコシステムについてまとめました。
あとは、Edge TPU Compilerとハードウェアである Edge TPU 本体がNVIDIAのNVDLAにようにgithubにて公開されると、学習用途や研究の土台になって面白いと思うのだが、それは贅沢という話でしょうか。

このブログでの Google Edge TPU に関するもの
vengineer.hatenablog.com