masato-ka's diary

日々思ったこととか、やったことの備忘録。

JetsonにEdge TPUにM5StickV で、エッジAI用やるには何を選べばいいの?

1. 概要

追記 公開当初Jetson Nanoの性能表記に誤記があったため修正しています。

最近組み込みデバイス(以下エッジと表現)で画像認識や音声認識、センサ情報の処理といったディープラーニングを利用した処理を実行することが容易になっている。低消費電力で、高速にディープラーニングを処理するためのエッジAI用アクセラレータが各社から発売されていることがその理由の一つだろう。

こういった、エッジAI用のアクセラレータは各社によってその使用や対応フレームワーク、利用できるディープラーニングのネットワーク構成に違いがある。どれも同じように利用できるわけではない。自分でエッジAI用アクセラレータを利用しようとしたときにいくつか調べてみた内容をメモがわりに残してみる。ちなみに個人で遊べるものを中心にしてるので、産業的にどうなのかは知らない、悪しからず。。。 あとこのブログではAndroid Thingsとかいう「実績」があるので話半分で読んでいただけるとありがたい。

f:id:masato-ka:20190829220337j:plain
いろんなアクセラレータがあるが何が違うのか。。。

2. 比較対象のエッジAIアクセラレータについて

比較する対象は以下のボードである。現在個人でも入手が容易で利用時の取り回しが良さそうなものを恣意的にピックアップした。名称の粒度もボードだったりチップだたりまちまちだけど自分の呼びやすさで書いている。(免責事項)

  1. Coral Edge TPU
  2. Neural Compute Stick 2 (NCS2)
  3. K210
  4. Jetson Nano

今回はFPGAについてはちょっと毛色が違うので扱わない事にした。またSpressensなどについては後述するがAIアクセラレータは入っていないと判断した。(もし専用の処理回路が入っていれば指摘してほし。) それぞれについて簡単に紹介しておく。  

2.1 Coral Edge-TPU(USB/Board)

GoogleディープラーニングアクセラレータであるTPUのエッジ版となる。USB3.1接続のドングルCoral Dev Boardと呼ばれるRaspberry Piライクなシングルボードコンピュータが存在する。USB接続の場合は3.1接続以外でも利用できるが処理速度が多少落ちるという話もある。

  • 参考

Edge TPU USB Acceleratorの解析 - Operationとモデル構造 - Qiita

2.2 Neural Compute Stick 2

Intel社が出している、 Myrad X VPUを搭載したUSB接続タイプのアクセラレータだ。後述するがTensorFlowやCaffeなどのフレームワークに対応し、IntelOpenVINOという開発環境で開発することができる。以後NCS2と呼ぶ。

2.3 K210

中国のKendryte社のRISC-Vプロセッサである。KPUというディープラーニング用のアクセラレーション機能が入ってる。最近流行りのM5StickVSipeed Maixシリーズに搭載されている。

2.4 Jetson Nano

Jetson Nano はNVIDIATegra X1(Nintendo Switchの中身らしい)で作られたシングルボードコンピュータだ。GPUなのでAIアクセラレータかというと疑問はあるが、用途としては組み込みでのAI処理がメインだと思うのであえてリストに載せている。

 

3. エッジAIアクセラレータの比較

前出のアクセラレータをそれぞれ比較してみる。軸もかなり恣意的だが以下のようなった。しつこいが、Jetson Nanoは基本的にGPUだ。

  • 2019/8/30 コメント欄記載の通り、Jetson Nanoの処理能力を誤記していたため修正
アクセラレータ  Edge-TPU Neural Compute Stick 2 K210 Jetson Nano
処理能力    4TOPS 4 TOPS(NN用に1TOPS) 0.25TOPS〜0.5TOPS 472 GFLOPs(FP16)
浮動小数点計算 - FP16 - FP16,FP32
消費電力 0.5w(1TOPS) 不明 0.3w(0.25TOPS) 5w~10w
開発ツール Edge TPUコンパイラ,Python/C++ API OpenVINO MaixPy(MicroPython) Kモデル用変換ツール CUDAライブラリ
対応フレームワーク TensorFlow Lite Tensor Flow, Caffe, MxNet, Kaldi TensorFlow Lite, Darknet TensorFlow Lite, Keras| TensorFlow, Keras, TensorRT, Pytorch
クラウドサービス GCP AutoML Vison Edge - M5StickVのβサービスあり -
対応モデル(掲載以外も対応あり) InceptionV3, SSD-MobileNetV2(300x300), PoseNet ResNet, SSD-MobileNetV2(300x300), Tiny-YOLOv3, OpenPOSE,UNET Tiny-YOLOv3, MobileNet 特に制限なし
on device学習の可否 物体認識の限定的な転移学習のみ 不可 不可 可能
備考 上記値はおそらくUSBドングルバージョンの値
  • 参考

第 1 回 Jetson ユーザー勉強会 K210 introduction Google Coral Edge TPU vs NVIDIA Jetson Nano: A quick deep dive into EdgeAI performance https://www.taxan.co.jp/jp/pdf/products/topics/ncs2_brochure.pdf Hardware For Every Situation | NVIDIA Developer

それぞれの項目について以下補足していく。

3.1 処理能力と浮動小数点演算

 処理速度ではTOPS(Tera | Tensor Operations per sec )を基準値とした。ただあくまで指標レベルに考えておいたほうがいいかもしれない。後述するが、同じモデル動かすにもアクセラレータによってモデルのどの処理をサポートするか変わるようだ。また実装によっても速度が変わるだろう。Edge TPU、NCS2、K210と続いており、おおよそ感覚的にもこんな感じなんではないだろうか。(2019/08/30 コメント欄記載の通りJetson Nanoについては472GFLOPs(FP16)となる。)

 通常ディープラーニング浮動小数点の演算を行うが、量子化といって、計算速度を上げるため、推論精度をある程度落とし8bit整数などで演算できるようモデルを変換して利用する。そのため、それぞれの値は別途記載がない限り整数演算の能力となる。ただし、NCS2とJetson Nanoは浮動小数点演算をサポートしている点も付け加えておく。

3.2 消費電力

 Edge TPUは1TOPSあたり0.5Wとのことなので、フルで使うと2W程度になるはずだ。対して、K210は0.3TOPSで0.25Wなので、実際の消費電力としては少ないが、効率としてはEdge TPUが良さそう。Jetson Nanoについてはそれでも5W程度で動くのだから効率は結構いいともう。ちなみにNCSの消費電力については公式情報がなかったため割愛する。デバイス単体の電力で見るとK210が小さい。

3.3 開発ツール

エッジAI用アクセラレータを使うためには以下の3種類のツールが必要になってくる。

ディープラーニングフレームワーク

 ディープラーニング用のフレームワークはエッジAIのモデルそのものを作るためのフレームワークだ。今回のデバイスでは全て共通してTensor Flow, Keras利用することができる。またNCS2ではCaffeフレームワークを使うことができる。Jetson NanoについてはUbuntuが動いているので環境を構築すればなんでも動かせるだろう。ちなみにサンプルではPytorchの例が多いようだ。

 ONNXなどでフレームワーク間でモデルを変換してということもできるかもしれないが、ONNX自体各フレームワークでの対応状況がまちまちなようなので、後述のモデル変換の話を考えるとどのフレームワークも制限なく使えるという訳ではないようだ。利用前に、事前の検証が必要そうだ。

モデル変換ツール

 Jetson Nano以外のエッジAIアクセラレータを利用するためには各アクセラレータに合わせてAIのモデルを変換する必要がある。そのためのツールがモデル変換ツールだ。モデル変換のツールについてはもちろん各アクセラレータごとに用意されている。注意したいのは各アクセラレータごとに、サポートしている処理が違う点だ。ここでいう処理とは畳み込み層やプーリング層、ReLu関数、全結合層、Softmax関数といったデープラーニングのフレームワークでネットワーク記述する際に用いられる各関数のことを指す。乱暴にいうとこの対応処理に違いがあるため、アクセラレータごとに実行できるディープラーニングのモデルが変わってくる。CNN以外は割と難しいのではないだろうか。

 例えばEdge TPUの場合は、Tensor Flowで作成したモデルを量子化した上でTensor Flow Lite(tflite)モデルに変換し、Edge TPUのモデルへモデル変換ツールを利用して変換を行う。ニューラルネットワークの入力層から変換を行っていき、変換中にEdge TPU でサポートしていない処理が現れた場合は移行の処理はCPUへフォールバックするようだ。  

 このような場合に、NCS2で利用されるOpenVINOやK210の変換ツールがどうのような挙動をするかまだ調査がついていないが、おそらくEdge TPUと同様か、そのまま変換できないかのどちらかだろう。      また、生成されるモデルのサイズによってはメモリに乗らないなどの問題モデルだろう。この辺りは各アクセラレータの資料をみるのがいいだろう。下記のInterface 2019年8月号に記載されているEdge TPUの解説記事ではEdge TPUの性能を出すための条件が書かれている。このように各アクセラレータごとの癖があると思う。決して万能ではない。

  • 参考

TensorFlow models on the Edge TPU | Coral Release Notes for Intel® Distribution of OpenVINO™ toolkit 2019 | Intel® Software Optimization Guide - OpenVINO Toolkit

推論用API

 モデル変換後は実際にデバイスへモデルをデプロイして推論処理を行う。この時に各デバイスへモデルをロードして推論させる必要がある。Edge TPUは専用のPython/C++ APIが提供されている。NCSではOpenVINOのPython APIを利用できる。K210はMaixPyというMicroPython環境でAPIが提供されている。Jetson Nanoは各フレームワークの推論APIを利用することになる。それぞれのAPIは透過的に各デバイスの制御を行っている。

 ちなみにUSB版のEdge TPUとNCS2は複数本接続することにより、並列で推論させることが可能なようだ。やり方についは以下の記事で@PINTOさんの貴重な記録を確認することができる。

[〜24 FPS] RaspberryPi3をNeural Compute Stick 2(NCS2) 4本 + OpenVINO でブースト MobileNet-SSD / YoloV3 [Core i7なら48FPS] - Qiita

[Multi-TPU / Multi-Model] Coral Edge TPU Acceleratorを3本突き刺して3モデルを非同期で並列推論する (Posenet + DeeplabV3 + MobileNet-SSD) - Qiita

アクセラレータの対応モデルについてはモデルの実装方法と変化ツールの対応状況がキーとなるので、利用したい/実装したいモデルと変換ツールの対応状況を合わせて確認する必要があるだろう。

3.4 AIモデル作成のクラウドサービス

 AIモデルを開発するためには基本的に前述の開発ツールが必要になる。が、Edge TPUについてはGCPのCloud AutoML Vision Edgeというサービスを使い、クラウドサービスに学習用データをアップロードするだけで、Edge TPU対応もデールを自動的に学習、生成させることができる。ただし、物体認識のモデルのみが対象となる。また、K210についてもデータをアップロードするだけでKPU用モデルが出力されるV-TrainingというサービスをM5StickV向けにベータ提供していた。今後、正式版が出るかもしれない。

cloud.google.com

 基本的には転移学習により学習済みでると少量データで学習させるのだが、自前でやるとハイパーパラメータの調整や、学習スクリプトを毎度用意するのがめんどくさいので、こういうサービスを利用できるのはアドバンテージになる。

3.5 On device 学習

 これまでの話は基本的にエッジ側で推論を実行するための話だ。しかしエッジ側で学習させたいユースケースもあるだろう。こういった要望に答えられるのはJetson Nanoしかない。ここが低消費電力で動くパワフルなGPUの醍醐味だと感じる。

 エッジAIアクセラレータとしてはEdge TPUがMovileNet v1用の学習が行える。学習といっても最終段の全結合層のみをCPUで学習させて使えるようにするだけなんじゃないかと思う。試した訳ではないが、簡単な画像分類だったらできそう。

Retrain a classification model on-device with backpropagation | Coral

Retrain a classification model on-device with weight imprinting | Coral

4. その他番外編

 エッジAIでは必ずしもアクセラレータを必要とする訳ではない。処理速度を問わなければRaspberryPi 3B+を使うというのも手かもしれない。また、IdeinのActcastを使うとRaspberry Pi Zeroでの30FPS以上で物体認識やPoseNetを動かすことができる。また、SonyのSpressenseもディープラーニングモデルを実行することができる。こちらはSonyクラウドサービス、Neural Network Consoleで生成したモデルをSpressense用に変換することで利用することができる。

masato-ka.hatenablog.com

 今回は取り上げなかったがTensor Flow Lite for microcontrollerといった、ARM M0 CPUで動かせるモデルをC++のコードとして生成するフレームワークもある。

5. まとめ

 で、エッジAIやるには何を選べばいいのか?個人的にはとにかく、組み込みでAIっぽいことしてみたいと思ったらJetson Nanoで遊んでみるのが一番いいんじゃないかと思っている。一番制約なくパワフルに使えるからだ。その分消費電力も大きい。価格は1万2千円程度とコストパフォーマンスは良い。  

 物体検出や認識を動かしたいのであればEdge TPUのUSB版もいいだろう。ただしUSB 3.1で真価をはっきするようなのでRaspberry Pi3B+がホストだと辛い。Jetson Nanoに挿してもいいだろう。Coral Dev Boardを使ってみるのもいいかもしれない。価格はUSBドングルで1万円、Dev Boardで1万8千円するのでJetson Nanoに比べると割高感はあるかもしれない。ただUSBアクセラレータの場合は好きなシングルボードコンピュータをAI対応できる魅力がある。

   NCS2は対応モデルやフレームワークの数で言えばEdge TPUより優れているだろう。またIntel のOpenVINOも強力なツールなので、USBドングル式のアクセラレータの選択肢に入れて良いだろう。

 バッテリーで動くお手頃サイズのデバイスを作りたければ K210を搭載したM5StickVやSipeedのボードを買うのが良いのではないだろうか3000円程度からデバイスが手に入っる。もちろん、Spressensを買うのもありだろう。

 どんなモデルを使いたいのか、つまりアクセラレータと変換ツールの対応状況を検討し、動作させるシュチュエーションや電力などのリソース、価格に注意して選択するのが良いと思う。