ONNXの概要とオペレータ

Kazuki Kyakuno
axinc
Published in
10 min readOct 28, 2020

--

機械学習モデルの推論で広く使用されているONNXの概要とオペレータについて解説します。ONNXを使用することで、推論に特化したフレームワークを使用した高速な推論が可能になります。

ONNXの概要

ONNXはOpen Neural Network Exchangeの略称で、推論で広く使用されている機械学習モデルのフォーマットです。PytorchやKerasなどの機械学習フレームワークからエクスポートすることができ、ONNX RuntimeやTensorRT、ailia SDKなどの推論に特化したSDKで推論ができるようになります。

出典:https://onnx.ai/

ONNXのメリット

PytorchやKerasなどは学習に最適化されているため、推論速度はあまり速くありません。ONNXに変換し、推論に特化したSDKを使用することで、推論を高速化することができます。

また、PytorchやKerasのモデルはフレームワークのバージョンアップに伴い互換性がなくなることがあります。例えば、あるバージョンのフレームワークで開発したモデルを、最新のバージョンで読み込ませようとすると、エラーが発生することができます。ONNXはファイルフォーマットが厳密に規定されているため、将来に渡って推論が行えることが期待できます。

ONNXの記述対象

ONNXは計算グラフを記述します。機械学習のモデルはグラフ構造で定義され、入力データに対してConvやPoolingなどの処理を順次、実行していきます。ONNXにはどのような処理を行うかがノードとして記述され、ノードへの入出力を定義することで、計算グラフが構築されます。Convの重みパラメータはノードへの入力として与えられ、例えば、Convの場合はinput.1が処理データ、input.2が重み、input.3がバイアスになります。重みはInitializerノードに格納され、Convノードに供給されます。

ONNXが記述する計算グラフの例

ONNXのファイルフォーマット

ONNXはProtocol Bufferという形式でデータが格納されています。Protocol BufferはGoogleが開発したメッセージファイルフォーマットで、TensorflowやCaffeでも使用されています。

Protocol BufferはFloat32などのデータ型やデータの並びだけが規定されており、各データの意味付けは使用するソフトウェアに任されています。概念的にはjsonのようなイメージです。

ONNXのバージョン

ONNXはオープンソースで開発されており、2020年10月現在、v1.7.0が最新です。

ONNXのopset

ONNXのファイルフォーマットのバージョンはopsetという形で規定されてます。2020年10月現在、最新のopsetは12です。opsetに応じて、使用できるオペレータや、オペレータのプロパティが異なります。各opsetで追加・変更されたオペレータはReleasesで確認することができます。

ONNXのオペレータ

ONNXにおいて、ConvolutionやPoolingはオペレータと呼ばれています。各オペレータの仕様はOperators.mdに記載されています。opset 10で142のオペレータが定義されています。

Abs, Acos, Acosh, Add, And, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, AveragePool, BatchNormalization, BitShift, Cast, Ceil, Clip, Compress, Concat, Constant, ConstantOfShape, Conv, ConvInteger, ConvTranspose, Cos, Cosh, CumSum, DepthToSpace, DequantizeLinear, Div, Dropout, Elu, Equal, Erf, Exp, Expand, EyeLike, Flatten, Floor, GRU, Gather, GatherElements, Gemm, GlobalAveragePool, GlobalLpPool, GlobalMaxPool, Greater, HardSigmoid, Hardmax, Identity, If, InstanceNormalization, IsInf, IsNaN, LRN, LSTM, LeakyRelu, Less, Log, LogSoftmax, Loop, LpNormalization, LpPool, MatMul, MatMulInteger, Max, MaxPool, MaxRoiPool, MaxUnpool, Mean, Min, Mod, Mul, Multinomial, Neg, NonMaxSuppression, NonZero, Not, OneHot, Or, PRelu, Pad, Pow, QLinearConv, QLinearMatMul, QuantizeLinear, RNN, RandomNormal, RandomNormalLike, RandomUniform, RandomUniformLike, Reciprocal, ReduceL1, ReduceL2, ReduceLogSum, ReduceLogSumExp, ReduceMax, ReduceMean, ReduceMin, ReduceProd, ReduceSum, ReduceSumSquare, Relu, Reshape, Resize, ReverseSequence, RoiAlign, Round, Scan, Scatter, ScatterElements, Selu, Shape, Shrink, Sigmoid, Sign, Sin, Sinh, Size, Slice, Softmax, Softplus, Softsign, SpaceToDepth, Split, Sqrt, Squeeze, StringNormalizer, Sub, Sum, Tan, Tanh, TfIdfVectorizer, ThresholdedRelu, Tile, TopK, Transpose, Unique, Unsqueeze, Upsample, Where, Xor

opset 11ではResizeの仕様が大きく拡張されています。opset 10まではPytorchのBilinearの仕様とONNXのBilinearの仕様が異なり、PytorchとONNXで推論結果が異なっていましたが、opset 11でPytorchに対応したResizeのモードが追加され、推論結果が一致するようになりました。

ONNXのエクスポート

Pytorchの場合、torch/onnxにエクスポートのコードがあります。PytorchのオペレータをONNXのオペレータに対応づけることでエクスポートします。opsetごとに使用できるONNXのオペレータが異なるため、エクスポートのコードはsymbolic_opset10.pyのように分かれています。

Kerasの場合も、keras-onnxでKerasのオペレータをONNXのオペレータに対応づけています。opsetごとに分岐があります。うまく推論結果が一致しない場合などは、これらのエクスポートコードのプロパティを調整する(attrs[‘coordinate_transformation_mode’] = ‘align_corners’に固定するなど)で、推論結果を改善できる場合があります。

詳細なONNXへのエクスポート方法は下記の記事を参照ください。

ONNXの最適化

各種のフレームワークが出力するONNXは冗長性があるため、オプティマイザを通すことで、より簡略化されたONNXに変換することができます。

例えば、定数に対するAddやDivなどの演算は事前に計算することができます。また、BatchNormはランタイムではスケールの乗算とバイアスの加算に落ちるため、Convの重みとバイアスに統合することができます。

オプティマイザの使用方法は下記の記事を参照ください。

ONNXの解析

出力されたONNXはNetronを使用することで解析することができます。詳細は下記の記事を参照ください。

ax株式会社はAIを実用化する会社として、クロスプラットフォームでGPUを使用した高速な推論を行うことができるailia SDKを開発しています。ax株式会社ではコンサルティングからモデル作成、SDKの提供、AIを利用したアプリ・システム開発、サポートまで、 AIに関するトータルソリューションを提供していますのでお気軽にお問い合わせください。

--

--

Kazuki Kyakuno
axinc
Editor for

CTO — ax Inc. , Managing Director — AXELL