paddlepaddle推理部署模型转onnx模型与onnx推理

1. ONNX (Open Neural Network Exchange)

  ONNX是一个开放的神经网络交换格式,它旨在提供一个统一的框架,使深度学习模型能够在不同的深度学习框架之间进行交换和共享。主要目标是解决深度学习框架之间的互操作性问题。在深度学习领域,有许多不同的框架,如 TensorFlow、PyTorch、Caffe、MXNet 等,每个框架都有自己独特的模型表示形式和运行时环境。这种多样性使得模型在不同框架之间转换和共享变得困难。ONNX 的出现就是为了解决这个问题。

  具体来说,ONNX 提供了一个中间表示(IR)格式,用于表示深度学习模型的结构和参数。这个中间表示是一个通用的、可移植的格式,可以跨越不同框架之间进行共享和交换。通过将模型转换为 ONNX 格式,可以实现从一个框架到另一个框架的无缝转换,从而允许用户在不同的框架中使用和执行相同的模型。

2. paddle2onnx安装

  paddle2onnx 是一个用于将 PaddlePaddle 模型转换为 ONNX 格式的工具。它允许用户将 PaddlePaddle 中训练好的模型转换为 ONNX 格式,以便在其他框架或平台中使用。
  使用清华镜像源安装:  pip install paddle2onnx -i https://pypi.tuna.tsinghua.edu.cn/simple

3. paddlepaddle推理部署模型转onnx
  一般利用paddlepaddle提供的程序转换为推理部署模型后,包括四个文件,其后缀分别为.yaml、pdiparams、.pdiparams.info、.pdmodel,可以直接部署,可以不用转onnx,这里不介绍如何将训练好的模型转推理部署模型。如下:

  在cmd命令中执行如下操作将推理部署的模型(deploy.yaml、pdiparams、pdmodel)转换为onnx.

  paddle2onnx --model_dir 推理模型所在目录路径  --model_filename  后缀为.pdmodel的文件 --params_filename 后缀为.pdiparams的文件 --opset_version 指定了要使用的 ONNX 运算集的版本 --save_file xxx.onnx

   假设你的推理部署的模型文件(deploy.yaml、model.pdiparams、model.pdiparams.info、model.pdmodel)在E:/model目录下,那么在cmd中命令可以如下:

paddle2onnx --model_dir E:/model --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 11 --save_file E:/model/model.onnx

  则在 E:/model目录下model.onnx就是我们需要的文件

4. 检查 ONNX 模型的有效性

  如果想要验证导出的 ONNX 模型是否合理,包括检查模型的版本、图的结构、节点及其输入和输出。如果下面代码输出为 None 则表示模型转换正确。

# 导入 ONNX 库
import onnx
# 载入 ONNX 模型
onnx_model = onnx.load("model.onnx")
# 使用 ONNX 库检查 ONNX 模型是否合理
check = onnx.checker.check_model(onnx_model)
# 打印检查结果
print('check: ', check)#如果输出为None,表明转换得到的onnx模型没有问题

5. 确定自己模型的输入名称

import onnxruntime
# 加载 ONNX 模型生成推理用 sess
sess = onnxruntime.InferenceSession("model.onnx")
input_name = sess.get_inputs()[0].name
print("input_name=",input_name)#我的是input_name= x

  或者

# 加载模型
model = onnx.load("model.onnx")
# 获取模型的输入和输出信息
input_names = [input.name for input in model.graph.input]
output_names = [output.name for output in model.graph.output]
print("Input names:", input_names)
print("Output names:", output_names)

  至此,我们得到了模型的输入名称,我的是x。

6. onnxruntime-gpu安装

  当使用 onnxruntime-gpu 时,系统会优先选择 GPU 作为硬件加速器,以提高推理性能。如果系统中存在可用的 GPU,onnxruntime-gpu 将默认选择 GPU 执行推理任务。

  安装: pip install onnxruntime-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple

7. onnx模型使用gpu推理通用代码

import onnxruntime
onnx_path=r'E:/model/model.onnx'
sess=onnxruntime.InferenceSession(onnx_path,providers=['CUDAExecutionProvider'])
#假设我们的数据为一个图片
image_path=r'E:/img.png'
data=data_handle(image_path)#data_handle为我们自己对数据的预处理,根据自己需要实现
input_name = sess.get_inputs()[0].name
result,=sess.run(None,{input_name :data})#result就是自己模型推理的结果,根据你模型返回的元组数据个数,假设只有一个返回值,就是result,

8. 使用gpu加速推理代码示例代码

import onnxruntime
onnx_path=r'E:/model/model.onnx'
sess=onnxruntime.InferenceSession(onnx_path,providers=['CUDAExecutionProvider'])#providers=['CUDAExecutionProvider'] 加上,否则使用cpu,至少我的是使用了cpu,如果cuda不可用,则退化到cpu推理。
#providers=['TensorrtExecutionProvider', 'CUDAExecutionProvider', 'CPUExecutionProvider']则会按顺序加速,如果Tensorrt,CUDA都无法推理,则使用CPU。
#数据处理
img_float = img.astype(np.float32)#数据处理,根据个人实际需要
img_float_batch=np.expand_dims(img_float,axis=0)#数据处理,根据个人实际需要
img_float_batch_nchw = np.transpose(img_float_batch, (0, 3, 1, 2))##数据处理,根据个人实际需要

result,=sess.run(None,{"x":img_float_batch_nchw})#result就是模型推理的结果

  注意:result,=sess.run(None,{"x":img_float_batch_nchw})中"x"表示模型的输入名称,这个需要根据自己的模型确定,img_float_batch_nchw为我们输入模型的data,我这里表示是一个float类型的NCHW顺序的数组类型,这个也是根据自己的模型确定的。

 

小结:本文对paddlepaddle的推理部署模型转onnx模型与onnx在gpu上推理进行了说明,未对推理模型的生成及其内容进行介绍,后面再补充。另外经过测试,发现onnx的推理速度比推理部署模型的速度快了一点(自己测试的)。

 

  若存在不足之处,欢迎评论与指正。

参考链接:

https://aistudio.baidu.com/projectdetail/1461212

https://blog.csdn.net/weixin_43917589/article/details/122580267 (paddle2onnx命令的详细参数可以参考这篇)

posted @ 2024-02-22 21:11  wancy  阅读(93)  评论(0编辑  收藏  举报