Movidius Neural Compute Stick(NCS)の実行環境構築方法です。
先日、とてもありがたいことにブログ経由で知り合った方からNCSを1台譲って頂きました。すごい!“キュウリ選別機の開発に使って下さい”とのことで、とてもありがたく早速開発に活用していこうかなと考えているところで、まずは開発環境構築からです。
Movidius NCSとは
Movidius Neural Compute Stick(NCS)とは、ニューラルネットワーク処理の大部分の計算を行うための12個のvector VLIW(“SHAVE”と呼ぶ)を持つプロセッサーです。NCSは、16ビット浮動小数点でニューラルネットワークステージを実行します。
NSCは、エッジ端末でディープラーニングによる推論を高速に実行するためのモジュールです。よって、学習フェーズはサポートしておらず、学習は別途GPUなどを積んだマシンで実施する必要があります。NSCは、学習した結果である学習済みモデル(Caffeフォーマット)をGPUを積んでいないノートPCやラズパイなどで高速実行するために使用します。
追記(10/12):SDK Ver1.09.00からTensorFlowのckptファイルも対応するようになりました
https://github.com/movidius/ncsdk/releases
環境構築(SDK Ver1.09.00の場合)
SDK Ver1.09.00からインストーラがgithubで管理されるようになりました。それに伴いインストール方法も変わっているので追記します。
$ git clone http://github.com/movidius/ncsdk $ cd ncsdk $ make install
自動的に依存パッケージなどがインストールされますが、NCS対応バージョン以外のパッケージがインストールされていた場合は、NCS対応バージョンに強制的に置き換わるっぽいので注意。(私の環境では、Tensorflowが1.3.0へ、Numpyが1.13.1へバージョンダウン)
環境構築(SDK Ver1.07.00の場合)
ひとまずデスクトップPCで動かしてみました。
・デスクトップPC(CPU i5@3.2GHz, MEM:24GB)
・Ubuntu 16.04
※USB3.0ポート推奨だがUSB2.0でも動いた
SDKインストール
下記よりSDKをダウンロードします。
https://ncsforum.movidius.com/discussion/98/latest-version-movidius-neural-compute-sdk
ダウンロードしたら下記に従い、MvNC ToolkitとMvNC API frameworkをインストールする。
https://developer.movidius.com/start/software-setup
※注意:MvNC Toolkitをインストールした後、一度ターミナルを閉じ新たなターミナルを起動してからMvNC API frameworkをインストールすること。
インストール時間は20分ほど。これだけで開発環境は構築できるらしい。とても簡単!
Toolkitについて
NSCには3つのツールが付属しています。
SDK Ver1.07まではCaffe形式のみのサポートでしたが、SDK Ver1.09からTensorFlowにも対応しました。
mvNCCompile
コンパイラです。ネットワーク構成と重みをNCSで実行可能なバイナリに変換する。
<SDK 1.07> $ python3 ./mvNCCompile.pyc <network.prototxt> [...] <SDK 1.09> Caffeの場合 $ mvNCCompile <network.prototxt> [...] TensorFlowの場合 $ mvNCCompile <network.meta> [...]
下記のオプションがあります。
-w <weights file>
重みファイルの指定
-s <MAX number of shaves>
使用するSHAVEの最大値。1,2,4,8,12が指定可能。デフォルトは1。
-in <input node name>
入力ノードの指定。デフォルトでは、ネットワークの始点となるが、ネットワークの別の開始点を指定したい場合は、このオプションを使う。
-on <output node name>
出力ノードの指定。デフォルトでは、ネットワークの終端となるが、ネットワークの別のエンドポイントを指定したい場合は、このオプションを使う。
-is <in.width> <in.height>
入力テンソルの次元に制約を持たないネットワークの場合、このオプションを使用して、希望の入力次元を設定することができます。
-o <path>
出力先ファイル名。デフォルトは”graph”
mvNCCheck
チェッカーです。チェッカーは、NCSの推論を実行し、分類の正確さを検証します。NCS出力(Result)とCaffe/TensorFlow出力(Expected)の両方について、トップ5分類インデックスとその確率を出力します。
<SDK 1.07> $ python3 ./mvNCCheck.pyc <network.prototxt> [...] <SDK 1.09> Caffeの場合 $ mvNCCheck <network.prototxt> [...] TensorFlowの場合 $ mvNCCheck <network.meta> [...]
オプションはmvCCompileに加え、下記が指定できます。
-i <image>
検証に使用する画像を指定できます。デフォルトでは、ランダムに生成された画像を使って検証を行います。
-id <number>
検証結果として期待するクラスID(正解ラベル)が指定できます。
-S <number>
入力値をスケール(正規化?)させる量。例えば、入力値が0-255を取る場合は255を指定します。デフォルトは1で、入力値は0-1の範囲でなければなりません。
-M <number or numpy file>
入力値からこの値を引きます(スケールさせた後に)。例えば、ネットワークが入力画像から平均ファイルを減算すること(前処理)を期待している場合は、ここに入力してください。
-cs <Color Sequence>
【SDK 1.09からのサポートです】
入力画像のカラーチャンネルの順番を指定します。
2,1,0: BGR (Default)
0,1,2: RGB
mvNCProfile
プロファイラです。あなたのネットワークがNSC上でどのように動作しているかに関するレイヤごとのパフォーマンス統計を生成する。
<SDK 1.07> $ python3 ./mvNCProfile.pyc <network.prototxt> [...] <SDK 1.09> Caffeの場合 $ mvNCProfile <network.prototxt> [...] TensorFlowの場合 $ mvNCProfile <network.meta> [...]
※使用できるオプションはmvNCCompileと同じです。
mvNCProfileは実行後に下記のようなニューラルネットのレイヤー図を出力してくれます。
サンプルを動かしてみる
こちらもVer1.09.00から変更。
SDK Ver1.09.00の場合
NCSをUSBポートに刺して、下記を実行。
$ make examples
SDK Ver1.07.00の場合
手順は下記参照。
https://developer.movidius.com/start/compile-networks-using-the-toolkit
初めにdlnets.shを実行すると、AlexNetやGoogLeNetなどのcaffemodelがダウンロードされます。
ダウンロードが終わったら実際に動かしてみることができます。
NSCをUSBポートに接続して”dmesg | tail”コマンドを打つと、下記のようにMovidiusが認識されていることが確認できます。
ちなみに一応”lsusb”でも確認できますが、メーカー名など何も表示されませんでした。
サンプル実行
$ make example00
コンパイラ(mvNCCompiler)のサンプルになります。コンパイラは、CaffeのprototxtファイルをNSCで実行可能なバイナリに変換します。
実行するとターミナルに下のように出力されます。
このサンプルでは、data/lenet8.prototxtをコンパイルしているようです。”-s”オプションは、使用するSHAVEの最大値です。
実行結果として、”graph”ファイルが生成されていることが確認できると思います。
$ make example01
プロファイラ(mvNCprofile)のサンプルになります。GoogLeNetを使った推論を行った場合の各層の処理時間などが確認できます。
実行するとターミナルに下記のように出力されます。
上記画像では途中で切れていますが、トータルの推論にかかる時間は88.56msでした。おぉ速い(私のメインマシンCPU i5よりは)!
$ make example02
こちらもプロファイルのサンプル。LeNet8を使用します。
実行結果は、1.44msでした。
$ make example03
チェッカのサンプルです。
実行するとターミナルに下記のように出力されます。
ResultがNCSの推論結果で、ExpectedがCaffeの推論結果です。Top1は、どちらもラベル0という結果で一致していることが確認できます(それ以外はほぼ0)。
取り敢えず今回はここまで。
次回は、ラズパイでの実行とPython API周りについて調べた結果を書きたいと思います。
では〜。
次回:Movidius NCS環境構築(RasPi3編)