Core ML Model Conversion:定义、阶段与转换方法

作者: IT Sectr 发布日期: 2026-07-17 阅读时间: 6 分钟

Core ML Model Conversion 是将经过训练的机器学习模型从流行框架转换为 Core ML (.mlmodel) 格式的过程,该格式针对在 Apple 设备上执行进行了优化。转换是必要的,因为 PyTorch、TensorFlow 和其他框架使用它们自己的格式,这些格式与 Core ML Runtime 不兼容。根据 coremltools documentation, 2025,该库支持从 PyTorch、TensorFlow 1.x 和 2.x、Keras、ONNX、scikit-learn 和 libsvm 进行转换。coremltools 会自动用等效操作替换不支持的操作,同时保持模型的数值精度。

要点

  • Core ML Model Conversion — 将 ML 模型转换为 .mlmodel 格式以在 Apple 设备上执行。
  • 主要工具 — coremltools,Apple 的开源 Python 库。
  • 支持 PyTorch、TensorFlow、Keras、ONNX 和 scikit-learn。
  • 过程包括 图追踪、操作替换和精度验证。
  • 转换后,可以将模型量化为 FP16 或 INT8 以加速。

什么是 Core ML Model Conversion

Core ML Model Conversion 是将经过训练的机器学习模型从原始框架格式转换为 Apple 设备上 Core ML Runtime 可理解的 .mlmodel 格式的过程。如果不进行转换,在 PyTorch 或 TensorFlow 中训练的模型无法直接在 iOS 或 macOS 上加载和执行。

转换过程包括计算图的翻译:原始框架的每个运算符(Conv2D、BatchNorm、ReLU)都会映射到相应的 Core ML 运算符。如果没有直接替代品,coremltools 会使用复合操作或自定义层。根据 Apple ML Research,该库覆盖了来自不同框架的 200 多个运算符。

转换后,模型以 .mlmodel 包格式保存,其中包括图的 protobuf 描述、二进制形式的权重和元数据。然后该文件被编译为 mlmodelc 以在目标设备上执行。

支持的框架和格式

coremltools 7.x 版本支持从六个来源进行转换。PyTorch — 通过 torch.jit.trace 或 torch.export,TensorFlow 2.x — 通过 SavedModel 和 Keras H5,TensorFlow 1.x — 通过 frozen graph .pb。对于 ONNX,使用中间表示,然后将其转换为 Core ML。

框架兼容性矩阵

框架输入格式coremltools API
PyTorchTorchScript, torch.exportCTConverter / convert()
TensorFlow 2.xSavedModel, Keras H5convert()
TensorFlow 1.xFrozen .pbconvert()
ONNX.onnxonnx_to_coreml()
scikit-learn.pkl / Pipelineconverters.sklearn.convert()
Keras.h5 / .kerasconvert()

转换工具:coremltools

coremltools — 是 Apple 的官方开源 Python 库,可通过 pip install coremltools 获取。该库为从所有支持的框架进行转换提供了统一的 API,以及后处理工具:量化、精度检查和图可视化。

安装和从 PyTorch 进行基本模型转换:

python
import coremltools as ct
import torch
import torchvision

model = torchvision.models.resnet18(pretrained=True)
model.eval()

example_input = torch.rand(1, 3, 224, 224)
traced_model = torch.jit.trace(model, example_input)

mlmodel = ct.convert(
    traced_model,
    source="pytorch",
    inputs=[ct.ImageType(shape=example_input.shape)]
)
mlmodel.save("ResNet18.mlmodel")

要从 TensorFlow 进行转换,请使用 SavedModel 作为源。coremltools 会根据 signature_def 自动确定输入和输出张量:

python
import coremltools as ct

mlmodel = ct.convert(
    "saved_model_dir",
    source="tensorflow",
    @minimum_deployment_target=ct.target.iOS16
)
mlmodel.save("MyTFModel.mlmodel")

模型转换阶段

转换过程包括四个阶段。在第一阶段,coremltools 加载原始模型并执行追踪(tracing)或图扫描。对于 PyTorch,使用 torch.jit.trace,它将示例输入数据通过模型运行并记录操作序列。

在第二阶段,执行运算符映射(operator mapping)。原始图中的每个运算符都与 Core ML 运算符匹配。如果没有直接替代品,coremltools 会将运算符分解为一系列支持的运算符。根据 coremltools 文档,对于典型架构,PyTorch 运算符的覆盖率超过 95%。

第三阶段 — 图优化。coremltools 执行操作融合(例如 conv + batch norm)、消除不必要的转换和重新排序运算符以提高效率。第四阶段 — 序列化为 .mlmodel 格式,保留权重和元数据。

常见问题及解决方案

转换中最常见的问题是不支持的操作。如果模型包含 Core ML 中缺少的运算符,coremltools 会报告错误并显示操作名称。解决方案 — 用支持的运算符的等效组合替换该运算符,或通过 custom layer API 实现自定义层。

第二个问题 — 维度不匹配。PyTorch 使用 NCHW 格式,而 Core ML 默认使用 NHWC。coremltools 会自动插入转置,但有时轴的顺序会被错误地确定。检查转换日志中的输入和输出维度,如有必要,使用正确的名称指定 input_features

第三个问题 — 量化后精度损失。使用 FP16 或 INT8 调色板进行转换时,模型的精度可能会降低。coremltools 提供了 ct.models.CompiledModel 工具,用于在相同的输入数据上比较原始模型和转换后模型的输出。如果差异超过 1%,请使用不带校准的 FP16 调色板进行量化,或放弃量化。

PyTorch 和 TensorFlow 转换示例

从 PyTorch 转换 MobileNetV3 模型的示例,指定输入数据类型和最低 iOS 版本。使用 ct.ImageType 进行自动图像归一化:

python
import coremltools as ct
import torchvision

model = torchvision.models.mobilenet_v3_small(
    pretrained=True
)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced = torch.jit.trace(model, example)

mlmodel = ct.convert(
    traced,
    source="pytorch",
    inputs=[ct.ImageType(
        shape=example.shape,
        scale=1.0/255.0,
        bias=[0, 0, 0]
    )],
    @minimum_deployment_target=ct.target.iOS16
)

# 保存为 .mlmodel 以便稍后在 Xcode 中编译
mlmodel.save("MobileNetV3.mlmodel")

TensorFlow Keras 转换的示例,使用 FP16 量化。指定 minimum_deployment_target 以在配备 Apple A13 及更新版本的设备上启用 FP16 支持:

python
import coremltools as ct
from tensorflow import keras

keras_model = keras.applications.EfficientNetB0(
    weights="imagenet"
)

mlmodel = ct.convert(
    keras_model,
    source="tensorflow",
    @minimum_deployment_target=ct.target.iOS17
)

# 将权重量化为 FP16 以将大小减小 2 倍
mlmodel_fp16 = ct.models.neural_network.quantization_utils.quantize_weights(
    mlmodel, 16
)
mlmodel_fp16.save("EfficientNetB0_fp16.mlmodel")

常见问题解答

能否在没有源代码的情况下转换模型?

可以,如果模型以 TorchScript、SavedModel 或 ONNX 格式保存。coremltools 加载这些格式无需源代码,并根据计算图执行转换。

如何了解 Core ML 中不支持哪些操作?

coremltools 在转换过程中会在日志中显示不支持的操作列表。使用 ct.utils.get_coreml_operations() 获取可用 Core ML 运算符的完整列表。

coremltools 中的量化调色板是什么?

量化调色板是用于压缩模型权重的一组参数:fp16、int8 或 palettization。coremltools 支持 8 位、16 位调色板以及不同位深度的 LUT 量化。

转换后是否需要编译?

是的,.mlmodel 在设备上执行之前必须编译为 mlmodelc。编译在 Xcode 构建时自动进行,或在设备上通过 MLModel.compile(at:) 进行。

如何检查转换后模型的精度?

使用 ct.models.CompiledModel 比较原始模型和转换后模型的输出。提供相同的输入数据,并使用 MSE 或余弦相似度指标比较结果。

总结

  • Core ML Model Conversion — 将 ML 模型转换为 .mlmodel 格式以在 Apple 设备上执行的过程。
  • 主要工具 — coremltools,支持 PyTorch、TensorFlow、Keras、ONNX 和 scikit-learn。
  • 转换包括图追踪、运算符映射、优化和序列化。
  • 不支持的操作被替换为等效组合或通过 custom layer API 实现。
  • 转换后,可以使用 FP16 和 INT8 量化来减小尺寸和加速推理。
  • 在部署之前,通过 ct.models.CompiledModel 检查模型的精度
  • 将转换流水线规划为 CI/CD 的一部分,以自动更新应用程序中的模型。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读