Unity Barracudaによるdlshogiのモデルの推論をAndroidで試してみた。
モデルサイズ
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で実行することを前提に開発した方が良さそうである。