神经网络编译器图层面IR

神经网络编译器图层面IR_第1张图片

图形IR

图形IR,也被称为高级IR,代表计算流和控制流,并且与硬件无关。 高级IR的设计挑战是对计算流和控制流的进行抽象的能力,要能够表达出各种深度学习模型。 高级IR的目标是建立控制流以及算子与数据之间的依赖关系,并为图层面的优化提供接口。 它还包含丰富的语义信息以进行编译,并为自定义算子提供了可扩展性。

分类

神经网络编译器图层面IR_第2张图片

DAG-based IR(a directed acyclic graph)

有向无环图。其节点和边组织为有向无环图(DAG)。 计算图IR是一种以有向无环图(Directed Acyclic Graph,简称DAG)为中心的实现方式,许多早期的框架都是使用了这种方案。计算图IR的设计比较自然,计算图主要由边和节点组成,节点一般用来表达算子、变量、常量等等;边对应于张量,实际上表达了一种数据依赖关系。计算图IR中执行的算子可以是细粒度的,也可以是粗粒度的。

在这里插入图片描述

Let-binding-based IR

Let绑定是传统编译器中常用技术,在每种高级编程语言中都使用了let绑定。通常采用一个具有三个字段let(var,value,body)的数据结构。 在评估let表达式时,我们首先评估value,将其分配给var,然后在body表达式中返回评估结果。你可以使用一系列的let绑定语句来构造一个逻辑上等效于数据流程序的程序。嵌套的let绑定称为A-normal形式,常常在函数式编程语言中被用作IR。
例如
神经网络编译器图层面IR_第3张图片

优化方式

编译器中端会针对Graph IR提供的信息进行相应的优化,这些优化通常是以多条pass的形式进行。中端会根据多个层次对Graph IR进行不同的优化:

  • Node-Level 层优化:编译器会根据Graph IR判断有哪些节点是不会被计算到的(或者是说不需要的计算,比如sum的输入只有一个的时候,就不需要sum的计算这种类型,进行zero padding时的pad op也是无用的结点),对应的删除这些no-op 。
  • Block-Level层优化:一方面,编译器会根据Graph IR来进行代数相关的简化,包括用一些更简单的operators代替一些复杂的operators,进行常量折叠(提前计算一些节点的数值去代替原来的节点,包括提前计算shape等)。同时还包括分析各个operators之间的基本运算关系,利用结合律、交换律等基本的方式进行调整计算的顺序,进行相应的计算优化。另一方面,编译器会对operator进行相关的融合操作,将多个operator融合成一个算子,减少整体的调度开销,提升计算性能。不同的工作提出了不同的方式来优化算子融合。TVM通过设计对应的规则用于算子融合,ATen则是根据多面体技术来对算子进行融合。另外,编译器也再探索多个算子之间的关系,通过调整算子的先后顺序,创造更多机会利用上述的代数优化和算子融合的优化手段。

一些框架

神经网络编译器图层面IR_第4张图片

你可能感兴趣的:(神经网络编译器,神经网络编译器优化)