WWDC Quick Look 💓 By SwiftGGTeam
Deploy machine learning and AI models on-device with Core ML

Deploy machine learning and AI models on-device with Core ML

元の動画を見る

ハイライト

Core ML は効率的な tensor 計算用 MLTensor 型を追加。State API で stateful モデルの推論効率を最適化。multi-function model で 1 つの MLPackage に複数機能を搭載可能。


主要内容

端末で ML モデルを実行する際、開発者が直面する現実的な問題——モデル推論自体はワークフローの一部に過ぎない。大規模言語モデルでは、テキスト生成にデコーダーが語彙スコアから次 token をサンプリング——この「接着剤コード」(確率分布計算、temperature 調整、Top-K サンプリング)は以前、手書き実装か低レベル API 呼び出しが必要で、コード量が多くエラーが起きやすい。

Core ML の新 MLTensor がこの問題を解決。多次元配列型で NumPy/PyTorch 風の数学演算と変換操作を提供。Apple silicon の CPU、GPU、Neural Engine で加速。セッションデモでは、同じデコードロジックを MLTensor で実装すると低レベル API 手書き版よりコード量が大幅に少ない。

もう 1 つの痛点は KV Cache 管理の stateful 推論。以前は手動キャッシュ管理で、各反復時にキャッシュを入力として渡し、出力から更新値を読み取る——メモリと計算ユニット間でデータが往復。Core ML の新 State API は状態管理をフレームワーク内部で処理し、データ移動オーバーヘッドを削減。セッション実測では M3 Max MacBook Pro 上の Mistral 7B が State 使用で約 5 秒、未使用で約 8 秒——約 1.6 倍高速化(12:11)。

複数の関連モデルをデプロイする際の冗長性——例えば 1 つの拡散モデルに異なるスタイル adapter を組み合わせる場合、以前は複数の独立モデルをデプロイする必要があった。multi-function model では 1 つの MLPackage に複数の function エントリポイントを含め、base 重みを共有——デプロイサイズとメモリ使用量を削減。

さらに iOS 18 の推論スタックは低レベル最適化を実施——多くのモデルが再コンパイルやコード変更なしで性能向上(02:27)。


詳細

MLTensor:端末上 tensor 計算

MLTensor は Core ML の新多次元配列型。shapescalar type で定義。MLShapedArray またはネストされたスカラー集合から作成可能(04:03):

// MLShapedArray から作成
let tensor1 = MLTensor(shapedArray: shapedArray)

// ネストされたスカラーコレクションから作成
let tensor2 = MLTensor([[1.0, 2.0], [3.0, 4.0]])

キーポイント:

  • MLTensorMLShapedArray またはネストリテラルから構築
  • MLShapedArray と同様、shapescalar type で記述
  • ネストリテラルの深さが次元数を決定

tensor は要素ごとの数学演算、自動ブロードキャスト、比較、マスク操作をサポート(04:33):

// 逐元素加法与乘法,字面量自动广播
let result = (tensor1 + 10) * tensor2

// 计算均值
let mean = result.mean()

// 比较运算创建布尔掩码
let mask = result .> mean

// 掩码相乘实现过滤
let filtered = mask * result

キーポイント:

  • リテラルと tensor 演算時、互換形状へ自動ブロードキャスト
  • .mean() は全要素の平均を計算
  • .> 比較は boolean tensor マスクを返す
  • boolean マスクと tensor の乗算で false 位置をゼロ化

インデックスと形状変換(04:57):

// 切片:取矩阵第一行
let firstRow = matrix[0]

// 重塑形状
let reshaped = firstRow.reshape([1, -1])

キーポイント:

  • インデックス構文で次元ごとにスライス。Python 数値ライブラリと類似
  • .reshape() はデータを変えず形状のみ変更

全 tensor 操作は非同期実行——データアクセスには明示的 materialize が必要(05:12):

let shapedArray = try await result.materialize()

キーポイント:

  • 非同期実行で上流操作完了後にデータが利用可能
  • materializeMLTensorMLShapedArray に戻す

MLTensor による LLM デコード簡素化

セッションは HuggingFace Swift Transformer + Mistral 7B でデコーダー比較(06:33)。言語モデルは語彙全語のスコア(logits)を出力。デコーダーが次 token を選択——戦略には greedy デコード(最高スコア)と Top-K サンプリング(上位 K 語からランダム)があり、temperature で確率分布の平坦度を調整(06:57)。

比較結果:MLTensor 実装は同機能を低レベル API 手書き版よりはるかに少ないコード量。MLTensor は一般的 ML 演算に適するが、細かい制御が必要な場合は低レベル API に価値あり(07:57)。

State API:stateful 推論の最適化

従来の手動 KV Cache 管理(11:04):

// 手动预分配缓存
var keyValueCache = createEmptyCache()

for token in inputTokens {
    // 缓存作为输入传入
    let prediction = try model.prediction(from: input, using: keyValueCache)
    // 从输出中取出更新后的缓存
    keyValueCache = prediction.cache
}

State API 使用後(11:26):

// 模型实例创建并预分配状态
let state = model.makeState()

for token in inputTokens {
    // 传入状态,更新原位完成
    try model.prediction(from: input, state: state)
}

キーポイント:

  • model.makeState() は Core ML が状態バッファを事前割り当て、状態ハンドルを返す
  • ハンドル経由でバッファアクセスと状態ライフサイクル制御
  • 状態更新はインプレース——出力から読み取って再代入不要
  • モデルは準備段階(coremltools 変換時)で State サポートを明示的に有効化

Xcode モデルプレビューの Predictions タブで State の有無を確認可能(10:48)。

Multi-function model

セッションは Stable Diffusion XL + 2 つのスタイル adapter(sticker と storybook)を例示(14:25)。2 adapter は同一 UNet base model を共有。1 MLPackage に統合後、各 adapter が 1 function として公開:

// 加载时指定函数名
let model = try MLModel(
    contentsOf: url,
    configuration: MLModelConfiguration(functionName: "sticker")
)

キーポイント:

  • MLModelConfiguration(functionName:) でロードする function を指定
  • 未指定時はデフォルト function
  • function ごとに異なる入出力シグネチャ可能
  • Xcode プレビューで全利用可能 function を確認

sticker と storybook の入出力シグネチャが同一のため、同一パイプラインを 2 function で再利用可能。パイプライン内の複数モデルは MLTensor でシームレスに接続(14:35)。

性能ツール強化

Core ML 性能レポートに 2 項目追加(16:05):

  • 操作レベル時間推定:estimated time = 中央値予測時間 × 操作の推定相対コスト。ソートでボトルネック特定
  • 非サポート理由ヒント:非サポート操作にホバーで理由表示(データ型非サポートなど)。準備段階への遡及に便利

レポートはエクスポートとバージョン間比較をサポート——コード不要でモデル変更効果を評価(16:56)。

MLComputePlan API でプログラム的アクセス:モデル構造、各操作のサポート/優先計算デバイス、State サポート、推定相対コスト(17:13)。


重要ポイント

  • 手書きデコードロジックを MLTensor で置き換え:端末 LLM の token デコード(確率計算、サンプリング、temperature 調整)が最典型の適用場面。まず MLTensor で確率計算とフィルタリング部分を書き換え、機能一致を検証後、デコーダー全体を段階的に置き換え。コード量削減と非同期実行による不要な同期待機回避。

  • State API で KV Cache オーバーヘッド削減:モデルが多反復推論を含む場合、coremltools で再エクスポートして State を有効化。Mistral 7B 実測 1.6 倍高速化——モデルとキャッシュが大きいほど効果大。Xcode プレビューで State 可用性を確認後、makeState() で手動キャッシュ管理を置き換え。

  • multi-function model で共有重みモデルを統合:複数スタイル adapter やタスク変体をデプロイする際、1 MLPackage に統合し各変体を 1 function に。インストールサイズと実行時メモリ削減。ロード時に functionName 指定で機能切り替え。


関連セッション

コメント

GitHub Issues · utterances