fix chapter 6 (#216)

* fix chapter 6

* correct punctuation
  * a,b,c → a、b、c
  * , → ,
* fix equation 6.4.1
  * dimention → dimension
  * add a pair of parentheses to avoid misinterpreting
* remove redundant words
  * 图 :numref:`...` → :numref:`...`

* fix table numbering problem in chapter 6

Co-authored-by: Dalong <39682259+eedalong@users.noreply.github.com>
This commit is contained in:
ADNRs
2022-03-27 09:21:54 +08:00
committed by GitHub
parent 3f359047aa
commit 83e0f9896d
5 changed files with 64 additions and 59 deletions

View File

@@ -9,12 +9,12 @@
以优化内存IO为例。深度学习算子按其对资源的需求可以分为两类
计算密集型算子,这些算子的时间绝大部分花在计算上,如卷积、全连接等;
访存密集型算子这些算子的时间绝大部分花在访存上他们大部分是Element-Wise算子例如
ReLUElement-Wise Sum等。
ReLUElement-Wise Sum等。
在典型的深度学习模型中,一般计算密集型和访存密集型算子是相伴出现的,最简单的例子是"Conv +
ReLU"。Conv卷积算子是计算密集型ReLU算子是访存密集型算子ReLU算子可以直接取Conv算子的计算结果进行计算因此我们可以将二者融合成一个算子来进行计算从而减少内存访问延时和带宽压力提高执行效率。
例如:"Conv + Conv + Sum +
ReLU"的融合,从图 :numref:`conv_sum_relu`中我们可以看到融合后的算子减少了两个内存的读和写的操作优化了Conv的输出和Sum的输出的读和写的操作。
例如"Conv + Conv + Sum +
ReLU"的融合,从 :numref:`conv_sum_relu`中我们可以看到融合后的算子减少了两个内存的读和写的操作优化了Conv的输出和Sum的输出的读和写的操作。
![Elementwise算子融合](../img/ch05/conv_sum_relu.png)
:width:`800px`
@@ -28,12 +28,12 @@ MindSpore
:width:`800px`
:label:`graph_kernel`
:numref:`graph_kernel`算子拆解阶段Expander将计算图中一些复杂算子composite
op, 图中Op1、Op3、Op4展开为计算等价的基本算子组合
:numref:`graph_kernel`算子拆解阶段Expander将计算图中一些复杂算子composite
op图中Op1、Op3、Op4展开为计算等价的基本算子组合
图中虚线正方形框包围着的部分在算子聚合阶段Aggregation将计算图中将基本算子basic
op, 如图中Op2、拆解后的算子(expanded
op)组合融合形成一个更大范围的算子组合在算子重建阶段Reconstruction按照输入tensor到输出tensor的仿射关系将基本算子进行分类elemwise,
broadcast, reduce, transform等并在这基础上归纳出不同的通用计算规则
op如图中Op2、拆解后的算子expanded
op组合融合形成一个更大范围的算子组合在算子重建阶段Reconstruction按照输入tensor到输出tensor的仿射关系将基本算子进行分类elemwise
broadcastreducetransform等并在这基础上归纳出不同的通用计算规则
elemwise + reduce 规则elemwise +
reduce在满足一定条件后可以高效执行根据这些计算规则不断地从这个大的算子组合上进行分析、筛选最终重新构建成新的算子如图中虚线正方形包围的两个算子
New Op1 和 New
@@ -45,7 +45,7 @@ Op2。图算融合通过对计算图结构的拆解和聚合可以实现
1、硬件指令限制
在一些特定的硬件上IR中计算节点没有直接对应的硬件算子,只能通过子图的变换来达到子图中所有算子在对应的硬件上的存在。例如在MindSpore中,昇腾芯片上的Concat算子,只支持有限的输入个数63个,因此当前端IR上的输入个数大于限制输入的时候,需要将该计算节点拆分成等价的多个Concat节点,如图 :numref:`concat`所示:
在一些特定的硬件上IR中计算节点没有直接对应的硬件算子只能通过子图的变换来达到子图中所有算子在对应的硬件上的存在。例如在MindSpore中昇腾芯片上的Concat算子只支持有限的输入个数63个因此当前端IR上的输入个数大于限制输入的时候需要将该计算节点拆分成等价的多个Concat节点,如 :numref:`concat`所示
当Concat有100个输入时单个算子只支持最多63个输入此时会将该计算节点拆分成两个Concat节点分别为63个输入和37个输入的两个算子。
![Concat算子拆分](../img/ch05/concat.png)
@@ -54,8 +54,8 @@ Op2。图算融合通过对计算图结构的拆解和聚合可以实现
2、数据排布格式的限制
针对不同特点的计算平台和不同的算子,为了追求最好的性能,一般都需要选择不同的数据排布格式(Format),而这些排布格式可能跟框架缺省的排布格式是不一样的。在这种情况下,一般的做法是算子在执行完成后对输出插入一个格式转换操作,把排布格式转换回框架的缺省排布格式,这就引入了额外的内存操作。以下图 :numref:`transdata`为例在昇腾平台上Conv算子在输入和输出的内存排布为5HD时是性能最优的所以可以看到Conv算子输出结果的格式是5HD然后通过一个转换操作转回了框架缺省的NCHW紧接着后面又是一个Conv算子它需要5HD的输入所以又做了一个NCHW到5HD的转换。我们很容易看出虚线框内的两个转换操作互为逆操作可以相互抵消。通过对计算图的模式匹配,可以将该类型的操作消除。
针对不同特点的计算平台和不同的算子,为了追求最好的性能,一般都需要选择不同的数据排布格式Format,而这些排布格式可能跟框架缺省的排布格式是不一样的。在这种情况下,一般的做法是算子在执行完成后对输出插入一个格式转换操作,把排布格式转换回框架的缺省排布格式,这就引入了额外的内存操作。以 :numref:`transdata`为例在昇腾平台上Conv算子在输入和输出的内存排布为5HD时是性能最优的所以可以看到Conv算子输出结果的格式是5HD然后通过一个转换操作转回了框架缺省的NCHW紧接着后面又是一个Conv算子它需要5HD的输入所以又做了一个NCHW到5HD的转换。我们很容易看出虚线框内的两个转换操作互为逆操作可以相互抵消。通过对计算图的模式匹配可以将该类型的操作消除。
![数据排布格式转换消除](../img/ch05/transdata.png)
:width:`800px`
:label:`transdata`
:label:`transdata`