アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

Neural Network Consoleクラウド版でダウンロード可能になった「ONNX」形式とはなんなのか?

Neural Network Consoleクラウド版のアップデートの通知メールが来てました。

その中にこんな一文がありました。

ONNX、NNB(Cランタイムフォーマット)形式でのダウンロードに対応

 NNBというのは、「nnabla-c-runtime」用のモデルファイルフォーマットです。

github.com

C言語で書かれたnnablaで、ほぼ組み込み用ですから、まあ「製品に組み込みで利用するAIの設計を、Neural Network Consoleクラウド版でやりやすくしたよ」というメッセージでしょうから・・・、まあ、納得です。

面白いなと思ったのは、ONNXの方です。

f:id:arakan_no_boku:20181027155105j:plain

 

ONNXとは何なのか

 

ソニーさんのブログには以下のように説明されてます。

ONNXはDeep Learningモデルのオープンなファイルフォーマットで、各社からリリースされている多数のDeep Learningフレームワーク、ライブラリがこれに対応しています。

ONNXは「OPEN NEURAL  NETWORK EXCHANGE FORMAT」の略です。

公式ページ(英語)はここです。

onnx.ai

目指すところは、「アイデアをより迅速に本番に投入することを可能にするために、モデルを1つのフレームワークで訓練し、推論のために別のフレームワークに転送する等の相互利用を簡単にする」ことみたいです。

考え方は素晴らしい!!

とはいえ、まだ、発展途上でじわじわと対応フレームワークが増えていっているところで、2018/10/27時点の対応状況はこんな感じです。

フレームワーク インストール ONNX形式出力 ONNX形式ロード(取込み)
Caffe2 part of caffe2 package
PyTorch part of pytorch package 〇(拡張) ×(対応中)
Cognitive Toolkit (CNTK) built-in
Apache MXNet part of mxnet package docs github
Chainer chainer/onnx-chainer ×(対応中)
TensorFlow onnx/onnx-tensorflow △(実験的)
Apple CoreML onnx/onnx-coreml and onnx/onnxmltools
SciKit-Learn onnx/onnxmltools ×
ML.NET built-in
Menoh pfnet-research/menoh ×
MATLAB onnx converter on matlab central file exchange

あと、上記表にはないのですが、以下については、ONNXからコンバートツールが提供されているみたいです。

  • scikit-learn
  • CoreMLTools
  • Keras
  • LightGBM (scikit-learn interface) 

onnx.ai

ここに、Neural Network Console/Neural Network Librariesが、加わるわけですね。

いまは、クラウド版だけですが、Windows版でもそのうち対応されるんでしょうかね。

正直、各フレームワーク間で相互変換するための共通仕様が決められ、各社で対応が進むことは、非常に良いことだと思います。

どうしても、ひとつのフレームワークだけを見ると、得手不得手ができてきます。

だから。

学習したモデルを実務で使うため、相互変換して使いたいってことはでてきます。

こういう取り組みは、どんどんすすめてほしいですね。

 

実際にONNX形式をダウンロードしてみる

 

さて、今度はONNX形式を実際にダウンロードして、中身を見てみたいと思います。

Neural Network Consoleクラウドを使います。

使ったことがない方は、アカウント登録からお願いします。

arakan-pgm-ai.hatenablog.com

さて。

Neural Network Consoleクラウドで、サンプルプロジェクトで学習します。

f:id:arakan_no_boku:20181027131934j:plain

そうすると、学習の最後の方で「ONNX」形式のアウトプットが生成されるようです。

NNabla command line interface (Version 1.0.5.console_day3-fix-181003, Build 181003062836)
2018-10-27 03:19:12,782 [worker]: [INFO]: create result_train.nnp
2018-10-27 03:19:13,827 [worker]: [INFO]: create result.nnb
2018-10-27 03:19:17,058 [worker]: [INFO]: create result.onnx
2018-10-27 03:19:19,487 [worker]: [INFO]: worker done

すると、ダウンロードのメニューにONNXがでてきます。

f:id:arakan_no_boku:20181027145033j:plain

生成されたONNXファイルはこんな感じです。

テキストで読める部分もありますが、まあ、バイナリフォーマットですね。

Caffe や Tensorflow 等と同じ Protocol Buffer 形式だそうです。

f:id:arakan_no_boku:20181027150218j:plain

これを実際に取り込んでみるのは、今回はやりません。

興味があれば、こちらの記事をどうぞ。

qiita.com

 

それにしても、NNEFはどうなっているのだろう

 

 標準化仕様にはONNX以外に、NNEFってのがあります。

www.khronos.org

NNEFは「Neural Network Exchange Format」の略です。

NNEFは、テキストベースで読みやすく、かつ、仕様の柔軟性が高く、複雑な構造のネットワークを書きやすいなど、技術的にはONNXより優れた仕様みたいなのですが、その分仕様が複雑です。

ONNXの方は逆で、仕様の柔軟性や拡張性よりも、仕様のシンプルにしたり、Protocol Buffer 形式みたいな汎用的な技術を取り入れるなど、各フレームワーク側の対応コストを下げるような工夫を重視している感じです。

そのせいか。

対応しているフレームワークはONNXの方が圧倒的に多いです。

NNEFはCaffe と TensorFlow位だったんじゃないかと思います。

NNEFの「NNEF Working Group Participants」には、SONYもはいっているので、Neural Network Consoleも対応してくるのかもしれないのですけど・・。

なんか、よく見る構図です。

  • 技術的に優れているけど、仕様が複雑で対応にコストがかかる方
  • 技術的には相手に見劣りしても、仕様がシンプルで対応コストがかからない方

この両者の派遣争い。

でも、歴史的に見ると、だいたい後者の方が勝ち残ってるんですよね。

どうなるかはわからないですが・・。

さてさて、SONYさんは両方に対応するんでしょうかね?