Help us understand the problem. What is going on with this article?

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まわりの計測・デバッグ手法はもうちょっと勉強したいところです。

shu223
フリーランスiOSエンジニア 著書:『iOS×BLE Core Bluetooth プログラミング』『Metal入門』『実践ARKit』『Depth in Depth』『iOSアプリ開発 達人のレシピ100』他 GitHubの累計スター数23,000超
http://shu223.hatenablog.com/
engineerlife
技術力をベースに人生を謳歌する人たちのコミュニティです。
https://community.camp-fire.jp/projects/view/280040
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした