シリーズで、NNablaのPython-like C++APIをご紹介したいと思います。
第二回目は、C++APIのセットアップと実行の仕方をご紹介いたします。
Python-like C++APIビルドの仕方
Python-like C++APIを使って、C++でネットワーク設計、学習、推論のプログラムを書くには、NNablaのC++ライブラリをビルド・インストールしておくことが必要です。
1. 使用環境
Python-like C++APIは、Ubuntu16.04、Windows7、10で動作確認済みです。
まず、Ubuntu16.04でのビルド・インストールの方法を説明します。
Windowsでのビルドについては、最後に簡潔に触れることにします。
2. ビルド用のソースコードの取得方法
まず、オープンソース・ソフトウエアとして公開されているNeural Network Library (以下、通称のNNablaで表記)のレポジトリを公式サイト(https://github.com/sony/nnabla)からダウンロードします。
以下では、バージョン管理ソフトウエアgitがインストールされていることを前提に説明します。
まず、以下のgitコマンドでNNablaのレポジトリ(nnabla)をダウンロードします。
git clone https://github.com/sony/nnabla
また、もし、GPUの計算環境があるならば、GPU拡張用のレポジトリ(nnabla-ext-cuda)を以下のコマンドでダウンロードしておきます。
git clone https://github.com/sony/nnabla-ext-cuda
3. ソースコードのビルド方法
CppAPIのビルドのマニュアルは、こちらにも記載されています。
https://github.com/sony/nnabla/tree/master/doc/build
Ubuntuでのビルドの場合には、上記ページ中程にあるBuild C++ Utilitiesから、Linux/MacOSでのビルドマニュアルへ移動できます。
https://github.com/sony/nnabla/blob/master/doc/build/build_cpp_utils.md
このページは英語で記載されていますが、以下に記載内容を日本語で書き出し、説明を追加しておきます。
- 必要なもの
お持ちのPC環境で、以下にリストアップしたソフトウエアがインストールされてなければ、記載されているコマンドを入力してインストールします。
#G++:
sudo apt-get install build-essential
#CMake>=3.1:
sudo apt-get install cmake
#Python:
sudo apt-get install python
#PythonPackages:PyYaml and MAKO
#ビルド時のコード自動生成に使います。
sudo –H pip install pyyaml mako
#Protobuf >=3:
curl -L https://github.com/google/protobuf/archive/v3.4.1.tar.gz -o protobuf-v3.4.1.tar.gz
tar xvf protobuf-v3.4.1.tar.gz
cd protobuf-3.4.1
mkdir build
cd build
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -Dprotobuf_BUILD_TESTS=OFF ../cmake
make
sudo make install
注:sudoを使用してシステムにprotobufをインストールすると、以前にシステムにインストールされていたprotobufライブラリが壊れる可能性があります。
詳細は、以下をご参照ください。
https://github.com/sony/nnabla/blob/master/doc/build/build_cpp_utils.md
- NNablaのビルド方法
# nnablaの取得(冒頭で済んでいればスキップ)
git clone https://github.com/sony/nnabla
# buildディレクトリの作成
cd nnabla && mkdir build && cd build
# cmakeを実行
cmake ..
# makeの実行
make -j8
# cpplib(ヘッダとlibnnabla.so)のインストール
sudo make install
- GPUとcuda、cudnnが使える場合
GPU用のC++ビルドマニュアルは、以下にあります。
https://github.com/sony/nnabla-ext-cuda/blob/master/doc/build/build.md
# nnabla-ext-cudaの取得(既に済んでいればスキップ)
git clone https://github.com/sony/nnabla-ext-cuda
# buildディレクトリの作成
cd nnabla-ext-cuda
mkdir build
cd build
# cmakeの実行
export NNABLA_DIR=your nnabla directory
export CPPLIB_LIBRARY=$NNABLA_DIR/build/lib/libnnabla.so
cmake .. -DNNABLA_DIR=$NNABLA_DIR -DCPPLIB_LIBRARY=$CPPLIB_LIBRARY
# makeの実行
make -j8
# cpplib(ヘッダとlibnnabla_cuda.so)のインストール
sudo make install
- Windowsでビルドしたい場合
Windowsでのビルドの場合には、上記ページ中程にあるBuild C++ Utilitiesから、Windowsでのビルドマニュアルへ移動できます。
https://github.com/sony/nnabla/blob/master/doc/build/build_windows.md
Windowsのビルドには、”nnabla/build-tools/msvc” 以下にビルド用バッチファイル ”build_cpplib.bat” が用意されています。
また、msvcのtool以下には、必要なソフトウエアをインストールするバッチファイル群を用意してあります。
WindowsのコマンドプロンプトやPowerShellを用いて、tool以下のバッチファイル群から適切な設定を行ったのち、ビルド用バッチファイルを起動することでビルドできます。
4. Python-like C++APIのサンプルプログラムと使用方法
・サンプルプログラムの保存場所
Cpp学習の使い方がわかるサンプルプログラム例として、MNIST手書き数字データセットを学習する例を用意してあります。
以下に、サンプルの保存場所を示します。
nnabla/examples/cpp/mnist_collection
GPUで動作するサンプルを利用したい場合は、以下のサンプルを用います。
nnabla-ext-cuda/examples/cpp/mnist_collection
・使い方
以下に英文での説明が記載されています。
https://github.com/sony/nnabla/tree/master/examples/cpp/mnist_collection
本レポートでは、ここに記載されている内容を、以下、日本語で紹介します。
・事前準備
まず、NNablaのCpp学習のライブラリをビルドしてインストールしておきます。
Cuda環境があればNNabla-ext-cudaのライブラリをビルドしてインストールしておきます。
その後、サンプルのディレクトリに移動します。
このディレクトリ内で、MNISTのトレーニング画像、トレーニングラベル、テスト画像、テストラベルをダウンロードしておきます。
ダウンロードには、通常のように、wgetやcurlコマンドを使います。
cd nnabla/examples/cpp/mnist_collection
wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz
wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz
ソースコード内で圧縮ファイルのまま読み取るので解凍する必要はありません。
このサンプルでは、MNISTデータを読み取るためにzlibをインストールしておくことも必要です。
・Python-like C++APIの実行ファイルの作成する
サンプルディレクトリ(nnabla/examples/cpp/mnist_collection)上にメイクファイル(GNUMakefile)が保存されています。
コマンドラインに以下のコマンドを打ち込むことで、実行ファイルが生成されます。
make
このディレクトリ下には、以下の6つの実行ファイルを作成するはずです。(2019年/5月時点)
- train_lenet_classifier
- train_resnet_classifier
- train_vae
- train_siamese
- train_dcgan
- train_vat
作成した実行ファイルの消去は、rmコマンドを用いてもよいですが以下のコマンドで一括消去ができます。
make clean
メイクファイルは、これら6つの実行ファイルをすべて作成する以外に個別のファイルを作るオプションもあります。
たとえば、”train_lenet_classifier”だけを作る場合は、以下のコマンドを入力します。
make lenet
メイクファイル(GNUMakefile)をエディタなどで開くと、コンパイル時のオプションなどがわかります。
たとえば、”train_lenet_classifier”に関する記述を抜粋しました。
lenet:train_lenet_classifier.cpp $(CXX)-std=c++11 -O -o train_lenet_classifier train_lenet_classifier.cpp -lnnabla -lz
ここでは、コンパイルオプションとして、c++11を指定し、nnablaのライブラリとzlibのライブラリを指定しています。
“zlib”を指定する理由は、このサンプルプログラムが、zipで圧縮されたMNISTのデータセットを解凍する処理を含んでいるからです。
MNISTを使わないで独自のデータセットを試す場合には、zlibは必ずしも必要ありません。
独自のプログラムを記述した場合は、プルグラムファイル名(train_lenet_classifier.cpp)と出力ファイル名(train_lenet_classifier)を変更します。
また、必要なライブラリも指定してコンパイルを行います。
なお、メイクファイルを使わず、たとえば、コマンドラインに以下のコマンドを直接入力してもビルドできます。
g++ -std=c++11 -O -o train_lenet_classifier train_lenet_classifier.cpp -lnnabla -lz
すでに、Python-like C++APIが前述の手順に従ってビルドされていれば、前述の6つの実行可能ファイルがビルドディレクトリnnabla/buildのbin以下に格納されているはずです。
このディレクトリに、MNISTのデータセットをコピーしても、実行ファイルの動作を試すことができます。
・Python-like C++APIの実行ファイルを実行する
たとえば、train_lenet_classifierを実行するときは、コマンドラインに実行ファイル名を引数無しで入力します。
./train_lenet_classifier
得られる出力は、たとえば、以下のようになります。
乱数のシードを固定していないため、数値は必ずしも同じにはなりません。
iter: 9, tloss: 2.061232, verr: 0.501562
iter: 19, tloss: 1.466847, verr: 0.282031
iter: 29, tloss: 0.900860, verr: 0.189063
iter: 39, tloss: 0.620210, verr: 0.186719...
他の実行ファイルも同様に実行ファイル名を引数無しで入力することで、実行できます。
・GPUで動作する実行ファイルを試す
GPUがある場合は、nnabla-ext-cuda/examples/cpp/mnist_collection以下で同様のプロセスで試すことができます。
ただし、実行ファイルの名前が若干異なり、以下の6つの実行ファイルになります。 (2019年/5月時点)
- train_lenet_classifier_cuda
- train_resnet_classifier_cuda
- train_vae_cuda
- train_siamese_cuda
- train_dcgan_cuda
- train_vat_cuda
前述の説明中の実行ファイル名などを適宜、*_cudaのように読み替えて試すことができます。