Add MLIR in chapter frontend and ir (#68)

This commit is contained in:
Liang ZhiBo
2022-03-11 18:43:36 +08:00
committed by GitHub
parent 0e29f2bdd5
commit 2398a82d7c

View File

@@ -112,21 +112,7 @@ IR。
TorchScript是PyTorch的JIT实现支持使用Python训练模型然后通过JIT转换为语言无关的模块从而提升模型部署能力提高编译性能。同时TorchScript
IR显著改善了Pytorch框架的模型可视化效果。
2、TensorFlow
与PyTorch框架的动态图机制不同TensorFlow机器学习框架因为其静态图机制而被人熟知。关于静态图和动态图的介绍请参考第3.3章节。
TensorFlow框架同时支持静态图和动态图是一个基于数据流编程的机器学习框架使用数据流图作为数据结构进行各种数值计算。为了适配不同的硬件平台基于静态计算图TensorFlow采用了多种IR设计其编译生态系统如图 :numref:`MLIR`所示。蓝色部分是基于图的中间表示绿色部分是基于SSA的中间表示各层级在结构和抽象层级上存在较大的差距转换开销大而且同一层级的中间表示优化是相互独立的不利于协同优化。
![TensorFlow MLIR](../img/ch04/中间表示-MLIR.svg)
:width:`600px`
:label:`MLIR`
针对这个问题TensorFlow团队提出了MLIR(Multi-Level Intermediate
Represent多级中间表示)
([@2020MLIR]允许使用TensorFlow和其它机器学习库的项目编译更有效的代码从而最大程度地利用基础硬件。MLIR是用于现代优化编译器的灵活基础架构旨在定义一个通用的中间表示在统一的基础架构中支持多种不同的需求。MLIR采用混合中间表示允许在同一编译单元中结合多个层级的抽象来表示、分析和转换计算图利用其模块化、可扩展的特点解决了各种中间表示之间转换效率和可迁移性不高的问题从而适配多种硬件平台。
3、Jax
2、Jax
Jax机器学习框架同时支持静态图和动态图其中间表示采用Jaxpr(JAX Program
Representation) IR。Jaxpr
@@ -142,10 +128,43 @@ Form)函数式表达形式,如图 :numref:`Jaxpr`所示。ANF形式将表达
Jax框架结合了Autograd 和 JIT基于Jaxpr
IR支持循环、分支、递归、闭包函数求导以及三阶求导并且支持自动微分的反向传播和前向传播。
4、MindSpore
3、TensorFlow
与PyTorch、TensorFlow、Jax框架相同MindSpore机器学习框架同时支持静态图和动态图。MindSpore框架采用的是一种基于图表示的函数式中间表示即MindIR全称MindSpore
IR。MindIR通过统一的中间表示定义了网络的逻辑结构和算子的属性能够消除不同后端的模型差异连接不同的目标机器。
TensorFlow框架同时支持静态图和动态图是一个基于数据流编程的机器学习框架使用数据流图作为数据结构进行各种数值计算。TensorFlow机器学习框架的静态图机制更为人所熟知。在静态图机制中运行TensorFlow的程序会经历一系列的抽象以及分析程序会逐步从高层的中间表示向底层的中间表示进行转换我们把这种变换成为lowering。
为了适配不同的硬件平台基于静态计算图TensorFlow采用了多种IR设计其编译生态系统如图:numref:`TFIR`所示。蓝色部分是基于图的中间表示绿色部分是基于SSA的中间表示。在中间表示的转换过程中各个层级的中间表示各自为政无法互相有效地沟通信息也不清楚其他层级的中间表示做了哪些优化因此每个中间表示只能尽力将当前的优化做到最好造成了很多优化在每个层级的中间表示中重复进行, 从而导致优化效率的低下。尤其是从图中间表示到SSA中间表示的变化过大转换开销极大。此外各个层级的相同优化的代码无法复用也降低了开发效率。
![TensorFlow](../img/ch04/中间表示-MLIR.svg)
:width:`600px`
:label:`TFIR`
针对这个问题TensorFlow团队提出了MLIR(Multi-Level Intermediate
Represent多级中间表示)
([@2020MLIR]允许使用TensorFlow和其它机器学习库的项目编译更有效的代码从而最大程度地利用基础硬件。MLIR是用于现代优化编译器的灵活基础架构旨在定义一个通用的中间表示在统一的基础架构中支持多种不同的需求。MLIR采用混合中间表示允许在同一编译单元中结合多个层级的抽象来表示、分析和转换计算图利用其模块化、可扩展的特点解决了各种中间表示之间转换效率和可迁移性不高的问题从而适配多种硬件平台。
4、MLIR
针对这个问题TensorFlow团队提出了MLIR(Multi-Level Intermediate
Represent多级中间表示)
([@2020MLIR]。MLIR不是一种具体的中间表示定义而是为中间表示提供一个统一的抽象表达和概念。 开发者可以使用MLIR开发的一系列基础设施来定义符合自己需求的中间表示 因此我们可以把MLIR理解为“编译器的编译器”。MLIR不局限于TensorFlow框架 还可以用于构建连接其他语言与后端如LLVM的中间表示。
MLIR深受LLVM设计理念的影响但与LLVM不同的是 MLIR是一个更开放的生态系统。 在MLIR中 没有预设的操作与抽象类型, 这使得开发者可以更自由地定义中间表示并更有针对性地解决其领域的问题。MLIR通过Dialect的概念来支持这种可拓展性 Dialect在特定的命名空间下为抽象提供了分组机制分别为每种中间表示定义对应的产生式并绑定相应的Operation 从而生成一个MLIR类型的中间表示。Operation是MLIR中抽象和计算的核心单元其具有特定的语意可以用于表示LLVM中所有核心的IR结构 例如指令, 函数以及模块等。 如下就是一个MLIR定义下的Operation
```
%tensor = "toy.transpose"(%tensor) {inplace = true} : (tensor<2x3xf64>) -> tensor<3x2xf64> loc("example/file/path":12:1)
```
- \% tensor: Operation定义的结果的名字 $\%$是为了避免冲突统一加入的。一个Operation可以定义0或者多个结果它们是SSA值。
- "toy.transpose": Operation的名字。它是一个唯一的字符串其中Dialect为Toy。因此它可以理解为Toy Dialect 中的transpose Operation。
- (\%tensor):输入操作数(或参数)的列表,它们是由其它操作定义或引用块参数的 SSA 值。
- {inplace = true}零个或多个属性的字典这些属性是始终为常量的特殊操作数。在这里我们定义了一个名为“inplace”的布尔属性它的常量值为 true。
- (tensor<2x3xf64>)->tensor<3x2xf64>:函数形式表示的操作类型,前者是输入,后者是输出。尖括号内代表输入与输出的数据类型以及形状, 例如$<2x3xf64>$代表一个形状位2X3 数据类型为float64的张量。
- loc("example/file/path":12:1):此操作的源代码中的位置。
由于各层中间表示都遵循如上的样式进行定义,所以各个层级的中间表示之间可以更加方便的进行转换, 提高了中间表示转换的效率。各个不同层级的中间表示还可以协同进行优化。 此外,由于中间表示之间不再相互独立, 各层级的优化不必做到极致,而是可以将优化放到最适合的层级。 其他的中间表示只需要先转换为该层级的中间表示就可以进行相关的优化提高了优化的效率与开发效率。TensorFlow从图中间表示到SSA中间表示的转换也可以通过使用MLIR来进行多层转换 使转换更加平滑, 降低了转化的难度。 针对MLIR的更多内容将会在第六章进行介绍。
5、MindSpore
与PyTorch、Jax、TensorFlow框架相同MindSpore机器学习框架同时支持静态图和动态图。MindSpore框架采用的是一种基于图表示的函数式中间表示即MindIR全称MindSpore
IR。MindIR没有采用多层中间表示的结构而是通过统一的中间表示定义了网络的逻辑结构和算子的属性能够消除不同后端的模型差异连接不同的目标机器。
MindIR最核心的目的是服务于自动微分变换而自动微分采用的是基于函数式编程框架的变换方法因此MindIR采用了接近于ANF函数式的语义。MindIR具有以下特点