HOME > ソフテックだより > 第333号(2019年7月3日発行) 技術レポート「NNL(Neural Network Libraries)を活用したC#アプリケーション開発」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第333号(2019年7月3日発行)
技術レポート

「NNL(Neural Network Libraries)を活用したC#アプリケーション開発」

1. はじめに

私はWindowsアプリケーション開発を担当する機会が多い、入社15年目の社員です。現在、AIの活用が流行しておりますが、弊社でもAIを用いたアプリケーション開発に力を入れております。

今回はAIを活用したアプリケーション開発について、私が関わったNNLデモシステムの例を紹介させて頂きます。

2. NNL( Neural Network Libraries )とは?

NNL( Neural Network Libraries)とは、ニューラルネットワーク(※1)の研究・開発・実装を効率化するオープンソースソフトウェアのことです。ソニー社によって開発されて社内利用されていたライブラリですが、2017年に公開されました。特徴の一つは「Pythonを用い、より少ないコード量で直観的に計算グラフ(ニューラルネットワーク)を定義することができる」ことです。もう一つの特徴としては、「C++11で実装されており、デバイスを選ばない」ことがあります。
同年にソニー社はNNC ( Neural Network Console )をリリースしています。NNCはNNLを扱う統合開発環境で、GUIによるビジュアルによる操作で機械学習や評価ができます。

Neural Network Console画面
図1. Neural Network Console画面

※1機械学習の手法の一つです。機械学習とはデータを解析し、その結果から傾向を学習して、判断や予測を行うためのアルゴリズムを使う手法です。機械学習により、AIが処理能力を向上させることができます。

3. NNL デモシステム

3.1 システム構成

NNLデモシステムの構成は以下の通りです。

NNLデモシステム構成
図2. NNLデモシステム構成

PLCの制御で必要となるパラメータをNNLで取得することがデモシステムの目的です。 PCアプリケーションの役割はPLCからの要求があったらNNLの推論を実行し、取得したパラメータをPLCへ返すことです。

3.2 NNL (AI)を活用するメリット

従来はオペレータがパラメータを判断して入力する必要がありました。しかし、デモシステムではNNLを活用することにより過去の蓄積データから最適なパラメータを自動で予測することができるようになります。
これにより、以下のようなメリットがあります。

A. 作業の省力化

単純にオペレータが判断する手間が必要なくなります。

B. 作業の属人性をなくすことができる

従来はオペレータごとの経験に基づいて判断されるため、オペレータごとに違うパラメータとなることがありました。NNLで最適なパラメータを算出することにより、オペレータの判断の違いによる無駄をなくすことができます。

4. アプリケーション開発

4.1 開発環境

NNLデモシステムの構成は以下の通りです。

  • Microsoft Visual C# 2010 Express
  • .NET Framework 4 Client Profile
  • Neural Network Libraries v0.9.1 (※1)

※1 NNC1.30をインストールすると、同時にインストールされます。

4.2 処理概要

NNLで使用する学習データ(NNPファイル)はNNCを用いて、事前に作成しておきます。

PLCから要求があった時のアプリケーションの動作は以下の通りです。

1. PLCからの要求を受信/PLCから入力値を読み込み
2. 入力値と学習データを用いて、NNLの推論を実行

4.3 推論実行方法について

通常、アプリケーションから推論を実行する場合、以下のようにC++からNNLのクラス等を使用します。

// 学習データ読込 ( 学習データは事前に準備しておく )
nbla::Context ctx{{"cudnn:float", "cuda:float", "cpu:float"}, "CudaCachedArray", "0"};
nbla::utils::nnp::Nnp nnp(ctx);
nnp.add("test.nnp"); 

// 推論実行のインスタンス作成
auto executor = nnp.get_executor("runtime");
executor->set_batch_size(1); // Use batch_size = 1.

// 入力データ
nbla::CgVariablePtr x = executor->get_data_variables().at(0).variable;
uint8_t *data = x->variable()->cast_data_and_get_pointer(cpu_ctx);

〜 PLCからの入力値を*dataに設定する。〜 (省略)

// 推論実行
executor->execute();

// 推論の結果を格納
y = executor->get_output_variables().at(0).variable;
y_data= y->variable()->get_data_pointer(ctx);

〜 y_dataの値をPLCへ書き込む 〜 (省略)

ただし、今回の開発言語はC#であり、NNLを直接使用することができません。
これを回避する方法の一つして、DLL等のインターフェースを準備するという方法があります。
しかし、今回はNNCがNNLのライブラリを実行する仕組み(Pythonのプログラムを起動)を利用する方法をとっています。理由は、今回の用途ならインターフェースを準備する必要がないので、簡単に扱えるためです。
具体的な手順としては、以下のようになります。

1. 学習データのファイルを準備する。
2. PLCからの入力値をファイル出力する。
3. Pythonのプログラムを起動して、推論を実行する。(1、2を引数にする。)
4. 3の出力結果ファイルを読み込み、値をPLCへ書き込む。

5. 最後に

今回はAIを活用したアプリケーション開発例として、NNLデモシステムを紹介させて頂きました。
NNL(AI)を活用することによるメリットと、C#からNNLを活用する方法について説明させて頂きました。 今回はデモシステムであったため、実運用での確認まではできておりませんが、試験用データで適切なパラメータがNNLで取得できるところまで確認しております。
AI開発のプラットフォームとしては他にもNVIDIA、MATLAB、HALCONなど様々なものがあります。 これらについても機会があればご紹介させて頂きたいと思います。

(K.S.)


関連ページへのリンク

関連するソフテックだより

ページTOPへ