SlideShare a Scribd company logo
ONNX Export & Optimize
2019.10 AXELL Corporation / ax Inc.
アジェンダ
About
ONNXの概要と仕様を解説します
Export
各種フレームワークからONNXをエクスポートする方法を解説します
Optimize
エクスポートしたONNXを最適化する方法を解説します
Inference
ONNXを使用した推論の方法を解説します
株式会社アクセルについて
株式会社アクセル(本社:秋葉原)
https://www.axell.co.jp/
・主事業はLSIの設計・販売
・グラフィックス分野の研究開発に強み
・新規事業としてAI/ミドルウェア/暗号分野に注力
・自動運転分野にも投資(NEDO公募事業へ採択)
ax株式会社について
ax株式会社(本社:渋谷)
https://axinc.jp/
・2019年5月設立 アクセル子会社
・AI/ミドルウェア事業を推進
・推論フレームワークの ailiaSDK を提供
・その他ディープラーニングの開発支援
About ONNX
ONNXとは
オープンなニューラルネットワークのモデルフォーマット
各種フレームワークからエクスポートして一貫性のある推論が可能
実質的なデファクトスタンダード
ONNXを使用したワークフロー
各種の学習系フレームワークからONNXを出力可能
エッジ側ではONNXを読み込んで一貫性のある推論が可能
Training Model Inference
Menoh
ONNX前夜
魔改造Caffeの時代
CaffeModelのフォーマットが標準化されていなかった
各自が独自にCaffeにレイヤーを追加したため、モデル作成者の独自ビルドのCaffeを使わないと推
論が行えなかった
CaffeとCaffeModelの断片化が進んだ
モデルのポータビリティが失われた
ONNXの登場
2017.9 MicrosoftとFacebookがONNXをGithubで公開(PytorchとCaffe2がサポート)
2017.12 MicrosoftとFacebookとAWSがONNX 1.0を発表
2017.12 Pytorch 0.3がONNXに対応
2018.6 PFNがChainerのONNX対応を発表
2018.11 tf2onnx 0.3.1 をGithubで公開
2018.11 onnx.jsがGithubで公開
2018.12 MicrosoftがONNXRuntimeをGithubで公開
ONNXのサポートするオペレータ
opset=10で142 Operator、ただしフレームワークによって対応範囲は異なる
https://github.com/onnx/onnx/blob/master/docs/Operators.md
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
ちょっと高次なオペレータ
NonMaxSuppression
YOLOなどでバウンディングボックスの重複除去で使う。
Loop
公式のYOLOv3が使っている。実質的にrange(x)的な使い方。
If
サブグラフの分岐ができる。
(tf2onnxでbatch_normのis_trainingにPlaceHolderを与えると生成される)
IR versionとOPSET version
IRは内部フォーマットが変更されるとバージョンが上がる
OPSETはレイヤーが追加されるとバージョンが上がる
https://github.com/onnx/onnx/blob/master/docs/Versioning.md
ONNX version IR version OPSET version Diff
1.2 3 7 Upsample、Identity、Sin、Cos対応 など
1.3 3 8 Loop、If、Scanが正式対応
Max、Min、Mean、Sumのbroadcast対応 など
1.4.1 4 9 Scatter、Erf、Sign、Shrink追加 など
1.5.0 5 10 NonMaxSuppression追加
Upsamplingのdeprecated など
1.6.0 6 11 Resize仕様変更、Range追加 など
ONNXのopsetによる違い(特にResize関連とか)
ONNXはopsetによってオペレータの挙動が異なる(Upsample7、Upsample9など)
そのため、エクスポータに与えるopsetによって出力されるレイヤーが変化する
tf2onnxの場合
opset<10
Upsample7 or Upsample9(deprecated)
opset>=10
Resize
ONNXのテンソル形式
チャンネルファースト(NCHW)
TensorFlowやKerasはチャンネルラスト(NHWC)なため、エクスポータでTransposeが挿入される
tensorflow2onnxでTransposeが挿入されすぎる問題については後述
ONNXのbroadcastについて
ONNXではAdd、And、Divなどの四則演算にスカラーなどを与えることができる
https://github.com/onnx/onnx/blob/master/docs/Broadcasting.md
スカラーが与えられた場合、演算対象のテンソルサイズに自動的に拡張される
フレームワーク側がbroadcastに最適化することで高速化の余地がある
入力Tensor
shape=(8,16)
入力
Tensor
(1,1)
Broadcasted Tensor
shape=(8,16)
Add
Layer
出力Tensor
shape=(8,16)
Broadcast
ONNXの内部フォーマット
Googleが開発したメッセージフォーマットであるProtocolBufferで格納される
CaffemodelもProtocolBufferであるがウエイトの持ち方が異なる
CaffeModelの場合
ウエイトはレイヤーのBlobに格納される
Convolution Layer
Input Tensor
Output Tensor
Weight as
Blob
ONNXの場合
ウエイトはInputとして提供される
Convolution Layer
Input Tensor
Output Tensor
Weight as Constant Layer
ONNXの多様性
別のレイヤーの演算結果をウエイトに与えることもできる
Convolution Layer
Input Tensor
Output Tensor
Constant Layer
Add Layer
Constant Layer
その他のウエイト:initializer_listについて
グラフにはInitializerとして定数テンソルを持つことができる
ウエイトはConstantで与えてもInitializerで与えても良い
レイヤー 特性
Graph::Initializer リードオンリー
Layer::Constant リードオンリー
インプレース演算
Caffeは同じBlobへのインプレース書き込みを許容
Conv -> Blob1 <- Relu
ONNXは同じBlobへの書き込みは許容しない(ノードの入力と出力を同じに出来ない)
Conv -> Blob1 -> Relu -> Blob2
制御構文
対応しているフレームワークは少ないが、ONNXではLoopとIfでサブグラフの実行を制御可能
将来的にはEarlyTerminationによる高速化や、階層的な識別モデルなど、面白いことはできそう
Export ONNX
Kerasからの変換
keras2onnxを使用
Pytorchからの変換
torch.onnxを使用
Pytorchにおけるワークアラウンド
Pytorch 0.3系の学習済みモデルを変換時に
'BatchNorm2d' object has no attribute 'track_running_stats'
というエラーが発生する問題への対処
詳しくは https://github.com/axinc-ai/export-to-onnx/wiki/Pytorch-Workaround を参照
Chainerからの変換
onnx-chainerを使用
Tensorflowからの変換
tf2onnxを使用、GraphをFreezeする必要がある(後半の最適化も入れてあります)
Tensorflowにおけるワークアラウンド
BatchNormalizationでmoving_varianceのvariableをfrozenできない問題への対処
ValueError: graph_def is invalid at node u'BatchNorm/cond/AssignMovingAvg/Switch': Input
https://github.com/axinc-ai/export-to-onnx/wiki/Tensorflow-Workaround
Optimize ONNX
VGG16を各フレームワークで出力してみた
フレームワークによって出力されるレイヤーが大きく異なる
出力されたONNXの確認
netronを使うとブラウザでグラフを確認可能
https://github.com/lutzroeder/netron
keras2caffeしたモデルをnetronで確認
(一部略)
VGG16@Keras
keras2onnx
FlattenはReshapeに展開さ
れる
FC層はMatMulに展開され
る
ChannelLastの場合、最初
にChannelFirstに変換され
る
(一部略)
VGG16@Pytorch
torch.onnx
FlattenはGatherに展開される
FC層はGemmに展開される
(一部略)
VGG16@Chainer
onnx-chainer
FlattenはReshapeに展開される
FC層はGemmに展開される
VGG16@Tensorflow
tf2onnx
FlattenはReshapeに展開される
FC層はMatMulに展開される
レイヤー間にTransposeが発生
今回のオプティマイズの方向性検討
1. ONNX公式のオプティマイズを実行(Bachnormのレイヤーフュージョン)
2. Tensorflowに追加されたオプティマイズを実行(Transposeの削減)
1番を実施のためのONNXのオプティマイズ
model = onnx.load(onnx_path)
opt_passes = ['extract_constant_to_initializer', 'fuse_add_bias_into_conv', 'fuse_bn_into_conv',
'fuse_consecutive_concats', 'fuse_consecutive_log_softmax', 'fuse_consecutive_reduce_unsqueeze',
'fuse_consecutive_squeezes', 'fuse_consecutive_transposes', 'fuse_matmul_add_bias_into_gemm',
'fuse_pad_into_conv', 'fuse_transpose_into_gemm', 'eliminate_deadend', 'eliminate_identity',
'eliminate_nop_dropout', 'eliminate_nop_monotone_argmax', 'eliminate_nop_pad',
'eliminate_nop_transpose', 'eliminate_unused_initializer', ]
model = onnx.optimizer.optimize(model, opt_passes )
onnx.optimizer.optimizeを使用することでグラフ最適化を行うことができる(これはとりあえず全
部入れています)https://github.com/onnx/onnx/tree/master/onnx/optimizer/passes
オプティマイズの効果
pytorchで出力したresnet50の
ONNXモデルに適用
BatchNormalizationがConvの重み
にマージされ、軽量化された
オプティマイズのパフォーマンス
グラフは短くなったが、バッチノーマライゼーションの処理負荷があまり高くないので
実はそんなに変わらなかった
最適化前 最適化後
ONNXファイル 102.7MB 102.1MB
prototxtファイル 188KB 81KB
処理時間 (10フレーム平均) 151.8ms 157.2ms
メモリ使用量 152.2MB 151.9MB
ONNX runtime
MacPro 2013, 3.7 GHz Quad-Core Intel Xeon E5, 16GB Memory, AMD FirePro D300 2GB
2番実施のためのTensorflowにおけるTransposeの抑制
TransposeはTensorflowのNHWCとONNXのNCHWの相違が原因
TransposeOptimizerを使用することでTransposeを削減可能
Transpose削減のパフォーマンス
効果は絶大
最適化前 最適化後
ONNXファイル 553.4MB 553.4MB
prototxtファイル 33KB 19KB
処理時間 (10フレーム平均) 440.9ms 307.6ms
メモリ使用量 647.2MB 647.2MB
ONNX runtime
MacPro 2013, 3.7 GHz Quad-Core Intel Xeon E5, 16GB Memory, AMD FirePro D300 2GB
更なる最適化について
インプレース演算(同じメモリ領域に書き出す)を行うことでメモリ効率の向上を期待できる
例えば、MetalPerformanceShaderではConvとActivationは同時に実行できるため融合することで高
速化を期待できる
ただし、ONNXのファイルフォーマットでは定義されていないため、ランタイム側での
実装が必要
その他、学習側でChannelPruningなどが有効と考えられる
Inference ONNX
ONNX Runtimeによる推論
ONNX RuntimeのPython APIによる推論
import onnxruntime as rt
onnx_sess = rt.InferenceSession("sample.onnx")
X = numpy.random.random((1, 32, 32, 1)).astype(numpy.float32)
pred_onnx = onnx_sess.run(None, {"in:0":X})
print(pred_onnx)
当社が提供する ailia SDK による推論
ailia SDKのPython APIによる推論、クロスプラットフォームでGPUが使用可能
C++とC# APIにも対応しておりモバイル (iOS、Android) でもONNXを直接読み込んで推論が可能
import ailia
net = ailia.Net(“sample.onnx.prototxt”,”sample.onnx”)
preds_ailia = net.predict(ary)[0]
Summary
Summary
ONNXによってモデルフォーマットが標準化された
トレーニングとインファレンスで好きなフレームワークが使えるようになった
ailia SDKはモバイルを含むGPU対応推論エンジンとしてONNX対応を進めていきます
Appendex
本日の資料で使用したスクリプトは下記のgithubリポジトリからダウンロード可能です
https://github.com/axinc-ai
エクスポートした種々のモデルは下記のgithubリポジトリからダウンロード可能です
https://github.com/axinc-ai/ailia-models
deeplabv3、noise2noise、resnet50、srresnetなどをopset=10でエクスポートしてあります
その他詳しい話をしたい方は、ブースへどうぞ!
アンケートご協力お願い致します

More Related Content

What's hot

強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験
克海 納谷
 
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
Kosuke Shinoda
 
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
NTT DATA Technology & Innovation
 
ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争
Yosuke Shinya
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介
Recruit Technologies
 
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
joisino
 
SSII2019企画: 点群深層学習の研究動向
SSII2019企画: 点群深層学習の研究動向SSII2019企画: 点群深層学習の研究動向
SSII2019企画: 点群深層学習の研究動向
SSII
 
画像認識モデルを作るための鉄板レシピ
画像認識モデルを作るための鉄板レシピ画像認識モデルを作るための鉄板レシピ
画像認識モデルを作るための鉄板レシピ
Takahiro Kubo
 
4 データ間の距離と類似度
4 データ間の距離と類似度4 データ間の距離と類似度
4 データ間の距離と類似度
Seiichi Uchida
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
Shota Imai
 
Ml system in_python
Ml system in_pythonMl system in_python
Ml system in_python
yusuke shibui
 
画像処理AIを用いた異常検知
画像処理AIを用いた異常検知画像処理AIを用いた異常検知
画像処理AIを用いた異常検知
Hideo Terada
 
If文から機械学習への道
If文から機械学習への道If文から機械学習への道
If文から機械学習への道
nishio
 
畳み込みニューラルネットワークの研究動向
畳み込みニューラルネットワークの研究動向畳み込みニューラルネットワークの研究動向
畳み込みニューラルネットワークの研究動向
Yusuke Uchida
 
Deep Learningと画像認識   ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識   ~歴史・理論・実践~
nlab_utokyo
 
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
Hirokatsu Kataoka
 
MLOps入門
MLOps入門MLOps入門
MLOps入門
Hiro Mura
 
モデルではなく、データセットを蒸留する
モデルではなく、データセットを蒸留するモデルではなく、データセットを蒸留する
モデルではなく、データセットを蒸留する
Takahiro Kubo
 
20090924 姿勢推定と回転行列
20090924 姿勢推定と回転行列20090924 姿勢推定と回転行列
20090924 姿勢推定と回転行列
Toru Tamaki
 
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
西岡 賢一郎
 

What's hot (20)

強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験
 
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
PyTorchLightning ベース Hydra+MLFlow+Optuna による機械学習開発環境の構築
 
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
MLOps に基づく AI/ML 実運用最前線 ~画像、動画データにおける MLOps 事例のご紹介~(映像情報メディア学会2021年冬季大会企画セッショ...
 
ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介
 
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
Word Tour: One-dimensional Word Embeddings via the Traveling Salesman Problem...
 
SSII2019企画: 点群深層学習の研究動向
SSII2019企画: 点群深層学習の研究動向SSII2019企画: 点群深層学習の研究動向
SSII2019企画: 点群深層学習の研究動向
 
画像認識モデルを作るための鉄板レシピ
画像認識モデルを作るための鉄板レシピ画像認識モデルを作るための鉄板レシピ
画像認識モデルを作るための鉄板レシピ
 
4 データ間の距離と類似度
4 データ間の距離と類似度4 データ間の距離と類似度
4 データ間の距離と類似度
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
 
Ml system in_python
Ml system in_pythonMl system in_python
Ml system in_python
 
画像処理AIを用いた異常検知
画像処理AIを用いた異常検知画像処理AIを用いた異常検知
画像処理AIを用いた異常検知
 
If文から機械学習への道
If文から機械学習への道If文から機械学習への道
If文から機械学習への道
 
畳み込みニューラルネットワークの研究動向
畳み込みニューラルネットワークの研究動向畳み込みニューラルネットワークの研究動向
畳み込みニューラルネットワークの研究動向
 
Deep Learningと画像認識   ~歴史・理論・実践~
Deep Learningと画像認識 ~歴史・理論・実践~Deep Learningと画像認識 ~歴史・理論・実践~
Deep Learningと画像認識   ~歴史・理論・実践~
 
CV分野におけるサーベイ方法
CV分野におけるサーベイ方法CV分野におけるサーベイ方法
CV分野におけるサーベイ方法
 
MLOps入門
MLOps入門MLOps入門
MLOps入門
 
モデルではなく、データセットを蒸留する
モデルではなく、データセットを蒸留するモデルではなく、データセットを蒸留する
モデルではなく、データセットを蒸留する
 
20090924 姿勢推定と回転行列
20090924 姿勢推定と回転行列20090924 姿勢推定と回転行列
20090924 姿勢推定と回転行列
 
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
 

DLLAB Engineer Days : ONNX Export & Optimize

Editor's Notes

  1. みんながフォークして独自実装 フォーク先のCaffeしか動かない
  2. Rangeは1~5などのパラメータを段階的に出力する
  3. EarlyTemination = breakのような途中で演算を止めて次に行く 階層的な識別モデル → 顔認識→性別推定などを1モデルでやってしまう
  4. よく起きる track_runnning_statsのプロパティを設定しないとエラーになることがある
  5. Graphをフリーズする必要があるが、フリーズに失敗した際の対処方法
  6. 表示は変換した後のグラフを可視化したもの Keras VGG16→ONNXへ変換後 Transposeが入るのが一番大きな違い(チャンネルラスト→チャンネルファーストに変換のため) Flatten(2次元画像→1次元画像に並び替える)がReshapeになる
  7. PytochはチャンネルファーストなのでTransposeは入らない Gatherはテーブル参照並び替えのため重そうに見える FC=FreeConnected(全結合層)がGemmになる
  8. こちらもチャンネルファースト Reshape->Gemmになる 素直な感じ
  9. Transposeが各所に入る→重くなる