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命令的详细参数可以参考这篇)
标签:onnx,模型,ONNX,input,model,推理 From: https://www.cnblogs.com/wancy/p/18028138