ONNX模型格式简介
ONNX(Open Neural Network Exchange,开放式神经网络交换格式)是一种模型文件格式,它在模型训练和模型推理中间提供了中间桥梁,使得上游不同的训练框架都能导出ONNX格式的模型,给到下游不同的推理框架都可以读取ONNX进行部署。
onnx模型中间件示意图
这种基于ONNX的模型训练,中间件,再到模型推理的方式使得
- 1.ONNX将模型训练和推理解耦,任意上游训练框架和下游推理框架都可以组合搭配,而不需要用同一种框架既进行训练又进行推理
- 2.ONNX是通用的模型格式,不同训练框架输出的模型可以用ONNX作为桥梁进行转换,使得模型更方便迁移
- 3.ONNX部署兼容性极强,支持多种推理框架,支持CPU/GPU推理,支持跨语言推理
- 4.ONNX格式配合上类似ONNXRumtime等推理框架,相比于模型在原生环境的推理性能会有大幅的提升
PyTorch pth模型导出ONNX
PyTorch自带接口支持直接导出ONNX,以一个PyTorch训练得到的Bert微调模型为例,导出ONNX的示例代码如下
torch.onnx.export将模型由nn.Module对象转化为ONNX模型并写入路径,torch.onnx.export的设置参数如下
- model:torch.nn.Module,torch.jit.ScriptModule对象模型
- dummy input:构造一批输入数据,如果forward有多个输入则输入一个tuple,输入数据的个数和顺序和forward一致,数据的值可以随机构造
- onnx_path:转化完的ONNX文件存储路径
- opset_version:导出onnx时参考的onnx算子集版本
- input_names:输入的字段名称,和模型forward和dummy input的顺序和数量一致,名称可以用户自定义
- output_names:输出的字段名称,名称数量必须小于等于forward输出的数量,如果和forward输出数量不相等,按照forward输出的顺序截取输出,字段名称用户可以自定义,但是在模型推理的时候要和定义时的名字一致
- dynamic_axes:指定动态维度,默认在推理阶段,输入的维度必须和构造的dummy input一致,通过指定第0维度batch_size为动态维度使得模型支持任意批次大小的推理
在导出完成后借助onnx包onnx.checker.check_model对模型格式进行检查是否合法。
TensorFlow pb模型导出ONNX
TensorFlow导出ONNX需要额外的依赖包tf2onnx,tf2onnx可以通过命令方便地将pb文件转化为ONNX
以一个TensorFlow构建的GAT模型为例,将pb转化为ONNX
该命令需要传入模型的输入和输出节点名称,节点名称和TensorFLOW pb的节点名称保持一致,如果有多个输入使用逗号隔开,转化成功的日志如下。
通过ONNX查看模型的权重
ONNX是基于protobuf组织而成的模型结构,由下面几部分组成
模型的权重存储在TensorProto类型的initializer下,通过onnx.numpy_helper.to_array可以在ONNX中拿到和PyTorch网络一样的模型权重。
以一个简单的全连接PyTorch模型转为ONNX为例,观察两者的权重参数是否一致
通过named_parameters打印出线性层的权重和偏置
然后将模型转为ONNX格式
重新导入ONNX模型,使用onnx.numpy_helper.to_array在initializer中拿到权重
比对之后两者的权重和偏置完全一致,本质上ONNX将各种上游的模型结构转化为protobuf格式,其中记录了模型中的节点名称,权重,图结构等信息,这些通用信息给到下游推理引擎进行推理。
使用Netron对ONNX模型结构可视化
Netron是神经网络可视化工具,Netron可以辅助用于观察ONNX的模型图结构,还是以上一节的简单线性模型为例,通过代码调用Netron可视化如下
netron对onnx可视化
在图上可以清楚的检查模型的结构是否正确,每个节点的输入的shape信息,以及右侧每个节点的输入输出的名称。
使用onnxsim对ONNX文件裁剪优化
转换得到的ONNX可能存在冗余结构,在ONNX生态中可以使用onnx-simplifier工具对ONNX模型文件进行精简,它会扫描模型图结构,试图用恒定输出替换冗余运算符。
用PyTorch编写一个简单模型,里面人为的加入两个冗余结构
在这个网络中一个相同的线性层和输入x被for循环重复计算,在输出中两个reshape操作将数据形状改变又恢复回来,通过Netron可视化如下
优化前模型结构
优化后模型结构
onnxsim自动删除了另外三次重复运算,使用同一个结果进行Concat,删除两次无意义的Reshape,优化后模型从34k变小为33k,onnxsim确实对冗余结构进行了精简和替换。
感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。
因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【】
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
四、AI大模型商业化落地方案
我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【】
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hd-yjs/33553.html