2021/04/04 - UnityでLSTM

ができないっていう話だけど。

ウェザタイのワード自動生成をUnityでも動かせるようにしたいので検討しているのだが、うまい方法がない。

UnityにBarracudaという機能があって、ニューラルネットのパラメータの標準的なフォーマットONNXが使えるらしい。ウェザタイのワード自動生成では、embed層、LSTM層、全結合層のスタンダードな構成なのでPythonの深層学習ライブラリで作るなら割と簡単。

で、まずはkerasのLSTMを使って日本語生成してみた。それ自体はうまくいったのだが、ONNXへの変換でつまる。keras2onnxではそもそもTensorflow2の機能を使っているとダメのようで、disable_v2_behaviorをやってみたりしたが、うまくいかない。

次にPyTorchを試す。こちらも日本語生成自体はうまくいった。ONNX変換もダミーインプットにちょっと試行錯誤がいるが、torch.onnx.exportで変換はできた。が、Unityにもっていくとインポートができない。embedレイヤーが使っているインデックスをサポートしていないっぽい。

追記:Barracudaのプレビュー版にしたらインポートまではできた。

最後、C#で一から作ったライブラリも試してみる。ウェザタイで作ったやつは高速化のため、行列の積にAVXとかSSEとかのSIMD命令を使っているのだが、Unityはマルチプラットフォームなのでそのままは使えない。そういう場合はBurstコンパイラを使うことになるらしいのだが、いろいろ制限があるようで、InvalidOperationExceptionになってしまう。C#で行列の積を実装すればいいはいいのだが、現実的じゃない計算コストがかかってしまう。

てところでいずれも無理。UnityでLSTM動かしている人はまだいないのかな。Pythonで大量に文章を自動生成できるので、100万ワードくらい生成して配布すればまあいいのかもしれないけど。。。

コメントする