Update frontend ir (#431)

Co-authored-by: liangzhibo <liangzhibo@huawei.com>
This commit is contained in:
Liang ZhiBo
2023-03-24 11:44:16 +08:00
committed by GitHub
parent ec6ccd4686
commit 540a6794d3
6 changed files with 41 additions and 10 deletions

View File

@@ -0,0 +1,29 @@
AI编译器设计原理
----
无论是传统编译器还是AI编译器它们的输入均为用户的编程代码输出也机器执行的高效代码。进阶篇将用两个章节详细介绍AI编译器里面的很多概念借用了通用编译器中的概念如AOTAhead of Time提前编译、JITJust in time 即时、IRIntermediate Representation中间表示、PASS优化、ASTAbstract Trees、副作用、闭包等概念和编译器教材中对应概念的定义相同对编译器相关概念感兴趣的读者可以翻阅相关的编译原理教材本书会将讨论重点放在机器学习编译器相较于传统编译器的独特设计与功能上。
AI编译器的设计受到了主流编译器如LLVM的影响。为了方便理解AI编译器首先通过 :numref:`LLVM_basic_struc`展示LLVM编译器的架构。
![LLVM编译器基础架构](../img/ch04/LLVM基础结构.png)
:width:`800px`
:label:`LLVM_basic_struc`
LLVM包含了前端、IR和后端三个部分。前端将高级语言转换成IR后端将IR转换成目标硬件上的机器指令IR作为桥梁在前后端之间进行基于IR的各种优化。这样无论是新增硬件的支持还是新增前端的支持都可以尽可能地复用IR相关的部分。IR可以是单层的也可以是多层的 LLVM IR是典型的单层IR其前后端优化都基于相同的LLVM IR进行。
AI编译器一般采用多层级IR设计。 :numref:`TF_multi_ir`展示了TensorFlow利用MLIR实现多层IR设计的例子被称为TensorFlow-MLIR。其包含了三个层次的IR即TensorFlow Graph IR XLAAccelerated Linear Algebra加速线性代数、HLOHigh Level Operations高级运算以及特定硬件的LLVM IR 或者TPU IR下面就不同的层级IR和其上的编译优化做一个简要介绍。
![TensorFlow的多层IR设计](../img/ch04/TensorFlow-IR.png)
:width:`800px`
:label:`TF_multi_ir`
计算图中涉及的编译优化一般称为图编译优化。Graph IR主要实现整图级别的优化和操作如图优化、图切分等比较适合静态图的执行模式。由于整图级别的IR缺少相应的硬件信息难以进行硬件相关的优化所以在中间层次就出现了硬件相关的通用编译优化比如XLA、Tensor RT、MindSpore的图算融合等它们能够针对不同的硬件进行算子融合等优化提升不同网络在特定硬件上的执行性能。
本书“编译器后端”章节的硬件通用优化中有一个小节专门介绍图算融合编译器的相关设计。
最后一个层次的IR是特定硬件加速器专有的IR一般由硬件厂商自带的编译器提供如Ascend硬件自带的TBE编译器就是基于TVM的Halide IR生成高效的执行算子。
多层级IR的优势是IR表达上更加地灵活可以在不同层级的IR上进行合适的PASS优化更加便捷和高效。
但是多层级IR也存在一些劣势。首先多层级IR需要进行不同IR之间的转换而IR转换要做到完全兼容是非常困难的工程工作量很大还可能带来信息的损失。上一层IR优化掉某些信息之后下一层需要考虑其影响因此IR转换对优化执行的顺序有着更强的约束。其次多层级IR有些优化既可以在上一层IR进行也可以在下一层IR进行让框架开发者很难选择。最后不同层级IR定义的算子粒度大小不同可能会给精度带来一定的影响。为了解决这一问题机器学习框架如MindSpore采用统一的IR设计MindIR。 :numref:`MS_Compiler`展示了MindSpore的AI编译器内部的运行流程。其中编译器前端主要指图编译和硬件无关的优化编译器后端主要指硬件相关优化、算子选择等。
![MindSpore编译器处理流程](../img/ch04/编译器整体流程.png)
:width:`800px`
:label:`MS_Compiler`

View File

@@ -1,15 +1,12 @@
# 编译器前端
在上一章节中我们详细讨论了计算图的生成和调度在进阶部分的介绍中简单介绍了深度学习编译器的作用。定义深度学习模型、计算图使用系统为用户提供的高级编程API我们将用户使用高级编程API编写的程序称为源程序将与硬件相关的程序称为目标程序深度学习编译器需要理解输入的源程序并将其映射到目标机。为了实现这两项任务编译器的设计被分解为两个主要部分前端和后端。传统编译器的前端专注于理解源程序后端则专注于将功能映射到目标机。为了将前后端相连接我们需要一种结构来表示转换后的源代码这就是中间表示Intermediate
Representation, IR
# AI编译器前端技术
编译器作为计算机系统的核心组件在机器学习框架设计中也扮演着重要的角色并衍生出了一个专门的编译器种类AI编译器。AI编译器既要对上承接模型算法的变化满足算法开发者不断探索的研究诉求又要对下在最终的二进制输出上满足多样性硬件的诉求满足不同部署环境的资源要求。既要满足框架的通用普适性又要满足易用性的灵活性要求还要满足性能的不断优化诉求。AI编译器保证了机器学习算法的便捷表达和高效执行日渐成为了机器学习框架设计的重要一环。
:numref:`compiler_frontend_structure`展示了机器学习编译器的前端的流程。其中,对源程序的解析过程与传统编译器是大致相同的,本章节不对这部分进行更细致的讨论。机器学习框架的编译器前端的独特之处主要在于自动微分功能的支持。为了满足自动微分功能带来的新需求,机器学习框架需要在传统中间表示的基础上设计新的中间表示结构。因此,本章节的介绍重点放在中间表示以及自动微分两个部分。最后,我们会简要探讨类型系统,静态分析和前端优化等编译器基础概念
![编译器前端基础结构](../img/ch04/编译器前端基础架构.svg)
:width:`1000px`
:label:`compiler_frontend_structure`
本章将先从AI编译器的整体框架入手 介绍AI编译器的基础结构。接下来本章会详细讨论编译器前端的设计并将重点放在中间表示以及自动微分两个部分。有关AI编译器后端的详细知识 将会在后续的第五章进行讨论
本章的学习目标包括:
- 理解AI编译器的基本设计原理
- 理解中间表示的基础概念,特点和实现方法
- 理解自动微分的基础概念,特点和实现方法
@@ -22,6 +19,7 @@ Representation, IR
```toc
:maxdepth: 2
ai_compiler_design_principle
overview_of_frontend
intermediate_representation
ad

View File

@@ -1,7 +1,11 @@
概述
AI编译器前端技术概述
----
本章节将讨论重点放在中间表示与自动微分章节。自动微分作为机器学习框架的编译器的独有功能,其实现需要满足其需求的中间表示的支持。在讨论完这两部分后,我们会简要介绍类型系统静态分析和前端编译优化等编译器基础概念。
:numref:`compiler_frontend_struc`展示了机器学习编译器前端的基础结构。其中,对源程序的解析过程与传统编译器是大致相同的,本章节不对这部分进行更细致的讨论。机器学习框架的编译器前端的独特之处主要在于对自动微分功能的支持。为了满足自动微分功能带来的新需求,机器学习框架需要在传统中间表示的基础上设计新的中间表示结构。因此,本章节的介绍重点会放在中间表示和自动微分这两部分,随后会简要探讨类型系统静态分析和前端优化等编译器基础概念。
![译器前端基础结构](../img/ch04/编译器前端基础架构.svg)
:width:`800px`
:label:`compiler_frontend_struc`
### 中间表示

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
img/ch04/TensorFlow-IR.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB