機械学習

【NNabla】C++ APIと学習済みモデルによる推論

NNablaのC++ APIで推論

こんにちは。

ディープラーニングお兄さんの”はやぶさ”@Cpp_Learningです。

前回、Sony製の深層学習フレームワーク“Neural Network Libraries(NNabla)”Python APIと学習済みモデル(MyChain.nnp)による推論を実践するチュートリアル記事を書きました。

NNablaと学習済みモデルで推論
【NNabla】Neural Network Librariesと学習済みモデルによる推論 -NNPファイル編-直観的にニューラルネットワークの実装ができるソニー製の深層学習フレームワーク”NNL”によるDeep Learning(ディープラーニング)入門チュートリアルを書きました。学習済みモデル(NNP)を使った推論が行えるPython APIのソースコードも公開しています。組み込みシステムと深層学習に関する説明もあるので、勉強にお役立て下さい。...

今回は、C++ APIと学習済みモデル(MyChain.nnp)による推論を実践します。

最初にPythonではなくC++で深層学習をする理由について説明します。

組み込みシステムと深層学習

組み込みシステムの多くはリアルタイム処理・小型化・低消費電力を求められ、さらに低コスト化の要求もあるため、高性能プロセッサや大容量メモリの使用不可という制約があります。

また、組み込みシステムのソフトウェアはC言語あるいはC++で実装することも多いです。

はやぶさ
はやぶさ
あとPythonよりC++の方が高速処理ができるのも重要ですね

そのため、組み込みシステムに深層学習を適用する場合、機械学習ライブラリが充実しているPythonではなく、C/C++によるソフトウェア開発を求められるケースがあります。

その他、様々な理由でC/C++で深層学習を実現したいという要求があります。

深層学習とC++

深層学習のサンプルソースを調査するとPythonで書かれたものが多く、C/C++のサンプルソースを探すのに苦労します。

深層学習フレームワークの中には、PythonとC++の両方をサポートしているものもありますが、Pythonで使用できる関数がC++では使えない!なんてこともあり、C++よりもPythonのサポートが手厚いと感じています。

(C++のサポートも充実してきているので、時間が解決してくれる気もしますが…)

C++自体の難しさもあり、C++で深層学習をするのはハードルが高いと感じています。

スポンサーリンク

Neural Network Libraries(NNabla)の特徴

Sony製の深層学習フレームワーク“Neural Network Libraries”コア部分はC++で実装されており、Python APIだけでなくC++ APIも用意してあります。

そのため、C++で深層学習の学習フェーズも推論フェーズも実現できます。

NNablaによる組み込み深層学習

また「学習フェーズをPython」⇒「推論フェーズをC++」という一連の処理もシームレスに実現できます。

【学習フェーズ(Python API)】

  1. Python APIでニューラルネットワークを設計
  2. 学習(ニューラルネットワークの”重み”を調整)
  3. 学習済みモデルをNNPファイルに保存

【推論フェーズ(C++ API)】

  1. C++ APIで学習済みモデル(NNPファイル)を読込む
  2. 学習済みモデルへの入力値(センサ値など)を取得
  3. 推論(入力値に対する推論値を取得)
  4. 推論値を使って”ごにょごにょ”する(制御とか)

冒頭で少し説明した通り、組み込みシステムはプロセッサやメモリに制約があるため、学習を実行するのは辛い…

また、組み込みシステムは特定の処理に特化したシステムが多く、推論のみを実行できれば良いケースも多いです。

そのため…

はやぶさ
はやぶさ
PythonとC++の連携が簡単かつ、C++のみで推論が実現できる”NNabla”はとても魅力的!

以降から、Python APIで生成した学習済みモデル(MyChain.nnp)を使い、C++ APIによる推論を実践します。

NNabla C++ APIのインストール方法など

最初に各種ライブラリをインストールして環境構築を行います。C++ APIを使うための環境構築については、以下の記事で説明しています。

NNabla C++ APIの環境構築
【NNabla】C++ APIを使うための環境構築 -ライブラリのインストール方法など-こんにちは。 ディープラーニングお兄さんの”はやぶさ”@Cpp_Learningです。 以前 “Neural Network...

また、学習済みモデルの生成など”NNabal”の使い方に関する”Tips集”を作成・公開していますので、ご参考までに

NNablaのまとめ記事
【NNabla】Neural Network Librariesの使い方まとめこんにちは。 ディープラーニングお兄さんの”はやぶさ”@Cpp_Learningです。 仕事・プライベートどちらでも”深層学...

以降から学習済みモデル(MyChain.nnp)が手元にある前提で説明します。まだ、手元にnnpファイルがない人は”Tips集”を参考に作成してみて下さい(*・ω・)ノ♪

【実践】学習済みモデル(NNPファイル)とC++による推論

NNableのC++ APIと学習済みモデル(NNPファイル)を使って推論を行います。

先に作成するファイルについて説明しておきます。

ファイル 内容
MyChain.nnp 学習済みモデル
makefile ビルド/実行用
nnabla_cpp.cpp 推論ソフト(C++バージョン)
nnabla_python.py 推論ソフト(Pythonバージョン)

ディレクトリツリーは以下の通りです。

※workspaceとNNabla_cppはディレクトリ

深層学習でシステム解析

なお、今回使用する学習済みモデル”MyChain.nnp”は、1入力1出力(SISO系)の非線形システムの同定モデルです。

【深層学習】推論ソフト(C++バージョン)

C++と学習済みモデル”MyChain.nnp”で推論するソースコード”nnabla_cpp.cpp”が以下です。

このソースコードでx = 0~9整数を”MyChain(x)”に入力し、出力値yを推論します。

makefile

ビルドおよび実行コマンドを手打ちするのは大変なので、以下のmakefileを作成します。

ビルド&実行

以下のコマンドで”NNabla_cpp”に移動

cd NNabla_cpp

以下のコマンドでビルド

make

nnabla_cppという実行ファイルが生成できたら成功です。

以下のコマンドで実行

make run

一連の流れを実施したときのターミナル画面は以下の通りです。

NNablaのC++ APIで推論

C++で推論できました!

【エラーレポート】ライブラリ(soファイル)のリンク

makeでビルドが成功し、実行ファイル”nnabla_cpp”を生成できたら、以下のコマンドで実行できるはずでした!

./nnabla_cpp

しかし、以下のエラーメッセージが表示されました。

./nnabla_cpp: error while loading shared libraries: libnnabla.so: cannot open shared object file: No such file or directory

これは、nnabla_cppで使用するNNablaライブラリ(SOファイル)”libnnabla.so”が見つからない!と怒られています。

以下のコマンドでnnabla_cpp(実行ファイル)のリンクを確認することができます。

ldd nnabla_cpp

このコマンドで”libnnabla.so”が表示されればリンク済み、未表示の場合は上記したエラーが表示されます。

今回の場合は、以下のNNablaライブラリ(soファイル)をリンクする必要がありました。

  • libnnabla.so
  • libnnabla_utils.so

そのため、makefileで”make run”コマンドを作成し、/usr/local/libに保存されたライブラリ(soファイルなど)をリンクして実行できるようにしました。

LD_LIBRARY_PATH=/usr/local/lib ./nnabla_cpp

ライブラリ(SOファイル)をリンクするシンプルな方法を説明しました。NNablaに限らず汎用的に使えるテクニックなので、ご参考までに

【深層学習】推論ソフト(Pythonバージョン)

比較のためにPythonバージョンの推論ソースコード”nnabla_python.py”も作成して実行します。

実行結果は以下の通りでした。

NNabla CppとPythonで推論

推論結果yはPythonでもC++でも同じでした。同じ学習済みモデルを使っているので、当然ですね(*・ω・)ノ♪

また、推論にかかった時間を計測した結果は以下の通りでした。

ソースコード 処理時間
C++ 約8msec
Python 約17msec

※第8世代のインテルCoreプロセッサ(Core i5-8250U)で動作確認しました

使用するPCに依存すると思いますが、C++の方が高速ですね!

※C++の処理時間計測にはchronoというライブラリを使って計測しました。

C++ライブラリchronoで処理時間計測
【chrono】C++でマルチプラットフォームな処理時間計測ができるライブラリこんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。 WindowsやLinuxなどで動く『マルチプラ...

まとめ

Sony製の深層学習フレームワーク“Neural Network Libraries”のC++ APIと学習済みモデル(NNP)を使った推論を実践しました。

なお、学習済みモデルはPython APIで生成したものを使っています。

NNablaによる組み込み深層学習

そのため、「学習フェーズをPython」⇒「推論フェーズをC++」という一連の処理もシームレスに実現できました。

“Neural Network Libraries(NNabla)”すごい!

本記事を読んで…

NNabla・組込みシステム・深層学習などに興味をもった!
C++で深層学習やってみたかった!本記事が参考になった!!

という人が現れたら、ディープラーニングお兄さんはすごく嬉しい!

はやぶさ
はやぶさ
理系応援ブロガー”はやぶさ”@Cpp_Learningは頑張る理系を応援します!
スポンサーリンク

【おまけ】Spresenseの紹介

Neural Network Librariesで学習したモデルは、Sony製のスマートセンシングプロセッサ搭載ボード”Spresense”で実行できるそうです。

Spresenseメインボード

Arduino IDE や専用のSDKを使って簡単にIoTシステムを実現できるようです

Spresense拡張ボード

Arduino UNO 互換のピンソケット

Spresenseカメラボード

Sony製CMOSイメージセンサー

SONY SPRESENSE カメラモジュール CXD5602PWBCAM1
LINEスタンプ配信中!

フクロウのLINEスタンプ

当サイトのマスコットキャラクター

「フクロウのくるる」が

LINEスタンプになりました!

勉強で疲れたあなたに癒しをお届け☆

お迎え待ってます(*・ω・)ノ♪

今すぐお迎えする

40個セットがたったの50コインとお得です