Intel Movidius NCS をRasPi ZeroWで使ってみた話です
はじめに
Intel Movidius NCSを手に入れた。正式名称はIntel Movidius Neural Compute Stickというらしいです。
こいつをUSBポートにぶっさすと、DeepLearningを高速化してくれるという代物です。
当たり前ですが、何でもかんでも高速化出来るわけではなく、ディープラーニングの領域のうち、トレーニングは無関係です。トレーニングしたモデルを使った推論部分を高速化します。トレーニングによって出力されたモデルを、専用のSDKで提供されるコマンドを使ってNCS用にコンパイルして使います。
ですので、既存のソースコードそのまんまで、挿すだけで高速化という訳ではありません。また、対応しているディープラーニングフレームワークはCaffeかTensorFlowの二つになります(2018.09時点)。
こいつを手に入れて、まずはRasPi3で動かしてみました。とりあえず簡単なサンプルが動いたところで、どうせエッジコンピューティングやるなら、もっと安価で小型のラズパイゼロでやってみたいなぁという思いに駆られ、気がつけばAmazonでRasPi Zeroをポチっていました。こうして修羅の道に足を踏み入れてしまったのです。
今回やりたいこと
ラズパイゼロでディープラーニングを(そこそこ)高速に動かしたい。
流れ
- 学習用の環境構築(Docker for Windowsを使用した)
- RaspiZeroに推論実行用の環境構築
- 学習環境でトレーニングし、モデル出力(Kerasを使用)
- KerasモデルをTensorflowモデルに変換
- mvNCComplileコマンドを使ってTensorflowモデルをMovidius用にコンパイル(graphファイルが出力される)
- graphファイルを推論実行環境(RaspiZero)にデプロイ
- RaspiZeroで推論を行う
ざっくりこんな流れです。ようやくRaspi3でできていたレベルに追いつきました。本当にやりたい事(自分で何か作ってエッジで動かす)はここからですので、頑張ります。
力尽きたので、気が向いたら流れの詳細を書き足していきます。
解説
ネットにもなかなか情報がありませんでしたが、そもそもRaspberry Pi ZeroではNCSDKでのモデルコンパイルはできない事が分かった。でも、変換済みモデルを使って、MovidiusNCSでの実行(推論)はできる。
よって、学習&NCSDKモデル変換用の環境が別途必要になる。面倒だったが、そもそも本気でやるときは学習環境と推論実行環境は異なることになるので、よしとした。
ハマったポイント
- Movidius NCSDKのインストール方法がいろんなサイトに書かれているが、なんかGithubリポジトリがつながらなくなっていて、代わりにtarファイルをAmazonS3から取得する手順になっていたこと。git cloneに失敗するので、ブラウザで見てみて気づきました。どうも暫定的っぽいですが。
- NCSDKが新しくV2が登場しているが、ネットの記事はV1のものも多く混乱した。
- TensorFlowそのままではなく、Kerasを使いたかったが、MovidiusはCaffeかTensorFlowにしか対応していないのでKerasモデル→TensorFlowモデルへの変換が必要になりました。
- 当初、RaspiZeroにMovidiusをぶっさすと再起動が走り、はまりました。結局USBバスパワーの電力不足だったようで、ACアダプタ付きのUSBハブを間に挟むことで解決しました。
- (その後の追記)電力不足については、USBからの給電がデフォルトでは600mAらしく、1200mAに変更することでハブ無しで動くようになりました。やり方は、/boot/config.txtに、max_usb_current=1の設定を追記してラズパイを再起動するだけ。
- Windows+Dockerの構成だと、ホスト側のUSBを認識させることができないので、Movidiusを挿して推論実行させることはできません。Docker Toolboxを使うとか、VirtualBoxでUbuntuのVMを起動して、とやればできるが、Docker for Windowsと共存できない(Docker使うときとVirtualBox使うときでいちいち設定を変更して再起動しないといけない)ので断念しました。ホント、最近の開発ではWindows使うとMacと比べてムダな作業が増えることが多い気がする。
参考にしたサイト
How to run Keras model on Movidius neural compute stick | DLology
主にこのサイトを参考にしました。使用するTensorFlowのバージョンが新しいので、Pythonコード中のKerasのimport部分を変更する必要があります。
from keras import layers, models
とかを、
from tensorflow.python.keras import layers, models
に変更します。