iizukak の雑記

忘れる前に書いとこう

Unity Barracuda について調べる

概要

Unity Barracuda は、 Unity ゲームエンジン上でニューラルネットワークモデルの推論を実行するための "推論エンジン(Inference Engine)" です。学習環境は含まれません。 もともとは ml-agents という Unity 用の強化学習ライブラリに入っていたコードが、独立したライブラリとして利用可能になったという経緯があります。 ニューラルネットワークモデルのフォーマットとしては、 ONNX(.onnx) および TensorFlow(.pb) をサポートしています。 現在のバージョンは 0.6.1 で、Github のアクティビティを見るとまだまだ開発途中という様相です。 これがわりと未来を感じる代物なのです。

なにが嬉しいのか

ゲーム機にウェブカメラ等の普通のカメラを接続し、身体をゲームコントローラにできるのが利点なのではないかと思います []。 姿勢推定を用いれば ダンスゲームのコントローラになりますし、 フィットネスゲームも作れるでしょう。 顔を認識して、表情で遊ぶゲーム(とはいったい)なども作れると思います。 もちろん、姿勢推定は Kinnect とかでもできたわけですが、 とても安い普通のカメラ、それこそ 1000 円のウェブカメラで十分なのです。 Unity はスマートフォンなどにもデプロイできるため、 スマートフォン向けのゲームアプリも作れるでしょう。

技術的な概要

Barracuda は推論エンジンなので、どこかで学習してきた DNN モデルを使って推論のみ実行します。これは TensorFlow Litetvm と同様ですね。特徴的なのは、推論部分のコードが C# で書かれている点です。

利用する流れは大雑把に言って、

  1. なにかのニューラルネットワークフレームワークでモデルを学習する
  2. Barracuda で読み込めるフォーマットにモデルを変換する
  3. Barracuda で変換後のモデルを読み込み、画像や音声データを対象に推論を実行する

という流れになります。1. の要件としては、2. で Barracuda で読めるフォーマットに変換できればよいため、 2. のフォーマットをサポートした好きなフレームワークを使えます。 2. のフォーマットとしては、 ONNX(.onnx) と TensorFlow(.pb) のフォーマットが使えます。 TensorFlow の pb(protocol buffer) 形式のモデルを使う場合は、Barracuda に含まれるコンバータを用いてさらに .nn 形式に変換してから Barracuda に読み込みます。

基本的には ONNX を使うのが勝手が良いと思います。 ONNX は多くのニューラルネットワークフレームワークで対応が可能です。 TensorFlow, PyTorch, Flux などでも、ライブラリを使って ONNX 形式でモデルを保存できます。

Barracuda は、これらのモデルを読み込んだあと、計算の塊であるモデルをパースして、 全結合層や畳み込み層などに、処理内容を細かく解きほぐします。 これをオペレータといいます。 推論の実行時には、入力されたデータを、オペレータにどんどん適用する作業をします。

このオペレータを効率的に実装するのはとても難しいと思います。 推論実行速度のため、オペレータは普通は C/C++ で書くのですが、Barracuda は気合で C# で実装されているようですね。 あまり実装まで読めていないので、じつは違うかもしれないですが。

サポートされているオペレータ

推論のみを実行するソフトウェアを利用するときにまず気になるは、サポートされているオペレータがなにか、です。 サポートされているオペレータいかんで、利用可能なネットワークの構造が決定されるためです。リストは ここ にドキュメント化されています。以下にコピペします。

Add
Sum
Sub
Mul
Div
Pow
Min
Max
Mean
AveragePool
MaxPool
GlobalAveragePool
GlobalMaxPool
Upsample
Gemm
MatMul
Conv
ConvTranspose
BatchNormalization
InstanceNormalization
Greater
Less
Equal
Or
And 
Not 
Xor
Pad
Constant
Identity
Cast
Dropout
Reshape
Unsqueeze
Squeeze
Flatten
Concat
Slice

概ね代表的なものはそろっているようです。 TensorFlow のリストもドキュメントになっています。

利用可能なネットワーク

Barracuda では、どういった種類のネットワークが利用可能かは明示的に示されていません。しかしながら、上記のサポートオペレータを見ればだいたい検討がつくため、用意していないのだと思います。VGG, ResNet, MobileNetV2 あたりは普通にサポートできそうです。GlobalAveragePool があるのもよいですね。

もちろん、ネットワークはなるべく小さくしたほうがよいでしょう。ResNet 150 なんかになると、ふつうのスマートフォンでは厳しいんじゃないかと思います。お手軽なデバイスで動かすには、できれば畳み込みは 20 層くらいにしたほうが良いんじゃなかろうか。

パフォーマンス

速度も気になりますが、ネットワーク構造にかなり依存するので実際に使ってみないとなんともいえなさそうです。ソースコードを漁っていたら、 ベンチマーク ぽいものを見つけましたが、公式なものではなさそう。

次は自分で ONNX モデルを推論させてみます。