如何定义深度学习编译器?
深度学习编译器将深度框架中描述的模型定义作为输入,以在各种深度学习硬件上生成的高效代码实现作为输出。从模型定义到代码实现,深度学习编译器会针对模型规格和硬件架构进行高度优化。
为什么需要深度学习编译器[1]?
传统的深度学习框架采用人工优化算子,然后建立运行时图解释器来解决内存分配调度等问题[2]。深度学习编译器技术一般指在优化过程中采用了自动或者半自动的代码生成用以替代人工优化。
深度学习模型可以看做是一个有向图,图中的每一个节点代表一个计算,两个节点之间,代表数据依赖。因此可以通过图优化,可以实现对有向图的优化,提高计算效率。以TensorRT为例,TensorRT 里引入了以下几种图优化策略:
- Layer Fusion 网络层融合 [3]
- Tensor Fusing 张量融合
- Dead layer Elimination 删除无效网络层
深度学习的计算往往都是张量计算。张量计算的一个重要特征就是,计算以多重循环为主。通过对张量计算应用相应的优化技术对最终代码进行优化。
深度学习编译器和传统编译器有什么区别?
优化需求上的区别
传统编译器注重于优化寄存器使用和指令集匹配,由于缺乏应用的整体信息,其优化往往偏向于局部。而深度学习编译器的优化往往需要涉及到全局的改写,包括之前提到的内存,算子融合等。
自动代码生成上的区别
传统编译器的目标是生成比较优化的通用代码。而深度学习编译器的目标是生成接近手写或者更加高效的特定代码(卷积,矩阵乘法等)。
深度学习编译器的设计架构?[4]
如上图所示,深度学习编译器可以简单的分成两部分:编译器前端和编译器后端。IR在编译器的前端和后端都会用到,概括的说,IR 是对程序的抽象,可以被用来进行程序优化。具体到深度学习编译器,深度学习模型被翻译为多级IR(multi-level IRs),其中高级IR(high-level IR )位于编译器前端,低级IR(low-level IR )位于编译器后端。基于高级IR,深度学习编译器前端负责完成硬件无关的转换和优化。基于低级IR,编译器后端负责完成硬件相关的优化、代码生成和汇编。
-
知乎~深度学习编译器 https://zhuanlan.zhihu.com/p/87706488 ↩
-
知乎~深度学习编译技术的现状和未来
https://zhuanlan.zhihu.com/p/65452090 ↩ -
TENSORRT DOC 2.6.1 Layer Fusion https://docs.nvidia.com/deeplearning/tensorrt/best-practices/index.html#layer-fusion ↩
-
arXiv ~ The Deep Learning Compiler: A Comprehensive Survey https://arxiv.org/abs/2002.03794 ↩