try! Swiftは非日常感がありどの年も色々と思い出があるのですが、今年はスピーカーとしての参加ということで最初にお声がけいただいた9月から約半年感、ずっとtry! Swiftを意識して行動してきたといっても過言ではなく、感慨深さもひとしおでした。
終わってからの2週間、仕事の状況がガラッと変わったこともありしばらくそんなことも忘れるほど忙殺されていたのですが、最近アップされた公式の写真を見ていると色々と思い出されたので、(もう発表内容についての補足記事は書いたものの、)せっかくなので発表内容以外の振り返りについて書いておきたいと思います。
2017年9月: 打診いただく
9月某日、オーガナイザの pancake 氏よりお話をいただきました。
iOS Top 10 Conferences にも選ばれ、海外からも多数の参加者のある名カンファレンスに招待されるチャンスはもう二度とないかもしれません。実際のところ、try! Swift Tokyoは東京開催で同時通訳が行われるので僕でも呼んでいただけましたが、英語主体のカンファレンスではなかなか厳しいのが現実だと思います。1
そんなわけで、打診いただいたその場で二つ返事でお受けしました。
この時点で発表の軸はMetalしかないかなと考えていました。僕が2017年に興味をもって取り組んでいたのは機械学習、Metal、ARあたりですが、機械学習は結局実務で取り組む機会がなく 2、ARはまだARKitの薄いレイヤしか知らないのでカンファレンスで話すような体系立った知見がない。普通に仕事で使ってる&他に話す人もいなさそうなMetalしかないだろう、と。
〜2018年1月: 技術調査
12月にはMetalのアドベントカレンダーも立て、どれだけMetal好きなんだ、と思われたかもしれませんが、常に頭にあったのはtry! Swiftで発表するからには、知見をしっかりためないと、というところでした。
GPUまわりはもともと興味のあったところですが、try! Swift登壇が決まってなかったら、あんなにMetalMetalせず、機械学習とかARとかその他iOSの新機能とか、もうちょっと幅広く勉強したり記事書いたりしてたと思います。
2017年12月: 発表のタイトルと概要が決定
12月だったかに発表のタイトルと概要を3案ずつ提出して、ナターシャさんがチョイスする、というのがありました。
僕が出した3案はどれもMetal縛りでしたが、それぞれちょっとずつ「切り口」が違ってました。
- UIImageView vs Metal
- 今回のやつ。Metal自体の解説ではなく、「普段意識する機会の少ないGPUレイヤに目を向けてみる」というのがコンセプト。
MetalはGPUへのアクセスを提供するAPIで、OpenGLより10倍速いという謳い文句で登場しました。本セッションではMetalの基礎を解説しつつ、そのグラフィックス描画性能をUIImageViewと比較してみます。 MetalのAPIを直接利用する機会がなくても、Metalはあなたのアプリの裏で暗躍しています。身近なクラスとの比較を通じて、普段我々が意識することのないGPUのレイヤで何が起きているのか、目を向けてみるきっかけになればと思います。
- 非ゲームアプリにおけるMetal / Metal for non-game apps
- 「Metalってゲーム用でしょ?」いやいやそうじゃないアプリでも実際に使ってるんですよ、ということを示しつつMetalの基礎について話す。
「Metal=本格的なゲーム向けのAPI」と考えてしまい、興味の対象外としている開発者は多いのではないでしょうか。そんなことはなく、Metalはグラフィックス処理から機械学習の計算まで、「非ゲーム」アプリにおいても大いに活用の場があります。本セッションでは、実際にAppStoreにリリースされているアプリでのMetal活用事例を題材に、その基礎と実装方法について解説していきます。
GPUはその名の通りグラフィックス向けのプロセッサですが、今ではその並列演算処理能力に着目して、ディープラーニングの行列演算のような汎用的な計算で用いられるケースも増えてきています。 そんなGPUへのアクセスを提供するAPIが、Metalです。本セッションでは、Metalを利用してiOSデバイスのGPUで処理を行う方法について、初めての方でも理解できるよう基礎から丁寧に解説します。
で、"UIImage vs Metal"がチョイスされたわけですが、たとえばもし2番目のになったとしたら、Fyusion社の事例(画像処理、機械学習、描画、いろんな機能で使ってる)について話すことになるわけで、そうすると、会社に許可を取らないといけない部分も多く、会社にこういう打診をするタイミングももっと遅くなってたかもしれません。そんなキャリアの判断の基準にするほどに、try! Swiftでの登壇は重要視していました。
2018年2月: スライド作成
これは2月中旬に帰国してから着手したのですが、難航しました。「Metalを使うためだけに必要な知識」は本発表のコンセプトでは基本的には不要なのですが、Metalを通じてGPUの気持ちを理解しよう、というところではこの説明をしないといけない、うーむ、みたいな。
同時通訳の方々は下調べ等の準備を行うので、2週間ほど早くトランスクリプトつきで提出する必要があったのですが、まずはできているところだけ提出して順次追加版を提出していきました。
もくもく開発合宿 in 仙台。try! Swiftの準備をしてます。 pic.twitter.com/iDEjDOTE20
— Shuichi Tsutsumi (@shu223) 2018年2月17日
(仙台にてもくもくスライド作成合宿)
2月後半の2週間はほぼフルタイムでtry! Swiftのスライド作成に取り組んでいました。
当日
akatsuki174 がまとめてくれたツイートより、当日の様子が分かる感じのをいくつか時系列にピックアップしていきます。
- 登壇者としては欠かせない宣伝(英語ですべきだけど)
休憩後、16:30からです!どうぞよろしくお願いします。 #tryswiftconfhttps://t.co/fjtoTLRhsI
— Shuichi Tsutsumi (@shu223) 2018年3月2日
- 開始前
.@shu223 UIImageView vs Metal #tryswiftconfpic.twitter.com/2OzZeeowwW
— nafu (@nafu003) 2018年3月2日
- すごく拡散されていた一枚(スライド全体よりも。。)
CPUとGPUの例え、よさそう #tryswiftconfpic.twitter.com/CMjmjj08rJ
— Kazumasa Kumamoto (@kumamo_tone) 2018年3月2日
- GPUに向いている処理とは
ピクセルの処理順序が違っても結果は同じ=画像処理はGPU(並列処理)に向いている #tryswiftconf
— takasek (@takasek) 2018年3月2日
- UIImageView vs Metalパフォーマンスの結果発表直前(ちゃんとワクワクしてくれていて嬉しい)
どうなるんだろう(ワクワク #tryswiftconf
— Takahito Mita (@t_3ta) 2018年3月2日
- 🙏
説明が丁寧 #tryswiftconf
— Kazumasa Kumamoto (@kumamo_tone) 2018年3月2日
- UIImageViewは既に十分に有能だった
60FPSで描画するには約16ms以内で計算しなければならないが、そもそも0.6msなら圧倒的に間に合っている #tryswiftconfpic.twitter.com/0CtPiNcrN8
— Kazumasa Kumamoto (@kumamo_tone) 2018年3月2日
UIImageViewぐう有能 #tryswiftconf
— ぎぎにゃーん (@giginet) 2018年3月2日
- 問題1
GPU処理でよくある問題だねデータがCPUとGPUの間に行き来することでウェイトが長くなって遅くなっちゃう #tryswiftconf
— 星野恵瑠#今日も1日フレンズ㌠ (@lovee) 2018年3月2日
.@shu223 exploring the best performance of Metal-based ImageView! #tryswiftconfpic.twitter.com/ZMGYuHnmg4
— Yasuhiro Inami (@inamiy) 2018年3月2日
トークの内容としてはまだ続きますが、長くなりそうなのでこのへんで。
反応(ツイート)
MetalとGPUの話面白かった!
— ドットリくん (@dotrikun) 2018年3月2日
#tryswiftconf
英会話講座の、アセンブラで書きますとか、clang moduleとかvDSPとかMetalとかswift nioとか低レイヤーの話好き。今は業務で使うことないけど、単純に面白い。面白みドリブン #tryswiftconf
— Yuichi Fujishige (@nakiwo) 2018年3月2日
ピアラボに到着。堤さんのトークに触発されたので描画処理に深く入り込んでみる #tryswiftconfpic.twitter.com/0SIFanCnPn
— りくそうだ (@rikusouda) 2018年3月3日
堤さんの発表、これでちょっとはGPUの気持ちになれそう #tryswiftconf
— いけしょー@本書きました (@ikesyo) 2018年3月2日
修正したあとのパフォーマンス値ってどのくらいになったんだろう #tryswiftconf
— sim update --dev (@simorgh3196) 2018年3月2日
これについてはQ&Aで同様の質問をいただいたので、補足記事にてコメントしてあります。
反応(ブログ)
ブログ記事でもいくつか反応をいただいてます。大変ありがたいです。
GPUがどんな物なのかという導入からMetalを使った自作ライブラリのパフォーマンス測定、その過程で得られた知見についてのトークでした。 MetalとGPUについては知識は殆どなかったのですが、GPUとCPUでのコマンドがどのようにやり取りされているか紹介されていたので処理の概要について知ることができました。 自作ライブラリのパフォーマンス測定ではInstrumentsを使用したデバッグの過程が詳細に述べられており、非常に興味深い内容でした。個人的にはInstrumentsを上手く使いこなせていなかったので、その使用例としても面白い内容でした。 iOSアプリは画像描画の速度でユーザー体験が大きく変わるのでパフォーマンス改善をする際にはMetalの部分まで考慮して実装していきたいです。
タイトルに「vs」と入っていますが、実際にはUIImageViewはMetalを使って構築されています。堤さんがUIImageViewのようなものをMetalを使って自作してみようとした経験を元に、Metalが何をやっているのかという部分を通じて、GPUレイヤーに目を向けてみようという話でした。Step by Stepで話が進行してゆき、わかりやすく納得感のある内容でした。
なお、ぼく個人はMetalの知識を全然持っていないのですが、そんな人が興味を持つ導入としての話になっていたのではないかと思います。
アニメーションなどの描画性能はアプリを作る上で決して無視することができない課題です。このセッションではUIKitの内部処理を理解した上でパフォーマンスチューニングを行うことの大切さを知るための体験談を共有してくれました。directのiOSアプリは短い時間で正確な情報をユーザーに伝えるという大切な使命があります。よりユーザーにとってわかりやすくストレスがないアプリにしていくためにMetalまで意識したパフォーマンスチューニングは大切だと強く意識するきっかけとなりました。UIKitはiOSのバージョンアップによって内部の実装が変わることもあるため、そのバージョンに応じて適切な実装を心がけます。
これは純粋に面白かったし、Metalのこともわかった気になった。
try! Swift 東京 2018 的一些見聞 - 掃文資訊
カッコ()内はGoogle翻訳
堤修一 以前也是 Kayac的員工,算起來和我在 Kayac還有幾面之緣。不過顯然他並不記得我,直到看到我的 badge 的 ID 才説“哦哦,就是那個頭像是小貓的男人啊”。每年 WWDC結束後其實都會跟着他的 iOS-Sampler 項目學習新 API的用法,受益匪淺。
(Dian XiuyiはKayacの従業員でもあり、Kayacで私と数えます。 しかし、明らかに彼は私のバッジのIDが「ああ、それはアバターが猫の人だ」と言うまで私を覚えていない。 WWDCが終了してから毎年、彼はiOS-Samplerプロジェクトに従って新しいAPIの使い方を学びます。)
這次他帶來了一個關於 Metal 的話題,探索和對比了使用 Metal 進行圖片渲染和直接使用 UIImageView 的異同。一開始給出的數據十分驚人,Metal 的結果要比 UIImageView 快上十到二十倍。但是隨着深入,發現這不過是測量錯誤和實現錯誤的疊加。實際上按照 WWDC 2017 的説法,UIKit 已經在底層使用了 Metal 進行加速。對於 GPU相關的性能測量以及中後段通過 Metal System Trace (我自己是從來沒用過) 來尋找問題的部分很有意思。
(今回は、Metalに関するトピックを紹介し、Metalを使用して画像をレンダリングし、UIImageViewを直接使用することの類似点と相違点を調査し、対照しました。 最初に与えられたデータは驚異的でした。メタルの結果はUIImageViewより10〜20倍速かったです。 しかし、深くなっていくにつれて、測定誤差と実装エラーが重なり合っていることがわかりました。 実際、WWDC 2017によれば、UIKitは下部に加速のために金属を使用していました。 興味深いのは、GPU関連のパフォーマンス測定値と、中期および後期のセクションで、Metal System Traceの問題を探す部分(私はそれを自分で使ったことはありません)です。)
一句話總結就是,不要想着從底層折騰一套自己的 UI 渲染了,乖乖滾去用 UIKit 吧。信蘋果,得永生。
(要約すると、独自のUIレンダリングのセットを一から上に投げ捨て、UIKitでロールアウトすることについて考えないでください。 私はリンゴを信じ、永遠の命を持っています。)
https://techblog.istyle.co.jp/2018/03/05/try-swift-2018-report/
try! Swift 2018では普段あまり意識することのないlow-levelに焦点を当てた発表がいくつかあり、そのなかで一番身近に感じた発表がこちらでした。
まず発表自体がとってもわかりやすかったです!!!
また、普段何気なく書いている処理がCPU/GPUどちらで動いているのか、正直気にしたことがなかったぼくにとってはとても新鮮で、新しい気づきとなりました。
こちらは発表が終わった後に質問をしてUITableViewのパフォーマンス改善について有益なアドバイスをいただくことができました。UITableViewのパフォーマンスはほぼ全ての画面で気にしなければいけないことなので、注意していきたいです。
GPUのことを考えるきっかけになるセッションでした。 ゲームを作っていたころは、ずっとGPUのこと考えてる状態でしたが最近はあまり考えてません。
- コマンドを送る時は1回にまとめる。
- テクスチャはGPUにキャッシュさせる。
vs とは書いてましたが、内容はMetalで表現すると速い……あれ? なんか変。あ、GPUとCPU切り替えてなかった。ちゃんと区分けしないと。 という「やらないと判らない知見」でした。こういう発表は後に続く人が出るので大変嬉しいし、すてき案件。
今回は参加者が理解しやすいような題材としてUIImageView vs Metalという発表をされました。主にMetalを通じてGPUレイヤに目を向けてみようという内容でした。
私達が普段何気なく使っているUIImageViewは早いのでしょうか?ピクセルを配置するなど並列処理可能な処理はGPUに任せた方がよりパフォーマンスが良いのではないでしょうか?
こういった切り口で独自のカスタムクラスを作成し実測値を元に発表されました。
MetalImageViewという、UIImageViewのように画像を扱えるMetalラッパークラスの実装を行った経験を通じて、GPUレイヤーの処理を細かく追っていくという内容でした。XCodeのInstrumentsであるMetal System Traceを効果的に利用してボトルネックを特定し、パフォーマンスチューニングを行っていく過程はとても勉強になるもので、GPUに関する知識が全くない状態でも分かりやすく、大変興味深い内容の発表でした。
After try! Swift
try! Swift 直後の土曜、ワークショップは早退し(すみません)、翌日に日本を発ってしまうFyusion社の同僚たちと東京散策に行ってました。
原宿(同僚たちが既にそこに行ってた)を散策し、カフェで雑談したあと、僕自身も初めてのパチンコ屋に行き、
同僚を浅草にでも連れて行こうと思ったらそれよりパチンコ行きたいというので来てみたものの僕もやり方が分からず店員さんに助けてもらう、の図。 #tryswiftconfpic.twitter.com/tXkNTQO3VL
— Shuichi Tsutsumi (@shu223) 2018年3月3日
バーテンの方に「日本語上手ですね」と言われましたw
おわりに
- 来年は登壇のプレッシャーもないことだし、もっと海外の人たちにどんどん自分から声をかけてコミュニケーションしたい
- そろそろSwiftちゃんとやる(仕事ではObjective-C...)