MRが楽しい

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

Unity AIのドキュメントを読む その58(コマンドバッファを使用する)

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

Unity AI

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

コマンドバッファを使用する

コマンドバッファを使用すると、推論エンジンコマンドのキューを作成して後でグラフィックス処理装置 (GPU) で実行できます。
コマンドバッファを使用するには以下の手順に従います。

  1. 空のコマンドバッファを作成または取得します。
  2. バックエンドタイプがGPUComputeのワーカーを作成します。
  3. Unityイベント関数(OnRenderImage など)で推論エンジンメソッドをコマンドバッファに追加します。
  4. Graphics.ExecuteCommandBufferを使用してコマンドバッファを実行します。

コマンドバッファにコマンドを追加するには以下のいずれかを実行します。

  • コマンドバッファをパラメータとして受け取る推論エンジンAPI(例:TextureConverter.ToTensor)を使用します。
  • コマンドバッファのScheduleWorkerメソッドを使用してモデルを実行するコマンドを追加します。

以下のコードはコマンドバッファキューを作成して実行します。
このキューはまずレンダリングテクスチャを入力テンソルに変換します。
次にモデルを実行し、最後に出力テンソルレンダリングテクスチャに戻します。

// GPUComputeバックエンドタイプを使用するワーカーを作成する
worker = new Worker(ModelLoader.Load(modelAsset), BackendType.GPUCompute);

//...

// 入力テンソルを使用してモデルを実行するモデル実行コマンドバッファを追加します。
commandBuffer.ScheduleWorker(worker, inputs);

CommandBufferを一度構築し、フレームごとに入力を更新してCommandBufferを実行します。
これによりスケジューリング時間が半分に短縮されます。

Tensor<float> input0 = new Tensor<float>(new TensorShape(1));
Model model;
CommandBuffer cb;
Worker worker;

void Start()
{
    worker = new Worker(model, BackendType.GPUCompute);

    worker.SetInput("input0", input0);

    cb = new CommandBuffer();
    cb.ScheduleWorker(worker);
}

void Update()
{
    // input0を変更する
    input0.Upload(new float[] { Time.deltaTime });
    Graphics.ExecuteCommandBuffer(cb);
}