本日はUnityの技術調査枠です。
Unity AIのドキュメントを読みながら実際に操作を試して記事に残します。
Unity AI
以下のUnity AIのドキュメントを試しながら実行時のキャプチャをしていきます。
docs.unity3d.com
推論エンジンにおけるテンソルの基礎
推論エンジンではテンソルと呼ばれる多次元配列を用いて入出力データをモデル化します。
これらのテンソルはTensorFlowやPyTorchなどの機械学習フレームワークにおけるテンソルと同様に機能します。
テンソルは最大8次元まで持つことができます。
0次元のテンソルはスカラーと呼ばれる単一の値を保持します。
以下の種類のテンソルを作成できます。
メモリレイアウト
推論エンジンはテンソルを行優先でメモリに格納するため、最後の次元の値は隣接して格納されます。
0から11までの値を持つ2×2×3テンソルはメモリに格納される際はリストになります。
メモリ格納時
0,1,2,3,4,5,6,7,8,9,10,11
フォーマット
モデルは通常、特定の形式の入力テンソルを必要とします。
例えば画像を処理するモデルでは3チャンネルの240×240画像が以下のいずれかの形式で必要になる場合があります。
- 1×240×240×3(次元の順序はバッチサイズ、高さ、幅、チャンネル数(NHWC))
- 1×3×240×240(次元の順序はバッチサイズ、チャンネル数、高さ、幅(NCHW))
テンソルの形式が想定される入力と一致しない場合、モデルは誤った結果や予期しない結果を返す可能性があります。
メモリの場所
推論エンジンは選択したバックエンドの種類に応じて、テンソルデータをGPUメモリまたはCPUメモリに保存します。
バックエンドの種類としてBackendType.GPUComputeを使用する場合、テンソルは通常GPUメモリに保存されます。
テンソル要素への直接の読み書きはテンソルがCPU上にある場合にのみ可能であり、速度が低下する可能性があります。
パフォーマンスを向上させるにはFunctional APIを使用してモデルを変更する方が効率的です。
推論エンジンによるブロッキングリードバックとアップロードの実行を防ぐにはコンピュートシェーダー、バーストまたはネイティブ配列を使用します。
これによりメモリ内でテンソルデータを直接読み書きできます。
出力テンソルを読み取る必要がある場合は非同期リードバックを実行します。
これによりモデルが終了してテンソル全体をダウンロードするまで推論エンジンがメインコードスレッドをブロックするのを防ぎます。