WWDC Quick Look 💓 By SwiftGGTeam
Core AI でオンデバイス AI モデルをアプリに統合する

Core AI でオンデバイス AI モデルをアプリに統合する

元の動画を見る

ハイライト

Core AI により、開発者は Foundation Models と同じ API 体系で Qwen や SAM3 などのサードパーティ製オープンソースモデルを読み込み、実行できます。データはデバイスから出ず、サーバーは不要で、AOT 事前コンパイルによって初回読み込み時の待ち時間も取り除けます。

主要内容

手作業のカード作成から AI による自動生成へ

語学学習アプリを作っていて、学生が単語を覚えるのを支援しているとします。従来の作り方では、単語、翻訳、例文を含む語彙カードを事前に大量に用意し、アプリに同梱します。問題は、学生が街を歩いていてハチドリを見かけ、その単語をすぐに学びたいと思っても、事前に用意したカードの中にはないことです。学生の好奇心と現実世界は無限であり、静的なカードは決して追いつけません。

00:17)Core AI が解くのはまさにこの問題です。学生はカメラを開き、ハチドリに向けて「これを学びたい」と言います。アプリはローカルで画像分割、物体認識、語彙カード生成を完了し、ネットワーク接続は不要です。token コストはなく、クラウドの遅延もなく、学生の写真データがデバイスを離れることもありません。

2 つのモデルの分担

02:56)この場面には 2 つの能力が必要です。画像から対象物を切り出すことと、物体名から多言語の語彙情報を生成することです。Apple の解法は、問題を 2 つの専用モデルに分け、それぞれを 10 億パラメータ未満に抑えることで、全体の占有量を管理可能にするものです。

1 つ目のモデルは SAM 3(Segment Anything Model 3)です。Vision Transformer をベースにした画像分割モデルで、学生がテキストプロンプト「花」を入力すると、SAM 3 は写真から花を正確に切り出し、同時に英語ラベルを出力します。

2 つ目のモデルは多言語の大規模言語モデルです。英語ラベル「Hummingbird」を入力すると、モデルは日本語の語彙、翻訳、例文を出力します。講演者が選んだのは Qwen で、119 言語に対応し、0.6B パラメータ版なら iPhone に収まります。

04:57)なぜ 1 つのモデルではなく 2 つに分けるのでしょうか。タスク特化モデルの方が品質が高く、個々のサイズも小さく、独立してアップグレードできるからです。SAM 3 は分割に集中し、Qwen は言語に集中します。それぞれが自分の役割を担います。

モデルはどこから入手するのか

07:02)モデルは Hugging Face や GitHub から元の PyTorch 版を取得し、Core AI PyTorch 拡張パッケージで変換できます。より簡単な方法は、Core AI Models リポジトリを直接使うことです。そこには SAM 3 や Qwen などの人気モデル向けの変換スクリプトと、事前コンパイル済みの .aimodel ファイルが用意されています。

このリポジトリには Swift Package も含まれており、テキストエンコードやマスク抽出などの前処理、後処理ロジックをラップしています。テンソル形状を自分で扱う必要はなく、Swift API を呼び出すだけです。

初回読み込みの待ち時間をどう解決するか

13:08)モデルを初めて読み込むとき、Core AI は Specialization を実行します。これは汎用モデルを現在のデバイスの Neural Engine に特化した形式へコンパイルする処理です。この処理は遅くなることがあります。ユーザーが写真を撮った後にスピナーを見続ける体験はよくありません。

Apple の解法は 2 段階です。第 1 に、モデルを App Bundle に入れないことです。SAM 3 と Qwen を合わせると 1GB を超えます。すべての更新ユーザーが、その機能を使うかどうかにかかわらずダウンロードすることになります。代わりに Background Assets を使い、ユーザーが機能を明示的に有効にしたときだけオンデマンドでモデルを取得します。

第 2 に、開発機で coreai-build を使って Ahead-of-Time(AOT)コンパイルを行います。コンパイル済みモデルでも最終的なデバイス別 Specialization は必要ですが、作業量は大幅に減ります。ユーザーの待ち時間は数十秒から数秒へ短縮されます。

同じコードを macOS でも動かす

19:57)iOS のコードは macOS にそのまま再利用できます。Mac はメモリと計算能力に余裕があるため、Qwen 0.6B を Qwen3 8B に置き換え、より強い推論能力と長いコンテキストを得られます。

講演者は Mac 版アプリにバッチ処理を追加しました。旅行写真のフォルダ全体をインポートし、SAM 3 がすべての画像を並列に分割して物体を見つけ、その後 8B モデルがすべての語彙カードを一括生成します。さらに難易度順に並べたり、授業計画を組んだりできます。以前なら午後いっぱい手入力していた作業が、今は 1 回の prompt で終わります。

詳細

SAM3 画像分割を読み込み実行する

11:01)Core AI Models リポジトリの CoreAIImageSegmenter モジュールは、SAM 3 の tensor 前処理と後処理をすべてラップしています。

import CoreAIImageSegmenter

// ディスクから SAM3 モデルを読み込む
let segmenter = try await ImageSegmenter(resourcesAt: sam3ModelURL)

// 画像とテキストプロンプトを渡し、分割結果を直接取得する
let response = try await segmenter.segment(image: inputImage, prompt: "花")

// 最適な分割 Mask を取り出す
let mask = response.segments.first?.mask

ポイント:

  • ImageSegmentercoreai-models Swift Package が提供する高レベル API で、画像エンコード、特徴抽出、マスクデコードを内部で自動処理します。
  • segment(image:prompt:)UIImage または CGImage とテキストプロンプトを受け取り、信頼度順に並んだ分割結果配列を返します。
  • response.segments.first?.mask で、プロンプトに最も合うマスクを取得できます。これは画像合成や切り抜きにそのまま使えます。

言語モデルを読み込み Session を作成する

11:28)サードパーティ製言語モデルの読み込みと呼び出しは、Foundation Models フレームワークと同じ API 体系を再利用します。

import FoundationModels
import CoreAILanguageModels

// モデルインスタンスを作成し、リソース読み込み、エンジン作成、Tokenizer 設定を 1 行で完了する
let model = try await CoreAILanguageModel(resourcesAt: qwen3ModelURL)

// 慣れた LanguageModelSession API を使う
let session = LanguageModelSession(model: model)

// 応答を生成する
let response = try await session.respond(to: "...")

ポイント:

  • CoreAILanguageModel は Core AI によるサードパーティモデルのラッパーで、コンストラクタは .aimodel ファイルのパスを受け取ります。
  • LanguageModelSession は Apple 内蔵の大規模モデルを呼び出すときの API と完全に同じで、respond(to:) もストリーミング出力もサポートします。
  • FoundationModels を import するのは、LanguageModelSession がこのフレームワークで定義されているためです。サードパーティモデルと AFM は同じセッション抽象を共有します。

@Generable で構造化出力を生成する

12:29)語彙カードには厳密なフィールド構造が必要で、自由文を解析するだけでは不十分です。@Generable マクロを使うと、モデルに Swift 型に適合する構造化データを直接出力させられます。

import FoundationModels
import CoreAILanguageModels

@Generable
struct VocabCard {
    let chineseWord: String
    let englishMeaning: String
    let exampleSentence: String
}

let model = try await CoreAILanguageModel(resourcesAt: modelURL)
let session = LanguageModelSession(model: model)

let response = try await session.respond(
    to: "花の語彙カードを作成してください",
    generating: VocabCard.self
)

let card: VocabCard = response.content

ポイント:

  • @Generable マクロはコンパイル時に JSON Schema 制約を生成し、モデル出力を VocabCard 型へ強制的にデコードします。
  • session.respond(to:generating:) の 2 つ目の引数に型を渡すと、フレームワークが prompt のラップ、JSON 生成、型変換を自動処理します。
  • モデル出力が Schema に適合しない場合、呼び出しはデコードエラーを投げます。呼び出し側で try による処理が必要です。

モデルを AOT 事前コンパイルする

17:22coreai-build コマンドラインツールは、最も時間のかかるコンパイル手順を開発機上で事前に完了します。

$ xcrun coreai-build compile MyModel.aimodel --platform iOS

ポイント:

  • coreai-build は Core AI ツールチェーンの一部で、Xcode 27 と一緒にインストールされます。
  • --platform iOS は対象プラットフォームを指定し、特定のチップアーキテクチャ向けのコンパイル成果物を生成できます。
  • コンパイル済みモデルでもデバイス上で最終的な Specialization は必要ですが、所要時間は数十秒から数秒へ短縮されます。
  • 実際の配布では、A17、M2、M3 などのデバイスアーキテクチャに応じたコンパイル済みバージョンを配布する必要があります。

重要な示唆

1. 写真を撮ってすぐ学ぶ: 任意の物体のリアルタイム語彙カード

何を作るか: ユーザーが任意の物体を撮影すると、アプリが自動で物体を分割し、その言語の語彙カードを生成する語学学習アプリ。

なぜ価値があるか: Core AI は SAM 3 と Qwen の呼び出しを数行のコードに簡略化します。以前はクラウドの Vision API と翻訳 API が必要だった機能を、完全にローカルで動かせます。ネットワーク依存も token コストもありません。

始め方: Core AI Models リポジトリから CoreAIImageSegmenterCoreAILanguageModels を import し、ImageSegmenter.segment(image:prompt:) で切り出し、LanguageModelSession.respond(to:generating:) で構造化されたカードデータを生成します。

2. 旅行アルバムから学習教材を一括生成する

何を作るか: 旅行写真フォルダ全体をインポートし、すべての物体を自動認識して語彙カードを生成し、テーマ別にグループ化する Mac ツール。

なぜ価値があるか: Mac ではより大きな Qwen3 8B モデルを使え、同じ Swift コードをそのまま再利用できます。バッチ並列処理と長文コンテキストの授業計画により、以前なら数時間かかった作業が数分で終わります。

始め方: iOS コードを基盤に NSFileCoordinator で写真を一括読み込みし、TaskGroup で SAM 3 分割を並列実行します。最後に結果を大きな prompt にまとめて 8B モデルへ渡し、授業構成を生成します。

3. オフラインでプライバシー優先の AI 機能モジュール

何を作るか: 既存アプリに任意の AI 機能モジュールを追加し、すべての推論をローカルで完結させ、ユーザー写真や文書などの機密データをアップロードしないようにします。

なぜ価値があるか: Core AI のオンデマンドダウンロードと AOT コンパイルにより、大規模モデル機能がアプリサイズや起動速度を悪化させません。Background Assets はユーザーが明示的に機能を有効にしたときだけモデルをダウンロードするため、通常ユーザーには影響しません。

始め方: 初回起動の案内画面を設計し、ユーザーが「AI 機能を有効にする」をタップしたら BGDownloadingRequest を起動します。ダウンロード完了後、バックグラウンドでモデルの読み込みと Specialization を実行し、次回利用時は直接キャッシュを使います。

4. クロスプラットフォームで統一された AI アーキテクチャ

何を作るか: iOS と macOS を同じ Swift コードで支え、iOS では小型モデルで軽快さを保ち、Mac では自動的に大型モデルへ切り替えて品質を高めます。

なぜ価値があるか: CoreAILanguageModelLanguageModelSession の API はプラットフォーム間で完全に一致しています。実行時に ProcessInfo でプラットフォームを判定し、異なるサイズのモデルを読み込むだけです。2 系統のコードを維持する必要はなく、Mac では大きなメモリを活かしてより強いモデルを動かせます。

始め方: アプリ起動時にデバイスモデルとメモリサイズを検出し、iPhone では Qwen 0.6B、Mac では Qwen3 8B を読み込みます。ビジネスロジックは変更しません。入口: ProcessInfo.processInfo.operatingSystemVersion と条件付きモデル読み込み。

5. AOT コンパイルで初回利用時の待ち時間をなくす

何を作るか: 開発段階で coreai-build を使ってモデルを事前コンパイルし、ユーザー側の Specialization 待ち時間を短縮します。

なぜ価値があるか: モデル初回読み込み時の Specialization は数十秒かかることがあり、写真を撮った後にユーザーが待たされる体験は非常に悪いものです。AOT コンパイルは最も重い手順を開発段階へ前倒しし、ユーザー端末では最終的なデバイス別 Specialization だけを行うため、待ち時間は数秒になります。

始め方: CI に xcrun coreai-build compile MyModel.aimodel --platform iOS を組み込み、コンパイル成果物をアプリと一緒に配布します。入口: xcrun coreai-build compile

関連 Session

コメント

GitHub Issues · utterances