Chainer4、Chainer4+iDeep、Menohでざっくりと性能比較してみました。
Menohは、PFNが発表した、C++推論エンジンです。
必要なものをインストール
$ sudo apt install cmake libopencv-dev
$ sudo apt install autoconf automake libtool curl make g++ unzip
protobuf をインストール
aptで入るprotobufは古いので、コードからインストール。
$ git clone https://github.com/google/protobuf.git
$ cd protobuf
$ git submodule update --init --recursive
$ ./autogen.sh && ./configure && make && make check
$ sudo make install
$ sudo ldconfig # refresh shared library cache.
mklをインストール
- https://software.intel.com/en-us/mkl から、"Intel Math Kernel Library"をダウンロード
- MKLに必要なものをインストール
$ apt install -qq cpio g++
-
$ tar xvzf downloads/l_mkl_2018.3.222.tgz && cd l_mkl_2018.3.222 && sudo ./install.sh
画面に従いインストール -
$ export LD_LIBRARY_PATH="/opt/intel/mkl/lib/intel64:/opt/intel/lib/intel64:$LD_LIBRARY_PATH"
(必要ならば、~/.bashrc などに書く)
mkl-dnnをインストール
$ git clone https://github.com/intel/mkl-dnn.git
$ cd mkl-dnn/scripts && ./prepare_mkl.sh && cd ../
$ mkdir -p build && cd build && cmake .. && make
$ sudo make install
menoh をインストール
$ git clone https://github.com/pfnet-research/menoh.git
$ cd menoh
$ mkdir data
$ python3 retrieve_data.py
$ mkdir build && cd build
$ cmake ..
$ make
$ sudo make install
評価
GCEのf1-microで試そうかと思いましたが、メモリーが足らなかったので、手元のPCで、nvidia-docker2上での動作です。
env | msec | |
---|---|---|
Chainer4(CPU) | 604msec | |
Chainer4 + iDeep | 98msec | |
menoh(mkl) | 103.9 msec |
Chainer 4 の場合
604 msec
https://github.com/peisuke/DeepLearningSpeedComparison/blob/master/chainer/vgg16/predict.py を利用
$ predict.py
mxnet-vgg-16 : 0.604022 (sd 0.003342)
Chainer 4 + ideep の場合
98 msec
$ python3 predict_ideep.py
mxnet-vgg-16 : 0.097915
menohの場合
103.9 msec
menoh のサンプルを20回実行し、1回当たりの実行時間を求めるように修正
https://gist.github.com/ikeyasu/bfb4d5cd6f636cdcbc16e41cf8f95347
実行するモデルは、 https://gist.github.com/ikeyasu/971ece2e32ddf36bcc40a71762f68cd9#file-convert_to_onnx-py で変換した onnx で、Chainer4 で実行したものと同じ。
$ example/vgg16_example_in_cpp --model ../../DeepLearningSpeedComparison/chainer/vgg16/vgg16.onnx
vgg16 example
103.9
まとめ
ざっくりとした評価ですが、menohと、chainer4 がだいたい同じでした。
(とくに、Pythonだからといってオーバーヘッドがある様なタスクではないので、当然ですね)