以下の記事は,OpenVinoの登場などによって状況が変わりつつあるようです。最新の技術動向を自力で調査して、判断を行なってください。
NVIDIAのボードも、TensorRTを使う前提での評価を加えて比較して見てください。
特に、機械学習の入力をMIPIのCSIを使う前提で、CPUを介さずに検出結果を受け取る場合についての可能性も検討してみてください。
入力画像の処理からCPUが解放されることの意義は大きかったりします。
さらに、Ultra96ボードの登場によっても、FPGAボードでの開発がさらに加速されるでしょう。
FPGA実装について言えば、NNgenの可能性も選択肢に加わってきました。
NNgen の概要がわかる記事(高前田さんによる)
- NNgen と FPGA で作るニューラルネットワーク・アクセラレータ (1)
- NNgen と FPGA で作るニューラルネットワーク・アクセラレータ (2)
- NNgen と FPGA で作るニューラルネットワーク・アクセラレータ (3)
- NNgenとFPGAで作るニューラルネットワーク・アクセラレータ (4)
- NNgenとFPGAで作るニューラルネットワーク・アクセラレータ (5)
画像処理・画像認識を高速化しようとすると、どのようなアプローチをすべきなのか迷うことがあります。
そこで役に立つ資料を見つけたので、参考までにメモを残します。
並列化処理については、それを専門とする方々が多数いらっしゃるので
このメモを読むよりは、それらの方の作成された資料を直接読むことをお勧めします。
デスクトップで電源とファンの心配をしなくていい分野と
組み込みでバッテリーの心配がいる分野では、最適な選択が異なります。
また、そのシステムを何台作るのかによっても最適な選択は異なります。
FPGAとASICでは生産台数が相当な規模にならない限り、ASICを新たに起こす利点はありません。しかも、FPGAの側が有利な台数は、FPGA技術の進展により増加しています。
しかし、システムに必要なものを既存のASICを流用するときには、少ない台数でも追加コストは発生しません。
ですから、画像処理を含むCPUは、どんどん少数のASICに集中している傾向があります。かつては、デジタルカメラメーカ自体が画像処理のASICを開発していることが多かったようですが、今では、専業の画像処理のASICメーカーのチップや、携帯電話用のチップを利用していることが増えているようです。
CPU, GPU, FPGA, ASICをめぐる争いは、使用するアルゴリズムの組み合わせとともに、状況が著しく変わります。
最新の状況を、検索して見てください。
slideshare 「マルチコアを用いた画像処理」
slideshare 2値化CNN on FPGAでGPUとガチンコバトル(公開版)
私見:
・mapに分類されるパターンでは、SIMD命令が効果的らしい。演算とデータ転送では、データ転送のコストが大きいために、GPUで処理したときにCPUのSIMDやOpenMPなどに打ち勝つことができない。
LSI設計でCPUに独自の演算を追加できるような場合は、SIMD演算を追加するようなものと見ることができるのだろう。
・画像認識でもフレーム間で独立な処理ならば、マルチコアで別スレッドで動作させることで並列性を向上させる方法がある。
(ただし、1つのフレームに対して既にマルチコアによる並列性を利用している場合には、効果は望めない)
・インテルのCPUの場合、「インテル Parallel Studio」を使ってみることを考慮すべきらしい。
・FPGAが利用できるZynqデバイスでも、ARMコアのNEON命令による高速化は考えるべきらしい。
・専用回路をFPGAで自作するのは、それによる高速化が10倍程度の場合にはFPGA化しないことも考えたほうがよいらしい。アルゴリズム自体の改善で、同程度の改善が数年で達成する場合があるからだそうだ。(どこかの記事でそういっていた。)
・汎用的な線形代数の高速化の場合だと、そのアーキテクチャ用の適切なライブラリを選ぶことだけを考えるべきであって、自分で改良をできる場合はそう多くないはずだ。
追記:
ソフトウェアによる画像処理の記述には、改良の余地がかなりあることを次の記事から知りました。
- qiita Halide入門とOpenCVとの比較
例えば入力画像を二乗して20を足すコードを書くとします.
計算の結果,
OpenCVは73 ms
Halideは9.8ms
と圧倒的な違いがありました.
ここに記載していたメモは、次の記事にいたしました。
高速な画像処理用言語 Halideについて調査中
OpenCV のcv::Mat型に関して言えば、各画素に対するアクセスを含むコードを書いている場合、
次の記事を参考にしてはいかがでしょうか?
qiita cv::Mat::forEachを使った高速なピクセル操作
また、画像処理で2重ループをなるべく書くな も考量に入れておいてください。 2重ループを何も考えずに、書いているとOpenCVのライブラリ関数の方が格段に速い結果になっていることがあるのも視野においてください。
参考資料
qiita 「雨の中、Cを書かずにPythonで並列計算をする人間がいてもいい。自由とはそういうものだ。」
コンパイラによる最適化
書籍 「構造化並列プログラミング―効率良い計算を行うためのパターン 」
FPGAによる最適化
-
qiita ニューラルネットワークをFPGA実機で動かした
-
FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(ZYBOとDE0-Nano-SoCのデュアルブートに対応)
インテル® FPGA マシーンラーニング (機械学習)
Intel® Distribution of Caffe
Alteraのロゴはもう使われていなく、Intelのロゴが使われています。
インテルは、FPGA の専門家になる必要なく、推論 (スコアリング) 用 CNN トポロジーを超低消費電力で実装する FPGA アーキテクチャーの柔軟性を利用するために、Deep Learning Accelerator FPGA IP (Intellectual Property) を提供しています。FPGA にロードされたこの IP により、DAAL (Data Analytics Acceleration Library) に入っている Intel® Caffe、および Intel® MKL-DNN を利用して、FPGA を再コンパイルせずに ALexNet や GoogleNet のようなトポロジーを構築できます。
-
qiita マルチコア、GPGPU、FPGA
-
qiita Xillybus and ROS on Ubuntu14.04 on Zybo Part 4 : Zybo上における設定~ROSのインストール
-
qiita そろそろプログラマーもFPGAを触ってみよう!
-
qiita FPGAでDeep Learningしてみる
PYNQ
Xilinxのオープンソースプロジェクトで、XilinxのZynqに実装したFPGAロジックを、Pythonから簡単に使えるようにするためのもののようです。
AIやビッグデータの進化を加速させる半導体はGPUか? FPGAか? CPUか?
slideShare Polyphony: Python ではじめる FPGA
slideShare PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
slideShare 研究者のための Python による FPGA 入門
追記 以下の記事が参考になりそうだ。
-
2017年4月号 目次 から物理学実験用の小型スパコンの世界 今どき浮動小数点演算ワールド
中里 直人,台坂 博,石川 正 -
Interface2017年5月号 目次 から FPU付きFPGAで広がる高性能コンピューティングの世界 小型津波スパコン大解剖 佐野 健太郎
「FPGAマガジン No15
手のひらFPGAボードですぐに試せる!
車に農業!?AI時代のチャレンジ!リアルタイム動画認識」
FPGAは、10年前に比べると格段に使いやすくなっている。
- 評価ボードの値段が画期的に安くなった
- ARMコアが標準的に入っていて、ARMコアとFPGA間のバスも標準化されている。
- OpenCVの代表的な関数について、既にFPGA用のデザインが用意されている。
- RTLを書かずに、C/C++のインタフェースからOpenCV互換のIPを利用できるようになっている。
LSI/FPGAの回路アーキテクチャ設計法【オンデマンド版】
画像処理(あるいは、画像認識とそれをふまえた画像処理)を設計するための作業について、実例を用いながら紹介している貴重な情報源である。
顔検出処理を色情報にもとづく単純なアルゴリズムでの例とすることで、書籍として共有できるものにしている。
回路設計において、並列性を重視する度合いによって、回路構成のしかたが変わってくる。
FPGA関連の記事があるサイト
http://monoist.atmarkit.co.jp/mn/subtop/features/fpga/
http://fpga.cqpub.co.jp/
OpenCL関連
OpenCLをGPUで顔検出に使った動画
OpenCL face detection
参考イベント
これらのイベントでは、発表資料のスライドを公開しているものがあります。それらをたどると参考になる記事を見つけることができます。