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