Edited at
MetalDay 3

iOSの機械学習フレームワークの比較 - Core ML / Metal Performance Shaders (MPSCNN) / BNNS

More than 1 year has passed since last update.

iOS 11 で追加された Core ML と、iOS 10 の頃からある Metal Performance Shaders の CNN、Accelerate の BNNS について、2017年7月に勉強会で話した際のスライドです。

Screen Shot 2017-07-27 at 0.38.17.png


発表の概要

iOS 11で追加されたCore MLが非常に注目を集めていますが、「既存の機械学習ツールを使って学習させたモデル(のパラメータ)をiOS側に持ってきて推論を実行する」ということ自体はiOS 10からありました。

Screen Shot 2017-07-27 at 0.28.52.png

Screen Shot 2017-07-27 at 0.29.04.png

そして、そこに不便さがあったので広まらず、Core MLで改善されたことにより使われるようになった、という側面はもちろんありつつも、いややはりそれでも単にそういうことがiOS 10できるようになったということ自体が知られていなかっただけなのでは、と Core ML と Metal Performance Shaders の注目度のあまりの違いから考えていました。

確かに自分も Metal Performance Shaders のCNN APIを用いた機能を実装しようとしたときに、情報があまりに少なく、何ができて何ができないのか、どうやるのかがよくわからなかった、ということがありました。

で、そのへんをシンプルに説明したら、もっと興味をもつ人も出てくるんじゃないかなと思い、実装手順を3ステップで解説してみました。


MPSCNNを用いた機械学習機能の実装手順3ステップ


Step 1: モデルをつくる

Screen Shot 2017-07-25 at 6.25.28.png

Core ML は Keral, Caffe, scikit-learn, etc. といったメジャーな機械学習ツールで学習させたモデルからのコンバートをサポートしていることが大きなポイントですが、それらの学習結果を「使える」という点ではMPSCNNも同様です。


Step 2: ネットワークを実装する

Screen Shot 2017-07-25 at 6.25.43.png

Screen Shot 2017-07-25 at 6.25.52.png


Step 3: 推論の実行処理を書く

Screen Shot 2017-07-25 at 6.26.05.png


MPSCNN のつらみと Core ML & Vision

上記のMPSCNNを用いた実装手順、意外と簡単そう/使えそう と思っていただけたのではないでしょうか?

ところが・・・

Screen Shot 2017-07-25 at 6.26.45.png

Screen Shot 2017-07-25 at 6.27.00.png

っていうつらさがあり、他にも色々と面倒な点があり、やっぱりCore ML & Visionのおかげで各段に便利になった、という話をスライドに書いています


BNNS の使いどころ、MPSCNN との使い分け

最後にAccelerateフレームワークのBNNSの使いどころについてWWDC17のMetal Labで聞いた話が出てきます。

Screen Shot 2017-07-25 at 7.29.05.png

スライドの該当ページ


BNNSについていただいたコメント

この点について、スライドを読んだsonsonさんからFacebookでコメントいただきました。

Screen Shot 2017-07-25 at 12.38.48.png


BNNSとMPSCNNの使い分けは,難しいけど,電力と計算スピードのバランスかなぁと思います.

あと,GPUのメモリとCPUのメモリ間の転送に時間がかかるので,オーバーヘッドをカバーできるくらい,データや計算量大きくないと,GPUは意味ないでしょう.

BNNSは,SIMDなので,これも当然CPUのコンテキストスイッチのためのオーバーヘッド(ノーマルモードとSIMDモードの切り替え)があるのですが,GPUほどではないので,小さいネットワークだとGPUよりBNNSの方が速いというのはありそうです.

まぁ,なんで,電力と速度の限界に挑戦する場合は,ベンチマークとって極限を目指そうって感じですかねw


なるほど、単に「CNNの計算はGPUが向いてるでしょ」とか「Appleの人も言ってた」とかってだけでBNNSのことは忘れようとか言ってちゃいけない、と反省しました。

確かに GPU <-> CPU間の転送速度のボトルネックとGPUによる高速化がどれぐらい見込まれるかのバランスによる というのは非常に納得です。また「SIMDモードへの切り替えのオーバーヘッド」(はあるがGPUとの転送ほどではない)というあたりもまったく考慮できてなかったところです。

CPU、GPUの負荷がそれぞれどれぐらいか、というのはXcodeで簡単に見れますが、GPU <-> CPU間の転送状況を見る方法もあるのでしょうか?GPUまわりの計測・デバッグ手法はもうちょっと勉強したいところです。