こんにちは。6年間使い続けた iPhone 5s に別れを告げ、iPhone 11 Pro に移行した R&D チームの奥村(@izariuo440)です。前回の Edge TPU 更新からはや2ヶ月。今回の更新では、apt-get
対応強化、コンパイラ更新、Python ライブラリ更新、GitHub への移行、などが行われました。この記事では Edge TPU September 2019 Updates をベースに、意訳・追記をしています。いくつかは実際に試してみましたが、すべてを試したわけではありませんのであしからず。
Edge TPU に関しては、過去記事も参考になるかもしれません。
- Edge TPU の July 2019 Updates を追う - OPTiM TECH BLOG
- 2019インターン紹介: Edge TPU向けPoseNetのリアルタイム姿勢推定 - OPTiM TECH BLOG
- Edge TPU の性能を引き出すためには? - OPTiM TECH BLOG
意訳
新しい 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-compiler
と python3-edgetpu
と libedgetpu1-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 September 2019 Updatesで確認したDeepLab v3の推論時間のベンチマークをブログにまとめてみた。
— nb.o (@Nextremer_nb_o) 2019年10月8日
Edge TPUでDeepLabv3のベンチマークを測定する(September 2019 Updates)https://t.co/iqAHBiCEEW https://t.co/DJcv5gQwI8
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 アクセラレータが購入可能になりました。
以前から、$50 以下であるとサイトに記載されていましたが、$34.99 になったようです。Mouser から購入可能なようですが、この記事を書いている時点では三週間待ちのようです。Jetson Nano にも挿せるはずなので、楽しみですね。導入手順は以下に記載されています。
まとめ
今回、これといった大きな変更はありませんでしたが、Google が研究してきた主要なモデルが徐々に利用可能になってきていますね。TensorFlow 2.0 もリリースされたので、それ以外のモデルもこれからどんどん増えていくのかもしれません。私は PyTorch と ONNX を組み合わせて使うことが多いので、そっから tflite 形式に変換して Edge TPU に落とし込むという手順を確立していきたいと思っています。
公式ベンチマーク も今回の更新に合わせて更新されていますので、要チェックです。少し動かしてみた限りでは、全体的に推論の遅延が少し小さくなった気がします。
オプティムでは、こうした技術に興味がある・作ってみたい・既に作っている、というエンジニアを募集しています。興味のある方は、こちらをご覧ください。