前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >onnx实现对pytorch模型推理加速

onnx实现对pytorch模型推理加速

作者头像
机器学习AI算法工程
发布2021-01-27 15:32:12
3.7K0
发布2021-01-27 15:32:12
举报

微软宣布将多平台通用ONNX机器学习引擎开源,此举将让机器学习框架,向着机器学习框架的标准化和性能优化方向迈进了一大步。

ONNX Runtime是适用于Linux,Windows和Mac上ONNX格式的机器学习模型的高性能推理引擎。

开发人员可以为自己机器学习任务选择合适的框架,框架作者可以集中精力推出创新,提高框架的性能。对于硬件供应商来说,也可以简化神经网络计算的复杂度,实现优化算法。

onnxruntime模型部署流程

1.安装

代码语言:javascript
复制
pip install onnx
pip install onnxruntime

( pip install onnxruntime-gpu  #GPU环境)

2. Pytorch 模型转onnx

当提到保存和加载模型时,有三个核心功能需要熟悉:

代码语言:javascript
复制
1.torch.save:将序列化的对象保存到disk。这个函数使用Python的pickle
实用程序进行序列化。使用这个函数可以保存各种对象的模型、张量和字典。
2.torch.load:使用pickle unpickle工具将pickle的对象文件反序列化为
内存。
3.torch.nn.Module.load_state_dict:使用反序列化状态字典加载
model's参数字典

保存加载模型2种方式,在保存模型进行推理时,只需要保存训练过的模型的学习参数即可,一个常见的PyTorch约定是使用.pt或.pth文件扩展名保存模型。

代码语言:javascript
复制
# 第一种:保存和加载整个模型
Save:
torch.save(model_object, 'model.pth')


Load:
model = torch.load('model.pth')
model.eval()
代码语言:javascript
复制
#第二种:仅保存和加载模型参数(推荐使用)
Save:
torch.save(model.state_dict(), 'params.pth')

Load:
model = TheModelClass(*args, **kwargs)
model.load_state_dict(torch.load('params.pth'))
model.eval()
#记住,必须调用model.eval(),
以便在运行推断之前将dropout和batch规范化层设置为评估模式。如果不这样做,
将会产生不一致的推断结果
#在保存用于推理或恢复训练的通用检查点时,必须保存模型的state_dict

Pytorch模型转onnx

举例模型是调用resnet50训练的4分类模型,训练过程调用gpu,则转换过程如下:

1 如果保存的是整个模型

代码语言:javascript
复制
import torch
device = torch.device("cuda" if torch.cuda.is_available()
                      else "cpu")

model = torch.load("test.pth") # pytorch模型加载
batch_size = 1  #批处理大小
input_shape = (3, 244, 384)   #输入数据,改成自己的输入shape
model.eval()

x = torch.randn(batch_size, *input_shape)   
x = x.to(device)
export_onnx_file = "test.onnx"		#输出的ONNX文件名


torch.onnx.export(model
                    x,
                    export_onnx_file,
                    opset_version=11,
                    do_constant_folding=True,	
                    input_names=["input"],	
                    output_names=["output"],	
                    dynamic_axes={
"input":{0: 'batch',2:'batch',3:'batch'},
                                   
 "output":{0: 'batch',2:'batch',3:'batch'})

2 如果保存的是模型参数,则需要先创建模型,再加载模型参数

代码语言:javascript
复制
import torch
from models import resnet50


model = resnet50() #创建模型
weight = torch.load("test.pth")
model.load_state_dict(weight )
代码语言:javascript
复制

batch_size = 1  
input_shape = (3, 244, 384)   #输入数据,改成自己的输入shape

model.eval()

x = torch.randn(batch_size, *input_shape)
export_onnx_file = "test.onnx"	# 输出的ONNX文件名
torch.onnx.export(model,
                    x,
                    export_onnx_file,
                    opset_version=10,
                    do_constant_folding=True,	
                    input_names=["input"],	
                    output_names=["output"],	
                    dynamic_axes={
代码语言:javascript
复制

"input":{0: 'batch',2:'batch',3:'batch'},
                                   
 "output":{0: 'batch',2:'batch',3:'batch'})

3. 使用onnx推理预测

参考链接

https://zhuanlan.zhihu.com/p/159379768

https://blog.csdn.net/jacke121/article/details/104510401

https://blog.csdn.net/LimitOut/article/details/107117759


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习AI算法工程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • onnxruntime模型部署流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档