21.5K Views
July 12, 24
スライド概要
try! Swift Tokyo WWDC Recap 2024 での発表資料です。
https://lu.ma/ek0t0x7w?tk=C4llAl
フリーランスiOSエンジニア 「エンジニアと人生」コミュニティ主宰
Core MLのアップデート 堤 修一 (@shu223)
自己紹介 • 堤 修一 • @shu223 (GitHub, Zenn, Qiita, note, Docswell, 𝕏, YouTube, Podcast, etc...) • 書籍(商業出版4冊、個人出版多数 @BOOTH):
趣味: WWDCのキャッチアップ • 記事 • 登壇 Apple IntelligenceとAI/MLパート抜粋 - iPhoneに手足を生やす Platforms State of the Union Apple Intelligenceに対応する - Bring 〜 to Apple Intelligence時代のApp Intents設計 Siri App Intents入門 - アプリのコア機能を公開す る アプリをSiri/Apple Intelligence対応にする方 法 App Intentsの新機能 1行で翻訳機能を追加できる Translation API Visionフレームワークの新機能 "What’s new in DockKit" のまとめ
本日のテーマ Core MLのアップデートについて解説する
『Core MLについて知る意味あるの?』
WWDC24といえば
開発者とApple Intelligence • App Intentsでアプリの機能をexposeしておけば、賢くなっ たSiriがよしなに呼び出してくれる • Writing Tools, Image Playground, Genmoji等のAPIも利用可 能
開発者とApple Intelligence • App Intentsでアプリの機能をexposeしておけば、賢くなっ たSiriがよしなに呼び出してくれる → 受動的/間接的 • Writing Tools, Image Playground, Genmoji等のAPIも利用可 能 → 標準UIを利用
こういう感じで使えるAPIではない
ビルトインMLフレームワーク
ビルトインMLフレームワーク:かなり充実してきた
とはいえ 標準MLフレームワークがサポートしてない分野 はまだまだたくさんある • 汎用のセグメンテーション • デプス推定 • 高速な音声認識 • etc...
⇒ Core MLを使えば自前でMLモデルを用意できる
最新のMLモデルもアプリに組み込める
ここまでのまとめ (Apple IntelligenceやビルトインMLフレームワーク群は非常に 魅力的な機能ではあるが、) Core MLを使うと標準サポートされてないMLモデルをiOS/ macOS/watchOS/visionOSアプリに持ってこれて楽しい!
本日のアジェンダ • 新しい公式配布モデル • 推論スタックの改善 • 新しいモデル圧縮手法 • パフォーマンスレポート
新しい公式配布モデル
AppleのCore MLモデル配布 ページ developer.apple.com/machinelearning/models/
AppleのCore MLモデル配布 ページ developer.apple.com/machinelearning/models/ • ここ数年追加されていないなかった
AppleのCore MLモデル配布 ページ developer.apple.com/machinelearning/models/ ! • ここ数年追加されていないなかった • 久々の追加
Hugging Face Hubで公開さ れるように Core ML Gallery Models • WWDC24会期中に公開されたもよう • おそらくこっちの方がモデル配布ペ ージより更新が早い
新公式配布モデル1: セグメンテーション
既存のセグメンテーション手 法 1/2 VisionやARKitにも人 1 2 ・髪・肌・歯・ 空 3 をセグメンテーションするAPIはあ る iOSDC 2018のトーク: 「Depth in Depth」 サンプル: iOS-Depth-Sampler 1 ARKitのPeople Occlusion 2 Portrait Matteで背景分離/セグメンテーション 3 iOSで「髪」「肌」「歯」「空」をセグメンテーションする
既存のセグメンテーション手 法 2/2 一般物体のセグメンテーションCore ML モデルも2019年から公式配布されてい る Apple公式のセグメンテーション用Core MLモデル「DeeplabV3」
新しい公式配布セグメンテーションモデル DETR Resnet50 Semantic Segmentation huggingface.co/apple/coreml-detr-semantic-segmentation • iOS 17以降で利用可能 Device OS 推論時間 (ms) iPhone 15 Pro Max 17.5 40 iPhone 12 Pro Max 18.0 52
デモ
速度も精度も良さげ • old • new
新公式配布モデル2: デプス推定
デプス推定とは 複眼レンズの視差、TrueDepthカメラ、 LiDARをいずれも使用せず、RGB写真か ら機械学習で深度を推定 → 「奥行き」の情報が得られる
既存のデプス推定モデル • デプス推定Core MLモデル「FCRN」 が2019年から公式配布されている 4 4 Apple公式のデプス推定Core MLモデル「FCRN-DepthPrediction」
新しい公式配布デプス推定モデル Depth Anything V2 huggingface.co/apple/coreml-detr-semantic-segmentation • デプス推定のState-of-the-art(最先端)モデル • iOS 17以降で利用可能 Device OS Inference time (ms) iPhone 12 Pro Max 18.0 31.10 iPhone 15 Pro Max 17.4 33.90
デモ
めちゃくちゃ良さげ • 速度も精度も非常に良い • 出力デプスマップの解像度も(FCRN と比較して)大幅アップ • 128 × 160 → 518 × 392
(余談) visionOSでも同モデルを利用? visionOSは、先進的な機械学習を活用して、2D画像をVision Pro で真に生き生きと映し出される美しい空間写真に変換します。 5 visionOS 2、Apple Vision Proに新しい空間コンピューティング体験を提供 - Apple 5
推論スタックの改善
推論スタック全体の改善 → パフォーマンスが大幅に向上 • 図はiOS 17と18の推論時間の比較 • OS内での改善なので、モデルを再コ ンパイルしたり、コードを変更せず とも恩恵を受けられる
試してみる
Core ML Stable Diffusion XL @iOS 17 Hugging Face製アプリ「Diffusers」で Core ML版Stable Diffusion XLモデル がiOSで動くか検証した • iPhone 15 Pro 使用 6 Core ML版Stable DiffusionをiOSで快適に動かす 6
Core ML Stable Diffusion XL @iOS 17 (iPhone 15 Pro 使用) • モデルのロード • 起動毎に5分 • 画像生成 • 必ずクラッシュ
Core ML Stable Diffusion XL @iOS 17 (iPhone 15 Pro 使用) • モデルのロード • 起動毎に5分 • 画像生成 • 必ずクラッシュ
Core ML Stable Diffusion XL @iOS 18 同モデルをiOS 18で動かしてみた • 起動毎のローディング • iOS 17では5分 → 3分(2回目以降20〜40秒) • 画像生成 • iOS 17では不可 → 40秒前後 7 画像生成時のメモリ使用量はピークで2GB程度 7
推論スタック全体の改善 ! iOS 17では動かなかったStable Diffusion XLモデルがiOS 18ではiPhone オンデバイスで推論(画像生成)できる ように
新しいモデル圧縮手法
Core ML × 生成AIの問題 8 9 サイズがでかすぎる(数GB〜10GB以上もザラ) • アプリバイナリに含められない/DLさせるにもデカすぎる • メモリを食うので落ちる • 推論(生成)時間もかかる 8 9 ローカルLLM on iOS の現状まとめ ローカルLLMをCore MLモデルに変換する - Exporters の使い方 !
Core ML × 生成AIの問題 サイズがでかすぎる(数GB〜10GB以上もザラ) → 強力なモデル圧縮手段が必要
coremltools とは • PyTorch等で作成したモデ ルをCore ML形式に変換す るツール • モデルを圧縮する機能も持 っている • オープンソース
coremltoolsとCore MLフレームワークのバージョン Core ML coremltools iOS 18, macOS 15, visionOS 2, watchOS 11 8 iOS 17, macOS 14, visionOS 1, watchOS 10 7 iOS 16, macOS 13, visionOS 1, watchOS 9 6 ... ... iOS 11, macOS 10.13, visionOS 1, watchOS 4 1 今回は coremltools 8 (現時点の最新は 8.0b1)の話
既存のモデル圧縮手法
Palettization(パレット化)
Palettization(パレット 化) • 似たような値を持つ重みをクラスタ 化 • クラスタのセントロイドをLUTに格納 → LUTへのNビットのインデックスマッ プが圧縮後の重みとなる(例では2ビッ トに圧縮)
Quantization(量子化)
Quantization(量子化) • Floatの重みを整数の範囲に線形にマ ッピング → Nビット整数重みとスケールとバイア スのペアが格納される
Pruning(枝刈り)
Pruning(枝刈り) • 小さい重みを0にする • ビットマスクと0でない値だけを保存 する
既存の圧縮手法の限界 5GBのモデルを16 → 4ビットまで圧縮すると生成結果が破綻
何が問題なのか? 4ビットPalettization→ 16個のセントロイドだけで大きなモデル の重みすべてを表現しようとして破綻している
新しいPalettization
新しいPalettization • 複数のLUTを保存できるよ うに → 低ビットに圧縮しつつも精 度を維持
新しいLinear quantization iOS 17ではチャンネルごとにスケールとバイアスを設定 → iOS 18ではこれらをブロックごとに設定可能に
Pruning後のさらなる圧縮が可能に Pruning + Palettization / Pruning + Quantization
試してみる
Stable Diffusionモデルを新しいPalettization で圧縮 Stable Diffusion v2.1 (非XL) 10 のCore MLモデルを新 Palettizationで圧縮する 10 XLではなくこちらを選んだのは、圧縮前のモデルをモバイルで動かしてパフォーマンスを比較できるため
圧縮前 • モデルサイズ:1.73 GB (Unet.mlmodelc) • 画像生成時間:約13秒 (split_einsum 利 用) (iOS 18 @iPhone 15 Proで実行)
Palettizationのコード グループ化されたチャンネルごとのPalettizationを適用 import coremltools.optimize.coreml as cto_coreml op_config = cto_coreml.OpPalettizerConfig( nbits=4, # 4ビットに圧縮 mode="kmeans", # クラスタリング手法 group_size=16, # グループサイズ granularity="per_grouped_channel", # 粒度 ) config = cto_coreml.OptimizationConfig(op_config) compressed_mimodel = cto_coreml.palettize_weights(mlmodel, config)
圧縮後 • モデルサイズ:1.73 → 0.44 GB • 75%削減! • 画像生成時間:13秒 → 10秒 • 23%高速化! 11 (iOS 18 @iPhone 15 Proで実行) 11 こちらは新Palettizationというよりは SPLIT_EINSUM_V2 利用の寄与が大き い
パフォーマンスレポート
パフォーマンスレポートのア ップデート • さらに多くの情報を提供するように なった 12 • 各オペレーションの推定時間 • コンピュートデバイスのサポート • サポートされていない理由のヒン ト 12 実際に試してみたところ、「各オペレーションの推定時間」「サポートされて いない理由のヒント」はModel TypeがML Programなモデルのみ表示される
デモ:DepthAnythingV2SmallF16のレポート
MLComputePlan API • パフォーマンスレポートのAPI版 • MLOps for Core MLが捗りそう // Load the compute plan of an ML Program model. let computePlan = try await MLComputePlan.load(contentsOf: modelURL, configuration: configuration) guard case let .program(program) = computePlan.modelStructure else { ... } // Get the main function. guard let mainFunction = program.functions["main"] else { ... } let operations = mainFunction.block.operations for operation in operations { // コンピュートデバイスのサポート情報を取得 let computeDeviceUsage = computePlan.deviceUsage(for: operation) // 推定コストを取得 } let estimatedCost = computePlan.estimatedCost(of: operation)
まとめ • Core MLのアップデート • 新しい公式配布モデル • 推論スタックの改善 • 新しいモデル圧縮手法 • パフォーマンスレポート
リファレンス • Bring your machine learning and AI models to Apple silicon - WWDC24 - Videos - Apple Developer • Deploy machine learning and AI models on-device with Core ML - WWDC24 - Videos - Apple Developer • coremltools API — coremltools API Reference 8.0b1 documentation