让我们先来看看这些寻衅,并向您先容来自华盛顿大学和AWS研究团队,然后让您理解编译器是如何事情的。

一种开源、端到端的新型人工智能框架编译器——NNVM编译器_编译器_框架 智能问答

三个寻衅

首先,由于前端接口和后端实现之间的差异,从一个人工智能框架切换到另一个AI框架是非常主要的。
此外,算法开拓职员可能会利用多个框架作为开拓和交付流程的一部分。
在AWS上,我们有客户希望在MXNet上支配他们的Caffe模型,以享受Amazon EC2上的高速性能。
Joaquin Candela最近在博客中写道,用户可能会利用PyTorch进行快速开拓,然后支配在Caffe2上。
然而,在将模型从一个框架转换到另一个框架后,有人抱怨二者的调试结果存在差异。

其次,框架开拓职员须要掩护多个后端,以担保智好手机芯片,GPU芯片等硬件的性能。
以MXNet为例,它有一个可移植的,可以从头开始构建的C++实现。
它还附带了目标干系的后端支持,比如cuDNN用于英伟达的 GPU芯片,MKLML用于英特尔的CPU芯片。
担保这些不同的后端向用户供应同等的数字结果是很有寻衅性的。

末了,芯片供应商须要为他们所构建的每一个新芯片支持多个人工智能框架。
每个框架中的事情负载都以独特的办法表示和实行,因此,纵然是一个大略的卷积(Convolution)操作,也可能须要以不同的办法定义。
而支持多个框架须要花费工程师们大量的事情。

不同的人工智能框架和硬件给用户带来了巨大的好处,但是对付人工智能开拓者来说,给终极用户带来同等的结果是非常困难的。
幸运的是,我们并不是第一个面对这种问题的人。
打算机科学在不同的硬件上运行不同的编程措辞有着悠久的历史。
办理这个问题的一个关键技能是编译器。
受传统编译器技能的启示,Tianqi Chen,Thierry Moreau ,Haichen Shen,Luis Ceze,Carlos Guestrin以及Arvind Krishnamurthy这组来自华盛顿大学打算机科学工程学院的研究职员,联合了来自AWS AI团队的Ziheng Jiang,先容了TVM堆栈技能来简化这个问题。

本日,AWS和来自华盛顿大学的研究团队共同发布了一种基于TVM堆栈技能的端到端编译器,叫做NNVM。
这种编译器能直接将来自不同的深度学习前真个事情负载编译成优化过的二进制机器码。
让我们来看一下传统的AI框架和NNVM编译器的构造比拟:

我们不雅观察到一个范例的人工智能框架可以大致划分为三个部分:

1、前端向用户展示了一个易于利用的界面。

2、来自前真个事情命令常日被表示成打算图(computation graph),它由数据变量和操作运算符组成。

3、不管是基本算术的操作运算符,还是神经网络层的操作运算符都被优化实行成对应不同硬件的操作运算符

而NNVM编译器基于TVM堆栈中的两个组件:处理打算图的NNVM组件和处理张量操作运算符的TVM组件。

NNVM组件——打算图媒介表示堆栈 (intermediate representation (IR) stack)

NNVM组件的目标是将来自不同框架的事情命令表示为标准化的打算图,然后将这些高等打算图转换为实行图(execution graph)。
将打算图以一种与框架无关的形式表达出来的想法,是受到来自Keras(一种深度学习框架)的层定义,以及来自Numpy(Python的一种工具)的张量操作运算符的启示。

NNVM组件还附带了一些称为Pass的例程,它们通过LLVM约定来操作这些打算图。
这些例程可以在打算图中添加新的属性来实行打算图,或者修正打算图以提高效率。

TVM组件——张量媒介表示堆栈

TVM起源于Halide措辞,它的实行工具是打算图中的操作运算符,它把操作运算符优化成对应目标后端硬件的操作运算符。
它与NNVM组件不同,它供应了一种与硬件无关的、对应特定领域的措辞,以简化在张量索引级别中的操作符实行。
TVM还供应了一些进程调度原语,例如多线程和缓存,从而优化打算以充分利用硬件资源。
这些进程调度是硬件干系的,并且可以手动编码,也可以自动搜索优化过的模式。

NNVM编译器支持的前端框架和后端硬件

下图解释了NNVM编译器如何处理前后端之间的关系:

MXNet是通过将其打算图直接转换为NNVM组件中的打算图来支持的,Keras仍在发展中,但也以类似的办法支持。
NNVM编译器还可以利用诸如CoreML之类的模型格式。

因此,任何能够利用这些格式的框架都可以利用这个编译堆栈。

TVM目前利用多个代码天生器来支持各种后端硬件。
例如,它为X86和ARM等cpu架构天生LLVM IR。
它也能够为各种GPU架构输出CUDA、OpenCL和Metal kernels。

NNVM编译器要添加新的支持很大略。
对付一个新的前端框架,我们只须要将它的事情命令转换为定义了打算图和操作符规范的NNVM组件的格式。
如果要添加新的后端硬件,我们可以重复利用TVM的操作符实行,然后只需指定如何有效地调度它们。

性能测试结果

我们用MXNet分别在GPU与CPU硬件后端上,以及ResNet18与MobileNet模型上,来与NNVM编译器进行性能比拟测试。

这是在GPU上的性能结果测试比拟图,可以看出NNVM编译器的耗时更少。

这是在CPU上的性能结果测试比拟图,可以看出NNVM编译器的耗时更少。

结论

NNVM编译器能将一个高等打算图编译成优化过的二进制机器码,这个编译器基于TVM堆栈中的两个组件:NNVM组件供应了一个带有打算图优化例程的打算图和操作运算符的规范。
TVM组件把操作运算符实行优化成对应目标硬件的操作运算符。
而且,我们在两个完备不同的硬件上——ARM CPU和Nvidia gpu进行了性能测试比拟,证明了这个编译器可以匹配乃至超越了目前最前辈的打算性能。
我们希望NNVM编译器能够极大地简化AI的前端框架和后端硬件的设计,并帮助用户在不同的前端和后端供应同等的结果。