はじめに
写真、ビデオ、テキストを分析するためのディープニューラルネットワークを開発しています。 先月、プロジェクトの1つに非常に興味深いギズモを購入しました。
Intel Movidius Neural Compute Stick 。
これは、ニューラルネットワークコンピューティング専用のデバイスです。 実際、ニューラルネットワーク用に研ぎ澄まされた外部ビデオカードは非常にコンパクトで安価です(〜$ 83)。 Movidiusを使用した最初の印象を共有したいと思います。 猫の下で興味を持っている皆にお願いします。
デバイスの計算能力
コンピューティングに関しては、ニューロンは非常に貪欲です。ニューロンはトレーニングにGPUを必要とし、実際のタスクで使用するにはGPUまたは強力なCPUも必要です。 Movidius NCSでは、たとえばRaspberry Pi、DJI Phantom 4、DJI Sparkなど、元々このために設計されていないデバイスでディープニューラルネットワークを使用できます。 予測段階(事前トレーニング済みネットワークの推論)についてのみ話している:Movidiusでのニューラルネットワークのトレーニングはまだサポートされていません。
チップのパフォーマンスは約100ギガフロップス、10 ^ 9 FLOPSです(これはおおよそ90年代初期のトップスーパーコンピューターのレベルに相当し、現在は約数百ペタフロップス、10 ^ 15です)。
参考:FLOPSは、1秒あたりの浮動小数点オペランド(FP)で実行される計算操作または命令の数です。 トピックを深くするために、Intelの記事をお勧めします 。
ハードウェアはMyriad 2チップに基づいており、Myriad 2構成には12個の特殊なプログラム可能なベクトルプロセッサが含まれています。 SoCコンポーネントは、最小限のレイテンシで動作する高速内部接続に接続されます。 Myriad 2は、モバイルデバイスのアプリケーションプロセッサと共にコプロセッサとして、またはウェアラブルまたは組み込みの電子デバイスのスタンドアロンプロセッサとして配置されています。
無数の2プロセッサ自体
さて、フラッシュドライブのフォームファクター(Neural Compute Stick)では、たとえばRaspberry Piと一緒に、ドローンにニューラルネットワークを埋め込むために使用できます。
NCSで最初のプログラムのインストールと起動を開始しましょう
何が必要ですか
- Intel Movidius。 リンクでどこで販売されているかを知ることができます。 アマゾンに乗りました。
- Ubuntu 16.04 LTSまたはRaspbian OS。 正式にサポートされているのはそれらだけですが、原則として、他のLinuxでも同様に使用できます。
- 会社の公式リポジトリのSDK。 コンソールからさらにダウンロードします。
- TensorflowまたはCaffeからエクスポートされたバイナリとニューラルネットワークの重みのグラフ。 Movidiusの最新バージョンは、TensorflowまたはCaffeモデル形式のみをサポートしています。 標準の例を実行するため、グラフを自分で作成する必要はありません。
準備する
MovidiusをUSB 3.0コネクターに接続します。 次に、コンソールに書き込みます。
$ git clone https://github.com/movidius/ncsdk.git $ cd ncsdk $ sudo make install
これらのコマンドはインストールします:
- NCSライブラリ→/ usr / local / lib
- NCS Toolkitのバイナリ-> / usr / local / bin
- NCSインクルードファイル-> / usr / local / include
- NCS Python API-> / opt / movidius
また、PYTHONPATHにMovidiusのPythonライブラリへのパスを追加します。
例を実行する
同じフォルダーで、コマンドを実行して例をビルドします。
$ make examples
ImageNetでトレーニングされたinception_v1の実装である標準的な例を準備するには、次のコマンドを実行します。
$ cd examples/tensorflow/inception_v1 $ make all
最後のコマンドは、グリッドの説明と既にトレーニングされた重みを使用してバイナリグラフをコンパイルし、Myriad 2 VPUで実行できます。
次に、 テストスクリプトrun.pyを実行します。 スクリプト全体で起こることを簡単に説明します(スクリプトの一部は省略されています)。
# NCS, numpy, sys opencv from mvnc import mvncapi as mvnc import sys import numpy import cv2 #/ / # graph_filename = 'graph' # image_filename = path_to_images + 'mouse.jpg' # NCS-, , # devices = mvnc.EnumerateDevices() if len(devices) == 0: print('No devices found') quit() device = mvnc.Device(devices[0]) device.OpenDevice() # , TensorFlow #( Caffe) with open(path_to_networks + graph_filename, mode='rb') as f: graphfile = f.read() #/ / # graph = device.AllocateGraph(graphfile) # img = cv2.imread(image_filename).astype(numpy.float32) dx,dy,dz= img.shape delta=float(abs(dy-dx)) if dx > dy: #crop the x dimension img=img[int(0.5*delta):dx-int(0.5*delta),0:dy] else: img=img[0:dx,int(0.5*delta):dy-int(0.5*delta)] img = cv2.resize(img, (reqsize, reqsize)) img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB) # for i in range(3): img[:,:,i] = (img[:,:,i] - mean) * std print('Start download to NCS...') graph.LoadTensor(img.astype(numpy.float16), 'user object') # output, userobj = graph.GetResult() # NCS- top_inds = output.argsort()[::-1][:5] print(''.join(['*' for i in range(79)])) print('inception-v1 on NCS') print(''.join(['*' for i in range(79)])) for i in range(5): print(top_inds[i], categories[top_inds[i]], output[top_inds[i]]) print(''.join(['*' for i in range(79)])) graph.DeallocateGraph() device.CloseDevice() print('Finished')
サンプルを収集したら、コンソールでmake allコマンドを入力しました。その後、コンソールに有用な情報が表示されました。たとえば、 Detailed Per Layer Profileを使用して、データがネットワークの各レイヤーを通過する速度を確認できます。 デバッグと最適化に役立ちます。
スクリプトを実行します。
$ python3 run.py
テストイメージはNCSにアップロードされ、Inceptionを通過し、認識結果がコンソールに表示されます(ImageNetデータセットの1000 + 1カテゴリにわたる確率分布)。
コンソール出力
Number of categories: 1001 Start download to NCS... ******************************************************************************* inception-v1 on NCS ******************************************************************************* 674 mouse, computer mouse 0.99512 663 modem 0.0037899 614 joystick 0.00031853 528 desktop computer 0.00021553 623 lens cap, lens cover 0.0001626 ******************************************************************************* Finished
テスト画像
この写真をMovidiusにアップロードし、Inceptionを介して運転しました
〜99%の確実性を備えたネットワークは、コンピューターのマウスが画面にあると信じていることがわかります(私たちのプロンプトのおかげです:))。2番目に0%に近い確信があるのはモデムなどです。 グリッドは正しいので、このデバイスで正常に起動された最初のニューロンをおめでとうございます!
おわりに
最後に、デバイスの主な利点と欠点をリストしたいと思います。
まず、悪いニュース:
- このデバイスは、Raspbian OSまたはUbuntu 16.04 LTSでのみ動作することを公式にサポートしています。
- デバイスとそのSDKは、現在、CaffeおよびTensorflow形式のニューラルネットワークの重みを持つファイルのみをサポートしています。
- デバイスでは、予測(推論)のみを行うことができ、モデルを教えることはできません。
良いニュース:
- Raspberry Piでニューロンを実行できます!
- 非常に単純なpython / c API。
- 低消費電力(1 W)、デバイスはUSBから給電されます。
- このようなコンパクトなデバイスの場合、非常に高速です。たとえば、写真の前処理〜800x800〜Inception_v1の実行には、120〜130ミリ秒かかります。
- すぐに実行できるオープンソースモデル(いわゆるModel Zoo )のコレクションがあります。
- 複数のNCSを一度に接続できることは興味深いことです。これは、ボックスから並行して動作します。 ただし、まだテストしていません。
IntelはMovidiusを使用してコンピューティングを高速化することを提案しています
もちろん、このデバイスにはアナログがあります。
それらの1つ、そしてこれまでで最も有望なのは、生産性が28倍、エネルギー効率が90倍のGyrfalcon Technology Laceliです。 購入の唯一の障害は、デバイスがまだ市場に参入していないことです。
長い間市場に出回っている別の競争相手は、 NVIDIA Jetson TX2です。 違い:
- 非常に異なる価格カテゴリー(559ドル対83ドル)
- 異なる容量(2つのDenver 2 CPUコア、4つのARM Cortex A57コア、および256コアPascal GPUと1つのMyriad 2)
- さまざまなフォームファクター:Jetsonははるかに大きく、NCSはコンパクトです
- 両方のデバイスは同じ問題を解決します-車、ドローンなど、何かにニューロンを搭載するタスク。
興味があれば、Jetson TX2のニューラルネットワークの使用について、近い将来に別の記事を作成します。 ご清聴ありがとうございました
PS Intelは、Intel Movidius Neural Compute Stickのニューラルネットワーク最適化コンテストの開始を発表しました。 登録は1月26日、競技会の終わり-3月15日まで。