摘要:深度学习编译器能够作为框架和硬件之间的公共组件和桥梁,最终心愿实现的指标是咱们只用开发一次,就可能为主动为任何设施生成最优代码。

本文分享自华为云社区《深度学习编译器简介》,原文作者:luchangli 。

最近的十几年深度学习倒退十分迅速,业界呈现了很多深度学习算法开发框架。同时,因为深度学习具备广泛应用场景和对算力的微小需要,咱们须要将深度学习算法运行在各种通用和专用的硬件上,比方各种类型的CPU,GPU,TPU,NPU等。那么这就呈现了框架和硬件之间的组合爆炸,如图 1所示。比如说TensorFlow要反对GPU计算,就要把tensorflow外面的所有算子开发一个GPU版本,如果又要反对D芯片,又须要把每个算子开发一个D芯片的版本。这个过程无疑十分耗时耗力。

图 1

于此同时,咱们当初有十分多的算法网络,比如说YOLO, BERT, GPT等等。而这些算法网络是是由不同类型、不同shape,不同连贯关系的算子组成的。最终它们又运行在不同品种和型号的硬件下面。这就导致人工去为每个场景开发和实现最优算子老本很高。这里举了两个例子,如图 2所示,算子交融是一个常见的性能优化办法,在交融之前,每个算子计算前后都须要把数据从内存读到缓存,再从缓存写回到内存。而交融之后,能够防止算子之间内存读写从而进步性能。传统的做法就是人工去依据算子连贯关系开发交融算子,然而不同网络不同类别算子连贯关系简直不可能齐全枚举。另一个例子就是算子调优,算子实现过程有很多参数会影响性能,然而传统人工算子开发方式很难去表白和保护这些参数,并且对这些参数进行调优从而实现不同shape和硬件的最优性能。

图 2

深度学习编译器正是为了解决下面一系列问题而诞生的,它能够作为框架和硬件之间的公共组件和桥梁,最终心愿实现的指标是咱们只用开发一次,就可能为主动为任何设施生成最优代码。比方为CPU开发的算子能够简直原封不同的用于GPU和D芯片,从而显著降低成本。

这里简略介绍一下深度学习编译器的组成部分和性能,如图 3所示。首先它的前端是从不同的框架拿到计算图,并且应用这个High level IR的数据结构来示意,而后在这个阶段进行一系列图优化,比方常量折叠,算子交融,等价替换等。这里展现了一个等价替换的例子,原来计算图是这样的,咱们给它换一个计算形式,后果不变,然而性能可能更优。接着,对于计算图外面的每一个算子,采纳DSL一种畛域特定的语言来形容算子的计算过程和对算子进行优化。比方对算子进行tiling,多核,double-buffer等优化。因为算子的计算过程通常是用多重循环来实现的,比如说矩阵乘法是一个三重的循环。深度学习编译器能够很不便的对循环进行各种变换,并且对这些变换的参数进行调优,从而失去不同shape和硬件的最佳算子实现。最初,基于low level IR为不同硬件生成具体的代码。

图 3

最初介绍下业界已有的编译器我的项目。目前生态最欠缺,开源的,框架不依赖的我的项目首推TVM,曾经被很多公司所采纳。TVM流程如如图 3a所示,TVM能够导入各个框架的模型,例如TensorFlow pb,onnx,TorchScript等模型,对立用TVM称为Relay的High level IR进行示意。IR中每个算子采纳了Tensor expression的DSL来进行计算形容和调度。这个DSL采纳Einstein’s notation的形式进行算子的compute形容,算子compute个别体现为多重for循环。而后基于Halide思维应用schedule对这个多重for循环进行各种变换,例如循环合并,split,程序变换等等。最初,lower到low-level IR生成具体的device代码并进行推理。

这里再简略介绍下TVM具体如何生成最优的算子代码。下面介绍了算子须要进行compute形容,而后须要对compute对应的多重for循环进行调度变换,即schedule。TVM的算子生成和调优经验了3代倒退。第一代TVM/AutoTVM,这一代须要用户编写算子的compute和算子的schedule,AutoTVM与TVM的区别在于能够在schedule定义一些可变的参数,而后采纳例如遗传算法进行参数调优。例如把一个loop切分为2段,那么在哪里进行切分是能够进行优化的。第二代AutoScheduler (Ansor),这一代只须要用户开发算子ompute,Ansor外部主动依据一些规定进行调度变换。因为调度开发须要同时相熟TVM的表白机制和底层硬件原理,schedule开发往往具备很高的难度,因而Ansor能够显著升高开发人员工作量和开发难度,毛病就是Ansor调优工夫很长,往往须要1小时能力调优1个算子。以卷积网络为例,Ansor在局部场景能超过TensorFlow算子性能,间隔TensorRT实现有肯定差距。第三代Meta Schedule (AutoTensorIR)才处于起步阶段,预期会对调优速度和性能进行优化,临时还不可用,咱们刮目相待。

TVM的落地包含华为D芯片TBE算子开发工具,在TVM的根底上减少了D芯片的代码生成反对。TVM采纳了Halide计算+调度的路线,还有另外一种采纳polyhedral算法路线的编译器,比方Tensor Comprehensions,Tiramisu,华为自研的AKG等。这种办法跟Ansor一样,也只须要用户开发算子compute,无需开发schedule,因而对用户也较为敌对。其中AKG曾经用在了MindSpore的图算交融外面。其余的深度学习编译器还有TensorFlow的XLA、TensorRT等,大家可能曾经用过。

总之,深度学习编译器具备很多劣势。比方易于反对新硬件,防止反复开发,采纳一系列主动优化代替人工优化,能够实现极致性价比等。目前深度学习编译器也有一些有余,依然出于一个疾速倒退的状态。例如调优工夫长,对于简单的算子无奈无效生成,一个模型中深度学习编译器生成的算子能超过库调用的算子比例较低等,依然须要大家继续投入和优化。

点击关注,第一工夫理解华为云陈腐技术~