⚒️

【iOS 18】Core MLのアップデート

2024/07/16に公開

2024年7月12日に開催された「try! Swift Tokyo WWDC Recap 2024」で発表した内容です。

スライドはこちら:

https://www.docswell.com/s/shu223/56VMYP-coreml

以下、発表資料を記事として再構成したものになります。登壇後に調査した内容も追記しています。

前段の話

Core MLについてキャッチアップする意味あるの?

WWDC24といえば

inline

開発者とApple Intelligence

  • App Intentsでアプリの機能をexposeしておけば、賢くなったSiriがよしなに呼び出してくれる

→ 受動的/間接的

  • Writing Tools, Image Playground, Genmoji等のAPIも利用可能

→ 標準UIを利用

こういう感じで使えるAPIではない

inline

ビルトインMLフレームワーク

inline

→ かなり充実してきた

inline

とはいえ、標準MLフレームワークがサポートしてない分野はまだまだたくさんある

  • 汎用のセグメンテーション
  • デプス推定
  • 高速な音声認識
  • etc...

Core MLを使えば自前でMLモデルを用意できる

inline

最新のMLモデルもアプリに組み込める

inline

ここまでのまとめ

(Apple IntelligenceやビルトインMLフレームワーク群は非常に魅力的な機能ではあるが、)

Core MLを使うと標準サポートされてないMLモデルをiOS/macOS/watchOS/visionOSアプリに持ってこれて楽しい!

アジェンダ

  • 新しい公式配布モデル
  • 推論スタックの改善
  • 新しいモデル圧縮手法
  • パフォーマンスレポート

新しい公式配布モデル

AppleのCore MLモデル配布ページ

developer.apple.com/machine-learning/models/

fit right

  • ここ数年追加されていないなかった
  • 久々の追加 🎉

fit right

Hugging Face Hubで公開されるように

Core ML Gallery Models

  • WWDC24会期中に公開されたもよう
  • おそらくこっちの方がモデル配布ページより更新が早い

fit right

新公式配布モデル1: セグメンテーション

既存のセグメンテーション手法

VisionやARKitにも人・髪・肌・歯・空をセグメンテーションするAPIはある


iOS-Depth-Samplerより

一般物体のセグメンテーションCore MLモデルも2019年から公式配布されている

https://zenn.dev/shu223/articles/deeplabv3_ios

新しい公式配布セグメンテーションモデル「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

デモ

→ 速度も精度も良さげ

新公式配布モデル2: デプス推定

デプス推定とは

複眼レンズの視差、TrueDepthカメラ、LiDARをいずれも使用せず、RGB写真から機械学習で深度を推定

→ 「奥行き」の情報が得られる

fit right
デプスマップを用いた3D表現。iOS-Depth-Samplerより

既存のデプス推定モデル

  • デプス推定Core MLモデル「FCRN」が2019年から公式配布されている [1]

fit right

新しい公式配布デプス推定モデル「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

デモ

fit right

→ めちゃくちゃ良さげ

  • 速度も精度も非常に良い
  • 出力デプスマップの解像度も(FCRNと比較して)大幅アップ
    • 128 × 160 → 518 × 392
(余談)visionOSでも同モデルを利用?

visionOSは、先進的な機械学習を活用して、2D画像をVision Proで真に生き生きと映し出される美しい空間写真に変換します。 (visionOS 2、Apple Vision Proに新しい空間コンピューティング体験を提供 - Apple

推論スタック全体の改善

パフォーマンスが大幅に向上

  • 図はiOS 17と18の推論時間の比較
  • OS内での改善なので、モデルを再コンパイルしたり、コードを変更せずとも恩恵を受けられる

fit right

試してみる

Core ML Stable Diffusion XL @iOS 17

Hugging Face製アプリ「Diffusers」で Core ML版Stable Diffusion XLモデル がiOSで動くか検証した

iPhone 15 Pro 使用)

  • モデルのロード
    • 起動毎に5分
  • 画像生成
    • 必ずクラッシュ

inline
メモリ使用量のスパイクにより必ずクラッシュ

詳細はこちら:

Core ML Stable Diffusion XL @iOS 18

同モデルをiOS 18で動かしてみた

  • 起動毎のローディング
    • iOS 17では5分 → 3分(2回目以降20〜40秒)
  • 画像生成
    • iOS 17では不可 → 40秒前後 [2]

→ iOS 17では動かなかったStable Diffusion XLモデルがiOS 18ではiPhoneオンデバイスで推論(画像生成)できるように 🎉

fit right

新しいモデル圧縮手法

Core ML × 生成AIの問題

サイズがでかすぎる(数GB〜10GB以上もザラ)

  • アプリバイナリに含められない/DLさせるにもデカすぎる
  • メモリを食うので落ちる
  • 推論(生成)時間もかかる
詳細はこちら:

強力なモデル圧縮手段が必要

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)の話

既存のモデル圧縮手法

inline

Palettization(パレット化)

fit right

  • 似たような値を持つ重みをクラスタ化
  • クラスタのセントロイドをLUTに格納

→ LUTへのNビットのインデックスマップが圧縮後の重みとなる(例では2ビットに圧縮)

Quantization(量子化)

inline

  • Floatの重みを整数の範囲に線形にマッピング

→ Nビット整数重みとスケールとバイアスのペアが格納される

Pruning(枝刈り)

inline

  • 小さい重みを0にする
  • ビットマスクと0でない値だけを保存する

既存の圧縮手法の限界

5GBのモデルを16 → 4ビットまで圧縮すると生成結果が破綻

inline

何が問題なのか?

inline

4ビットPalettization→ 16個のセントロイドだけで大きなモデルの重みすべてを表現しようとして破綻している

coremltools 8で可能になったモデル圧縮手法

新しいPalettization

inline

  • 複数のLUTを保存できるように

→ 低ビットに圧縮しつつも精度を維持

新しいLinear quantization

inline

iOS 17ではチャンネルごとにスケールとバイアスを設定

→ iOS 18ではこれらをブロックごとに設定可能に

Pruning後のさらなる圧縮が可能に

inline

  • Pruning + Palettization
  • Pruning + Quantization

試してみる

Stable Diffusionモデルを新しいPalettizationで圧縮

Stable Diffusion v2.1 (非XL) [3] のCore MLモデルを新Palettizationで圧縮する

圧縮前

  • モデルサイズ:1.73 GB [4]
  • 画像生成時間:約13秒 [5]

(iOS 18 @iPhone 15 Proで実行)

Palettizationのコード

グループ化されたチャンネルごとのPalettizationを適用

import coremltools.optimize.coreml as cto_coreml

op_config = cto_coreml.OpPalettizerConfig(
    nbits=4,        # 4ビットに圧縮
    mode="kmeans",  # クラスタリング手法
    granularity="per_grouped_channel", # 粒度
    group_size=16,  # グループサイズ
)

config = cto_coreml.OptimizationConfig(op_config)
compressed_mimodel = cto_coreml.palettize_weights(mlmodel, config)

圧縮後

  • モデルサイズ:1.73 → 0.44 GB
    • 75%削減!
  • 画像生成時間:13秒 → 10秒
    • 23%高速化! [6]

(iOS 18 @iPhone 15 Proで実行)

fit right

パフォーマンスレポート

パフォーマンスレポートのアップデート

  • さらに多くの情報を提供するようになった [7]
    • 各オペレーションの推定時間
    • コンピュートデバイスのサポート
    • サポートされていない理由のヒント

デモ:DepthAnythingV2SmallF16のレポート

inline

MLComputePlan API

// 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のアップデート
    • 新しい公式配布モデル
    • 推論スタックの改善
    • 新しいモデル圧縮手法
    • パフォーマンスレポート

リファレンス

脚注
  1. Apple公式のデプス推定Core MLモデル「FCRN-DepthPrediction」 ↩︎

  2. 画像生成時のメモリ使用量はピークで2GB程度 ↩︎

  3. XLではなくこちらのバージョンを選んだのは、圧縮前(非圧縮)のモデルをモバイルで動かしてパフォーマンスを比較できるため ↩︎

  4. Unet.mlmodelc のサイズ ↩︎

  5. split_einsum 利用 ↩︎

  6. こちらは新Palettizationというよりは SPLIT_EINSUM_V2 利用の寄与が大きい ↩︎

  7. 実際に試してみたところ、「各オペレーションの推定時間」「サポートされていない理由のヒント」はModel TypeがML Programなモデルのみ表示される ↩︎

Discussion