onnxruntimeのグラフ最適化1
onnxruntimeではどんなグラフ最適化がされているか観てみる。
概要はonnxrutimeのドキュメントにまとまっている。
Graph Optimization Levels
ここをみてみるとグラフ最適化は以下の3つのレベルに分けられるとある。
- Basic
冗長なノードや計算を削除する操作(ConstantFolding, Redundant node eliminations等) Extended 複雑なノード融合が含まれ、cuda,cpuに割り当てられたノードに適用される(GEMM Activation fusion, Attention Fusion等)
Layout Optimization データレイアウトを最適化する。CPUに割り当てられたノードに適用される
- NCHWc optimizer NCHWの代わりに、NCHWcレイアウトを適用する。
Online/Offline Mode
Online mode
推論を実行する前にInferenceSessionを初期化し、このときに有効になっているグラフ最適化を適用する。Sessionを起動するたびに最適化を適用するので、モデルの起動時間にオーバーヘッドが生じ、本番環境では問題になる可能性がある。
Offline mode
最適化下グラフをディスクに保存しとくことによって、次に推論をするときに最適化後のモデルを読み込むことができる。
次はソースコードで対応する部分を観てみる。 読む箇所メモ:
- onnxruntime/onnxruntime/core/optimizer/graph_transformer_utils.cc
- onnxruntime/onnxruntime/core/session/inference_session.cc