AI与传统编译器

AI编译器与传统编译器在结构上相似,都包括前端、IR和后端,但目标不同,AI编译器优化神经网络性能,传统编译器降低编程难度和优化程序性能。两者都进行语言转换,AI编译器关注计算图优化,如融合、量化、并行,而传统编译器关注高级语言到低级语言的转换。AI编译器利用领域特性,如自动分布式并行和算子优化,但传统编译器更注重通用性。尽管AI编译器有潜力,但在编译器优化和手动实现之间存在性价比权衡。AI编译器与传统编译器的融合,如使用MLIR,有望实现更好的编译优化效果。
摘要由CSDN通过智能技术生成

AI与传统编译器
至于TVM,现在有很多框架(TF,Pytorch),然后会部署到不同平台(CPU、GPU、TPU),神经网络编译器呢就是把不同框架里写的东西编译成一样的格式再生成到某一平台的代码
再来看传统编译器(更偏向于LLVM),现在有许多语言(C、ObjC、C++),也有许多平台(x86、arm),编译器做的就是把不同语言编译到同样的中间代码再生成某一平台的代码
这两个就是把前端的表示进行统一再生成硬件相关的程序,只不过一个前端表示的是神经网络,一个是大家都熟悉的代码,结构类似但实际内部工作大相径庭

传统编译器:输入高级语言输出低级语言
神经网络编译器:输入计算图/算子,输出低级语言
相同点是都做了类似语言转换的工作
不同点
传统编译器解决的主要问题是降低编程难度,其次是优化程序性能
神经网络编译器解决的主要问题是优化程序性能,其次是降低编程难度
问题

  1. 对于神经网络编译器,如果没有体系结构相关信息的输入是否能生成高效代码(涉及完全自动化的问题)
  2. 当前的技术投入比来看,神经网络编译器和人工算子实现的哪个性价比更高

神经网络编译器,编译时考虑神经网络有关的特性来优化程序。
程序优化,解释器vs编译器,JVM,JIT,llvm, Halide,TensorFlow, XLA, ONNX, TVM, MLIR

AI编译器和传统编译器的本质是一样的,都是一类能够将不同的编程语言所表达code进行转换的program。这也是AI编译器之所以被称之为“编译器”的原因。

两者的联系
因为AI编译器出现的比较晚,所以在设计的时候往往会借鉴传统编译器的思路:
• 两者的理念比较类似。两者都力求通过一种更加通用,更加自动化的方式进行程序优化和代码生成,从而降低手工优化的effort。
• 两者的软件结构比较类似。一般都分成前端,IR,后端等模块。其中前端负责讲不同的语言的描述转换成统一的IR表述,后端通常会对IR表示进行优化,最终生成可执行的code。IR层用来解耦前端和后端,降低集成的effort。
• 两者的优化方式比较类似。通常编译器都会对code进行一系列的优化,从而提高performance或者减少memory footprint等。AI编译器和传统编译器都是通过在IR上面,run各种各样的pass,进行优化的。而且,AI编译器往往还会借鉴传统编译器中的一些pass,比如constant folding, dead code elimination等
• AI编译器通常会依赖于传统编译器。AI编译器在IR上面,对model进行优化之后,通常会有lowering的过程,将优化后的high-level IR转换成传统编译器的low-level IR,然后依赖传统编译器,做最终的机器码生成。
两者的区别
两者最根本的区别是应用场景的区别:
• AI编译器是把一个深度学习模型转换成executable。这里可以把一个深度学习模型理解成一段用DSL(Domain Specific Language)描述的code,而executable就是一段用硬件能理解的机器码描述的code。这正好能对应到compiler的定义。
• 传统编译器是把一段用高级语言编写的code转换成executable。这里的高级语言可能是C/C++等。这也能够对应到compiler的定义。
应用场景的区别导致了两者在设计上不同:
• 两者的IR表达层次有区别。AI编译器一般会有一套high-level的IR,用来更抽象的描述深度学习模型中常用的high-level的运算,比如convolution,matmul等。而传统编译器的IR更偏low-level,用于描述一些更加基本的运算,比如load,store,arithmetic等。有了high-level的IR,AI编译器在描述深度学习模型的时候会更加方便。
• 两者的优化策略有区别。AI编译器因为是面向AI领域的,在优化时,可以引入更多领域特定的先验知识,从而进行更加high-level,更加aggressive的优化。比如说:
o AI编译器可以在high-level的IR上面做operator fusion等,而传统编译器在做类似的loop fusion的时候往往更加保守。
o AI编译器可以降低计算的精度,比如int8, bf16等,因为深度学习模型对计算精度不那么敏感。但传统编译器一般不会做这种优化。
对神经网络优化,尽量减少逻辑判断,一算到底是最好的。对内存要尽可能优化,降低内存占用。
神经网就是一组矩阵计算。神经网编译器就是将这组计算针对平台尽可能加速。
编译神经网络,把一张张计算图编译成cpu的gpu的,或者是某些专用的AI计算设备,比如google 的TPU的指令集合。具体说来就是先来个图剪枝,再来个拓扑序遍历计算图,一边遍历,一边映射为中间表示。
后面从中间表示到指令集就大同小异了。
神经网络编译器大概有TVM/Glow/TensorRT/TensorComprehension/XLA/Tiramisu。这些针对的都是神经网络模型推理阶段的优化,从神经网络模型到机器代码的编译。一般过程是 神经网络模型->图优化->中间代码生成(例如Halide)->中间代码优化(例如TC/Tiramisu使用多面体模型进行变换)->机器代码。编译的是神经网络的模型,优化的是网络模型本身,各层数据数据存储的方式(如分块存储,nchw,nhcw),各个算子(如mlp,conv)的计算方式(如向量化,分块)等等。
传统编译器(GCC,Clang这些)的编译范围更广,是从源代码到机器代码的编译,输入是一段完整的代码,经过了词法分析,语法分析,语义分析,中间代码生成,优化,最后到机器代码。
联系:
首先是神经网络编译器,从中间代码到机器代码的过程,可能就对应了传统编译器的整个编译过程,比如Halide->机器代码
然后,目标都是都要针对目标处理器进行的优化。无论是什么代码/模型,最后的优化,就是如何最大化利用硬件,比如cache的命中率,计算速度啥的,最终目标都是生成好的机器代码。
神经网络编译器,可以对应用做很多很强的假设,主要以嵌套循环的计算为主,所以可以针对性的进行优化。
传统编译器的前端也非常厚重,都是以编程语言为输入来生成IR的。而神经网络编译器的主要问题,还是性能优化和适配,所以基本都不做前端,直接用代码手动构造IR。
针对deep learning的编译器,把应用限制在tensor operator上,做domain specific optimization。传统编译

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值