2018年6月21日木曜日

[VX2] Movidius Neural Compute Stick (Myriad2) NCSDK2の導入方法

Movidius Neural Compute Stickは、VPUと呼ばれる、ディープラーニング推論のためのアクセラレータです。
本製品は、Movidius Myriad2 VPUを使用したもので、開発用としてUSBスティックタイプのものが用意されています。

今回の記事は、本製品のSDKである、NCSDKの最新バージョンである、V2.04をOpenBlocks IoT VX2(VX1)で利用するためのTipsとなります。
( 2018/7/11 時点では、2.0.5がリリースされており、Bug Fixに記述がありませんが、アプリケーション実行後の再起動時にdevice Stalledの状態になった場合、デバイスが復帰するようになりました。
2018/7/15 追記 2.05においては、別の致命的なエラーが出ることを確認しています。現状では1.x系を使った方がいいかもしれません。
)

Intel® Movidius | Neural Compute Stick | AI Programming



OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks IoT VX2 FW3.1



1. ncsdk2のインストール

ncsdk v2のブランチを利用するには、以下のように指定します。

git clone -b ncsdk2 https://github.com/movidius/ncsdk.git

先に、ncsdkディレクトリ下で

./install.sh

とするのですが、NCSDKは、Ubuntu16.04またはRasbian9に対応していますが、debian9などの他のディストリビューションには対応していません。
そのため、今回はRasbian9と認識させてインストールさせます。
install.shの以下の部分(30行目以降)に変更を加えます。

#    OS_DISTRO="${DISTRO:-INVALID}"
#    OS_VERSION="${VERSION:-255}"
    OS_DISTRO="raspbian"
    OS_VERSION="91"

このスクリプトが終了したら、apiの下で、

make install

として、sdkをインストールしてください。

・tensorflowについて

インストールは一通り終わりますが、インストールされたpython用のtensorflowはno gpuバージョンであっても、現在配布されているバージョンのモジュールはAVX命令をenableとしてビルドしているため、そのままでは使用できません。
tensorflowは別途SSE2のみでビルドする必要があります。
(VX2でセルフコンパイルをするのはリソース的に厳しいため、他のdebian/amd64のPCなどでwhlファイルを作成することをおすすめします)

bazelを使ったインストールはtensorflowのサイトのfrom Sourcesに従って行います。

Installing TensorFlow from Sources

bazelをAPT repositoryよりインストールした場合は、0.14.1がインストールされますが、tensorflowのサイトサンプルのようにgit checkout r1.0のように指定すると、古いリリースのものがcheckoutされてbazelの古いバージョンのものが必要となります。

git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout v1.9.0

tensorflow-hubなども使えるよう、新しいリリースのものをcheckoutします。
bazelのオプションは今回は以下のように設定しました。

bazel build -c opt --copt=-msse4.2 //tensorflow/tools/pip_package:build_pip_package

ビルド、パッケージ作成、インストールが終わったら、以下のスクリプトがエラーなく動作することを確認してください。

# Python3
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

ここで、warningが出る場合は以下のモジュールアップデートが必要です。

pip3 install --upgrade h5py

・OpenCVについて

opencvもそのままでは不完全にインストールされるため、別途ソースコードからインストールしなおすか、暫定でpython対応だけでよいならば、

pip3 install opencv-python

としてインストールしてください。

opencvをビルドする場合のcmakeのオプションのサンプルは以下の通りです。

cmake -G "Unix Makefiles" --build . -D BUILD_CUDA_STUBS=OFF -D BUILD_DOCS=OFF \
-D BUILD_EXAMPLES=OFF -D BUILD_JASPER=OFF -D BUILD_JPEG=OFF -D BUILD_OPENEXR=OFF \
-D BUILD_PACKAGE=ON -D BUILD_PERF_TESTS=OFF -D BUILD_PNG=OFF -D BUILD_SHARED_LIBS=ON \
-D BUILD_TBB=OFF -D BUILD_TESTS=OFF -D BUILD_TIFF=OFF -D BUILD_WITH_DEBUG_INFO=ON \
-D BUILD_ZLIB=OFF -D BUILD_WEBP=OFF -D BUILD_opencv_apps=ON -D BUILD_opencv_calib3d=ON \
-D BUILD_opencv_core=ON -D BUILD_opencv_cudaarithm=OFF -D BUILD_opencv_cudabgsegm=OFF \
-D BUILD_opencv_cudacodec=OFF -D BUILD_opencv_cudafeatures2d=OFF -D BUILD_opencv_cudafilters=OFF \
-D BUILD_opencv_cudaimgproc=OFF -D BUILD_opencv_cudalegacy=OFF -D BUILD_opencv_cudaobjdetect=OFF \
-D BUILD_opencv_cudaoptflow=OFF -D BUILD_opencv_cudastereo=OFF -D BUILD_opencv_cudawarping=OFF \
-D BUILD_opencv_cudev=OFF -D BUILD_opencv_features2d=ON -D BUILD_opencv_flann=ON \
-D BUILD_opencv_highgui=ON -D BUILD_opencv_imgcodecs=ON -D BUILD_opencv_imgproc=ON \
-D BUILD_opencv_java=OFF -D BUILD_opencv_ml=ON -D BUILD_opencv_objdetect=ON \
-D BUILD_opencv_photo=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON \
-D BUILD_opencv_shape=ON -D BUILD_opencv_stitching=ON -D BUILD_opencv_superres=ON \
-D BUILD_opencv_ts=ON -D BUILD_opencv_video=ON -D BUILD_opencv_videoio=ON \
-D BUILD_opencv_videostab=ON -D BUILD_opencv_viz=OFF -D BUILD_opencv_world=OFF \
-D CMAKE_BUILD_TYPE=RELEASE -D WITH_1394=ON -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF \
-D WITH_CUFFT=OFF -D WITH_EIGEN=ON -D WITH_FFMPEG=ON -D WITH_GDAL=OFF -D WITH_GPHOTO2=OFF \
-D WITH_GIGEAPI=ON -D WITH_GSTREAMER=OFF -D WITH_GTK=ON -D WITH_INTELPERC=OFF -D WITH_IPP=ON \
-D WITH_IPP_A=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LIBV4L=ON -D WITH_OPENCL=ON \
-D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=ON \
-D WITH_OPENGL=ON -D WITH_OPENMP=OFF -D WITH_OPENNI=OFF -D WITH_PNG=ON -D WITH_PTHREADS_PF=OFF \
-D WITH_PVAPI=OFF -D WITH_QT=ON -D WITH_TBB=ON -D WITH_TIFF=ON -D WITH_UNICAP=OFF \
-D WITH_V4L=ON -D WITH_VTK=OFF -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D WITH_XINE=OFF \
-D WITH_LAPACKE=ON -D WITH_MATLAB=OFF ..


・NCSの動作確認

NCSデバイスを認識すると、hello_ncs.pyの結果が以下のように表示されます。

#cd ~/ncsdk/examples/apps/hello_ncs_py
# python3 hello_ncs.py
D: [         0] ncDeviceCreate:221      ncDeviceCreate index 0

D: [         0] ncDeviceCreate:221      ncDeviceCreate index 1

D: [         0] ncDeviceOpen:415        File path /usr/local/lib/mvnc/MvNCAPI-ma2450.mvcmd

I: [         0] ncDeviceOpen:421        ncDeviceOpen() XLinkBootRemote returned success 0

I: [         0] ncDeviceOpen:450        XLinkConnect done - link Id 0

D: [         0] ncDeviceOpen:464        done

I: [         0] ncDeviceOpen:466        Booted 1.1-ma2450 -> VSC

I: [         0] getDevAttributes:287    Device attributes

I: [         0] getDevAttributes:290    Device FW version: 2.4.2450.e4

I: [         0] getDevAttributes:292    mvTensorVersion 2.4

I: [         0] getDevAttributes:293    Maximum graphs: 10

I: [         0] getDevAttributes:294    Maximum fifos: 20

I: [         0] getDevAttributes:296    Maximum graph option class: 1

I: [         0] getDevAttributes:298    Maximum device option class: 1

I: [         0] getDevAttributes:299    Device memory capacity: 522081584

Hello NCS! Device opened normally.
I: [         0] ncDeviceClose:656       closing device

Goodbye NCS! Device closed normally.

NCS device working.



2.ncappzooのv2用ブランチの入手

ncappzooもv2用のブランチが用意されています。
以下のオプションにてgit cloneしてください。

git clone -b ncsdk2 https://github.com/movidius/ncappzoo.git

READMEに従って必要なgraphファイルを作成するとともに、gstreamerなど、要求されるモジュールは別途インストールしてください。

また、opencvは、linuxで利用する場合は、ディスプレイとしてXを使います。
OpenBlocks IoT VX2(VX1)にはディスプレイヘッドはありませんので、Xサーバを別に用意する必要があります。


stream_inferの実行例
( 液晶モニタがmonitorとして認識されている )


3.最後に

ストレージ(eMMC)の制約から、VX2でなくVX1を使う場合は、外付けのUSB HDDなどを使用して環境のビルドを行ってください。
また、セルフビルドを行う場合、以下のようにTMPDIRの設定が必要な場合があります。

export TMPDIR=/var/tmp

なお、本SDKおよびサンプルアプリケーションであるncappzooをインストールしたdockerコンテナを作成しておりますので、別途公開する予定です。