Pytorch框架,怎么使用C++调用部署模型?


Pytorch框架,怎么使用C++调用部署模型?

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

以下文章来源于:Civ@知乎
作者:Civ
链接:https ://www. zhihu.com/question/66532235/answer/2782357337
本文仅用于学术分享,如有侵权,请联系后台作删文处理
导读
本文详述PyTorch模型向C++环境高效部署的端到端技术路径。阐述将PyTorch模型转换为ncnn格式、集成ncnn进行模型加载、处理异构输入数据及执行高效前向推理。为跨平台C++模型部署的标准化技术实现方案。
方法有很多种,比较简单的路径是:
PyTorch模型–>ONNX格式–>C++推理框架
本文以C++推理框架ncnn为例,介绍一下大致流程。其它C++推理框架的思路类似,唯一的学习成本是推理框架本身的API。

简单来说,可以把ONNX当做一个中间格式。绝大多数的机器学习/深度学习框架都可以将自身的模型转换成ONNX,同样也能把ONNX转换成自身框架的格式,如下图所示。
ONNX官网地址:https ://onnx. ai/
在PyTorch中,可以用如下方法非常方便地将一个PyTorch模型存储为ONNX格式:

需要注意的是,ONNX的目的是“通用”,所以难免会在一些情况出现算子不兼容的情况。具体的表现是,当你把某个框架(例如PyTorch)的模型转成ONNX后,再将ONNX转成另一框架模型(例如ncnn)时,可能会报错(xxx算子不支持)。不兼容的情况多种多样,这里不举例说明了,需要具体情况具体分析。
一些有效的解决方法:

避免依赖于中间变量的尺寸来进行运算。比如,在一些ImagetoImage的任务中,可能会根据中间tensor的尺寸来对另一些tensor进行resize。这时我们的做法是先去获取中间tensor的尺寸H、W,然后将它们作为参数送给其它方法。当遇到这种运算时,ONNX似乎会创建两个与H、W相关的变量,但它们的值会绑定为用dummy_input去forward一次时得到的H、W。这个值一旦绑定就不会改变。所以后续当使用不同尺寸输入时极大概率会报错(这点没有仔细验证过,但看中间结果很像是这种情况)。
另外强烈建议使用一些网络可视化工具。当遇到模型转换报错时可以用来方便定位出错的位置。个人比较喜欢的是netron,地址:https ://github. com/lutzroeder/netron
放一张仓库中的图,效果如下:
ncnn是腾讯开源的轻量级推理框架。简单易用是它最大的特点。但当功耗、时耗是主要考虑点的时候,需要多尝试其它框架,如TensorFlowLite。
ncnn地址:https ://github. com/Tencent/ncnn

onnx_model_path替换为自己的onnx模型地址。后两个参数可选。如果不写,那么会在onnx2ncnn. exe同目录下产生转换后的ncnn模型文件:一个. param文件和一个.bin文件。也可以自己填后两个参数来自己指定文件输出路径。
在任何框架下推理都只需要两步:加载模型和将数据转化为框架格式。
ncnn下加载模型的方法为(还有其它方法):
加载模型后,只需要将数据转化为ncnn的格式即可。ncnn模型输入的格式是ncnn::Mat。
OpenCV的Mat转ncnn::Mat的方法全列于此处:
https ://github. com/Tencent/ncnn/wiki/use-ncnn-with-opencv
如:

代码如:
有了模型和输入,最后forward一次,再取结果即可:
欢迎加入《AI未来星球》,一起成长
扫描下方二维码即可加入~
真诚分享AI落地过程(AI商机->项目签约->算法开发->产品开发->实施运维)中的各方面经验和踩过的坑。
你可以获得什么?
1、大白之前花费10W+购买,AI行业各场景私有数据集下载,星球内倾情分享;2、AI行业研发、产品、商业落地问题咨询(目前AI公司创业中),都可获高质量解答,有效期一年,无限次提问,有问必答。3、定期邀请AI行业各类嘉宾分享,创业/商业等方面的经验!
帮助你解决遇到的实际问题,升职加薪!
大家一起加油!


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录