赞
踩
陈天奇团队宣布推出 TVM,在微博上表示,「我们今天发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机,cuda, opencl, metal, javascript 以及其它各种后端。欢迎对于深度学习,编译原理,高性能计算,硬件加速有兴趣的同学一起加入 dmlc 推动领导开源项目社区 。」
大多数现有系统针对窄范围的服务器级 GPU 进行优化,且需要在包括手机、IOT 设备及专用加速器上部署大量工作。而 TVM 是一种将深度学习工作负载部署到硬件的端到端 IR(中间表示)堆栈。也就是说,这类解决方案能够把深度学习模型分发到各种硬件设备上、实现端到端的调优。
众所周知,当前的深度学习框架基于数据流图(如tensorflow等),这种方法过于高层。并不适合硬件界别的设备执行。如下图所示:
TVM 旨在分离算法描述、调度(Schedule)和硬件接口。
首先,为了设计出适合深度学习的优化编译器,我们需要解决四大挑战:
为了解决上述挑战,TVM设计了两种层级结构:
通过 TVM ,我们可以用大多数深度学习框架构建出相应的模型——既能顾及到高层次的语言表述,又能兼顾底层的优化(如GPU等)。
下面分别介绍两种层级。
首先我们先看一下Optimizing Computational Graphs的总体实现方法,如下图所示:
可以看出传统的计算流图在此处大体被分成两部分:Operator Fusion、Data Layout Transformation。
这个较好理解,其实就是把运算进行了混合,压缩或者简化了原本的计算流程,这种融合过程可用于预先计算图形中可静态确定的部分,从而节省执行成本。TVM 提出了四种融合方式:
这个功能个人理解应为数据的重构,从而改变存储方式,进而优化访问区域。如下图所示。
优化数据布局(Data Layout Transformation)首先指定每个运算符的首选数据布局(数据的shape),因为这些限制决定了它们在硬件中的实现。然后,如果生产者和使用者的数据布局不匹配,我们会在它们之间执行正确的布局转换。
但是,在图层级的优化方式是有局限性的(因为算法运行的效率很大程度上取决于机器提供的编码或指令集)。事实上,这种数据布局方式会随着数据的类型、硬件加速器种类等而变得不稳定,所以 TVM 又提出来了一种代码自动生成策略。
这个层级结构实际上是针对各种硬件后端生成了同一种运算符的微调版本,即对其中的张量运算进行了相关优化。
首先,TVM 提出了一种张量的描述语言,用来描述各类算法。如图所示:
这种张量描述语言支持各类常见运算。TVM 显式引入交换缩减运算符,以便跨多个线程轻松安排交换性缩减。
TVM提出 Schedules 的概念,指的是一种将计算描述(张量运算)降低到后端(底层)优化实现的特定规则。这也是TVM实现的核心。
其理念是对 Schedules 空间和用于遍历此空间的转换进行建模,从而提供生成低级代码的不同方法。TVM的 Schedules 空间如图所示:
The dataflow representation provides an expression specifying the computation of each tensor element. The axis relation hyper-graph defines a bijective relation between the original loop axis and the transformed loop axis. The schedule tree represents the loop nest structure and producer store location of the computing structure. The schedule tree representation is derived from Halide, with a special emphasis on store location relation. Together, the dataflow representation, axis relation graph, and schedule tree describe a schedule that can be lowered to the code shown in the rightmost panel.
其实这种实现方法是从 Halide 这门语言为源头开发的,TVM 提出了一种新的语言来处理GPU等硬件加速设备所提出的挑战。
同时,为了加速我们在Schedule Space中遍历的速度,TVM提出了Schedule基元:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。