最近在学习一些关于模型部署的知识,本文主要流程分为用 PyTorch 训练一个简单的图像分类模型(如自定义 CNN),导出 ONNX,用ONNXRuntime(Pvthon)部署,实现“输入图片路径一输出分类结果"的脚本,对以量化前后的性能。

一.导成Onnx文件

最开始我们使用的是直接训练好的resnet18进行分类任务,可从torchversion库中导出。根据论文中resnet18的数据集大小为(3*224*224)。

通过这两段代码便可以实现转化为onnx文件,其中各个参数的解释:

再次之前需要导入import onnx这个库

#model-模型
#args-参数
#path—路径
#export_params-输入模型是否可训练,default为true

  • 当 export_params=True 时,ONNX 文件会包含模型的所有可学习参数(权重、偏置等),导出的模型是 “完整的”,部署时无需额外加载参数文件,直接可用。

  • 当 export_params=False 时,ONNX 文件仅包含模型的计算图结构(不含权重),需要在部署时手动传入参数(极少用,通常用于动态更新参数的场景)

#do_constant_folding=True 折叠模型中的常量节点(Constant Folding),简化计算图结构,提升模型推理效率。

#verbose-是否导入模型转化信息,默认为False。

  • 当 verbose=True 时,控制台会输出模型转换的详细日志,包括每个 PyTorch 算子如何映射到 ONNX 算子、是否有不支持的算子、常量折叠过程等,方便调试导出问题(如算子不兼容)。

  • 当 verbose=False 时,导出过程静默执行,仅在出错时提示错误信息。

#input_names-输入的节点名

#output_names-输出节点名称

#dynamic_axes-模型的输入输出是否可变

二.在onnx_runtime中进行推理

进行推理前需要导入onnxruntime的库,

providers = [('CUDAExecutionProvider', {'device_id': 0}), 'CPUExecutionProvider'] 这行代码是必备代码,优先使用GPU推理,没有GPU使用CPU推理,

ort_session = ort.InferenceSession("resnet18.onnx", providers=providers)是使用onnxruntime的核心使用InferenceSession函数将onnx文件导入。input_name/output_name:获取输入 / 输出节点的名称,本文设置为("input","output")。input_shape:获取模型期望的输入形状(1*3*224*224)。

三.数据预处理

加载好模型对模型进行简单的数据预处理。

四.模型测试

在网上找一张猫狗类的图片,作为测试。

加载图片,使用time.time记录推理时间与后续在Pytroch推理做对比。

四.搭建pytorch环境进行推理对比(主要对比准确性和时间)

此处代码并不多,输入的数据可以从preprocess_image中的image_tensor得到,不过要进行增加维度在放到模型中。

五.onnx_runtime与pytorch环境下模型对比

从结果中看两个推理的结果一致,但推理速度快了很多。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐