如何将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
相关产品推荐
相关产品推荐

