微软Facebook联手发布AI生态系统,推出开放神经网络交换格式

微软Facebook联手发布AI生态系统,推出 Open Neural Network Exchange(ONNX,开放神经网络交换)格式,这是一个用于表示深度学习模型的标准,可使模型在不同框架之间进行转移。ONNX是迈向开放生态系统的第一步,AI开发人员可以轻松地在最先进的工具之间转换,并选择最适合他们的组合。但是,现在系统支持的框架只有Caffe2,PyTorch 和Cognitive Toolkit ,谷歌的TensorFlow并没有被包含在内。在TensorFlow的市场份额迅猛增长的当下,两家企业的联手,似乎有特别的意味。

88

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 内部使用

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中表示为: