RORK LABEN
TEST — Rork Companionアプリで、有料Apple Developerアカウント無しに実機iPhoneでテストできますCLOUD — クラウド上のMacでコンパイルし、60fpsのライブシミュレータをタッチ入力付きで確認できますBROWSER — Chrome・Safariだけで設計・コード・テストが完結。Xcodeは不要ですPUBLISH — 2クリックのApp Store公開で、提出まわりの煩雑さを抑えられますMAX — Rork MaxはネイティブSwiftでiPhone・iPad・Apple Watch・Vision Proに対応しますRN — 通常のRorkはReact Native(Expo)でiOS/Androidアプリをまとめて生成しますTEST — Rork Companionアプリで、有料Apple Developerアカウント無しに実機iPhoneでテストできますCLOUD — クラウド上のMacでコンパイルし、60fpsのライブシミュレータをタッチ入力付きで確認できますBROWSER — Chrome・Safariだけで設計・コード・テストが完結。Xcodeは不要ですPUBLISH — 2クリックのApp Store公開で、提出まわりの煩雑さを抑えられますMAX — Rork MaxはネイティブSwiftでiPhone・iPad・Apple Watch・Vision Proに対応しますRN — 通常のRorkはReact Native(Expo)でiOS/Androidアプリをまとめて生成します
記事一覧/アプリ開発
アプリ開発/2026-06-28上級

オンデバイス Core ML を、起動の重さとサーマルで破綻させない設計

Rork Max が生成するネイティブ Swift でオンデバイス Core ML を載せると、精度よりも先に「最初の推論が遅い」「使っていると熱で重くなる」という壁にぶつかります。コールドスタートとサーマル予算を前提にした設計を、動く Swift とともに整理します。

Rork Max187Core ML4Swift31オンデバイスAI10個人開発166

プレミアム記事

Rork Max はネイティブ Swift アプリを生成できるため、React Native では届きにくかったオンデバイスの Core ML 推論に、個人開発でも手が届くようになりました。けれど実機に載せてみると、精度の話に入る前につまずく場所があります。最初の推論が妙に遅い。しばらく使っていると、端末が温まって全体がもっさりする。この2つは、モデルの良し悪しではなく「いつ・どれだけ推論を走らせるか」という設計の問題です。

私自身、個人開発で運用しているアプリにオンデバイス推論を組み込んだとき、最初の1回だけ体感で1秒近く固まる挙動に悩まされました。原因はモデルの精度ではなく、初回のロードと推論を起動直後のメインスレッド上で走らせていたことでした。

ここでは、Core ML を「コールドスタート」と「サーマル予算」という2つの制約を前提に設計する方法を、Swift のコードとともにまとめます。

最初の推論が遅い理由

Core ML のモデルは、初めて使うときに2つの重い処理が走ります。1つはモデルの読み込みとコンパイル(端末の Neural Engine 向けに最適化される)、もう1つは初回推論で内部バッファが確保される処理です。2回目以降は速くても、初回だけは桁が違う、ということが普通に起きます。

段階主に起きること体感への影響
初回ロードモデルのコンパイル・配置数百 ms〜1 秒
初回推論バッファ確保・ウォームアップ数十〜数百 ms
2回目以降確保済みの経路で実行多くは 10〜30 ms 程度

問題は、この重い初回を「ユーザーが結果を待っている瞬間」にぶつけてしまうことです。設計の目標は単純で、初回の重さを、ユーザーが待っていない時間に前倒しすることです。

モデルのロードとウォームアップを起動フローから外す

まず、モデルをアプリ起動と同時に同期ロードしないことです。lazy で遅延させ、バックグラウンドのキューでロードとウォームアップ(ダミー入力での1回推論)を済ませておきます。

import CoreML
 
actor InferenceEngine {
    private var model: MyModel?
 
    // バックグラウンドで温める。起動直後ではなく、最初の画面が出た後に呼ぶ
    func warmUp() async {
        guard model == nil else { return }
        let config = MLModelConfiguration()
        config.computeUnits = .all        // Neural Engine を含めて任せる
        do {
            let loaded = try MyModel(configuration: config)
            // ダミー入力で初回推論を済ませ、バッファを確保しておく
            _ = try? loaded.prediction(input: .dummy)
            model = loaded
        } catch {
            model = nil                   // 失敗しても起動は止めない
        }
    }
 
    func predict(_ input: MyModelInput) async throws -> MyModelOutput {
        if model == nil { await warmUp() }
        guard let model else { throw InferenceError.unavailable }
        return try model.prediction(input: input)
    }
}

呼び出し側は、最初の画面が描画され、ユーザーが操作を始めるより前のわずかな余白で warmUp() を呼びます。

.task {
    // 画面表示後のアイドル時間に温める
    await engine.warmUp()
}

ここで効くのは actor です。複数の場所から同時に predict が呼ばれても、ロードが二重に走らないことを言語レベルで保証できます。私は初期にこの保護を入れ忘れ、画面遷移のたびにモデルを多重ロードしてメモリを無駄に膨らませていました。並行アクセスは、オンデバイス推論で地味にハマる落とし穴です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Core ML コールドスタートの正体(初回コンパイル・初回推論)と、actor で起動フローから外す設計
ProcessInfo.thermalState を見て推論を full / reduced / suspended の3段で落とすゲーティング
メモリ警告・バックグラウンド遷移でモデルを手放し、復帰時に温め直す実装
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-06-18
Rork Max で Apple TV のアンビエント表示アプリを組み立てる
Rork Max が生成するネイティブ Swift を土台に、Apple TV で静かに流し続けるアンビエント表示アプリを設計します。Top Shelf・フォーカスエンジン・途切れない映像ループの実装を、運用で気づいた勘どころとともにまとめました。
アプリ開発2026-06-16
Rork Max のアプリに Apple Wallet のスタンプカードを足す — 署名と更新の実装メモ
店舗のスタンプカードを Apple Wallet に入れたい——Rork Max が生成した Swift アプリから PassKit のパスを発行する際、難所はデザインではなく『署名』と『リモート更新』でした。実装の勘所を整理します。
アプリ開発2026-06-16
初回起動の前に壁紙パックを落としておく — Rork Max と Background Assets の使いどころ
コンテンツの多いアプリは、初回起動時に空のグリッドを見せてしまいがちです。アプリ本体とは別枠でコンテンツを先回りして落とす Background Assets を、Rork(Expo)では届かない領域として Rork Max のネイティブ Swift でどう実装するか、運用判断まで含めてまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →