首页 > 其他分享 >paddlepaddle推理部署模型转onnx模型与onnx推理

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

时间:2024-02-22 21:23:34浏览次数:23  
标签:onnx 模型 ONNX input model 推理

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

相关文章

  • 水资源管理的“千里眼”:揭秘管道蓄水可视化模型的力量
    随着水资源日益紧缺,合理、高效的水资源管理变得至关重要。而在这个领域,管道蓄水3D模型,让我们能够更直观、更深入地了解水资源的流动和储存情况。 一、揭秘管道蓄水可视化模型管道蓄水3D模型运用先进的数字孪生和3D建模技术,将水管道系统中的水流、水位、水质等数据进行实时采集......
  • 多线程系列(六) -等待和通知模型详解
    一、简介在之前的线程系列文章中,我们介绍了synchronized和volatile关键字,使用它能解决线程同步的问题,但是它们无法解决线程之间协调和通信的问题。举个简单的例子,比如线程A负责将int型变量i值累加操作到10000,然后通知线程B负责把结果打印出来。这个怎么实现呢?其中一个......
  • 文本生成视频模型——sora
    目录简介训练过程将可视化数据转化为patch使用不同分辨率、持续时间及纵横比的视频数据的优势关键点参考openAi提供的技术文档:https://openai.com/research/video-generation-models-as-world-simulators简介Sora是一种通用的视觉数据模型,它可以生成跨越不同持续时间、纵横比......
  • Ollama —— 在本地启动并运行大语言模型
    Ollama(https://ollama.com/)是一款命令行工具,可在macOS、Linux、Windows上本地运行Llama2、CodeLlama、Gemma等其他模型。以我这里mac下使用为例,下载对应版本后,直接放入应用目录,然后命令行执行。Gemma有2B与7B两个版本,我这里是15款的MacBookPro,就用低的这个版......
  • 常见IO模型
    任何技术的发展都是经过不断的演变迭代的,同样IO模型的演变代表着人们在计算机世界对效率的追求,对不同场景的解决方案,从某种方面来说IO模型的演变也一定程度见证着互联网的发展,随着学习的不断深入,也需要对底层实现原理不断加强。接下来主要针对计算机网络、网络分层模型、网络协议......
  • LM Studio装载模型时提示:You have 1 uncategorized model files
    使用LMStudio载入已经下载的模型的时候报错: 当前本地模型路径是默认的models路径,模型文件在models下面。 解决办法:在models目录下新建目录:Publisher\Repository即: 将模型文件移动到Repository中,重启LMStudio即可。......
  • 跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级
    跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA)介绍:首先在Ziya-LLaMA-13B-V1基线模型的基础上加入中医教材、中医各类网站数据等语料库,训练出一个具有中医知识理解力的预训练语言模型(pre-trainedmodel),之后在此基础上通过......
  • colab运行google最新开源模型Gemma
    Google开源了新的大模型Gemma,Gemma是一系列轻量级、最先进的开放式模型,采用与创建Gemini模型相同的研究和技术而构建。Gemma由GoogleDeepMind和Google的其他团队开发,其灵感来自Gemini,其名称反映了拉丁语_gemma_,意思是“宝石”。除了模型权重之外,我们还发布了工具来支持开......
  • 基于 Fluid+JindoCache 加速大模型训练的实践
    作者:王涛(扬礼)、陈裘凯(求索)、徐之浩(东伝)背景时间步入了2024年,新的技术趋势,如大模型/AIGC/多模态等技术,已经开始与实际业务相结合,并开始生产落地。这些新的技术趋势不仅提高了算力的需求,也给底层基础设施带来了更大的挑战。在计算方面,以GPU和FPGA等异构硬件为例,他们......
  • LiRank: LinkedIn在2月新发布的大规模在线排名模型
    LiRank是LinkedIn在2月份刚刚发布的论文,它结合了最先进的建模架构和优化技术,包括残差DCN、密集门控模块和Transformers。它引入了新的校准方法,并使用基于深度学习的探索/利用策略来优化模型,并且通过压缩技术,如量化和词表压缩,实现了高效部署。LinkedIn将其应用于Feed、职位推荐和......