MRが楽しい

MRやVRについて学習したことを書き残す

Unity AIのドキュメントを読む その41(推論エンジンのモデルを理解する)

本日はUnityの技術調査枠です。
Unity AIのドキュメントを読みながら実際に操作を試して記事に残します。

Unity AI

以下のUnity AIのドキュメントを試しながら実行時のキャプチャをしていきます。
docs.unity3d.com

推論エンジンのモデルを理解する

推論エンジンはOpen Neural Network Exchange (ONNX)形式のトレーニング済み機械学習モデルファイルをインポートして実行できます。
推論エンジンと互換性のあるモデルを取得するには以下のいずれかの方法があります。

  • TensorFlow、PyTorch、Kerasなどのフレームワークを使用してモデルをトレーニングしてその後ONNX形式でエクスポートします。
  • レーニング済みのモデルファイルをダウンロードしてONNX形式に変換します。
  • ONNX Model Zooで提供されているものなど既にONNX形式でトレーニング済みのモデルをダウンロードします。

推論エンジンによるモデルの最適化方法

モデルをインポートすると、モデルグラフ内の各ONNX演算子が推論エンジンレイヤーになります。
インポートされたモデル内のレイヤーのリストを推論エンジンが実行する順序で確認するにはモデルアセットインスペクターを開きます。

推論エンジンはモデルを最適化してサイズを縮小して効率化します。
例えば推論エンジンはインポートされたモデルに対して以下のような処理を行います。

  • レイヤーまたはサブグラフを削除して定数に変換します。
  • レイヤーまたはサブグラフを同じように動作するより単純なレイヤーまたはサブグラフに置き換えます。
  • 推論時にデータを読み取る必要がある場合はレイヤーをCPUで実行するように設定します。
  • 最適化はモデルの入力や出力には影響しません。

モデル入力

モデル入力の形状は以下の2つの方法で取得できます。

  • モデルをインスペクトしてランタイムモデルの[inputs](xref:Unity.Inference Engine.Model.inputs)プロパティを使用します。
  • プロジェクトウィンドウからモデルを選択してモデルアセットインスペクターを開いて[Inputs]セクションを表示します。

モデル入力の形状は複数の次元で構成され、[DynamicTensorShape](xref:Unity.Inference Engine.DynamicTensorShape) として定義されます。
モデル入力の次元は静的または動的のいずれかです。

  • intは静的次元を表します。
  • 名前付き文字列 (例: batch_size、height) は動的次元を表します。これらの名前はONNXモデルに由来します。

静的ディメンション

intの値はモデルが受け入れる入力の特定の形状を定義します。
例えば入力セクションに (1, 1, 28, 28) と表示されている場合、モデルは 1 x 1 x 28 x 28 の形状の入力テンソルのみを受け入れます。

動的ディメンション

動的ディメンションは入力シェイプの柔軟性を高めます。
モデル入力のシェイプにbatch_sizeやheightなどの名前付き動的ディメンションが含まれている場合、その入力ディメンションは任意のサイズにすることができます。
例えば入力のシェイプが (batch_size, 1, 28, 28) の場合、入力シェイプの最初のディメンションは任意のサイズにすることができます。

この入力シェイプに対して入力テンソルを定義する場合、以下のテンソルシェイプが有効です。

[1, 1, 28, 28]
[2, 1, 28, 28]
[3, 1, 28, 28] ...

ただし以下のように別の次元のサイズを変更すると、入力テンソルは無効になります。

[1, 3, 28, 28]

モデルが動的な入力次元を持つ入力を使用する場合、推論エンジンは静的な入力次元を使用するモデルほど効率的にモデルを最適化できない可能性があります。
これによりモデルの実行速度が低下する可能性があります。