MRが楽しい

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

Unity AIのドキュメントを読む その53(推論エンジンによるモデルの実行方法)

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

Unity AI

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

推論エンジンによるモデルの実行方法

推論エンジンは中央処理装置 (CPU) 上の複数のスレッドにまたがって最適化されたテンソル演算を実行します。
またグラフィックス処理装置 (GPU) 上ではコンピュートシェーダーまたはピクセルシェーダーを介して演算を並列実行します。

ワーカーがモデルをスケジュールする際、各レイヤーを順番に処理します。
各レイヤーでは、入力テンソルに対する対応する演算をスケジュールして1つ以上の出力テンソルを計算します。

選択したバックエンドタイプによってワーカーが各演算を実行する方法とタイミングが決まります。
以下は利用可能なバックエンドの種類に関する説明です。

CPU

推論エンジンは演算用のバーストジョブを作成、設定、スケジュールします。
入力テンソルが他のジョブからの出力である場合、ワーカーはジョブ依存関係を作成してブロックすることなく正しい推論を保証します。
実行環境はCPUです。

GPUCompute

推論エンジンはコンピュートシェーダーを作成、設定し、コマンドバッファに追加します。
推論エンジンはコマンドバッファを実行して演算を実行します。
実行環境はGPU(コマンドバッファ付き推論エンジンのコンピュートシェーダー)です。

GPUPixel

推論エンジンはブリット方式でピクセルシェーダーを作成、設定、実行します。
実行環境はGPU(推論エンジンのピクセルシェーダー)です。

テンソル出力

推論エンジンがテンソルオブジェクトを返す時点ではテンソルの値はまだ完全に計算されていない可能性があります。
これはスケジュールされた作業の一部がまだ保留中になっている可能性があるためです。
この遅延処理により、以前のタスクの完了を待たずに追加のテンソル演算をスケジュールできます。

バックエンドで作業の処理を完了するにはテンソルデータをCPUに移動します。
ReadbackAndCloneを呼び出してテンソルのCPUコピーを取得します。
これはバックエンドが処理を完了してデータを返すまで同期的に待機するブロッキング呼び出しです。
このプロセスは特にGPUから読み戻す場合は遅くなる可能性があることに注意してください。

メインスレッドでのブロッキング呼び出しを回避するには次のいずれかを使用します。

  • ReadbackAndCloneのメソッドのAwaitableバージョンはReadbackAndCloneAsyncです。
  • ReadbackRequestは非同期ダウンロードをトリガーします。
  • IsReadbackRequestDoneがtrueを返すとReadbackAndCloneが直ちに実行されます。

ブロッキング、非破壊ダウンロードでテンソルデータをCPUに移動するには次のいずれかを使用します。

  • テンソルに対してReadbackRequestを実行します。
  • テンソルに対してReadbackAndCloneAsyncを実行します。
  • DownloadToNativeArrayまたはDownloadToArrayを実行します。
  • テンソルのdataOnBackendに対してDownloadを実行します。

CPU フォールバック

推論エンジンはすべてのバックエンドタイプですべての演算子をサポートしているわけではありません。

CPUでは演算子をサポートしているものの、GPUではサポートしていない場合、推論エンジンは自動的にCPUでの実行にフォールバックすることがあります。
この場合、推論エンジンはGPUと同期し、入力テンソルをCPUに読み戻す必要があります。
GPU演算で出力テンソルが使用される場合、推論エンジンは演算を完了してテンソルGPUにアップロードします。

モデルにCPUフォールバックを使用するレイヤーが多数ある場合、推論エンジンはCPUへのアップロードと読み戻しにかなりの時間を費やす可能性があります。
これはモデルのパフォーマンスに影響を与える可能性があります。
CPUフォールバックを削減するには推論エンジンが選択したバックエンドタイプで効率的に動作するようにモデルを構築するか、CPUバックエンドを使用してください。

推論エンジンは演算のスケジュールを設定するために、メインスレッドで以下のようなテンソルデータを読み取る必要がある場合があります。

これらの入力テンソルは他の演算からの出力である可能性があります。
モデルの入力処理中、エンジンは選択されたバックエンドに関係なくどのテンソルをCPUで実行する必要があるかを自動的に最適化して決定します。