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 是将经过训练的机器学习模型从原始框架格式转换为 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 |
|---|---|---|
| PyTorch | TorchScript, torch.export | CTConverter / convert() |
| TensorFlow 2.x | SavedModel, Keras H5 | convert() |
| TensorFlow 1.x | Frozen .pb | convert() |
| ONNX | .onnx | onnx_to_coreml() |
| scikit-learn | .pkl / Pipeline | converters.sklearn.convert() |
| Keras | .h5 / .keras | convert() |
coremltools — 是 Apple 的官方开源 Python 库,可通过 pip install coremltools 获取。该库为从所有支持的框架进行转换提供了统一的 API,以及后处理工具:量化、精度检查和图可视化。
安装和从 PyTorch 进行基本模型转换:
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 自动确定输入和输出张量:
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 转换 MobileNetV3 模型的示例,指定输入数据类型和最低 iOS 版本。使用 ct.ImageType 进行自动图像归一化:
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 支持:
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 加载这些格式无需源代码,并根据计算图执行转换。
coremltools 在转换过程中会在日志中显示不支持的操作列表。使用 ct.utils.get_coreml_operations() 获取可用 Core ML 运算符的完整列表。
量化调色板是用于压缩模型权重的一组参数:fp16、int8 或 palettization。coremltools 支持 8 位、16 位调色板以及不同位深度的 LUT 量化。
是的,.mlmodel 在设备上执行之前必须编译为 mlmodelc。编译在 Xcode 构建时自动进行,或在设备上通过 MLModel.compile(at:) 进行。
使用 ct.models.CompiledModel 比较原始模型和转换后模型的输出。提供相同的输入数据,并使用 MSE 或余弦相似度指标比较结果。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。