機械学習周りのプログラミング中心。 イベント情報
ポケモンバトルAI本電子書籍通販中

iPadのNeural Engineで将棋AI part06 Core MLでバッチサイズ固定モデル

前回は、実行時にバッチサイズを動的に指定できるモデルを作成し実行しました。今回は、バッチサイズを固定したモデルを作成し、より高いパフォーマンスを発揮するかどうか検証します。どんなバッチサイズでも受け入れるモデルよりも、バッチサイズ16しか受け入れないと最初から指定したほうが最適化できる可能性があるためです。結果として、うまく動きませんでした。

生成方法

前回の可変バッチサイズのモデルよりも単純です。単にバッチサイズを定数で与えればOKです。

batch_size = 64 # 変換時に定数で指定
traced_model = torch.jit.trace(si_model, torch.zeros(batch_size, 119, 9, 9))
ct_input_x = ct.TensorType(name='x', shape=(batch_size, 119, 9, 9))
mlmodel = ct.convert(traced_model, inputs=[ct_input_x])

実行結果

生成したモデルをアプリに組み込んで、iPad上での実行時間を測定しました。バッチサイズごとに別のモデルファイルになるので、バッチサイズを変えるたびにモデルファイルを差し替えてビルドしなおすことになります。実行時間を下表に示します。表内の数値は、各実行環境での実行時間[秒]です。初回実行は遅いので、同じ入力での2回目の実行時間を測定しています。Xとなっている個所は、実行時エラーが発生したものです。バッチサイズは、4の累乗およびプラスマイナス1を指定しました。2の累乗ちょうどだとパフォーマンスが悪いという可能性も想定したためです。結果は、バッチサイズ5以下ではNE (Neural Engine)がうまく動作しており他の環境より高速です。一方で15以上では、NEやGPUがCPUと同等または遅いという結果になりました。さらにバッチサイズを増やすと、エラーが発生して動作しませんでした。バッチサイズ可変モデルでNE環境、バッチサイズ16での実行時間が0.033秒だったので、バッチサイズ可変モデルを使うほうが明らかに高速です。 Core MLはモバイル端末での推論を念頭に実装されていると考えられるため、バッチサイズ1以外の動作は十分テストされていない可能性があります。

バッチサイズ CPU GPU NE
1 0.034 0.028 0.0068
3 0.061 0.051 0.050
4 0.065 0.055 0.058
5 0.070 0.071 0.064
15 0.115 0.114 0.118
16 0.090 0.120 0.118
17 0.096 0.129 0.124
63 0.233 0.239 0.767
64 0.205 0.212 0.800
65 0.210 0.217 0.813
255 0.743 0.789 X
256 0.712 0.856 X
257 0.717 0.828 X
1023 3.00 X X
1024 2.94 X X
1025 X X X

実行時エラーはこのような内容がXcodeに表示されたのち、強制終了しました。

2022-01-31 20:34:33.236848+0900 DlshogiOnCoreML[1015:307097] [espresso] [Espresso::handle_ex_plan] exception=Error creating IOSurface
2022-01-31 20:34:33.246093+0900 DlshogiOnCoreML[1015:307097] [coreml] Error plan build: -1.
2022-01-31 20:34:33.262153+0900 DlshogiOnCoreML[1015:307564] [ServicesDaemonManager] interruptionHandler is called. -[FontServicesDaemonManager connection]_block_invoke

結論としては、バッチサイズ可変モデルを生成したうえで、実行時には固定のバッチサイズを指定する(バッチサイズを変えるたびに初回の実行時間が増えるので)というのが正解のようです。バグが疑われる挙動のため、モデルのわずかな違いや今後のバージョンアップで結果が大きく異なる可能性があります。今回は数回の実行しかしていませんが、今後、長時間にわたってCore MLを動作し続けても問題が生じないか検証していきます。