TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Unity Barracudaでdlshogiのモデルを推論する その3(Android)

Unity Barracudaによるdlshogiのモデルの推論をAndroidで試してみた。

Android対応

プロジェクト設定でプラットフォームをAndroidにするだけで、測定用コードは前回実装したをそのまま使用した。

測定端末には、Pixel5を使用した。

モデルサイズ

15ブロック224フィルタのモデルを試したところ、異常終了して実行できなかった。
モデルサイズを5ブロック96フィルタにしたところ、正常に実行できるようになった。

モデルサイズが大きいと、スマートフォンではメモリが不足するようである。

推論速度

前回と同じ局面数64000で試したところ、数分待っても応答が返ってこなかったので、局面数を6400に減らして測定した。
バッチサイズ128での推論に費やした時間は、86394 msという結果だった。
1バッチあたり、1727.8 msかかっている。

PCで、6400局面を推論した場合は、658 msであった。
Pixel5は、PCより131倍遅いことがわかった。

バッチサイズ

推論速度がバッチサイズに依存するか、バッチサイズを変えて測定してみた。

バッチサイズ 6400局面の推論時間(ms)
16 93540
32 89066
64 87064
128 86394

それほど変わっていないが、バッチサイズが大きいほど同じデータ量を処理する時間は短くなっている。
推論APIを呼び出すオーバーヘッドが関係していそうである。

CPUとの比較

CPUで推論した場合と比較した。
WorkerFactory.CreateWorkerに渡すWorker種別を、WorkerFactory.Type.ComputeからWorkerFactory.Type.CSharpBurstに変更した。

バッチサイズ128での6400局面の推論時間は、77559 msとなった。
GPUと比べて推論時間が89.7%になっている。

予想に反して、CPUの方が速いという結果になった。

調べたところ、GPUを使う場合は、WorkerFactory.Type.ComputePrecompiledを指定すると事前にモデルがコンパイルされるようだ。
WorkerFactory.Type.ComputePrecompiledに変えて再測定したところ、86224 msとなり、特に速くならなかった。

前回のPCの測定もWorkerFactory.Type.ComputePrecompiledで再測定したが、20315 msとなり、特に速くならなかった。

まとめ

Unity Barracudaによるdlshogiのモデルの推論を、Androidで試した。
PCと同じコードでビルド設定を変えるだけで、Androidで推論できることが確認できた。
ただし、dlshogiの15ブロック224フィルタのモデルでは異常終了し実行できなかった。
5ブロック96フィルタにすると実行できた。

推論速度を計測したところ、PC(RTX 3090)と比較して、推論速度は、131倍遅いということがわかった。
また、Pixel5ではGPUを使用するより、CPUで推論した方が少し速いという結果になった。

スマートフォンでは機種にもよると思うが、GPUによる高速化は期待できないため、CPUで実行することを前提に開発した方が良さそうである。

追記

モバイルで1手1秒使えるとした場合、どれくらいの強さか軽く確認してみた。
5ブロック96フィルタのモデルで、floodgateの2018年以降のR3800以上の棋譜+dlshgiと水匠の対局1200局の棋譜を学習させて、バッチサイズ1、固定プレイアウト64、1スレッド、df-pnなしでLesserkaiと10局対戦させてみたところ、10勝0敗であった。
64プレイアウトでも人間の初級者とプレイするには十分な強さで、スマートフォンでも遊べる将棋ソフトになりそうである。