NNablaの学習済モデルをC++だけで実行する

# はじめに

ソニーのGUIディープラーニングツール Neural Network Console や NNablaで学習したネットワークが、環境に応じてC++だけで推論を実行できるようにアップデートされました。
Ubuntuでのチュートリアルが書かれていますが、Macでも動かしてみます。

# できること

- NNablaで学習したモデルファイル(.h5)をC++で読み込み可能なファイル(.nnp)に変換する。
- mnistの学習済みモデルを使ってC++で推論を実行する。

# 環境
- MacBook Pro (2.7 GHz Intel Core i5,16 GB 1867 MHz DDR3)
- macOS Sierra

# 手順

## C++モジュールのインストール 
インストール方法は[こちら](http://nnabla.readthedocs.io/en/latest/cpp/installation.html)に書いてある通りに進めます。すでにPythonパッケージの最新版がインストールされている状態でC++モジュールをインストールしてください。

hdf5, libarchiveなどはMacではbrewで入れます。

```
% brew install hdf5
```

```
% brew install libarchive
==> Installing dependencies for libarchive: xz
==> Installing libarchive dependency: xz
==> Downloading https://homebrew.bintray.com/bottles/xz-5.2.3.sierra.bottle.tar.
######################################################################## 100.0%
==> Pouring xz-5.2.3.sierra.bottle.tar.gz
  /usr/local/Cellar/xz/5.2.3: 92 files, 1.4MB
==> Installing libarchive
==> Downloading https://homebrew.bintray.com/bottles/libarchive-3.3.2.sierra.bot
######################################################################## 100.0%
==> Pouring libarchive-3.3.2.sierra.bottle.tar.gz
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/libarchive/bin:$PATH"' >> ~/.zshrc

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/libarchive/lib
    CPPFLAGS: -I/usr/local/opt/libarchive/include
For pkg-config to find this software you may need to set:
    PKG_CONFIG_PATH: /usr/local/opt/libarchive/lib/pkgconfig

==> Summary
```

ここで出力されるlibarchiveのインストール先はNNablaのビルド時に必要になります。


```
% git clone https://github.com/sony/nnabla
% mkdir -p nnabla/build && cd nnabla/build
% cmake .. -DBUILD_CPP_UTILS=ON -DBUILD_PYTHON_API=OFF
-- HDF5: Using hdf5 compiler wrapper to determine C configuration
CMake Error at /usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find LibArchive (missing: LibArchive_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindLibArchive.cmake:65 (find_package_handle_standard_args)
  src/nbla_utils/CMakeLists.txt:28 (find_package)


-- Configuring incomplete, errors occurred!
See also "/Users/sapugc/programming/nnabla/nnabla/build/CMakeFiles/CMakeOutput.log".

```

私の環境では、インストールしたはずのLibArchiveが見つからないと出てしまいます。LibAarchiveは/usr/local/opt/libarchive/にインストールされているので、以下のようにCMakeCache.txtを書き換えます。

```CMakeCache.txt
//Path to a file.
//LibArchive_INCLUDE_DIR:PATH=LibArchive_INCLUDE_DIR-NOTFOUND
LibArchive_INCLUDE_DIR:PATH=/usr/local/opt/libarchive/include

//Path to a library.
//LibArchive_LIBRARY:FILEPATH=/usr/lib/libarchive.dylib
LibArchive_LIBRARY:FILEPATH=/usr/local/opt/libarchive/lib/libarchive.dylib
```

これで問題なくインストールできました。

```
% cmake .. -DBUILD_CPP_UTILS=ON -DBUILD_PYTHON_API=OFF
% make
% sudo make install
```

## 実行

インストールが完了すれば、サンプルは[こちら](https://github.com/sony/nnabla/tree/master/examples/cpp/mnist_runtime)の通りにすれば実行できます。

```
# at examples/vision/mnist
% python classification.py
% python save_nnp_classification.py
% make
% ./mnist_runtime lenet_010000.nnp ./1.pgm
Prediction scores: -4.77821 13.8166 -3.646 -16.9732 -2.66022 -3.2229 -3.20213 -2.40796 0.523485 -1.83818
Prediction: 1
```