pytorch 训练出. pth 模型如何在 MacOS 上或者 iOS 部署, 这是个问题.
然而我们有了 onnx, 同样我们也有了 coreML.
ONNX:
onnx 是一种针对机器学习设计的开放式文件格式, 用来存储训练好的模型, 并进行多种框架模型间的转换.
coreML:
Apple 在 2017 年 MacOS 10.13 以及 IOS11 + 系统上推出了 coreML1.0, 官网地址: https://developer.apple.com/documentation/coreml .
2018 年又推出 MacOS 10.14 以及 IOS12 系统上的 coreML2.0 https://www.appcoda.com/coreml2/ .
coreML 框架可以方便的进行深度学习模型的部署, 利用模型进行预测, 让深度学习可以在 apple 的移动设备上发光发热. 而开发者需要做的仅仅是将 model.mlModel 拖进 xcode 工程, xcode 工程会自动生成以模型名称命名的 object-c 类以及多种进行预测所需的类接口.
pytorch -- ONNX -- coreML
没错, 就是这个流程. 我们有训练好的. pth 模型, 通过 pytorch.onnx.export() 转化为 .onnx 模型, 然后利用 onnx_coreml.convert() 将 .onnx 转换为 .mlModel. 将. mlModel 拖进 xcode 工程编写预测代码就可以了.
1. pytorch -- ONNX
请先查看 pytorch 官网的 onnx 模块: https://pytorch.org/docs/stable/onnx.html . 主要的代码就这一个 API, 各个参数意义请查阅文档.
torch.onnx.export(model, dummy_input, "alexnet.onnx", verbose=True, input_names=input_names, output_names=output_names);
转换部分代码如下:
- batch_size=1
- onnx_model_path = "onnx_model.onnx"
- dummy_input = V(torch.randn(batch_size, 3, 224, 224), requires_grad=True)
- torch_out= torch.onnx.export(pytorch_model, dummy_input , onnx_model_path, verbose=True,input_names=['image'], output_names=['outTensor'], export_params=True, training=False )
这里有一个需要注意的地方就是 input_names 和 output_names 的设置, 如果不设置的情况, 输入层和输出层 pytorch 会自动分配一个数字编号. 比如下图 (用 netron 工具查看, 真是一个很好用的工具 https://pypi.org/project/netron/). 自动分配的输入名称和输出名称是 0 和 199. 这样转换成 coreML 模型后加载到 xcode 中会出现 "initwith0" 这样的编译错误, 就是模型初始化的时候不能正确处理这个输入名称 0. 因此最好是在 export 的时候将其修改一个名称.
修改之后的模型是这样的, 可以看到模型的输入和输出名称都发生的修改:
2. onnx -- mlModel
这一部分需要安装 onnx, GitHub 地址: https://github.com/onnx/onnx 以及安装一个转换工具 onnx_coreML,GitHub 地址: https://github.com/onnx/onnx-coreml . 里面用到了一个 coremltools : https://pypi.org/project/coremltools/ , 这个 tool 目前仅支持 python2.7 环境下使用.
安装好后, import onnx , import onnx_coreML 就可以使用. 转换代码如下:
- onnx_model = onnx.load("onnx_model.onnx")
- cml_model= onnx_coreml.convert(onnx_model)
- cml_model.save("coreML_model.mlmodel")
当然, onnx_coreml.convert 有很多参数, 可以用来预处理, 设置 bgr 顺序等, 请参看 GitHub 文档介绍.
现在将 coreML_model.mlModel 拖进 xcode 工程里, 会自动生成一个 coreML_model 类, 这个类有初始化模型, 输入 预测 输出等 API, 编写预测代码即可.
3. 在最新的 coreML2.0 中, 支持模型的量化. coreML1.0 中处理模型是 32 位, 而在 coreML2.0 中可以将模型量化为 16bit, 8bit, 4bit 甚至是 2bit. 具体请看 apple WWDC 视频以及 PPT.
模型量化仍然是使用 coreMLtool2.0 工具, 具体代码请查阅这篇博客, 写的很详细: https://www.jianshu.com/p/b6e3cb7338bf . 两句代码即可完成量化转换.
时间仓促, 写的粗糙, 随后更新.
来源: https://www.cnblogs.com/riddick/p/10434339.html