昨日FiNCさんのオフィスで開催された「WWDC2017振り返り勉強会」で『Core ML vs MPSCNN vs BNNS』というタイトルでLTしてきました。
iOS 11で追加されたCore MLが非常に注目を集めていますが、「既存の機械学習フレームワークを使って学習させたモデル(のパラメータ)をiOS側に持ってきて推論を実行する」ということ自体はiOS 10からあって、そこに不便さがあったので広まらず、Core MLでやっと使われるようになった、という側面はもちろんありつつも、いややはりそれでも単にそういうことがiOS 10できるようになったということ自体が知られていなかっただけなのではと。
それにしてもCoreMLはこんなに話題になるのに、なぜMPSCNNはあんまり盛り上がらなかったのか。「iOS側でのネットワーク実装とかモデル持ってくるのとか色々面倒」というCoreMLで改善された部分がネックになる以前に、そもそも
— Shuichi Tsutsumi (@shu223) 2017年7月16日
(つづき)そもそも「他ツールで学習させたモデルを利用してiOS側で推論を実行できるようになったよ」っていうこと自体もあまり知られてなかった気がする。(そしてCore MLでそれができるようになった!って言ってる記事も見かける。。) https://t.co/SA23gU4WII
— Shuichi Tsutsumi (@shu223) 2017年7月16日
確かに自分も Metal Performance Shaders のCNN APIを用いた機能を実装しようとしたときに、情報があまりに少なく、何ができて何ができないのか、どうやるのかがよくわからなかった、ということがありました。
で、そのへんをシンプルに説明したら、もっと興味をもつ人も出てくるんじゃないかなと思い、実装手順を3ステップで解説してみました。
- Step 1: モデルをつくる
- Step 2: ネットワークを実装する
- Step 3: 推論の実行処理を書く
意外と簡単そう/使えそうではないでしょうか?
ところが・・・
っていうつらさがあり、他にも色々と面倒な点があり、やっぱりCore ML & Visionのおかげで各段に便利になった、という話でした。
最後にAccelerateフレームワークのBNNSの使いどころについてWWDC17のMetal Labで聞いた話が出てきます。
(登壇の様子 by yucovin さん)
つつみさん、10分の発表でスライド45枚に挑戦中!!!(( ゜ロ゜)ノ #fincwwdc #そこじゃない pic.twitter.com/DcAUxlwV2P
— ゆこびん@WWDC2017*アプリ道場 (@yucovin) 2017年7月24日
なぜこの話をしたのか
上の説明だけを読むとまるでMPSCNNの普及活動をしている人みたいですが、動機はそこではなくて、来月登壇する アメリカのiOSカンファレンス で、"Deep Learning on iOS" というタイトルで発表することが決まっていて、
で、これってWWDC17開催前にCfPを出して通ったやつなので、応募当時はMPSCNNの話をするつもりだったのに、Core MLが出てしまって事情が変わってしまった、どうしよう、という。。
じゃあCore MLの話をすればいいじゃん、と思うかもしれません。その通りかもしれません。でも僕自身がまだあまり試せてないのと、Core MLの場合はiOS側が便利になりすぎてむしろ機械学習フレームワーク側(Kerasとか)がメインになるけどそっちは初心者とすらいえないレベルだし、ってことでMPSCNNの方に解説を寄せよう、という試行錯誤の中で「こんな切り口はどうだろう」と考えたのが昨日の発表なのでした。
実際に話してみて、正直なところコレジャナイ感はちょっとありました。もうちょっとワクワクする感じにならないか、実例とかデモとかを増やす感じでブラッシュアップしてみようと思ってます。(来月のカンファレンスは発表時間が45分もあるので、個々の解説ももうちょっと丁寧にやる予定)
おわりに
WWDCには参加したものの、そのままアメリカにいたのでこういう振り返り勉強会に参加できず(※例年勉強会発表ドリブンで新APIを勉強していた)、あっちではこういうLTで気軽に登壇できる勉強会もあまりないので、1ヶ月後というわりとWWDC勉強会としては珍しいタイミングで開催された本イベントは大変ありがたかったです。
LTですが非常に中身の濃い発表が多く、勉強になりました。懇親会で出てくる料理もさすがFiNCさん、ヘルシーで美味しいものばかりでした。どうもありがとうございました!
追記:BNNSについていただいたコメント
Facebookでsonsonさんからコメントいただきました。
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まわりの計測・デバッグ手法はもうちょっと勉強したいところです。
ちなみにsonsonさんは例の(私も参加させていただく)クラウドファンディング本で「Core ML」のパートを担当されます。
7/28まで買えるみたいなのでまだの方はぜひご検討を!