Improve Core ML integration with async prediction
Machine Learning & AI 进阶 20m

用异步预测优化 Core ML 集成:性能、灵活性与生命周期

Improve Core ML integration with async prediction

2023年6月5日

在 Apple 官方观看视频

一句话判断

iOS 17 的 Core ML 推理引擎自动提速,新增计算设备查询、异步预测 API 和模型生命周期管理,让 ML 集成更精细可控。

这场 Session 讲了什么

Ben Levine 从 Core ML 团队出发,讲解了 Core ML 在性能和灵活性方面的年度更新:

自动性能提升。只需更新到 iOS 17,很多模型的推理速度就会变快——不需要重新编译模型或修改代码。加速来自推理引擎的底层优化,在所有 Apple 平台上都适用。

计算设备可用性查询。新增 MLComputeDevice 枚举和 availableComputeDevices 属性,让你在运行时检查 CPU、GPU、Neural Engine 的可用性。某些体验可能依赖 Neural Engine 才能满足性能或功耗要求,现在可以在运行时做出判断。

异步预测 API。新的 async 预测方法让你用 Swift structured concurrency 来管理推理调用。结合 MLModelConfiguration 的计算单元设置,可以精细控制预测在哪个硬件上执行。

模型生命周期管理。模型的加载、编译和预测是三个独立的阶段。理解每个阶段的开销和时机,是优化 ML 功能启动速度的关键。

CoreMLTools 优化工具。新增 optimize 子模块,统一了训练后压缩工具,增加了 PyTorch 的量化感知训练扩展。ML Program 模型类型新增了激活量化的操作支持。

值得深挖的点

模型评估的工具链。CoreMLTools 可以在 Python 中直接运行预测,使用和 App 相同的推理栈。Xcode 的 Model Previews 功能可以不写代码就测试模型。Core ML Performance Reports 提供加载、预测和编译时间的详细分解,可以在任何连接的设备上测试。

计算精度的权衡。CoreMLTools 支持为整个模型或单个操作设置 float32 或 float16 精度。训练后量化和压缩可以显著减小模型体积和提升推理速度,但会牺牲一些精度。新的量化感知训练扩展可以在训练阶段就考虑量化影响,帮助保持精度。

异步预测的结构化并发。不再需要回调或 delegate 模式,直接用 await 调用预测。这让模型推理可以自然地融入 Swift 的异步代码结构中,配合 Task cancellation 和 priority 来管理预测请求。

代码片段

// 查询可用计算设备
let model = try VNCoreMLModel(for: MyModel().model)
let availableDevices = MLModel.load(contentsOf: modelURL).availableComputeDevices

// 检查是否有 Neural Engine
let hasNeuralEngine = availableDevices.contains { device in
    if case .neuralEngine = device { return true }
    return false
}

if !hasNeuralEngine {
    // 降级方案:使用更小的模型或关闭某些 ML 功能
}
// 异步预测
func classify(image: CGImage) async throws -> ClassificationResult {
    let model = try await MyModel.load()  // 异步加载模型
    
    // 配置使用 Neural Engine
    let config = MLModelConfiguration()
    config.computeUnits = .all  // 让 Core ML 自动选择最优计算单元
    
    let input = MyModelInput(image: image)
    let prediction = try await model.prediction(input: input)
    return prediction
}
// 使用 CoreMLTools 优化模型(Python 端)
import coremltools as ct
from coremltools.optimize import *

# 量化感知训练配置
config = OpLinearQuantizerConfig(
    mode="linear_symmetric",
    weight_threshold=512
)

# 应用量化
quantized_model = linear_quantize_weights(
    mlmodel,
    config=config
)
quantized_model.save("ModelQuantized.mlpackage")

最佳实践

  • 模型加载有显著延迟,放在 App 启动阶段或用懒加载策略。
  • 使用 Performance Reports 在真实设备上测量模型性能,不要依赖模拟器。
  • 训练数据和部署数据要保持一致——模型在训练时看到的数据分布应该和用户实际输入匹配。
  • 用 CoreMLTools 的 Python 预测功能快速验证模型转换后的精度。
  • 异步预测配合 Task 管理,支持取消和优先级调整。

还有什么值得关注

  • “Compress machine learning models with Core ML” Session 深入讲解模型压缩
  • Create ML 今年也有更新,适合快速训练模型
  • Core ML 和 Neural Engine Instruments 可以在 Instruments 中查看模型的执行细节
  • ML Program 模型类型支持更多操作,是未来推荐使用的模型格式
WWDC 2023