diff --git a/chapter_frontend_and_ir/ai_compiler_design_principle.md b/chapter_frontend_and_ir/ai_compiler_design_principle.md new file mode 100644 index 0000000..ae99470 --- /dev/null +++ b/chapter_frontend_and_ir/ai_compiler_design_principle.md @@ -0,0 +1,29 @@ +AI编译器设计原理 +---- + +无论是传统编译器还是AI编译器,它们的输入均为用户的编程代码,输出也机器执行的高效代码。进阶篇将用两个章节详细介绍AI编译器,里面的很多概念借用了通用编译器中的概念,如AOT(Ahead of Time提前编译)、JIT(Just in time 即时)、IR(Intermediate Representation中间表示)、PASS优化、AST(Abstract 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, XLA(Accelerated Linear Algebra,加速线性代数)、HLO(High 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` \ No newline at end of file diff --git a/chapter_frontend_and_ir/index.md b/chapter_frontend_and_ir/index.md index afdbbe2..0e7d82a 100644 --- a/chapter_frontend_and_ir/index.md +++ b/chapter_frontend_and_ir/index.md @@ -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 diff --git a/chapter_frontend_and_ir/overview_of_frontend.md b/chapter_frontend_and_ir/overview_of_frontend.md index 827d2a2..63595ee 100644 --- a/chapter_frontend_and_ir/overview_of_frontend.md +++ b/chapter_frontend_and_ir/overview_of_frontend.md @@ -1,7 +1,11 @@ -概述 +AI编译器前端技术概述 ---- -本章节将讨论重点放在中间表示与自动微分章节。自动微分作为机器学习框架的编译器的独有功能,其实现需要满足其需求的中间表示的支持。在讨论完这两部分后,我们会简要介绍类型系统,静态分析和前端编译优化等编译器基础概念。 + :numref:`compiler_frontend_struc`展示了机器学习编译器前端的基础结构。其中,对源程序的解析过程与传统编译器是大致相同的,本章节不对这部分进行更细致的讨论。机器学习框架的编译器前端的独特之处主要在于对自动微分功能的支持。为了满足自动微分功能带来的新需求,机器学习框架需要在传统中间表示的基础上设计新的中间表示结构。因此,本章节的介绍重点会放在中间表示和自动微分这两个部分,随后会简要探讨类型系统、静态分析和前端优化等编译器的基础概念。 + +![译器前端基础结构](../img/ch04/编译器前端基础架构.svg) +:width:`800px` +:label:`compiler_frontend_struc` ### 中间表示 diff --git a/img/ch04/LLVM基础结构.png b/img/ch04/LLVM基础结构.png new file mode 100644 index 0000000..8bc4c3e Binary files /dev/null and b/img/ch04/LLVM基础结构.png differ diff --git a/img/ch04/TensorFlow-IR.png b/img/ch04/TensorFlow-IR.png new file mode 100644 index 0000000..6e13dd4 Binary files /dev/null and b/img/ch04/TensorFlow-IR.png differ diff --git a/img/ch04/编译器整体流程.png b/img/ch04/编译器整体流程.png new file mode 100644 index 0000000..0c309f8 Binary files /dev/null and b/img/ch04/编译器整体流程.png differ