apple-on-device-ai

apple-on-device-ai

熱門

在 iPhone、iPad 和 Mac 上使用 Foundation Models、Core ML、MLX Swift 或 llama.cpp 打造私密、裝置端的 AI 功能。適用於選擇 Apple 本地模型執行環境、建構 Apple Intelligence 聊天機器人或工具呼叫功能、在 Apple Silicon 上執行 LLM、將 Python 模型轉換或壓縮為 Core ML,或比較裝置端推論後端。如需 Swift Core ML 載入與預測程式碼,請使用 coreml 技能。

931星標
0分支
更新於 2026/7/26
SKILL.md
readonlyread-only
name
apple-on-device-ai
description

Build private, on-device AI features on iPhone, iPad, and Mac with Foundation Models, Core ML, MLX Swift, or llama.cpp. Use when choosing an Apple-local model runtime, building an Apple Intelligence chatbot or tool-calling feature, running an LLM on Apple Silicon, converting or compressing a Python model for Core ML, or comparing on-device inference backends. For Swift Core ML loading and prediction code, use the coreml skill.

Apple 平台裝置端 AI

選擇、部署及最佳化裝置端 ML 模型的指南。涵蓋 Apple Foundation Models、Core ML、MLX Swift 與 llama.cpp。

目錄

框架選擇路由器

使用此決策樹為您的使用案例選擇正確的框架。

Apple Foundation Models

使用時機: 在啟用 Apple Intelligence 的 iOS 26+ / macOS 26+ 裝置上進行文字生成、摘要、實體提取、結構化輸出及簡短對話。無需應用程式管理的 API 金鑰、網路往返或模型託管;但仍需處理系統模型資產的就緒狀態。

最適合:

  • 使用 @Generable 類型生成文字或結構化資料
  • 摘要、分類、內容標記
  • 使用 Tool 協定進行工具增強生成
  • 需要保證裝置端隱私的應用程式

不適合: 複雜數學、程式碼生成、事實準確性任務,或目標為 iOS 26 之前版本的應用程式。

Core ML

使用時機: 在所有 Apple 平台上部署自訂訓練模型(視覺、NLP、音訊)。使用 coremltools 從 PyTorch、TensorFlow 或 scikit-learn 轉換模型。

最適合:

  • 影像分類、物體偵測、分割
  • 自訂 NLP 分類器、情感分析模型
  • 透過 SoundAnalysis 整合的音訊/語音模型
  • 任何需要神經網路引擎最佳化的場景
  • 需要量化、調色盤化或剪枝的模型

MLX Swift

使用時機: 在 Apple Silicon 上以最大吞吐量執行特定開源 LLM(Llama、Mistral、Qwen、Gemma)。研究與原型開發。

最適合:

  • 在 Apple Silicon 上達到最高持續 token 生成速率
  • mlx-community 執行 Hugging Face 模型
  • 需要自動微分的研究
  • 在 Mac 上進行微調工作流程

llama.cpp

使用時機: 使用 GGUF 模型格式進行跨平台 LLM 推論。需要廣泛裝置支援的生產部署。

最適合:

  • GGUF 量化模型(Q4_K_M、Q5_K_M、Q8_0)
  • 跨平台應用程式(iOS + Android + 桌面)
  • 與開源模型生態系統的最大相容性

快速參考

情境 框架
在 Apple Intelligence 裝置上進行文字生成(iOS 26+) Foundation Models
從裝置端 LLM 取得結構化輸出 Foundation Models(@Generable
影像分類、物體偵測 Core ML
來自 PyTorch/TensorFlow 的自訂模型 Core ML + coremltools
執行特定開源 LLM MLX Swift 或 llama.cpp
在 Apple Silicon 上達到最大吞吐量 MLX Swift
跨平台 LLM 推論 llama.cpp
OCR 與文字辨識 Vision 框架
情感分析、NER、分詞 Natural Language 框架
在裝置上訓練自訂分類器 Create ML

Apple Foundation Models 概覽

在 Apple Intelligence 裝置上使用系統語言模型進行簡短生成、摘要、標記、結構化輸出及工具增強任務。在建立 session 前,務必檢查每個進入點:

import FoundationModels

switch SystemLanguageModel.default.availability {
case .available:
    guard SystemLanguageModel.default.supportsLocale(Locale.current) else {
        // 在生成前使用語言區域備援
        break
    }
    // 繼續使用模型
case .unavailable(.appleIntelligenceNotEnabled):
    // 引導使用者在設定中啟用 Apple Intelligence
case .unavailable(.modelNotReady):
    // 系統模型資產尚未就緒;顯示載入狀態
case .unavailable(.deviceNotEligible):
    // 裝置無法執行 Apple Intelligence;使用備援方案
case .unavailable(let reason):
    // 未知或未來的不支援原因;使用備援方案並記錄原因
}

然後建立 session 並保持其共享上下文預算較小:

let session = LanguageModelSession {
    "你是一位有用的烹飪助手。"
}
session.prewarm()
let response = try await session.respond(to: "建議一個快速義大利麵食譜")

必要的防護措施:

  • Session 是有狀態的,一次只接受一個請求;序列化存取,並在發出另一個回應前檢查 isResponding
  • 指令、工具、結構描述、提示、對話記錄和輸出共享上下文視窗。僅註冊必要的工具,並保持結構描述簡潔。
  • 使用 supportsLocale(_:) 解析語言區域;不要直接比對語言列表。
  • 將不可信的用戶內容放在提示中,絕不要放在指令中。系統防護措施仍會生效,因此請使用備援 UI 處理拒絕及其他生成錯誤。

當任務需要 @Generable@Guide、串流、工具定義、對話記錄、生成選項、自訂適配器、提示設計或詳細錯誤處理時,請載入 Foundation Models 參考資料

Core ML 概覽

Apple 用於部署訓練模型的框架。自動分派至最佳運算單元(CPU、GPU 或神經網路引擎)。

模型格式

格式 副檔名 使用時機
.mlpackage 目錄(mlprogram) 所有新模型(iOS 15+)
.mlmodel 單一檔案(neuralnetwork) 僅限舊版(iOS 11-14)
.mlmodelc 已編譯 預先編譯以加快載入速度

新工作一律使用 mlprogram(.mlpackage)。

轉換管線(coremltools)

import coremltools as ct

# PyTorch 轉換(torch.jit.trace)
model.eval()  # 關鍵:在追蹤前務必呼叫 eval()
traced = torch.jit.trace(model, example_input)
mlmodel = ct.convert(
    traced,
    inputs=[ct.TensorType(shape=(1, 3, 224, 224), name="image")],
    minimum_deployment_target=ct.target.iOS18,
    convert_to='mlprogram',
)
mlmodel.save("Model.mlpackage")

驗證、修正與重新轉換

  1. 在轉換前,凍結具代表性的來源模型測試案例及可接受的輸出/任務容差。
  2. 轉換後,對來源模型和 Core ML 模型執行相同的測試案例。
  3. 如果輸出一致性或任務指標超出容差,檢查形狀、運算子、精度和預處理;修正轉換並重新執行測試案例。
  4. 僅在未壓縮模型通過後才進行壓縮。每次壓縮變更後重新驗證準確性,若未達標則還原或調整變更。
  5. 在實體目標裝置上對通過的模型進行效能分析,然後重複直到正確性、延遲、記憶體和套件大小目標全部通過。

coreml 的界線

此技能負責 Python 端的轉換、壓縮、效能分析及框架選擇。Swift 應用程式整合、預測 API、執行時期設定、Vision 請求連接及詳細模型載入請使用同系列的 coreml 技能。

完整轉換管線請參閱 references/coreml-conversion.md,最佳化技術請參閱 references/coreml-optimization.md

MLX Swift 概覽

Apple 的 Swift ML 框架。透過統一記憶體架構在 Apple Silicon 上達到最高持續生成吞吐量。

載入與執行 LLM

import MLX
import MLXLLM
import MLXLMCommon
import MLXLMHFAPI

let container = try await LLMModelFactory.shared.loadContainer(
    from: HubClient.default,
    using: TokenizersLoader(),
    configuration: .init(id: "mlx-community/Qwen3-4B-4bit")
)
let session = ChatSession(container)
print(try await session.respond(to: "你好"))

依裝置選擇模型

裝置 RAM 建議模型 RAM 使用量
iPhone 12-14 4-6 GB SmolLM2-135M 或 Qwen 2.5 0.5B ~0.3 GB
iPhone 15 Pro+ 8 GB Gemma 3n E4B 4-bit ~3.5 GB
Mac 8 GB 8 GB Llama 3.2 3B 4-bit ~3 GB
Mac 16 GB+ 16 GB+ Mistral 7B 4-bit ~6 GB

記憶體管理

  1. 在 iOS 上絕不超過總 RAM 的 60%
  2. 設定 MLX 快取限制:Memory.cacheLimit = 512 * 1024 * 1024
  3. 在背景化或記憶體壓力時卸載 MLX 和 llama.cpp 模型;對於 MLX,在大量生成階段後也呼叫 Memory.clearCache()
  4. 對較大模型使用「增加記憶體限制」權利
  5. 在實體 Apple Silicon 上驗證 MLX Swift 和 llama.cpp;模擬器無法執行依賴 Metal 的推論、記憶體或效能測試

完整的 MLX Swift 模式與 llama.cpp 整合請參閱 references/mlx-swift.md

多後端架構

當應用程式需要多個 AI 後端(例如 Foundation Models + MLX 備援)時:

func respond(to prompt: String) async throws -> String {
    if SystemLanguageModel.default.isAvailable {
        return try await foundationModelsRespond(prompt)
    } else if canLoadMLXModel() {
        return try await mlxRespond(prompt)
    } else {
        throw AIError.noBackendAvailable
    }
}

透過協調器 actor 序列化所有模型存取,防止競爭:

actor ModelCoordinator {
    func withExclusiveAccess<T>(_ work: () async throws -> T) async rethrows -> T {
        try await work()
    }
}

對於自訂 Core ML 模型,僅在此處提及轉換/最佳化交接:將 Swift 應用程式整合、模型載入、Vision 連接及預測生命週期交給 coreml。將私人用戶內容(例如日記)保留在裝置上,除非產品明確選擇非本地備援。

效能最佳實務

  1. 在除錯器外執行以獲得準確基準(Xcode:Cmd-Opt-R,取消勾選「Debug Executable」)
  2. 在使用者互動前為 Foundation Models 呼叫 session.prewarm()
  3. 預先編譯 Core ML 模型為 .mlmodelc 以加快載入速度
  4. 使用 EnumeratedShapes 而非 RangeDim 以最佳化神經網路引擎
  5. 使用 4 位元調色盤化以獲得最佳神經網路引擎記憶體/延遲增益
  6. 將詳細的 Vision、Natural Language 及 Swift Core ML 執行時期整合交給同系列的框架技能

常見錯誤

  1. 未檢查可用性。 在未檢查 SystemLanguageModel.default.availability 的情況下開始生成,會讓不支援的裝置出現失敗而非備援 UI。
  2. 無備援 UI。 使用 iOS 26 之前版本或沒有 Apple Intelligence 的裝置用戶看不到任何內容。務必提供優雅的降級路徑。
  3. 超出上下文視窗。 token 預算涵蓋輸入 + 輸出。透過 tokenCount(for:) 監控使用量,並在必要時進行摘要。
  4. 對同一個 session 發出並行請求。 LanguageModelSession 一次只支援一個請求。檢查 session.isResponding 或序列化存取。
  5. 將不可信內容放在指令中。 用戶輸入放在 instructions 參數中會繞過防護邊界。將用戶內容保留在提示中。
  6. 跳過轉換一致性檢查。 在固定測試案例上比較來源模型和 Core ML 模型,然後在壓縮或發布前修正並重新轉換。
  7. 在 Core ML 追蹤前忘記呼叫 model.eval() PyTorch 模型必須在 eval 模式下才能進行 torch.jit.trace。訓練模式的人工產物會破壞輸出。
  8. 使用 neuralnetwork 格式。 新的 Core ML 模型一律使用 mlprogram(.mlpackage)。舊版 neuralnetwork 格式已棄用。
  9. 在 iOS 上超過 60% RAM(MLX Swift)。 大型模型會導致 OOM 終止。
  10. 信任 MLX 模擬器結果。 在實體裝置上驗證依賴 Metal 的行為;模擬器僅適用於 UI/控制流程的冒煙測試。
  11. 未清除 MLX 快取。 模型卸載時應搭配 Memory.clearCache()

審查核對清單

  • [ ] 框架選擇符合使用案例與目標 OS 版本
  • [ ] Foundation Models:每次 API 呼叫前檢查可用性
  • [ ] Foundation Models:模型不可用時有優雅備援
  • [ ] Foundation Models:在使用者互動前呼叫 session prewarm
  • [ ] Foundation Models:@Generable 屬性按邏輯生成順序排列
  • [ ] Foundation Models:已考量 token 預算(檢查 contextSize
  • [ ] Core ML:模型格式為 mlprogram(.mlpackage)適用於 iOS 15+
  • [ ] Core ML:來源/Core ML 一致性通過固定測試案例與任務容差
  • [ ] Core ML:壓縮模型已重新驗證並在實體目標上進行效能分析
  • [ ] MLX Swift:模型大小適合目標裝置 RAM
  • [ ] MLX Swift:已設定快取限制、清除快取、卸載模型
  • [ ] 所有模型存取透過協調器 actor 序列化
  • [ ] 並行:模型類型與工具實作符合 Sendable 或隔離於 @MainActor
  • [ ] 已執行實體裝置測試(非模擬器)

參考資料