Edge TPU の July 2019 Updates を追う

こんにちは。R&D チームでコンピュータビジョンの深層学習モデル推論特化型人材として活躍している(自称)奥村(@izariuo440)です。Edge TPU リリースからはや4ヶ月。周辺ソフトウェアの更新でハードウェアの潜在能力が顕在化してきています。先日、post-training quantization がサポートされました。この記事では Edge TPU July 2019 Updates をベースに、意訳・追記をしています。実際に試してみた、という記事ではないのであしからず。

Edge TPU の USB アクセラレータ版はとても小さいです。参考として、弊社で販売しているスマート玄米と並べてみました。※画像をクリックすると Amazon の販売ページが開きます。

USB Accelerator | Coral スマート玄米:青森県 まっしぐら (無洗米玄米2kg):残留農薬ゼロ

私が気になったところ

post-training quantization がサポートされました。これまでは quantization-aware training しかサポートされていなかったので、Edge TPU 用モデルへの変換が億劫でしたが、これでかなり楽になりそうです。TensorFlow での訓練が苦手な推論特化型人材としては、非常にありがたいです。

訓練済みモデルに、EfficientNet ベースのものが追加されました。Edge TPU では MobileNet ベースのものが主流でしたので、新しい選択肢として楽しみです。ここにある通り、ImageNet の画像分類で ResNet-50 よりも精度が高いのに 10 倍高速という恐ろしいモデルです。Edge TPU 向けに量子化してもそこまで精度も落ちていません。さらに、量子化済みの efficientnet-edgetpu-S_quant.tflite だと、訓練済みモデルのファイルサイズはわずか 6.1 MB という軽さです。

更新内容

Edge TPU コンパイラの更新

バージョン 2.0 に更新されました。以前は quantization-aware training による量子化にしか対応していませんでしたが、post-training quantization がサポートされました。いくつかのバグも修正されたようです。

新しい Edge TPU コンパイラを入手する手順は以下の通りです。

sudo apt update
sudo apt upgrade edgetpu

コンパイラが更新に伴い、Edge TPU ランタイムも更新する必要があるようです(バージョン 12)。Dev Board を使っている場合、Mendel システムソフトウェアも一緒に更新すべきとのこと。

sudo apt dist-upgrade

USB アクセラレータを使っている場合は、次のセクションを参照してください。

ちなみに社内の量子化警察によると、post-training quantization は TensorFlow 1.x ではなく TensorFlow 2.0 beta でやった方がいいようです。tflite_convert コマンドではなく TFLiteConverter API で量子化ができたとのこと。

converter = tf.lite.TFLiteConverter.from_concrete_functions()
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file()
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]

Edge TPU Python ライブラリの更新

Edge TPU Python ライブラリがバージョン 2.11.1 に更新されました。いくつかの API が追加・更新されたようです。

Dev Board を使っている場合、新しい Python ライブラリは前述したとおりシステムソフトウェアの更新で入手できます。

USB アクセラレータを使っている場合、最初にライブラリをインストールしたときと同様な手順でライブラリ(と Edge TPU ランタイム)を更新できます。

wget https://dl.google.com/coral/edgetpu_api/edgetpu_api_latest.tar.gz \
  -O edgetpu_api.tar.gz --trust-server-names
tar xzf edgetpu_api.tar.gz
cd edgetpu_api
bash ./install.sh

以下のコマンドで現在のライブラリのバージョンを確認できます。

python3 -c "import edgetpu; print(edgetpu.__version__)"

新しいオン・デバイス バックプロパゲーション API

Python ライブラリ 2.11.1 で SoftmaxRegression API が追加されました。これにより、画像分類モデルの最終層での転移学習ができるようになります。SoftmaxRegression のインスタンスは、モデルで最終的な分類を実行する softmax 活性化関数を使った全結合層として機能し、確率的勾配降下法 (SGD) を使用して最終層の重みだけを高速に訓練できます。

使い方は Retrain a classification model on-device with backpropagation | Coral を参照してください。

Edge TPU 用の TensorFlow Lite デリゲート

これまでは、Edge TPU でモデルを高速化するには Edge TPU Python APIC++ API でコードを書く必要がありましたが、TensorFlow Lite Interpreter API でも同様にモデルを高速化できるようになりました。Edge TPU のための TensorFlow Lite デリゲートがリリースされたからです。

TensorFlow Lite Delegate API は TensorFlow Lite の実験的な機能で、TensorFlow Lite インタプリタが計算グラフの実行の一部またはすべてを別の実行器への委譲が可能になります。この場合、別の実行器とは Edge TPU です。

Edge TPU デリゲートを使う手順は以下のとおりです。

  1. 前述したとおり Edge TPU Python ライブラリを最新の状態に更新します。Edge TPU ライブラリは必要ありませんが、このパッケージは libedgetpu.so に入っているので、現時点では Edge TPU デリゲートをインストールする唯一の方法となっています。
  2. label_image.py など の TensorFlow Lite 推論スクリプトを開き、インタプリタを構築するところでデリゲートを指定するパラメータを追加します。具体的には、interpreter = Interpreter(model_path=args.model_file)interpreter = Interpreter(model_path=args.model_file, experimental_delegates=[interpreter_wrapper.load_delegate('libedgetpu.so.1.0')]) とします。これは libedgetpu.so へのパスが通っていることを想定しています。さもなければ、スクリプト実行時に OSError: libedgetpu.so.1.0: cannot open shared object file: No such file or directory というエラーが出ますので、パスを通してください。
  3. スクリプトを実行します。Edge TPU 用にコンパイルされたモデルがちゃんと指定されていることを確認してください。

新しい画像分類モデル

Edge TPU ランタイムの更新と同時に、Edge TPU と AutoML チームによって設計された新しいモデルアーキテクチャが誕生しました。このモデルは、2019年5月に発表された EfficientNet に基づいています。Edge TPU で低遅延で推論でき、モデルの容量がコンパクトでありながら、サーバーサイド(で動作する?)モデルの精度を達成するためです。

新しいモデルは Efficientnet-EdgeTpu というもので、小・中・大の3種類のサイズがあります。サイズは、モデルの計算グラフのサイズに対応しています。サイズが大きくなると精度が高くなりますが、遅延も大きくなります1。そのため、小のモデルは最も高速ですが、精度は最も低くなります。

Efficientnet-EdgeTpu GitHub レポジトリで、訓練済みモデルを入手したり、独自のデータで訓練する方法を学ぶことができます。

Edge TPU の歩み

これまでの動きを振り返ると、おおよそ1〜2ヶ月ごとに更新されています。次の更新が待ち遠しいですね。

  • 2019/03/04: ベータ版リリース
  • 2019/04/11: 正式版リリース
  • 2019/05/29: オフラインコンパイラリリースなど
  • 2019/07/24: post-training quantization サポート、TensorFlow Lite デリゲート対応など

大きめのモデルも動くようになっていってほしいですね。

さいごに

Edge TPU の更新を追ってみました。秋頃に更新されそうなので、そのときにまた書くかも知れません。

オプティムでは Edge TPU や M5StickV が好きなエンジニアを募集しています。


  1. 原文をそのまま翻訳すると「サイズが大きくなると精度が高くなりますが、遅延も減少します」となりましたが、その後の文章や、速度と精度のトレードオフの関係性を考慮して、意味を逆にしました。