ONNX一个沟通各大AI框架的桥梁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ONNX一个沟通各大AI框架的桥梁相关的知识,希望对你有一定的参考价值。
参考技术A ONNX全称Open Neural Network Exchange,是微软设计的一个开放式深度学习神经网络模型的格式。旨在通过一个统一的模型格式标准,建立一个强大的人工智能生态。深度神经网络的实现是通过数据流图实现的,数据(张量等)从输入,流过一个个集选节点,最终在输出结点得到推理结果。不同的框架实现数据流图的的方式不尽相同,有的使用静态图,有的在运行的过程中动态创建。但是不管哪种方式,最终都会得到一个神经网络模型的结构图以及权重。通常,神经网络模型的结构、权重等信息不会一直在内存里,通常需要将它们保存到文件中,用于部署、转换等。而每一种框架都有他们自己的一套专有的模型表示方法,拥有自己的一套标准去操作、运行他们自己的模型。由于AI 研究正在迅猛发展当中,每种框架都有自己的侧重点,比如有的框架特别适合于做研究,能够快速的搭建验证模型;而有的框架则最特定硬件做了大量性能优化,特别适合生产部署。
这时候,一个通用的模型格式标准应运而生,它就是ONNX。有了这样一个统一的模型格式标准,你就可以使用能够快速的框架去验证你的模型,然后将模型导出到ONNX格式,再用有特殊优化的推理引擎进行推理或者转换到可以在移动端进行推理的特殊格式。
ONNX还有另一个变种,ONNX-ML,它额外增加了一些传统的标准机器学习操作。
ONNX是一个开放的标准,这个标准主要有以下三部分组成:
版本号有两种表示方法:简单数字表示和语义表示,用8个字节存储版本信息。
简单数字表示全部字节用于表示一个数,表现形式为XXX,如 0x0000000000000001 表示数字1;语义表示则将这八个字节分开,最高位两个字节表示主版本号,次高位两个字节表示此版本好,剩下四个字节表示补丁、编译等版本号,最终的表现形式为MAJOR.MINOR.PATCH,例如 0x0001000200000003 表示主版本号为1,此版本号为2,补丁版本号等为3。两种表示方法的区分方法是查看最高四个字节内容,如果最高四个字节为0,则使用的是简单数字表示;如果最高四个字节不为零,则使用的是语义表示。例如 0x0000000000000001 最高四个字节为0,所以表示这个版本号是用简单数字表示;而 0x000000010000000 最高四个字节不为0,则表示这是语义版本号。
值得注意的是,ONNX标准中规定,IR和OP的版本号必须用简单数字来表示,版本数值单调递增,而对于模型版本,并未作出规定,可以随意二选一。
处于模型结构顶层的是一个被称为Model的结构,它的主要目的是将一个包含模型所有执行元素的图和它的元数据关联起来。元数据可以在模型被读取的时候告诉读取方一些重要信息,比如版本、执行该模型所需要的操作集(Operators Set)等信息,读取方根据这些信息决定下一步是继续执行该模型还是选择报错等操作。另外,有些工具,例如模型查看工具等可以根据元数据告诉人们模型的信息和模型的作用等。Model的组成结构如下:
每个Model都必须指定它所属机构的域名,使用类似Java包结构的反向域名表示。此外,Model的 metadata_props 字段可以用于定义其他额外的元数据信息,例如下表定义了一些额外的元数据属性:
每个模型必须明确的指出它所以来的操作集,操作集定义了可用的操作以及他们的版本。模型通过他们的域定义了需要导入的操作集,如果没有特别指定,模型将默认导入默认的ONNX操作集。
操作集的属性如下:
图(Graph)中的任何一个操作(Operator)都必须是在模型导入了的操作集中有明确声明了的。
操作的属性如下:
图用于表示一个计算过程,它由元数据字段、模型参数以及计算结点三部分组成。计算结点按照一定拓扑结构组成了一个有向无环图,每个结点表示一个操作。每个结点可以有0到多个输入以及至少一个输出。
图的属性如下:
计算节点由结点名字、这个结点的操作的名字、输入的名字、输出的名字以及一系列属性组成。结点的输入输出和操作的输入输出通过位置相关联,例如第一个输入是上一个结点的输出,第二个输入是权重,第三个输入是偏置等,结点属性名字和操作属性通过名字相关联。
结点属性如下:
ONNX有两个变种:ONNX和ONNX-ML。ONNX只识别张量,ONNX-ML除了张量还能识别序列以及字典。
总的来说,ONNX就是定义了一套标准,这套标准使得不同机器学习框架的数据流图有了一个统一的表示。
它定义了如何将一个内存的模型序列化到磁盘,也定义了如何去读取这个序列化的模型进入内存。
[1] Open Neural Network Exchange - ONNX
微软Facebook联手发布AI生态系统,CNTK+Caffe2+PyTorch挑战TensorFlow
上万AI技术专家+数千AI创业企业高管+数千AI产业投资者。核心用户来自:北大、清华、中科院、麻省理工、斯坦福、哈佛、剑桥...谷歌、腾讯、百度、脸谱、微软、阿里…
夜间重磅,微软Facebook联手发布AI生态系统,推出 Open Neural Network Exchange(ONNX,开放神经网络交换)格式,这是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。ONNX是迈向开放生态系统的第一步,AI开发人员可以轻松地在最先进的工具之间转换,并选择最适合他们的组合。但是,现在系统支持的框架只有Caffe2,PyTorch 和Cognitive Toolkit ,谷歌的TensorFlow并没有被包含在内。在TensorFlow的市场份额迅猛增长的当下,两家企业的联手,似乎有特别的意味。
Facebook 和微软刚刚宣布,推出 Open Neural Network Exchange(ONNX,开放神经网络交换)格式,这是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。ONNX是迈向开放生态系统的第一步,AI开发人员可以轻松地在最先进的工具之间转换,并选择最适合他们的组合。
以下是Facebook、微软官方博客的介绍:
在开发学习模型时,工程师和研究人员有许多AI框架可以选择。在项目开始时,开发人员必须选择对应一个框架的特征(features)。很多时候,在研发过程中进行实验时选择的 feature 与生产所需的 feature 是不一致的。许多组织都没有很好的方法来消除这些操作模式之间的差距,只有采取一系列创造性的解决办法来应对,例如要求研究人员在生产系统中工作或人工翻译模型。
Facebook 与微软一起开发了 ONNX,以弥合这一差距,让AI开发人员可以选择符合项目当前阶段的框架,并随着项目的发展轻松切换框架。Caffe2,PyTorch 和Cognitive Toolkit 将在9月份发布对 ONNX 的支持,这将允许在其中一个框架训练的模型导出到另一个框架来进行推理。我们邀请社区加入这一努力,并在其生态系统中支持ONNX。实现不同框架之间的相互操作性,简化从研究到生产的过程,将有助于提高AI社区创新的速度。
ONNX 是 Facebook 深度学习方法的重要组成部分。在Facebook的AI团队(FAIR和AML)中,我们不断尝试推动AI的前沿研究,开发更好的学习算法。当我们得到一个突破时,我们希望尽快在应用中提供更好的技术。通过ONNX,我们专注于将AI研究和产品实现更紧密地结合在一起,从而更快地进行创新和部署。
尝试新模型的人们,特别是研究人员,希望在编写神经网络时拥有最大的灵活性和表现力——从动态神经网络到支持梯度渐变(gradients of gradients),同时保持基本的ConvNet性能。研究人员也想实现快速迭代,这意味着他们需要优秀的交互式开发和调试工具。PyTorch旨在突破研究框架的局限,使研究人员免受平台的限制,让他们能够比以前更容易地表达想法。
相反,产品流程每天都需要对大量新的数据进行训练和推理,同时保持模型大部分不变。仔细优化产品的特定模型的代码,例如通过量化和仔细编写人工调整的代码(hand-tuned code)之类的技巧节省资源。Caffe2已经在产品、移动和极端考虑性能的情况构建起来。Caffe2的内部灵活而且高度优化,所以我们可以利用技巧将更大更好的模型部署到性能不足的硬件中。
通过 ONNX,我们可以在这两个方面获得最优。我们现在可以从PyTorch导出许多常见神经网络的模型,并将它们部署在Caffe2上。这是将最新的研究成果快速推向生产的第一步。在接下来的几个月中,我们将加强ONNX,并对Caffe2和PyTorch进行改进,使其能够更深入地互通。
为了实现ONNX支持,我们必须对PyTorch和Caffe2进行更改,并且在框架之间统一运算符。在Caffe2中,这个过程类似于添加一个翻译器,因为Caffe2已经有一个内置的静态图。在PyTorch中,神经网络是被定义为程序而不是显式图,因此这带来了更大的挑战。为了从程序中提取图,我们开发了一个跟踪器,将运行时程序执行的操作记录下来。跟踪程序消除了复杂性,并使其更容易转换为图表示。
要了解它是如何工作的,看以下代码:
x = y * 2
if someComplicatedFunction():
z = x + y
else:
z = x * y
要直接导出此代码,ONNX将不得不支持conditionals和某些复杂函数 someComplicatedFunction();实际上成了通用编程语言。然而,在许多深度学习模型中,someComplicatedFunction() 的结果在推理过程中总是相同的。例如,在PyTorch条件中,通常是对输入张量的大小或尺寸进行的一些计算。在这些情况下,通过代码的单一跟踪将会更简单,并且可以轻松地在ONNX中表示为:
#someComplicatedFunction() == True
x = y * 2 z = x + y
目前,我们的tracer能与许多常见的神经网络配合使用,但PyTorch中一些更先进的程序,比如有动态流控制(dynamic flow control)的程序还不行。随着时间的推移,我们将完善ONNX和tracer来支持这些程序,让开发人员可以充分利用PyTorch的灵活性与Caffe2的高性能强大部署功能。
微软:ONNX 表征具有框架互操作性和共享优化两大优点
在 Facebook 发布博客的同时,微软也发布了题为《微软和 Facebook 为 AI 模型的互操作性构建开放生态系统》的博客。在博客中,微软表示:
微软给大家做出的承诺是“”人人有机会更方便,更有价值。我们提供各种平台和工具来促进这一点,包括我们的认知工具包,一个构建深层神经网络的开源框架。我们还与其他分享我们观点的组织合作,帮助 AI 社区。
今天,我们高兴地宣布,微软和Facebook 一起推出Open Neural Network Exchange (ONNX,开放神经网络交换) 格式。 ONNX为AI 框架生态系统中的互操作性和创新提供了共享的模型表征。CognitiveToolkit,Caffe2和PyTorch都将支持ONNX。微软和Facebook 共同开发了ONNX 这一开源项目,并希望社区能够帮助其不断进化。
什么是ONNX 表征?
Cognitive Toolkit 和其他框架提供了使开发人员更容易构建和运行表征神经网络的计算图的界面。虽然提供的功能类似,但是今天的每个框架都有自己表征这些图的格式。 ONNX表征有以下主要优点:
框架互操作性
开发人员可以更轻松地在框架间转换,并为手头的任务选择最佳工具。每个框架都针对具体特性进行了优化,如快速训练,支持灵活的网络架构,在移动端进行推理等等。许多时候,研发过程中最重要的特性与生产环节最重要的特性是不同的。这导致开发人员在框架之间进行模型转换时,会因框架使用不正确或明显延迟而使得效率降低。使用ONNX 表征的框架简化了这一点,使得开发人员更加灵活。
共享优化
硬件供应商和其他改进神经网络性能的优化可以通过定位ONNX 表征来同时影响多个框架。优化经常需要被分别整合进入每个框架,这一过程很费时间。ONNX 表征使得优化更容易实现,从而覆盖更多开发人员。
技术总结
ONNX 提供了可扩展计算图模型的定义,以及内置 operators 和标准数据类型的定义。起初我们专注于推理(评价)所需的能力。
每个计算数据流图被构造为形成非循环图的节点列表。节点具有一个或多个输入和一个或多个输出。每个节点是对 operators 的调用。
可用性
ONNX 代码和文档的初始版本现在已经在GitHub(https://github.com/onnx/onnx)上开源,呼唤着社区的立即参与。我们将积极开展基于ONNX 的工作,即将推出的Cognitive Toolkit 也将对其支持。我们还计划和Facebook一道,提供部署参考、示例、工具和model zoo。
ONNX 表征形成了开放生态系统的基础,使 AI 更容易获取并富有价值。开发人员可以为其任务选择合适的框架,框架作者可以专注于创新,硬件供应商可以简化优化流程。我们希望社区能够支持ONNX,以实现这一令人兴奋的愿景。
我们今天发布最新版本的Caffe2和PyTorch,带有ONNX支持。我们希望你对新功能能跟我们一样兴奋!它们处于早期阶段,我们希望你们检查出来并提交你的反馈和改进。我们将继续发展ONNX,PyTorch和Caffe2,确保开发人员拥有AI的最新工具。敬请期待后续更新!
相关资源
ONNX:https://github.com/onnx
Caffe2:https://caffe2.ai/
PyTorch:http://pytorch.org/
Super Resolution Tutorial:http://pytorch.org/tutorials/advanced/super_resolution_with_caffe2.html
原文:https://research.fb.com/facebook-and-microsoft-introduce-new-open-ecosystem-for-interchangeable-ai-frameworks/
https://www.microsoft.com/en-us/cognitive-toolkit/blog/2017/09/microsoft-facebook-create-open-ecosystem-ai-model-interoperability/
以上是关于ONNX一个沟通各大AI框架的桥梁的主要内容,如果未能解决你的问题,请参考以下文章