当前位置: 首页 > 编程日记 > 正文

ONNX 浅析:如何加速深度学习算法工程化?

AlphaGo击败围棋世界冠军李世石以来,关于人工智能和深度学习的研究呈现井喷之势。

各种新的算法和网络模型层出不穷,令人眼花缭乱。与之相随的,深度学习的训练和推理框架也在不断的推陈出新,比较著名的有:微软的CNTK、Google的TensorFlow、Facebook的PyTorch、Apple的CoreML、Intel 的OpenVINO、英伟达的cuDNN和TensorRT、腾讯的TNN和NCNN、阿里的MNN等等。

这些框架都有相似之处,他们的输入是一个或者一组多维数据,数据经过多层运算单元之后输出运算结果。训练框架支持BackPropogation等训练方法,可以自动调整模型参数,用于算法设计。推理框架则是单纯只能用于模型推理运算,不能调整模型本身,用于算法部署落地。

这些框架中,Google的TensorFlow的这个名字尤其具有美感。多维数据是为张量(Tensor),数据在多层运算单元中的运算和传递是为流(FLow),看到这个词就仿佛看到了一个数据和运算的图(Computation Graph),真可谓妙手偶得之佳作。这些框架都需要构建算子,并且将这些算子按照一定的次序连接起来,可以称之为网络模型。

01

Why ONNX?

每个深度学习框架都有自己独有的格式来解释和存储网络模型,并且这些框架的侧重点不同,有些用于训练学习,有些用于部署推理。在深度学习算法开发中,在不同的阶段会选择不同的框架,所以模型描述格式的不同,在客观上造成了深度学习算法开发和落地的困难。

笔者之前曾开发深度神经网络算法,当时选择的训练框架是Caffe,需要落地部署到Linux、iOS、Android等多个平台。Linux选择的是Nvidia的cuDNN;iOS选择的是CoreML;Android选择的是NNAPI,Caffe的模型描述格式是caffemodel。

它使用自定义的Protobuf (https://github.com/BVLC/caffe/tree/master/src/caffe/proto),但是显然,无论是cuDNN、CoreML、NNAPI都无法直接使用caffemodel,CoreML的模型描述使用另一种定义 (https://apple.github.io/coremltools/mlmodel/index.html),cuDNN和NNAPI都是low-level的推理引擎,需要使用者将这个模型组装起来。

对于CoreML来说,我们需要把caffemodel转为coremlmodel格式,对于 cuDNN和NNAPI,我们需要解析caffemodel,然后自己组装出完整的网络模型。这个过程繁琐而且容易出错,当时有强烈的冲动,希望定义一个统一的模型描述格式,所有的训练框架训练所得的网络模型,都是用这个格式来描述,在设备上部署推理时,相应的推理引擎支持解析这个统一的描述格式,直接完成部署落地,岂不美哉。

当然此事并不容易,要定义个统一的模型描述格式,不仅仅需要对机器学习技术有深入的理解,而且将之推广成为事实上的行业标准,更需要有很大的行业影响力,并不是如笔者这样的无名小卒可以为之。所幸已经有社区在做这个事情了,这就是Open Neural Network Exchange(ONNX)。

用ONNX自己的话来说,ONNX是一个对计算网络(Computation Graph)的一个通用描述(Intermediate Representation)。它希望被设计成为开放的网络描述格式,减少开发者在各个训练和推理框架间切换的代价,可以让开发者专注于算法和优化。虽然ONNX还处于比较早期的阶段,不过已经有约来越多的人开始关注到它,未来会有机会得到更广泛的应用。

02

计算模型描述

ONNX有两个分类:基础的ONNX主要用于描述神经网络、ONNX-ML是对基础ONNX的扩展,增加了神经网络之外的其他机器学习算法的支持。本文不会涉及ONNX-ML,接下来的文字以一个简单的ONNX模型为例,介绍一下 ONNX是如何来描述一个计算网络的。该模型可以在ONNX的Github上下载(https://github.com/onnx/models/blob/master/vision/classification/mobilenet/model/mobilenetv2-7.onnx).

ONNX的模型描述采用了Google的Protocol Buffer语言。最外层的结构是ModelProto,它的定义如下:

message ModelProto {  int64 ir_version = 1;  repeated OperatorSetIdProto opset_import = 8;  string producer_name = 2;  string producer_version = 3;  string domain = 4;  int64 model_version = 5;  string doc_string = 6;  GraphProto graph = 7;  repeated StringStringEntryProto metadata_props = 14;  repeated TrainingInfoProto training_info = 20;  repeated FunctionProto functions = 25;}

比较重要的字段有:

lr_version : 当前的ONNX模型文件的版本,目前发布的最新版本为IR_VERSION_2019_3_18 = 6. 发布于2019年,版本7还在制定中。

opset_import: 当前的模型文件所依赖的算子domain和版本。

graph: 这个模型执行的运算图,这个是最重要的字段。

GraphProto的定义如下:

message GraphProto {  repeated NodeProto node = 1;  string name = 2;   // namespace Graph  repeated TensorProto initializer = 5;  repeated SparseTensorProto sparse_initializer = 15;  string doc_string = 10;  repeated ValueInfoProto input = 11;  repeated ValueInfoProto output = 12;  repeated ValueInfoProto value_info = 13;  repeated TensorAnnotation quantization_annotation = 14;}

比较重要的字段有:

initializer : 模型的每一网络层的参数, 模型训练完成之后参数就被固定下来。

input : 模型的输入格式。

output : 模型的输出格式。

nodes : 定义了模型的所有运算模块, 依照推理的次序排布。

NodeProto的定义如下:

message NodeProto {  repeated string input = 1;    // namespace Value  repeated string output = 2;   // namespace Value  string name = 3;     // namespace Node  string op_type = 4;  // namespace Operator  string domain = 7;   // namespace Domain  repeated AttributeProto attribute = 5;  string doc_string = 6;}

比较重要的字段有:

input : 输入参数的名字。

output : 输出参数的名字,这里需要留意的是,每一个网络层之间的连接使用输入和输出的名字来确立的。

op_type : 算子的类型。

attributes : 算子的属性, 其解析取决于算子的类型。

ONNX中最复杂的部分就是关于各种算子的描述,这也可以理解,构成神经网络的主体就是这些算子。attributes 就是算子的一组带名字的属性。

本文中,我们介绍一个在mobilenetv2-7.onnx使用最多的算子: conv。

卷积神经网络在语音,图像,视频等处理上获得了巨大成功. ONNX关于卷积网络层的属性定义主要有:

dilations: 扩展卷积,默认为1,即普通卷积。其数学定义如下:

group: 分组卷积, 其定义见文献14. 默认为1, 即不分组。

kernel_shape: 定义了卷积核的大小。

pads: 定义了上下左右填充的像素数。

strides: 定义了卷积运算的步长。

03

ONNX的支持情况

各家的训练和推理框架还在继续发展,ONNX想成为行业标准显然还为时尚早,但是目前尚没有看到其他更好的通用模型描述格式,我们简单归纳一下现在的ONNX的支持情况(不完整):

参考文献

[1] ONNX: https://github.com/onnx/onnx

[2] TENSORFLOW: https://www.tensorflow.org/

[3] CNTK: https://github.com/Microsoft/CNTK

[4] PYTORCH: https://pytorch.org/

[5] TNN: https://github.com/Tencent/TNN

[6] MNN: https://github.com/alibaba/MNN

[7] CUDNN: https://developer.nvidia.com/zh-cn/cudnn

[8] TENSORRT: https://developer.nvidia.com/zh-cn/tensorrt

[9] COREML: https://developer.apple.com/documentation/coreml

[10] NCNN: https://github.com/Tencent/ncnn

[11] NNAPI: https://developer.android.com/ndk/guides/neuralnetworks

[12] Protocol Buffers: https://developers.google.com/protocol-buffers

[13] Dilated Convolutions https://arxiv.org/abs/1511.07122

[14] Dynamic Group Convolutions https://arxiv.org/abs/2007.04242

资讯

GitHub的AI编程代码漏洞40%

简历

你和大厂的距离有多长?

资讯

英伟达用 AI 给自家纪录片配音

转载

人脸识别模型的动手实践!

分享

点收藏

点点赞

点在看

相关文章:

如何在OS X中打印到PDF文件

如何在OS X中打印文件到PDF文件?其实不需要安装任何其他软件,OS X本身支持打印到PDF文件这个功能。具体操作详见下面文章:Want to save a document or web page as a PDF file, but you don’t own Adobe Acrobat? No problem, you can prin…

Joomla和Drupal简介

Joomla!是一套在国外相当知名的内容管理系统。Joomla!是使用PHP语言加上MySQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行。目前是由Open Source Matters(见扩展阅读)这个开放源码组织进行开发与支持&#…

AD RMS高可用(三)部署RMS根群集服务器

1) 在rms服务器上点击“添加角色和功能”,开始rms组件的添加 2) 选择“基于角色或基于功能安装”,点击”下一步“。 3) 选择第一台rms服务,点击”下一步“。 4) 勾选”ADRMS”角色,同时会添加iis服务。点击”下一步“。 5) 保持默…

AI 复活「她」! GPT-3 帮美国小哥复刻逝去未婚妻,但又夺走她……

整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 今年 7 月,一名33岁的美国小哥 Joshua Barbeau 在未婚妻去世后,根据她在 Facebook 和 twitter 上的文本在另一名开发人员的帮助下成功在 GPT-3 上微调,能够复刻出未…

centOS怎样强制卸载PHP以及自定义安装PHP

这个是原创的,当然也是在前人的基础上,自己留个拷贝,其他人也不用再摸索了。 转载请保留版权信息谢谢:http://blog.csdn.net/21aspnet/ 很无语,centOS居然php版本才5.1.6,很多开源的CMS无法安装。 查看ph…

深入掌握JMS(一):JMS基础

2019独角兽企业重金招聘Python工程师标准>>> 1. JMS基本概念 JMS(Java Message Service) 即Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业 应用的开发。它支持两种消息通信模型:点到点(point-to-point)&a…

浏览器前进后退对下拉框数据的丢失(省市联动实现和例子)

浏览器前进后退对下拉框数据的丢失的问题,典型的为省市下拉框联动时城市数据的丢失。省市联动一般的实现为城市在省份的选择后js加载。 那么每次城市的改变只需要重新加载新的城市数据并更新下拉框即可: 下拉函数 function ReloadCities() { var $ddlCit…

Linux(centOS)手动安装Apache+MySQL+PHP+Memcached+Nginx原创无错版

最后更新时间:2012.3.21 第一步:Apache安装(已更新到2.2.22) 下载 去 http://www.apache.org 自己找新的 http://httpd.apache.org/ 国内有很多镜像点例如"人人"和"163" http://labs.renren.com/ 注意要找httpd,因为a…

首届“陇剑杯”网络安全大赛线上赛圆满结束

9月14日,集结了各行业领域3020支战队、11135名网络安全精英的首届“陇剑杯”网络安全大赛线上赛圆满结束,成功拉开将于9月25日在甘肃兰州新区举行的总决赛战幕。届时,涵盖网络配置、数据分析和漏洞修复等真实数字化业务场景的网络防御赛道和R…

与流氓软件的一次艰苦“奋战”

不知道大家有么有过这样的经历,英语不好,但有些时候找东西,还只有英文网站上有,但英文网站上下载东西,有时候不小心就会下错,稍有不慎,电脑就中标了;这不我昨天就遇到了,…

mysql5.6基于GTID主从复制设置

1.主库和从库都必须要开启binlog2.主库和从库server-id不相同3.建立主从辅助用户grant replication slave on . to rep192.168.200.% identified by oldboy;[mysqld]server-id1log-binmysql.binbinlog_formatrowgtid_modeONenforce_gtid_consistencylog_slave_updatesrelay_log…

Python 解一道江苏 小升初 数学题,如此变态,看不起来谁?

作者:小小明【江湖人称"明佬"】链接:blog.csdn.net/as604049322/article/details/118388505注明:本文经过作者小小明授权发布,可戳原文链接关注原文作者!本文简介大家好,我是黄同学????前段时…

利用负载均衡优化和加速HTTP应用

1.负载均衡技术简介 现代企业信息化应用越来越多的采用B/S应用架构来承载企业的关键业务,因此,确保这些任务的可靠运行就变得日益重要。随着越来越多的企业实施数据集中,应用的扩展性、安全性和可靠性也越来越受到企业的重视。 负载均衡技术通…

查看sqlserver被锁的表以及如何解锁

查看sqlserver被锁的表以及如何解锁查看被锁表:www.2cto.com select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_typeOBJECTspid 锁表进程 tableName 被锁表名解锁&#x…

Centos 6.4下MySQL备份及还原详情介绍

我们前面文中中介绍了centos 6.4下MySQL的安装及配置,安装后为了保证数据的安全性所以我们同样也要学会备份及还原,备份及还原操作在我们的真实工作环境中是必不可少的,由于是对数据库数据备份,所以今天我们就随之介绍一下&#x…

iPhone 13 终于等到了!降价、新颜色、电池续航性能大提升

整理 | 禾木木、苏宓 出品 | AI科技大本营(ID:rgznai100) 它来了,真的来了! 不知有多少朋友守在今日凌晨观看一年一度的科技春晚——苹果发布会! 还是那个熟悉的样子,从加利福尼亚的沙漠中向我们走来&am…

“httpd未被被识别的服务”的解决办法

使用自动编译安装会出现这个问题,也就是输入 #service httpd restart 给出这样的提示;这时候要重启可以 #/usr/local/apache2/bin/apachectl start 如果你希望使用 #service httpd restart 那么需要按下面的做法 注意的是daemon /usr/local/apache…

安装sql 2005 闪退 连接到服务器失败。错误:0x80070424

可以尝试安装.net4.0 我是通过此办法解决。 本文转自 freeterman 51CTO博客,原文链接:http://blog.51cto.com/myunix/1751338,如需转载请自行联系原作者

简述DataInputStream和DataOuputStream

2019独角兽企业重金招聘Python工程师标准>>> Java开发中经常会用到IO流,那么就会碰到DataInputStream和DataOuputStream这两个包装类。下面就来简述一下这两种包装类的用法: 1.DataOutputStream:标准的数据输出流,将ja…

数字时代企业迎变局,如何让增长变简单?

随着企业数字化转型进入深水区,企业增长模式正迎来跨时代巨变:营销场景复杂且多变,用户触点丰富而分散, MarTech(营销技术)解决方案愈加碎片化,企业营销增长过程中各环节间的割裂,让…

Linux服务器网络开发模型

为什么Nginx的性能要比Apache高得多? 这主要是因为Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(FreeBSD)网络I/O模型,而Apache则使用的是传统的select模型。曾在一篇博客上看到有这么个实例:假设你在大…

《从零开始学Swift》学习笔记(Day 47)——final关键字

在类的定义中使用final关键字声明类、属性、方法和下标。final声明的类不能被继承,final声明的属性、方法和下标不能被重写。 下面看一个示例: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051final cl…

CentOS 5.5 编译安装apache+php+mysql,利用CMS快速建立论坛

这个是转来的,细节没有验证,请网友自己斟酌。。。。。。。。。。CentOS 5.5 编译安装apachephpmysql,利用CMS快速建立论坛1、安装Apache [rootbogon tmp]# wget http://labs.renren.com/apache-mirror/httpd/httpd-2.2.15.tar.bz2 [rootbogo…

SDT(software-defined Things)?软件定义的物件

物联网(IOT)的概念早在1999年就被宝洁公司的员工Kevin Ashton正式提出,可直到这最近几年才越来越火,无论国内外,但凡跟IOT 搭上点边的都能吸引众多的目光。2014年,投到智能硬件方向的风险资金就占到VC的一半…

赠书福利 | Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣

编译 | 禾木木出品 | AI科技大本营(ID:rgznai100)文章内图源:Tidio近日,波士顿动力发布了一段机器人跳舞的视频,有些人不敢相信他们所看到的,它看起来更像是皮克斯动画而不是真实的镜头。有人说&#xff1a…

Airlaunch 快捷设置代码分享

Airlaunch 快捷设置代码分享设置:prefs:rootSETTING蜂窝网络:prefs:rootMOBILE_DATA_SETTINGS_IDWIFI:prefs:rootWIFI定位服务:prefs:rootLOCATION_SERVICES蓝牙:prefs:rootBluetooth辅助功能:prefs:rootGe…

hdu3829(最大独立集)

传送门:Cat VS Dog 题意:动物园有N只猫,M只狗,P个小孩。每个小孩都有自己喜欢的动物和讨厌的动物,如果他喜欢狗,那么就讨厌猫, 如果他讨厌狗,那么他就喜欢猫。某个小孩能开心&#x…

数据科学家:那些年,我都学过哪些编程语言…

前言 我们对事物的看法各不相同,有时他人特别喜欢的语言可能会成为另一个人的的噩梦。而我个人的噩梦是用C语言进行日常的编程工作。 本文就介绍了作为一名数据科学家,我在职业生涯中所学过的语言,其中包括MATLAB、Weka、R、C 以及Python。 数…

short_open_tag 必须打开

在使用phpcms本地安装的过程中,到运行环境检测这一步,发现:short_open_tag 必须打开。 从网上搜索相关资料时,发现,将php.ini文件中的short_open_tag off 项,设置成on,重启服务器即可。 shor…

10.15 iptables filter表案例

2019独角兽企业重金招聘Python工程师标准>>> iptables常用知识回顾点 iptables -I/-A/-D 后紧跟 链 ,可以是INPUT,OUTPUT,FORWARDiptables -P 用来指定 链的默认策略 ——>最好不要直接操作,否则会造成远程的终端断…