cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

OpenCV3.4.2で始める浅いディープラーニング (その7 遅いのでHalide有効化)

テストプログラムを実行してみましたが、実行速度が遅いという不満があります。テストプログラムの引数のいくつかに、使ってこなかったものの気になるパラメータがありました。backendと、targetです。

Choose one of computation backends:
0: automatically (by default),
1: Halide language (http://halide-lang.org/),
2: Intel's Deep Learning Inference Engine (https://software.intel.com/openvino-toolkit),
3: OpenCV implementation

Choose one of target computation devices:
0: CPU target (by default),
1: OpenCL,
2: OpenCL fp16 (half-float precision),
3: VPU

backendの選択肢にあるHalideやIntel's Deep Learning Interface Engineは、環境ごとに利用可能なSSEやAVX等の並列計算機能を自動的に有効化して、環境の違いを吸収しつつ高速化されたコードを出力してくれるライブラリです。上手くいけば2~20倍ほどの高速化が期待できるようです。
Halideについては、福嶋先生のまとめ記事がとても分かり易いです。
qiita.com

これを有効化すれば、速くなりそうです。Halideを有効化してみましょう。

1. Halideの有効化

Halideの導入については、OpenCVのTutorialの中に丁寧な説明があります。
OpenCV: How to enable Halide backend for improve efficiency

の3つの手順を踏みます。

チュートリアルに従ってやってみるとエラーが出る

チュートリアルのリンクを使って素直にダウンロードしたLLVM4.0とclang4.0を使ってHalideをビルドしようとすると、rrors: too many arguments to function ‘llvm::ModulePass* llvm::createAddressSanitizerModulePass()なるエラーが出てきて上手くビルドできません。Halideの現在のソースコードにうまく合わないようです。

LLVMとClangの最新バージョン6.0.1を使ってみる。

http://releases.llvm.org/download.html#6.0.1
から,LLVMとClangのソースコードをダウンロードしてきて試してみます。圧縮ファイルはxzというちょっと珍しい拡張子になっています。Windows環境での解凍にはLhaforge等が便利です。

例としてはこんな感じ。
LLVMをc:\workspace等に解凍します。解凍した中に入ってc:\workspace\llvm-6.0.1.src\toolsでclangのxzを解凍し、解凍してできたフォルダの名前をclangに変更します。
次に必ず、MSVCの開発者コマンドプロンプトを開いて、そこでcmakeとbuildを実行します。

cd c:\workspace\llvm-6.0.1.src
mkdir build
mkdir install
cd build
cmake.exe -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_ENABLE_ASSERTIONS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=c:\\workspace\\llvm-6.0.1.src\\install -G "Visual Studio 14 Win64" c:\\workspace\\llvm-6.0.1.src
MSBuild.exe /m:4 /t:Build /p:Configuration=Release .\\INSTALL.vcxproj

HalideはTutorialに指示されたダウンロード先Githubからmaster版のソースコードを持ってきます。
c:\workspace\Halide等に解凍して、LLVMと同じように開発者コマンドプロンプトにて次のような手順でビルドします。

cd c:\workspace\Halide
mkdir build
cd build
cmake.exe -DLLVM_DIR=c:\\workspace\\llvm-6.0.1.src\\install\\lib\\cmake\\llvm -DLLVM_VERSION=60 -DWITH_TESTS=OFF -DWITH_APPS=OFF -DWITH_TUTORIALS=OFF -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 14 Win64" ..
MSBuild.exe /m:4 /t:Build /p:Configuration=Release .\\ALL_BUILD.vcxproj

ここまで準備ができたら、最後にOpenCVのビルドをCMakeからHalide関連のオプションを有効にしつつ、やり直します。
(ENABLE_CXX11 [check])
WITH_HALIDE [check]
HALIDE_ROOT_DIR c:\\workspace\Halide\build

再ビルドしてできたdllファイルとexeファイルをopencv_extra/testdata/dnnの古いファイルに上書きコピーします。また、Halide.dllを同じフォルダにコピーします。

Halideを有効化して、exampleを動かしてみる

backendにHalideを指定してsegmentationを動かしてみます。実行環境は、Intel Core i7-4770SでGeForce GTX760です。

example_dnn_segmentation.exe --model=fcn8s-heavy-pascal.caffemodel --config=fcn8s-heavy-pascal.prototxt --scale=1.0 --width=500 --height=500 --mean=0 0 0 --classes=segmentation_classes_pascal_voc.txt --backend=1

f:id:cvl-robot:20180723173320p:plain
ふむふむ、実行周期約6秒と。あれ、遅くない???
ためしにautomaticallyに戻してみると、
f:id:cvl-robot:20180723173547p:plain
3秒を切ると。約2倍ほど速いですね。

ということで、何が原因かよくわかっていませんが、”Halideを有効化すると2倍以上遅くなる”という結果になりました。どの環境でも速くなるというわけではないようですね。もうちょっと試してみたいと思います。

追記Core i7-6700HQ, GeForce GTX1060環境でも試してみましたが、状況は変わらず(むしろ悪化)でした。

2018年7月23日現在の結論

答えはここにありました。ENetを除く大半のケースでまだCPUの方が速いようです。簡単に使わせてもらうには、OpenCV-dnnのHalideはまだ時期尚早のようですね。
stackoverflow.com

github.com

GPUを利用したOpenCLを使った場合よりも、CPU単体で実行したほうが速いということにも留意すべきかもしれません。また今のところ、Intel製グラフィックスチップのOpenCLしか実行できません(GeForceとかRadeonとかじゃ動かない)。
試すなら、Intel MKL(後継に当たる?OpenVINO™ Toolkit | Intel® Software)のようですね。ただし、最新のCPU(Core i7-6000シリーズ以降)でないと動かないようですので、これも敷居が高そうです。