関数リストとコンバーター¶
nnabla_cli
は nnabla のコマンドラインインターフェイスです。このコマンドラインインターフェイスを使って、ユーザーは現在の NNabla のサポート状況や nnabla のモデル ( 例 *.nnp ) を他のモデルのフォーマット ( 例 *.onnx ) に変換できるかどうか、またはその方法を知ることができます。
サブコマンド function_info
は、nnablaですでに実装されている関数のリストを出力してくれます。 この情報により、モデルに合った nnabla-c-runtime ライブラリを構築したり、対象モデルに対してサポートされていない関数をスキップすることができます。
簡単なユースケース¶
簡単なユースケースをいくつか紹介しましょう。
まず、nnabla が現在サポートしている関数やその数を知りたい場合です。
$ nnabla_cli function_info
次のリストが得られます。
2019-06-14 16:16:13,106 [nnabla][INFO]: Initializing CPU extension...
NNabla command line interface (Version:1.0.18.dev1, Build:190531084842)
LSTM
Sub2
Mul2
GreaterEqual
Sigmoid
NotEqual
Unpooling
Log
CategoricalCrossEntropy
...
これは、現在 nnabla でサポートされているすべての関数のリストです。名前によって関数を探す目的のみのため、詳細はなく、関数名だけが表示されます。各関数の詳細については、オンラインドキュメントで調べる必要があります。
ご存じのように、 nnabla のモデル *.nnp は接尾辞 .nnb
を持つコンパクトバージョンに変換することができ 、 nnabla-c-runtime ライブラリによる推論に用いることが可能です。 このフォーマットを簡潔に NNB
と名付けました。このフォーマットでサポートされている関数がいくつあるかを知るために、このコマンドを使うことができます。
$ nnabla_cli function_info -f NNB
上記と同様に、関数リストが表示されます。
指定した.nnpモデルで使われている関数を調べることもできます。
$ nnabla_cli function_info my_model.nnp
上記と同様に、このモデルで使われる関数リストが列挙されます。
そして、使用しているモデルを nnabla-c-runtime モデルフォーマットに変換できるかどうかを知ることができます。厳密には、 .nnp における関数セットと nnabla-c-runtime がサポートする関数セットの共通部分を知ることができます。
$ nnabla_cli function_info my_model.nnp -f NNB
この出力は次のようになります。
2019-06-14 17:01:29,393 [nnabla][INFO]: Initializing CPU extension...
NNabla command line interface (Version:1.0.18.dev1, Build:190531084842)
Importing mnist_nnp/lenet_010000.nnp
Expanding runtime.
nnabla-c-runtime currently support the following functions in model:
Convolution
MulScalar
Affine
MaxPooling
ReLU
...
また、このモデルでサポートされていない関数がある場合は、それらもリストアップされます。
適合する nnabla-c-runtime ライブラリ¶
nnabla-c-runtime ライブラリを実装するとき、できる限りすべての関数を含んだ状態で実装したいところです。しかし、顧客の観点からはそこまでの必要はない場合もあります。ユーザーが可算モデルに対して nnabla-c-runtime を使いたいだけならば、 nnabla-c-runtime はこのモデルが必要とする演算セットだけを含んでいれば十分です。これはどのように行うのでしょうか?
それは、次のステップで実装できます。
関数リストの生成
nnabla-c-runtime ライブラリのコンフィグ
nnabla-c-runtime ライブラリの構築
1. 関数リストの生成¶
$ nnabla_cli function_info my_model.nnp -f NNB -o functions.txt
これは、どのファイルに記述するかを指定する -o
パラメータ以外は上記と同じです。 ( もちろんフォーマットは標準出力 へ出力されるバージョンと異なり、よりコンパクトです )
2. nnabla-c-runtime ライブラリのコンフィグ¶
ユーザーは手動で functions.txt
を変更することができます。そして、このファイルは入力として使われ、 nnabla-c-runtime ライブラリのコンフィグファイルを生成するために使われます。
$ nnabla_cli function_info -c functions.txt -o nnabla-c-runtime/build-tools/code-generator/functions.yaml
-c
オプションがない場合は、 nnabla で実装されている関数セットすべてを含む形でコンフィグファイルが作成されます。この場合、作成されるライブラリにはすべての関数が含まれることになります ( デフォルトではこのような動作になります ) 。
3. nnabla-c-runtime ライブラリの構築¶
ビルドプロセスは、次のように比較的直接的です。
#> nnabla-c-runtime>mkdir build
#> nnabla-c-runtime>cd build
#> nnabla-c-runtime>cmake ..
#> nnabla-c-runtime>make
nnabla-c-runtime ライブラリの libnnablart_functions.a
には、必要な関数が入っています。
サポートされていない関数のスキップ¶
*.nnp
を *.onnx
または *.nnb
に変換したいとき、対象のフォーマットではサポートされていない関数があります。例えば、ネットワークを nnabla-c-runtime に変換したいとします。ネットワークは以下のようになります。
Affine
Softmax
Tanh
Convolution
MaxPooling
ReLU
nnabla-c-runtime ライブラリの Convolution
を使いたくないとします。その際には、 Convolution
演算の箇所でネットワークを 2 つに分割することになります。そのためには、次の 2 ステップが必要です。
functions.txt で関数をコメントアウト
-c
パラメータでネットワークを変換
2. -c
パラメータでネットワークを変換¶
$ nnabla_cli convert -c functions.txt a.nnp b.nnb
このように、ネットワークを分割すると、次のように出力されます。
...
LeNet_036_0_5.nnb:
input:
- name: Input
shape: (-1, 1, 28, 28)
output:
- name: Tanh_2
shape: (-1, 30, 4, 4)
LeNet_036_7_7.nnb:
input:
- name: Affine
shape: (-1, 150)
output:
- name: ReLU_2
shape: (-1, 150)
LeNet_036_9_9.nnb:
input:
- name: Affine_2
shape: (-1, 10)
output:
- name: Softmax
shape: (-1, 10)
ネットワークは Affine
関数の箇所で分割されます。ネットワークに 2 つの Affine
があるので、 3 つのサブネットワークが生成されます。
ONNX への変換¶
次のコマンドは、上記と同様の動作を行い、 *.onnx ファイルへと変換を行います。
サポートされているすべての関数を列挙します。
$ nnabla_cli function_info -f ONNX
モデルと ONNX によってサポートされている関数セットの共通部分を列挙します。
$ nnabla_cli function_info LeNet_036.nnp -f ONNX
ネットワークを分割して、いくつかの関数をスキップします。
$ nnabla_cli convert -c functions.txt a.nnp a.onnx
1. functions.txt で関数をコメントアウト¶