前回実装した、Objective-Cを用いてCore MLを呼び出すコードを用いて、dlshogiモデルの動作速度をベンチマークしました。
使用するモデルは、「強い将棋ソフトの創りかた」サンプルコードに従い学習した、15ブロック224チャンネル(resnet15x224_swish)のモデルです。比較するのは、使用するcompute units (Neural Engine / GPU / CPU)および、ONNX Runtimeを使用した場合です。ONNX Runtimeは、ONNX RuntimeデフォルトのCPU実装と、処理の一部をCore MLに移譲するCoreML Execution Providerの2種類を動作させました。CoreML Execution Provider内で使用されるcompute unitsについては指定する手段がありません。バッチサイズは1および16を試しました。ハードウェアは、Intel Mac (MacBook Air (Retina, 13-inch, 2019))およびM1 Mac (MacBook Air (M1, 2020) (GPUコアは8個))を用いました。測定時間は10秒で、その間に処理できたサンプル数を計測します。また発熱による測定間の影響がないよう、各測定の間に60秒以上の間隔をあけました。
ハードウェア | バッチサイズ | 実行条件 | サンプル/秒 |
---|---|---|---|
M1 | 1 | CPU | 145 |
M1 | 1 | GPU | 112 |
M1 | 1 | NE | 873 |
M1 | 1 | ORT | 93 |
M1 | 1 | ORT+CoreML | 93 |
M1 | 16 | CPU | 257 |
M1 | 16 | GPU | 581 |
M1 | 16 | NE | 1329 |
M1 | 16 | ORT | 100 |
M1 | 16 | ORT+CoreML | 100 |
Intel | 1 | CPU | 28 |
Intel | 1 | GPU | 46 |
Intel | 1 | NE | 46 |
Intel | 1 | ORT | 48 |
Intel | 1 | ORT+CoreML | 46 |
Intel | 16 | CPU | 45 |
Intel | 16 | GPU | 80 |
Intel | 16 | NE | 78 |
Intel | 16 | ORT | 60 |
Intel | 16 | ORT+CoreML | 60 |
ORT: ONNX Runtime。NE: Neural Engine。ハードウェアがIntelの場合、Neural Engineは搭載されていないため、実際にはGPUで計算されていると考えられます。
M1 MacでのNeural Engineの性能が際立ちます。バッチサイズ16で1329サンプル/秒(将棋エンジンで言えば1329NPS)となりました。CPUの5倍以上、GPUの2倍以上の速度となっています。バッチサイズ1の場合、GPUはかなりスループットが下がりましたが、Neural Engineでのスループット低下は抑えられています。Neural Engineはその目的上DNNの推論に特化しているため、バッチサイズ1での実行を重視した設計になっている可能性があります。ONNX Runtimeは、CoreML Execution Providerを使用しても性能が変化していません。実際にはCore MLが使われていないのかもしれません。Intel Macでは、Core MLでCPUを利用した場合よりONNX Runtimeのほうが高速に動作していますが、M1 Macでは逆になっています。Core MLがM1チップ向けに最適化されているものと予想できます。
なお、M1 MacとNeural Engineの組み合わせでさらに検証したところ、バッチサイズ5で1301サンプル/秒を達成し、バッチサイズを256にしても1335サンプル/秒となりバッチサイズに対してほとんど性能が変わりませんでした。また、2分間連続して動作させても発熱による性能低下は見られませんでした。
ふかうら王をMacで動作させる場合、現在実装されているONNX RuntimeでCPUのみを使うコードと比べ、Core MLでNeural Engineを使うコードへと置き換えることで13倍の速度向上が見込めるということになります。今後、Core MLを呼び出す機構をふかうら王に実装してみたいと思います。