Explore machine learning on Apple platforms
Machine Learning & AI 进阶 20m

Apple 平台机器学习全览:从系统 API 到自定义模型部署

Explore machine learning on Apple platforms

2024年6月10日

在 Apple 官方观看视频

一句话判断

这是 Apple 平台 ML 生态的总览 Session——从零代码集成系统智能(Writing Tools、Image Playground),到 Create ML 定制模型,再到 Core ML 部署自定义模型,帮你理清不同场景该用什么工具。

这场 Session 讲了什么

这个 Session 把 Apple 平台的机器学习能力分成了四个层次。

第一层是系统内置智能,通过 Apple Intelligence 直接在 App 中使用。Writing Tools 提供文本改写、校对、总结能力,集成到系统的文本和 Web 视图即可。Image Playground 提供端侧图像生成,几行代码就能获得预构建的 UI。Siri 通过 App Intents 理解和执行 App 功能。

第二层是 ML 驱动的系统 API。Vision 框架今年新增了 Swift API(支持 Swift 6)、手部姿态检测、美学评分请求。新增的 Translation 框架支持直接的语言翻译 API 和翻译展示 UI。Natural Language、Sound Analysis、Speech 等框架继续提供文本分析、声音识别、语音转文字能力。

第三层是 Create ML,用你自己的数据定制系统模型。今年新增了对象追踪、时间序列分类/预测,以及数据标注可视化。

第四层是 Core ML,用于部署自定义模型(包括从 Hugging Face 下载的开源模型)。工作流分为三步:训练(PyTorch/TensorFlow/JAX/MLX on Mac)-> 准备(Core ML Tools 转换和优化)-> 集成(Core ML 框架加载和推理)。

值得深挖的点

模型部署的三阶段工作流

训练阶段可以在 Mac 上利用 Apple Silicon 的 GPU 和统一内存,通过 Metal 加速训练。PyTorch、TensorFlow、JAX 和 Apple 自家的 MLX 都支持。今年改进了 Metal 上 Scaled Dot-Product Attention 的训练效率,支持自定义 Metal 操作集成到 PyTorch,以及 JAX 的混合精度训练。

准备阶段用 Core ML Tools 把训练好的模型转换为 Core ML 格式。这一步包括模型优化——量化减少模型体积,检查兼容性确保在目标设备上运行。

集成阶段用 Core ML 框架加载和运行模型。关键是选择正确的计算单元(CPU、GPU 或 Neural Engine)来平衡延迟和能效。

这三个阶段的分工意味着你不需要在 Apple 平台上重新训练模型。你在任何地方训练好模型,只需要确保能转换为 Core ML 格式就行。

Translation 框架的设计

Translation 是今年全新的框架,解决的是”在 App 内翻译文本”这个常见需求。它提供两种使用方式:编程式翻译 API(可以批量处理翻译请求)和预构建的翻译展示 UI。

有意思的是语言资产的管理。翻译模型需要在设备上下载对应的语言包,框架负责下载和管理。这意味着你的 App 不需要打包语言模型,用户第一次使用时自动下载。批量翻译 API 可以把多个请求合并处理,减少模型加载的开销。

代码片段

使用 Writing Tools 集成

// Writing Tools 自动集成到系统的文本视图
// UITextView、NSTextView、WKWebView 都自动支持
// 用户可以通过系统菜单触发改写、校对、总结

// 如果需要自定义集成方式,也可以使用新的 API

场景:你的 App 有文本输入区域,用户可以直接使用系统的 Writing Tools 对文本进行改写或总结,不需要额外代码。

Translation API 调用

import Translation

// 方式 1:使用预构建的翻译展示 UI
func showTranslation(sourceText: String) {
    let config = TranslationSession.Configuration(
        source: Locale.Language(identifier: "en"),
        target: Locale.Language(identifier: "zh-Hans")
    )
    // 弹出系统翻译界面
    presentTranslation(config, text: sourceText)
}

// 方式 2:编程式批量翻译
func batchTranslate(texts: [String]) async throws -> [String] {
    let session = try await TranslationSession(
        source: Locale.Language(identifier: "en"),
        target: Locale.Language(identifier: "zh-Hans")
    )
    let translations = try await session.translations(from: texts)
    return translations.map { $0.targetText }
}

场景:App 内需要翻译用户生成的内容或界面文本。批量翻译适合翻译大量静态内容(如产品描述)。

坑点:翻译 API 首次调用时可能需要下载语言包,在弱网环境下会有延迟。建议在 UI 上给出提示。

Core ML 模型部署流程

# 准备阶段:用 coremltools 转换 PyTorch 模型
import coremltools as ct
import torch

# 加载训练好的 PyTorch 模型
pytorch_model = MyModel()
pytorch_model.load_state_dict(torch.load("model.pth"))
pytorch_model.eval()

# 转换为 Core ML 格式
traced_model = torch.jit.trace(pytorch_model, torch.randn(1, 3, 224, 224))
mlmodel = ct.convert(traced_model, 
                      inputs=[ct.TensorType(name="input", shape=(1, 3, 224, 224))])

# 量化优化(减少模型体积)
quantized_model = ct.composite_utils.quantize_weights(mlmodel, mode="linear")

# 保存
quantized_model.save("MyModel.mlpackage")
// 集成阶段:在 App 中加载和运行
import CoreML

let model = try MyModel(configuration: MLModelConfiguration())

let input = try MyModelInput(image: inputImage)
let prediction = try model.prediction(input: input)

场景:从开源社区获取或自行训练的模型,通过 coremltools 转换后在 App 中运行。

最佳实践

  • 如果系统 API 能满足需求(Vision、Translation、Sound Analysis),优先使用,不需要自己训练模型
  • Writing Tools 和 Image Playground 的集成成本极低,优先考虑集成
  • Create ML 适合需要用自己的数据定制系统模型的中级场景
  • 自定义模型部署走 Core ML 三阶段流程,训练可以在 Mac 上用 Metal 加速
  • 模型量化是减小 App 体积的重要手段,linear 量化在多数场景下精度损失可接受

还有什么值得关注

  • Vision 框架的 Swift API 重写是今年的重要改进,配合 Swift 6 的并发安全
  • “Train your machine learning and AI models on Apple GPUs” Session 有 Metal 训练加速的细节
  • MLX 是 Apple 开源的机器学习框架,专为 Apple Silicon 设计,值得在训练阶段探索
WWDC 2024