You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ONNX模型转换为CoreML?HuggingFace模型iOS部署遇解码错误

问题描述

我正尝试将HuggingFace机器学习模型转为iOS可用的.mlmodel文件,流程是先将HuggingFace模型转成ONNX格式,再通过coremltools转为CoreML模型。转ONNX的过程正常,但使用coremltools.converters.onnx.convert转换时出错;改用coremltools.convert后,又遇到解码错误:

spec.ParseFromString(f.read()) google.protobuf.message.DecodeError: Error parsing message with type 'CoreML.Specification.Model'

我的转换代码如下:

import coremltools
# print(coremltools.converters.onnx.convert)
# Load the ONNX model
onnx_model_path = "model.onnx"
onnx_model = coremltools.utils.load_spec(onnx_model_path)


model = coremltools.convert(onnx_model)

# Set the model's input and output descriptions (optional)
coreml_model.input_description["input"] = "Input image"
coreml_model.output_description["output"] = "Output class label"

# Save the Core ML model to disk
coreml_model.save("model.mlmodel")
解决方法
  • 修正ONNX模型加载方式:coremltools.utils.load_spec是用于加载CoreML模型的Specification对象,不能用来加载ONNX模型。转换时直接将ONNX模型路径传给coremltools.convert即可,无需提前加载。
  • 修正变量名错误:代码中转换得到的对象赋值给了model,但后续操作却使用coreml_model,导致变量未定义报错,需统一变量名。
  • 验证ONNX模型完整性:用onnx官方工具检查模型是否损坏:
    import onnx
    onnx.checker.check_model("model.onnx")
    
  • 匹配coremltools版本:不同版本的coremltools API差异较大,建议安装稳定版(如7.0):
    pip uninstall coremltools -y
    pip install coremltools==7.0
    
  • 确认输入输出名称:HuggingFace模型的输入输出通常不是input/output(比如文本模型是input_ids/logits),先打印模型的输入输出名称再设置描述:
    print("输入名称:", [inp.name for inp in coreml_model.input_description])
    print("输出名称:", [out.name for out in coreml_model.output_description])
    

修正后的完整代码示例

import coremltools
import onnx

# 验证ONNX模型有效性
onnx_model_path = "model.onnx"
onnx.checker.check_model(onnx_model_path)

# 直接转换ONNX到CoreML
coreml_model = coremltools.convert(onnx_model_path)

# 查看并设置输入输出描述(根据实际名称调整)
print("输入名称:", [inp.name for inp in coreml_model.input_description])
print("输出名称:", [out.name for out in coreml_model.output_description])
coreml_model.input_description["input_ids"] = "输入文本的Token ID序列"
coreml_model.output_description["logits"] = "分类预测的概率分布"

# 保存CoreML模型
coreml_model.save("model.mlmodel")

内容的提问来源于stack exchange,提问作者Jakdad Jakdad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:27:25