Edge TPU の September 2019 Updates を追う

こんにちは。6年間使い続けた iPhone 5s に別れを告げ、iPhone 11 Pro に移行した R&D チームの奥村(@izariuo440)です。前回の Edge TPU 更新からはや2ヶ月。今回の更新では、apt-get 対応強化、コンパイラ更新、Python ライブラリ更新、GitHub への移行、などが行われました。この記事では Edge TPU September 2019 Updates をベースに、意訳・追記をしています。いくつかは実際に試してみましたが、すべてを試したわけではありませんのであしからず。

f:id:optim-tech:20191010170444j:plain

Edge TPU に関しては、過去記事も参考になるかもしれません。

意訳

新しい Debian パッケージ

ディストリビューションプロセスが改善され、apt-get による Debian パッケージが利用可能になりました。

Dev Board を使用している場合、以下で以前と同じようにすべての更新を取得できます。

sudo apt-get dist-upgrade

今回の更新よりも前に USB アクセラレータをセットアップした場合、Python ライブラリとランタイムライブラリを手動でインストールする install.sh というスクリプトを使用しているので、新しい Debian パッケージのインストールと競合するかもしれません。新しい Debian パッケージに移行するには、以下の手順に従ってください。

# まず、以前の Python ライブラリと Edge TPU ランタイムをアンインストール
sudo pip uninstall edgetpu
# または pip3 でアンインストール
# sudo pip3 uninstall edgetpu

# 以下はシステムのアーキテクチャによって適宜変更
# x86_64-linux-gnu, arm-linux-gnueabihf, or aarch64-linux-gnu
ls -d /usr/lib/x86_64-linux-gnu/libedgetpu* | xargs sudo rm

# 新しい Python ライブラリと Edge TPU ランタイムをインストールする
sudo apt-get install python3-edgetpu libedgetpu1-std
# 最大動作周波数で動作させたいなら、`libedgetpu1-std` ではなく 'libedgetpu1-max' を指定する

以降、これらのパッケージを apt-get で更新できます。

補足:パッケージは edgetpu-compilerpython3-edgetpulibedgetpu1-std/libedgetpu1-max に分かれています。

Edge TPU コンパイラの更新

バージョン 2.0.2xx に更新されました。post-training quantization のサポートが改善され、 (特に Keras でビルドされたもの)、DeepLab v3 という Semantic Segmentation モデルがサポートされました。DeepLab v3 はサンプルコードで試せます。

新しい Edge TPU コンパイラは、以下で取得できます。

sudo apt-get update
sudo apt-get upgrade edgetpu

今回は v2.0 から v2.0.2xx へのマイナーな更新なので、Edge TPU ランタイムは同じ v12 のままです。

なお、USB アクセラレータ版などの導入ページも合わせて更新されています。

Get started with the USB Accelerator | Coral

tarball を取得して展開して中のスクリプトを実行する・・・という野暮ったい手順がなくなりすっきりしました。

また、コンパイラが賢くなって CPU にオフロードされるオペレータが少なくなるモデルが増えたようです。モデルによっては、新しいコンパイラでコンパイルし直すだけで、さらに高速に実行できるということですね。

Edge TPU Python ライブラリの更新

バージョン 2.12.1 に更新されました。

API 命名規則のクリーンアップが主ですが、後方互換性があるので既存コードはそのまま動きます。また、モデルをラベル名を読み込むために read_label_file() という新しいユーティリティ関数が追加されました。

更新するには、前述したように apt-get を使ってください。

GitHub レポジトリへの移行

以下の2つのレポジトリを GitHub に移行しました。

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

これは Edge TPU API のソースコードで、関連するサンプルコード、テストデータ、ベンチマークなどを含んでいます。以前は coral.googlesource.com で利用可能でしたが、GitHub に移行しました。coral.googlesource.com は Mendel ソースコードのみアクティブとなります。

GitHub には、1コミットのみのまっさらな master ブランチがある状態です。また、これまでは TensorFlow を git submodule として参照していましたが、今後は bazel によるアーカイブ指定になっていくようです。

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

これは Coral デバイスで Edge TPU API の代わりに TensorFlow Lite API を使うサンプルコード集です。

気になったこと

libedgetpu.so の構成変更

libedgetpu.so は、今回の更新前後で構成が変更されていました。aarch64 の場合を Jetson Nano (Ubuntu 18.04 ベース) 上で確認すると・・・

$ ldd before/libedgetpu.so | sort
    /lib/ld-linux-aarch64.so.1 (-)
    libc++.so.1 => /usr/lib/aarch64-linux-gnu/libc++.so.1 (-)
    libc++abi.so.1 => /usr/lib/aarch64-linux-gnu/libc++abi.so.1 (-)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (-)
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (-)
    libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (-)
    libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (-)
    libresolv.so.2 => /lib/aarch64-linux-gnu/libresolv.so.2 (-)
    librt.so.1 => /lib/aarch64-linux-gnu/librt.so.1 (-)
    libudev.so.1 => /lib/aarch64-linux-gnu/libudev.so.1 (-)
    libusb-1.0.so.0 => /lib/aarch64-linux-gnu/libusb-1.0.so.0 (-)
    linux-vdso.so.1 (-)
$ ldd after/libedgetpu.so | sort
    /lib/ld-linux-aarch64.so.1 (-)
    libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (-)
    libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (-)
    libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (-)
    libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (-)
    libstdc++.so.6 => /usr/lib/aarch64-linux-gnu/libstdc++.so.6 (-)
    libudev.so.1 => /lib/aarch64-linux-gnu/libudev.so.1 (-)
    libusb-1.0.so.0 => /lib/aarch64-linux-gnu/libusb-1.0.so.0 (-)
    linux-vdso.so.1 (-)

まとめると、以下のようになります。

  • 削除された依存ライブラリ
    • libc++.so
    • libc++abi.so
    • libresolv.so
    • librt.so
  • 追加された依存ライブラリ
    • libstdc++.so

これまでは libc++ でビルドされていましたが、これからは libstdc++ でビルドされていくようです。これが一致していないと、ビルドできても実行時に一部の機能(バージョン取得など)で SEGV が発生するので注意してください。私も以前これではまったので、今回の更新はありがたいです。GitHub の issue にも関連する報告があります。

Request for static libedgetpu.a · Issue #5 · google-coral/edgetpu · GitHub

おまけ

Edge TPU の歩み

これまでの動きを振り返ると、2ヶ月ごとの更新になってきています。次回は11月末ですかね。

  • 2019/03/04: ベータ版リリース
  • 2019/04/11: 正式版リリース
  • 2019/05/29: オフラインコンパイラリリースなど
  • 2019/07/24: post-training quantization サポート、TensorFlow Lite デリゲート対応など
  • 2019/09/25: apt-get 対応強化、コンパイラ更新、Python ライブラリ更新、GitHub への移行など

Mini PCIe アクセラレータが購入可能に

USB アクセラレータ、Dev Board に続き、Mini PCIe アクセラレータが購入可能になりました。

coral.withgoogle.com

以前から、$50 以下であるとサイトに記載されていましたが、$34.99 になったようです。Mouser から購入可能なようですが、この記事を書いている時点では三週間待ちのようです。Jetson Nano にも挿せるはずなので、楽しみですね。導入手順は以下に記載されています。

coral.withgoogle.com

まとめ

今回、これといった大きな変更はありませんでしたが、Google が研究してきた主要なモデルが徐々に利用可能になってきていますね。TensorFlow 2.0 もリリースされたので、それ以外のモデルもこれからどんどん増えていくのかもしれません。私は PyTorch と ONNX を組み合わせて使うことが多いので、そっから tflite 形式に変換して Edge TPU に落とし込むという手順を確立していきたいと思っています。

公式ベンチマーク も今回の更新に合わせて更新されていますので、要チェックです。少し動かしてみた限りでは、全体的に推論の遅延が少し小さくなった気がします。

オプティムでは、こうした技術に興味がある・作ってみたい・既に作っている、というエンジニアを募集しています。興味のある方は、こちらをご覧ください。

www.optim.co.jp