Redian新闻
>
pytorch怎么使用c++调用部署模型?

pytorch怎么使用c++调用部署模型?

公众号新闻


MLNLP社区是国内外知名的机器学习与自然语言处理社区,受众覆盖国内外NLP硕博生、高校老师以及企业研究人员。
社区的愿景是促进国内外自然语言处理,机器学习学术界、产业界和广大爱好者之间的交流和进步,特别是初学者同学们的进步。
转载自 | 极市平台
作者 | Civ@知乎
来源 | https://www.zhihu.com/question/66532235/answer/2782357337

方法有很多种,比较简单的路径是:

PyTorch模型 --> ONNX格式 --> C++推理框架

本文以C++推理框架ncnn为例,介绍一下大致流程。其它C++推理框架的思路类似,唯一的学习成本是推理框架本身的API。


1

『PyTorch模型转ONNX』

ONNX is an open format built to represent machine learning models. ONNX defines a common set  of operators - the building blocks of machine learning and deep  learning models - and a common file format to enable AI developers to  use models with a variety of frameworks, tools, runtimes, and compilers.

简单来说,可以把ONNX当做一个中间格式。绝大多数的机器学习/深度学习框架都可以将自身的模型转换成ONNX,同样也能把ONNX转换成自身框架的格式,如下图所示。

图1 不同框架的模型利用ONNX进行相互转换

ONNX官网地址:https://onnx.ai/

在PyTorch中,可以用如下方法非常方便地将一个PyTorch模型存储为ONNX格式:

import torch

# 指定输入尺寸,ONNX需要这个信息来确定输入大小
# 参数对应于 (batch_size, channels, H, W)
dummy_input = torch.randn(1, 3, 224, 224, device="cuda")

# model为模型自身
# dummy_input根据自己的需求更改其尺寸
# "model.onnx"为输出文件,更改为自己的路径即可
torch.onnx.export(model, dummy_input, "model.onnx")

torch.onnx.export还有一些额外的参数可以实现更灵活的使用方法,详见https://pytorch.org/docs/stable/onnx.html。本文的示例足以让您能够成功部署自己的模型。

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

一些有效的解决方法:

  1. 使用ONNXSIM对ONNX模型进行精简。非常有效。个人建议:只要使用了ONNX,都用ONNXSIM对ONNX模型进行处理一次。Github地址:https://github.com/daquexian/onnx-simplifier。使用非常方便,使用“pip install onnxsim”安装,然后使用命令“onnxsim input_onnx_model_path output_onnx_model_path”即可。代码中调用也很简单,参考Git地址里的示例。

  2. 避免依赖于中间变量的尺寸来进行运算。比如,在一些Image to Image的任务中,可能会根据中间tensor的尺寸来对另一些tensor进行resize。这时我们的做法是先去获取中间tensor的尺寸H、W,然后将它们作为参数送给其它方法。当遇到这种运算时,ONNX似乎会创建两个与H、W相关的变量,但它们的值会绑定为用dummy_input去forward一次时得到的H、W。这个值一旦绑定就不会改变。所以后续当使用不同尺寸输入时极大概率会报错(这点没有仔细验证过,但看中间结果很像是这种情况)。

另外强烈建议使用一些网络可视化工具。当遇到模型转换报错时可以用来方便定位出错的位置。个人比较喜欢的是netron,地址:https://github.com/lutzroeder/netron

放一张仓库中的图,效果如下:

图2 netron效果图


2

『ONNX转ncnn』

ncnn是腾讯开源的轻量级推理框架。简单易用是它最大的特点。但当功耗、时耗是主要考虑点的时候,需要多尝试其它框架,如TensorFlow Lite。

ncnn地址:https://github.com/Tencent/ncnn

ncnn提供了将onnx转换为ncnn格式的工具。可以在此处找到:https://github.com/Tencent/ncnn/releases。例如,在Windows下,可以下载https://github.com/Tencent/ncnn/releases/download/20221128/ncnn-20221128-windows-vs2017.zip。解压后在x64或x86的bin文件夹中能够找到onnx2ncnn.exe。在命令行中使用如下命令即可将onnx转换为ncnn格式:

onnx2ncnn.exe onnx_model_path [ncnn.param] [ncnn.bin]

onnx_model_path 替换为自己的onnx模型地址。后两个参数可选。如果不写,那么会在onnx2ncnn.exe同目录下产生转换后的ncnn模型文件:一个.param文件和一个.bin文件。也可以自己填后两个参数来自己指定文件输出路径。


3

『在ncnn下进行模型推理』

在任何框架下推理都只需要两步:加载模型和将数据转化为框架格式。

ncnn下加载模型的方法为(还有其它方法):

ncnn::Net model;  // 定义一个模型
model.load_param("model.param");   // 加载模型的param文件
model.load_model("model.bin");        // 加载模型的bin文件

加载模型后,只需要将数据转化为ncnn的格式即可。ncnn模型输入的格式是ncnn::Mat。

OpenCV的Mat转ncnn::Mat的方法全列于此处:

https://github.com/Tencent/ncnn/wiki/use-ncnn-with-opencv

如:

// cv::Mat a(h, w, CV_8UC3);
ncnn::Mat in = ncnn::Mat::from_pixels(a.data, ncnn::Mat::PIXEL_BGR2RGB, a.cols, a.rows);

在JNI中要将一个android bitmap转换为ncnn::Mat可参考官方示例:https://github.com/nihui/ncnn-android-squeezenet/blob/master/app/src/main/jni/squeezencnn_jni.cpp

代码如:

// ncnn from bitmap
ncnn::Mat in = ncnn::Mat::from_android_bitmap(env, bitmap, ncnn::Mat::PIXEL_BGR);

有了模型和输入,最后forward一次,再取结果即可:

ncnn::Extractor ex = model.create_extractor();

// input_name 可以通过netron对.param或.bin文件进行查看
// 将input_name替换为模型的第一个输入位置的名字即可
 ex.input(input_name, in);

ncnn::Mat out;  // 用来存放输出结果

// output_name可以通过netron对.param或.bin文件进行查看
// 将output_name替换为模型的输出位置的名字即可
ex.extract(output_name, out);


4

『写在最后』

只要是转换模型,大多数路径都是如此,学习成本并不高。主要是学习推理框架的成本。芯片厂商自身的推理框架相对复杂点,各种奇奇怪怪的条条框框。

技术交流群邀请函

△长按添加小助手

扫描二维码添加小助手微信

请备注:姓名-学校/公司-研究方向
(如:小张-哈工大-对话系统)
即可申请加入自然语言处理/Pytorch等技术交流群

关于我们

MLNLP 社区是由国内外机器学习与自然语言处理学者联合构建的民间学术社区,目前已经发展为国内外知名的机器学习与自然语言处理社区,旨在促进机器学习,自然语言处理学术界、产业界和广大爱好者之间的进步。
社区可以为相关从业者的深造、就业及研究等方面提供开放交流平台。欢迎大家关注和加入我们。

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
Transformer如何做扩散模型?伯克利最新《transformer可扩展扩散模型》论文别卷了!哈工大博士半年整理的Pytorch笔记公开!PyTorch 安装包出问题,官方警告:这些 Linux 用户请立即卸载,否则会遭数据泄漏ACL2023论文写作能否使用ChatGPT?基于Pytorch的卷积算子的推导和实现亚马逊已在多种工作职能中使用ChatGPT,包括编写代码等英特尔发布第四代至强可扩展处理器:PyTorch 训练性能提升 10 倍,安装量超 1 亿颗!PyTorch安装包出问题,官方警告:这些Linux用户请立即卸载,否则会遭数据泄漏PyTorch 创始人:Transformer 太火很不好,AI 易撞墙PyTorch统治学术论文!TensorFlow只占4%,LeCun:还能为啥?这部韩剧好看 《非常律师禹英隅》ChatGPT发明「史莱姆语」,词汇语法规则全都有,还配了「史翻英」Python代码深入理解Pytorch中的分布式训练PyTorch下的可视化工具(网络结构/训练过程可视化)LeCun转推,PyTorch GPU内存分配有了火焰图可视化工具PyTorch 称霸,TensorFlow 正在“无声”消亡?PyTorch 2.0来了!100%向后兼容,一行代码将训练提速76%!SQLAlchemy 2.0.0发布首个RC,Python ORM框架月光黯淡(二十二)AI求解偏微分方程新基准登NeurIPS,发现JAX计算速度比PyTorch快6倍,LeCun转发:这领域确实很火Why do Tibetans think they are Chinese?基于PyTorch、易上手,细粒度图像识别深度学习工具库Hawkeye开源台积电新人入职8个月能领30.4个月奖金;马斯克计划在自己大脑接入脑机接口设备;PyTorch 2.0重磅发布 | AI一周资讯【E诗配画】登鹳雀楼ChatGPT竟写出毁灭人类计划书,还给出相应Python代码,网友:AI正在指数级发展PyTorch统治学术论文,TensorFlow只占4%,LeCun:还能为啥?《科学》禁止在学术论文中使用ChatGPT文本,《自然》:可以用,但要说明|环球科学要闻行业入门|量化分析,一个工作语言是Python和Chinese的行业【便民】什么是个人养老金?如何缴纳?怎么使用?8问8答请收好→PyTorch 2.0 来了!100% 向后兼容,一行代码将训练提速 76%PyTorch和TensorFlow迎来后浪!工业界到底需要怎样的机器学习框架?英伟达CUDA垄断地位难保:PyTorch不断拆塔,OpenAI已在偷家部署国产ChatGPT仅需6G显存!ChatYuan模型开放下载:业内首个功能型对话开源中文大模型Pytorch中混合精度训练的使用和debug韩国高尔夫美女多,美国诺贝尔经奖多
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。