関数リストとコンバーター

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 はこのモデルが必要とする演算セットだけを含んでいれば十分です。これはどのように行うのでしょうか?

それは、次のステップで実装できます。

  1. 関数リストの生成

  2. nnabla-c-runtime ライブラリのコンフィグ

  3. 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 ステップが必要です。

  1. functions.txt で関数をコメントアウト

  2. -c パラメータでネットワークを変換

1. functions.txt で関数をコメントアウト

...
;Affine
...

2. -c パラメータでネットワークを変換

$ nnabla_cli convert -c functions.txt a.nnp b.nnb

Thus, the network is split into pieces, the output shows as the following:

...
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