This commit is contained in:
quantumiracle
2022-05-01 23:01:35 -04:00
143 changed files with 49858 additions and 50827 deletions

Binary file not shown.

View File

@@ -64,6 +64,9 @@
- **可解释性AI系统** 随着机器学习在安全攸关Safety-critical领域的应用机器学习系统越来越需要对决策给出充分解释。本书将会讨论可解释AI系统的常用方法和落地实践经验。
- **机器人系统:** 机器人(无人车,无人机,家用机器人等)作为机器学习技术重要的应用领域,在最近数年得到了广泛应用。在实践中,机器人系统在实时性,安全性,鲁棒性等方面都有极高要求,这要求开发者具有算法和系统的双重思维,从而解决实际问题。本书中我们将结合最新研究成果和机器人系统实践经验讲解该类系统的设计原则和实现细节。
我们在持续拓展拓展本书的内容如元学习系统自动并行深度学习集群调度绿色AI系统图学习系统等。我们也非常欢迎社区对于新内容提出建议贡献章节。
## 构建指南

View File

@@ -1,5 +1,4 @@
加速器基本组成原理
------------------
## 加速器基本组成原理
上节主要介绍了加速器的意义以及设计思路了解到加速器与通用处理器在设计上的区别因此加速器的硬件结构与CPU的硬件结构有着根本的不同通常都是由多种片上缓存以及多种运算单元组成。本章节主要通过GPU的Volta架构作为样例进行介绍。
@@ -36,7 +35,7 @@
- **常量内存Constant Memory**:常量内存其实只是全局内存的一种虚拟地址形式,并没有真正的物理硬件内存块。常量内存有两个特性,一个高速缓存,另一个更重要的特性是它支持将某个单个值广播到线程束中的每个线程中。
- **纹理内存Texture Memory**纹理内存是全局内存的一个特殊形态。当全局内存被绑定为纹理内存时执行读写操作将通过专用的纹理缓存来加速。在早期的GPU上没有缓存因此每个SM流多处理器上的纹理内存为设备提供了唯一真正缓存数据的方法。然而随着硬件的升级一级缓存和二级缓存的出现纹理缓存的这项优势已经荡然无存。纹理内存的另外一个特性也是最有用的特性就是当访问存储单元时允许GPU实现硬件相关的操作。比如说使用纹理内存可以通过归一化的地址对数组进行访问获取的数据可以通过硬件进行自动插值从而达到快速处理数据的目的。此外对于二数组和三维数组,支持硬件级的双线性插值与三线性插值。纹理内存另一个实用的特性是可以根据数组的索引自动处理边界条件,不需要对特殊边缘进行处理即可完成数组内元素操作,从而防止线程中分支的产生。
- **纹理内存Texture Memory**纹理内存是全局内存的一个特殊形态。当全局内存被绑定为纹理内存时执行读写操作将通过专用的纹理缓存来加速。在早期的GPU上没有缓存因此每个SM流多处理器上的纹理内存为设备提供了唯一真正缓存数据的方法。然而随着硬件的升级一级缓存和二级缓存的出现纹理缓存的这项优势已经荡然无存。纹理内存的另外一个特性也是最有用的特性就是当访问存储单元时允许GPU实现硬件相关的操作。比如说使用纹理内存可以通过归一化的地址对数组进行访问获取的数据可以通过硬件进行自动插值从而达到快速处理数据的目的。此外对于二数组和三维数组,支持硬件级的双线性插值与三线性插值。纹理内存另一个实用的特性是可以根据数组的索引自动处理边界条件,不需要对特殊边缘进行处理即可完成数组内元素操作,从而防止线程中分支的产生。
由于寄存器的高速读取特性,因此每次计算都离不开寄存器的参与。接着是一级缓存和共享内存,然后是常量内存、纹理内存、全局内存,最后则是主机端内存。根据不同存储器之间的存储速度的数量级的变化规律,选用适当类型的内存以及最大化地利用它们,从而发挥硬件的最大算力,减少计算时间。
@@ -83,4 +82,4 @@ GPU计算单元主要由标量计算单元和三维向量计算单元组成。
:width:`800px`
:label:`davinci_architecture`
昇腾AI芯片的计算核心主要由AI Core构成负责执行标量、向量和张量相关的计算密集型算子。AI Core采用了达芬奇架构基本结构如 :numref:`davinci_architecture`所示从控制上可以看成是一个相对简化的现代微处理器基本架构。它包括了三种基础计算单元矩阵计算单元Cube Unit、向量计算单元Vector Unit和标量计算单元Scalar Unit。这三种计算单元分别对应了张量、向量和标量三种常见的计算模式在实际的计算过程中各司其职形成了三条独立的执行流水线在系统软件的统一调度下互相配合达到优化计算效率的目的。 同GPU类似在矩阵乘加速设计上在AICore中也提供了矩阵计算单元作为昇腾AI芯片的核心计算模块意图高效解决矩阵计算的瓶颈问题。矩阵计算单元提供强大的并行乘加计算能力可以用一条指令完成两个$16\times16$矩阵的相乘运算,等同于在极短时间内进行了$16\times16\times16=4096$个乘加运算并且可以实现FP16的运算精度。
昇腾AI芯片的计算核心主要由AI Core构成负责执行标量、向量和张量相关的计算密集型算子。AI Core采用了达芬奇架构 :cite:`2021Ascend`,基本结构如 :numref:`davinci_architecture`所示从控制上可以看成是一个相对简化的现代微处理器基本架构。它包括了三种基础计算单元矩阵计算单元Cube Unit、向量计算单元Vector Unit和标量计算单元Scalar Unit。这三种计算单元分别对应了张量、向量和标量三种常见的计算模式在实际的计算过程中各司其职形成了三条独立的执行流水线在系统软件的统一调度下互相配合达到优化计算效率的目的。 同GPU类似在矩阵乘加速设计上在AICore中也提供了矩阵计算单元作为昇腾AI芯片的核心计算模块意图高效解决矩阵计算的瓶颈问题。矩阵计算单元提供强大的并行乘加计算能力可以用一条指令完成两个$16\times16$矩阵的相乘运算,等同于在极短时间内进行了$16\times16\times16=4096$个乘加运算并且可以实现FP16的运算精度。

View File

@@ -1,9 +1,8 @@
概述
----
## 概述
### 硬件加速器设计的意义
未来人工智能发展的三大核心要素是数据、算法和算力。目前人工智能系统算力大都构建在CPU+GPU之上主体多是GPU。随着神经网络层数多,模型体量大,算法复杂CPU和GPU很难再满足新型网络对于算力的需求。例如2015年谷歌的AlphaGo与樊麾对弈时用了1202个CPU和176个GPU每盘棋需要消耗上千美元的电费而与之对应的是樊麾的功耗仅为20瓦。
未来人工智能发展的三大核心要素是数据、算法和算力。目前人工智能系统算力大都构建在CPU+GPU之上主体多是GPU。随着神经网络层数的增多,模型体量的增大,算法复杂度的上升CPU和GPU很难再满足新型网络对于算力的需求。例如2015年谷歌的AlphaGo与[樊麾](https://baike.baidu.com/item/樊麾)对弈时用了1202个CPU和176个GPU每盘棋需要消耗上千美元的电费而与之对应的是樊麾的功耗仅为20瓦。
虽然GPU在面向向量、矩阵以及张量的计算上引入许多新颖的优化设计但由于GPU需要支持的计算类型复杂芯片规模大、能耗高人们开始将更多的精力转移到深度学习硬件加速器的设计上来。和传统CPU和GPU芯片相比新型深度学习加速器会有更高的性能以及更低的能耗。未来随着人们真正进入智能时代智能应用的普及会越来越广泛到那时每台服务器、每台智能手机、每个智能摄像头都需要使用加速器。

View File

@@ -1,5 +1,4 @@
加速器基本编程原理
------------------
## 加速器基本编程原理
:label:`accelerator-program-title`
本章前两节主要介绍了硬件加速器设计的意义、思路以及基本组成原理。软硬件协同优化作为构建高效AI系统的一个重要指导思想需要软件算法/软件栈和硬件架构在神经网络应用中互相影响、紧密耦合。为了最大限度地发挥加速器的优势,要求能够基于硬件系统架构提供易用、高效的编程方法。因此,在本节中将着重介绍加速器的可编程性,包括编程接口直接调用方式及算子编译器优化方式。最后,通过示例介绍如何通过编程使能加速器,提升神经网络算子的计算效率。
@@ -190,3 +189,5 @@ res = te.lang.cce.matmul(tensor_a, tensor_b, False, False, False, dst_dtype=dst_
4. **优化数据访存------提高并行性**:在进行内存结构变化(矩阵数据搬移)时,需要注意全局内存的合并访问、共享内存的存储体冲突等常见性能瓶颈点。
5. **资源负载均衡------增大吞吐量**调整平衡每个线程处理的数据量、共享内存使用量、寄存器使用量以获得更高的SM占用率。一般在实际程序中BlockTile和WarpTile的选取至关重要。
6. **优化指令执行**:使用\#unroll功能进行循环展开来提升指令级并行如 :numref:`gemm-tensor-core-algorith`中13行使用向量化加载指令以提高带宽等对于GPU Volta架构最大向量化加载指令为ldg128即128比特带宽对于 :numref:`gemm-tensor-core-algorith`中5-6行数据由全局内存加载至共享内存时即可采用Float4\*类型指针进行内存读取。

View File

@@ -1,10 +1,16 @@
总结
----
## 总结
- 面向深度学习计算任务,加速器通常都是由多种片上缓存以及多种运算单元组成来提升性能。
- 面向深度学习计算任务,加速器通常都是由多种片上缓存以及多种运算单元组成来提升性能。
- 未来性能增长需要依赖架构上的改变,即需要利用可编程的硬件加速器来实现性能突破。
- 未来性能增长需要依赖架构上的改变,即需要利用可编程的硬件加速器来实现性能突破。
- 出于计算效率和易用性等原因,加速器一般会具有多个等级的编程方式,包括:算子库层级,编程原语层级和指令层级。
- 出于计算效率和易用性等原因,加速器一般会具有多个等级的编程方式,包括:算子库层级,编程原语层级和指令层级。
- 越底层的编程方式越能够灵活地制加速器,但同时对程序员的能力要求也越高。
- 越底层的编程方式越能够灵活地制加速器,但同时对程序员的能力要求也越高。
## 扩展阅读
- CUDA编程指导 [CUDA](https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html)
- 昇腾社区 [Ascend](https://gitee.com/ascend)
- MLIR应用进展 [MLIR](https://mlir.llvm.org/talks)

View File

@@ -169,7 +169,7 @@ compute(y, z)
- **串行执行**:将计算图展开为执行序列,按照执行序逐个串行执行,如 :numref:`graph_exec_2`所示。其特点为执行顺序固定,单线程执行,对系统资源要求相对较低。
- **并行执行**:将计算图按照算子之间的依赖关系展开,有依赖关系的算子通过输入依赖保证执行顺序,没有依赖关系的算子则可以并行执行,如 :numref:`graph_exec_3`所示Kernel_1和Kernel_2没有依赖可以并行执行Kernel_3和Kernel_4没有依赖可以并行执行。其特点为执行顺序不固定每轮执行的算子顺序大概率不一样多线程执行对系统资源要求相较高。
- **并行执行**:将计算图按照算子之间的依赖关系展开,有依赖关系的算子通过输入依赖保证执行顺序,没有依赖关系的算子则可以并行执行,如 :numref:`graph_exec_3`所示Kernel_1和Kernel_2没有依赖可以并行执行Kernel_3和Kernel_4没有依赖可以并行执行。其特点为执行顺序不固定每轮执行的算子顺序大概率不一样多线程执行对系统资源要求相较高。
串行执行和并行执行各有优点和缺点,总结对比见 :numref:`serial_vs_parallel`
@@ -197,9 +197,9 @@ compute(y, z)
将一张异构计算图切分为多个子计算图后,执行方式一般分为子图拆分执行和子图合并执行:
- **子图拆分执行**:将切分后的多个子图分开执行,即一个子图执行完再执行另一个子图,如 :numref:`graph_exec_6`所示,上一个子图的输出数据会传输给下一个子图的输入数据,并且下一个子图需要输入数据拷贝为本图的device数据如Graph_2\_GPU需要将Graph_1\_CPU的输出数据从CPU拷贝到GPU反过来Graph_3\_CPU需要将Graph2GPU的输出数据从GPU拷贝到CPU子图之间互相切换执行有一定的开销。
- **子图拆分执行**:将切分后的多个子图分开执行,即一个子图执行完再执行另一个子图,如 :numref:`graph_exec_6`所示,上一个子图的输出数据会传输给下一个子图的输入数据,并且下一个子图需要输入数据拷贝为本图的device数据如Graph_2\_GPU需要将Graph_1\_CPU的输出数据从CPU拷贝到GPU反过来Graph_3\_CPU需要将Graph2GPU的输出数据从GPU拷贝到CPU子图之间互相切换执行有一定的开销。
- **子图合并执行**:将切分后的多个子图进行合并,合并为一个整体的DAG执行如 :numref:`graph_exec_7`所示,通过算子的设备属性来插入拷贝算子以实现不同设备上的算子数据传输,并且拷贝算子也是进入整图中的,从而形成一个大的整图执行,减少子图之间的切换执行开销。
- **子图合并执行**将切分后的多个子图进行合并合并为一个整体的DAG执行如 :numref:`graph_exec_7`所示,通过算子的设备属性来插入拷贝算子以实现不同设备上的算子数据传输,并且拷贝算子也是进入整图中的,从而形成一个大的整图执行,减少子图之间的切换执行开销。
![子图拆分](../img/ch05/graph_exec_6.png)
:width:`800px`

View File

@@ -15,6 +15,8 @@
- 掌握内存分配的常用方法
- 掌握计算图调度和执行的常用方法
```toc
:maxdepth: 2

View File

@@ -29,17 +29,17 @@
对于NCHW的数据是先取W轴方向数据再取H轴方向数据再取C轴方向最后取N轴方向。其中物理存储与逻辑存储的之间的映射关系为
$$offsetnchw(n,c,h,w) = n*CHW + c*HW + h*W +w$$
如 :numref:`nchw`所示这种格式中是按照最低维度W轴方向进行展开W轴相邻的元素在内存排布中同样是相邻的。如果需要取下一个图片上的相同位置的元素就必须跳过整个图像的尺寸$C*H*W$。比如我有8张32\*32的RGB图像此时$N=8,C=3,H=32,W=32$。在内存中存储们需要先按照W轴方向进行展开然后按照H轴排列这样之后便完成了一个通道的处理之后按照同样的方式处理下一个通道。处理完全部通道后处理下一张图片。PyTorch和MindSpore框架默认使用NCHW格式。
如 :numref:`nchw`所示这种格式中是按照最低维度W轴方向进行展开W轴相邻的元素在内存排布中同样是相邻的。如果需要取下一个图片上的相同位置的元素就必须跳过整个图像的尺寸$C*H*W$。比如我有8张32\*32的RGB图像此时$N=8,C=3,H=32,W=32$。在内存中存储们需要先按照W轴方向进行展开然后按照H轴排列这样之后便完成了一个通道的处理之后按照同样的方式处理下一个通道。处理完全部通道后处理下一张图片。PyTorch和MindSpore框架默认使用NCHW格式。
![RGB图片下的NHWC数据格式](../img/ch05/nchw.png)
:width:`800px`
:label:`nchw`
类似的NHWC数据格式是先取C方向数据再取W方向然后是H方向最后取N方向。NHWC是Tensorflow默认的数据格式。这种格式在PyTorch中称为Chanel-Last。
$$offsetnchw(n,c,h,w) = n*HWC + h*HW + w*C +c$$
$$offsetnhwc(n,h,w,c) = n*HWC + h*WC + w*C +c$$
:numref:`nchwandnhwc`展示了不同数据格式下逻辑排布到内存物理侧数据排布的映射。\[x:1\]代表从最内侧维度到最下一维度的索引变换。比如\[a:1\]表示当前行W轴结束后下一个H轴排布。\[b:1\]表示最内侧C轴排布完成后进行按照W轴进行排列。
![NHWC与NHWC数据存储格式](../img/ch05/nchwandnhwc.png)
![NCHW与NHWC数据存储格式](../img/ch05/nchwandnhwc.png)
:width:`800px`
:label:`nchwandnhwc`
@@ -56,7 +56,7 @@ Precision浮点表示。这种数据类型占用32位内存。还有一种精
:width:`800px`
:label:`floatdtype`
如 :numref:`floatdtype`其中sign代表符号位占1位表示了机器数的正负exponent表示指数位Mantissa为尾数位。其数据计算采用二进制的科学计数法转换为十进制的计算方式如下:
如 :numref:`floatdtype`其中sign代表符号位占1位表示了机器数的正负exponent表示指数位Mantissa为尾数位。其中float16类型的数据采用二进制的科学计数法转换为十进制的计算方式如下:
$$(-1)^{sign}\times 2^{exponent-15}\times (\frac{mantissa}{1024}+1)$$
其中如果指数位全为0时且尾数位全为0时表示数字0。
如果指数位全为0尾数位不全为0则表示一个非常小的数值。

View File

@@ -15,7 +15,7 @@ In-Place内存分配还可以提高某些算子的执行效率。
### 内存分配 {#内存分配-1}
内存分配模块主要负责给图中算子的输入、输出分配Device内存。用户的前端脚本经过编译器前端处理后得到中间表达后端根据中间表达进行算子选择和相关优化可以得到算子最终的输入输出Tensor的形状、数据类型Data
Type、格式Format等信息根据这些信息我们可以计算出算子输入、输出Tensor的尺寸大小。基本的计算方法为:
Type、格式Format等信息根据这些信息我们可以计算出算子输入、输出Tensor的尺寸大小。基本的计算方法为
$$size=\left (\prod_{i=0}^{dimension}shape_i\right ) * sizeof\left ( data type \right )$$
得到Tensor的尺寸大小后往往还需要对内存大小进行对齐操作。内存通常以4字节、8字节或16字节为一组进行访问如果被搬运的内存大小不是这些值的倍数内存后面会填充相应数量的空数据以使得内存长度达到这些值的倍数。因此访问非对齐的内存可能会更加耗时。
@@ -24,9 +24,9 @@ $$size=\left (\prod_{i=0}^{dimension}shape_i\right ) * sizeof\left ( data type \
:label:`memory_allocate`
下面以 :numref:`memory_allocate`为例介绍内存分配的大致流程。首先我们会给Input
Tensor、Conv2D的权重和Conv2D的输出分配内存地址。然后为BatchNorm的输入分配地址时我们发现BatchNorm的输入就是Conv2D算子的输出而该Tensor的地址已经在之前分配过了因此只需要将Conv2D算子的输出地址共享给BatchNorm的输入就可以避免内存的重复申请以及内存的冗余拷贝。以此类推可以发现整个过程中可以将待分配的内存分成三种类型一是整张图的输入Tensor二是算子的权重或者属性三是算子的输出Tensor三种Tensor在训练过程中的生命周期有所不同。
Tensor、Conv2D的权重和Conv2D的输出分配内存地址。然后为BatchNorm的输入分配地址时我们发现BatchNorm的输入就是Conv2D算子的输出而该Tensor的地址已经在之前分配过了因此只需要将Conv2D算子的输出地址共享给BatchNorm的输入就可以避免内存的重复申请以及内存的冗余拷贝。以此类推可以发现整个过程中可以将待分配的内存分成三种类型一是整张图的输入Tensor二是算子的权重或者属性三是算子的输出Tensor三种类型在训练过程中的生命周期有所不同。
在CPU上我们常常使用malloc函数直接申请内存这种方式申请内存好处是随时申请随时释放简单易用。然而在许多对性能要求严苛的计算场景中由于所申请内存块的大小不定频繁申请释放会降低性能。通常我们会使用内存池的方式去管理内存先申请一定数量和大小的内存块留作备用,当程序有内存申请需求时,直接从内存池中的内存块中申请。当程序释放该内存块时,内存池会进行回收并用作后续程序内存申请时使用。
在CPU上我们常常使用malloc函数直接申请内存这种方式申请内存好处是随时申请随时释放简单易用。然而在许多对性能要求严苛的计算场景中由于所申请内存块的大小不定频繁申请释放会降低性能。通常我们会使用内存池的方式去管理内存先申请一定数量的内存块留作备用当程序有内存申请需求时直接从内存池中的内存块中申请。当程序释放该内存块时内存池会进行回收并用作后续程序内存申请时使用。
在深度学习框架中Device内存的申请也是非常频繁的往往也是通过内存池的方式去管理Device内存并让Device内存的生命周期与Tensor的生命周期保持一致。不同的深度学习框架在内存池的设计上大同小异我们以 :numref:`device_malloc`的MindSpore框架内存申请为例进程会从Device上申请足够大的内存然后通过双游标从两端偏移为Tensor分配内存。首先从申请的首地址开始进行偏移为算子权重的Tensor分配内存这部分Tensor生命周期较长往往持续整个训练过程。然后从申请Device地址的末尾开始偏移为算子的输出Tensor分配内存这部分内存的生命周期较短往往在该算子计算结束并且后续计算过程中无需再次使用该算子的输出的情况下其生命周期就可以结束。通过这种方式我们只需要从Device上申请一次足够大的内存后续算子的内存分配都是通过指针偏移进行分配减少了直接从设备申请内存的耗时。
![双游标法分配内存](../img/ch05/device_malloc.png)
@@ -48,13 +48,13 @@ Tensor、Conv2D的权重和Conv2D的输出分配内存地址。然后为BatchNor
SOMASSafe Optimized Memory Allocation
Solver。SOMAS将计算图并行流与数据依赖进行聚合分析得到算子间祖先关系构建张量全局生命周期互斥约束使用多种启发式算法求解最优的内存静态规划实现逼近理论极限的内存复用从而提升支持的内存大小。
由 :numref:`combine_memory_reuse_and_no_reuse`右边可知经过SOMAS求解之后同样的内存大小可支持的Tensor数量达到了7个。
由 :numref:`combine_memory_reuse_and_no_reuse`右边所示经过SOMAS求解之后同样的内存大小可支持的Tensor数量达到了7个。
### 常见的内存分配优化手段
#### 内存融合
上述内存分配的方式都是以单个Tensor的维度去分配的每个Tensor分配到的Device地址往往是离散的。但是对于某些特殊的算子如AllReduce通信算子我们需要为它们分配连续的内存。通信算子的执行包含通信等待、数据搬移、计算等步骤而在大规模分布式集群的场景下通信的耗时往往是性能瓶颈。针对这种场景我们可以将多个通信算子融合成一个为通信算子的输入分配连续的内存从而减少通信的次数。
上述内存分配的方式都是以单个Tensor的维度去分配的每个Tensor分配到的Device地址往往是离散的。但是对于某些特殊的算子如AllReduce通信算子我们需要为它们分配连续的内存。通信算子的执行包含通信等待、数据搬移、计算等步骤而在大规模分布式集群的场景下通信的耗时往往是性能瓶颈。针对这种场景如 :numref:`memory_fusion`所示,我们可以将多个通信算子融合成一个,为通信算子的输入分配连续的内存,从而减少通信的次数。
又比如分布式训练中的神经网络权重初始化,通常将一个训练进程中的权重初始化,然后将该权重广播到其他进程中。当一个网络有较多权重的时候,需要多次进行广播。通常可以为所有权重分配连续的内存地址,然后广播一次,节省大量通信的耗时。
![通信算子内存融合](../img/ch05/memory_fusion.png)

View File

@@ -2,9 +2,9 @@
编译器前端主要将用户代码进行解析翻译得到计算图IR并对其进行设备信息无关的优化此时我们并不考虑程序执行的底层硬件信息。编译器后端的主要职责对前端下发的IR做进一步的计算图优化让其更加贴合硬件并为IR中的计算节点选择适合在硬件上执行的算子然后为每个算子的输入输出分配硬件内存最终生成一个可以在硬件上执行的任务序列。
如 :numref:`compiler-backend-architecture`所示编译器后端处于前端和硬件驱动层中间主要负责计算图优化、算子选择和内存分配的任务。首先需要根据硬件设备的特性将IR图进行等价图变换以便在硬件上能够找到对应的执行算子该过程是计算图优化的重要步骤之一。前端IR生成是解析用户代码属于一个较高的抽象层次隐藏一些底层运行的细节信息此时无法直接对应硬件上的算子算子是设备上的基本计算序列例如MatMul、Convolution和ReLU等需要将细节信息进行展开后才能映射到目标硬件上的算子。对于某些前端IR的子集来说一个算子便能够执行对应的功能此时可以将这些IR节点进行合并成为一个计算节点该过程称之为算子融合对于一些复杂计算后端并没有直接与之对应的算子但是可以通过几个基本运算的算子组合达到同样的计算效果此时可以将前端IR节点拆分成多个小算子。然后我们需要进行算子选择。算子选择是在得到优化的IR图后需要选取最合适的目标设备算子。针对用户代码所产生的IR往往可以映射成多种不同的硬件算子但是生成不同的算子执行效率往往有很大的差别如何根据前端IR选择出最高效的算子是算子选择的核心问题。算子选择本质上是一个模式匹配问题。其最简单的方法就是每一个IR节点对应一个目标硬件的算子但是这种方法往往对目标硬件的资源利用比较差。目前来说对于现有的编译器一般都对每一个IR节点提供了多个候选的算子算子选择目标就是从中选择最优的一个算子作为最终执行在设备上的算子。总的来说在机器学习系统中对前端生成的IR图上的各个节点进行拆分和融合让前端所表示的高层次IR逐步转换为可以在硬件设备上执行的低层次IR。得到了这种更加贴合硬件的IR后对于每个单节点的IR可能仍然有很多种不同的选择例如可以选择不同的输入输出格式和数据类型我们需要对IR图上每个节点选择出最为合适的算子算子选择过程可以认为是针对IR图的细粒度优化过程最终生成完整的算子序列。最后遍历算子序列为每个算子分配相应的输入输出内存然后将算子加载到设备上执行计算。
如 :numref:`compiler-backend-architecture`所示编译器后端处于前端和硬件驱动层中间主要负责计算图优化、算子选择和内存分配的任务。首先需要根据硬件设备的特性将IR图进行等价图变换以便在硬件上能够找到对应的执行算子该过程是计算图优化的重要步骤之一。前端IR生成是解析用户代码属于一个较高的抽象层次隐藏一些底层运行的细节信息此时无法直接对应硬件上的算子算子是设备上的基本计算序列例如MatMul、Convolution和ReLU等需要将细节信息进行展开后才能映射到目标硬件上的算子。对于某些前端IR的子集来说一个算子便能够执行对应的功能此时可以将这些IR节点合并成为一个计算节点该过程称之为算子融合对于一些复杂计算后端并没有直接与之对应的算子但是可以通过几个基本运算的算子组合达到同样的计算效果此时可以将前端IR节点拆分成多个小算子。然后我们需要进行算子选择。算子选择是在得到优化的IR图后需要选取最合适的目标设备算子。针对用户代码所产生的IR往往可以映射成多种不同的硬件算子但是生成不同的算子执行效率往往有很大的差别如何根据前端IR选择出最高效的算子是算子选择的核心问题。算子选择本质上是一个模式匹配问题。其最简单的方法就是每一个IR节点对应一个目标硬件的算子但是这种方法往往对目标硬件的资源利用比较差。目前来说对于现有的编译器一般都对每一个IR节点提供了多个候选的算子算子选择目标就是从中选择最优的一个算子作为最终执行在设备上的算子。总的来说在机器学习系统中对前端生成的IR图上的各个节点进行拆分和融合让前端所表示的高层次IR逐步转换为可以在硬件设备上执行的低层次IR。得到了这种更加贴合硬件的IR后对于每个单节点的IR可能仍然有很多种不同的选择例如可以选择不同的输入输出格式和数据类型我们需要对IR图上每个节点选择出最为合适的算子算子选择过程可以认为是针对IR图的细粒度优化过程最终生成完整的算子序列。最后遍历算子序列为每个算子分配相应的输入输出内存然后将算子加载到设备上执行计算。
![编译器后端总体架构简图](../img/ch05/compiler-backend-architecture.jpeg)
![编译器后端总体架构简图](../img/ch05/compiler-backend-architecture.png)
:width:`800px`
:label:`compiler-backend-architecture`
@@ -19,3 +19,7 @@
### 内存分配
经过计算图优化和算子选择之后我们可以得到IR图中每个算子的输入输出的形状Shape、数据类型、存储格式。根据这些信息计算输入输出数据的大小并为输入输出分配设备上的内存然后将算子加载到设备上才能真正执行计算。此外为了更充分地例用设备内存资源可以对内存进行复用提高内存利用率。
### 计算调度与执行
经过算子选择与内存分配之后,计算任务可以通过运行时完成计算的调度与在硬件上的执行。根据是否将算子编译为计算图,计算的调度可以分为单算子调度与计算图调度两种方式。而根据硬件提供的能力差异,计算图的执行方式又可以分为逐算子下发执行的交互式执行以及将整个计算图或者部分子图一次性下发到硬件的下沉式执行两种模式。

View File

@@ -16,4 +16,9 @@
- 将通信算子的内存进行融合可以提高通信的效率合理分配In-Place算子的内存可以节省内存使用并且提高计算效率。
- 运行时对于算子的执行可以分为单算子调度和计算图调度两种模式,而在计算图调度模式中,根据具体硬件的能力又可以分为交互式执行和下沉式执行两种方式,交互式执行具备更多的灵活性,下沉执行可以获得更好的计算性能。
- 运行时对于算子的执行可以分为单算子调度和计算图调度两种模式,而在计算图调度模式中,根据具体硬件的能力又可以分为交互式执行和下沉式执行两种方式,交互式执行具备更多的灵活性,下沉执行可以获得更好的计算性能。
## 扩展阅读
- 内存分配作为机器学习后端的重要部分,建议阅读 [Sublinear Memory Cost](https://arxiv.org/abs/1604.06174)、 [Dynamic Tensor Rematerialization](https://arxiv.org/abs/2006.09616)。
- 对于运行时的调度以及执行,建议阅读 [A Lightweight Parallel and Heterogeneous Task Graph Computing System](https://arxiv.org/abs/2004.10908)、 [Dynamic Control Flow in Large-Scale Machine Learning](https://arxiv.org/abs/1805.01772)、[DEEP LEARNING WITH DYNAMIC COMPUTATION GRAPHS](https://arxiv.org/abs/1702.02181)。

View File

@@ -5,10 +5,10 @@
:label:`dag`
早期的机器学习框架主要为了支持基于卷积神经网络的图像分类问题。这些神经网络的拓扑结构简单神经网络层往往通过串行构建他们的拓扑结构可以用简单的配置文件来表达例如Caffe中基于Protocol
Buffer格式的模型定义。随着机器学习的进一步发展模型的拓扑日益复杂包括混合专家生成对抗网络多注意力模型。这些模型复杂的拓扑结构(例如说,分支结构带有条件的if-else循环)会影响模型算子的执行、自动化梯度计算(一般称为自动微分)以及训练参数的自动化判断。为此,我们需要一个更加通用的技术来执行任意机器学习模型。因此,计算图应运而生。综合来看,计算图对于一个机器学习框架提供了以下几个关键作用:
Buffer格式的模型定义。随着机器学习的进一步发展模型的拓扑日益复杂包括混合专家生成对抗网络多注意力模型。这些复杂的模型拓扑结构(例如分支结构带有条件的if-else循环会影响模型算子的执行、自动化梯度计算(一般称为自动微分)以及训练参数的自动化判断。为此,我们需要一个更加通用的技术来执行任意机器学习模型,计算图应运而生。综合来看,计算图对于一个机器学习框架提供了以下几个关键作用:
- **对于输入数据算子和算子执行顺序的统一表达。**
机器学习框架用户可以用多种高层次编程语言PythonJulia和C++来编写训练程序。这些高层次程序需要统一的表达成框架底层C和C++算子的执行。因此,计算图的第一个核心作用是可以作为一个统一的数据结构来表达用户用不同语言编写的训练程序。这个数据结构可以准确表述用户的输入数据模型所带有的多个算子,以及算子之间的执行顺序。
- **对于输入数据算子和算子执行顺序的统一表达。**
机器学习框架用户可以用多种高层次编程语言PythonJulia和C++来编写训练程序。这些高层次程序需要统一的表达成框架底层C和C++算子的执行。因此,计算图的第一个核心作用是可以作为一个统一的数据结构来表达用户用不同语言编写的训练程序。这个数据结构可以准确表述用户的输入数据模型所带有的多个算子,以及算子之间的执行顺序。
- **定义中间状态和模型状态。**
在一个用户训练程序中,用户会生成中间变量(神经网络层之间传递的激活值和梯度)来完成复杂的训练过程。而这其中,只有模型参数需要最后持久化,从而为后续的模型推理做准备。通过计算图,机器学习框架可以准确分析出中间状态的生命周期(一个中间变量何时生成,以及何时销毁),从而帮助框架更好的管理内存。
@@ -16,5 +16,5 @@ Buffer格式的模型定义。随着机器学习的进一步发展模型
- **自动化计算梯度。**
用户给定的训练程序仅仅包含了一个机器学习模型如何将用户输入(一般为训练数据)转化为输出(一般为损失函数)的过程。而为了训练这个模型,机器学习框架需要分析任意机器学习模型和其中的算子,找出自动化计算梯度的方法。计算图的出现让自动化分析模型定义和自动化计算梯度成为可能。
- **高效程序执行。**
- **优化程序执行。**
用户给定的模型程序往往是"串行化"地连接起来多个神经网络层。通过利用计算图来分析模型中算子的执行关系,机器学习框架可以更好地发现将算子进行异步执行的机会,从而以更快的速度完成模型程序的执行。

View File

@@ -1,13 +1,13 @@
## 计算图的基本构成
计算图是用来表示深度学习网络模型在训练与推理过程中计算逻辑与状态的工具。计算框架在后端会将前端语言构建的神经网络模型前向计算与反向梯度计算以计算图的形式来进行表示。计算图由基本数据结构张量(Tensor)和基本运算单元算子(Operator)构成。在计算图中通常使用节点来表示算子,节点间的有向线段来表示张量状态,同时也描述了计算间的依赖关系。如 :numref:`simpledag`所示,将$\boldsymbol{Z}=relu(\boldsymbol{X}*\boldsymbol{Y})$转化为计算图表示,数据流将根据图中流向与算子进行前向计算和反向梯度计算来更新图中张量状态,以此达到训练模型的目的。
计算图是用来表示深度学习网络模型在训练与推理过程中计算逻辑与状态的工具。计算框架在后端会将前端语言构建的神经网络模型前向计算与反向梯度计算以计算图的形式来进行表示。计算图由基本数据结构张量(Tensor)和基本运算单元算子(Operator)构成。在计算图中通常使用节点来表示算子,节点间的有向线段来表示张量状态,同时也描述了计算间的依赖关系。如 :numref:`simpledag`所示,将$\boldsymbol{Z}=relu(\boldsymbol{X}*\boldsymbol{Y})$转化为计算图表示,数据流将根据图中流向与算子进行前向计算和反向梯度计算来更新图中张量状态,以此达到训练模型的目的。
![简单计算图](../img/ch03/simpledag.svg)
:width:`300px`
:label:`simpledag`
### 张量和算子
在计算框架中基础组件包含张量和算子张量是基础数据结构算子是基本运算单元。在数学中定义张量是基于向量与矩阵的推广涵盖标量、向量与矩阵的概念。可以将标量理解为零阶张量向量为一阶张量我们熟悉的RGB彩色图像即为三阶张量。在计算框架中张量不仅存储数据还存储数据类型、数据形状、维度或秩以及梯度传递状态等多个属性表3.2.1所示,列举了主要的属性和功能。
在计算框架中基础组件包含张量和算子张量是基础数据结构算子是基本运算单元。在数学中定义张量是基于向量与矩阵的推广涵盖标量、向量与矩阵的概念。可以将标量理解为零阶张量向量为一阶张量我们熟悉的RGB彩色图像即为三阶张量。在计算框架中张量不仅存储数据还存储数据类型、数据形状、维度或秩以及梯度传递状态等多个属性:numref:`tensor_attr`所示,列举了主要的属性和功能。
:张量属性
@@ -145,7 +145,7 @@ $$
其中$\nabla_{\boldsymbol{X}}\boldsymbol{z}$表示$\boldsymbol{z}$关于$\boldsymbol{X}$的梯度矩阵。
上一小节中简单的循环控制模型前向传播可以表示为$\boldsymbol{Y}=\boldsymbol{W_2}(\boldsymbol{W_1}(\boldsymbol{W}(\boldsymbol{X})))$。在反向传播的过程中可以将前向计算等价为$\boldsymbol{Y}=\boldsymbol{W_2}\boldsymbol{X_2}$,首先得到参数$\boldsymbol{W_2}$的梯度表示。再接着根据$\boldsymbol{X_2}=\boldsymbol{W_1}\boldsymbol{X_1}$得到$\boldsymbol{W_1}$的梯度表示,按照层级即可推导得出$\boldsymbol{W}$的梯度表示
上一小节中简单的循环控制模型前向传播可以表示为$\boldsymbol{Y}=\boldsymbol{W_2}(\boldsymbol{W_1}(\boldsymbol{W}(\boldsymbol{X})))$。在反向传播的过程中可以将前向计算等价为$\boldsymbol{Y}=\boldsymbol{W_2}\boldsymbol{X_2}$,首先得到参数$\boldsymbol{W_2}$的梯度表示。再接着根据$\boldsymbol{X_2}=\boldsymbol{W_1}\boldsymbol{X_1}$得到$\boldsymbol{W_1}$的梯度表示,按照层级即可推导得出$\boldsymbol{W}$的梯度表示
$$
\begin{aligned}

View File

@@ -22,19 +22,19 @@ def model(X, flag):
```
完成前端语言的模型完整构建表达后,执行模型运算时不会直接接收输入数据进行计算,而是使用计算框架的编译器对模型进行编译。由于在进行静态生成编译时并不读取输入数据,此时需要一种特殊的张量来表示输入数据辅助构建完整的计算图,这种特殊张量就被称之为"数据占位符"。在上述的伪代码中输入数据**X**需要使用占位符在静态图中表示。构造伪代码中的条件控制时由于在静态图模式下构建网络并没有执行任何计算对于条件控制在编译阶段并不会进行逻辑运算完成判断因此需要将条件控制算子以及所有的分支计算子图加入计算图中。在执行阶段网络接受数据流入调度条件控制算子时进行逻辑判断控制数据流入不同的分支计算子图中进行后续计算。由于控制流和静态生成的特殊性在部分计算框架中前端语言Python的控制流不能够被正确编译为等价的静态图结构因此需要使用复杂的图内方法实现控制流。
在后续的章节中我们会继续深入了解计算框架静态生成图结构的过程。静态生成的过程是采用计算框架编译器将代码编译为中间表示。计算框架编译器受传统编译器方案启发,设计体系结构包含两部分编译器前端和编译器后端。中间表示承上启下贯穿前端和后端,是前端源代码和目标硬件代码之间的中间数据格式。在计算框架编译器中中间表示以计算图形式存在,编译器会根据前端神经网络模型自动构建完整的前向计算图和反向计算图。
在后续的章节中我们会继续深入了解计算框架静态生成图结构的过程。静态生成的过程是采用计算框架编译器将代码编译为中间表示。计算框架编译器受传统编译器方案启发,设计体系结构包含两部分编译器前端和编译器后端。中间表示承上启下贯穿前端和后端,是前端源代码和目标硬件代码之间的中间数据格式。在计算框架编译器中中间表示以计算图形式存在,编译器会根据前端神经网络模型自动构建完整的前向计算图和反向计算图。
![静态生成](../img/ch03/static-gen.svg)
:width:`800px`
:label:`staticgen`
经过编译后获取完整的计算图,能够根据全局信息完成图优化策略,进行编译优化形成与模型完全等价的静态图。编译器前端负责完成计算图与硬件无关的转换和优化,比如算子融合将网络中的两个或多个细粒度的算子融合为一个粗粒度算子,比如 :numref:`staticgen`中将*add*算子与*relu*合并为一个操作,可节省中间计算结果的存储、读取等过程,降低框架底层算子调度的开销,从而提升执行性能和效率。编译器后端负责与硬件相关的计算图优化、代码指令生成和编译,优化手段包括硬件算子选择、内存分配、内存复用等,提高算子执行效率和内存利用效率,降低内存开销。编译器后端因此使用静态图模型运行往往能够获取更好的性能和更少的内存占用。在后续章节中将详细介绍更多编译器前端和编译器后端的优化策略。
经过编译后获取完整的计算图,能够根据全局信息完成图优化策略,进行编译优化形成与模型完全等价的静态图。编译器前端负责完成计算图与硬件无关的转换和优化,比如算子融合将网络中的两个或多个细粒度的算子融合为一个粗粒度算子比如 :numref:`staticgen`中将*add*算子与*relu*合并为一个操作,可节省中间计算结果的存储、读取等过程,降低框架底层算子调度的开销,从而提升执行性能和效率。编译器后端负责与硬件相关的计算图优化、代码指令生成和编译,优化手段包括硬件算子选择、内存分配、内存复用等,提高算子执行效率和内存利用效率,降低内存开销。编译器后端因此使用静态图模型运行往往能够获取更好的性能和更少的内存占用。在后续章节中将详细介绍更多编译器前端和编译器后端的优化策略。
优化完成的计算图通过编译器后端根据计算硬件来生成适配的执行代码。在执行阶段,调用执行器接受输入数据,依据计算图调度算子执行训练或者推理任务。在训练任务调度算子执行时,由于在执行阶段已经编译获取模型整体结构,计算框架可以利用自动并行算法制定合理的模型切分与并行策略,进一步提高计算效率。
使用静态图构建模型,编译构建完整的计算图后,计算图可以进行序列化保存,并且再次执行时允许使用序列化模型直接进行训练或推理,不需要再次编译前端语言源代码。得益于编译器前端、中间表示、编译器后端多级的计算框架编译器体系结构,编译器后端可以将神经网络模型中间表示转换为不同硬件代码。结合计算图序列化和计算图可转换多种部署硬件代码两种特性,使得静态图模型可以直接部署在不同的硬件上面,提供高效的推理服务。
使用静态图构建模型,编译构建完整的计算图后,计算图可以进行序列化保存,再次执行时允许使用序列化模型直接进行训练或推理,无需重新编译前端语言源代码。得益于编译器前端、中间表示、编译器后端多级的计算框架编译器体系结构,编译器后端可以将神经网络模型中间表示转换为不同硬件代码。结合计算图序列化和计算图可转换多种硬件代码两种特性,静态图模型可以直接部署在不同的硬件上面,提供高效的推理服务。
尽管静态图具备强大的执行计算性能与直接部署能力,但是在部分计算框架中静态图模式下,使用前端语言编写神经网络模型以及定义模型训练过程代码较为繁琐,尤其掌握图内控制流方法具备一定的学习难度,因此熟练掌握并使用静态图模式对于初学者并不友好。其次,静态生成采用先编译后执行的方式,编译阶段和执行阶段分离,前端语言构建的神经网络模型经过编译后,计算图结构便固定执行阶段不再改变,并且经过优化用于执行的计算图结构与原始代码有较大的差距,导致代码中的错误难以定位到准确位置,增加了代码调试难度。此外在神经网络模型开发迭代环节,不能即时打印中间结果。若在源码中添加输出中间结果的代码,则需要将源码重新编译后,再调用执行器才能获取相关信息,降低了代码调试效率。而动态图模式则拥有更加灵活的特性,接下来讲解动态生成机制。
尽管静态图具备强大的执行计算性能与直接部署能力,但是在部分计算框架中静态图模式下,使用前端语言编写神经网络模型以及定义模型训练过程代码较为繁琐,尤其掌握图内控制流方法具备一定的学习难度,因此熟练掌握并使用静态图模式对于初学者并不友好。其次,静态生成采用先编译后执行的方式,编译阶段和执行阶段分离,前端语言构建的神经网络模型经过编译后,计算图结构便固定执行阶段不再改变,并且经过优化用于执行的计算图结构与原始代码有较大的差距,导致代码中的错误难以定位到准确位置,增加了代码调试难度。此外在神经网络模型开发迭代环节,不能即时打印中间结果。若在源码中添加输出中间结果的代码,则需要将源码重新编译后,再调用执行器才能获取相关信息,降低了代码调试效率。而动态图模式则更加灵活,接下来讲解动态生成机制。
### 动态生成
@@ -44,7 +44,7 @@ def model(X, flag):
:width:`600px`
:label:`dynamic`
由于动态图模式的编程友好性,动态图广大深度学习研究者青睐使用。接下来使用上一小节的伪代码来讲解动态生成和静态生成的区别。
由于动态图模式的编程友好性,动态图深受广大深度学习研究者青睐。接下来使用上一小节的伪代码来讲解动态生成和静态生成的区别。
尽管静态图和动态图在前端语言表达上略有差异但本质的区别在于静态生成和动态生成的编译执行过程不同。使用前端语言构建完成模型表达后动态生成并不采用计算框架编译器生成完整的静态计算图而是采用前端语言的解释器Python API调用计算框架框架利用自身的算子分发功能将Python调用的算子在相应的硬件如CPU、GPU、NPU等上进行加速计算然后再将计算结果返回给前端。该过程并不产生静态的计算图而是按照前端语言描述模型结构按照计算依赖关系进行调度执行动态生成临时的图拓扑结构。
@@ -58,7 +58,7 @@ def model(X, flag):
对应于 :numref:`dynamicgen`中,当调用到关于张量$\boldsymbol{W1}$的*matmul*算子节点时,框架会执行两个操作:调用*matmul*算子,计算关于输入$\boldsymbol{X}$和$\boldsymbol{W1}$的乘积结果,同时根据反向计算过程$\boldsymbol{Grad\_W1}=\boldsymbol{Grad\_Y}*\boldsymbol{X}$,记录下需要参与反向计算的算子和张量$\boldsymbol{X}$。计算框架依照算子调度顺序记录参与反向计算的算子和张量。当前向计算执行完毕,计算框架根据动态生成的前向计算图结构拓扑关系,利用记录的反向计算算子和张量动态生成反向计算图,最终完成神经网络模型的梯度计算和参数更新。
尽管动态生成中完整的网络结构在执行前是未知的,不能使用静态图中的图优化技术来提高计算执行性能。但其即刻算子调用与计算的能力,使得模型代码在运行的时候,每执行一句立即进行运算并会返回具体的值,方便开发者在模型构建优化过程中进行错误分析、结果查看等调试工作,为研究和实验提供了高效的助力。
尽管动态生成中完整的网络结构在执行前是未知的,不能使用静态图中的图优化技术来提高计算执行性能。但其即刻算子调用与计算的能力,使得模型代码在运行的时候,每执行一句就会立即进行运算并会返回具体的值,方便开发者在模型构建优化过程中进行错误分析、结果查看等调试工作,为研究和实验提供了高效的助力。
此外得益于动态图模式灵活的执行计算特性,动态生成可以使用前端语言的原生控制流,充分发挥前端语言的编程友好性特性。解决了静态图中代码难调试、代码编写繁琐以及控制流复杂等问题,对于初学者更加友好,提高了算法开发迭代效率和神经网络模型改进速率。
@@ -136,8 +136,8 @@ def model(X, flag):
|框架|动态图转静态图|
| :-:| :---: |
| TensorFlow |@tf_function追踪算子调度构建静态图<br>其中AutoGraph机制可以自动转换控制流为静态表达 |
| MindSpore | context.set_context(mode=context.PYNATIVE_MODE) 动态图模式 <br> context.set_context(mode=context.GRAPH_MODE) 静态图模式 <br>\@ms_function支持基于源码转换 |
| MindSpore | context.set_context(mode=context.PYNATIVE_MODE) 动态图模式<br> context.set_context(mode=context.GRAPH_MODE) 静态图模式<br>\@ms_function支持基于源码转换 |
| PyTorch | torch.jit.script()支持基于源码转换,<br>torch.jit.trace()支持基于追踪转换 |
| PaddlePaddle | paddle.jit.to_static()支持基于源码转换,<br>paddle.jit.TracedLayer.trace()支持基于追踪转换 |
| PaddlePaddle | paddle.jit.to_static()支持基于源码转换,<br>paddle.jit.TracedLayer.trace()支持基于追踪转换 |
:label:`dynamic_static_switch`

View File

@@ -20,4 +20,10 @@
- 根据计算图可以找到相互独立的算子进行并发调度,提高计算的并行性。而存在依赖关系的算子则必须依次调度执行。
- 计算图的训练任务可以使用同步或者异步机制,异步能够有效提高硬件使用率,缩短训练时间。
- 计算图的训练任务可以使用同步或者异步机制,异步能够有效提高硬件使用率,缩短训练时间。
## 扩展阅读
- 计算图是计算框架的核心理念之一,了解主流计算框架的设计思想,有助于深入掌握这一概念,建议阅读 [TensorFlow 设计白皮书](https://arxiv.org/abs/1603.04467)、 [PyTorch计算框架设计论文](https://arxiv.org/abs/1912.01703)、[MindSpore技术白皮书](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/white_paper/MindSpore_white_paperV1.1.pdf)。
- 图外控制流直接使用前端语言控制流,熟悉编程语言即可掌握这一方法,而图内控制流则相对较为复杂,建议阅读[TensorFlow控制流](http://download.tensorflow.org/paper/white_paper_tf_control_flow_implementation_2017_11_1.pdf)论文。
- 动态图和静态图设计理念与实践,建议阅读[TensorFlow Eager 论文](https://arxiv.org/pdf/1903.01855.pdf)、[TensorFlow Eager Execution](https://tensorflow.google.cn/guide/eager?hl=zh-cn)示例、[TensorFlow Graph](https://tensorflow.google.cn/guide/intro_to_graphs?hl=zh-cn)理念与实践、[MindSpore动静态图](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.6/design/dynamic_graph_and_static_graph.html)概念。

View File

@@ -8,7 +8,7 @@
MindSpore通过约束算子线程组间的通信行为来确保对当前算子的下游算子的输入顺序与自己的输入顺序相同基于这种递归的约束确保了整个并行数据处理最后一个算子的输出顺序与第一个算子的输入顺序相同。具体实现中MindSpore以Connector为算子线程组间的通信组件对Connector的核心操作为上游算子的Push操作以及下游算子的Pop操作我们重点关注MindSpore对这两个行为的约束。
Connector的使用有如下两个要求:
Connector的使用有如下两个要求
- Connector两端的数据生产线程组和数据消费线程组中的线程分别从0开始编号。

View File

@@ -76,7 +76,7 @@ outputs = pipe.run()
:width:`800px`
:label:`distributed_data_preprocess_based_on_3rd_party_software`
该方案虽然业内被广泛使用,却面临着三个问题:
该方案虽然业内被广泛使用,却面临着三个问题:
- 由于数据处理和数据训练采用不同的框架,使得用户为此常常需要在两个不同的框架中编写不同语言的程序,增加了用户的使用负担。

View File

@@ -35,7 +35,7 @@ val count = ones.reduce(_+_)
主流机器学习系统中的数据模块同样也采用了类似的编程抽象如TensorFlow的数据模块tf.data :cite:`murray2021tf`,
以及MindSpore的数据模块MindData等。接下来我们以MindData的接口设计为例子来介绍如何面向机器学习这个场景设计好的编程抽象来帮助用户方便的构建模型训练中多种多样的数据处理流水线。
MindData是机器学习系统MindSpore的数据模块主要负责完成机器学习模型训练中的数据预处理任务MindData向用户提供的核心编程抽象为基于Dataset数据集的变换处理。这里的Dataset是一个数据帧的概念(Data
MindData是机器学习系统MindSpore的数据模块主要负责完成机器学习模型训练中的数据预处理任务MindData向用户提供的核心编程抽象为基于Dataset数据集的变换处理。这里的Dataset是一个数据帧的概念(Data
Frame)即一个Dataset为一个多行多列且每一列都有列名的关系数据表。
![MindSpore
@@ -56,8 +56,8 @@ Dataset示例](../img/ch07/7.2/dataset_table.png)
| prefetch | 从存储介质中预取数据集 |
| project | 从Dataset数据表中选择一些列用于接下来的处理 |
| zip | 将多个数据集合并为一个数据集 |
| repeat | 多轮次训练中,重复整个数据流水多次 |
| create_dict_iterator | 对数据集创建一个返回字典类型数据的迭代器 |
| repeat | 多轮次训练中,重复整个数据流水多次 |
| create_dict_iterator | 对数据集创建一个返回字典类型数据的迭代器 |
| ... | ... |
上述描述了数据集的接口抽象而对数据集的具体操作实际上是由具体的数据算子函数定义。为了方便用户使用MindData对机器学习领域常见的数据类型及其常见数据处理需求都内置实现了丰富的数据算子库。针对视觉领域MindData提供了常见的如Decode(解码)、Resize缩放、RandomRotation随机旋转、Normalize(正规化)以及HWC2CHW通道转置等算子针对文本领域MindData提供了Ngram、NormalizeUTF8、BertTokenizer等算子针对语音领域MindData提供了TimeMasking时域掩盖、LowpassBiquad双二阶滤波器、ComplexNorm归一化等算子这些常用算子能覆盖用户的绝大部分需求。
@@ -102,7 +102,7 @@ dataset = dataset.map(input_columns="label", operations=onehot_op)
有了基于数据集变换的编程抽象、以及针对机器学习各种数据类型的丰富变换算子支持,我们可以覆盖用户绝大部分的数据处理需求。然而由于机器学习领域本身进展快速,新的数据处理需求不断涌现,可能会有用户想要使用的数据变换算子没有被数据模块覆盖支持到的情况发生。为此我们需要设计良好的用户自定义算子注册机制,使得用户可以方便在构建数据处理流水线时使用自定义的算子。
机器学习场景中用户的开发编程语言以Python为主所以我们可以认为用户的自定义算子更多情况下实际上是一个Python函数或者Python类。数据模块支持自定义算子的难度主要数据模块对计算的调度实现方式有关系比如Pytorch的dataloader的计算调度主要在Python层面实现得益于Python语言的灵活性在dataloader的数据流水中插入自定义的算子相对来说比较容易而像TensorFlow的tf.data以及MindSpore的MindData的计算调度主要在C++层面实现这使得数据模块想要灵活的在数据流中插入用户定义的Python算子变得较为有挑战性。接下来我们以MindData中的算子自定义算子注册使用实现为例子展开讨论这部分内容。
机器学习场景中用户的开发编程语言以Python为主所以我们可以认为用户的自定义算子更多情况下实际上是一个Python函数或者Python类。数据模块支持自定义算子的难度主要数据模块对计算的调度实现方式有关系比如Pytorch的dataloader的计算调度主要在Python层面实现得益于Python语言的灵活性在dataloader的数据流水中插入自定义的算子相对来说比较容易而像TensorFlow的tf.data以及MindSpore的MindData的计算调度主要在C++层面实现这使得数据模块想要灵活的在数据流中插入用户定义的Python算子变得较为有挑战性。接下来我们以MindData中的自定义算子注册使用实现为例子展开讨论这部分内容。
![MindData的C层算子和Python层算子](../img/ch07/7.2/operation.png)

View File

@@ -1,3 +1,3 @@
## 章节总结
## 总结
本章我们围绕着易用性、高效性和保序性三个维度展开研究如何设计实现机器学习系统中的数据预处理模块。在易用性维度我们重点探讨了数据模块的编程模型,通过借鉴历史上优秀的并行数据处理系统的设计经验,我们认为基于描述数据集变换的编程抽象较为适合作为数据模块的编程模型,在具体的系统实现中,我们不仅要在上述的编程模型的基础上提供足够多内置算子方便用户的数据预处理编程同时还要考虑如何支持用户方便的使用自定义算子。在高效性方面我们从数据读取和计算两个方面分别介绍了特殊文件格式设计和计算并行架构设计。我们也使用我们在前几章中学习到的模型计算图编译优化技术来优化用户的数据预处理计算图以进一步的达到更高的数据处理吞吐率。机器学习场景中模型对数据输入顺序敏感于是衍生出来保序性这一特殊性质我们在本章中对此进行了分析并通过MindSpore中的Connector的特殊约束实现来展示真实系统实现中如何确保保序性。最后我们也针对部分情况下单机CPU数据预处理性能的问题介绍了当前基于异构处理加速的纵向扩展方案和基于分布式数据预处理的横向扩展方案我们相信读者学习了本章后能够对机器学习系统中的数据模块有深刻的认知也对数据模块未来面临的挑战有所了解。
本章我们围绕着易用性、高效性和保序性三个维度展开研究如何设计实现机器学习系统中的数据预处理模块。在易用性维度我们重点探讨了数据模块的编程模型通过借鉴历史上优秀的并行数据处理系统的设计经验我们认为基于描述数据集变换的编程抽象较为适合作为数据模块的编程模型在具体的系统实现中我们不仅要在上述的编程模型的基础上提供足够多内置算子方便用户的数据预处理编程同时还要考虑如何支持用户方便的使用自定义算子。在高效性方面我们从数据读取和计算两个方面分别介绍了特殊文件格式设计和计算并行架构设计。我们也使用我们在前几章中学习到的模型计算图编译优化技术来优化用户的数据预处理计算图以进一步的达到更高的数据处理吞吐率。机器学习场景中模型对数据输入顺序敏感于是衍生出来保序性这一特殊性质我们在本章中对此进行了分析并通过MindSpore中的Connector的特殊约束实现来展示真实系统实现中如何确保保序性。最后我们也针对部分情况下单机CPU数据预处理性能的问题介绍了当前基于异构处理加速的纵向扩展方案和基于分布式数据预处理的横向扩展方案我们相信读者学习了本章后能够对机器学习系统中的数据模块有深刻的认知也对数据模块未来面临的挑战有所了解。

View File

@@ -1,62 +1,44 @@
## 集合通讯
接下来,我们会讲解常见的大型深度模型训练的系统实现。
这一类系统往往部署在商用的数据中心Data
Centers以及如何在数据中心中高效实现集合通讯从而让分布式训练系统免于网络瓶颈。
接下来,我们会讲解常见的大型深度模型训练的系统实现。这一类系统往往部署在商用的数据中心Data Centers以及如何在数据中心中高效实现集合通讯从而让分布式训练系统免于网络瓶颈。
### 在数据中心的梯度计算
![数据中心](../img/ch09/ch10-datacentre.svg)
![数据中心](../img/ch09/ch10-datacentre.png)
:width:`800px`
:label:`ch10-datacentre`
:numref:`ch10-datacentre` 描述了一个典型的用于深度学习模型训练的数据中心。数据中心中的训练服务器一般会有多个设备。如需增加服务器我们会将多个训练服务器放置在一个机柜Rack同时接入一个架顶交换机Top
of Rack
Switch来连接多个服务器。当一个机柜满的时候我们可以通过在架顶交换机之间增加骨干交换机Spine
Switch接入新的机柜。通过这种方式我们可以在数据中心内不断增加服务器从而为神经网络的训练提供海量的算力和内存。目前的商用数据中心可能拥有超过一百万台服务器。
:numref:`ch10-datacentre` 描述了一个典型的用于深度学习模型训练的数据中心。数据中心中的训练服务器一般会有多个设备。如需增加服务器我们会将多个训练服务器放置在一个机柜Rack同时接入一个架顶交换机Top of Rack Switch来连接多个服务器。当一个机柜满的时候我们可以通过在架顶交换机之间增加骨干交换机Spine Switch接入新的机柜。通过这种方式我们可以在数据中心内不断增加服务器从而为神经网络的训练提供海量的算力和内存。目前的商用数据中心可能拥有超过一百万台服务器。
在数据中心中训练大型神经网络的首要挑战是如何高效计算大量的平均梯度。假设给定一个千亿级别参数的神经网络GPT-3模型含有1750亿参数如果用32位浮点数来表达每一个参数那么每一步训练中一个数据并行模式下的模型副本Model
replica就需要生成700GB的本地梯度数据即 175G $\times$ 4 bytes =
700GB。假如我们有3个模型副本那么至少需要传输1.4TB700GB
$\times$
$(3-1)$)的本地梯度(这是因为$N$个副本中,我们只需要传送$N-1$梯度来完成平均梯度计算。当平均梯度计算完成后我们需要进一步将平均梯度广播到全部的模型副本即1.4TB的数据更新本地参数从而确保模型副本不会偏离Diverge
在数据中心中训练大型神经网络的首要挑战是如何高效计算大量的平均梯度。假设给定一个千亿级别参数的神经网络GPT-3模型含有1750亿参数如果用32位浮点数来表达每一个参数那么每一步训练中一个数据并行模式下的模型副本Model replica就需要生成700GB的本地梯度数据即 175G $\times$ 4 bytes = 700GB。假如我们有3个模型副本那么至少需要传输1.4TB700GB $\times$ $(3-1)$)的本地梯度(这是因为$N$个副本中,我们只需要传送$N-1$梯度来完成平均梯度计算。当平均梯度计算完成后我们需要进一步将平均梯度广播到全部的模型副本即1.4TB的数据更新本地参数从而确保模型副本不会偏离Diverge
当前的数据中心往往使用以太网Ethernet构建网络。主流的商用以太网链路带宽一般是10Gbps和25Gbps。利用以太网传输海量梯度会产生严重的传输延迟从而降低模型训练的速度。新型深度学习训练集群如英伟达的DGX系列机器往往配置有更快的Inifiband。单个InfiniBand链路可以提供100Gbps和200Gbps的带宽。即使拥有这种高速网络传输TB级别的本地梯度依然需要大量延迟1TB的数据需要在200Gbps的链路上传输25秒
为了避免通过网络传输数据现代深度学习服务器一般都会配备多个计算设备例如说DGX-3机器会被配备8个A100
GPU而在一个服务器内的多个设备可以通过高速机内网络互联如NVLink。这种高速机内网络可以提供高达400GB/s的带宽从而让传输TB级别数成为可能。然而受限于单个服务器的散热成本和硬件故障等需求在一个服务器内我们无法无限制的持续增加设备大型深度学习模型的训练最终还是需要多个服务器共同完成。因此计算平均梯度需要同时借助以太网或者是InfiniBand以及服务器内部的NVLink等机内网络。
为了避免通过网络传输数据现代深度学习服务器一般都会配备多个计算设备例如说DGX-3机器会被配备8个A100 GPU而在一个服务器内的多个设备可以通过高速机内网络互联如NVLink。这种高速机内网络可以提供高达400GB/s的带宽从而让传输TB级别数成为可能。然而受限于单个服务器的散热成本和硬件故障等需求在一个服务器内我们无法无限制的持续增加设备大型深度学习模型的训练最终还是需要多个服务器共同完成。因此计算平均梯度需要同时借助以太网或者是InfiniBand以及服务器内部的NVLink等机内网络。
### Allreduce算法
为了在数据中心中高效完成梯度平均的操作,我们往往会实现
Allreduce算法。这个算法诞生的背景是传统计算平均梯度的方法往往是在集群中找出一个设备来收集本地梯度计算平均梯度然后再将平均梯度广播到全部的设备。这种做法易于实现但是其引入了两个问题。首先多设备共同给这个聚合设备发送数据的时候在聚合设备上往往会产生严重的带宽不足和网络拥塞。其次单设备需要负担大量的梯度平均的计算而受限于单设备上的有限算力这种平均计算会受限于算力瓶颈。
为了在数据中心中高效完成梯度平均的操作,我们往往会实现Allreduce算法。这个算法诞生的背景是传统计算平均梯度的方法往往是在集群中找出一个设备来收集本地梯度计算平均梯度然后再将平均梯度广播到全部的设备。这种做法易于实现但是其引入了两个问题。首先多设备共同给这个聚合设备发送数据的时候在聚合设备上往往会产生严重的带宽不足和网络拥塞。其次单设备需要负担大量的梯度平均的计算而受限于单设备上的有限算力这种平均计算会受限于算力瓶颈。
![Allreduce初始状态和终止状态](../img/ch09/ch10-allreduce-state.svg)
![Allreduce初始状态和终止状态](../img/ch09/ch10-allreduce-state.png)
:width:`800px`
:label:`ch10-allreduce-state`
为了解决上述问题人们设计了Allreduce算法。该算法的核心设计思路是让全部的节点参与进来平均梯度的网络通信和平均计算中从而将巨大的网络和算力开销均摊给全部节点从而解决使用单个梯度聚合节点的问题。假设我们有$M$个设备,每个设备有一个模型副本,该模型由$N$个参数构成。那么按照Allreduce算法要求我们需要首先将全部的参数按照设备数量切分成$M$个分区Partition每个分区具有$N/M$个参数。
为了讲解Allreduce的过程我们首先给出这个算法的初始和终止状态。如 :numref:`ch10-allreduce-state`
所示该例子含有3个设备每个设备有一个模型副本这个副本有3个参数。那么按照Allreduce的分区方法参数会被划分成3个分区3个设备而每一个分区有1个参数$N/M$N代表3个参数M代表3个设备。在这个例子中假定设备1拥有参数2,4,6设备2拥有参数1,2,3设备3拥有参数4,8,12那么Allreduce结束后全部的设备都拥有梯度相加后的结果7,14,21其中分区1的结果7是由3个设备中分区1的初始结果相加而成7
= 1 + 2 +
4。为了计算平均梯度每个设备只需要在最后将梯度之和除以设备数量即可分区1的最终结果为7除以3
为了解决上述问题人们设计了Allreduce算法。该算法的核心设计思路是让全部的节点参与进来平均梯度的网络通信和平均计算中从而将巨大的网络和算力开销均摊给全部节点从而解决使用单个梯度聚合节点的问题。假设我们有$M$个设备,每个设备有一个模型副本,该模型由$N$个参数构成。那么按照Allreduce算法要求我们需要首先将全部的参数按照设备数量切分成$M$个分区Partition每个分区具有$N/M$个参数。为了讲解Allreduce的过程我们首先给出这个算法的初始和终止状态。如 :numref:`ch10-allreduce-state` 所示该例子含有3个设备每个设备有一个模型副本这个副本有3个参数。那么按照Allreduce的分区方法参数会被划分成3个分区3个设备而每一个分区有1个参数$N/M$N代表3个参数M代表3个设备。在这个例子中假定设备1拥有参数2,4,6设备2拥有参数1,2,3设备3拥有参数4,8,12那么Allreduce结束后全部的设备都拥有梯度相加后的结果7,14,21其中分区1的结果7是由3个设备中分区1的初始结果相加而成7 = 1 + 2 + 4。为了计算平均梯度每个设备只需要在最后将梯度之和除以设备数量即可分区1的最终结果为7除以3
![Allreduce算法的过程](../img/ch09/ch10-allreduce-process.svg)
![Allreduce算法的过程](../img/ch09/ch10-allreduce-process.png)
:width:`800px`
:label:`ch10-allreduce-process`
Allreduce算法会把梯度的加和计算拆分成$M-1$个Reduce步骤和$M-1$个Broadcast步骤其中$M$是节点的数量。Reduce步骤是为了计算出梯度的和SummationBroadcast步骤是为了把梯度之和广播给全部的节点。为了说明这些步骤的执行过程我们利用
:numref:`ch10-allreduce-process` 。Allreduce算法由Reduce步骤开始在第一个Reduce步骤中Allreduce算法会对全部节点进行配对Pairing让他们共同完成梯度相加的操作。在 :numref:`ch10-allreduce-process` 的第一个Reduce步骤中设备1和设备2进行了配对共同对分区1的数据相加。其中设备2把本地的梯度数据1发送给设备1设备将接收到1和本地的分区1内的梯度数据2进行相加计算出中间intermediate梯度相加的结果3。于此同时设备1和设备3进行配对共同完成对分区3的数据相加。而设备3和设备2进行配对共同完成对于分区2的数据相加。
Allreduce算法会把梯度的加和计算拆分成$M-1$个Reduce步骤和$M-1$个Broadcast步骤其中$M$是节点的数量。Reduce步骤是为了计算出梯度的和SummationBroadcast步骤是为了把梯度之和广播给全部的节点。为了说明这些步骤的执行过程我们利用 :numref:`ch10-allreduce-process` 。Allreduce算法由Reduce步骤开始在第一个Reduce步骤中Allreduce算法会对全部节点进行配对Pairing让他们共同完成梯度相加的操作。在 :numref:`ch10-allreduce-process` 的第一个Reduce步骤中设备1和设备2进行了配对共同对分区1的数据相加。其中设备2把本地的梯度数据1发送给设备1设备将接收到1和本地的分区1内的梯度数据2进行相加计算出中间intermediate梯度相加的结果3。于此同时设备1和设备3进行配对共同完成对分区3的数据相加。而设备3和设备2进行配对共同完成对于分区2的数据相加。
在上述Reduce的步骤中梯度的计算实现了以下几个特性:
- **网络优化:**
全部设备都同时在接收和发送数据利用起了每个设备的入口Ingress和出口Egress带宽。因此Allreduce过程中可利用的带宽是$M \times B$,其中$M$是节点数量,
$B$是节点带宽,从而让系统实现网络带宽上的可扩展性。
全部设备都同时在接收和发送数据利用起了每个设备的入口Ingress和出口Egress带宽。因此Allreduce过程中可利用的带宽是$M \times B$,其中$M$是节点数量$B$是节点带宽,从而让系统实现网络带宽上的可扩展性。
- **算力优化:**
全部设备的处理器都参与了梯度相加的计算。因此Allreduce过程中可利用的处理器是$M \times P$,其中$M$是节点数量,
$P$是处理器数量,从而让系统实现计算上的可扩展性。
全部设备的处理器都参与了梯度相加的计算。因此Allreduce过程中可利用的处理器是$M \times P$,其中$M$是节点数量$P$是处理器数量,从而让系统实现计算上的可扩展性。
- **负载均衡:**
由于数据分区是平均划分的,因此每次设备分摊到的通讯和计算开销是相等的。
@@ -65,6 +47,4 @@ Allreduce算法会把梯度的加和计算拆分成$M-1$个Reduce步骤和$M-1$
接下来Allreduce算法将进入Broadcast阶段。这一阶段的过程和Reduce步骤类似核心区别是节点进行配对后他们不再进行数据相加而是将Reduce的计算结果进行广播。在 :numref:`ch10-allreduce-process` 中的第一个Broadcast步骤中设备1会将分区2的结果14直接写入设备3的分区2中。设备2会讲分区3的结果21直接写入设备1中。设备3会将分区1的结果直接写入设备2中。在一个3个节点的Allreduce集群中我们会重复2次Broadcast步骤来将每个分区的Reduce结果告知全部的节点。
Allreduce算法已经被常见的分布式训练框架包括Horovod, KungFu, TensorFlow
distributed, PyTorch
distributed等支持。当用户选择使用数据并行模式的过程其底层会默认触发。
Allreduce算法已经被常见的分布式训练框架包括Horovod, KungFu, TensorFlow distributed, PyTorch distributed等支持。当用户选择使用数据并行模式的过程其底层会默认触发。

View File

@@ -2,9 +2,7 @@
随着机器学习的进一步发展科学家们设计出更大型更多功能的机器学习模型例如说GPT-3。这种模型含有大量参数需要复杂的计算以及处理海量的数据。单个机器上有限的资源无法满足训练大型机器学习模型的需求。因此我们需要设计分布式训练系统从而将一个机器学习模型任务拆分成多个子任务并将子任务分发给多个计算节点解决资源瓶颈。
在本章节中我们会引入分布式机器学习系统的相关概念设计挑战系统实现和实例研究。我们会首先讨论分布式训练系统的定义设计动机和好处。进一步我们会讨论常见的分布式训练方法数据并行模型并行和流水线并行。在实际中这些分布式训练方法会被参数服务器Parameter
Servers或者是集合通讯库Collective Communication
Libraries实现。不同的系统实现具有各自的优势和劣势。我们会用大型预训练模型和大型深度学习推荐系统作为实例来探讨不同系统实现的利与弊。
在本章节中我们会引入分布式机器学习系统的相关概念设计挑战系统实现和实例研究。我们会首先讨论分布式训练系统的定义设计动机和好处。进一步我们会讨论常见的分布式训练方法数据并行模型并行和流水线并行。在实际中这些分布式训练方法会被参数服务器Parameter Servers或者是集合通讯库Collective Communication Libraries实现。不同的系统实现具有各自的优势和劣势。我们会用大型预训练模型和大型深度学习推荐系统作为实例来探讨不同系统实现的利与弊。
本章的学习目标包括:

View File

@@ -4,20 +4,13 @@
### 概述
![单节点训练系统](../img/ch09/ch10-single-node.svg)
![单节点训练系统](../img/ch09/ch10-single-node.png)
:width:`800px`
:label:`ch10-single-node`
分布式训练系统的设计目标是:将单节点训练系统转化成**等价的**并行训练系统,从而在不影响模型精度的条件下完成训练过程的加速。一个单节点训练系统往往如 :numref:`ch10-single-node`所示。一个训练过程会由多个数据小批次mini-batch完成。在图中一个数据小批次被标示为**数据**。训练系统会利用数据小批次来生成梯度,提升模型精度。这个过程由一个训练**程序**实现。在实际中,这个程序往往实现了一个多层神经网络的执行过程。
该神经网络的执行由一个计算图Computational
Graph表达。这个图有多个相互连接的算子Operator每个算子会拥有计算参数。每个算子往往会实现一个神经网络层Neural
Network Layer而参数则代表了这个层在训练中所更新的的权重Weights
分布式训练系统的设计目标是:将单节点训练系统转化成**等价的**并行训练系统,从而在不影响模型精度的条件下完成训练过程的加速。一个单节点训练系统往往如 :numref:`ch10-single-node`所示。一个训练过程会由多个数据小批次mini-batch完成。在图中一个数据小批次被标示为**数据**。训练系统会利用数据小批次来生成梯度,提升模型精度。这个过程由一个训练**程序**实现。在实际中,这个程序往往实现了一个多层神经网络的执行过程。该神经网络的执行由一个计算图Computational Graph表达。这个图有多个相互连接的算子Operator每个算子会拥有计算参数。每个算子往往会实现一个神经网络层Neural Network Layer而参数则代表了这个层在训练中所更新的的权重Weights
为了更新参数,计算图的执行会分为**前向**传播和**反向**传播两个阶段。前向传播的第一步会将数据读入第一个算子该算子会根据当前的参数计算出传播给下一个算子的数据。算子依次重复这个前向传播的过程算子1
-\> 算子2 -\>
算子3直到最后一个算子结束。最后的算子随之马上开始反向传播。反向传播中每个算子依次计算出梯度梯度3
-\> 梯度2 -\>
梯度1并利用梯度更新本地的参数。反向传播最终在第一个算子结束。反向传播的结束也标志本次数据小批次的结束系统随之读取下一个小批次继续更新模型。
为了更新参数,计算图的执行会分为**前向**传播和**反向**传播两个阶段。前向传播的第一步会将数据读入第一个算子该算子会根据当前的参数计算出传播给下一个算子的数据。算子依次重复这个前向传播的过程算子1 -\> 算子2 -\> 算子3直到最后一个算子结束。最后的算子随之马上开始反向传播。反向传播中每个算子依次计算出梯度梯度3 -\> 梯度2 -\> 梯度1并利用梯度更新本地的参数。反向传播最终在第一个算子结束。反向传播的结束也标志本次数据小批次的结束系统随之读取下一个小批次继续更新模型。
:分布式训练方法分类
@@ -27,27 +20,19 @@ Network Layer而参数则代表了这个层在训练中所更新的的权
| 多程序 | 多程序单数据:模型并行 | 多程序多数据:混合并行 |
:label:`ch10-parallel-methods`
给定一个单节点训练系统,人们会对**数据**和**程序**分区Partition从而完成并行加速。 :numref:`ch10-parallel-methods`总结了不同的切分方法。单节点训练系统可以被归类于
单程序单数据模式。而假如用户希望使用更多的设备来实现并行计算,他们首先可以选择对数据进行分区,并将同一个程序复制到多个设备上并行执行。这种方式是单程序多数据模式,常被称为**数据并行**Data
Parallelism。另一种并行方式是对程序进行分区程序的算子会被分发给多个设备按照依次完成。这种模式是
多程序单数据模式,常被称为**模型并行**Model
Parallelism。当训练超大型智能模型时开发人们往往要同时对数据和程序进行切分从而实现最高程度的并行。这种模式是多程序多数据模式常被称为**混合并行**Hybrid
Parallelism
给定一个单节点训练系统,人们会对**数据**和**程序**分区Partition从而完成并行加速。 :numref:`ch10-parallel-methods`总结了不同的切分方法。单节点训练系统可以被归类于单程序单数据模式。而假如用户希望使用更多的设备来实现并行计算,他们首先可以选择对数据进行分区,并将同一个程序复制到多个设备上并行执行。这种方式是单程序多数据模式,常被称为**数据并行**Data Parallelism。另一种并行方式是对程序进行分区程序的算子会被分发给多个设备按照依次完成。这种模式是多程序单数据模式常被称为**模型并行**Model Parallelism。当训练超大型智能模型时开发人们往往要同时对数据和程序进行切分从而实现最高程度的并行。这种模式是多程序多数据模式常被称为**混合并行**Hybrid Parallelism
接下来,我们详细讲解各种并行方法的执行过程。
### 数据并行
![数据并行训练系统](../img/ch09/ch10-data-parallel.svg)
![数据并行训练系统](../img/ch09/ch10-data-parallel.png)
:width:`800px`
:label:`ch10-data-parallel`
数据并行往往可以解决单节点的算力不足。这种并行方式在人工智能框架中最为常见具体实现包括TensorFlow
DistributedStrategyPyTorch DistributedHorovod DistributedOptimizer等。在一个数据并行系统中假设用户给定一个训练批大小$N$,并且希望使用$M$个并行设备来加速训练。那么,该训练批大小会被分为$M$个分区,每个设备会分配到$N/M$个训练样本。这些设备共享一个训练程序的副本,在不同数据分区上独立执行,计算梯度。不同的设备(假设设备编号为$i$)会根据本地的训练样本估计出梯度$G_i$。为了确保训练程序参数的一致性,本地梯度$G_i$需要聚合,计算出平均梯度$(\sum_{i=1}^{N} G_i) / N$。最终,训练程序利用平均梯度修正模型参数,完成小批量的训练。
数据并行往往可以解决单节点的算力不足。这种并行方式在人工智能框架中最为常见具体实现包括TensorFlow DistributedStrategyPyTorch DistributedHorovod DistributedOptimizer等。在一个数据并行系统中假设用户给定一个训练批大小$N$,并且希望使用$M$个并行设备来加速训练。那么,该训练批大小会被分为$M$个分区,每个设备会分配到$N/M$个训练样本。这些设备共享一个训练程序的副本,在不同数据分区上独立执行,计算梯度。不同的设备(假设设备编号为$i$)会根据本地的训练样本估计出梯度$G_i$。为了确保训练程序参数的一致性,本地梯度$G_i$需要聚合,计算出平均梯度$(\sum_{i=1}^{N} G_i) / N$。最终,训练程序利用平均梯度修正模型参数,完成小批量的训练。
:numref:`ch10-data-parallel`展示了2个设备构成的数据并行例子。假设用户给定的批大小Batch
Size是64那么每个设备会分配到32个训练样本并且具有相同的神经网络参数程序副本。本地的训练样本会依次通过这个程序副本中的算子完成前向传播和反向传播。在反向传播的过程中程序副本会生成局部梯度。不同设备上对应的局部梯度如设备1和设备2上各自的梯度1会进行聚合从而计算平均梯度。这个聚合的过程往往由集合通讯库Collective
Communication的Allreduce操作来完成。
:numref:`ch10-data-parallel`展示了2个设备构成的数据并行例子。假设用户给定的批大小Batch Size是64那么每个设备会分配到32个训练样本并且具有相同的神经网络参数程序副本。本地的训练样本会依次通过这个程序副本中的算子完成前向传播和反向传播。在反向传播的过程中程序副本会生成局部梯度。不同设备上对应的局部梯度如设备1和设备2上各自的梯度1会进行聚合从而计算平均梯度。这个聚合的过程往往由集合通讯库Collective Communication的Allreduce操作来完成。
### 模型并行
@@ -55,17 +40,13 @@ Communication的Allreduce操作来完成。
:width:`800px`
:label:`ch10-model-parallel-intra-op`
模型并行往往用于解决单节点的内存不足问题。一个常见的内存不足场景是模型中含有大型算子例如说深度神经网络中需要计算大量分类的全连接层Fully
Connected
Layer。完成这种大型算子计算所需的内存可能超过单设备的内存容量。那么我们需要对这个大型算子进行切分。假设这个算子具有$P$个参数,而我们拥有$N$个设备,那么我们可以将$P$个参数平均分配给$N$个设备(每个设备分配$P/N$个参数),从而让每个设备负责更少的计算量,能够在内存容量的限制下完成前向传播和反向传播中所需的计算。这种切分方式是模型并行的应用,被称为**算子内并行**Intra-operator
Parallelism
模型并行往往用于解决单节点的内存不足问题。一个常见的内存不足场景是模型中含有大型算子例如说深度神经网络中需要计算大量分类的全连接层Fully Connected Layer。完成这种大型算子计算所需的内存可能超过单设备的内存容量。那么我们需要对这个大型算子进行切分。假设这个算子具有$P$个参数,而我们拥有$N$个设备,那么我们可以将$P$个参数平均分配给$N$个设备(每个设备分配$P/N$个参数),从而让每个设备负责更少的计算量,能够在内存容量的限制下完成前向传播和反向传播中所需的计算。这种切分方式是模型并行的应用,被称为**算子内并行**Intra-operator Parallelism
:numref:`ch10-model-parallel-intra-op`给出了一个由2个设备实现的算子内并行的例子。在这个例子中假设一个神经网络具有2个算子算子1的计算包含正向和反向传播需要预留16G的内存算子2的计算需要预留1G的内存。而本例中的设备最多可以提供10G的内存。为了完成这个神经网络的训练我们需要对算子1实现并行。具体做法是将算子1的参数平均分区设备1和设备2各负责其中部分算子1的参数。由于设备1和设备2的参数不同因此它们各自负责程序分区1和程序分区2。在训练这个神经网络的过程中数据小批量会首先传给算子1。由于算子1的参数分别由2个设备负责因此数据会被广播给这2个设备。不同设备根据本地的参数分区完成前向计算生成的本地计算结果需要进一步合并Combine发送给下游的算子2。在反向传播中算子2的数据会被广播给设备1和设备2这些设备根据本地的算子1分区各自完成局部的反向计算。计算结果进一步合并传播回数据最终完成反向传播。
另一种内存不足的场景是:模型的总内存需求超过了单设备的内存容量。在这种场景下,假如我们总共有$N$个算子和$M$个设备,我们可以将算子平摊给这$M$个设备,让每个设备仅需负责$N/M$个算子的前向和反向计算,降低设备的内存开销。这种并行方式是模型并行的另一种应用,被称为**算子间并行**Inter-operator
Parallelism
另一种内存不足的场景是:模型的总内存需求超过了单设备的内存容量。在这种场景下,假如我们总共有$N$个算子和$M$个设备,我们可以将算子平摊给这$M$个设备,让每个设备仅需负责$N/M$个算子的前向和反向计算,降低设备的内存开销。这种并行方式是模型并行的另一种应用,被称为**算子间并行**Inter-operator Parallelism
![模型并行系统:算子间并行](../img/ch09/ch10-model-parallel-inter-op.svg)
![模型并行系统:算子间并行](../img/ch09/ch10-model-parallel-inter-op.png)
:width:`800px`
:label:`ch10-model-parallel-inter-op`
@@ -73,7 +54,7 @@ Parallelism
### 混合并行
![混合并行系统](../img/ch09/ch10-hybrid-parallel.svg)
![混合并行系统](../img/ch09/ch10-hybrid-parallel.png)
:width:`800px`
:label:`ch10-hybrid-parallel`

View File

@@ -2,49 +2,36 @@
### 设计动机
接下来,我们详细讨论分布式训练系统的设计动机
接下来,我们详细讨论分布式训练系统的设计动机
![对比机器学习模型参数量增长和计算硬件的算力增长](../img/ch09/ch10-computation-increase.svg)
![对比机器学习模型参数量增长和计算硬件的算力增长](../img/ch09/ch10-computation-increase.png)
:width:`800px`
:label:`ch10-computation-increase`
##### 算力不足
单处理器的算力不足是促使人们设计分布式训练系统的一个主要原因。一个处理器的算力可以用**每秒钟浮点数操作**Floating
Point Operations Per SecondFLOPS来衡量。
如 :numref:`ch10-computation-increase`所示根据摩尔定律Moore's
Law中央处理器的算力每18个月增长2倍。虽然计算加速卡如GPU和Tensor
Processing
UnitTPU针对机器学习计算如矩阵相乘提供了大量的算力。这些加速卡的发展最终也受限于摩尔定律增长速度也停留在每18个月2倍。而与此同时机器学习模型正在快速发展。短短数年我们从仅能识别有限物体的AlexNet模型一路发展到在复杂任务中打败人类的AlphaStar。这期间模型对于算力需求每18个月增长了35倍。解决处理器性能和算力需求之间的鸿沟
的关键就在于利用分布式计算。通过大型数据中心和云计算设施,我们可以快速获取大量的处理器。通过分布式训练系统有效管理这些处理器,我们可以实现算力的快速增长,从而持续满足模型的需求。
单处理器的算力不足是促使人们设计分布式训练系统的一个主要原因。一个处理器的算力可以用**每秒钟浮点数操作**Floating Point Operations Per SecondFLOPS来衡量。如 :numref:`ch10-computation-increase`所示根据摩尔定律Moore's Law中央处理器的算力每18个月增长2倍。虽然计算加速卡如GPU和Tensor Processing UnitTPU针对机器学习计算如矩阵相乘提供了大量的算力。这些加速卡的发展最终也受限于摩尔定律增长速度也停留在每18个月2倍。而与此同时机器学习模型正在快速发展。短短数年我们从仅能识别有限物体的AlexNet模型一路发展到在复杂任务中打败人类的AlphaStar。这期间模型对于算力需求每18个月增长了35倍。解决处理器性能和算力需求之间的鸿沟的关键就在于利用分布式计算。通过大型数据中心和云计算设施我们可以快速获取大量的处理器。通过分布式训练系统有效管理这些处理器我们可以实现算力的快速增长从而持续满足模型的需求。
##### 内存不足
在训练机器学习模型的过程中训练系统需要在内存中存储大量数据。这些数据包括模型参数Parameters以及训练和更新这些参数所产生的中间数据如特征图Feature
Map和梯度Gradients。假设一个深度神经网络模型具有10亿的参数所有特征图共有20亿参数每个参数都由一个32位浮点数表达而更新这些参数至少还需要产生与特征图和参数等量的梯度。由于一个32位浮点数需要4个字节Byte的内存来存储那么训练这个10亿规模的模型就需要至少24GB$24 \times 10^9$
Byte的内存。现在随着大型预训练模型的崛起一个深度神经网络如GPT-3会拥有超过千亿的参数。假设我们依然使用32位浮点数来存储参数激活值和梯度那么训练这个模型就至少需要1.2TB的内存。而如今的训练加速卡如NVIDIA
A100仅能提供最高80GB的内存。单卡内存空间的增长受到硬件规格散热和成本等诸多因素难以进一步快速增长。因此我们需要分布式训练系统来同时使用数百个训练加速卡从而为千亿级别的模型提供所需的TB级别的内存。
在训练机器学习模型的过程中训练系统需要在内存中存储大量数据。这些数据包括模型参数Parameters以及训练和更新这些参数所产生的中间数据如特征图Feature Map和梯度Gradients。假设一个深度神经网络模型具有10亿的参数所有特征图共有20亿参数每个参数都由一个32位浮点数表达而更新这些参数至少还需要产生与特征图和参数等量的梯度。由于一个32位浮点数需要4个字节Byte的内存来存储那么训练这个10亿规模的模型就需要至少24GB$24 \times 10^9$ Byte的内存。现在随着大型预训练模型的崛起一个深度神经网络如GPT-3会拥有超过千亿的参数。假设我们依然使用32位浮点数来存储参数激活值和梯度那么训练这个模型就至少需要1.2TB的内存。而如今的训练加速卡如NVIDIA A100仅能提供最高80GB的内存。单卡内存空间的增长受到硬件规格散热和成本等诸多因素难以进一步快速增长。因此我们需要分布式训练系统来同时使用数百个训练加速卡从而为千亿级别的模型提供所需的TB级别的内存。
### 分布式训练架构
受限于单节点的有限算力,内存和存储资源,人们把关注投向了日益成熟的云计算数据中心。一个数据中心管理着数十万个计算服务器。随着数据中心的全球部署,人们可以很方便地获得数百个服务器。这些服务器可以通过分布式训练系统来协调和管理,解决训练大型机器学习模型过程遇到的算力,内存和存储不足,从而完成训练过程的加速。
![单节点计算和多节点分布式计算](../img/ch09/ch10-single-vs-multi.svg)
![单节点计算和多节点分布式计算](../img/ch09/ch10-single-vs-multi.png)
:width:`800px`
:label:`ch10-single-vs-multi`
在设计分布式训练系统的过程中,我们需要找出有资源瓶颈的计算任务,根据计算任务的特点,将其拆分成多个子任务,然后将子任务分发给多个节点(可以是服务器,机器,或者是加速卡)并行完成。
:numref:`ch10-single-vs-multi`描述了如何将单节点执行转换为分布式执行的一般过程。在机器学习系统中一个计算任务往往会有一组数据例如训练样本或者任务例如算子作为输入利用一个计算节点例如GPU生成一组输出例如梯度。假如单节点成为瓶颈我们可以利用分布式计算进行加速。分布式执行一般具有三个步骤第一步我们需要将输入进行**切分**。第二步,每个输入部分会分发给不同的计算节点,实现**并行**计算。第三步,每个计算节点的输出,进一步**合并**,最终得到和单节点等价的计算结果。这种切分-并行-合并的模式本质上实现了分而治之算法Divide-and-Conquer
Algorithm的设计思想由于每个计算节点只需要负责更小的子任务因此其可以更快速的完成计算最终形成对整个计算过程的加速。
在设计分布式训练系统的过程中,我们需要找出有资源瓶颈的计算任务,根据计算任务的特点,将其拆分成多个子任务,然后将子任务分发给多个节点(可以是服务器,机器,或者是加速卡)并行完成。 :numref:`ch10-single-vs-multi`描述了如何将单节点执行转换为分布式执行的一般过程。在机器学习系统中一个计算任务往往会有一组数据例如训练样本或者任务例如算子作为输入利用一个计算节点例如GPU生成一组输出例如梯度。假如单节点成为瓶颈我们可以利用分布式计算进行加速。分布式执行一般具有三个步骤第一步我们需要将输入进行**切分**。第二步,每个输入部分会分发给不同的计算节点,实现**并行**计算。第三步,每个计算节点的输出,进一步**合并**,最终得到和单节点等价的计算结果。这种切分-并行-合并的模式本质上实现了分而治之算法Divide-and-Conquer Algorithm的设计思想由于每个计算节点只需要负责更小的子任务因此其可以更快速的完成计算最终形成对整个计算过程的加速。
### 用户益处
通过使用分布式训练系统,我们往往可以获得以下几个关键好处:
- **提升系统性能**使用分布式训练往往可以带来训练性能的巨大提升。一个分布式训练系统往往用以下这个指标来衡量性能到达目标精度所需的时间time-to-accuracy。这个指标由两个参数决定:
一个数据周期所需的完成时间,以及一个数据周期模型所提升的精度。通过持续增加并行处理节点,我们可以将数据周期的完成时间不断变短,最终显著减少到达目标精度所需的时间。
- **提升系统性能**使用分布式训练往往可以带来训练性能的巨大提升。一个分布式训练系统往往用以下这个指标来衡量性能到达目标精度所需的时间time-to-accuracy。这个指标由两个参数决定:一个数据周期所需的完成时间,以及一个数据周期模型所提升的精度。通过持续增加并行处理节点,我们可以将数据周期的完成时间不断变短,最终显著减少到达目标精度所需的时间。
- **经济性Economy**:使用分布式训练,我们也可以进一步减少训练及其模型所需的成本。受限于单节点散热的上限,单节点的算力越高,所需的散热硬件成本也更高。因此,在提供同等的算力的条件下,组合多个计算节点是一个更加经济高效的方式。这促使需要云服务商(如亚马逊和微软等)更加注重给用户提供成本高效的分布式机器学习系统。
- **经济性Economy**:使用分布式训练,我们也可以进一步减少训练及其模型所需的成本。受限于单节点散热的上限,单节点的算力越高,所需的散热硬件成本也更高。因此,在提供同等的算力的条件下,组合多个计算节点是一个更加经济高效的方式。这促使云服务商(如亚马逊和微软等)需要更加注重给用户提供成本高效的分布式机器学习系统。
- **抵御硬件故障**分布式训练系统同时能有效提升抵御硬件故障的能力。机器学习训练集群往往由商用硬件Commodity
Hardware组成这类硬件例如说磁盘和网卡运行一定周期就会产生故障。而仅使用单个硬件进行训练的话那么一个硬件的故障就会造成整个训练的任务的失败。通过将这个训练任务又多个硬件共同完成即使一个硬件故障了我们也可以通过将这个硬件上相应的计算子任务转移给其余硬件继续完成训练从而避免训练任务的失败。
- **抵御硬件故障**分布式训练系统同时能有效提升抵御硬件故障的能力。机器学习训练集群往往由商用硬件Commodity Hardware组成这类硬件例如说磁盘和网卡运行一定周期就会产生故障。而仅使用单个硬件进行训练的话那么一个硬件的故障就会造成整个训练的任务的失败。通过将这个训练任务由多个硬件共同完成即使一个硬件故障了我们也可以通过将这个硬件上相应的计算子任务转移给其余硬件继续完成训练从而避免训练任务的失败。

View File

@@ -4,51 +4,32 @@
### 计算和存储分离
利用参数服务器的其中一个核心需求是实现计算和存储的分离。在训练模型中计算可以被理解为计算更新模型参数所需要的计算例如说计算本地梯度和计算平均梯度而存储可以被理解为将模型参数存储在内存设备中例如说主机内存加速卡内存和SSD设备。传统的神经网络训练中计算往往是核心瓶颈因此我们只需要配置有合适数量的带有加速卡的服务器常被称为训练服务器Training
servers
利用参数服务器的其中一个核心需求是实现计算和存储的分离。在训练模型中计算可以被理解为计算更新模型参数所需要的计算例如说计算本地梯度和计算平均梯度而存储可以被理解为将模型参数存储在内存设备中例如说主机内存加速卡内存和SSD设备。传统的神经网络训练中计算往往是核心瓶颈因此我们只需要配置有合适数量的带有加速卡的服务器常被称为训练服务器Training servers
随着机器学习的发展新型的稀疏模型被开发出来。相比于传统的神经网络训练稀疏模型的训练往往不需要大量昂贵的计算加速卡GPU而需要海量的内存来存储嵌入表Embedding
table。例如说一个大型深度学习推荐系统中它们往往使用小型的深度神经网络如Multi-layer
Perception训练这种神经网络只需要几个GPU即可。而另一方面推荐系统中往往需要存储PB级别的嵌入表。嵌入表往往由推荐系统的用户特征User
feature和产品特征Item
feature构成。这些特征往往是大型向量Vector。现代推荐系统需要服务数亿的用户推荐数以千万的商品。假设用户的特征是1MB而系统需要服务10亿的用户那么用户的嵌入表就会有1PB的大小。而这个大小远远超过了一个深度学习服务器所具有的内存。假如我们部署大量的昂贵的深度学习服务器来存储海量嵌入表那么这些服务器上的加速卡的使用率将会极低无法实现对于硬件的高效利用。
随着机器学习的发展新型的稀疏模型被开发出来。相比于传统的神经网络训练稀疏模型的训练往往不需要大量昂贵的计算加速卡GPU而需要海量的内存来存储嵌入表Embedding table。例如说一个大型深度学习推荐系统中它们往往使用小型的深度神经网络如Multi-layer Perception训练这种神经网络只需要几个GPU即可。而另一方面推荐系统中往往需要存储PB级别的嵌入表。嵌入表往往由推荐系统的用户特征User feature和产品特征Item feature构成。这些特征往往是大型向量Vector。现代推荐系统需要服务数亿的用户推荐数以千万的商品。假设用户的特征是1MB而系统需要服务10亿的用户那么用户的嵌入表就会有1PB的大小。而这个大小远远超过了一个深度学习服务器所具有的内存。假如我们部署大量的昂贵的深度学习服务器来存储海量嵌入表那么这些服务器上的加速卡的使用率将会极低无法实现对于硬件的高效利用。
![参数服务器](../img/ch09/ch10-parameter-servers.svg)
![参数服务器](../img/ch09/ch10-parameter-servers.png)
:width:`800px`
:label:`ch10-parameter-servers`
为了解决上述问题,人们往往会在稀疏模型集群中混合部署:训练服务器和参数服务器,从而实现对于计算需求和内存需求分别满足。 :numref:`ch10-parameter-servers` 描述了带有参数服务器的机器学习集群。这个集群中含有2个训练服务器和2个参数服务器训练服务器一般是拥有加速卡的计算优化服务器Compute-optimised
server。而参数服务器一般是内存优化服务器Memory-optimised
server其的内存大小一般远远大于计算优化服务器。在一个稀疏模型中往往拥有神经网络参数和嵌入表参数。神经网络较小其可以存储在训练服务器内存中。而嵌入表很大因此需要存储在额外的参数服务器中。参数服务器一般会按照键-值对Key-value
pairs的方式来存储参数。常用的键包括用户名User ID产品名Item
ID或者是参数名Parameter
Key。常用的值是以多维度向量Multi-dimensional
tensors表达的模型参数。假如存在多个参数服务器参数服务器会用数据分区函数例如哈希函数和区域划分将健-值映射到不同参数服务器上。
为了解决上述问题,人们往往会在稀疏模型集群中混合部署:训练服务器和参数服务器,从而实现对于计算需求和内存需求分别满足。 :numref:`ch10-parameter-servers` 描述了带有参数服务器的机器学习集群。这个集群中含有2个训练服务器和2个参数服务器训练服务器一般是拥有加速卡的计算优化服务器Compute-optimised server。而参数服务器一般是内存优化服务器Memory-optimised server其的内存大小一般远远大于计算优化服务器。在一个稀疏模型中往往拥有神经网络参数和嵌入表参数。神经网络较小其可以存储在训练服务器内存中。而嵌入表很大因此需要存储在额外的参数服务器中。参数服务器一般会按照键-值对Key-value pairs的方式来存储参数。常用的键包括用户名User ID产品名Item ID或者是参数名Parameter Key。常用的值是以多维度向量Multi-dimensional tensors表达的模型参数。假如存在多个参数服务器参数服务器会用数据分区函数例如哈希函数和区域划分将健-值映射到不同参数服务器上。
为了完成对于模型的训练在每一步训练中训练服务器会根据当前的小批量训练数据找到本批量中需要用到的参数。例如说本小批量数据只会训练部分用户的特征那么这些用户的特征才会需要。根据参数服务器的数据分区函数训练服务器可以知道参数当前在哪个参数服务器上它们因此会用参数的键Key向对应的参数服务器发起拉取请求Pull
request。参数服务器响应并返回对应的值Value。训练服务器将拉取的参数往往是嵌入表和本地内存中的模型参数往往是神经网络进行合并从而对合并的模型进行训练计算梯度。假如训练服务器实现了数据并行那么训练服务器计算出的本地梯度需要利用Allreduce计算出平均梯度。对于训练服务器本地内存中的参数训练服务器可以马上利用平均梯度进行修改。对于在参数服务器中存储的参数训练服务器发起推送请求Push
request将平均梯度发送到参数服务器参数服务器更新本地存储的参数。
为了完成对于模型的训练在每一步训练中训练服务器会根据当前的小批量训练数据找到本批量中需要用到的参数。例如说本小批量数据只会训练部分用户的特征那么这些用户的特征才会需要。根据参数服务器的数据分区函数训练服务器可以知道参数当前在哪个参数服务器上它们因此会用参数的键Key向对应的参数服务器发起拉取请求Pull request。参数服务器响应并返回对应的值Value。训练服务器将拉取的参数往往是嵌入表和本地内存中的模型参数往往是神经网络进行合并从而对合并的模型进行训练计算梯度。假如训练服务器实现了数据并行那么训练服务器计算出的本地梯度需要利用Allreduce计算出平均梯度。对于训练服务器本地内存中的参数训练服务器可以马上利用平均梯度进行修改。对于在参数服务器中存储的参数训练服务器发起推送请求Push request将平均梯度发送到参数服务器参数服务器更新本地存储的参数。
在以上的参数服务器架构中机器学习集群拥有者可以灵活的根据梯度计算所需要算力配置合理数量的训练服务器。他们也可以根据参数的数量配置大部分的稀疏参数Sparse
parameters在参数服务器中仅留下小部分的密集参数Dense
parameters在训练服务器中。密集参数和稀疏参数的核心区别是稀疏参数在每一步训练不一定都会被用到他们需要根据当前训练小批量来决定。而密集参数每一步训练都需要用到。因此为了频繁从参数服务器中拉取密集参数往往会存储在训练服务器中。
在以上的参数服务器架构中机器学习集群拥有者可以灵活的根据梯度计算所需要算力配置合理数量的训练服务器。他们也可以根据参数的数量配置大部分的稀疏参数Sparse parameters在参数服务器中仅留下小部分的密集参数Dense parameters在训练服务器中。密集参数和稀疏参数的核心区别是稀疏参数在每一步训练不一定都会被用到他们需要根据当前训练小批量来决定。而密集参数每一步训练都需要用到。因此为了避免频繁从参数服务器中拉取密集参数往往会存储在训练服务器中。
### 数据副本
在参数服务器的实际部署中人们往往需要解决数据热点问题。互联网数据往往符合幂律概率Power-law
distribution这会导致部分稀疏参数在训练过程中被访问的次数会显著高于其他参数。例如说热门商品的特征向量被训练服务器拉取的次数就会远远高于非热门商品。因此存储了热门数据的参数服务器所承受的数据拉取和推送请求会远远高于其他参数服务器因此形成数据热点伤害了系统的可扩展性。
在参数服务器的实际部署中人们往往需要解决数据热点问题。互联网数据往往符合幂律概率Power-law distribution这会导致部分稀疏参数在训练过程中被访问的次数会显著高于其他参数。例如说热门商品的特征向量被训练服务器拉取的次数就会远远高于非热门商品。因此存储了热门数据的参数服务器所承受的数据拉取和推送请求会远远高于其他参数服务器因此形成数据热点伤害了系统的可扩展性。
解决数据热点问题的关键是利用在没有副本的情况下通用的做法是每隔一段时间将所有参数在外存中保存一份检查点checkpoint。当出现机器故障时首先所有的训练必须停止等待故障的机器恢复上线然后从外存中重新加载检查点。这就会导致从上一次保存检查点到故障发生时的数据全部丢失。保存一次检查点的开销随模型大小而增加训练大模型时通常每隔1-2小时保存一次。因此无副本的参数服务器如果发生故障会丢失最多1-2小时的数据。
解决参数服务器故障和数据热点问题的常用技术是构建模型主从副本Master-slave
replication。一份参数在多个机器上拥有副本并指定其中一个副本作为主副本。训练服务器的所有更新操作都向主副本写入并同步至从副本上。如何取得共识确定哪一个副本是主副本是分布式系统领域一个经典问题已经有了相当多的成熟的算法例如Paxos和Raft。此外主副本上的更新如何复制到从副本上也同样是分布式系统领域的经典共识问题。通常系统设计者需要在可用性Availability和一致性Consistency之间做出取舍。如果参数服务器副本间采用强一致性的复制协议例如链式副本(Chain replication))则可能导致训练服务器的推送请求失败,即参数服务器不可用。反之,如果参数服务器采用弱一致性的复制协议,则可能导致副本间存储的参数不一致。
解决参数服务器故障和数据热点问题的常用技术是构建模型主从副本Master-slave replication。一份参数在多个机器上拥有副本并指定其中一个副本作为主副本。训练服务器的所有更新操作都向主副本写入并同步至从副本上。如何取得共识确定哪一个副本是主副本是分布式系统领域一个经典问题已经有了相当多的成熟的算法例如Paxos和Raft。此外主副本上的更新如何复制到从副本上也同样是分布式系统领域的经典共识问题。通常系统设计者需要在可用性Availability和一致性Consistency之间做出取舍。如果参数服务器副本间采用强一致性的复制协议例如链式副本(Chain replication))则可能导致训练服务器的推送请求失败,即参数服务器不可用。反之,如果参数服务器采用弱一致性的复制协议,则可能导致副本间存储的参数不一致。
### 掉队者问题
参数服务器的另一大核心作用是可以让用户方便解决掉队者问题。在之前的讨论中在每一步训练结束后训练服务器都需要计算平均梯度来对每一个模型副本进行更新从而保证下一步训练开始前全部模型副本的参数的一致性这种对于参数一致性的确保一般被称为同步训练Synchronous
training。同步训练一般会有助于训练系统达到更好的模型精度但是当系统规模变大我们往往会在系统中引入掉队者Straggler。掉队者出现的原因很多。常见的原因包括掉队者设备可能和其他设备不在同一个机柜中因此掉队者的通讯带宽显著小于其他设备。另外掉队者设备也可能和其他进程共享本地的服务器计算和通讯资源形成资源竞争从而降低了性能。
参数服务器的另一大核心作用是可以让用户方便解决掉队者问题。在之前的讨论中在每一步训练结束后训练服务器都需要计算平均梯度来对每一个模型副本进行更新从而保证下一步训练开始前全部模型副本的参数的一致性这种对于参数一致性的确保一般被称为同步训练Synchronous training。同步训练一般会有助于训练系统达到更好的模型精度但是当系统规模变大我们往往会在系统中引入掉队者Straggler。掉队者出现的原因很多。常见的原因包括掉队者设备可能和其他设备不在同一个机柜中因此掉队者的通讯带宽显著小于其他设备。另外掉队者设备也可能和其他进程共享本地的服务器计算和通讯资源形成资源竞争从而降低了性能。
掉队者对于基于Allreduce的同步训练系统的性能有显著影响这是因为Allreduce让全部节点参与到平均梯度的计算和通讯中而每个节点负责等量的数据。因此任何一个掉队者的出现都会让整个Allreduce操作延迟完成。为了解决这个问题人们也会使用参数服务器来计算平均梯度。一种常见的设计是训练服务器训练出本地梯度后会把本地梯度全部推送到参数服务器。参数服务器在等到一定数据训练服务器例如说90%的训练服务器)的本地梯度后,就开始计算平均梯度。这样可以确保平均梯度的计算不会被落后者的出现延误。计算好的平均梯度马上推送给全部训练服务器,开始下一轮训练。
解决掉队者的另外一种常见做法是利用参数服务器实现**异步训练**(Asynchronous
training)。在一个异步训练系统中,每个训练服务器在训练开始时,有相同的模型参数副本。在训练中,他们计算出本地梯度后会马上将本地梯度推送到参数服务器,参数服务器将推送的梯度立刻用于更新参数,并把更新好的参数马上推送回对应的训练服务器。在这个过程中,不同的训练服务器很可能会使用不同版本的模型参数进行本地梯度的计算,这种做法有可能会伤害模型的精度,但它同时让不同训练服务器可以按照各自的运算速度来推送和拉取参数,而无需等待同伴,因此避免了掉队者对于整个集群性能的影响。
解决掉队者的另外一种常见做法是利用参数服务器实现**异步训练**(Asynchronous training)。在一个异步训练系统中,每个训练服务器在训练开始时,有相同的模型参数副本。在训练中,他们计算出本地梯度后会马上将本地梯度推送到参数服务器,参数服务器将推送的梯度立刻用于更新参数,并把更新好的参数马上推送回对应的训练服务器。在这个过程中,不同的训练服务器很可能会使用不同版本的模型参数进行本地梯度的计算,这种做法有可能会伤害模型的精度,但它同时让不同训练服务器可以按照各自的运算速度来推送和拉取参数,而无需等待同伴,因此避免了掉队者对于整个集群性能的影响。

View File

@@ -1,20 +1,14 @@
## 流水线并行
在数据并行和模型并行以外,流水线并行是另一种常用的并行加速方法。
流水线并行往往被应用在大型模型并行系统中。这种系统通过算子内并行和算子间并行解决单设备内存不足的问题。
然而当这类系统的运行中计算图中的下游设备需要长期持续处于空闲状态等待上游设备的计算完成才可以开始计算这极大降低了设备的平均使用率。这种现象被称为模型并行空洞Model
Parallelism Bubble
在数据并行和模型并行以外,流水线并行是另一种常用的并行加速方法。流水线并行往往被应用在大型模型并行系统中。这种系统通过算子内并行和算子间并行解决单设备内存不足的问题。然而当这类系统的运行中计算图中的下游设备需要长期持续处于空闲状态等待上游设备的计算完成才可以开始计算这极大降低了设备的平均使用率。这种现象被称为模型并行空洞Model Parallelism Bubble
![流水线并行系统。注意图的F和B任务的编号需要更新](../img/ch09/ch10-pipeline-parallel.svg)
![流水线并行系统。$F_{i,j}$表示第$j$个微批量的第$i$个前向stage$B_{i,j}$表示第$j$个微批量的第$i$个反向stage。](../img/ch09/ch10-pipeline-parallel.png)
:width:`800px`
:label:`ch10-pipeline-parallel`
为了减少空洞提升设备使用率我们可以在模型并行系统中构建流水线。这种做法的核心想法是将一个数据小批量Data
Mini-batch划分为多个微批量Micro-batch。假设一个数据小批量有$D$个训练数据,这个小批量可以被划分为$M$个微批量,那么微批量的大小就是$D/M$。每个微批量相应进入训练系统完成前向传播Forwards
propagation和反向传播Backwards
propagation计算出梯度。每个微批量对应的梯度将会缓存等到全部微批量完成缓存的梯度会被加和算出平均梯度更新模型参数。
为了减少空洞提升设备使用率我们可以在模型并行系统中构建流水线。这种做法的核心想法是将一个数据小批量Data Mini-batch划分为多个微批量Micro-batch。假设一个数据小批量有$D$个训练数据,这个小批量可以被划分为$M$个微批量,那么微批量的大小就是$D/M$。每个微批量相应进入训练系统完成前向传播Forwards propagation和反向传播Backwards propagation计算出梯度。每个微批量对应的梯度将会缓存等到全部微批量完成缓存的梯度会被加和算出平均梯度更新模型参数。
:numref:`ch10-pipeline-parallel` 进一步给出了一个流水线并行的执行例子。在本例中模型参数需要切分给4个设备存储。为了充分利用起来这4个设备我们将小批量切分为2个微批量。当设备1完成第一个微批量的前向传播后表示为$F_{0,0}$他会将中间结果发送给设备2触发响应的前向传播任务表示为$F_{1,0}$。与此同时设备1也可以开始第二个微批量的前向传播任务表示为$F_{0,1}$)。前向传播会在流水线的最后一个设备--设备3--完成。系统于是开始反向传播。设备4开始第1个微批量的反向传播任务表示为$B_{3,0}$。该任务完成后的中间结果会被发送给设备3触发响应的反向传播任务表示为$B_{2,0}$。与此同时设备4会缓存好对应第1个微批量的梯度接下来开始第2个微批量计算表示为$B_{3,1}$。当设备4完成了全部的反向传播计算后他会将本地缓存的梯度进行相加并且除以微批量数量计算出平均梯度该梯度用于更新模型参数。
流水线并行的关键因素是流水线泡沫Bubble。当设备完成前向传播后必须等到全部反向传播开,在此期间设备会处于空闲状态。在 :numref:`ch10-pipeline-parallel`我们可以看到设备1在完成2个前向传播任务后要等很多时间才能开始2个向传播任务。这其中的等待时间即被称为泡沫。为了减少设备的等待时间,一种常见的做法是尽可能的增加微批量的数量,从而让反向传播尽可能早的开始。然而,使用非常小的微批量大小,可能会造成加速器无法被充分利用。因此最优的微批量大小是多种因素的折中。其中最核心的因素是流水线泡沫的大小和加速器的计算能力。
流水线并行的关键因素是流水线泡沫Bubble。当设备完成前向传播后必须等到全部反向传播开,在此期间设备会处于空闲状态。在 :numref:`ch10-pipeline-parallel`我们可以看到设备1在完成2个前向传播任务后要等很多时间才能开始2个向传播任务。这其中的等待时间即被称为泡沫。为了减少设备的等待时间,一种常见的做法是尽可能的增加微批量的数量,从而让反向传播尽可能早的开始。然而,使用非常小的微批量大小,可能会造成加速器无法被充分利用。因此最优的微批量大小是多种因素的折中。其中最核心的因素是流水线泡沫的大小和加速器的计算能力。

View File

@@ -4,7 +4,7 @@
- 分布式训练系统的设计往往遵循"分而治之"的设计思路。
- 利用分布式训练系统,人们可以显著提升性能性能,经济性,并且帮助抵御硬件故障。
- 利用分布式训练系统,人们可以显著提升性能,经济性,并且帮助抵御硬件故障。
- 分布式训练系统可以通过数据并行增加设备来提升算力。
@@ -16,9 +16,21 @@
- 为了提供海量的带宽机器学习集群拥有异构的网络以太网机内网络NVLink和InfiniBand。
- 为了解决单节点瓶颈,我们可以使用
Allreduce来分摊梯度聚合过程中的计算和通讯开销。
- 为了解决单节点瓶颈,我们可以使用Allreduce来分摊梯度聚合过程中的计算和通讯开销。
- 参数服务器可以帮助机器学习集群实现计算-存储的分离,从而更好的支持大型稀疏模型。
- 参数服务器常用数据副本技术解决数据热点问题,同时它们也可以被用来解决同步训练系统中常见的掉队者问题。
- 参数服务器常用数据副本技术解决数据热点问题,同时它们也可以被用来解决同步训练系统中常见的掉队者问题。
## 扩展阅读
- 分布式机器学习系统:[综述](https://dl.acm.org/doi/abs/10.1145/3377454)
- 利用集合通讯支持并行训练的实践:[Horovod](https://arxiv.org/abs/1802.05799)
- 流水线并行的实践:[gPipe](https://arxiv.org/abs/1811.06965)
- 在大规模数据并行下的实践:[Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677)
- 模型并行在超大模型上的实践:[ZeRO](https://arxiv.org/abs/1910.02054)

View File

@@ -6,7 +6,7 @@
因此从商业推广层面以及从法规层面我们都需要打开黑盒模型对模型进行解释可解释AI正是解决该类问题的技术。
本章的学习目标包括:
本章的学习目标包括
- 掌握可解释AI的目标和应用场景

View File

@@ -2,7 +2,7 @@
### 云云场景中的横向联邦
在横向联邦学习系统中,具有相同数据结构的多个参与者通过参数或云服务器协同学习机器学习模型。一个典型的假设是参与者是诚实的,而服务器是诚实但好奇的,因此不允许任何参与者向服务器泄漏信息。这种系统的训练过程通常包括以下四个步骤:
在横向联邦学习系统中,具有相同数据结构的多个参与者通过参数或云服务器协同建立机器学习模型。一个典型的假设是参与者是诚实的,而服务器是诚实但好奇的,因此不允许任何参与者向服务器泄漏信息。这种系统的训练过程通常包括以下四个步骤:
①:参与者在本地计算训练梯度,使用加密、差异隐私或秘密共享技术掩饰所选梯度,并将掩码后的结果发送到服务器;
@@ -12,12 +12,14 @@
④:参与者用解密的梯度更新他们各自的模型。
和传统分布式学习相比,联邦学习存在训练结点不稳定和通信代价大的难点。这些难点导致了联邦学习无法和传统分布式学习一样:在每次单步训练之后,同步不同训练结点上的权重。为了提高计算通信比并降低频繁通信带来的高能耗,谷歌公司提出了联邦平均算法Federated AveragingFedAvg。 :numfef:`ch10-federated-learning-fedavg`展示了FedAvg的整体流程。在每轮联邦训练过程中端侧进行多次单步训练。然后云侧聚合多个端侧权重并取加权平均。
和传统分布式学习相比,联邦学习存在训练结点不稳定和通信代价大的难点。这些难点导致了联邦学习无法和传统分布式学习一样:在每次单步训练之后,同步不同训练结点上的权重。为了提高计算通信比并降低频繁通信带来的高能耗,谷歌公司在2017年 :cite:`fedavg`提出了联邦平均算法(Federated AveragingFedAvg)。 :numfef:`ch10-federated-learning-fedavg`展示了FedAvg的整体流程。在每轮联邦训练过程中端侧进行多次单步训练。然后云侧聚合多个端侧权重并取加权平均。
![联邦平均算法](../img/ch10/ch10-federated-learning-fedavg.png)
:width:`800px`
:label:`ch10-federated-learning-fedavg`
随着研究和应用的深入研究者们意识到了FedAvg不适用于某些场景。比如在数据异质性端上数据不是I.I.D分布、系统异质性端设备时断时连的情况下对模型参数只进行简单的加权平均会在训练过程中引入大量偏差从而影响模型的收敛速度、预测性能。针对此研究人员提出了基于Momentum :cite:`FedAvg_Momentum`、Variation Control :cite:`scaffold`、Bayesian :cite:`FedBE`、Distillation :cite:`PATE`和Proximal Estimation :cite:`FedProx`等原理开发的算法和系统框架。
### 端云场景中的横向联邦
端云联邦的总体流程和云云联邦一样,但端云联邦学习面临的难点还包括以下三个方面:
@@ -42,7 +44,7 @@
联邦学习客户端FL-Client负责本地数据训练并在和FL-Server进行通信时对上传权重进行安全加密。
![联邦学习系统架构图](../img/ch10/ch10-federated-learning-architecture.png)
![联邦学习系统架构图](../img/ch10/ch10-federated-learning-architecture.svg)
:label:`ch10-federated-learning-architecture`
@@ -52,4 +54,4 @@
2.松耦合组网使用FL-Server集群。每个FL-Server接收和下发权重给部分FL-Client减少单个FL-Server的带宽压力。此外支持FL-Client以松散的方式接入。任意FL-Client的中途退出都不会影响全局任务并且FL-Client在任意时刻访问任意FL-Server都能获得训练所需的全量数据。
3.加密模块MindSpore Federated为了防止模型梯度的泄露部署了多种加密算法本地差分隐私LDP、基于多方安全计算MPC的安全聚合算法和华为自研的基于符号的维度选择差分隐私算法SignDS
3.加密模块MindSpore Federated为了防止模型梯度的泄露部署了多种加密算法本地差分隐私LDP、基于多方安全计算MPC的安全聚合算法和华为自研的基于符号的维度选择差分隐私算法SignDS

View File

@@ -1,3 +1,36 @@
## 展望
待补充
为了实现联邦学习的大规模商用我们仍然需要做许多的研究工作。比如我们无法查看联邦学习的分布式化的数据那就很难选择模型的超参数以及设定优化器只能采用一些基于模拟的方案来调测模型比如用于移动设备时单用户的标签数据很少甚至无法获取数据的标签信息联邦学习如何用于无监督学习比如由于参与方的数据分布不一致训练同一个全局模型很难评价模型对于每个参与方的好坏比如数据一直是公司的核心资产不同的公司一直在致力于收集数据和创造数据孤岛如何有效地激励公司或者机构参与联邦学习的系统中来。下面将介绍一些MindSpore Federated在进行的一些尝试和业界的相关工作。
**异构场景下的联邦学习**
之前探讨的横向联邦和纵向联邦学习都是让不同的参与方共同建立一个共享的机器学习模型。然而,企业级联邦学习框架往往需要适应多种异构场景,如数据异构(不同客户端数据规模以及分布不一致),设备异构(不同客户端设备计算能力,通信效率不一致),以及模型异构(不同本地客户端模型学到的特征不一致)。
比较主流的两种联邦异构场景下的工作:
1对异构数据具有高度鲁棒性的本地模型个性化联邦学习策略
联邦学习训练的是一个全局模型,基于所有数据得到一个全局最优解,但是不同参与方的数据量和分布都是不同的,很多场景下全局模型无法在把握整体的同时又照顾到这种差异。当某一方的数据和整体偏离比较大时,联邦学习的效果确实有可能不如本地训练的效果。那么如何在所有参与方总体的收益最大化的同时,让个体的收益也能够最大化,这就是个性化联邦学习。
个性化联邦学习并不要求所有参与方最终使用的模型必须是一样的比如允许每个参与方在参与联邦之后根据自己的数据对模型进行微调从而生成本方独特的个性化模型。在进行个性化微调之后往往模型在本地测试集上的效果会更好。在这种方式下不同参与方的模型结构是一样的但是模型参数会有所不同。还有一些方案是让所有的参与方拥有同样的特征提取层但是任务分类层不同。还有的思路是将知识蒸馏引入联邦学习中将联邦学习的全局模型作为teacher将个性化模型作为student可以缓解个性化过程中的过拟合问题。
2对于异构模型进行模型聚合的策略研究
一般在FedAvg的联邦聚合范式下本地迭代训练次数越少、聚合地越频繁模型收敛精度会越好尤其是在不同参与客户端的数据是非iid的情况下。但是聚合会带来通信成本开销联邦学习存在通信成本与模型精度的Trade-off。因此很多研究者聚焦于如何设计自适应聚合方案要求在给定训练时间开销的前提下找到本地更新和全局通信之间的最佳平衡令全局模型的泛化误差最小。
**通信效率提升**
端云联邦学习流程中每一个全局训练轮次里每个参与方都需要给服务器发送完整的模型参数更新然后服务器将聚合后的模型参数下发。现代的深度学习网络动辄有数百万甚至更大量级的参数如此多的参数量传输将会带来巨大的通信开销带来性能瓶颈用户流量、通信时延、客户端参与数量。为了降低通信开销MindSpore Federated采取了一些改善通信效率的方法
1智能调频策略通过改变全局模型聚合的轮次来提高联邦学习效率减少训练任务达到收敛的通信开销。一种直觉是在模型训练初期参数变化剧烈因此设置较大的聚合频率使得模型快速收敛在模型训练中后期参数趋于稳定因此设置较小的聚合频率减少通信成本。
2通信压缩方案对权重差进行量化以及稀疏化操作即每次通信仅上传一小部分最重要参数的梯度从而代替上传所有参数。之所以选择权重差做量化和稀疏是因为它比权重值的分布更易拟合而且稀疏性更高。量化就是将FP32的数据类型映射到INT8甚至更低比特表示的数值上一方面降低存储和通信开销另一方面可以更好地采用一些压缩编码方式进行传输如哈夫曼编码、有限状态熵编码等。比较常用的稀疏化方法有Top-k稀疏即按梯度的绝对值从小到大排序每轮只上传前k个参数如何选取合适的\(k\)是一个有挑战性的问题。这个方案对于模型的联邦学习训练来说是有损的在精度损失和通信压缩率之间也是trade-off。
**联邦生态**
在前面的章节中,我们介绍了面向隐私保护的联邦学习领域的一些技术与实践,然而随着探索地更加深入,联邦学习领域也变得更具包容性,它涵盖了分不是机器学习、模型压缩部署、信息安全、加密算法、博弈论等等。随着越来越多的公司、高校和机构参与进来,现在的联邦学习已经不仅仅是一种技术解决方案,还是一个隐私保护的生态系统,比如不同的参与方希望以可持续的方式加入联邦,如何设计激励机制,以确保利润可以相对公平地被联邦参与方共享,同时对于恶意的实施攻击或者破坏行为的参与方进行有效遏制。
另外,随着用户数据隐私保护和合理使用的法律法规越来越多的被推出,制定联邦学习的技术标准显得愈加重要,这一标准能够在法律监管部门和技术开发人员之间建立一座桥梁,让企业知道采用何种技术,能够在合乎法规的同时更好地进行信息的共享。
2020年底正式出版推行了由IEEE 标准委员会SASB通过的联邦学习国际标准IEEE P3652.1),该标准旨在提供一个搭建联邦学习的体系架构和应用的指导方针,主要内容包括:联邦学习的描述和定义、场景需求分类和安全测评、联邦学习个性指标的评估如何量化、联合管控的需求。这也是国际上首个针对人工智能协同技术框架订立的标准,标志着联邦学习开启大规模工业化应用的新篇章。

View File

@@ -1,45 +1,47 @@
## 概述
随着人工智能的飞速发展大规模和高质量的数据越来越重要但也制约了其进一步的发展。隐私、监管和工程等问题造成了设备与设备之间的数据不能共享进而导致了数据孤岛问题的出现。为了解决这一难题联邦学习Federated LearningFL应运而生。联邦学习的概念最早在2016年被提了出来能有效帮助多个机构在满足用户隐私保护、数据安全和政府法规的要求下进行数据使用和机器学习建模。
### 定义
联邦学习的核心即为数据不动,模型动。显然,若是将数据从各方集中在一起,不符合法律法规。联邦学习让模型在各个数据方“移动”,这样就可以达到数据不出端即可建模的效果。在联邦学习中,各方数据都保留在本地,通过交换加密的参数建立机器学习模型。
### 应用场景
在实际的应用场景中,根据样本和特征的重叠情况,联邦学习可以被分为横向联邦学习(样本不同,特征重叠),纵向联邦学习(特征不同,样本重叠)和联邦迁移学习(样本和特征都不重叠)。
**横向联邦学习**适用于不同参与方拥有的特征相同但参与的个体不同的场景。比如,在广告推荐场景中,有多个不同的手机用户。算法开发人员使用不同手机用户的相同特征(点击次数、停留时间或使用频次等特征)的数据来建立模型由于这些特征数据不能出端,因此,横向联邦学习可以被联合多用户的数据来构建模型。
**纵向联邦学习**适用于样本重叠多特征重叠少的场景。比如,有两个不同机构,一家是保险公司,另一家是医院。它们的用户群体很有可能包含该地的大部分居民,用户的交集可能较大。由于保险公司记录的都是用户的收支行为与信用评级,而医院则保有用户的疾病与购药记录,因此它们的用户特征交集较小。纵向联邦学习就是将这些不同特征在加密的状态下加以聚合,以增强模型能力的联邦学习。
**联邦迁移学习**的核心是找到源领域和目标领域之间的相似性。比如有两个不同机构,一家是位于中国的银行,另一家是位于美国的电商。由于受到地域限制,这两家机构的用户群体交集很小。同时,由于机构类型的不同,二者的数据特征也只有小部分重合。在这种情况下,要想进行有效的联邦学习,就必须引入迁移学习,来解决单边数据规模小和标签样本少的问题,从而提升模型的效果。
### 部署场景
联邦学习和参数服务器(数据中心分布式学习)架构非常相似,都是采用中心化的服务器和分散的客户端去构建同一个机器学习模型。此外,根据客户端来源和规模的不同,联邦学习还可以细分为跨设备cross-device)与跨组织cross-silo)联邦学习。一般而言,跨组织联邦学习的用户一般是企业、机构单位级别的,而跨设备联邦学习针对的则是便携式电子设备、移动端设备等。 :numref:`ch10-federated-learning-different-connection`展示了三者的区别和联系:
![数据中心分布式训练、跨组织和跨设备联邦学习的区别和联系](../img/ch10/ch10-federated-learning-different-connection.png)
:label:`ch10-federated-learning-different-connection`
### 联邦学习框架
随着用户和开发人员对联邦学习技术的需求不断增长,联邦学习工具和框架的数量也越来越多。下面将介绍一些主流的联邦学习框架。
TensorFlow联邦TFF是谷歌公司牵头的联邦学习开源框架用于在分散数据上进行机器学习和其他计算。TFF的开发是为了促进联邦学习FL的开放研究和实验,这是一种机器学习的方法,在许多参与的客户中训练共享的全局模型,这些客户将其训练数据保存在本地。例如,联邦学习已被用于训练移动键盘的预测模型,而无需将敏感的键入数据上载到服务器。
PaddleFL是百度提出的一个基于PaddlePaddle的开源联邦学习框架。研究人员可以很轻松地用PaddleFL复制和比较不同的联邦学习算法开发人员也比较容易在大规模分布式集群中部署PaddleFL联邦学习系统。PaddleFL提供很多种联邦学习策略横向联邦学习、纵向联邦学习及其在计算机视觉、自然语言处理、推荐算法等领域的应用。此外PaddleFL还将提供传统机器学习训练策略的应用例如多任务学习、联邦学习环境下的迁移学习。依靠着PaddlePaddle的大规模分布式训练和Kubernetes对训练任务的弹性调度能力PaddleFL可以基于全栈开源软件轻松地部署。
FATE (Federated AI Technology Enabler) 由微众银行提出,是全球首个联邦学习工业级开源框架,可以让企业和机构在保护数据安全和数据隐私的前提下进行数据协作。 FATE项目使用多方安全计算 (MPC) 以及同态加密 (HE) 技术构建底层安全计算协议,以此支持不同种类的机器学习的安全计算,包括逻辑回归、基于树的算法、深度学习和迁移学习等。 FATE于2019年2月首次对外开源并成立 [FATE TSC](https://github.com/FederatedAI/FATE-Community/blob/master/FATE_Project_Technical_Charter.pdf) 对FATE社区进行开源治理成员包含国内主要云计算和金融服务企业。
FedML是一个USC牵头提出的联邦学习开源研究和基准库它有助于开发新的联合学习算法和公平的性能比较。FedML支持三种计算范式分布式训练、移动设备上训练和独立模拟供用户在不同的系统环境中进行实验。FedML还通过灵活和通用的API设计和参考基线实现促进多样化的算法研究。为非I.I.D设置精心策划的全面基准数据集旨在进行公平比较。FedML在https://FedML.ai上维护源代码、文档和用户社区。
PySyft是UCL、DeepMind和OpenMind发布的安全和隐私深度学习Python库包括联邦学习、差分隐私和多方学习。PySyft使用差分隐私和加密计算如多方计算(MPC和同态加密HE)将私有数据与模型训练解耦流。
Fedlearner是字节跳动提出的协作机器学习框架它允许对分布在机构之间的数据进行联合建模。Fedlearner附带了用于群集管理、作业管理、作业监控和网络代理的周围基础架构。Fedlearner采用云原生部署方案。数据存放在HDFS。通过Kubernetes管理和拉起任务。每个Fedlearner的训练任务需要参与双方同时拉起K8S任务通过Master节点统一管理Worker建实现通信。
OpenFL是英特尔提出的用于联邦学习的Python框架。OpenFL旨在成为数据科学家的灵活、可扩展和易于学习的工具。OpenFL由英特尔物联网集团IOTG和英特尔实验室开发。
MindSpore Fedrated是华为提出的一款开源联邦学习框架支持千万级无状态终端设备商用化部署在用户数据留存在本地的情况下使能全场景智能应用。 MindSpore Federated优先专注于大规模参与方的横向联邦的应用场景使参与联邦学习的各用户在不共享本地数据的前提下共建AI模型。MindSpore Fedrated主要解决隐私安全、大规模联邦聚合、易用性和跨平台部署联邦学习在工业场景部署的难点。
## 概述
随着人工智能的飞速发展大规模和高质量的数据越来越重要但也制约了其进一步的发展。隐私、监管和工程等问题造成了设备与设备之间的数据不能共享进而导致了数据孤岛问题的出现。为了解决这一难题联邦学习Federated LearningFL应运而生。联邦学习的概念最早在2016年被提了出来能有效帮助多个机构在满足用户隐私保护、数据安全和政府法规的要求下进行数据使用和机器学习建模。
### 定义
联邦学习的核心即为数据不动,模型动。显然,若是将数据从各方集中在一起,无法保证对用户隐私的保护,不符合相关法律法规。联邦学习让模型在各个数据方“移动”,这样就可以达到数据不出端即可建模的效果。在联邦学习中,各方数据都保留在本地,通过(在中心服务器上)交换加密的参数建立机器学习模型。
### 应用场景
在实际的应用场景中,根据样本和特征的重叠情况,联邦学习可以被分为横向联邦学习(样本不同,特征重叠),纵向联邦学习(特征不同,样本重叠)和联邦迁移学习(样本和特征都不重叠)。
**横向联邦学习**适用于不同参与方拥有的特征相同但参与的个体不同的场景。比如,在广告推荐场景中,算法开发人员使用不同手机用户的相同特征(点击次数、停留时间或使用频次等)的数据来建立模型;抑或者是在输入法中用来预测由于这些特征数据不能出端,因此,横向联邦学习被用来联合多用户的数据来构建模型。
**纵向联邦学习**适用于样本重叠多特征重叠少的场景。比如,有两个不同机构,一家是保险公司,另一家是医院。它们的用户群体很有可能包含该地的大部分居民,用户的交集可能较大。由于保险公司记录的都是用户的收支行为与信用评级,而医院则保有用户的疾病与购药记录,因此它们的用户特征交集较小。纵向联邦学习就是将这些不同特征在加密的状态下加以聚合,以增强模型能力的联邦学习。
**联邦迁移学习**的核心是找到源领域和目标领域之间的相似性。比如有两个不同机构,一家是位于中国的银行,另一家是位于美国的电商。由于受到地域限制,这两家机构的用户群体交集很小。同时,由于机构类型的不同,二者的数据特征也只有小部分重合。在这种情况下,要想进行有效的联邦学习,就必须引入迁移学习,来解决单边数据规模小和标签样本少的问题,从而提升模型的效果。
### 部署场景
联邦学习和参数服务器(数据中心分布式学习)架构非常相似,都是采用中心化的服务器和分散的客户端去构建同一个机器学习模型。此外,根据客户端来源和规模的不同,联邦学习还可以细分为跨组织cross-silo)与跨设备cross-device)联邦学习。一般而言,跨组织联邦学习的用户一般是企业、机构单位级别的,而跨设备联邦学习针对的则是便携式电子设备、移动端设备等。 :numref:`ch10-federated-learning-different-connection`展示了三者的区别和联系:
![数据中心分布式训练、跨组织和跨设备联邦学习的区别和联系](../img/ch10/ch10-federated-learning-different-connection.png)
:width:`800px`
:label:`ch10-federated-learning-different-connection`
### 常用框架
随着用户和开发人员对联邦学习技术的需求不断增长,联邦学习工具和框架的数量也越来越多。下面将介绍一些主流的联邦学习框架。
[TFF](https://www.tensorflow.org/federated) (TensorFlow Federated)是谷歌牵头开发的联邦学习开源框架用于在分散数据上进行机器学习和其他计算。TFF的开发是为了促进联邦学习的开放研究和实验这是一种机器学习的方法在许多参与的客户中训练共享的全局模型这些客户将其训练数据保存在本地。例如联邦学习已被用于训练移动键盘的预测模型而无需将敏感的键入数据上载到服务器。
[PaddleFL](https://paddlefl.readthedocs.io/en/latest/index.html)是百度提出的一个基于PaddlePaddle的开源联邦学习框架。研究人员可以很轻松地用PaddleFL复制和比较不同的联邦学习算法开发人员也比较容易在大规模分布式集群中部署PaddleFL联邦学习系统。PaddleFL提供很多种联邦学习策略横向联邦学习、纵向联邦学习及其在计算机视觉、自然语言处理、推荐算法等领域的应用。此外PaddleFL还将提供传统机器学习训练策略的应用例如多任务学习、联邦学习环境下的迁移学习。依靠着PaddlePaddle的大规模分布式训练和Kubernetes对训练任务的弹性调度能力PaddleFL可以基于全栈开源软件轻松地部署。
[FATE](https://fate.fedai.org) (Federated AI Technology Enabler)由微众银行提出,是全球首个联邦学习工业级开源框架,可以让企业和机构在保护数据安全和数据隐私的前提下进行数据协作。 FATE项目使用多方安全计算 (MPC) 以及同态加密 (HE) 技术构建底层安全计算协议,以此支持不同种类的机器学习的安全计算,包括逻辑回归、基于树的算法、深度学习和迁移学习等。 FATE于2019年2月首次对外开源并成立 [FATE TSC](https://github.com/FederatedAI/FATE-Community/blob/master/FATE_Project_Technical_Charter.pdf) 对FATE社区进行开源治理成员包含国内主要云计算和金融服务企业。
[FedML](https://FedML.ai)是一个USC牵头提出的联邦学习开源研究和基准库它有助于开发新的联合学习算法和公平的性能比较。FedML支持三种计算范式(分布式训练、移动设备上训练和独立模拟)供用户在不同的系统环境中进行实验。FedML还通过灵活和通用的API设计和参考基线实现促进多样化的算法研究。为非I.I.D设置精心策划的全面基准数据集旨在进行公平比较。
[PySyft](https://openmined.github.io/PySyft/index.html)是UCL、DeepMind和OpenMined发布的安全和隐私深度学习Python库包括联邦学习、差分隐私和多方学习。PySyft使用差分隐私和加密计算(如多方计算(MPC)和同态加密(HE))将私有数据与模型训练解耦流。
[Fedlearner](https://github.com/bytedance/fedlearner)是字节跳动提出的协作机器学习框架它允许对分布在机构之间的数据进行联合建模。Fedlearner附带了用于群集管理、作业管理、作业监控和网络代理的周围基础架构。Fedlearner采用云原生部署方案。数据存放在HDFS。通过Kubernetes管理和拉起任务。每个Fedlearner的训练任务需要参与双方同时拉起K8S任务通过Master节点统一管理Worker建实现通信。
[OpenFL](https://openfl.readthedocs.io/en/latest/index.html)是英特尔提出的用于联邦学习的Python框架。OpenFL旨在成为数据科学家的灵活、可扩展和易于学习的工具。
[Flower](https://flower.dev)是剑桥大学、Adap等发布的联邦学习开源系统主要针对在大规模、异质化设备上部署联邦学习算法的应用场景进行优化。
[MindSpore Fedrated](https://www.mindspore.cn/en) (昇思)是华为提出的一款开源联邦学习框架,支持千万级无状态终端设备商用化部署,在用户数据留存在本地的情况下,使能全场景智能应用。 MindSpore Federated优先专注于大规模参与方的横向联邦的应用场景使参与联邦学习的各用户在不共享本地数据的前提下共建AI模型。MindSpore Fedrated主要解决隐私安全、大规模联邦聚合、易用性和跨平台部署等联邦学习在工业场景部署的难点。

View File

@@ -2,7 +2,7 @@
联邦学习过程中用户数据仅用于本地设备训练不需要上传至中央FL-Server。这样可以避免用户个人数据的直接泄露。然而联邦学习框架中模型的权重以明文形式上云仍然存在间接泄露用户隐私的风险。敌手获取到用户上传的明文权重后可以通过重构、模型逆向等攻击恢复用户的个人训练数据导致用户隐私泄露。
MindSpore Federated Learning框架提供了基于本地差分隐私LDP和基于多方安全计算MPC的安全聚合算法在本地模型的权重上云前对其进行加噪或加扰。在保证模型可用性的前提下解决联邦学习中的隐私泄露问题。
MindSpore Federated框架提供了基于本地差分隐私LDP和基于多方安全计算MPC的安全聚合算法在本地模型的权重上云前对其进行加噪或加扰。在保证模型可用性的前提下解决联邦学习中的隐私泄露问题。
### 基于LDP的安全聚合
@@ -16,7 +16,7 @@ $$
在联邦学习中假设FL-Client本地训练之后的模型权重矩阵是$W$,由于模型在训练过程中会“记住”训练集的特征,所以敌手可以借助$W$还原出用户的训练数据集。
MindSpore Federated Learning提供基于本地差分隐私的安全聚合算法,防止本地模型的权重上云时泄露隐私数据。
MindSpore Federated提供基于本地差分隐私的安全聚合算法防止本地模型的权重上云时泄露隐私数据。
FL-Client会生成一个与本地模型权重$W$相同维度的差分噪声矩阵$G$,然后将二者相加,得到一个满足差分隐私定义的权重$W_p$:
@@ -28,7 +28,7 @@ FL-Client将加噪后的模型权重$W_p$上传至云侧FL-Server进行联邦聚
### 基于MPC的安全聚合
尽管差分隐私技术可以适当保护用户数据隐私但是当参与FL-Client数量比较少或者高斯噪声幅值较大时模型精度会受较大影响。为了同时满足模型保护和模型收敛这两个要求MindSpore Federated Learning提供了基于MPC的安全聚合方案。
尽管差分隐私技术可以适当保护用户数据隐私但是当参与FL-Client数量比较少或者高斯噪声幅值较大时模型精度会受较大影响。为了同时满足模型保护和模型收敛这两个要求MindSpore Federated提供了基于MPC的安全聚合方案。
在这种训练模式下假设参与的FL-Client集合为$U$对于任意FL-Client $u$和$v$
它们会两两协商出一对随机扰动$p_{uv}$、$p_{vu}$,满足
@@ -49,4 +49,87 @@ $$
从而FL-Server聚合结果$\overline{x}$为:
上面的过程只是介绍了聚合算法的主要思想基于MPC的聚合方案是精度无损的代价是通讯轮次的增加。
上面的过程只是介绍了聚合算法的主要思想基于MPC的聚合方案是精度无损的代价是通讯轮次的增加。
### 基于LDP-SignDS算法的安全聚合
对于先前的基于维度加噪的LDP算法在隐私预算一定时添加到每个维度的噪声规模基本上与模型参数的数量成正比。因此对于高维模型可能需要非常多的参与方来减轻噪音对模型收敛的影响。为了解决上述“维度依赖”问题MindSpore Federated 进一步提供了基于维度选择的**Sign-based Dimension Selection (SignDS)** :cite:`jiang2022signds`算法。SignDS算法的主要思想是对于每一条真实的本地更新$\Delta\in\mathbb{R}^{d}$用户端首先选择一小部分更新最明显的维度构建topk集合$S_k$,并以此选择一个维度集合$J$返回给FL-Server。FL-Server根据维度集合$J$构建一条对应的稀疏更新$\Delta^\prime$并聚合所有稀疏更新进用于更新全局模型。由于本地模型更新与本地数据信息相关联直接选取真实的最大更新维度可能导致隐私泄露。对此SignDS算法在两方面实现了隐私保证。一方面算法使用了一种基于指数机制Exponential Mechanism EM :cite:`mcsherry2007mechanism`)的维度选择算法**EM-MDS**,使得所选维度集满足严格的$\epsilon$-LDP保证另一方面在构建稀疏更新时对所选维度分配一个常量值而不直接使用实际更新值以保证稀疏更新和本地数据不再直接关联。由于维度选择满足$\epsilon$-LDP且分配给所选维度的更新值与本地数据无关根据差分隐私的传递性 :cite:`dwork2014algorithmic`,所构建的稀疏更新同样满足$\epsilon$-LDP保证。**相较于之前基于维度加噪的LDP算法SignDS算法可以显著提升高维模型的训练精度。同时由于FL-Client只需上传一小部分的维度值而不是所有的模型权重因此联邦学习的上行通信量也被大大降低。**
下面我们分别对topk集合$S_k$的构建和EM-MDS维度选择算法进行详细介绍。
首先由于实际更新值有正负直接给所有选定的维度分配相同的常量值可能会明显改变模型更新方向影响模型收敛。为了解决这个问题SignDS提出了一种基于符号的topk集合构建策略。具体来讲算法引入了一个额外的符号变量$s\in\\{-1,1\\}$。该变量由FL-Client以等概率随机采样用于确定本地更新$\Delta$的topk集合$S_k$。如果$s=1$,我们将$\Delta$按**真实更新值**排序,并将**最大**的$k$个更新维度记为$S_k$。我们进一步从$S_k$中随机选择一部分维度,并将$s=1$作为这些维度的更新值用以构建稀疏更新。直觉上,$S_k$中维度的更新值很可能大于零。因此,将$s=1$分配给选定的维度不会导致模型更新方向的太大差异,从而减轻了对模型精度的影响。类似的,当$s=-1$时,我们选取**最小**的$k$个更新维度记为$S_k$,并将$s=-1$分配给所选维度。
下面我们进一步介绍用于维度选择的EM-MDS算法。简单来说EM-MDS算法的目的是从输出维度域$\mathcal{J}$中以一定概率$\mathcal{P}$随机选择一个维度集合$J\in\mathcal{J}$,不同维度集合对应的概率不同。我们假设$J$总共包含$h$个维度,其中有$\nu$个维度属于topk集合即$|S_k \cap J|=\nu$,且$\nu\in[0,h]$),另外$h-\nu$个维度属于非topk集合。直观上$\nu$越大,$J$中包含的topk维度越多模型收敛越好。因此我们希望给$\nu$较大的维度集合分配更高的概率。基于这个想法,我们将评分函数定义为:
$$
u(S_{k}, J) = 𝟙(|S_k\cap J| \geq \nu_{th}) = 𝟙(\nu \geq \nu_{th})
$$
:eqlabel:`score_function`
$u(S_{k}, J)$用来衡量输出维度集合$J$中包含的topk维度的数量是否超过某一阈值$\nu_{th}$$\nu_{th}\in[1,h]$超过则为1否则为0。进一步$u(S_{k}, J)$的敏感度可计算为:
$$
\phi = \max_{J\in\mathcal{J}} ||u(S_{k}, J) - u(S^\prime_{k}, J)||= 1 - 0 = 1
$$
:eqlabel:`sensitivity`
注意 :eqref:`sensitivity`对于任意一对不同的topk集合$S_k$和$S_k^\prime$均成立。
根据以上定义EM-MDS算法描述如下
*给定真实本地更新$\Delta\in\mathbb{R}^{d}$的topk集合$S_k$和隐私预算$\epsilon$,输出维度集合$J\in\mathcal{J}$的采样概率为:*
$$
\mathcal{P}=\frac{\mathrm{exp}(\frac{\epsilon}{\phi}\cdot u(S_{k}, J))}{\sum_{J^\prime\in\mathcal{J}}\mathrm{exp}(\frac{\epsilon}{\phi}\cdot u(S_{k}, J^\prime))}
=
\frac{\mathrm{exp}(\epsilon\cdot 𝟙(\nu \geq \nu_{th}))}{\sum_{\tau=0}^{\tau=h}\omega_{\tau}\cdot \mathrm{exp}(\epsilon\cdot 𝟙(\tau\geq\nu_{th}))}
=
\frac{\mathrm{exp}(\epsilon\cdot 𝟙(\nu \geq \nu_{th}))}{\sum_{\tau=0}^{\tau=\nu_{th}-1}\omega_{\tau} + \sum_{\tau=\nu_{th}}^{\tau=h}\omega_{\tau}\cdot \mathrm{exp}(\epsilon)}
$$
:eqlabel:`emmds`
*其中,$\nu$是$J$中包含的topk维度数量$\nu_{th}$是评分函数的阈值,$J^\prime$是任意一输出维度集合,$\omega_{\tau}=\binom{k}{\tau}\binom{d-k}{h-\tau}$是所有包含$\tau$个topk维度的集合数。*
我们进一步提供了EM-MDS算法的隐私证明:
对于每个FL-Client给定随机采样的符号值$x$,任意两个本地更新$\Delta$$\Delta^\prime$的topk集合记为$S_k$和$S_k^\prime$,对于任意输出维度集合$J\in\mathcal{J}$,令$\nu=|S_k \cap J|$, $\nu^\prime=|S_k^\prime \cap J|$为$J$与两组topk维度集的交集数量。根据 :eqref:`emmds`,以下不等式成立:
$$
\frac{\mathrm{Pr}\[J|\Delta\]}{\mathrm{Pr}\[J|\Delta^\prime\]} = \frac{\mathrm{Pr}\[J|S_{k}\]}{\mathrm{Pr}\[J|S^\prime_{k}\]} = \frac{\frac{\mathrm{exp}(\frac{\epsilon}{\phi}\cdot u(S_{k}, J))}{\sum_{J^\prime\in\mathcal{J}}\mathrm{exp}(\frac{\epsilon}{\phi}\cdot u(S_{k}, J^\prime))}}{\frac{\mathrm{exp}(\frac{\epsilon}{\phi}\cdot u(S^\prime_{k}, J))}{\sum_{J^\prime\in\mathcal{J}}\mathrm{exp}(\frac{\epsilon}{\phi}\cdot u(S^\prime_{k}, J^\prime))}}
= \frac{\frac{\mathrm{exp}(\epsilon\cdot 𝟙(\nu \geq \nu_{th}))}{\sum_{\tau=0}^{\tau=h}\omega_{\tau}\cdot \mathrm{exp}(\epsilon\cdot 𝟙(\tau\geq\nu_{th}))}}{\frac{
\mathrm{exp}(\epsilon\cdot 𝟙(\nu^\prime \geq \nu_{th}))}{\sum_{\tau=0}^{\tau=h}\omega_{\tau}\cdot \mathrm{exp}(\epsilon\cdot 𝟙(\tau\geq\nu_{th}))}} \\
= \frac{\mathrm{exp}(\epsilon\cdot 𝟙(\nu \geq \nu_{th}))}{
\mathrm{exp}(\epsilon\cdot 𝟙(\nu^\prime \geq \nu_{th}))}
\leq \frac{\mathrm{exp}(\epsilon\cdot 1)}{\mathrm{exp}(\epsilon\cdot 0)} = \mathrm{exp}(\epsilon)
$$
*证明EM-MDS算法满足$\epsilon$-LDP保证。*
值得注意的是,计算 :eqref:`emmds`需要先确定topk维度数的阈值$\nu_{th}$。为此,我们首先推导在给定阈值$\nu_{th}$时,任意一组输出维度集合$J$包含的topk维度的概率分布和期望
$$
\mathrm{Pr}(\nu=\tau|\nu_{th})=
\begin{cases}
\omega_{\tau} / \Omega \quad \quad \quad \quad \quad \mathrm{ } &if \quad \tau\in\[0,\nu_{th}\) \\
\omega_{\tau}\cdot\mathrm{exp}(\epsilon) / \Omega \quad \quad &if \quad \tau\in\[\nu_{th},h\]
\end{cases}
$$
:eqlabel:`discrete-prob`
$$
\mathbb{E}\[\nu|\nu_{th}\] = \sum_{\tau=0}^{\tau=h}\tau\cdot \mathrm{Pr}(\nu=\tau|\nu_{th})
$$
:eqlabel:`expectation`
这里,$\Omega$为 :eqref:`emmds`中$\mathcal{P}$的分母部分。直觉上,$\mathbb{E}\[\nu|\nu_{th}\]$越高,随机采样的$J$集合中包含的topk维度的概率就越大从而模型效用就越好。因此我们将$\mathbb{E}\[\nu|\nu_{th}\]$最高时的阈值确定为目标阈值$\nu_{th}^{\*}$,即:
$$
\nu_{th}^{\*} = \underset{\nu_{th}\in\[1, h\]}{\operatorname{argmax}} \mathbb{E}\[\nu|\nu_{th}\]
$$
:eqlabel:`threshold`
最后,我们在 :numref:`signds_workflow`中描述了SignDS算法的详细流程。给定本地模型更新$\Delta$,我们首先随机采样一个符号值$s$并构建topk集合$S_k$。接下来,我们根据 :eqref:`threshold`确定阈值$\nu_{th}^{\*}$并遵循 :eqref:`emmds`定义的概率选择输出集合$J$。考虑到输出域$\mathcal{J}$包含$\binom{d}{k}$个可能的维度集合,以一定概率直接从$\mathcal{J}$中随机采样一个组合需要很大的计算成本和空间成本。因此,我们采用了逆采样算法以提升计算效率。具体来说,我们首先从标准均匀分布中采样一个随机值$\beta\sim U(0,1)$,并根据 :eqref:`discrete-prob`中$p(\nu=\tau|\nu_{th})$的累计概率分布$CDF_{\tau}$确定输出维度集合中包含的topk维度数$\nu$。最后我们从topk集合$S_k$中随机选取$\nu$个维度从非topk集合中随机采样$h-\nu$个维度,以构建最终的输出维度集合$J$。
![SignDS工作流程](../img/ch10/ch10-federated-learning-signds.PNG)
:width:`800px`
:label:`signds_workflow`

View File

@@ -1,3 +1,7 @@
## 小结
在这一章,我们简单介绍了联邦学习的背景、系统架构、联邦平均算法、隐私加密算法以及实际部署时的挑战。联邦学习是一个新起步的人工智能算法,可以在“数据保护”与“数据孤岛”这两大约束条件下,建立有效的机器学习模型。此外,由于联邦学习场景的特殊性(端侧数据不上传、安全隐私要求高和数据非独立同分布等特点),使得系统和算法的开发难度更高:如何平衡计算和通讯的开销?如何保证模型不会泄露隐私?算法如何在非独立同分布场景下收敛?等等,都需要开发人员对实际的联邦学习场景有更深刻的认识。
在这一章,我们简单介绍了联邦学习的背景、系统架构、联邦平均算法、隐私加密算法以及实际部署时的挑战。联邦学习是一个新起步的人工智能算法,可以在“数据保护”与“数据孤岛”这两大约束条件下,建立有效的机器学习模型。此外,由于联邦学习场景的特殊性(端侧数据不上传、安全隐私要求高和数据非独立同分布等特点),使得系统和算法的开发难度更高:如何平衡计算和通讯的开销?如何保证模型不会泄露隐私?算法如何在非独立同分布场景下收敛?这些难点都需要开发人员对实际的联邦学习场景有更深刻的认识。
在这一章,我们简单介绍了联邦学习的背景、系统架构、联邦平均算法、隐私加密算法以及实际部署时的挑战。联邦学习是一个新起步的人工智能算法,可以在“数据保护”与“数据孤岛”这两大约束条件下,建立有效的机器学习模型。
此外,由于联邦学习场景的特殊性(端侧数据不上传、安全隐私要求高和数据非独立同分布等特点),使得系统和算法的开发难度更高。如何平衡计算和通讯的开销,如何保证模型不会泄露隐私,以及算法如何在非独立同分布场景下收敛等等,都需要开发人员对实际的联邦学习场景有更深刻的认识。

View File

@@ -6,7 +6,7 @@
### 纵向联邦架构
![纵向联邦两方架构](../img/ch10/ch10-federated-learning-vfl-arch.png)
![纵向联邦两方架构](../img/ch10/ch10-federated-learning-vfl-arch.svg)
:width:`800px`
:label:`federated-learning-vfl-arch`
@@ -49,7 +49,7 @@ $${t_i}^{'}=H^{'}(K_{b:i}) \\I=\{t_1,...,t_w\}\cap \{{t_1}^{'},...,{t_v}^{'}\}$$
在确样本ID对齐后就可以使用这些公共的数据来训练机器学习模型。目前线性回归、决策树和神经网络等模型已经被广泛应用到纵向联邦系统中。
在纵向联邦的模型训练过程中一般会引入第三方协作者C来实现中心服务器功能并且假设这个第三方协作者C是可信的不会与其他参与方合谋。中心服务器在训练过程中作为中立方产生和分发密钥并对加密数据进行解密和计算。但中心服务器角色是非必须的例如在两方联邦学习的场景下不需要第三方协作者C来协调双方的训练任务可以由具有标签数据的企业A来充当中心服务服务器的角色。不失一般性下面继续以包含第三方协作者C的方案来描述纵向联邦模型联合训练过程。
![纵向联邦联合建模](../img/ch10/ch10-federated-learning-vfl-train.png)
![纵向联邦联合建模](../img/ch10/ch10-federated-learning-vfl-train.svg)
:width:`800px`
:label:`federated-learning-vfl-train`
@@ -65,4 +65,3 @@ Paillier算法是一种满足加法的同态加密算法已经广泛应用在
模型联合训练完成后就可以投入生产环境部署应用。由于纵向联邦中每个参与方具有部分模型结构因此推理也需要双方协作完成计算。联合推理过程和联合训练类似首先第三方协作者C将推理数据ID发送给企业A和B双方在本地完成推理计算后将结果加密后传输到第三方协作者C由C计算模型最终的联合推理结果。

View File

@@ -10,8 +10,8 @@
引入中间表示后,中间表示既能面向多个前端,表达多种源程序语言,又能对接多个后端,连接不同目标机器,如 :numref:`intermediate_representation`所示。在此基础上编译流程就可以在前后端直接增加更多的优化流程这些优化流程以现有IR为输入又以新生成的IR为输出被称为优化器。优化器负责分析并改进中间表示极大程度的提高了编译流程的可拓展性也降低了优化流程对前端和后端的破坏。
![中间表示](../img/ch04/中间表示-中间表示结构.svg)
:width:`800px`
![中间表示](../img/ch04/中间表示-中间表示结构.png)
:width:`850px`
:label:`intermediate_representation`
随着编译器技术的不断演进,中间表示主要经历了三个发展阶段。在早期阶段,中间表示是封闭在编译器内部的,供编译器编写者使用。在中期阶段,随着编译器的开源,中间表示逐步开源公开,主要供编译器设计者、分析工具设计者使用。现阶段,中间表示朝着软件生态构建的方向发展,旨在构建统一的中间表示。
@@ -30,14 +30,14 @@
: 中间表示的分类
:::
1\) 线性中间表示
1\) 线性中间表示/Users/liangzhibo/Desktop/中间表示-中间表示结构.png
线性中间表示类似抽象机的汇编代码,将被编译代码表示为操作的有序序列,对操作序列规定了一种清晰且实用的顺序。由于大多数处理器采用线性的汇编语言,线性中间表示广泛应用于编译器设计。
常用线性中间表示有堆栈机代码(Stack-Machine Code)和三地址代码(Three
Address Code) :cite:`2007Compilers` 。堆栈机代码是一种单地址代码提供了简单紧凑的表示。堆栈机代码的指令通常只有一个操作码其操作数存在一个栈中。大多数操作指令从栈获得操作数并将其结果推入栈中。三地址代码简称为3AC模拟了现代RISC机器的指令格式。它通过一组四元组实现每个四元组包括一个运算符和三个地址(两个操作数、一个目标)。对于表达式a-b\*5堆栈机代码和三地址代码如 :numref:`linear_ir`所示。
![堆栈机代码和三地址代码](../img/ch04/中间表示-线性中间表示.svg)
![堆栈机代码和三地址代码](../img/ch04/中间表示-线性中间表示.png)
:width:`800px`
:label:`linear_ir`
@@ -50,7 +50,7 @@ GraphDAG)、控制流图(Control-Flow GraphCFG)等。
AST抽象语法树采用树型中间表示的形式是一种接近源代码层次的表示。对于表达式$a*5+a*5*b$其AST表示如 :numref:`AST_DAG`所示。可以看到AST形式包含$a*5$的两个不同副本存在冗余。在AST的基础上DAG提供了简化的表达形式一个节点可以有多个父节点相同子树可以重用。如果编译器能够证明$a$的值没有改变则DAG可以重用子树降低求值过程的代价。
![AST图和DAG图](../img/ch04/中间表示-ASTDAG.svg)
:width:`600px`
:width:`400px`
:label:`AST_DAG`
3、混合中间表示
@@ -61,8 +61,8 @@ IR使用线性中间表示表示基本块使用图中间表示表示这些块
Single Assignment SSA) :cite:`Richard1995A`
形式呈现这些指令构成一个指令线性列表。SSA形式要求每个变量只赋值一次并且每个变量在使用之前定义。控制流图中每个节点为一个基本块基本块之间通过边实现控制转移。
![LLVM IR](../img/ch04/中间表示-LLVMIR.svg)
:width:`600px`
![LLVM IR](../img/ch04/中间表示-LLVMIR.png)
:width:`800px`
:label:`LLVM_IR`
### 机器学习框架的中间表示
@@ -99,12 +99,36 @@ IR作为PyTorch模型的中间表示通过JIT即时编译的形式将Pytho
PyTorch框架采用命令式编程方式其TorchScript
IR以基于SSA的线性IR为基本组成形式并通过JIT即时编译的Tracing和Scripting两种方法将Python代码转换成TorchScript
IR。如 :numref:`TorchScript_IR`给出了Python示例代码及其TorchScript
IR。
IR。如下Python代码使用了Scripting方法并打印其对应的中间表示图
```python
import torch
![Python代码及输出的TorchScript IR](../img/ch04/中间表示-torchscript.png)
:width:`800px`
:label:`TorchScript_IR`
@torch.jit.script
def test_func(input):
rv = 10.0
for i in range(5):
rv = rv + input
rv = rv/2
return rv
print(test_func.graph)
```
该中间表示图的结构为:
```
graph(%input.1 : Tensor):
%9 : int = prim::Constant[value=1]()
%5 : bool = prim::Constant[value=1]() # test.py:6:1
%rv.1 : float = prim::Constant[value=10.]() # test.py:5:6
%2 : int = prim::Constant[value=5]() # test.py:6:16
%14 : int = prim::Constant[value=2]() # test.py:8:10
%rv : float = prim::Loop(%2, %5, %rv.1) # test.py:6:1
block0(%i : int, %rv.9 : float):
%rv.3 : Tensor = aten::add(%input.1, %rv.9, %9) # <string>:5:9
%12 : float = aten::FloatImplicit(%rv.3) # test.py:7:2
%rv.6 : float = aten::div(%12, %14) # test.py:8:7
-> (%5, %rv.6)
return (%rv)
```
TorchScript是PyTorch的JIT实现支持使用Python训练模型然后通过JIT转换为语言无关的模块从而提升模型部署能力提高编译性能。同时TorchScript
@@ -116,12 +140,38 @@ Jax机器学习框架同时支持静态图和动态图其中间表示采用Ja
Representation) IR。Jaxpr
IR是一种强类型、纯函数的中间表示其输入、输出都带有类型信息函数输出只依赖输入不依赖全局变量。
![ANF文法与Jaxpr IR](../img/ch04/中间表示-Jaxpr.png)
:width:`800px`
:label:`Jaxpr`
Jaxpr IR的表达采用ANF(A-norm
Form)函数式表达形式,如 :numref:`Jaxpr`所示。ANF形式将表达式划分为两类原子表达式(aexp)和复合表达式(cexp)。原子表达式用于表示常数、变量、原语、匿名函数,复合表达式由多个原子表达式组成,可看作一个匿名函数或原语函数调用,组合的第一个输入是调用的函数,其余输入是调用的参数。
Form)函数式表达形式,ANF文法如下所示
```
<aexp> ::= NUMBER | STRING | VAR | BOOLEAN | PRIMOP
| (lambda (VAR ...) <exp>)
<cexp> ::= (<aexp> <aexp> ...)
(if <aexp> <exp> <exp>)
<exp> ::= (let ([VAR <cexp>]) <exp>) | <cexp> | <aexp>
```
ANF形式将表达式划分为两类原子表达式(aexp)和复合表达式(cexp)。原子表达式用于表示常数、变量、原语、匿名函数复合表达式由多个原子表达式组成可看作一个匿名函数或原语函数调用组合的第一个输入是调用的函数其余输入是调用的参数。如下代码打印了一个函数对应的JaxPr
```python
from jax import make_jaxpr
import jax.numpy as jnp
def test_func(x, y):
ret = x + jnp.sin(y) * 3
return jnp.sum(ret)
print(make_jaxpr(test_func)(jnp.zeros(8), jnp.ones(8)))
```
其对应的JaxPr为
```
{ lambda ; a:f32[8] b:f32[8]. let
c:f32[8] = sin b
d:f32[8] = mul c 3.0
e:f32[8] = add a d
f:f32[] = reduce_sum[axes=(0,)] e
in (f,) }
```
Jax框架结合了Autograd 和 JIT基于Jaxpr
IR支持循环、分支、递归、闭包函数求导以及三阶求导并且支持自动微分的反向传播和前向传播。
@@ -132,8 +182,8 @@ TensorFlow框架同时支持静态图和动态图是一个基于数据流编
为了适配不同的硬件平台基于静态计算图TensorFlow采用了多种IR设计其编译生态系统如 :numref:`TFIR`所示。蓝色部分是基于图的中间表示绿色部分是基于SSA的中间表示。在中间表示的转换过程中各个层级的中间表示各自为政无法互相有效地沟通信息也不清楚其他层级的中间表示做了哪些优化因此每个中间表示只能尽力将当前的优化做到最好造成了很多优化在每个层级的中间表示中重复进行, 从而导致优化效率的低下。尤其是从图中间表示到SSA中间表示的变化过大转换开销极大。此外各个层级的相同优化的代码无法复用也降低了开发效率。
![TensorFlow](../img/ch04/中间表示-MLIR.svg)
:width:`600px`
![TensorFlow](../img/ch04/中间表示-MLIR.png)
:width:`1000px`
:label:`TFIR`
4、MLIR
@@ -178,17 +228,38 @@ typed。每个节点需要有一个具体的类型这个对于性能最大
在结合MindSpore框架的自身特点后MindIR的定义如 :numref:`MindIR`所示。
![MindIR文法。MindIR中的ANode对应于ANF的原子表达式ValueNode用于表示常数值ParameterNode用于表示函数的形参CNode则对应于ANF的复合表达式表示函数调用](../img/ch04/中间表示-MindIR.svg)
:width:`800px`
![MindIR文法。MindIR中的ANode对应于ANF的原子表达式ValueNode用于表示常数值ParameterNode用于表示函数的形参CNode则对应于ANF的复合表达式表示函数调用](../img/ch04/中间表示-MindIR.png)
:width:`1100px`
:label:`MindIR`
接下来我们通过 :numref:`MindIR_example`的一段程序作为示例来进一步分析MindIR。
接下来我们通过如下的一段程序作为示例来进一步分析MindIR。
![MindIR的ANF表达](../img/ch04/中间表示-MindIR示例.png)
:width:`600px`
:label:`MindIR_example`
```python
def func(x, y):
return x / y
在ANF中每个表达式都用let表达式绑定为一个变量通过对变量的引用来表示对表达式输出的依赖而在MindIR中每个表达式都绑定为一个节点通过节点与节点之间的有向边表示依赖关系。其函数图表示如 :numref:`MindIR_graph`所示。
@ms_function
def test_f(x, y):
a = x - 1
b = a + y
c = b * func(a, b)
return c
```
该函数对应的ANF表达式为
```
lambda (x, y)
let a = x - 1 in
let b = a + y in
let func = lambda (x, y)
let ret = x / y in
ret end in
let %1 = func(a, b) in
let c = b * %1 in
c end
```
在ANF中每个表达式都用let表达式绑定为一个变量通过对变量的引用来表示对表达式输出的依赖而在MindIR中每个表达式都绑定为一个节点通过节点与节点之间的有向边表示依赖关系。该函数对应的MindIR的可视化表示如 :numref:`MindIR_graph`所示。
![MindIR的函数图表示](../img/ch04/中间表示-MindIR图.png)
:width:`800px`

View File

@@ -1,11 +1,10 @@
总结
----
## 总结
- 中间表示是编译器的核心数据结构之一,是程序编译过程中介于源语言和目标语言之间的程序表示。
- 传统编译器的中间表示从组织结构出发,可以分为线性中间表示,图中间表示以及混合中间表示。
- 机器学习框架的中间对中间表示有一系列新的需求,这些新的需求是传统中间表示所不能完美支持的。因此需要在传统中间表示的基础上扩展新的,更适用于机器学习框架的中间表示。
- 机器学习框架对中间表示有一系列新的需求,这些新的需求是传统中间表示所不能完美支持的。因此需要在传统中间表示的基础上扩展新的,更适用于机器学习框架的中间表示。
- 自动微分的基本思想是将计算机程序中的运算操作分解为一个有限的基本操作集合,且集合中基本操作的求导规则均为已知,在完成每一个基本操作的求导后,使用链式法则将结果组合得到整体程序的求导结果。
@@ -13,10 +12,19 @@
- 前向自动微分更适用于对输入维度小于输出维度的网络求导,反向自动微分则更适用于对输出维度小于输入维度的网络求导。
- 自动微分的实现方法大体上可以划分为基本表达式法操作符重载法以及代码变化法。
- 自动微分的实现方法大体上可以划分为基本表达式法操作符重载法以及代码变化法。
- 类型系统是指类型的集合以及使用类型来规定程序行为的规则,用于定义不同的类型,指定类型的操作和类型之间的相互作用,广泛应用于编译器、解释器和静态检查工具中。
- 静态分析,是指在不实际运行程序的情况下,通过词法分析、语法分析、控制流、数据流分析等技术对代码进行分析验证的技术
- 编译优化意在解决编译生成的中间表示的低效性,前端执行的均为与硬件无关的编译优化。
## 扩展阅读
- 一种基于图的中间表示类型: [综述](https://dl.acm.org/doi/10.1145/202530.202534)
- 机器学习框架中的自动微分: [综述](https://arxiv.org/abs/1502.05767)
- 函数式框架中的反向自动微分: [综述](https://dl.acm.org/doi/10.1145/1330017.1330018)

View File

@@ -1,13 +1,12 @@
## 适用读者
本书由浅入深地讨论机器学习系统的设计原理和实现。本书的常见读者包括:
本书由浅入深地讨论机器学习系统的设计原理和实现经验。其读者包括:
- **学生:**
随着大量机器学习课程在大学中的普及,学生已经开始掌握大量机器学习的基础理论和神经网络的实现。然而,需要训练出可以实际应用的机器学习模型,需要对现代机器学习系统有充分的认识
本书将帮助学生获得大量机器学习系统的设计原则和一手实践经验。从而帮助其更全面理解机器学习算法的实践挑战和理论优劣
- **科研人员:**
研发新型的机器学习模型不仅仅需要会使用基础的机器学习系统接口。同时新型的模型往往需要给系统提供新的自定义算子Custom
Operators又或者是会利用高级的分布式执行算子来实现大模型的开发。这一系列需求都需要对底层系统具有充分认识。
本书将帮助科研人员学习到机器学习落地实践中遇到的种种挑战,引导设计出能解决大规模实际问题的下一代机器学习算法。
- **开发人员:**
大量的数据和AI驱动的公司都部署了机器学习基础设施。这一设施的核心就是机器学习系统。因此了解机器学习系统有助于开发人员对于系统性能调优以定位问题,并且根据业务需求对机器学习系统进行深度定制。
本书将帮助开发人员深刻理解机器学习系统的内部架构,从而帮助其优化系统性能,调试问题,并且根据业务需求对机器学习系统进行定制。

View File

@@ -1,35 +1,35 @@
## 机器学习系统基本组成
## 基本组成
为了达到上述设计目标,一个现代的机器学习框架往往具有如 :numref:`framework_architecture`所示的基本架构。
一个完整的机器学习系统往往具有如 :numref:`framework_architecture`所示的基本架构。
![机器学习框架基本构成](../img/ch01/framework_architecture.svg)
![机器学习框架基本构成](../img/ch01/framework_architecture.png)
:width:`600px`
:label:`framework_architecture`
- **编程接口:** 一个机器学习框架面向用户的编程接口Programming
interface需要特殊设计。编程接口提供简单易用的编程函数往往是Python从而让用户定义出各式各样的神经网络和相关的训练过程。同时编程接口要兼顾性能神经网络的执行可以调用硬件相关C和C++函数许多加速器和操作系统的编程接口。该部分的内容将在第2章展开。
- **编程接口:** 为了支持广泛的开发者,机器学习框架的编程接口不仅需要高层次简易编程例如PythonJulia和Java同时也需要支持低层次高性能编程利用C和C++函数调用操作系统和硬件加速器)。
- **计算图:**
用户定义的机器学习程序往往会表达成一个计算图Computational
graph。这个计算图使得用户并行计算和异步执行得以实现。该部分内容将在第3章展开。
- **计算加速器:**
现代计算加速器提供了丰富的编程接口让应用来优化其相关性能。而如何高效使用计算加速器是许多机器学习框架的核心。我们将在第4章中讨论加速器的加速原理和相关使用技巧。
利用不同编程接口实现的机器学习程序需要共享一个运行后端。实现这一后端的关键技术是:应用无关的计算图。计算图包含计算节点,节点之间的边表达计算依赖。计算图可以被同步和异步执行。
- **编译器前端:**
在将计算图发送到加速器执行之前,机器学习框架往往会对计算图做一系列硬件无关的一系列优化这一过程被称之为编译器前端。其中核心步骤是对用户定义的神经网络训练实现自动微分。在此期间计算图会被表示为中间表达Intermediate
Representation并同时应用类型系统和静态分析等一系列技术。我们将在第5章中讨论相关内容。
给定一个计算图,机器学习框架会对计算图做一系列优化。和硬件无关的优化由编译器前端实现。编译器前端实现包括:中间表达,自动微分,类型推导和静态分析等等。
- **编译器后端:**
编译器前端生成的中间表达可以进一步针对硬件的特性例如说L2/L3大小指令流水线长度进行性能优化,硬件算子选择内存分配。这一以硬件为核心的编译过程被称为编译器后端该部分内容将在第6章中讨论
- **编译器后端和运行时**
机器学习框架利用编译器后端对计算图可以进一步针对硬件的特性例如说L2/L3大小指令流水线长度进行性能优化。最终优化后的计算图通过运行时执行在通用处理器CPU或者是硬件加速器之上。运行时需要实现算子选择内存分配等技术
- **硬件加速器:**
现代硬件加速器提供了丰富的编程接口。在本书中我们将会介绍硬件加速器的基本组成原理和编程接口。我们同时会给出一个硬件加速器使用案例来从0到1讲述如何高效使用加速器。
- **数据处理:**
机器学习框架会集成多种数据管理模块。其中包括数据处理模块模型参数checkpoint模型可视化和训练结果可视化等。该部分内容将在第7章中讨论
机器学习系统拥有专门的数据处理框架来实现数据读取,存储和预处理的功能由数据处理模块例如TensorFlow的tf.data和PyTorch的DataLoader。这一框架需要针对机器学习应用实现易用性保序性和高效性等设计目标
- **模型部署:**
在模型完成训练后,用户需要对模型进行部署。该过程中我们会根据部署硬件的特点进行模型格式的转换针对硬件特性进行推理性能优化。同时移动硬件往往具有小内存的特点。因此大量的模型压缩技术也在部署中得到应用。这些相关内容将在第8章中讨论
在模型完成训练后,下一个常用的系统功能是模型部署。为了确保模型可以在内存有限的硬件上执行我们会使用模型转换量化蒸馏等模型压缩技术。同时我们也需要实现针对推理硬件平台例如英伟达Jetson的模型算子优化。最后为了保证模型的安全不被黑客窃取实践者还会对模型进行混淆设计
- **分布式训练:**
当模型的训练需要大量内存和算力的时候机器学习框架会提供原生的分布式执行编程接口。分布式机器学习系统已经在工业界得到大量的部署。相关内容会在第9章讨论
分布式训练日渐成为一个机器学习框架的核心组件。本书将介绍常见的分布式训练方法(数据并行,模型并行,混合并行和流水线并行)。同时我们会深入介绍这些方法的高效系统实现(包括集合通讯库和参数服务器)
除了上述核心组件以外机器学习系统作为一个依然高速发展的前沿学科还有大量的问题正在被密集研究相关的前沿问题将在本书的第10章中展开讨论。另外机器学习算法相关的理论知识是本书的预备知识本书不做深入讨论。基础的机器学习理论知识可以在附录中找到。
- **拓展模块:**
机器学习系统的广泛部署使得许多的扩展模块陆续出现。本书将会介绍得到大量实践部署的拓展模块深度学习推荐系统联邦学习系统强化学习系统可解释性AI系统和机器人系统。
机器学习算法相关的理论知识是本书的预备知识,本书不做深入讨论。基础的机器学习理论知识可以在附录中找到。

View File

@@ -1,10 +1,14 @@
## 机器学习应用
通俗来讲,机器学习是指从数据中学习出有用知识的计算技术。从处理的数据类型和学习模式来说机器学习可以分为监督学习Supervised
通俗来讲机器学习是指从数据中学习出有用知识的技术。从学习模式来说机器学习可以分为监督学习Supervised
Learning、无监督学习Unsupervised Learning、强化学习Reinforcement
Learning等。监督学习是已知输入输出对应关系情况下的学习比如给定输入图像和它对应的内容标签则学习图像分类Classification而无监督学习是只有输入数据但不知道输出标签情况下的学习比如给定一堆猫和狗的图像自主学会猫和狗的分类这种无监督分类也称为聚类Clustering强化学习则是给定一个学习环境和任务目标算法自主地去不断尝试、改进自己、以实现任务目标。比如AlphaGo围棋就是用强化学习实现的给定的环境是围棋的规则、而目标则是胜利得分。
Learning
从应用领域上划分,主要可以包括计算机视觉、自然语言处理和智能决策这三大部分,而且这三大部分之间也有很多交集
* 监督学习是已知输入输出对应关系情况下的学习,比如: 给定输入图像和它对应的内容标签学习图像分类Classification
* 无监督学习是只有输入数据但不知道输出标签情况下的学习比如给定一堆猫和狗的图像自主学会猫和狗的分类这种无监督分类也称为聚类Clustering
* 强化学习则是给定一个学习环境和任务目标,算法自主地去不断尝试、改进自己、以实现任务目标 ,比如: AlphaGo围棋就是用强化学习实现的给定的环境是围棋的规则、而目标则是胜利得分。
从应用领域上划分,主要包括计算机视觉、自然语言处理和智能决策这三大部分,而且这三大部分之间也有交集。
狭义上来讲基于图像的应用都可归为计算机视觉方面的应用,典型的应用有人脸识别、物体识别、目标跟踪、人体姿态估计、以及图像的理解、修复、分割与检测等等。
计算机视觉方法广泛应用于自动驾驶、智慧城市、智慧安防等领域。
自然语言处理涉及文本或者语音方面的应用,典型的应用包括语言翻译、文本转语音、语音转文本、以及文本理解、分类、风格变换与纠错等等。
@@ -16,4 +20,4 @@ MachineSVM)、逻辑回归Logistic Regression、朴素贝叶斯Naive
Bayes
等方法。然而得力于大数据互联网和计算机性能的提升以深度学习Deep
Learning为代表的方法得到了广泛的研究和应用。
虽然机器学习算法很多,但无论是经典算法还是深度学习算法的计算往往以向量、矩阵运算为主体的,因此本书主要通过深度神经网络为例子展开机器学习系统的介绍。下面我们来快速了解一下机器学习系统的设计需求、目标以及组成原理。
虽然机器学习算法很多,但无论是经典算法还是深度学习算法的计算往往以向量、矩阵运算为主体的,因此本书主要通过深度神经网络为例子展开机器学习系统的介绍。下面我们来快速了解一下机器学习系统的设计需求、实现目标以及组成原理。

View File

@@ -1,39 +1,38 @@
## 机器学习系统的需求
![机器学习框架](../img/ch01/framework_position.svg)
## 设计目标
![机器学习框架](../img/ch01/framework_position.png)
:width:`600px`
:label:`framework_position`
为了支持日益增长的机器学习应用,开发者普遍需要一个新型的系统软件:机器学习框架(如 :numref:`framework_position`所示)。这种框架一方面可以帮助用户进行高效的开发,另一方面使得机器学习模型的训练和部署可以高效使用通用处理器和计算加速器。在设计机器学习框架的过程,人们总结出了以下几个设计需求
开发者需要设计和实现机器学习系统来满足以下目标(如 :numref:`framework_position`所示)
- **支持多种神经网络:**
深度学习的崛起使得神经网络成为了大量机器学习应用的核心。不同应用具有多种数据形态和机器学习的目标,因此人们设计出了大量不同的神经网络例如卷积神经网络Convolutional
深度学习的巨大成功使得神经网络成为了机器学习应用的核心。不同应用需要不同的神经网络例如卷积神经网络Convolutional
Neural Networks图神经网络Graph Neural
Networks自注意力神经网络Self-attention Neural
Networks等。人们需要一个统一的框架来开发各种各种的神经网络
Networks自注意力神经网络Self-Attention Neural
Networks。这些神经网络需要一个共同的系统软件来进行开发和运行
- **支持自动微分:**
神经网络模型的的一个核心优点是:其可以利用数据、标注Label和目标损失函数Loss
Function自动计算梯度Gradients,以实现机器学习模型的参数更新。一套神经网络模型可以应用在不同的数据场景中。为了实现这个目标,人们希望机器学习框架可以对任意神经网络自动化计算梯度。
为了训练神经网络,我们需要利用数据、标注Label和目标损失函数Loss
Function来计算梯度Gradients。因此,机器学习通系统需要有一个通用的方法来**自动化**计算梯度(这一过程被称之为自动微分)
- **支持数据管理和处理:**
机器学习的核心是数据,这其中不仅包括训练、评估测试数据集还包括训练后产生的模型参数Checkpoint以及训练过程中产生的调试数据Debugging
Data。为了方便这些数据快速导入机器学习框架我们需要框架本身支持不同类型的数据以及进行高效的数据处理数据增强和数据清洗
机器学习的核心是数据。这些数据包括训练、评估测试数据集和模型参数。因此,我们需要系统本身支持数据读取、存储和预处理(例如,数据增强和数据清洗)。
- **支持模型的训练和部署:**
为了让机器学习模型达到最佳的性能,人们需要使用各种优化方法例如Mini-Batch
SGD和其变种)来迭代计算梯度,最终模型的性能达到令开发者满意的状态(该过程称为训练)。同时根据应用的要求训练好的模型也需要部署到各种计算设备中以提供模型推理服务Inference
为了让机器学习模型达到最佳的性能,人们需要使用优化方法(例如Mini-Batch
SGD)来通过多步迭代反复计算梯度(这一过程称为训练)。训练完成后,系统需要将训练好的模型部署推理设备
- **高效使用计算加速器:**
神经网络的相关计算可以被表达成矩阵计算,而这一类计算可以被计算加速器(GPU极大地加速。因此,机器学习框架需要具备高效利用加速器的能力
- **高效使用硬件加速器:**
神经网络的相关计算往往通过矩阵计算实现。这一类计算可以被硬件加速器(例如,通用图形处理器-GPU加速。因此机器学习系统需要高效利用多种硬件加速器
- **分布式计算:**
随着数据量的增大和应用的复杂度上升,人们正设计出与之相对应的大型深度神经网络。这一类神经网络往往需要大量的内存来存储参数。同时它们也需要大量的加速器从而实现计算的加速。因此,机器学习框架需要具备分布式执行的能力。
随着训练数据量和神经网络参数量的上升,机器学习系统的内存用量远远超过了单个机器可以提供的内存。因此,机器学习框架需要天然具备分布式执行的能力。
在设计机器学习系统之初,开发者曾尝试通过传统的**神经网络开发库**如Theano和Caffe、以及**大数据计算框架**如Apache
在设计机器学习系统之初,开发者曾尝试拓展**神经网络开发库**如Theano和Caffe**大数据计算框架**如Apache
Spark和Google
Pregel等方式来达到以上设计目标。可是他们发现(如 :numref:`comparison_of_ml_frameworks`所示),
神经网络库虽然提供了神经网络开发、自动微分和加速器的支持,但是其缺乏管理和处理大型数据集、模型部署和分布式执行的能力,使得其无法满足产品级机器学习应用的开发。
此外,虽然大数据计算框架具有成熟的分布式执行和数据管理能力,但是其缺乏对神经网络、自动微分和加速器的支持,使得其并不适合开发以神经网络为核心的机器学习应用。因此,业界从头设计出了包括MindSpore、PaddlePaddle、TensorFlowPyTorch等一系列机器学习框架。
Pregel来达到以上目标。可是他们发现如 :numref:`comparison_of_ml_frameworks`所示),
神经网络库虽然提供了神经网络开发、自动微分和硬件加速器的支持,但是其缺乏管理和处理大型数据集、模型部署和分布式执行的能力,无法满足产品级机器学习应用的开发任务
另一方面虽然大数据计算框架具有成熟的分布式执行和数据管理能力但是其缺乏对神经网络、自动微分和加速器的支持使得其并不适合开发以神经网络为核心的机器学习应用。因此业界设计出了包括MindSpore、PaddlePaddle、TensorFlowPyTorch等一系列新型机器学习系统(框架
:机器学习框架和相关系统的比较

View File

@@ -41,7 +41,7 @@ $round(\cdot)$和$clip(\cdot)$分别表示取整和截断操作,$q_{min}$和$q
#### 训练后量化
训练后量化也可以分成两种权重量化和全量化。权重量化仅量化模型的权重以压缩模型的大小在推理时将权重反量化为原始的FP32数据后续推理流程与普通的FP32模型一致。权重量化的好处是不需要校准数据集不需要实现量化算子且模型的精度误差较小由于实际推理使用的仍然是FP32算子所以推理性能不会提高。全量化不仅会量化模型的权重还会量化模型的激活值在模型推理时执行量化算子来加快模型的推理速度为了量化激活值,需要用户提供一定数量的校准数据集用于统计每一层激活值的分布,并对量化后的算子做校准。校准数据集可以来自训练数据集或者真实场景的输入数据,需要数量通常非常小。在做训练后量化时会以校准数据集为输入,执行推理流程然后统计每层激活值的数据分布并得到相应的量化参数,具体的操作流程如下:
训练后量化也可以分成两种权重量化和全量化。权重量化仅量化模型的权重以压缩模型的大小在推理时将权重反量化为原始的FP32数据后续推理流程与普通的FP32模型一致。权重量化的好处是不需要校准数据集不需要实现量化算子且模型的精度误差较小由于实际推理使用的仍然是FP32算子所以推理性能不会提高。全量化不仅会量化模型的权重还会量化模型的激活值在模型推理时执行量化算子来加快模型的推理速度为了量化激活值,需要用户提供一定数量的校准数据集用于统计每一层激活值的分布,并对量化后的算子做校准。校准数据集可以来自训练数据集或者真实场景的输入数据,需要数量通常非常小。在做训练后量化时会以校准数据集为输入,执行推理流程然后统计每层激活值的数据分布并得到相应的量化参数,具体的操作流程如下:
- 使用直方图统计的方式得到原始FP32数据的统计分布$P_f$
@@ -90,13 +90,13 @@ $$\zeta_c=\frac{||w_c-E(w_c)||}{||\hat{w_c}-E(\hat{w_c})||}$$
#### 稀疏策略
明确了模型稀疏的对象之后,我们需要确定模型稀疏的具体策略,具体来说我们需要决定何时对模型进行稀疏以及如何对模型进行稀疏。目前最常见模型稀疏的一般流程为:预训练、剪枝、微调。具体而言,我们首先需要训练得到一个收敛的稠密模型,然后在此基础上进行稀疏和微调。选择在预训练之后进行稀疏动作的原因基于这样一个共识,即预训练模型的参数蕴含了学习到的知识,继承这些知识然后进行稀疏得到的模型效果要比从头开始训练好。除了基于预训练模型进行进一步修剪之外,训练和剪枝交替进行也是一种常用的策略。相比于一步修剪的方法,这种逐步的修剪方式,使得训练和剪枝紧密结合,可以更有效地发现冗余的卷积核,被广泛采用于现代神经网络剪枝方法中。
明确了模型稀疏的对象之后,我们需要确定模型稀疏的具体策略,具体来说我们需要决定何时对模型进行稀疏以及如何对模型进行稀疏。目前最常见模型稀疏的一般流程为:预训练、剪枝、微调。具体而言,我们首先需要训练得到一个收敛的稠密模型,然后在此基础上进行稀疏和微调。选择在预训练之后进行稀疏动作的原因基于这样一个共识,即预训练模型的参数蕴含了学习到的知识,继承这些知识然后进行稀疏得到的模型效果要比从头开始训练好。除了基于预训练模型进行进一步修剪之外,训练和剪枝交替进行也是一种常用的策略。相比于一步修剪的方法,这种逐步的修剪方式,使得训练和剪枝紧密结合,可以更有效地发现冗余的卷积核,被广泛采用于现代神经网络剪枝方法中。
以下通过一个具体实例(Deep Compression([@han2015deep])
来说明如何进行网络修剪:如 :numref:`ch08-fig-deepcomp`所示在去掉大部分的权值之后深度卷积神经网络的精度将会低于其原始的精度。对剪枝后稀疏的神经网络进行微调可以进一步提升压缩后网络的精度。剪枝后的模型可以进一步进行量化使用更低比特的数据来表示权值此外结合霍夫曼Huffman编码可以进一步地降低深度神经网络的存储。
![Deep Compression([@han2015deep])](../img/ch08/deepcomp.png)
:width:`700px`
:width:`800px`
:label:`ch08-fig-deepcomp`
除了直接去除冗余的神经元之外,基于字典学习的方法也可以用来去掉深度卷积神经网络中无用的权值([@bagherinezhad2017lcnn])。通过学习一系列卷积核的基可以把原始卷积核变换到系数域上并且它们稀疏。比如Bagherinezhad等人([@bagherinezhad2017lcnn])将原始卷积核分解成卷积核的基和稀疏系数的加权线性组合。
@@ -113,10 +113,10 @@ $$\mathcal{L}_{KD}(\theta_S) = \mathcal{H}(o_S,\mathbf{y}) +\lambda\mathcal{H}(\
其中,$\mathcal{H}(\cdot,\cdot)$是交叉熵函数,$o_S$和$o_T$分别是学生网络和教师网络的输出,$\mathbf{y}$是标签。公式 :eqref:`ch08-equ-c2Fcn_distill`中的第一项使得学生神经网络的分类结果接近预期的真实标签,而第二项的目的是提取教师神经网络中的有用信息并传递给学生神经网络,$\lambda$是一个权值参数用来平衡两个目标函数。$\tau(\cdot)$是一个软化soften函数将网络输出变得更加平滑。
公式 :eqref:`ch08-equ-c2Fcn_distill`仅仅从教师神经网络分类器输出的数据中提取有价值的信息并没有从其它中间层去将教师神经网络的信息进行挖掘。因此Romero等人[@FitNet]进一步地开发了一种学习轻型学生神经网络的方法该算法可以从教师神经网络中任意的一层来传递有用的信息给学生神经网络。此外事实上并不是所有的输入数据对卷积神经网络的计算和完成后续的任务都是有用的。例如在一张包含一个动物的图像中对分类和识别结果比较重要的是动物所在的区域而不是那些无用的背景信息。所以有选择性地从教师神经网络的特征图中提取信息是一个更高效的方式。于是Zagoruyko和Komodakis[@attentionTS]提出了一种基于感知attention损失函数的学习方法来提升学生神经网络的性能如 :numref:`ch08-fig-AttentionTS`所示。该算法在学习学生神经网络的过程中引入了Attention模块,选择性地将教师神经网络中的信息传递给学生神经网络,并帮助其进行训练。
公式 :eqref:`ch08-equ-c2Fcn_distill`仅仅从教师神经网络分类器输出的数据中提取有价值的信息并没有从其它中间层去将教师神经网络的信息进行挖掘。因此Romero等人[@FitNet]进一步地开发了一种学习轻型学生神经网络的方法该算法可以从教师神经网络中任意的一层来传递有用的信息给学生神经网络。此外事实上并不是所有的输入数据对卷积神经网络的计算和完成后续的任务都是有用的。例如在一张包含一个动物的图像中对分类和识别结果比较重要的是动物所在的区域而不是那些无用的背景信息。所以有选择性地从教师神经网络的特征图中提取信息是一个更高效的方式。于是Zagoruyko和Komodakis[@attentionTS]提出了一种基于感知attention损失函数的学习方法来提升学生神经网络的性能公式 :eqref:`ch08-equ-c2Fcn_distill`仅仅从教师神经网络分类器输出的数据中提取有价值的信息并没有从其它中间层去将教师神经网络的信息进行挖掘。因此Romero等人[@FitNet]进一步地开发了一种学习轻型学生神经网络的方法该算法可以从教师神经网络中任意的一层来传递有用的信息给学生神经网络。此外事实上并不是所有的输入数据对卷积神经网络的计算和完成后续的任务都是有用的。例如在一张包含一个动物的图像中对分类和识别结果比较重要的是动物所在的区域而不是那些无用的背景信息。所以有选择性地从教师神经网络的特征图中提取信息是一个更高效的方式。于是Zagoruyko和Komodakis[@attentionTS]提出了一种基于感知attention损失函数的学习方法来提升学生神经网络的性能如 :numref:`ch08-fig-distillation`所示。该算法在学习学生神经网络的过程中,引入了感知模块Attention选择性地将教师神经网络中的信息传递给学生神经网络并帮助其进行训练。感知图可以识别输入图像不同位置对最终分类结果的重要性,并从教师网络传递到学生网络。
![文献([@attentionTS])所提出的教师神经网络-学生神经网络学习算法该算法在学习学生神经网络的过程中引入了感知模块Attention选择性地将教师神经网络中的信息传递给学生神经网络并帮助其进行训练。感知图可以识别输入图像不同位置对最终分类结果的重要性并从教师网络传递到学生网络。](../img/ch08/AttentionTS.png)
:width:`800px`
:label:`ch08-fig-AttentionTS`
![一种基于感知(attention的教师神经网络-学生神经网络学习算法](../img/ch08/distillation.png)
:width:`500px`
:label:`ch08-fig-distillation`
知识蒸馏是一种有效的帮助小网络优化的方法,能够进一步和剪枝、量化等其他压缩方法结合,训练得到精度高、计算量小的高效模型。

View File

@@ -4,7 +4,7 @@
前面我们提到过不同的训练框架Tensorflow、PyTorch、MindSpore、MXNet、CNTK等都定义了自己的模型的数据结构推理系统需要将它们转换到统一的一种数据结构上。Open Neural Network Exchange(ONNX正是为此目的而设计的。ONNX支持广泛的机器学习运算符集合并提供了不同训练框架的转换器例如TensorFlow模型到ONNX模型的转换器、PyTorch模型到ONNX模型的转换器等。
模型转换本质上是将模型这种结构化的数据从一种数据结构转换为另一种数据结构的过程。进行模型转换首先要分析两种数据结构的异同点然后针对结构相同的数据做搬运对于结构相似的数据做一一映射对于结构差异较大的数据则需要根据其语义做合理的数据转换更进一步如果两种数据结构上存在不兼容则模型转换无法进行。ONNX的一个优势就在于其强大的表达能力从而大多数业界框架的模型都能够转换到ONNX的模型上来而不存在不兼容的情况.
模型可以抽象为一种图,从而模型的数据结构可以解构为以下两个要点:
模型可以抽象为一种图,从而模型的数据结构可以解构为以下两个要点:
- 模型拓扑表达从图的角度来说就是图的边从模型的角度来说就是模型中的数据流和控制流等模型数据流和控制流的定义又可以引申出子图的表达形式、模型输入输出的表达形式、控制流结构的表达形式等。比如Tensorflow1.x中的控制流表达为一种有环图通过Enter、Exit、Switch、LoopCond、NextIteration等算子来解决成环而ONNX通过LoopIf等算子来表达控制流从而避免引入了有环所以在将Tensorflow1.x的控制流模型转化为ONNX模型时需要将Tensorflow模型中的控制流图结构融合成ONNX的While或者If算子。
@@ -35,7 +35,7 @@ $$\pmb{Y_{conv}}=\pmb{W_{conv}}*\pmb{X_{conv}}+\pmb{B_{conv}}$$
这里我们不需要理解公式 :eqref:`ch08-equ-conv_equation`中每个变量的含义,只需要注意到一点,该公式是$\pmb{Y_{conv}}$关于$\pmb{X_{conv}}$的,其他符号均表示常量。
Batchnorm算子的计算过程如公式 :eqref:`equ:bn-equation`所示。
Batchnorm算子的计算过程如公式 :eqref:`ch08-equ-bn_equation`所示。
$$\pmb{Y_{bn}}=\gamma\frac{\pmb{X_{bn}}-\mu_{\mathcal{B}}}{\sqrt{{\sigma_{\mathcal{B}}}^{2}+\epsilon}}+\beta$$
:eqlabel:`ch08-equ-bn_equation`
@@ -71,7 +71,7 @@ $$\pmb{Y_{bn}}=\pmb{A}*\pmb{X_{conv}}+\pmb{B}$$
:width:`500px`
:label:`ch08-fig-bn_replace`
如 :numref:`ch08-fig-bn_replace`我们以Batchnorm算子替换成Scale算子为例阐述算子替换的原理。我们直接将Batchnorm的计算公式 :eqref:`ch08-equ-replace_scale`进行分解并将常量合并简化Batchnorm的计算公式可以写成
如 :numref:`ch08-fig-bn_replace`我们以Batchnorm算子替换成Scale算子为例阐述算子替换的原理。我们直接将Batchnorm的计算公式 :eqref:`ch08-equ-bn_equation`进行分解并将常量合并简化Batchnorm的计算公式可以写成
$$\pmb{Y_{bn}}=scale*\pmb{X_{bn}}+offset$$
:eqlabel:`ch08-equ-replace_scale`
@@ -88,6 +88,6 @@ $$\pmb{Y_{bn}}=scale*\pmb{X_{bn}}+offset$$
:width:`500px`
:label:`ch08-fig-crop_reorder`
如 :numref:`ch08-fig-crop_reorder`Crop算子是从输入的feature map中裁取一部分作为输出经过Crop算子后feature map的size就降低了。如果我们将这个裁切的过程前移提前对feature map进行裁切那么后续算子的计算量也会相应地减少从而提高模型部署时的推理性能。Crop算子前移带来的性能提升跟Crop算子的参数有关。但是Crop算子一般只能沿着element wise类算子前移。
如 :numref:`ch08-fig-crop_reorder`Crop算子是从输入的feature map中裁取一部分作为输出经过Crop算子后feature map的size就降低了。如果我们将这个裁切的过程前移提前对feature map进行裁切那么后续算子的计算量也会相应地减少从而提高模型部署时的推理性能。Crop算子前移带来的性能提升跟Crop算子的参数有关。但是Crop算子一般只能沿着element wise类算子前移。
通过前面的实验数据我们可以看到,通过推理前的模型优化,可以为推理的时延、功耗、内存占用带来极大的收益。

View File

@@ -20,8 +20,6 @@
- 处理离群值: 离群值是与数据中的其他值保持一定距离的数据点,适当地排除离群值可以提升模型的准确性。
针对特定的原始数据往往存在特定的数据处理手段。在前述8.2"机器学习数据基本类型及常见数据变换方式"章节中,分别详细介绍了图像、音频、文本等数据的预处理方法。
#### 后处理
通常,模型推理结束后,需要把推理的输出数据传递给用户完成后处理,常见的数据后处理手段有:
@@ -125,48 +123,36 @@ ARMv8系列的CPU上有32个NEON寄存器v0-v31如 :numref:`ch08-fig-register
卷积计算归根到底是矩阵乘法,两个二维矩阵相乘的时间复杂度是$O(n^3)$。我们可以使用Winograd来降低矩阵乘法的复杂度。
以一维卷积运算为例记为F(mr)其中m代表输出的个数r为卷积核的个数。输入为$d=[d_0 \ d_0 \ d_2 \ d_3]$,卷积核为$g=[g_0 \ g_0 \ g_2]^T$,该卷积计算可以写成矩阵形式如公式 :eqref:`ch08-equ-conv_matmul_one_dimension`所示需要6次乘法和4次加法。
以一维卷积运算为例记为F(mr)其中m代表输出的个数r为卷积核的个数。输入为$d=[d_0 \ d_1 \ d_2 \ d_3]$,卷积核为$g=[g_0 \ g_1 \ g_2]^T$,该卷积计算可以写成矩阵形式如公式 :eqref:`ch08-equ-conv_matmul_one_dimension`所示需要6次乘法和4次加法。
$$F(2, 3)=
\left[ \begin{matrix} d_0 & d_0 & d_2 \\ d_1 & d_2 & d_3 \end{matrix} \right] \left[ \begin{matrix} g_0 \\ g_1 \\ g_2 \end{matrix} \right]=
\left[ \begin{matrix} y_0 \\ y_1 \end{matrix} \right]$$
$$F(2, 3)=\left[ \begin{matrix} d_0 & d_1 & d_2 \\ d_1 & d_2 & d_3 \end{matrix} \right] \left[ \begin{matrix} g_0 \\ g_1 \\ g_2 \end{matrix} \right]=\left[ \begin{matrix} y_0 \\ y_1 \end{matrix} \right]$$
:eqlabel:`ch08-equ-conv_matmul_one_dimension`
可以观察到,卷积运算转换为矩阵乘法时输入矩阵中存在着重复元素$d_1$和$d_2$,因此,卷积转换的矩阵乘法相对一般的矩阵乘有了优化空间。可以通过计算中间变量$m_0-m_3$得到矩阵乘的结果,见公式 :eqref:`ch08-equ-conv-2-winograd`
$$F(2, 3)=
\left[ \begin{matrix} d_0 & d_0 & d_2 \\ d_1 & d_2 & d_3 \end{matrix} \right] \left[ \begin{matrix} g_0 \\ g_1 \\ g_2 \end{matrix} \right]=
\left[ \begin{matrix} m_0+m_1+m_2 \\ m_1-m_2+m_3 \end{matrix} \right]$$
$$F(2, 3)=\left[ \begin{matrix} d_0 & d_1 & d_2 \\ d_1 & d_2 & d_3 \end{matrix} \right] \left[ \begin{matrix} g_0 \\ g_1 \\ g_2 \end{matrix} \right]=\left[ \begin{matrix} m_0+m_1+m_2 \\ m_1-m_2+m_3 \end{matrix} \right]$$
:eqlabel:`ch08-equ-conv-2-winograd`
其中,$m_0-m_3$的分别见公式 :eqref:`ch08-equ-winograd-param`
$$\begin{aligned}
m_0=(d_0-d_2)*g_0 \\
m_1=(d_1+d_2)*(\frac{g_0+g_1+g_2}{2}) \\
m_2=(d_0-d_2)*(\frac{g_0-g_1+g_2}{2}) \\
m_2=(d_1-d_3)*g_2
\end{aligned}$$
$$\begin{aligned}m_0=(d_0-d_2)*g_0 \\m_1=(d_1+d_2)*(\frac{g_0+g_1+g_2}{2}) \\m_2=(d_0-d_2)*(\frac{g_0-g_1+g_2}{2}) \\m_2=(d_1-d_3)*g_2\end{aligned}$$
:eqlabel:`ch08-equ-winograd-param`
通过$m_0-m_3$间接计算r1r2需要的运算次数包括输入d的4次加法输出m的4次乘法和4次加法。在推理阶段权重的数值是常量因此卷积核上的运算可以在图编译阶段计算不计入在线的run时间。所以总的运算次数为4次乘法和8次加法与直接运算的6次乘法和4次加法相比乘法次数减少加法次数增加。在计算机中乘法一般比加法慢通过减少乘法次数增加少量加法可以实现加速。
计算过程写成矩阵形式如公式 :eqref:`ch08-equ-winograd-matrix`所示其中⊙为对应位置相乘A、B、G都是常量矩阵。这里写成矩阵计算是为了表达清晰实际使用时按照公式 :eqref:`ch08-equ-winograd-param`手写展开的计算速度更快。
$$\mathbf{Y}=\mathbf{A^T}(\mathbf{G}g)*(\mathbf{B^T}d)$$
:label:`ch08-equ-winograd-matrix`
$$\mathbf{B^T}=
\left[ \begin{matrix} 1 & 0 & -1 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & -1 & 1 & 0 \\ 0 & 1 & 0 & -1 \end{matrix} \right]$$
$$\mathbf{Y}=\mathbf{A^T}(\mathbf{G}g)*(\mathbf{B^T}d)$$
:eqlabel:`ch08-equ-winograd-matrix`
$$\mathbf{B^T}=\left[ \begin{matrix} 1 & 0 & -1 & 0 \\ 0 & 1 & 1 & 0 \\ 0 & -1 & 1 & 0 \\ 0 & 1 & 0 & -1 \end{matrix} \right]$$
:eqlabel:`ch08-equ-winograd-matrix-bt`
$$\mathbf{G}=
\left[ \begin{matrix} 1 & 0 & 0 \\ 0.5 & 0.5 & 0.5 \\ 0.5 & -0.5 & 0.5 \\ 0 & 0 & 1 \end{matrix} \right]$$
$$\mathbf{G}=\left[ \begin{matrix} 1 & 0 & 0 \\ 0.5 & 0.5 & 0.5 \\ 0.5 & -0.5 & 0.5 \\ 0 & 0 & 1 \end{matrix} \right]$$
:eqlabel:`ch08-equ-winograd-matrix-g`
$$\mathbf{A^T}=
\left[ \begin{matrix} 1 & 1 & -1 & 0 \\ 0 & 1 & -1 & -1 \end{matrix} \right] \\$$
$$\mathbf{A^T}=\left[ \begin{matrix} 1 & 1 & -1 & 0 \\ 0 & 1 & -1 & -1 \end{matrix} \right] \\$$
:eqlabel:`ch08-equ-winograd-matrix-at`

View File

@@ -11,3 +11,11 @@
- 针对模型的推理功耗,主要的优化思路是降低模型的计算量,这与针对模型推理时延的优化手段有重合之处,可以参考离线的模型优化技术 :numref:`ch08-sec-fusion`和模型压缩技术 :numref:`ch08-sec-model_compression`
- 本章除了介绍优化模型部署的各方面指标的优化技术以外,还介绍了安全部署相关的技术,如模型混淆、模型加密等。部署安全一方面可以保护企业的重要资产,另一方面可以防止黑客通过篡改模型从而入侵攻击部署环境。
## 扩展阅读
- Google量化白皮书 [量化](https://arxiv.org/abs/1806.08342)
- 诺亚高精度剪枝算法 [剪枝](https://arxiv.org/abs/2010.10732)
- 针对多核处理器的自动图并行调度框架 [性能优化](https://proceedings.mlsys.org/paper/2021/file/a5e00132373a7031000fd987a3c9f87b-Paper.pdf)

View File

@@ -12,7 +12,7 @@
上述四个方面的不同需求在设计AI框架系统的时候需要基于场景充分的予以考虑另外还需要考虑
通用性:也可以称为泛化性,是不是所有的模型算法同一套代码,没有针对某个网络的特殊定制代码? 是不是所有硬件同一套机制,在机器学习系统中针对特定硬件版本的定制只存在于硬件相关层?上面提到的不同环境下部署要求千差万别,是同一套方案还是几套方案来支持呢
通用性:也可以称为泛化性,是不是所有的模型算法同一套代码,没有针对某个网络的特殊定制代码? 是不是所有硬件同一套机制,在机器学习系统中针对特定硬件版本的定制只存在于硬件相关层?上面提到的不同环境下部署要求千差万别,是同一套方案还是几套方案来支持呢
易用性:对新用户而言,易用性关注更多的是入门的门槛,能不能一键式的安装、升级和运行常见的模型;对深度用户,如:算法研究人员而言,是不是能够轻松的表达算法、调试算法和部署算法模型是易用性的重点。另外,生态兼容性是易用性的一个重要考量,方便的使用常用的工具、第三方库兼容和对接,支持更多的硬件进行训练和部署是重要的因素。

View File

@@ -40,7 +40,8 @@ Binding。在Pybind11出现以前将C和C++函数进行Python绑定的手
- 算子属性:构造函数\_\_init\_\_中初始化属性因加法没有属性因此\_\_init\_\_不需要额外输入。
- 算子输入输出及合法性校验infer_shape方法中约束两个输入维度必须相同输出的维度和输入维度相同。infer_dtype方法中约束两个输入数据必须是float32类型输出的数据类型和输入数据类型相同。
算子输出
- 算子输出
MindSpore中实现注册TensorAdd代码如下
```python

View File

@@ -2,7 +2,7 @@
现代机器学习框架包含大量的组件。这些组件使得用户得以高效开发机器学习算法处理数据部署模型性能调优和使用硬件加速器。在设计这些组件的编程接口时一个核心的诉求是如何平衡框架性能和易用性为了达到最优的性能开发者需要利用硬件亲和的编程语言如C和C++来进行开发。这是因为C和C++的使用使得机器学习框架可以高效调用硬件的底层API从而最大限度发挥硬件性能。同时现代操作系统如Linux和Windows提供丰富的基于C和C++的编程接口如文件系统网络编程多线程管理等通过直接调用操作系统API可以降低框架运行的开销。
从易用性的角度分析,机器学习框架的使用者往往具有丰富的行业背景(如数据科学家,生物学家,化学家,物理学家等)。他们常用的编程语言是高层次脚本语言PythonMatlabR和Julia。相比于C和C++这些语言在提供编程的易用性的同时丧失了C和C++对底层硬件和操作系统进行深度优化的能力。因此机器学习框架的核心设计目标是其要具有易用编程接口来支持用户用高层次语言如Python来实现机器学习算法同时其也要具备以C和C++为核心的低层次编程接口使得框架开发者可以用C和C++实现大量高性能组件,从而在硬件上高效执行。在本章中,我们将会讲述如何达到这个设计目标。
从易用性的角度分析机器学习框架的使用者往往具有丰富的行业背景如数据科学家生物学家化学家物理学家等。他们常用的编程语言是高层次脚本语言PythonMatlabR和Julia。相比于C和C++这些语言在提供编程的易用性的同时丧失了C和C++对底层硬件和操作系统进行深度优化的能力。因此机器学习框架的核心设计目标是其要具有易用编程接口来支持用户用高层次语言如Python来实现机器学习算法同时其也要具备以C和C++为核心的低层次编程接口使得框架开发者可以用C和C++实现大量高性能组件,从而在硬件上高效执行。在本章中,我们将会讲述如何达到这个设计目标。
本章的学习目标包括:

View File

@@ -3,7 +3,7 @@
机器学习系统编程模型的首要设计目标是:对开发者的整个工作流进行完整的编程支持。一个常见的机器学习任务一般包含如 :numref:`img_workflow`所示的流程。这个工作流完成了训练数据集的读取模型的训练测试和调试。通过归纳我们可以将这一工作流中用户所需要自定义的部分通过定义以下API来支持我们这里假设用户的高层次API以Python函数的形式提供
- **数据处理:**
首先用户需要数据处理API来支持将数据集从磁盘读入。进一步用户需要对读取数据进行数据预处理,从而可以将数据输入后续的机器学习模型中。
首先用户需要数据处理API来支持将数据集从磁盘读入。进一步用户需要对读取数据进行预处理,从而可以将数据输入后续的机器学习模型中。
- **模型结构:**
完成数据的读取后用户需要模型定义API来定义机器学习模型。这些模型带有模型参数可以对给定的数据进行推理。
@@ -19,7 +19,7 @@
- **测试和调试:**
训练过程中用户需要测试API来对当前模型的精度进行评估。当精度达到目标后训练结束。这一过程中用户往往需要调试API来完成对模型的性能和正确性进行验证。
![机器学习系统工作流](../img/ch02/workflow.svg)
![机器学习系统工作流](../img/ch02/img_workflow.svg)
:width:`800px`
:label:`img_workflow`
@@ -43,7 +43,7 @@ AI处理器上则--device_target选择Ascend代码运行在CPU、GPU同理
### 数据处理
配置好运行信息后首先讨论数据处理API的设计。这些API提供了大量Python函数支持用户用一行命令即可读入常见的训练数据集如MNISTCIFARCOCO等
在加载之前需要下载数据集存放在./datasets/MNIST_Data路径中MindSpore提供了用于数据处理的API模块
在加载之前需要下载数据集存放在./datasets/MNIST_Data路径中MindSpore提供了用于数据处理的API模块
mindspore.dataset用于存储样本和标签。在加载数据集前通常会对数据集进行一些处理mindspore.dataset也集成了常见的数据处理方法。
以下代码读取了MNIST的数据是大小为$28 \times 28$的图片返回DataSet对象。
@@ -125,7 +125,7 @@ net = MLPNet()
**SGD**的更新是对每个样本进行梯度下降因此计算速度很快但是单样本更新频繁会造成震荡为了解决震荡问题提出了带有Momentum的SGD该方法的参数更新不仅仅由梯度决定也和累计的梯度下降方向有关使得增加更新梯度下降方向不变的维度减少更新梯度下降方向改变的维度从而速度更快也减少震荡。
自适应学习率**AdaGrad**是通过以往的梯度自适应更新学习率不同的参数$W_i$具有不同的学习率。AdaGrad对频繁变化的参数以更小的步长更新而稀疏的参数以更大的步长更新。因此对稀疏的数据表现比较好。**Adadelta**是对AdaGrad的改进解决了AdaGrad优化过程中学习率$\alpha$单调减少问题Adadelta不对过去的梯度平方进行累加用指数平均的方法计算二阶动量避免了二阶动量持续累积导致训练提前结束。**Adam**可以理解为Adadelta和Momentum的结合对一阶二阶动量均采用指数平均的方法计算。
自适应学习率**AdaGrad**是通过以往的梯度自适应更新学习率不同的参数$W_i$具有不同的学习率。AdaGrad对频繁变化的参数以更小的步长更新而稀疏的参数以更大的步长更新。因此对稀疏的数据表现比较好。**Adadelta**是对AdaGrad的改进解决了AdaGrad优化过程中学习率$\alpha$单调减少问题Adadelta不对过去的梯度平方进行累加用指数平均的方法计算二阶动量避免了二阶动量持续累积导致训练提前结束。**Adam**可以理解为Adadelta和Momentum的结合对一阶二阶动量均采用指数平均的方法计算。
MindSpore提供了丰富的API来让用户导入损失函数和优化器。在下面的例子中计算了输入和真实值之间的softmax交叉熵损失导入Momentum优化器。
```python

View File

@@ -89,7 +89,7 @@ output = fully_connected(output, fc3_weights)
随着深度神经网络应用领域的扩大诞生出了丰富的模型构建组件。在卷积神经网络的计算过程中前后的输入是没有联系的然而在很多任务中往往需要处理序列信息如语句、语音、视频等为了解决此类问题诞生出循环神经网络Recurrent Neural NetworkRNN
循环神经网络很好的解决了序列数据的问题但是随着序列的增加长序列又导致了训练过程中梯度消失和梯度爆炸的问题因此有了长短期记忆Long Short-term MemoryLSTM
在语言任务中还有Seq2Seq它将RNN当成编解码Encoder-Decoder结构的编码器Encoder和解码器Decode
在解码器中又常常使用注意力机制Attention;基于编解码器和注意力机制又有Transformer
在解码器中又常常使用注意力机制Attention基于编解码器和注意力机制又有Transformer
Transformer又是BERT模型架构的重要组成。随着深度神经网络的发展未来也会诞生各类模型架构架构的创新可以通过各类神经网络基本组件的组合来实现。
### 神经网络层的实现原理
@@ -119,7 +119,7 @@ Cell和Module是模型抽象方法也是所有网络的基类。
:width:`800px`
:label:`cell_abs`
神经网络接口层基类实现,仅做了简化的描述,在实际实现时,执行计算的\_\_call\_\_方法并不会让用户直接重载它往往在\_\_call\_\_之外定义一个执行操作的方法对于神经网络模型该方法是实现网络结构的连接对于神经网络层则是实现计算过程然后在\_\_call\_\_调用如MindSpore的Cell因为动态图和静态图的执行是不一样的因此在\_\_call\_\_里定义动态图和计算图的计算执行在construct方法里定义层或者模型的操作过程。
神经网络接口层基类实现,仅做了简化的描述,在实际实现时,执行计算的\_\_call\_\_方法并不会让用户直接重载它往往在\_\_call\_\_之外定义一个执行操作的方法对于神经网络模型该方法是实现网络结构的连接对于神经网络层则是实现计算过程\_\_call\_\_调用如MindSpore的Cell因为动态图和静态图的执行是不一样的因此在\_\_call\_\_里定义动态图和计算图的计算执行在construct方法里定义层或者模型的操作过程。
### 自定义神经网络层
@@ -146,7 +146,8 @@ class Conv2D(Cell):
```
有了上述定义在使用卷积层时,就不需要创建训练变量了。
如我们需要对$30 \times 30$大小10个通道的输入使用$3 \times 3$的卷积核做卷积卷积后输出通道为20调用方式如下:
如我们需要对$30 \times 30$大小10个通道的输入使用$3 \times 3$的卷积核做卷积卷积后输出通道为20
调用方式如下:
```python
conv = Conv2D(in_channel=10, out_channel=20, filter_size=3, stride=2, padding=0)
output = conv(input)

View File

@@ -19,3 +19,8 @@
- Python和C之间的互操作性一般通过CType等技术实现。
- 机器学习框架一般具有多种C和C++接口允许用户定义和注册C++实现的算子。这些算子使得用户可以开发高性能模型,数据处理函数,优化器等一系列框架拓展。
## 扩展阅读
- MindSpore编程指南[MindSpore](https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.6/index.html)
- Python和C/C++混合编程:[Pybind11](https://pybind11.readthedocs.io/en/latest/basics.html#creating-bindings-for-a-simple-function)

View File

@@ -5,12 +5,12 @@
### 推荐模型
基于深度学习的推荐模型在过去几年受到了学术界和工业界的高度关注,得到了快速发展。目前主流的推荐模型 :cite:`10.1145/2988450.2988454,10.1145/3124749.3124754,ijcai2017-239,naumov2019deep`的基本结构可以总结如图 :numref:`ch10-recommendation-models`
![推荐模型的基本结构](../img/ch10/ch10-recommendation-models.svg)
![推荐模型的基本结构](../img/ch10/ch10-recommendation-models.png)
:width:`800px`
:label:`ch10-recommendation-models`
推荐模型以用户和内容的交互历史、用户属性、内容属性等特征作为输入,输入特征进行充分相互作用再将交互结果交由稠密深度神经网络来预测用户点击候选内容的可能性。为了加深读者的对推荐模型的理解此处我们以Wide & Deep模型 :cite:`10.1145/2988450.2988454`作为例子深入分析推荐模型的输入特征以及输入特征之间如何交互。由于推荐模型的设计不在本章的讨论范围内所以下面的介绍中重点介绍模型的基本结构以方便理解推荐系统的设计。对Wide & Deep模型的设计理念、数据生成、数据预处理等细节感兴趣的读者可以自行阅读论文以进一步了解。
推荐模型以用户和内容的交互历史、用户属性、内容属性等特征作为输入,输入特征进行充分相互作用再将交互结果交由稠密深度神经网络来预测用户点击候选内容的可能性。为了加深读者的对推荐模型的理解此处我们以Wide & Deep模型 :cite:`10.1145/2988450.2988454`作为例子深入分析推荐模型的输入特征以及输入特征之间如何交互。由于推荐模型的设计不在本章的讨论范围内所以下面的介绍中重点介绍模型的基本结构以方便理解推荐系统的设计。对Wide & Deep模型的设计理念、数据生成、数据预处理等细节感兴趣的读者可以自行阅读论文以进一步了解。
Wide & Deep模型是一个设计简洁然而性能优异的模型由谷歌Google在开发并应用于谷歌应用商店中该模型在谷歌的实际生产环境中可以大幅提升应用的下载率。
@@ -25,7 +25,7 @@ Wide & Deep模型对输入数据进行两部分处理Wide部分和Deep部分
在实际的生产环境中,除了推荐模型本身,推荐系统通常包括:数据收集、数据处理、数据存储、模型训练、模型存储、模型评估、推理服务等多个子系统。如图 :numref:`ch10-abstract-recommendation-systems`所示这些子系统之间分工协作、紧密配合构成一个从用户反馈、到模型更新、再到新推荐结果生成的闭环。下一小节中将以英伟达NVIDIA公司的Merlin开源框架 :cite:`Merlin`为例,概括介绍推荐系统流水线上的组件,并重点介绍模型训练、推理子系统的结构。
![推荐系统的基本组件](../img/ch10/ch10-abstract-recommendation-systems.svg)
![推荐系统的基本组件](../img/ch10/ch10-abstract-recommendation-systems.png)
:width:`800px`
:label:`ch10-abstract-recommendation-systems`

View File

@@ -1,3 +1,15 @@
## 小结
推荐系统作为深度学习在工业界最成功的落地成果之一,极大地提升了用户的在线服务体验,并且为各大公司创造了可观的利润,然而也带来了许多系统层面的挑战亟待解决。本节简单介绍了典型的工业界推荐系统架构及其面临的挑战,并给出了潜在的解决方案的方向。在实际生产环境中,具体的系统设计方案根据不同推荐场景的需求而变化,不存在一种万能的解决方案。
推荐系统作为深度学习在工业界最成功的落地成果之一,极大地提升了用户的在线服务体验,并且为各大公司创造了可观的利润,然而也带来了许多系统层面的挑战亟待解决。本节简单介绍了典型的工业界推荐系统架构及其面临的挑战,并给出了潜在的解决方案的方向。在实际生产环境中,具体的系统设计方案需要根据不同推荐场景的需求而变化,不存在一种万能的解决方案。
## 扩展阅读
- 推荐模型:[Wide & Deep](https://arxiv.org/abs/1606.07792)
- 开源推荐系统框架:[Merlin](https://irsworkshop.github.io/2020/publications/paper_21_Oldridge_Merlin.pdf)
- 软硬件协同设计加速超大规模深度学习推荐系统训练:[ZionEX](https://arxiv.org/abs/2104.05158v5)
- 利用多级缓存支持超大规模深度学习推荐系统训练:[Distributed Hierarchical GPU Parameter Server for Massive Scale Deep Learning Ads Systems](https://arxiv.org/abs/2003.05622)
- 工业界机器学习系统的实践:[Hidden Technical Debt in Machine Learning Systems](https://papers.nips.cc/paper/2015/hash/86df7dcfd896fcaf2674f757a2463eba-Abstract.html)

View File

@@ -11,9 +11,9 @@ Merlin是英伟达公司开发的一个开源推荐系统框架帮助使用
3. 推理服务类似地推理服务器在接到一批用户的推荐请求后从参数服务器拉去相应的嵌入项和稠密神经网络参数来响应用户的请求。推荐系统的推理服务对延迟十分敏感例如脸书公司的DLRM :cite:`naumov2019deep`基准在MLPerf评测中的服务器延迟限定在30ms[^1]。因此如何在限定延迟latency-bounded的情况下尽可能提升吞吐throughput是推理服务面临的关键问题。在GPU推理场景下常见的优化手段有请求动态合批处理、核融合、低精度部署等 :cite:`10.1145/3437801.3441578,wang-etal-2021-lightseq`. Triton提供了请求调度的功能并且支持多种不同的机器学习框架作为后端。
在工业界,为了提升系统在发生故障的情况下的可用性,以上介绍的各个组件在实际中部署中都应该具备基本的容灾和故障恢复能力。以推理服务为例,在线服务中的深度学习推荐模型通常都采用多副本分布式部署。同一个模型的多个副本通常会被部署在至少两个不同的地理区域内的多个数据中心中,如 :numref:`ch10-recommendation-systems`,以应对大面积停电或者网络中断而导致整个地区的所有副本都不可用。除了容错方面的考虑,部署多个副本还有其他几点优势。首先,将模型部署在靠近用户的云服务器上可以提升响应速度。其次,部署多份副本也可以拓展模型推理服务的吞吐率。
在工业界,为了提升系统在发生故障的情况下的可用性,以上介绍的各个组件在实际中部署中都应该具备基本的容灾和故障恢复能力。以推理服务为例,在线服务中的深度学习推荐模型通常都采用多副本分布式部署。同一个模型的多个副本通常会被部署在至少两个不同的地理区域内的多个数据中心中,如 :numref:`ch10-recommendation-systems`,以应对大面积停电或者网络中断而导致整个地区的所有副本都不可用。除了容错方面的考虑,部署多个副本还有其他几点优势。首先,将模型部署在靠近用户的云服务器上可以提升响应速度。其次,部署多份副本也可以拓展模型推理服务的吞吐率。
![推荐系统的分布式架构](../img/ch10/ch10-recommendation-systems.svg)
![推荐系统的分布式架构](../img/ch10/ch10-recommendation-systems.png)
:width:`800px`
:label:`ch10-recommendation-systems`

View File

@@ -3,7 +3,7 @@
在线服务系统的两个主要诉求:
- 大模型的高效存储。
为了提升训练和推理的性能,通常推荐模型全部存储在内存中,然而纯内存存储对于内存的需求极高。推荐模型的输入中包含大量无法直接进行矩阵运算的类别数据,而由于每种类别数据包含的每种情况都需要一个单独的嵌入项来表示,而稠密深度神经网络的参数可以共享,在大规模推荐模型中,嵌入表占据了绝大部分内存 :cite:`MLSYS2021_979d472a,MLSYS2020_f7e6c855`。举例说明假设一个推荐模型需要处理1亿条短视频内容而每条短视频对应的嵌入项为一个64维的32位浮点数向量那么仅该内容嵌入表就需要就需要占据大约24GB内存。如果考虑到用户标识符等其他嵌入表那么单个模型可以轻易占据近100GB内存。而在工业界生产环境中TB级的推荐模型 :cite:`MLSYS2020_f7e6c855`也是非常常见的。此外,在线推荐系统中需要同时运行多个模型负责不同的服务,甚至同一个服务也会上线多个模型以供算法开发人员验证不同的模型结构或者训练策略,因此系统中通常会同时存在上百个超大模型。综上所述,在线推荐系统亟需既能拓展存储容量,又不会影响训练和推理性能的存储解决方案。
为了提升训练和推理的性能,通常推荐模型全部存储在内存中,然而纯内存存储对于内存的需求极高。推荐模型的输入中包含大量无法直接进行矩阵运算的类别数据,而由于每种类别数据包含的每种情况都需要一个单独的嵌入项来表示,而稠密深度神经网络的参数可以共享,在大规模推荐模型中,嵌入表占据了绝大部分内存 :cite:`MLSYS2021_979d472a,MLSYS2020_f7e6c855`。举例说明假设一个推荐模型需要处理1亿条短视频内容而每条短视频对应的嵌入项为一个64维的32位浮点数向量那么仅该内容嵌入表就需要占据大约24GB内存。如果考虑到用户标识符等其他嵌入表那么单个模型可以轻易占据近100GB内存。而在工业界生产环境中TB级的推荐模型 :cite:`MLSYS2020_f7e6c855`也是非常常见的。此外,在线推荐系统中需要同时运行多个模型负责不同的服务,甚至同一个服务也会上线多个模型以供算法开发人员验证不同的模型结构或者训练策略,因此系统中通常会同时存在上百个超大模型。综上所述,在线推荐系统亟需既能拓展存储容量,又不会影响训练和推理性能的存储解决方案。
- 大模型的快速更新。
在线服务系统所面对的环境是复杂多变的,因此其中的机器学习模型必须不断更新以应对新的数据分布。以一个短视频推荐系统为例,其面对的变化主要来自三点。首先,每时每刻都有大量的新视频上传,这些新视频的特征分布和模型训练时所见到的数据不同;其次,对于不断加入的新用户,模型难以直接给出最优的推荐结果;最后,全部用户和内容之间的交互在不断改变,表现为热点视频在持续变化。因此,为了应对以上变化,在线服务中不可能奢望仅仅训练一次模型就能够一劳永逸地解决问题。目前业界主流的做法是利用新产生的数据不断地增量式更新所部属的模型。在学术界和工业界大量的研究和实践 :cite:`10.1145/2020408.2020444,10.1145/2648584.2648589,10.1145/3267809.3267817,9355295`中都发现模型更新可以有效缓解概念漂移带来的危害,而且更新的频率越高,模型的性能越好。

24
chapter_rl_sys/control.md Normal file
View File

@@ -0,0 +1,24 @@
## 控制系统
虽然控制理论已牢牢植根于基于模型Model-based的设计传统但丰富的数据和机器学习给控制理论带来了新的机遇。控制理论和机器学习的交叉点涵盖了广泛的研究方向包括但不限于动态系统的学习、在线学习和控制、深度学习的控制理论观点、强化学习以及在各种现实世界系统中的应用。
从机器学习的角度来看,未来的主要挑战之一是超越模式识别并解决数据驱动控制和动态过程优化方面的问题。
理论方面线性二次控制Linear-Quadratic
Control是经典的控制方法最近有关于图神经网络在分布式线性二次控制的研究 :cite:`pmlr-v144-gama21a`。作者称将线性二次问题转换为自监督学习问题能够找到基于图神经网络Graph
Neural
NetworksGNN的最佳分布式控制器他们还推导出了所得闭环系统稳定的充分条件。随着基于数据和学习的机器人控制方法不断得到重视研究人员必须了解何时以及如何在现实世界中最好地利用这些方法因为安全是至关重要的有的研究通过学习不确定的动力学来安全地提高性能鼓励安全或稳健的强化学习方法以及可以正式认证所学控制策略的安全性的方法 :cite:`brunke2021safe`。 :numref:`safe\_learning\_control`展示了安全学习控制Safe Learning
Control系统的框架图用数据驱动的方法来学习控制策略兼顾安全性。Lyapunov :cite:`pmlr-v144-mehrjou21a`
函数是评估非线性动力系统稳定性的有效工具最近有人提出Neural
Lyapunov来将安全性纳入考虑。
应用方面,有基于神经网络的自动驾驶汽车模型预测控制 :cite:`vianna2021neural`,也有研究将最优控制和学习相结合并应用在陌生环境中的视觉导航 :cite:`pmlr-v100-bansal20a`该研究将基于模型的控制与基于学习的感知相结合来解决。基于学习的感知模块产生一系列航路点通过无碰撞路径引导机器人到达目标。基于模型的规划器使用这些航路点来生成平滑且动态可行的轨迹该轨迹使用反馈控制在物理系统上执行。在模拟的现实世界杂乱环境和实际地面车辆上的实验表明与纯粹基于几何映射或基于端到端学习的替代方案相比这种新的系统可以在新环境中更可靠、更有效地到达目标位置。强化学习和模仿学习与控制论有密切联系LEOC :cite:`pmlr-v144-zhang21b`整合了强化学习和经典控制理论的原则方法。有人将基于模型的离线强化学习算法扩展到高维视觉观察空间并在真实机器人上执行基于图像的抽屉关闭任务方面表现出色 :cite:`pmlr-v144-rafailov21a`。控制部分通过神经网络优化可以更加平滑、节能、安全,如何将
神经网络和传统控制理论结合,特别是和运动学算法相结合,将会是一个有趣的方向。
![安全学习控制系统,数据被用来更新控制策略或或安全滤波器 :cite:`brunke2021safe`](../img/ch13/safe_learning_control.png)
:width:`800px`
:label:`safe\_learning\_control`
:bibliography:`../mlsys.bib`

20
chapter_rl_sys/index.md Normal file
View File

@@ -0,0 +1,20 @@
# 机器人系统
在本章中,我们介绍机器学习的一个重要分支——机器人及其在系统方面的知识。本章的学习目标包括:
- 掌握机器人学习基本知识。
- 掌握通用机器人操作系统。
- 掌握感知系统、规划系统、控制系统。
```toc
:maxdepth: 2
rl_sys_intro
ros
perception
planning
control
summary
```

View File

@@ -0,0 +1,25 @@
## 感知系统
感知系统不仅可以包括视觉,还可以包含触觉、声音等。在未知环境中,机器人想实现自主移动和导航必须知道自己在哪(例如通过相机重定位 :cite:`ding2019camnet`周围什么情况例如通过3D物体检测 :cite:`yi2020segvoxelnet`或语义分割),这些要依靠感知系统来实现 :cite:`xu2019depth,xu2020selfvoxelo,xu2022rnnpose,xu2022robust,yang2021pdnet,huang2021vs,huang2021life,huang2019prior,zhu2020ssn`
一提到感知系统不得不提的就是即时定位与建图Simultaneous Localization
and
MappingSLAM)系统。SLAM大致过程包括地标提取、数据关联、状态估计、状态更新以及地标更新等。视觉里程计Visual
Odometry是SLAM中的重要部分它估计两个时刻机器人的相对运动Ego-motion。ORB-SLAM :cite:`campos2021orb`系列是视觉SLAM中有代表性的工作 :numref:`orbslam3` 展示了最新的ORB-SLAM3的主要系统组件。香港科技大学开源的基于单目视觉与惯导融合的SLAM技术VINS-Mono :cite:`8421746`也很值得关注。多传感器融合、优化数据关联与回环检测、与前端异构处理器集成、提升鲁棒性和重定位精度都是SLAM技术接下来的发展方向。
最近随着机器学习的兴起基于学习的SLAM框架也被提了出来。TartanVO是第一个基于学习的视觉里程计VO模型该模型可以推广到多个数据集和现实世界场景并优于传统基于几何的方法。
UnDeepVO :cite:`li2018undeepvo`是一个无监督深度学习方案,能够通过使用深度神经网络估计单目相机的
6-DoF 位姿及其视图深度。DROID-SLAM :cite:`teed2021droid`是用于单目、立体和
RGB-D 相机的深度视觉 SLAM它通过Bundle
Adjustment层对相机位姿和像素深度的反复迭代更新具有很强的鲁棒性故障大大减少尽管对单目视频进行了训练但它可以利用立体声或
RGB-D 视频在测试时提高性能。其中Bundle Adjustment
(BA)与机器学习的结合被广泛研究 :cite:`tang2018ba,tanaka2021learning`。CMU提出通过主动神经
SLAM
的模块化系统帮助智能机器人在未知环境中的高效探索 :cite:`chaplot2020learning`
![ORB-SLAM3主要系统组件 :cite:`campos2021orb`](../img/ch13/orbslam3.png)
:width:`800px`
:label:`orbslam3`
:bibliography:`../mlsys.bib`

View File

@@ -0,0 +1,16 @@
## 规划系统
规划不仅包含运动路径规划,还包含高级任务规划 :cite:`9712373`。其中,运动规划是机器人技术的核心问题之一,应用范围从导航到复杂环境中的操作。它具有悠久的研究历史,方法需要有概率完整性和最优性的保证。然而,当经典运动规划在处理现实世界的机器人问题(在高维空间中)时,挑战仍然存在。研究人员在继续开发新算法来克服与这些方法相关的限制,包括优化计算和内存负载、更好的规划表示和处理维度灾难等。
相比之下,机器学习的最新进展为机器人专家研究运动规划问题开辟了新视角:经典运动规划器的瓶颈可以以数据驱动的方式解决;基于深度学习的规划器可以避免几何输入的局限性,例如使用视觉或语义输入进行规划等。最近的工作有:基于深度神经网络的四足机器人快速运动规划框架,通过贝叶斯学习进行运动规划 :cite:`quintero2021motion`通过运动规划器指导的视觉运动策略学习。ML4KP :cite:`ML4KP`是一个用于有效运动动力学运动规划的C++库,该库可以轻松地将机器学习方法集成到规划过程中。
自动驾驶领域和行人和车辆轨迹预测 :cite:`qiu2021egocentric`方面也涌现出使用机器学习解决运动规划的工作比如斯坦福大学提出Trajectron++ :cite:`salzmann2020trajectron++`。强化学习在规划系统上也有重要应用 :cite:`aradi2020survey,sun2021adversarial`比如基于MetaDrive模拟器 :cite:`li2021metadrive`,最近有一些关于多智能体强化学习,多智能体车流模拟、驾驶行为分析 :cite:`peng2021learning`,考虑安全性因素的强化学习 :cite:`peng2021safe`以及拓展到由真人专家在旁边监督出现危险的时候接管的专家参与的强化学习工作Online
Imitation Learning、Offline
RL:cite:`li2021efficient`样本效率极高是单纯强化学习算法的50倍。为了更好地说明强化学习是如何应用在自动驾驶中的 :numref:`rl\_ad`展示了一个基于深度强化学习的自动驾驶POMDP模型。
![基于深度强化学习的自动驾驶POMDP模型 :cite:`aradi2020survey`](../img/ch13/rl_ad.png)
:width:`800px`
:label:`rl\_ad`
:bibliography:`../mlsys.bib`

View File

@@ -0,0 +1,32 @@
## 概述
机器人学是一个交叉学科,它涉及了计算机科学、机械工程、电气工程、生物医学工程、数学等多种学科,并有诸多应用,比如自动驾驶汽车、机械臂、无人机、医疗机器人等。机器人能够自主地完成一种或多种任务或者辅助人类完成指定任务。通常,人们把机器人系统划分为感知系统、决策(规划)和控制系统等组成部分 :cite:`buehler2009darpa`
近些年随着机器学习的兴起经典机器人技术出现和机器学习技术结合的趋势称为机器人学习Robot
Learning:cite:`peters2016robot`。机器人学习包含了计算机视觉、自然语言处理、语音处理、强化学习和模仿学习等人工智能技术在机器人上的应用,让机器人通过学习,自主地执行各种决策控制任务。
机器人学习系统Robot Learning
System是一个较新的概念。作为系统和机器人学习的交叉方向仿照机器学习系统的概念我们把机器人学习系统定义为"支持机器人模型训练和部署的系统"。按照涉及的机器人数量,可以划分为单机器人学习系统和多机器人学习系统。多机器人学习系统协作和沟通中涉及的安全和隐私问题,也会是一个值得研究的方向。最近机器人学习系统在室内自主移动 :cite:`zhu2017target,pmlr-v100-bansal20a,9123682,huang2018navigationnet`,道路自动驾驶 :cite:`pmlr-v155-huang21a,pmlr-v155-sun21a,Sun2022SelfSupervisedTA`,机械臂工业操作 :cite:`tobin2017domain,finn2017deep,chen2020transferable,duan2017one`等行业场景得到充分应用和发展。一些机器人学习基础设施项目也在进行中,如具备从公开可用的互联网资源、计算机模拟和
真实机器人试验中学习能力的大规模的计算系统RobotBrain :cite:`saxena2014robobrain`。在自动驾驶领域,受联网的自动驾驶汽车
(CAV) 对传统交通运输行业的影响,"车辆计算"(Vehicle Computing) :cite:`9491826`
(如 :numref:`vehicle-computing`)概念引起广泛关注并激发了如何让计算能力有限使用周围的CAV计算平台来执行复杂的计算任务的研究。最近有很多自动驾驶系统的模拟器代表性的比如CARLA :cite:`Dosovitskiy17`支持安全RL、MARL、真实地图数据导入、泛化性测试等任务的MetaDrive :cite:`li2021metadrive`还有CarSim和
TruckSim :cite:`benekohal1988carsim`它们可以作为各种自动驾驶算法的训练场并对算法效果进行评估。另外针对自动驾驶的系统开发平台也不断涌现如ERDOS,
D3 (Dynamic
Deadline-Driven) :cite:`10.1145/3492321.3519576`和强调模块化思想的Pylot :cite:`gog2021pylot`,可以让模型训练与部署系统与这些平台对接。
![车辆计算框架图 :cite:`9491826`](../img/ch13/vehicle_computing.png)
:width:`800px`
:label:`vehicle\_computing`
:numref:`learning\_decision\_module`是一个典型的感知、规划、控制的模块化设计的自动驾驶系统框架图,接下来,我们也将按照这个顺序依次介绍通用框架、感知系统、规划系统和控制系统。
![通过模仿学习进行自动驾驶框架图。
绿线表示自主驾驶系统的模块化流程。橙色实线表示神经判别器的训练。而橙色虚线表示规划和控制模块是不可微的。但是决策策略可以通过判别器对控制行动的奖励,重新参数化技术进行训练,如蓝色虚线所示 :cite:`pmlr-v155-huang21a`。](../img/ch13/idm.png)
:width:`800px`
:label:`learning\_decision\_module`
:bibliography:`../mlsys.bib`

108
chapter_rl_sys/ros.md Normal file
View File

@@ -0,0 +1,108 @@
## 通用机器人操作系统
![ROS/ROS2架构概述 :cite:`maruyama2016exploring`](../img/ch13/ROS2_arch.png)
:width:`800px`
:label:`ROS2\_arch`
机器人操作系统(ROS) :cite:`quigley2009ros,maruyama2016exploring,koubaa2017robot`起源于斯坦福大学人工智能实验室的一个机器人项目。它是一个自由、开源的框架提供接口、工具来构建先进的机器人。由于机器人领域的快速发展和复杂化代码复用和模块化的需求日益强烈ROS适用于机器人这种多节点多任务的复杂场景。目前也有一些机器人、无人机甚至无人车都开始采用ROS作为开发平台。在机器人学习方面ROS/ROS2可以与深度学习结合有开发人员为ROS/ROS2开发了的深度学习节点并支持NVIDIA
Jetson和TensorRT。NVIDIA
Jetson是NVIDIA为自主机器开发的一个嵌入式系统包括CPU、GPU、PMIC、DRAM
和闪存的一个模组化系统可以将自主机器软件运作系统运行速率提升。TensorRT
是由 Nvidia 发布的机器学习框架,用于在其硬件上运行机器学习推理。
作为一个适用于机器人编程的框架ROS把原本松散的零部件耦合在了一起为他们提供了通信架构。虽然叫做"操作系统"ROS更像是一个中间件给各种基于ROS的应用程序建立起了沟通的桥梁通过这个中间件机器人的感知、决策、控制算法可以组织和运行。ROS采用了分布式的设计思想支持C++、Pyhton等多种编程语言方便移植。对ROS来讲最小的进程单元是节点由节点管理器来管理。参数配置存储在参数服务器中。ROS的通信方式包含主题Topic、服务Service、参数服务器Parameter
Server、动作库ActionLib这四种。
ROS提供了很多内置工具比如三维可视化器rviz用于可视化机器人、它们工作的环境和传感器数据。它是一个高度可配置的工具具有许多不同类型的可视化和插件。catkin是ROS
构建系统类似于Linux下的CMakeCatkin
Workspace是创建、修改、编译catkin软件包的目录。roslaunch可用于在本地和远程启动多个ROS
节点以及在ROS参数服务器上设置参数的工具。此外还有机器人仿真工具Gazebo和移动操作软件和规划框架MoveIt! :cite:`coleman2014reducing`。ROS为机器人开发者提供了不同编程语言的接口比如C++语言ROS接口roscpppython语言的ROS接口rospy。ROS中提供了许多机器人的统一机器人描述格式URDFUnified
Robot Description
Format文件URDF使用XML格式描述机器人文件。ROS也有一些需要提高的地方比如它的通信实时性能有限与工业级要求的系统稳定性还有一定差距。
ROS2 :cite:`maruyama2016exploring`项目在ROSCon 2014上被宣布第一个ROS2发行版
Ardent Apalone
是于2017年发布。ROS2增加了对多机器人系统的支持提高了多机器人之间通信的网络性能而且支持微控制器和跨系统平台不仅可以运行在现有的X86和ARM系统上还将支持MCU等嵌入式微控制器不止能运行在Linux系统之上还增加了对Windows、MacOS、RTOS等系统的支持。更重要的是ROS
2还加入了实时控制的支持可以提高控制的时效性和整体机器人的性能。ROS
2的通信系统基于DDSData Distribution
Service即数据分发服务,如 :numref:`ROS2\_arch`所示。
ROS2依赖于使用shell环境组合工作区。"工作区"Workspace是一个ROS术语表示使用ROS2进行开发的系统位置。核心ROS2
工作区称为Underlay。随后的工作区称为Overlays。使用ROS2
进行开发时通常会同时有多个工作区处于活动状态。接下来我们详细介绍一下ROS2的核心概念这一部分我们参考了文献 [^1])。
### ROS2 Nodes
ROS
Graph是一个由ROS2元素组成的网络在同一时间一起处理数据。它包括所有的可执行文件和它们之间的联系。ROS2
中的每个节点都应负责一个单一的模块用途(例如,一个节点用于控制车轮马达,一个节点用于控制激光测距仪等)。每个节点都可以通过主题、服务、动作或参数向其他节点发送和接收数据。一个完整的机器人系统由许多协同工作的节点组成。在
ROS 2 中单个可执行文件C++ 程序、Python
程序等)可以包含一个或多个节点,如 :numref:`ros2\_graph`
![一个完整的机器人系统由许多协同工作的节点组成。在ROS 2
单个可执行文件C++ 程序、Python
程序等)可以包含一个或多个节点](../img/ch13/ros2_graph.png)
:width:`800px`
:label:`ros2\_graph`
节点之间的互相发现是通过ROS2底层的中间件实现的。 过程总结如下
- 当一个节点启动后, 它会向其他拥有相同ROS域名(ROS domain
可以通过设置ROS\_DOMAIN\_ID环境变量来设
置)的节点进行广播,说明它已经上线。
其他节点在收到广播后返回自己的相关信息,这样节点间的连接就可以建
立了,之后就可以通信了。
- 节点会定时广播它的信息,这样即使它已经错过了最初的发现过程,它也可以和新上线的节点进行连接。
- 节点在下线前它也会广播其他节点自己要下线了。
### ROS2 Topics
ROS2将复杂系统分解为许多模块化节点。主题Topics是 ROS
Graph的重要元素它充当节点交换消息的总线。一个节点可以向任意数量的主题发布数据同时订阅任意数量的主题如 :numref:`ros2\_topics`所示。主题是数据在节点之间以及因此在系统的不同部分之间移动的主要方式之一。
rqt是ROS的一个软件框架以插件的形式实现了各种 GUI 工具。可以在 rqt
中将所有现有的GUI工具作为可停靠窗口运行。这些工具仍然可以以传统的独立方法运行但rqt可以更轻松地同时管理屏幕上的所有各种窗口。
![一个节点可以向任意数量的主题发布数据,同时订阅任意数量的主题](../img/ch13/ros2_topics.png)
:width:`800px`
:label:`ros2\_topics`
### ROS 2 Services
服务Services是 ROS
图中节点的另一种通信方式。服务基于调用和响应模型,而不是主题的发布者-订阅者模型。虽然主题允许节点订阅数据流并获得持续更新但服务仅在客户端专门调用它们时才提供数据。节点可以使用ROS2中的服务进行通信。与主题那种单向通信模式节点发布可由一个或多个订阅者使用的信息的方式不同
服务是客户端向节点发出请求的请求/响应模式提供服务,服务处理请求并生成响应。
![ROS2服务](../img/ch13/ros2_services.png)
:width:`800px`
:label:`ros2\_services`
### ROS 2 Parameters
参数Parameters是节点的配置值。您可以将参数视为节点设置。节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。在ROS2
中,每个节点都维护自己的参数。
### ROS 2 Actions
动作Actions是ROS2中的一种通信类型适用于长时间运行的任务。它们由三个部分组成目标、反馈和结果。动作建立在主题和服务之上。它们的功能类似于服务除了可以取消动作。它们还提供稳定的反馈而不是返回单一响应的服务。动作使用客户端-服务器模型,类似于发布者-订阅者模型(在主题教程中描述)。"动作客户端"节点将目标发送到"动作服务器"节点,该节点确认目标并返回反馈流和结果。动作类似于允许您执行长时间运行的任务、提供定期反馈并且可以取消的服务。机器人系统可能会使用动作进行导航。动作目标可以告诉机器人前往某个位置。当机器人导航到该位置时,它可以沿途发送更新(即反馈),然后在到达目的地后发送最终结果消息。
![ROS2动作](../img/ch13/ros2_actions.png)
:width:`800px`
:label:`ros2\_actions`
:bibliography:`../mlsys.bib`
[^1]: https://docs.ros.org/en/foxy/Tutorials/Understanding-ROS2-Nodes.html

View File

@@ -0,0 +1,3 @@
## 小结
在这一章,我们简单介绍了机器人学习系统的基本概念,包括通用机器人操作系统、感知系统、规划系统和控制系统等,给读者对机器人学习问题的基本认识。当前,机器人学习是一个快速发展的人工智能分支,许多实际问题都有可能通过机器人学习算法的进一步发展得到解决。另一方面,由于机器人学习问题设置的特殊性,也使得相应系统与相关硬件的耦合程度更高、更复杂:如何更好地平衡各种传感器负载?如何在计算资源有限的情况下最大化计算效率(实时性)?等等,都需要对计算机系统的设计和使用有更好的理解。

View File

@@ -77,7 +77,7 @@ header_links = GitHub, https://github.com/openmlsys/openmlsys-zh, fab fa-github,
favicon = static/favicon.png
# html_logo = static/logo-with-text.png
html_logo = static/logo-with-text.png
[pdf]

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 KiB

View File

@@ -1,442 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg2"
xml:space="preserve"
width="802.58173"
height="562.29089"
viewBox="0 0 802.58173 562.29089"
sodipodi:docname="framework_architecture.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath18"><path
d="M 0,0.1636353 H 602.8364 V 423.00004 H 0 Z"
id="path16" /></clipPath></defs><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.90143577"
inkscape:cx="312.2796"
inkscape:cy="237.39906"
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g8"
showborder="false" /><g
id="g8"
inkscape:groupmode="layer"
inkscape:label="framework-architecture"
transform="matrix(1.3333333,0,0,-1.3333333,-0.98791861,563.59385)"><g
id="g10" /><g
id="g22"><g
id="g26"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,1.490939,421.9454)"><path
d="M 0,0 H 7625541 V 5336771 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path28" /></g><path
d="M 30.29094,406.4546 H 573.7818 v -51.491 H 30.29094 Z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path30" /><g
id="g32"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,30.29094,406.4546)"><path
d="M 0,0 H 6902334 V 653935 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path34" /></g><g
id="g36"
transform="matrix(0.2181818,0,0,0.2181818,232.0853,-47.61816)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text40"><tspan
x="0 82.501991 165.00398"
y="0"
sodipodi:role="line"
id="tspan38">编程接口</tspan></text></g><g
id="g42"
transform="matrix(0.2181818,0,0,0.2181818,304.0853,-47.61816)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text46"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan44">(第</tspan></text></g><g
id="g48"
transform="matrix(0.2181818,0,0,0.2181818,340.0853,-47.61816)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text52"><tspan
x="0"
y="0"
id="tspan50">2</tspan></text></g><g
id="g54"
transform="matrix(0.2181818,0,0,0.2181818,348.5853,-47.61816)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text58"><tspan
x="0"
y="0"
id="tspan56"></tspan></text></g><g
id="g60"
transform="matrix(0.2181818,0,0,0.2181818,366.5853,-47.61816)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text64"><tspan
x="0"
y="0"
id="tspan62">)</tspan></text></g><path
d="M 30.29094,339.2546 H 573.7818 V 287.5454 H 30.29094 Z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path66" /><g
id="g68"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,30.29094,339.2546)"><path
d="M 0,0 H 6902334 V 656706 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path70" /></g><g
id="g72"
transform="matrix(0.2181818,0,0,0.2181818,234.7103,-115.0363)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text76"><tspan
x="0 82.501991 165.00398"
y="0"
sodipodi:role="line"
id="tspan74">计算图</tspan></text></g><g
id="g78"
transform="matrix(0.2181818,0,0,0.2181818,288.7103,-115.0363)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text82"><tspan
x="0"
y="0"
id="tspan80"></tspan></text></g><g
id="g84"
transform="matrix(0.2181818,0,0,0.2181818,306.7103,-115.0363)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text88"><tspan
x="0"
y="0"
id="tspan86"></tspan></text></g><g
id="g90"
transform="matrix(0.2181818,0,0,0.2181818,324.7103,-115.0363)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text94"><tspan
x="0"
y="0"
id="tspan92">3</tspan></text></g><g
id="g96"
transform="matrix(0.2181818,0,0,0.2181818,333.2103,-115.0363)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text100"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan98">章)</tspan></text></g><path
d="M 30.29094,113.4364 H 573.7818 V 61.72725 H 30.29094 Z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path102" /><g
id="g104"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,30.29094,113.4364)"><path
d="M 0,0 H 6902334 V 656706 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path106" /></g><g
id="g108"
transform="matrix(0.2181818,0,0,0.2181818,216.7103,-340.8545)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text112"><tspan
x="0 82.501991 165.00398 247.50597 330.00797"
y="0"
sodipodi:role="line"
id="tspan110">计算加速器</tspan></text></g><g
id="g114"
transform="matrix(0.2181818,0,0,0.2181818,306.7103,-340.8545)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text118"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan116">(第</tspan></text></g><g
id="g120"
transform="matrix(0.2181818,0,0,0.2181818,342.7103,-340.8545)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text124"><tspan
x="0"
y="0"
id="tspan122">4</tspan></text></g><g
id="g126"
transform="matrix(0.2181818,0,0,0.2181818,351.2103,-340.8545)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text130"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan128">章)</tspan></text></g><path
d="M 30.29094,269.6546 H 224.0364 V 214.0182 H 30.29094 Z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path132" /><g
id="g134"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,30.29094,269.6546)"><path
d="M 0,0 H 2460567 V 706582 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path136" /></g><g
id="g138"
transform="matrix(0.2181818,0,0,0.2181818,41.83455,-186.3818)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text142"><tspan
x="0 82.501991 165.00398 247.50597 330.00797"
y="0"
sodipodi:role="line"
id="tspan140">编译器前端</tspan></text></g><g
id="g144"
transform="matrix(0.2181818,0,0,0.2181818,131.8346,-186.3818)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text148"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan146">(第</tspan></text></g><g
id="g150"
transform="matrix(0.2181818,0,0,0.2181818,167.8345,-186.3818)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text154"><tspan
x="0"
y="0"
id="tspan152">5</tspan></text></g><g
id="g156"
transform="matrix(0.2181818,0,0,0.2181818,176.3345,-186.3818)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text160"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan158">章)</tspan></text></g><path
d="M 30.29094,199.6182 H 224.0364 V 131.3273 H 30.29094 Z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path162" /><g
id="g164"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,30.29094,199.6182)"><path
d="M 0,0 H 2460567 V 867295 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path166" /></g><g
id="g168"
transform="matrix(0.2181818,0,0,0.2181818,41.83455,-262.7454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text172"><tspan
x="0 82.501991 165.00398 247.50597 330.00797"
y="0"
sodipodi:role="line"
id="tspan170">编译器后端</tspan></text></g><g
id="g174"
transform="matrix(0.2181818,0,0,0.2181818,131.8346,-262.7454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text178"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan176">(第</tspan></text></g><g
id="g180"
transform="matrix(0.2181818,0,0,0.2181818,167.8345,-262.7454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text184"><tspan
x="0"
y="0"
id="tspan182">6</tspan></text></g><g
id="g186"
transform="matrix(0.2181818,0,0,0.2181818,176.3345,-262.7454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text190"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan188">章)</tspan></text></g><path
d="m 248.4728,269.6546 h 92.9454 V 131.3273 h -92.9454 z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path192" /><g
id="g194"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,248.4728,269.6546)"><path
d="M 0,0 H 1180407 V 1756757 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path196" /></g><g
id="g198"
transform="matrix(0.2181818,0,0,0.2181818,257.8756,-217.1454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text202"><tspan
x="0 82.501991 165.00398 247.50597"
y="0"
sodipodi:role="line"
id="tspan200">数据处理</tspan></text></g><g
id="g204"
transform="matrix(0.2181818,0,0,0.2181818,254.6256,-238.7454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text208"><tspan
x="0"
y="0"
id="tspan206"></tspan></text></g><g
id="g210"
transform="matrix(0.2181818,0,0,0.2181818,272.6256,-238.7454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text214"><tspan
x="0"
y="0"
id="tspan212"></tspan></text></g><g
id="g216"
transform="matrix(0.2181818,0,0,0.2181818,290.6256,-238.7454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text220"><tspan
x="0"
y="0"
id="tspan218">7</tspan></text></g><g
id="g222"
transform="matrix(0.2181818,0,0,0.2181818,299.1256,-238.7454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text226"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan224">章)</tspan></text></g><path
d="m 357.7818,267.9091 h 92.9454 V 131.3272 h -92.9454 z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path228" /><g
id="g230"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,357.7818,267.9091)"><path
d="M 0,0 H 1180407 V 1734589 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path232" /></g><g
id="g234"
transform="matrix(0.2181818,0,0,0.2181818,367.2091,-217.8)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text238"><tspan
x="0 82.501991 165.00398 247.50597"
y="0"
sodipodi:role="line"
id="tspan236">模型部署</tspan></text></g><g
id="g240"
transform="matrix(0.2181818,0,0,0.2181818,363.9591,-239.4)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text244"><tspan
x="0"
y="0"
id="tspan242"></tspan></text></g><g
id="g246"
transform="matrix(0.2181818,0,0,0.2181818,381.9591,-239.4)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text250"><tspan
x="0"
y="0"
id="tspan248"></tspan></text></g><g
id="g252"
transform="matrix(0.2181818,0,0,0.2181818,399.9591,-239.4)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text256"><tspan
x="0"
y="0"
id="tspan254">8</tspan></text></g><g
id="g258"
transform="matrix(0.2181818,0,0,0.2181818,408.4591,-239.4)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text262"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan260">章)</tspan></text></g><path
d="M 467.0909,267.9091 H 573.7818 V 131.3272 H 467.0909 Z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path264" /><g
id="g266"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,467.0909,267.9091)"><path
d="M 0,0 H 1354974 V 1734589 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path268" /></g><g
id="g270"
transform="matrix(0.2181818,0,0,0.2181818,475.4181,-217.8)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text274"><tspan
x="0 82.501991 165.00398 247.50597 330.00797"
y="0"
sodipodi:role="line"
id="tspan272">分布式训练</tspan></text></g><g
id="g276"
transform="matrix(0.2181818,0,0,0.2181818,480.1682,-239.4)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text280"><tspan
x="0"
y="0"
id="tspan278"></tspan></text></g><g
id="g282"
transform="matrix(0.2181818,0,0,0.2181818,498.1682,-239.4)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text286"><tspan
x="0"
y="0"
id="tspan284"></tspan></text></g><g
id="g288"
transform="matrix(0.2181818,0,0,0.2181818,516.1682,-239.4)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text292"><tspan
x="0"
y="0"
id="tspan290">9</tspan></text></g><g
id="g294"
transform="matrix(0.2181818,0,0,0.2181818,524.6681,-239.4)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text298"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan296">章)</tspan></text></g><g
id="g300"
transform="matrix(0.2181818,0,0,0.2181818,241.3561,-401.9454)"><text
transform="matrix(1,0,0,-1,0,1938)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text304"><tspan
x="0 82.501991 165.00398 247.50597 330.00797 412.50995"
y="0"
sodipodi:role="line"
id="tspan302">机器学习系统</tspan></text></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

View File

@@ -1,270 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg2"
xml:space="preserve"
width="601.33331"
height="461.33334"
viewBox="0 0 601.33331 461.33334"
sodipodi:docname="framework_position.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath18"><path
d="M 0,0.1818173 H 450.9818 V 346.00002 l -450.9818,0 z"
id="path16" /></clipPath></defs><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1.1020443"
inkscape:cx="232.74926"
inkscape:cy="263.14732"
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g22" /><g
id="g8"
inkscape:groupmode="layer"
inkscape:label="framework-position"
transform="matrix(1.3333333,0,0,-1.3333333,0,461.33333)"><g
id="g10" /><g
id="g22"><g
id="g26"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,1.072749,305)"><path
d="M 0,0 H 958734 V 1064029 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path28" /></g><g
id="g30"
transform="matrix(0.2181818,0,0,0.2181818,11.7288,-77.49089)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text34"><tspan
x="0"
sodipodi:role="line"
id="tspan32"
y="0">自然语</tspan></text></g><g
id="g36"
transform="matrix(0.2181818,0,0,0.2181818,11.7288,-99.09089)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text40"><tspan
x="0"
sodipodi:role="line"
id="tspan38"
y="0">言处理</tspan></text></g><path
d="M 1.072749,196.7818 H 449 V 112.3454 H 1.072749 Z"
style="fill:#deebf7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path42" /><g
id="g44"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,1.072749,196.7818)"><path
d="M 0,0 H 5688676 V 1072342 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path46" /></g><g
id="g48"
transform="matrix(0.2181818,0,0,0.2181818,170.9274,-185.9273)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text52"><tspan
x="0 82.501991 165.00398 247.50597 330.00797 412.50995"
y="0"
sodipodi:role="line"
id="tspan50">机器学习框架</tspan></text></g><g
id="g54"
transform="matrix(0.2181818,0,0,0.2181818,69.67742,-207.5273)"><text
transform="scale(1,-1)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text58"
x="-103.12501"
y="-1585"><tspan
x="-103.12501"
y="-1585"
id="tspan56">(</tspan></text></g><g
id="g60"
transform="matrix(0.2181818,0,0,0.2181818,53.92742,-207.5273)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text64"><tspan
x="0 82.501991 165.00398"
y="0"
sodipodi:role="line"
id="tspan62">例如:</tspan></text></g><g
id="g66"
transform="matrix(0.2181818,0,0,0.2181818,106.4274,-207.5273)"><text
transform="scale(1,-1)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text70"
x="-40.549644"
y="-1581.8807"><tspan
sodipodi:role="line"
id="tspan68"
x="-40.549644"
y="-1581.8807">TensorFlow,PyTorch,MindSpore</tspan></text></g><g
id="g72"
transform="matrix(0.2181818,0,0,0.2181818,224.3024,-207.5273)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text76"><tspan
sodipodi:role="line"
id="tspan74"
x="0"
y="0" /></text></g><g
id="g78"
transform="matrix(0.2181818,0,0,0.2181818,285.9274,-207.5273)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text82"><tspan
x="0"
y="0"
id="tspan80" /></text></g><g
id="g84"
transform="matrix(0.2181818,0,0,0.2181818,294.4274,-207.5273)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text88"><tspan
sodipodi:role="line"
id="tspan86"
x="0"
y="0" /></text></g><g
id="g90"
transform="matrix(0.2181818,0,0,0.2181818,377.9274,-207.5273)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text94"><tspan
x="0"
y="0"
id="tspan92">)</tspan></text></g><g
id="g98"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,1.072749,85.50905)"><path
d="M 0,0 H 5688676 V 1075112 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path100" /></g><g
id="g102"
transform="matrix(0.2181818,0,0,0.2181818,179.9274,-297.4182)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text106"><tspan
x="0"
y="0"
id="tspan104"></tspan></text></g><g
id="g108"
transform="matrix(0.2181818,0,0,0.2181818,197.9274,-297.4182)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text112"><tspan
x="0"
y="0"
id="tspan110"></tspan></text></g><g
id="g114"
transform="matrix(0.2181818,0,0,0.2181818,215.9274,-297.4182)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text118"><tspan
x="0 82.501991 165.00398"
y="0"
sodipodi:role="line"
id="tspan116">处理器</tspan></text></g><g
id="g120"
transform="matrix(0.2181818,0,0,0.2181818,80.92742,-319.0182)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text124"><tspan
x="0 82.501991 165.00398 247.50597"
y="0"
sodipodi:role="line"
id="tspan122">(例如:</tspan></text></g><g
id="g126"
transform="matrix(0.2181818,0,0,0.2181818,152.9274,-319.0182)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text130"><tspan
x="0"
y="0"
sodipodi:role="line"
id="tspan128">通用</tspan></text></g><g
id="g132"
transform="matrix(0.2181818,0,0,0.2181818,188.9274,-319.0182)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text136"><tspan
x="0 82.501991 165.00398 247.50597 330.00797 412.50995 495.01193 577.51392 660.01593 742.51788"
y="0"
sodipodi:role="line"
id="tspan134">处理器和计算加速器)</tspan></text></g><g
id="g140"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,88.12724,305)"><path
d="M 0,0 H 958735 V 1064029 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path142" /></g><g
id="g144"
transform="matrix(0.2181818,0,0,0.2181818,98.79257,-77.49089)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text148"><tspan
x="0 82.501991 165.00398"
y="0"
sodipodi:role="line"
id="tspan146">计算机</tspan></text></g><g
id="g150"
transform="matrix(0.2181818,0,0,0.2181818,107.7926,-99.09089)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text154"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan152">视觉</tspan></text></g><g
id="g158"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,175.1818,305)"><path
d="M 0,0 H 958735 V 1064029 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path160" /></g><g
id="g162"
transform="matrix(0.2181818,0,0,0.2181818,185.8564,-88.1818)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text166"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan164">机器人</tspan></text></g><g
id="g170"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,359.3272,305)"><path
d="M 0,0 H 1138844 V 1064029 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path172" /></g><g
id="g174"
transform="matrix(0.2181818,0,0,0.2181818,368.007,-88.1818)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text178"><tspan
x="0 82.501991 165.00398 247.50597"
y="0"
sodipodi:role="line"
id="tspan176">推荐系统</tspan></text></g><g
id="g180"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,269.7636,263)"><path
d="M 0,0 865414,1"
style="fill:none;stroke:#000000;stroke-width:28575;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:28575, 28575;stroke-dashoffset:0;stroke-opacity:1"
id="path182" /></g><g
id="g184"
transform="matrix(0.2181818,0,0,0.2181818,158.6047,-22.07271)"><text
transform="matrix(1,0,0,-1,0,1585)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text188"><tspan
x="0 82.501991 165.00398 247.50597 330.00797"
y="0"
sodipodi:role="line"
id="tspan186">机器学习应用</tspan></text></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 15 KiB

172
img/ch02/img_workflow.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -1,168 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg2"
xml:space="preserve"
width="1251.4545"
height="158.8"
viewBox="0 0 1251.4545 158.8"
sodipodi:docname="workflow.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath18"><path
d="M 0,0 H 939.9273 V 120 H 0 Z"
id="path16" /></clipPath></defs><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.99494688"
inkscape:cx="963.36801"
inkscape:cy="-127.64501"
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g22" /><g
id="g8"
inkscape:groupmode="layer"
inkscape:label="workflow"
transform="matrix(1.3333333,0,0,-1.3333333,-1.2545919,159.3272)"><g
id="g10" /><g
id="g22"><g
id="g26"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,1.690944,118.7454)"><path
d="M 0,0 H 1648690 V 1493520 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path28" /></g><g
id="g30"
transform="matrix(0.2181818,0,0,0.2181818,30.4146,-65.45454)"><text
transform="matrix(1,0,0,-1,0,550)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text34"><tspan
x="0 82.501991 165.00398 247.50597"
y="0"
sodipodi:role="line"
id="tspan32">数据处理</tspan></text></g><g
id="g38"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,203.5091,118.7454)"><path
d="M 0,0 H 1645920 V 1493520 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path40" /></g><g
id="g42"
transform="matrix(0.2181818,0,0,0.2181818,232.2039,-65.45454)"><text
transform="matrix(1,0,0,-1,0,550)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text46"><tspan
x="0 82.501991 165.00398 247.50597"
y="0"
sodipodi:role="line"
id="tspan44">模型结构</tspan></text></g><g
id="g50"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,607.3636,118.7454)"><path
d="M 0,0 H 1648691 V 1493520 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path52" /></g><g
id="g54"
transform="matrix(0.2181818,0,0,0.2181818,636.1186,-65.45454)"><text
transform="matrix(1,0,0,-1,0,550)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text58"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan56">训练</tspan></text></g><g
id="g60"
transform="matrix(0.2181818,0,0,0.2181818,672.1186,-65.45454)"><text
transform="matrix(1,0,0,-1,0,550)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text64"><tspan
x="0 82.501991"
y="0"
sodipodi:role="line"
id="tspan62">过程</tspan></text></g><path
d="m 142.4182,68.72725 h 33.7091 v 8.78181 L 193.6909,59.94544 176.1273,42.38182 v 8.78181 h -33.7091 z"
style="fill:#deebf7;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path66" /><g
id="g68"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,142.4182,77.50906)"><path
d="M 0,111529 H 428106.1 V 0 L 651164,223058 428106.1,446116 V 334587 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path70" /></g><path
d="m 545.8364,68.72726 h 33.491 v 8.7818 L 596.8909,59.94541 579.3274,42.38182 v 8.78179 h -33.491 z"
style="fill:#deebf7;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path72" /><g
id="g74"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,545.8364,77.50906)"><path
d="M 0,111528.8 H 425335.6 V 0 L 648393,223058.3 425335.6,446116 V 334587.2 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path76" /></g><path
d="m 342.9272,68.72726 h 33.491 v 8.7818 L 393.9818,59.94541 376.4182,42.38182 v 8.78179 h -33.491 z"
style="fill:#deebf7;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path78" /><g
id="g80"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,342.9272,77.50906)"><path
d="M 0,111528.8 H 425335.6 V 0 L 648393,223058.3 425335.6,446116 V 334587.2 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path82" /></g><g
id="g86"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,405.1091,118.7454)"><path
d="M 0,0 H 1648691 V 1493520 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path88" /></g><g
id="g90"
transform="matrix(0.2181818,0,0,0.2181818,415.9932,-54.76363)"><text
transform="matrix(1,0,0,-1,0,550)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text94"><tspan
x="0 82.501991 165.00398 247.50597 330.00797 412.50995"
y="0"
sodipodi:role="line"
id="tspan92">损失函数和优</tspan></text></g><g
id="g96"
transform="matrix(0.2181818,0,0,0.2181818,442.9932,-76.36363)"><text
transform="matrix(1,0,0,-1,0,550)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text100"><tspan
x="0 82.501991 165.00398"
y="0"
sodipodi:role="line"
id="tspan98">化算法</tspan></text></g><g
id="g104"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,808.9636,118.7454)"><path
d="M 0,0 H 1648691 V 1493520 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path106" /></g><g
id="g108"
transform="matrix(0.2181818,0,0,0.2181818,828.8295,-65.45454)"><text
transform="matrix(1,0,0,-1,0,550)"
style="font-variant:normal;font-weight:normal;font-size:83px;font-family:STSongti-SC;-inkscape-font-specification:STSongti-SC-Regular;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text112"><tspan
x="0 82.501991 165.00398 247.50597 330.00797"
y="0"
sodipodi:role="line"
id="tspan110">测试和调试</tspan></text></g><path
d="m 747.4364,72.05453 h 33.8181 v 8.72729 L 798.709,63.32729 781.2545,45.87276 V 54.6 h -33.8181 z"
style="fill:#deebf7;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path114" /><g
id="g116"
transform="matrix(7.874016e-5,0,0,-7.874016e-5,747.4364,80.78182)"><path
d="M 0,110836.6 H 429490.6 V 0 L 651163,221672.5 429490.6,443345 V 332509.1 H 0 Z"
style="fill:none;stroke:#000000;stroke-width:19050;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path118" /></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 9.3 KiB

View File

@@ -3,79 +3,74 @@
<svg
version="1.1"
id="svg9"
id="svg2"
xml:space="preserve"
width="1269.72"
height="277.57623"
viewBox="0 0 1269.72 277.57623"
sodipodi:docname="ast.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
width="1205.1733"
height="196.77014"
viewBox="0 0 1205.1733 196.77014"
sodipodi:docname="ch04-graph_23.svg"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs13"><clipPath
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath23"><path
id="clipPath16"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path21" /></clipPath><clipPath
id="path14" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath35"><path
id="clipPath30"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path33" /></clipPath><clipPath
id="path28" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath49"><path
id="clipPath42"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path47" /></clipPath><clipPath
id="path40" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath61"><path
id="clipPath58"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path59" /></clipPath><clipPath
id="path56" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath75"><path
id="clipPath76"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path73" /></clipPath><clipPath
id="path74" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath87"><path
id="clipPath88"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path85" /></clipPath><clipPath
id="path86" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath103"><path
id="clipPath104"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path101" /></clipPath><clipPath
id="path102" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath115"><path
id="clipPath116"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path113" /></clipPath><clipPath
id="path114" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath129"><path
id="clipPath134"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path127" /></clipPath><clipPath
id="path132" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath143"><path
id="clipPath150"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path141" /></clipPath><clipPath
id="path148" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath155"><path
id="clipPath166"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path153" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath185"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path183" /></clipPath></defs><sodipodi:namedview
id="namedview11"
id="path164" /></clipPath></defs><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
@@ -87,172 +82,168 @@
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.321875"
inkscape:cx="636.21749"
inkscape:cy="138.06147"
inkscape:zoom="0.88014498"
inkscape:cx="611.83102"
inkscape:cy="96.574998"
inkscape:window-width="2560"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-height="1377"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g15" /><g
id="g15"
inkscape:current-layer="g8" /><g
id="g8"
inkscape:groupmode="layer"
inkscape:label="ast"
transform="matrix(1.3333333,0,0,-1.3333333,-3.8599999,498.70537)"><path
d="m 4.02,282.28 c 0,4.78 3.8773,8.66 8.66,8.66 H 147.4 c 4.78,0 8.66,-3.88 8.66,-8.66 v -34.64 c 0,-4.78 -3.88,-8.66 -8.66,-8.66 H 12.68 c -4.7827,0 -8.66,3.88 -8.66,8.66 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path27" /><g
id="g29"><g
id="g31"
clip-path="url(#clipPath35)"><text
transform="matrix(1,0,0,-1,19.992,256.3)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text39"><tspan
x="0 24 48 72 96"
y="0"
sodipodi:role="line"
id="tspan37">动态图代码</tspan></text></g></g><path
d="m 204.54,345.94 c 0,6.08 4.92,11 11,11 h 130.04 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 H 215.54 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path41" /><g
id="g43"><g
id="g45"
clip-path="url(#clipPath49)"><text
transform="matrix(1,0,0,-1,256.49,329.74)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text53"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan51">分词</tspan></text></g></g><g
id="g55"><g
id="g57"
clip-path="url(#clipPath61)"><text
transform="matrix(1,0,0,-1,232.49,300.94)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text65"><tspan
x="0 24 48 72"
y="0"
sodipodi:role="line"
id="tspan63">词法分析</tspan></text></g></g><path
d="m 201.3,237.94 c 0,6.08 4.92,11 11,11 h 130.04 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 H 212.3 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path67" /><g
id="g69"><g
id="g71"
clip-path="url(#clipPath75)"><text
transform="matrix(1,0,0,-1,253.25,221.64)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text79"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan77">解析</tspan></text></g></g><g
id="g81"><g
id="g83"
clip-path="url(#clipPath87)"><text
transform="matrix(1,0,0,-1,229.25,192.84)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text91"><tspan
x="0 24 48 72"
y="0"
sodipodi:role="line"
id="tspan89">语法分析</tspan></text></g></g><g
id="g93"><path
d="m 188.1,342.74 c 0,16.66 13.5,30.16 30.16,30.16 H 338.9 c 16.66,0 30.16,-13.5 30.16,-30.16 v -145.6 c 0,-16.66 -13.5,-30.16 -30.16,-30.16 H 218.26 c -16.66,0 -30.16,13.5 -30.16,30.16 z"
inkscape:label="ch04-graph_23"
transform="matrix(1.3333333,0,0,-1.3333333,-7.1733332,458.70611)"><g
id="g20"><path
d="m 188.1,318.68 c 0,13.38 10.84,24.22 24.22,24.22 h 132.52 c 13.38,0 24.22,-10.84 24.22,-24.22 V 221.8 c 0,-13.38 -10.84,-24.22 -24.22,-24.22 H 212.32 c -13.38,0 -24.22,10.84 -24.22,24.22 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:6.75, 2.25;stroke-dashoffset:0;stroke-opacity:1"
id="path95" /></g><g
id="g97"><g
id="g99"
clip-path="url(#clipPath103)"><text
transform="matrix(1,0,0,-1,396.07,316.25)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text107"><tspan
x="0 24"
id="path22" /></g><g
id="g24"><g
id="g26"
clip-path="url(#clipPath30)"><text
transform="matrix(1,0,0,-1,402.5,305.93)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text34"><tspan
x="0 18"
y="0"
sodipodi:role="line"
id="tspan105">抽象</tspan></text></g></g><g
id="g109"><g
id="g111"
clip-path="url(#clipPath115)"><text
transform="matrix(1,0,0,-1,384.07,287.45)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text119"><tspan
x="0 24 48"
id="tspan32">抽象</tspan></text></g></g><g
id="g36"><g
id="g38"
clip-path="url(#clipPath42)"><text
transform="matrix(1,0,0,-1,393.5,284.33)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text46"><tspan
x="0 18 36"
y="0"
sodipodi:role="line"
id="tspan117">语法树</tspan></text></g></g><path
d="m 472.26,286.9 c 0,6.08 4.92,11 11,11 H 613.3 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 H 483.26 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path121" /><g
id="g123"><g
id="g125"
clip-path="url(#clipPath129)"><text
transform="matrix(1,0,0,-1,488.28,256.3)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text133"><tspan
x="0 24 48 72 96"
id="tspan44">语法树</tspan></text></g></g><path
d="m 5.88,289.43 c 0,1.33 1.0789,2.41 2.4097,2.41 H 155.39 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 H 8.2897 C 6.9589,249 5.88,250.08 5.88,251.41 Z"
style="fill:#dae3f3;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path48" /><path
d="m 5.88,289.43 c 0,1.33 1.0789,2.41 2.4097,2.41 H 155.39 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 H 8.2897 C 6.9589,249 5.88,250.08 5.88,251.41 Z"
style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path50" /><g
id="g52"><g
id="g54"
clip-path="url(#clipPath58)"><text
transform="matrix(1,0,0,-1,36.768,264.38)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text62"><tspan
x="0 18 36 54 72"
y="0"
sodipodi:role="line"
id="tspan131">语法树转写</tspan></text></g></g><path
d="m 675.06,286.9 c 0,6.08 4.92,11 11,11 h 83 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 h -83 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path135" /><g
id="g137"><g
id="g139"
clip-path="url(#clipPath143)"><text
transform="matrix(1,0,0,-1,691.54,270.7)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text147"><tspan
x="0 24 48"
id="tspan60">动态图代码</tspan></text></g></g><path
d="m 157.87,271.17 25.25,-0.21 -0.02,-1.5 -25.25,0.21 z m 24.26,2.05 5.98,-3.05 -6.02,-2.95 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path64" /><path
d="m 202.56,319.91 c 0,1.33 1.08,2.41 2.41,2.41 h 147.1 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 h -147.1 c -1.33,0 -2.41,1.08 -2.41,2.41 z"
style="fill:#dae3f3;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path66" /><path
d="m 202.56,319.91 c 0,1.33 1.08,2.41 2.41,2.41 h 147.1 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 h -147.1 c -1.33,0 -2.41,1.08 -2.41,2.41 z"
style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path68" /><g
id="g70"><g
id="g72"
clip-path="url(#clipPath76)"><text
transform="matrix(1,0,0,-1,260.54,305.69)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text80"><tspan
x="0 18"
y="0"
sodipodi:role="line"
id="tspan145">静态图</tspan></text></g></g><g
id="g149"><g
id="g151"
clip-path="url(#clipPath155)"><text
transform="matrix(1,0,0,-1,703.54,241.9)"
style="font-variant:normal;font-weight:normal;font-size:24.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text159"><tspan
x="0 24"
id="tspan78">分词</tspan></text></g></g><g
id="g82"><g
id="g84"
clip-path="url(#clipPath88)"><text
transform="matrix(1,0,0,-1,242.52,284.09)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text92"><tspan
x="0 18 36 54"
y="0"
sodipodi:role="line"
id="tspan157">代码</tspan></text></g></g><path
d="m 156,271.29 h 19.5 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 H 156 Z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path161" /><path
d="m 156,271.29 h 19.5 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 H 156 Z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path163" /><path
d="m 369.24,274.29 h 88.98 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -88.98 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path165" /><path
d="m 369.24,274.29 h 88.98 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -88.98 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path167" /><path
d="m 624.24,271.29 h 37.02 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -37.02 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path169" /><path
d="m 624.24,271.29 h 37.02 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -37.02 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path171" /><path
d="m 779.4,271.29 h 36.9 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -36.9 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path173" /><path
d="m 779.4,271.29 h 36.9 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -36.9 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path175" /><path
d="m 830.82,286.9 c 0,6.08 4.92,11 11,11 h 101.24 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 H 841.82 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path177" /><g
id="g179"><g
id="g181"
clip-path="url(#clipPath185)"><text
transform="matrix(1,0,0,-1,844.42,256.3)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text189"><tspan
x="0 24 48 72"
id="tspan90">词法分析</tspan></text></g></g><path
d="m 202.56,254.5 c 0,1.34 1.08,2.42 2.42,2.42 h 147.08 c 1.34,0 2.42,-1.08 2.42,-2.42 v -38.24 c 0,-1.34 -1.08,-2.42 -2.42,-2.42 H 204.98 c -1.34,0 -2.42,1.08 -2.42,2.42 z"
style="fill:#dae3f3;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path94" /><path
d="m 202.56,254.5 c 0,1.34 1.08,2.42 2.42,2.42 h 147.08 c 1.34,0 2.42,-1.08 2.42,-2.42 v -38.24 c 0,-1.34 -1.08,-2.42 -2.42,-2.42 H 204.98 c -1.34,0 -2.42,1.08 -2.42,2.42 z"
style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path96" /><g
id="g98"><g
id="g100"
clip-path="url(#clipPath104)"><text
transform="matrix(1,0,0,-1,260.54,240.1)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text108"><tspan
x="0 18"
y="0"
sodipodi:role="line"
id="tspan187">静态生成</tspan></text></g></g></g></svg>
id="tspan106">解析</tspan></text></g></g><g
id="g110"><g
id="g112"
clip-path="url(#clipPath116)"><text
transform="matrix(1,0,0,-1,242.52,218.5)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text120"><tspan
x="0 18 36 54"
y="0"
sodipodi:role="line"
id="tspan118">语法分析</tspan></text></g></g><path
d="m 369.06,269.42 91.63,0.24 -0.01,1.5 -91.62,-0.24 z m 90.63,-2.02 5.99,3.02 -6,2.98 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path122" /><path
d="m 465.6,289.43 c 0,1.33 1.08,2.41 2.41,2.41 h 120.58 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 H 468.01 c -1.33,0 -2.41,1.08 -2.41,2.41 z"
style="fill:#dae3f3;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path124" /><path
d="m 465.6,289.43 c 0,1.33 1.08,2.41 2.41,2.41 h 120.58 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 H 468.01 c -1.33,0 -2.41,1.08 -2.41,2.41 z"
style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path126" /><g
id="g128"><g
id="g130"
clip-path="url(#clipPath134)"><text
transform="matrix(1,0,0,-1,483.36,264.38)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text138"><tspan
x="0 18 36 54 72"
y="0"
sodipodi:role="line"
id="tspan136">语法树转写</tspan></text></g></g><path
d="m 630.96,289.43 c 0,1.33 1.08,2.41 2.41,2.41 h 117.1 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 h -117.1 c -1.33,0 -2.41,1.08 -2.41,2.41 z"
style="fill:#dae3f3;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path140" /><path
d="m 630.96,289.43 c 0,1.33 1.08,2.41 2.41,2.41 h 117.1 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 h -117.1 c -1.33,0 -2.41,1.08 -2.41,2.41 z"
style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path142" /><g
id="g144"><g
id="g146"
clip-path="url(#clipPath150)"><text
transform="matrix(1,0,0,-1,646.97,264.38)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text154"><tspan
x="0 18 36 54 72"
y="0"
sodipodi:role="line"
id="tspan152">静态图代码</tspan></text></g></g><path
d="m 792.84,289.43 c 0,1.33 1.08,2.41 2.41,2.41 h 111.1 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 h -111.1 c -1.33,0 -2.41,1.08 -2.41,2.41 z"
style="fill:#dae3f3;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path156" /><path
d="m 792.84,289.43 c 0,1.33 1.08,2.41 2.41,2.41 h 111.1 c 1.33,0 2.41,-1.08 2.41,-2.41 v -38.02 c 0,-1.33 -1.08,-2.41 -2.41,-2.41 h -111.1 c -1.33,0 -2.41,1.08 -2.41,2.41 z"
style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path158" /><g
id="g160"><g
id="g162"
clip-path="url(#clipPath166)"><text
transform="matrix(1,0,0,-1,814.85,264.38)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text170"><tspan
x="0 18 36 54"
y="0"
sodipodi:role="line"
id="tspan168">静态生成</tspan></text></g></g><path
d="m 591.06,271.17 h 35 v -1.5 h -35 z m 34,2.25 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path172" /><path
d="m 752.94,271.17 h 35 v -1.5 h -35 z m 34,2.25 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path174" /></g></svg>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

258
img/ch03/ast1.svg Normal file
View File

@@ -0,0 +1,258 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg9"
xml:space="preserve"
width="1269.72"
height="277.57623"
viewBox="0 0 1269.72 277.57623"
sodipodi:docname="ast.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs13"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath23"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path21" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath35"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path33" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath49"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path47" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath61"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path59" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath75"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path73" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath87"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path85" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath103"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path101" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath115"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path113" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath129"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path127" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath143"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path141" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath155"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path153" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath185"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path183" /></clipPath></defs><sodipodi:namedview
id="namedview11"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.321875"
inkscape:cx="636.21749"
inkscape:cy="138.06147"
inkscape:window-width="2560"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="g15" /><g
id="g15"
inkscape:groupmode="layer"
inkscape:label="ast"
transform="matrix(1.3333333,0,0,-1.3333333,-3.8599999,498.70537)"><path
d="m 4.02,282.28 c 0,4.78 3.8773,8.66 8.66,8.66 H 147.4 c 4.78,0 8.66,-3.88 8.66,-8.66 v -34.64 c 0,-4.78 -3.88,-8.66 -8.66,-8.66 H 12.68 c -4.7827,0 -8.66,3.88 -8.66,8.66 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path27" /><g
id="g29"><g
id="g31"
clip-path="url(#clipPath35)"><text
transform="matrix(1,0,0,-1,19.992,256.3)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text39"><tspan
x="0 24 48 72 96"
y="0"
sodipodi:role="line"
id="tspan37">动态图代码</tspan></text></g></g><path
d="m 204.54,345.94 c 0,6.08 4.92,11 11,11 h 130.04 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 H 215.54 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path41" /><g
id="g43"><g
id="g45"
clip-path="url(#clipPath49)"><text
transform="matrix(1,0,0,-1,256.49,329.74)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text53"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan51">分词</tspan></text></g></g><g
id="g55"><g
id="g57"
clip-path="url(#clipPath61)"><text
transform="matrix(1,0,0,-1,232.49,300.94)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text65"><tspan
x="0 24 48 72"
y="0"
sodipodi:role="line"
id="tspan63">词法分析</tspan></text></g></g><path
d="m 201.3,237.94 c 0,6.08 4.92,11 11,11 h 130.04 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 H 212.3 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path67" /><g
id="g69"><g
id="g71"
clip-path="url(#clipPath75)"><text
transform="matrix(1,0,0,-1,253.25,221.64)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text79"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan77">解析</tspan></text></g></g><g
id="g81"><g
id="g83"
clip-path="url(#clipPath87)"><text
transform="matrix(1,0,0,-1,229.25,192.84)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text91"><tspan
x="0 24 48 72"
y="0"
sodipodi:role="line"
id="tspan89">语法分析</tspan></text></g></g><g
id="g93"><path
d="m 188.1,342.74 c 0,16.66 13.5,30.16 30.16,30.16 H 338.9 c 16.66,0 30.16,-13.5 30.16,-30.16 v -145.6 c 0,-16.66 -13.5,-30.16 -30.16,-30.16 H 218.26 c -16.66,0 -30.16,13.5 -30.16,30.16 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:6.75, 2.25;stroke-dashoffset:0;stroke-opacity:1"
id="path95" /></g><g
id="g97"><g
id="g99"
clip-path="url(#clipPath103)"><text
transform="matrix(1,0,0,-1,396.07,316.25)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text107"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan105">抽象</tspan></text></g></g><g
id="g109"><g
id="g111"
clip-path="url(#clipPath115)"><text
transform="matrix(1,0,0,-1,384.07,287.45)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text119"><tspan
x="0 24 48"
y="0"
sodipodi:role="line"
id="tspan117">语法树</tspan></text></g></g><path
d="m 472.26,286.9 c 0,6.08 4.92,11 11,11 H 613.3 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 H 483.26 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path121" /><g
id="g123"><g
id="g125"
clip-path="url(#clipPath129)"><text
transform="matrix(1,0,0,-1,488.28,256.3)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text133"><tspan
x="0 24 48 72 96"
y="0"
sodipodi:role="line"
id="tspan131">语法树转写</tspan></text></g></g><path
d="m 675.06,286.9 c 0,6.08 4.92,11 11,11 h 83 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 h -83 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path135" /><g
id="g137"><g
id="g139"
clip-path="url(#clipPath143)"><text
transform="matrix(1,0,0,-1,691.54,270.7)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text147"><tspan
x="0 24 48"
y="0"
sodipodi:role="line"
id="tspan145">静态图</tspan></text></g></g><g
id="g149"><g
id="g151"
clip-path="url(#clipPath155)"><text
transform="matrix(1,0,0,-1,703.54,241.9)"
style="font-variant:normal;font-weight:normal;font-size:24.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text159"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan157">代码</tspan></text></g></g><path
d="m 156,271.29 h 19.5 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 H 156 Z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path161" /><path
d="m 156,271.29 h 19.5 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 H 156 Z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path163" /><path
d="m 369.24,274.29 h 88.98 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -88.98 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path165" /><path
d="m 369.24,274.29 h 88.98 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -88.98 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path167" /><path
d="m 624.24,271.29 h 37.02 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -37.02 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path169" /><path
d="m 624.24,271.29 h 37.02 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -37.02 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path171" /><path
d="m 779.4,271.29 h 36.9 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -36.9 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path173" /><path
d="m 779.4,271.29 h 36.9 v 6.27 l 12.54,-12.54 -12.54,-12.54 v 6.27 h -36.9 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path175" /><path
d="m 830.82,286.9 c 0,6.08 4.92,11 11,11 h 101.24 c 6.08,0 11,-4.92 11,-11 v -44 c 0,-6.08 -4.92,-11 -11,-11 H 841.82 c -6.08,0 -11,4.92 -11,11 z"
style="fill:none;stroke:#2f528f;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path177" /><g
id="g179"><g
id="g181"
clip-path="url(#clipPath185)"><text
transform="matrix(1,0,0,-1,844.42,256.3)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text189"><tspan
x="0 24 48 72"
y="0"
sodipodi:role="line"
id="tspan187">静态生成</tspan></text></g></g></g></svg>

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 39 KiB

508
img/ch03/dynamic-gen1.svg Normal file
View File

@@ -0,0 +1,508 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg5783"
xml:space="preserve"
width="850.20532"
height="324.56"
viewBox="0 0 850.20532 324.56"
sodipodi:docname="dynamic-gen.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs5787"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5797"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path5795" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5807"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5805" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5819"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5817" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5831"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5829" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5843"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5841" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5855"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5853" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5867"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5865" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5879"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5877" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5891"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5889" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5903"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5901" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5915"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5913" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5943"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5941" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5955"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5953" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5967"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5965" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5981"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5979" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5993"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5991" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6007"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6005" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6019"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6017" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6031"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6029" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6045"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6043" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6057"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6055" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6071"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6069" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6083"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6081" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6095"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6093" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6109"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6107" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6121"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6119" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath6135"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path6133" /></clipPath></defs><sodipodi:namedview
id="namedview5785"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.321875"
inkscape:cx="497.02128"
inkscape:cy="215.22459"
inkscape:window-width="2560"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="g5789" /><g
id="g5789"
inkscape:groupmode="layer"
inkscape:label="dynamic-gen"
transform="matrix(1.3333333,0,0,-1.3333333,-143.19687,575.47999)"><g
id="g5801"><g
id="g5803"
clip-path="url(#clipPath5807)"><text
transform="matrix(1,0,0,-1,106.8,371.16)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#2e75b6;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5811"><tspan
x="0 9 17.063999"
y="0"
sodipodi:role="line"
id="tspan5809">def</tspan></text></g></g><g
id="g5813"><g
id="g5815"
clip-path="url(#clipPath5819)"><text
transform="matrix(1,0,0,-1,134.3,371.16)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5823"><tspan
x="0 13.914 22.914 31.914 39.905998 44.981998 50.976002 63.972 68.472 72.972 78.966003 83.970001 91.998001 100.998 106.992"
y="0"
sodipodi:role="line"
id="tspan5821">model(X, flag):</tspan></text></g></g><g
id="g5825"><g
id="g5827"
clip-path="url(#clipPath5831)"><text
transform="matrix(1,0,0,-1,133.82,349.56)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5835"><tspan
x="0 5.0106721 11.012664 15.518664 21.520657 26.531328 34.533985 43.545982 53.711521 62.723518"
y="0"
sodipodi:role="line"
id="tspan5833">if flag&gt;0:</tspan></text></g></g><g
id="g5837"><g
id="g5839"
clip-path="url(#clipPath5843)"><text
transform="matrix(1,0,0,-1,160.1,327.94)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5847"><tspan
x="0 12.24 16.902 27.054001 31.554001 45.467999 53.459999 58.535999 72.449997 81.449997 86.454002 92.447998 109.44 118.44 122.94 127.512 140.508"
y="0"
sodipodi:role="line"
id="tspan5845">Y = matmul(W1, X)</tspan></text></g></g><g
id="g5849"><g
id="g5851"
clip-path="url(#clipPath5855)"><text
transform="matrix(1,0,0,-1,133.82,306.34)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5859"><tspan
x="0 7.9920001 13.068 20.07 28.062"
y="0"
sodipodi:role="line"
id="tspan5857">else:</tspan></text></g></g><g
id="g5861"><g
id="g5863"
clip-path="url(#clipPath5867)"><text
transform="matrix(1,0,0,-1,160.1,284.74)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5871"><tspan
x="0 12.24 16.902 27.054001 31.554001 45.467999 53.459999 58.535999 72.449997 81.449997 86.454002 92.447998 109.44 118.44 122.94 127.512 140.508"
y="0"
sodipodi:role="line"
id="tspan5869">Y = matmul(W2, X)</tspan></text></g></g><g
id="g5873"><g
id="g5875"
clip-path="url(#clipPath5879)"><text
transform="matrix(1,0,0,-1,133.1,263.14)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5883"><tspan
x="0 12.24 16.902 27.054001 30.816 43.056 47.591999 57.743999 62.243999"
y="0"
sodipodi:role="line"
id="tspan5881">Y = Y + b</tspan></text></g></g><g
id="g5885"><g
id="g5887"
clip-path="url(#clipPath5891)"><text
transform="matrix(1,0,0,-1,133.1,241.54)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5895"><tspan
x="0 12.238296 16.906511 27.072048 31.578049 37.58004 45.582695 50.593369 59.60537 65.607361 78.620689"
y="0"
sodipodi:role="line"
id="tspan5893">Y = relu(Y)</tspan></text></g></g><g
id="g5897"><g
id="g5899"
clip-path="url(#clipPath5903)"><text
transform="matrix(1,0,0,-1,133.82,219.91)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#2e75b6;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5907"><tspan
x="0 5.994 13.986 19.062 28.062 34.056"
y="0"
sodipodi:role="line"
id="tspan5905">return</tspan></text></g></g><g
id="g5909"><g
id="g5911"
clip-path="url(#clipPath5915)"><text
transform="matrix(1,0,0,-1,180.62,219.91)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5919"><tspan
x="0"
y="0"
id="tspan5917">Y</tspan></text></g></g><path
d="m 310.38,334.36 h 54.56 v 68.3 l -0.75,-0.75 h 48.82 v 1.5 h -49.57 v -68.3 l 0.75,0.75 h -53.81 z m 101.63,65.3 6,3 -6,3 z"
style="fill:#0070c0;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5921" /><g
id="g5923"><path
d="m 417.9,423.54 c 0,4.04 3.28,7.32 7.32,7.32 h 307.8 c 4.04,0 7.32,-3.28 7.32,-7.32 v -29.28 c 0,-4.04 -3.28,-7.32 -7.32,-7.32 h -307.8 c -4.04,0 -7.32,3.28 -7.32,7.32 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:1.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
id="path5925" /></g><g
id="g5927"><path
d="m 421.98,348.92 c 0,4.03 3.27,7.3 7.3,7.3 H 737 c 4.03,0 7.3,-3.27 7.3,-7.3 v -29.2 c 0,-4.03 -3.27,-7.3 -7.3,-7.3 H 429.28 c -4.03,0 -7.3,3.27 -7.3,7.3 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:1.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
id="path5929" /></g><g
id="g5931"><path
d="m 417.9,277.02 c 0,4.04 3.28,7.32 7.32,7.32 h 307.8 c 4.04,0 7.32,-3.28 7.32,-7.32 v -29.28 c 0,-4.04 -3.28,-7.32 -7.32,-7.32 h -307.8 c -4.04,0 -7.32,3.28 -7.32,7.32 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:1.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
id="path5933" /></g><path
d="m 425.46,417.84 c 0,2.49 2.01,4.5 4.5,4.5 h 120.48 c 2.49,0 4.5,-2.01 4.5,-4.5 v -18 c 0,-2.49 -2.01,-4.5 -4.5,-4.5 H 429.96 c -2.49,0 -4.5,2.01 -4.5,4.5 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5935" /><g
id="g5937"><g
id="g5939"
clip-path="url(#clipPath5943)"><text
transform="matrix(1,0,0,-1,435.82,404.59)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5947"><tspan
x="0 12 24 36"
y="0"
sodipodi:role="line"
id="tspan5945">运行前向</tspan></text></g></g><g
id="g5949"><g
id="g5951"
clip-path="url(#clipPath5955)"><text
transform="matrix(1,0,0,-1,483.82,404.59)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5959"><tspan
x="0 9.3360004 14.664 18 27.336 33.335999"
y="0"
sodipodi:role="line"
id="tspan5957">matmul</tspan></text></g></g><g
id="g5961"><g
id="g5963"
clip-path="url(#clipPath5967)"><text
transform="matrix(1,0,0,-1,520.56,404.59)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5971"><tspan
x="0 12"
y="0"
sodipodi:role="line"
id="tspan5969">算子</tspan></text></g></g><path
d="m 573.42,417.24 c 0,2.49 2.01,4.5 4.5,4.5 H 723 c 2.49,0 4.5,-2.01 4.5,-4.5 v -18 c 0,-2.49 -2.01,-4.5 -4.5,-4.5 H 577.92 c -2.49,0 -4.5,2.01 -4.5,4.5 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5973" /><g
id="g5975"><g
id="g5977"
clip-path="url(#clipPath5981)"><text
transform="matrix(1,0,0,-1,596.09,403.9)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5985"><tspan
x="0 9.3360004 14.664 18 27.336 33.335999"
y="0"
sodipodi:role="line"
id="tspan5983">matmul</tspan></text></g></g><g
id="g5987"><g
id="g5989"
clip-path="url(#clipPath5993)"><text
transform="matrix(1,0,0,-1,632.81,403.9)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5997"><tspan
x="0 12 24 36 48 60"
y="0"
sodipodi:role="line"
id="tspan5995">算子反向计算</tspan></text></g></g><path
d="m 436.98,344.34 c 0,3.05 2.47,5.52 5.52,5.52 h 110.64 c 3.05,0 5.52,-2.47 5.52,-5.52 v -22.08 c 0,-3.05 -2.47,-5.52 -5.52,-5.52 H 442.5 c -3.05,0 -5.52,2.47 -5.52,5.52 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5999" /><g
id="g6001"><g
id="g6003"
clip-path="url(#clipPath6007)"><text
transform="matrix(1,0,0,-1,453.14,329.02)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6011"><tspan
x="0 12 24 36"
y="0"
sodipodi:role="line"
id="tspan6009">运行前向</tspan></text></g></g><g
id="g6013"><g
id="g6015"
clip-path="url(#clipPath6019)"><text
transform="matrix(1,0,0,-1,501.14,329.02)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6023"><tspan
x="0 5.2785358 11.290536"
y="0"
sodipodi:role="line"
id="tspan6021">add</tspan></text></g></g><g
id="g6025"><g
id="g6027"
clip-path="url(#clipPath6031)"><text
transform="matrix(1,0,0,-1,518.42,329.02)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6035"><tspan
x="0 12"
y="0"
sodipodi:role="line"
id="tspan6033">算子</tspan></text></g></g><path
d="m 576.18,344.46 c 0,3.05 2.47,5.52 5.52,5.52 h 149.52 c 3.05,0 5.52,-2.47 5.52,-5.52 v -22.08 c 0,-3.05 -2.47,-5.52 -5.52,-5.52 H 581.7 c -3.05,0 -5.52,2.47 -5.52,5.52 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6037" /><g
id="g6039"><g
id="g6041"
clip-path="url(#clipPath6045)"><text
transform="matrix(1,0,0,-1,611.78,329.11)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6049"><tspan
x="0 5.2785358 11.290536"
y="0"
sodipodi:role="line"
id="tspan6047">add</tspan></text></g></g><g
id="g6051"><g
id="g6053"
clip-path="url(#clipPath6057)"><text
transform="matrix(1,0,0,-1,629.06,329.11)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6061"><tspan
x="0 12 24 36 48 60"
y="0"
sodipodi:role="line"
id="tspan6059">算子反向计算</tspan></text></g></g><path
d="m 432.9,273.42 c 0,3.05 2.47,5.52 5.52,5.52 h 112.2 c 3.05,0 5.52,-2.47 5.52,-5.52 v -22.08 c 0,-3.05 -2.47,-5.52 -5.52,-5.52 h -112.2 c -3.05,0 -5.52,2.47 -5.52,5.52 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6063" /><g
id="g6065"><g
id="g6067"
clip-path="url(#clipPath6071)"><text
transform="matrix(1,0,0,-1,443.98,258.05)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6075"><tspan
x="0 12 24 36"
y="0"
sodipodi:role="line"
id="tspan6073">运行前向</tspan></text></g></g><g
id="g6077"><g
id="g6079"
clip-path="url(#clipPath6083)"><text
transform="matrix(1,0,0,-1,491.98,258.05)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6087"><tspan
x="0 8.0200081 13.322592 20.404728"
y="0"
sodipodi:role="line"
id="tspan6085">ReLU</tspan></text></g></g><g
id="g6089"><g
id="g6091"
clip-path="url(#clipPath6095)"><text
transform="matrix(1,0,0,-1,521.02,258.05)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6099"><tspan
x="0 12.024"
y="0"
sodipodi:role="line"
id="tspan6097">算子</tspan></text></g></g><path
d="m 573.42,273.42 c 0,3.05 2.47,5.52 5.52,5.52 h 149.52 c 3.05,0 5.52,-2.47 5.52,-5.52 v -22.08 c 0,-3.05 -2.47,-5.52 -5.52,-5.52 H 578.94 c -3.05,0 -5.52,2.47 -5.52,5.52 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6101" /><g
id="g6103"><g
id="g6105"
clip-path="url(#clipPath6109)"><text
transform="matrix(1,0,0,-1,603.19,258.05)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6113"><tspan
x="0 8.052 13.332 20.436001"
y="0"
sodipodi:role="line"
id="tspan6111">ReLU</tspan></text></g></g><g
id="g6115"><g
id="g6117"
clip-path="url(#clipPath6121)"><text
transform="matrix(1,0,0,-1,632.26,258.05)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6125"><tspan
x="0 12 24 36 48 60"
y="0"
sodipodi:role="line"
id="tspan6123">算子反向计算</tspan></text></g></g><path
d="m 599.82,211.44 c 0,2.49 2.01,4.5 4.5,4.5 h 102.6 c 2.49,0 4.5,-2.01 4.5,-4.5 v -18 c 0,-2.49 -2.01,-4.5 -4.5,-4.5 h -102.6 c -2.49,0 -4.5,2.01 -4.5,4.5 z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6127" /><g
id="g6129"><g
id="g6131"
clip-path="url(#clipPath6135)"><text
transform="matrix(1,0,0,-1,619.61,198.17)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text6139"><tspan
x="0 12.024 24.048 36.071999 48.096001 60.119999"
y="0"
sodipodi:role="line"
id="tspan6137">梯度反向计算</tspan></text></g></g><path
d="m 488.64,368.76 h 2.4 v 11.16 h 4.8 v -11.16 h 2.4 l -4.8,-4.8 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path6141" /><path
d="m 488.64,368.76 h 2.4 v 11.16 h 4.8 v -11.16 h 2.4 l -4.8,-4.8 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6143" /><path
d="m 491.16,292.56 h 2.58 v 14.52 h 5.16 v -14.52 h 2.58 l -5.16,-5.16 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path6145" /><path
d="m 491.16,292.56 h 2.58 v 14.52 h 5.16 v -14.52 h 2.58 l -5.16,-5.16 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6147" /><path
d="m 658.56,232.26 h -2.37 v -11.22 h -4.74 v 11.22 h -2.37 l 4.74,4.74 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path6149" /><path
d="m 658.56,232.26 h -2.37 v -11.22 h -4.74 v 11.22 h -2.37 l 4.74,4.74 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6151" /><path
d="m 658.68,300.06 h -2.37 v -11.22 h -4.74 v 11.22 h -2.37 l 4.74,4.74 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path6153" /><path
d="m 658.68,300.06 h -2.37 v -11.22 h -4.74 v 11.22 h -2.37 l 4.74,4.74 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6155" /><path
d="m 658.44,375.78 h -2.37 v -11.22 h -4.74 v 11.22 h -2.37 l 4.74,4.74 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path6157" /><path
d="m 658.44,375.78 h -2.37 v -11.22 h -4.74 v 11.22 h -2.37 l 4.74,4.74 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path6159" /><path
d="m 220.86,269.14 h 157.75 v 65.12 l -0.75,-0.75 h 39.18 v 1.5 h -39.93 v -65.12 l 0.75,0.75 h -157 z m 195.18,62.12 6,3 -6,3 z"
style="fill:#0070c0;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path6161" /><path
d="M 220.86,242.88 H 385.5 v 19.5 l -0.75,-0.75 H 413 v 1.5 h -29 v -19.5 l 0.75,0.75 H 220.86 Z m 191.14,16.5 6,3 -6,3 z"
style="fill:#0070c0;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path6163" /></g></svg>

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -2,259 +2,673 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="162.68581mm"
height="67.656052mm"
viewBox="0 0 162.68581 67.656052"
version="1.1"
id="svg5016"
xml:space="preserve"
width="762.47937"
height="246.65395"
viewBox="0 0 762.47937 246.65395"
sodipodi:docname="dynamic.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
id="svg5"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
sodipodi:docname="动态图.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs5020"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5030"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path5028" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5042"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5040" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5056"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5054" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5070"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5068" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5086"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5084" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5102"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5100" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5122"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5120" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5134"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5132" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5146"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5144" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5158"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5156" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5176"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5174" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5188"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5186" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5200"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5198" /></clipPath></defs><sodipodi:namedview
id="namedview5018"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.321875"
inkscape:cx="442.55319"
inkscape:cy="117.63593"
inkscape:window-width="2560"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="g5022" /><g
id="g5022"
inkscape:zoom="0.77771465"
inkscape:cx="278.37974"
inkscape:cy="35.360013"
inkscape:window-width="1926"
inkscape:window-height="1164"
inkscape:window-x="434"
inkscape:window-y="158"
inkscape:window-maximized="0"
inkscape:current-layer="g571" />
<defs
id="defs2">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath23">
<path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path21" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath35">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path33" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath49">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path47" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath63">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path61" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath79">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path77" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath95">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path93" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath109">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path107" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath129">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path127" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath141">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path139" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath153">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path151" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath165">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path163" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath177">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path175" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath189">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path187" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath201">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path199" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath213">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path211" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath229">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path227" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath241">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path239" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath253">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path251" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath265">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path263" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath579">
<path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path577" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath591">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path589" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath605">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path603" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath619">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path617" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath635">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path633" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath651">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path649" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath665">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path663" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath685">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path683" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath697">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path695" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath709">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path707" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath721">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path719" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath733">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path731" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath745">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path743" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath757">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path755" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath769">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path767" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath785">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path783" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath797">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path795" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath809">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path807" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath821">
<path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path819" />
</clipPath>
</defs>
<g
inkscape:label="图层 1"
inkscape:groupmode="layer"
inkscape:label="dynamic"
transform="matrix(1.3333333,0,0,-1.3333333,-197.68062,478.01395)"><path
d="m 163.02,295.32 44.52,-20.85 -0.96,-2.03 -44.52,20.84 z m 44.45,-18.33 4.69,-5.92 -7.55,-0.19 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5034" /><g
id="g5036"><g
id="g5038"
clip-path="url(#clipPath5042)"><text
transform="matrix(1,0,0,-1,245.38,273.79)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:20.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5046"><tspan
x="0"
y="0"
id="tspan5044">Y</tspan></text></g></g><path
d="m 167.62,228.57 34.61,23.81 -1.28,1.86 -34.61,-23.81 z m 34.95,21.32 3.65,6.61 -7.47,-1.05 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5048" /><g
id="g5050"><g
id="g5052"
clip-path="url(#clipPath5056)"><text
transform="matrix(1,0,0,-1,149.28,287.81)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18.024px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5060"><tspan
x="0"
y="0"
id="tspan5058">W</tspan></text></g></g><path
d="m 237.42,265.55 27.18,-0.01 v -2.24 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5062" /><g
id="g5064"><g
id="g5066"
clip-path="url(#clipPath5070)"><text
transform="matrix(1,0,0,-1,149.28,223.01)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5074"><tspan
x="0"
y="0"
id="tspan5072">A</tspan></text></g></g><path
d="m 206.22,264 c 0,7.09 5.88,12.84 13.14,12.84 7.26,0 13.14,-5.75 13.14,-12.84 0,-7.09 -5.88,-12.84 -13.14,-12.84 -7.26,0 -13.14,5.75 -13.14,12.84 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5078" /><g
id="g5080"
transform="translate(-3.9716313,-4.5390074)"><g
id="g5082"
clip-path="url(#clipPath5086)"><text
transform="matrix(1,0,0,-1,216.24,252.65)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5090"><tspan
x="0"
y="0"
id="tspan5088">*</tspan></text></g></g><path
d="m 269.34,265.2 c 0,11.1 9,20.1 20.1,20.1 11.1,0 20.1,-9 20.1,-20.1 0,-11.1 -9,-20.1 -20.1,-20.1 -11.1,0 -20.1,9 -20.1,20.1 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5094" /><g
id="g5096"><g
id="g5098"
clip-path="url(#clipPath5102)"><text
transform="matrix(1,0,0,-1,273.22,260.16)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5106"><tspan
x="0 9.3646803 15.59844 24.12072"
y="0"
sodipodi:role="line"
id="tspan5104">ReLU</tspan></text></g></g><path
d="m 309.54,265.55 27.18,-0.01 v -2.24 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5108" /><path
d="m 364.2,269.34 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 H 364.2 Z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path5110" /><path
d="m 364.2,269.34 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 H 364.2 Z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5112" /><path
d="m 434.58,304.56 c 0,27.21 22.05,49.26 49.26,49.26 v 0 c 27.21,0 49.26,-22.05 49.26,-49.26 v -80.28 c 0,-27.21 -22.05,-49.26 -49.26,-49.26 v 0 c -27.21,0 -49.26,22.05 -49.26,49.26 z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5114" /><g
id="g5116"><g
id="g5118"
clip-path="url(#clipPath5122)"><text
transform="matrix(1,0,0,-1,459.77,298.97)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5126"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5124">计算</tspan></text></g></g><g
id="g5128"><g
id="g5130"
clip-path="url(#clipPath5134)"><text
transform="matrix(1,0,0,-1,459.77,270.17)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5138"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5136">框架</tspan></text></g></g><g
id="g5140"><g
id="g5142"
clip-path="url(#clipPath5146)"><text
transform="matrix(1,0,0,-1,459.77,241.37)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5150"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5148">算子</tspan></text></g></g><g
id="g5152"><g
id="g5154"
clip-path="url(#clipPath5158)"><text
transform="matrix(1,0,0,-1,459.77,212.42)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5162"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5160">分发</tspan></text></g></g><path
d="m 545.52,269.34 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path5164" /><path
d="m 545.52,269.34 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5166" /><path
d="m 630.78,295.98 c 0,24.26 19.66,43.92 43.92,43.92 v 0 c 24.26,0 43.92,-19.66 43.92,-43.92 v -59.76 c 0,-24.26 -19.66,-43.92 -43.92,-43.92 v 0 c -24.26,0 -43.92,19.66 -43.92,43.92 z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5168" /><g
id="g5170"><g
id="g5172"
clip-path="url(#clipPath5176)"><text
transform="matrix(1,0,0,-1,650.88,277.1)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5180"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5178">硬件</tspan></text></g></g><g
id="g5182"><g
id="g5184"
clip-path="url(#clipPath5188)"><text
transform="matrix(1,0,0,-1,650.88,248.18)"
style="font-variant:normal;font-weight:normal;font-size:24.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5192"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5190">执行</tspan></text></g></g><g
id="g5194"><g
id="g5196"
clip-path="url(#clipPath5200)"><text
transform="matrix(1,0,0,-1,182.09,331.66)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5204"><tspan
x="0 32.040001 64.080002 96.120003"
y="0"
sodipodi:role="line"
id="tspan5202">前端定义</tspan></text></g></g></g></svg>
id="layer1"
transform="translate(-31.425089,-138.98401)">
<g
id="g571"
inkscape:label="ch04-graph_29"
transform="matrix(0.35277777,0,0,-0.35277777,-14.539515,268.41498)">
<path
d="m 163.02,295.32 44.52,-20.85 -0.96,-2.03 -44.52,20.84 z m 44.45,-18.33 4.69,-5.92 -7.55,-0.19 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path583" />
<g
id="g585">
<g
id="g587"
clip-path="url(#clipPath591)">
<text
transform="matrix(1,0,0,-1,245.38,273.82)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:20.064px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text595"><tspan
x="0"
y="0"
id="tspan593">Y</tspan></text>
</g>
</g>
<path
d="m 167.62,228.57 34.61,23.81 -1.28,1.86 -34.61,-23.81 z m 34.95,21.32 3.65,6.61 -7.47,-1.05 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path597" />
<g
id="g599">
<g
id="g601"
clip-path="url(#clipPath605)">
<text
transform="matrix(1,0,0,-1,149.28,287.81)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text609"><tspan
x="0"
y="0"
id="tspan607">W</tspan></text>
</g>
</g>
<path
d="m 237.42,265.55 h 27.18 v -2.25 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path611" />
<g
id="g613">
<g
id="g615"
clip-path="url(#clipPath619)">
<text
transform="matrix(1,0,0,-1,149.28,223.01)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text623"><tspan
x="0"
y="0"
id="tspan621">A</tspan></text>
</g>
</g>
<path
d="m 211.14,264.42 c 0,7.09 5.88,12.84 13.14,12.84 7.26,0 13.14,-5.75 13.14,-12.84 0,-7.09 -5.88,-12.84 -13.14,-12.84 -7.26,0 -13.14,5.75 -13.14,12.84 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path625" />
<path
d="m 211.14,264.42 c 0,7.09 5.88,12.84 13.14,12.84 7.26,0 13.14,-5.75 13.14,-12.84 0,-7.09 -5.88,-12.84 -13.14,-12.84 -7.26,0 -13.14,5.75 -13.14,12.84 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path627" />
<g
id="g629">
<g
id="g631"
clip-path="url(#clipPath635)">
<text
transform="matrix(1,0,0,-1,217.68,253.73)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text639"><tspan
x="0"
y="0"
id="tspan637">*</tspan></text>
</g>
</g>
<path
d="m 269.34,265.2 c 0,11.1 9,20.1 20.1,20.1 11.1,0 20.1,-9 20.1,-20.1 0,-11.1 -9,-20.1 -20.1,-20.1 -11.1,0 -20.1,9 -20.1,20.1 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path641" />
<path
d="m 269.34,265.2 c 0,11.1 9,20.1 20.1,20.1 11.1,0 20.1,-9 20.1,-20.1 0,-11.1 -9,-20.1 -20.1,-20.1 -11.1,0 -20.1,9 -20.1,20.1 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path643" />
<g
id="g645">
<g
id="g647"
clip-path="url(#clipPath651)">
<text
transform="matrix(1,0,0,-1,273.22,260.18)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text655"><tspan
x="0 9.3806877 15.625104 24.119761"
y="0"
sodipodi:role="line"
id="tspan653">ReLU</tspan></text>
</g>
</g>
<path
d="m 309.54,265.55 h 27.18 v -2.25 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path657" />
<g
id="g659">
<g
id="g661"
clip-path="url(#clipPath665)">
<text
transform="matrix(1,0,0,-1,189.29,347.93)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text669"><tspan
x="0 24 48 72"
y="0"
sodipodi:role="line"
id="tspan667">前端定义</tspan></text>
</g>
</g>
<g
id="g671">
<path
d="m 130.8,318.24 c 0,3.64 2.96,6.6 6.6,6.6 h 199.8 c 3.64,0 6.6,-2.96 6.6,-6.6 V 214.08 c 0,-3.64 -2.96,-6.6 -6.6,-6.6 H 137.4 c -3.64,0 -6.6,2.96 -6.6,6.6 z"
style="fill:none;stroke:#4472c4;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:3, 1;stroke-dashoffset:0;stroke-opacity:1"
id="path673" />
</g>
<path
d="m 413.82,324.66 c 0,16.5 13.38,29.88 29.88,29.88 v 0 c 16.5,0 29.88,-13.38 29.88,-29.88 V 205.74 c 0,-16.5 -13.38,-29.88 -29.88,-29.88 v 0 c -16.5,0 -29.88,13.38 -29.88,29.88 z"
style="fill:#b4c7e7;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path675" />
<path
d="m 413.82,324.66 c 0,16.5 13.38,29.88 29.88,29.88 v 0 c 16.5,0 29.88,-13.38 29.88,-29.88 V 205.74 c 0,-16.5 -13.38,-29.88 -29.88,-29.88 v 0 c -16.5,0 -29.88,13.38 -29.88,29.88 z"
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path677" />
<g
id="g679">
<g
id="g681"
clip-path="url(#clipPath685)">
<text
transform="matrix(1,0,0,-1,434.64,334.82)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text689"><tspan
x="0"
y="0"
id="tspan687"></tspan></text>
</g>
</g>
<g
id="g691">
<g
id="g693"
clip-path="url(#clipPath697)">
<text
transform="matrix(1,0,0,-1,434.64,313.22)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text701"><tspan
x="0"
y="0"
id="tspan699"></tspan></text>
</g>
</g>
<g
id="g703">
<g
id="g705"
clip-path="url(#clipPath709)">
<text
transform="matrix(1,0,0,-1,434.64,291.62)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text713"><tspan
x="0"
y="0"
id="tspan711"></tspan></text>
</g>
</g>
<g
id="g715">
<g
id="g717"
clip-path="url(#clipPath721)">
<text
transform="matrix(1,0,0,-1,434.64,270.02)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text725"><tspan
x="0"
y="0"
id="tspan723"></tspan></text>
</g>
</g>
<g
id="g727">
<g
id="g729"
clip-path="url(#clipPath733)">
<text
transform="matrix(1,0,0,-1,434.64,248.42)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text737"><tspan
x="0"
y="0"
id="tspan735"></tspan></text>
</g>
</g>
<g
id="g739">
<g
id="g741"
clip-path="url(#clipPath745)">
<text
transform="matrix(1,0,0,-1,434.64,226.8)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text749"><tspan
x="0"
y="0"
id="tspan747"></tspan></text>
</g>
</g>
<g
id="g751">
<g
id="g753"
clip-path="url(#clipPath757)">
<text
transform="matrix(1,0,0,-1,434.64,205.2)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text761"><tspan
x="0"
y="0"
id="tspan759"></tspan></text>
</g>
</g>
<g
id="g763">
<g
id="g765"
clip-path="url(#clipPath769)">
<text
transform="matrix(1,0,0,-1,434.64,183.6)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text773"><tspan
x="0"
y="0"
id="tspan771"></tspan></text>
</g>
</g>
<path
d="m 543.54,315.48 c 0,13.02 10.56,23.58 23.58,23.58 v 0 c 13.02,0 23.58,-10.56 23.58,-23.58 V 215.04 c 0,-13.02 -10.56,-23.58 -23.58,-23.58 v 0 c -13.02,0 -23.58,10.56 -23.58,23.58 z"
style="fill:#b4c7e7;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path775" />
<path
d="m 543.54,315.48 c 0,13.02 10.56,23.58 23.58,23.58 v 0 c 13.02,0 23.58,-10.56 23.58,-23.58 V 215.04 c 0,-13.02 -10.56,-23.58 -23.58,-23.58 v 0 c -13.02,0 -23.58,10.56 -23.58,23.58 z"
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path777" />
<g
id="g779">
<g
id="g781"
clip-path="url(#clipPath785)">
<text
transform="matrix(1,0,0,-1,558.02,291.62)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text789"><tspan
x="0"
y="0"
id="tspan787"></tspan></text>
</g>
</g>
<g
id="g791">
<g
id="g793"
clip-path="url(#clipPath797)">
<text
transform="matrix(1,0,0,-1,558.02,270.02)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text801"><tspan
x="0"
y="0"
id="tspan799"></tspan></text>
</g>
</g>
<g
id="g803">
<g
id="g805"
clip-path="url(#clipPath809)">
<text
transform="matrix(1,0,0,-1,558.02,248.42)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text813"><tspan
x="0"
y="0"
id="tspan811"></tspan></text>
</g>
</g>
<g
id="g815">
<g
id="g817"
clip-path="url(#clipPath821)">
<text
transform="matrix(1,0,0,-1,558.02,226.8)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text825"><tspan
x="0"
y="0"
id="tspan823"></tspan></text>
</g>
</g>
<path
d="m 351.06,264.51 h 57.83 v 1.5 h -57.83 z m 56.83,-2.25 6,3 -6,3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path827" />
<path
d="m 473.58,266.01 h 64.96 v -1.5 h -64.96 z m 63.96,2.25 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path829" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 23 KiB

260
img/ch03/dynamic1.svg Normal file
View File

@@ -0,0 +1,260 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg5016"
xml:space="preserve"
width="762.47937"
height="246.65395"
viewBox="0 0 762.47937 246.65395"
sodipodi:docname="dynamic.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs5020"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5030"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path5028" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5042"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5040" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5056"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5054" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5070"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5068" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5086"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5084" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5102"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5100" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5122"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5120" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5134"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5132" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5146"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5144" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5158"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5156" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5176"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5174" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5188"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5186" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath5200"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path5198" /></clipPath></defs><sodipodi:namedview
id="namedview5018"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.321875"
inkscape:cx="442.55319"
inkscape:cy="117.63593"
inkscape:window-width="2560"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="g5022" /><g
id="g5022"
inkscape:groupmode="layer"
inkscape:label="dynamic"
transform="matrix(1.3333333,0,0,-1.3333333,-197.68062,478.01395)"><path
d="m 163.02,295.32 44.52,-20.85 -0.96,-2.03 -44.52,20.84 z m 44.45,-18.33 4.69,-5.92 -7.55,-0.19 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5034" /><g
id="g5036"><g
id="g5038"
clip-path="url(#clipPath5042)"><text
transform="matrix(1,0,0,-1,245.38,273.79)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:20.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5046"><tspan
x="0"
y="0"
id="tspan5044">Y</tspan></text></g></g><path
d="m 167.62,228.57 34.61,23.81 -1.28,1.86 -34.61,-23.81 z m 34.95,21.32 3.65,6.61 -7.47,-1.05 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5048" /><g
id="g5050"><g
id="g5052"
clip-path="url(#clipPath5056)"><text
transform="matrix(1,0,0,-1,149.28,287.81)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18.024px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5060"><tspan
x="0"
y="0"
id="tspan5058">W</tspan></text></g></g><path
d="m 237.42,265.55 27.18,-0.01 v -2.24 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5062" /><g
id="g5064"><g
id="g5066"
clip-path="url(#clipPath5070)"><text
transform="matrix(1,0,0,-1,149.28,223.01)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5074"><tspan
x="0"
y="0"
id="tspan5072">A</tspan></text></g></g><path
d="m 206.22,264 c 0,7.09 5.88,12.84 13.14,12.84 7.26,0 13.14,-5.75 13.14,-12.84 0,-7.09 -5.88,-12.84 -13.14,-12.84 -7.26,0 -13.14,5.75 -13.14,12.84 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5078" /><g
id="g5080"
transform="translate(-3.9716313,-4.5390074)"><g
id="g5082"
clip-path="url(#clipPath5086)"><text
transform="matrix(1,0,0,-1,216.24,252.65)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5090"><tspan
x="0"
y="0"
id="tspan5088">*</tspan></text></g></g><path
d="m 269.34,265.2 c 0,11.1 9,20.1 20.1,20.1 11.1,0 20.1,-9 20.1,-20.1 0,-11.1 -9,-20.1 -20.1,-20.1 -11.1,0 -20.1,9 -20.1,20.1 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5094" /><g
id="g5096"><g
id="g5098"
clip-path="url(#clipPath5102)"><text
transform="matrix(1,0,0,-1,273.22,260.16)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5106"><tspan
x="0 9.3646803 15.59844 24.12072"
y="0"
sodipodi:role="line"
id="tspan5104">ReLU</tspan></text></g></g><path
d="m 309.54,265.55 27.18,-0.01 v -2.24 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path5108" /><path
d="m 364.2,269.34 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 H 364.2 Z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path5110" /><path
d="m 364.2,269.34 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 H 364.2 Z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5112" /><path
d="m 434.58,304.56 c 0,27.21 22.05,49.26 49.26,49.26 v 0 c 27.21,0 49.26,-22.05 49.26,-49.26 v -80.28 c 0,-27.21 -22.05,-49.26 -49.26,-49.26 v 0 c -27.21,0 -49.26,22.05 -49.26,49.26 z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5114" /><g
id="g5116"><g
id="g5118"
clip-path="url(#clipPath5122)"><text
transform="matrix(1,0,0,-1,459.77,298.97)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5126"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5124">计算</tspan></text></g></g><g
id="g5128"><g
id="g5130"
clip-path="url(#clipPath5134)"><text
transform="matrix(1,0,0,-1,459.77,270.17)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5138"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5136">框架</tspan></text></g></g><g
id="g5140"><g
id="g5142"
clip-path="url(#clipPath5146)"><text
transform="matrix(1,0,0,-1,459.77,241.37)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5150"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5148">算子</tspan></text></g></g><g
id="g5152"><g
id="g5154"
clip-path="url(#clipPath5158)"><text
transform="matrix(1,0,0,-1,459.77,212.42)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5162"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5160">分发</tspan></text></g></g><path
d="m 545.52,269.34 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path5164" /><path
d="m 545.52,269.34 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5166" /><path
d="m 630.78,295.98 c 0,24.26 19.66,43.92 43.92,43.92 v 0 c 24.26,0 43.92,-19.66 43.92,-43.92 v -59.76 c 0,-24.26 -19.66,-43.92 -43.92,-43.92 v 0 c -24.26,0 -43.92,19.66 -43.92,43.92 z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path5168" /><g
id="g5170"><g
id="g5172"
clip-path="url(#clipPath5176)"><text
transform="matrix(1,0,0,-1,650.88,277.1)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5180"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5178">硬件</tspan></text></g></g><g
id="g5182"><g
id="g5184"
clip-path="url(#clipPath5188)"><text
transform="matrix(1,0,0,-1,650.88,248.18)"
style="font-variant:normal;font-weight:normal;font-size:24.024px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5192"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan5190">执行</tspan></text></g></g><g
id="g5194"><g
id="g5196"
clip-path="url(#clipPath5200)"><text
transform="matrix(1,0,0,-1,182.09,331.66)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text5204"><tspan
x="0 32.040001 64.080002 96.120003"
y="0"
sodipodi:role="line"
id="tspan5202">前端定义</tspan></text></g></g></g></svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -3,109 +3,109 @@
<svg
version="1.1"
id="svg12628"
id="svg2"
xml:space="preserve"
width="1044.8153"
height="270.35999"
viewBox="0 0 1044.8153 270.35999"
sodipodi:docname="static.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
width="800.31769"
height="275.66666"
viewBox="0 0 800.31768 275.66666"
sodipodi:docname="ch04-graph_19.svg"
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs12632"><clipPath
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12642"><path
id="clipPath16"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path12640" /></clipPath><clipPath
id="path14" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12654"><path
id="clipPath28"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12652" /></clipPath><clipPath
id="path26" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12668"><path
id="clipPath42"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12666" /></clipPath><clipPath
id="path40" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12682"><path
id="clipPath56"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12680" /></clipPath><clipPath
id="path54" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12698"><path
id="clipPath72"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12696" /></clipPath><clipPath
id="path70" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12714"><path
id="clipPath88"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12712" /></clipPath><clipPath
id="path86" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12734"><path
id="clipPath106"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12732" /></clipPath><clipPath
id="path104" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12746"><path
id="clipPath118"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12744" /></clipPath><clipPath
id="path116" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12758"><path
id="clipPath130"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12756" /></clipPath><clipPath
id="path128" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12776"><path
id="clipPath146"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12774" /></clipPath><clipPath
id="path144" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12788"><path
id="clipPath158"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12786" /></clipPath><clipPath
id="path156" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12800"><path
id="clipPath170"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12798" /></clipPath><clipPath
id="path168" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12818"><path
id="clipPath188"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12816" /></clipPath><clipPath
id="path186" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12830"><path
id="clipPath200"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12828" /></clipPath><clipPath
id="path198" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12842"><path
id="clipPath212"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12840" /></clipPath><clipPath
id="path210" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12860"><path
id="clipPath228"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12858" /></clipPath><clipPath
id="path226" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12872"><path
id="clipPath240"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12870" /></clipPath><clipPath
id="path238" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12884"><path
id="clipPath252"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12882" /></clipPath></defs><sodipodi:namedview
id="namedview12630"
id="path250" /></clipPath></defs><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
@@ -117,226 +117,238 @@
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.321875"
inkscape:cx="556.78487"
inkscape:cy="170.59102"
inkscape:zoom="1.2067845"
inkscape:cx="409.76662"
inkscape:cy="149.15671"
inkscape:window-width="2560"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-height="1377"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g12634" /><g
id="g12634"
inkscape:current-layer="g8" /><g
id="g8"
inkscape:groupmode="layer"
inkscape:label="static"
transform="matrix(1.3333333,0,0,-1.3333333,-82.864623,530.67999)"><path
d="m 76.977,299.76 44.523,-20.85 -0.96,-2.03 -44.517,20.84 z m 44.453,-18.33 4.69,-5.92 -7.55,-0.19 z"
inkscape:label="ch04-graph_19"
transform="matrix(1.3333333,0,0,-1.3333333,-81.082284,530.67999)"><path
d="m 90.417,299.76 44.523,-20.85 -0.96,-2.03 -44.517,20.84 z m 44.453,-18.33 4.69,-5.92 -7.55,-0.19 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path12646" /><g
id="g12648"><g
id="g12650"
clip-path="url(#clipPath12654)"><text
transform="matrix(1,0,0,-1,159.26,278.26)"
id="path20" /><g
id="g22"><g
id="g24"
clip-path="url(#clipPath28)"><text
transform="matrix(1,0,0,-1,172.75,278.26)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:20.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12658"><tspan
id="text32"><tspan
x="0"
y="0"
id="tspan12656">Y</tspan></text></g></g><path
d="m 81.578,233.01 34.612,23.81 -1.28,1.86 -34.608,-23.81 z m 34.952,21.32 3.65,6.61 -7.47,-1.05 z"
id="tspan30">Y</tspan></text></g></g><path
d="m 95.018,233.01 34.612,23.81 -1.28,1.86 -34.608,-23.81 z m 34.952,21.32 3.65,6.61 -7.47,-1.05 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path12660" /><g
id="g12662"><g
id="g12664"
clip-path="url(#clipPath12668)"><text
transform="matrix(1,0,0,-1,63.168,292.25)"
id="path34" /><g
id="g36"><g
id="g38"
clip-path="url(#clipPath42)"><text
transform="matrix(1,0,0,-1,76.68,292.25)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12672"><tspan
id="text46"><tspan
x="0"
y="0"
id="tspan12670">W</tspan></text></g></g><path
d="m 151.26,269.99 27.18,-0.01 v -2.24 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
id="tspan44">W</tspan></text></g></g><path
d="m 164.7,269.99 h 27.18 v -2.25 H 164.7 Z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path12674" /><g
id="g12676"><g
id="g12678"
clip-path="url(#clipPath12682)"><text
transform="matrix(1,0,0,-1,63.168,227.47)"
id="path48" /><g
id="g50"><g
id="g52"
clip-path="url(#clipPath56)"><text
transform="matrix(1,0,0,-1,76.68,227.47)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12686"><tspan
id="text60"><tspan
x="0"
y="0"
id="tspan12684">A</tspan></text></g></g><path
d="m 125.1,268.86 c 0,7.09 5.86,12.84 13.08,12.84 7.22,0 13.08,-5.75 13.08,-12.84 0,-7.09 -5.86,-12.84 -13.08,-12.84 -7.22,0 -13.08,5.75 -13.08,12.84 z"
id="tspan58">A</tspan></text></g></g><path
d="m 138.54,268.86 c 0,7.09 5.86,12.84 13.08,12.84 7.22,0 13.08,-5.75 13.08,-12.84 0,-7.09 -5.86,-12.84 -13.08,-12.84 -7.22,0 -13.08,5.75 -13.08,12.84 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path62" /><path
d="m 138.54,268.86 c 0,7.09 5.86,12.84 13.08,12.84 7.22,0 13.08,-5.75 13.08,-12.84 0,-7.09 -5.86,-12.84 -13.08,-12.84 -7.22,0 -13.08,5.75 -13.08,12.84 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12690" /><g
id="g12692"
transform="translate(-1.1347518,-4.5390076)"><g
id="g12694"
clip-path="url(#clipPath12698)"><text
transform="matrix(1,0,0,-1,130.13,257.09)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12702"><tspan
id="path64" /><g
id="g66"><g
id="g68"
clip-path="url(#clipPath72)"><text
transform="matrix(1,0,0,-1,145.06,258.19)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text76"><tspan
x="0"
y="0"
id="tspan12700">*</tspan></text></g></g><path
d="m 183.3,269.7 c 0,11.07 8.97,20.04 20.04,20.04 11.07,0 20.04,-8.97 20.04,-20.04 0,-11.07 -8.97,-20.04 -20.04,-20.04 -11.07,0 -20.04,8.97 -20.04,20.04 z"
id="tspan74">*</tspan></text></g></g><path
d="m 196.74,269.7 c 0,11.07 9,20.04 20.1,20.04 11.1,0 20.1,-8.97 20.1,-20.04 0,-11.07 -9,-20.04 -20.1,-20.04 -11.1,0 -20.1,8.97 -20.1,20.04 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path78" /><path
d="m 196.74,269.7 c 0,11.07 9,20.04 20.1,20.04 11.1,0 20.1,-8.97 20.1,-20.04 0,-11.07 -9,-20.04 -20.1,-20.04 -11.1,0 -20.1,8.97 -20.1,20.04 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12706" /><g
id="g12708"><g
id="g12710"
clip-path="url(#clipPath12714)"><text
transform="matrix(1,0,0,-1,187.1,264.62)"
id="path80" /><g
id="g82"><g
id="g84"
clip-path="url(#clipPath88)"><text
transform="matrix(1,0,0,-1,200.59,264.62)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12718"><tspan
id="text92"><tspan
x="0 9.3646803 15.59844 24.12072"
y="0"
sodipodi:role="line"
id="tspan12716">ReLU</tspan></text></g></g><path
d="m 223.38,269.99 27.18,-0.01 v -2.24 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
id="tspan90">ReLU</tspan></text></g></g><path
d="m 236.94,269.99 h 27.18 v -2.25 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path12720" /><path
d="m 278.16,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path12722" /><path
d="m 278.16,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12724" /><path
d="m 357.9,196.74 h 87.84 v 147.6 H 357.9 Z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12726" /><g
id="g12728"><g
id="g12730"
clip-path="url(#clipPath12734)"><text
transform="matrix(1,0,0,-1,369.77,296.23)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12738"><tspan
x="0 32.040001"
id="path94" /><path
d="m 497.34,319.08 c 0,13.02 10.56,23.58 23.58,23.58 v 0 c 13.02,0 23.58,-10.56 23.58,-23.58 V 218.64 c 0,-13.02 -10.56,-23.58 -23.58,-23.58 v 0 c -13.02,0 -23.58,10.56 -23.58,23.58 z"
style="fill:#b4c7e7;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path96" /><path
d="m 497.34,319.08 c 0,13.02 10.56,23.58 23.58,23.58 v 0 c 13.02,0 23.58,-10.56 23.58,-23.58 V 218.64 c 0,-13.02 -10.56,-23.58 -23.58,-23.58 v 0 c -13.02,0 -23.58,10.56 -23.58,23.58 z"
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path98" /><g
id="g100"><g
id="g102"
clip-path="url(#clipPath106)"><text
transform="matrix(1,0,0,-1,504.84,297.19)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text110"><tspan
x="0"
y="0"
id="tspan108"></tspan></text></g></g><g
id="g112"><g
id="g114"
clip-path="url(#clipPath118)"><text
transform="matrix(1,0,0,-1,504.84,258.79)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text122"><tspan
x="0"
y="0"
id="tspan120"></tspan></text></g></g><g
id="g124"><g
id="g126"
clip-path="url(#clipPath130)"><text
transform="matrix(1,0,0,-1,504.84,220.37)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text134"><tspan
x="0"
y="0"
id="tspan132"></tspan></text></g></g><path
d="m 613.14,319.08 c 0,13.02 10.56,23.58 23.58,23.58 v 0 c 13.02,0 23.58,-10.56 23.58,-23.58 V 218.64 c 0,-13.02 -10.56,-23.58 -23.58,-23.58 v 0 c -13.02,0 -23.58,10.56 -23.58,23.58 z"
style="fill:#b4c7e7;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path136" /><path
d="m 613.14,319.08 c 0,13.02 10.56,23.58 23.58,23.58 v 0 c 13.02,0 23.58,-10.56 23.58,-23.58 V 218.64 c 0,-13.02 -10.56,-23.58 -23.58,-23.58 v 0 c -13.02,0 -23.58,10.56 -23.58,23.58 z"
style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path138" /><g
id="g140"><g
id="g142"
clip-path="url(#clipPath146)"><text
transform="matrix(1,0,0,-1,620.76,277.94)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text150"><tspan
x="0"
y="0"
id="tspan148"></tspan></text></g></g><g
id="g152"><g
id="g154"
clip-path="url(#clipPath158)"><text
transform="matrix(1,0,0,-1,620.76,239.52)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text162"><tspan
x="0"
y="0"
id="tspan160"></tspan></text></g></g><g
id="g164"><g
id="g166"
clip-path="url(#clipPath170)"><text
transform="matrix(1,0,0,-1,125.09,342.77)"
style="font-variant:normal;font-weight:normal;font-size:20.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text174"><tspan
x="0 20.040001 40.080002 60.119999"
y="0"
sodipodi:role="line"
id="tspan12736">静态</tspan></text></g></g><g
id="g12740"><g
id="g12742"
clip-path="url(#clipPath12746)"><text
transform="matrix(1,0,0,-1,369.77,257.81)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12750"><tspan
x="0 32.040001"
y="0"
sodipodi:role="line"
id="tspan12748">计算</tspan></text></g></g><g
id="g12752"><g
id="g12754"
clip-path="url(#clipPath12758)"><text
transform="matrix(1,0,0,-1,385.85,219.41)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12762"><tspan
x="0"
y="0"
id="tspan12760"></tspan></text></g></g><path
d="m 469.44,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path12764" /><path
d="m 469.44,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12766" /><path
d="m 558.06,301.26 c 0,24.26 19.66,43.92 43.92,43.92 v 0 c 24.26,0 43.92,-19.66 43.92,-43.92 V 241.5 c 0,-24.26 -19.66,-43.92 -43.92,-43.92 v 0 c -24.26,0 -43.92,19.66 -43.92,43.92 z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12768" /><g
id="g12770"><g
id="g12772"
clip-path="url(#clipPath12776)"><text
transform="matrix(1,0,0,-1,585.91,297.02)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12780"><tspan
x="0"
y="0"
id="tspan12778"></tspan></text></g></g><g
id="g12782"><g
id="g12784"
clip-path="url(#clipPath12788)"><text
transform="matrix(1,0,0,-1,585.91,258.62)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12792"><tspan
x="0"
y="0"
id="tspan12790"></tspan></text></g></g><g
id="g12794"><g
id="g12796"
clip-path="url(#clipPath12800)"><text
transform="matrix(1,0,0,-1,585.91,220.22)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12804"><tspan
x="0"
y="0"
id="tspan12802"></tspan></text></g></g><path
d="m 671.16,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path12806" /><path
d="m 671.16,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12808" /><path
d="m 756.42,300.42 c 0,24.26 19.66,43.92 43.92,43.92 v 0 c 24.26,0 43.92,-19.66 43.92,-43.92 v -59.76 c 0,-24.26 -19.66,-43.92 -43.92,-43.92 v 0 c -24.26,0 -43.92,19.66 -43.92,43.92 z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12810" /><g
id="g12812"><g
id="g12814"
clip-path="url(#clipPath12818)"><text
transform="matrix(1,0,0,-1,784.3,276.84)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12822"><tspan
x="0"
y="0"
id="tspan12820"></tspan></text></g></g><g
id="g12824"><g
id="g12826"
clip-path="url(#clipPath12830)"><text
transform="matrix(1,0,0,-1,784.3,238.42)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12834"><tspan
x="0"
y="0"
id="tspan12832"></tspan></text></g></g><g
id="g12836"><g
id="g12838"
clip-path="url(#clipPath12842)"><text
transform="matrix(1,0,0,-1,95.976,336.1)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12846"><tspan
x="0 32.040001 64.080002 96.120003"
y="0"
sodipodi:role="line"
id="tspan12844">前端定义</tspan></text></g></g><g
id="g12850"><path
id="tspan172">前端定义</tspan></text></g></g><path
d="m 328.5,351.3 h 146.76 v 45.96 H 328.5 Z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path176" /><g
id="g178"><path
d="m 328.5,351.3 h 146.76 v 45.96 H 328.5 Z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
id="path12852" /></g><g
id="g12854"><g
id="g12856"
clip-path="url(#clipPath12860)"><text
transform="matrix(1,0,0,-1,341.71,367.08)"
style="font-variant:normal;font-weight:normal;font-size:20.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12864"><tspan
style="fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
id="path180" /></g><g
id="g182"><g
id="g184"
clip-path="url(#clipPath188)"><text
transform="matrix(1,0,0,-1,341.71,367.68)"
style="font-variant:normal;font-weight:normal;font-size:20.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text192"><tspan
x="0 20.040001 40.080002 60.119999 80.160004 100.2"
y="0"
sodipodi:role="line"
id="tspan12862">特殊数据结构</tspan></text></g></g><g
id="g12866"><g
id="g12868"
clip-path="url(#clipPath12872)"><text
transform="matrix(1,0,0,-1,287.3,233.18)"
style="font-variant:normal;font-weight:normal;font-size:20.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12876"><tspan
id="tspan190">特殊数据结构</tspan></text></g></g><g
id="g194"><g
id="g196"
clip-path="url(#clipPath200)"><text
transform="matrix(1,0,0,-1,299.78,233.78)"
style="font-variant:normal;font-weight:normal;font-size:20.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text204"><tspan
x="0 20.063999"
y="0"
sodipodi:role="line"
id="tspan202">重构</tspan></text></g></g><g
id="g206"><g
id="g208"
clip-path="url(#clipPath212)"><text
transform="matrix(1,0,0,-1,300.79,285.12)"
style="font-variant:normal;font-weight:normal;font-size:20.04px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text216"><tspan
x="0 20.040001"
y="0"
sodipodi:role="line"
id="tspan12874">重构</tspan></text></g></g><g
id="g12878"><g
id="g12880"
clip-path="url(#clipPath12884)"><text
transform="matrix(1,0,0,-1,287.3,284.52)"
style="font-variant:normal;font-weight:normal;font-size:20.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12888"><tspan
x="0 20.040001"
id="tspan214">分析</tspan></text></g></g><path
d="m 367.56,342.04 c 0,2.23 1.81,4.04 4.04,4.04 h 63.8 c 2.23,0 4.04,-1.81 4.04,-4.04 V 195.8 c 0,-2.23 -1.81,-4.04 -4.04,-4.04 h -63.8 c -2.23,0 -4.04,1.81 -4.04,4.04 z"
style="fill:#b3e0b4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path218" /><path
d="m 367.56,342.04 c 0,2.23 1.81,4.04 4.04,4.04 h 63.8 c 2.23,0 4.04,-1.81 4.04,-4.04 V 195.8 c 0,-2.23 -1.81,-4.04 -4.04,-4.04 h -63.8 c -2.23,0 -4.04,1.81 -4.04,4.04 z"
style="fill:none;stroke:#404040;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path220" /><g
id="g222"><g
id="g224"
clip-path="url(#clipPath228)"><text
transform="matrix(1,0,0,-1,379.44,289.63)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text232"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan12886">分析</tspan></text></g></g></g></svg>
id="tspan230">静态</tspan></text></g></g><g
id="g234"><g
id="g236"
clip-path="url(#clipPath240)"><text
transform="matrix(1,0,0,-1,379.44,260.83)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text244"><tspan
x="0 24"
y="0"
sodipodi:role="line"
id="tspan242">计算</tspan></text></g></g><g
id="g246"><g
id="g248"
clip-path="url(#clipPath252)"><text
transform="matrix(1,0,0,-1,391.44,232.01)"
style="font-variant:normal;font-weight:normal;font-size:24px;font-family:DengXian;-inkscape-font-specification:DengXian;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text256"><tspan
x="0"
y="0"
id="tspan254"></tspan></text></g></g><g
id="g258"><path
d="m 61.32,321 c 0,3.64 2.956,6.6 6.601,6.6 H 267.84 c 3.64,0 6.6,-2.96 6.6,-6.6 V 216.84 c 0,-3.64 -2.96,-6.6 -6.6,-6.6 H 67.921 c -3.645,0 -6.601,2.96 -6.601,6.6 z"
style="fill:none;stroke:#4472c4;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:3, 1;stroke-dashoffset:0;stroke-opacity:1"
id="path260" /></g><path
d="m 274.5,269.61 h 88.06 v -1.5 H 274.5 Z m 87.06,2.25 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path262" /><path
d="m 439.5,269.61 h 49.02 v -1.5 H 439.5 Z m 48.02,2.25 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path264" /><path
d="m 548.34,268.09 50.19,0.13 v 1.5 l -50.19,-0.13 z m 49.2,-2.13 5.99,3.02 -6.01,2.98 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path266" /></g></svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

342
img/ch03/static1.svg Normal file
View File

@@ -0,0 +1,342 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg12628"
xml:space="preserve"
width="1044.8153"
height="270.35999"
viewBox="0 0 1044.8153 270.35999"
sodipodi:docname="static.svg"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs12632"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12642"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path12640" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12654"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12652" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12668"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12666" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12682"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12680" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12698"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12696" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12714"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12712" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12734"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12732" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12746"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12744" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12758"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12756" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12776"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12774" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12788"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12786" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12800"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12798" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12818"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12816" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12830"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12828" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12842"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12840" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12860"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12858" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12872"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12870" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath12884"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path12882" /></clipPath></defs><sodipodi:namedview
id="namedview12630"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.321875"
inkscape:cx="556.78487"
inkscape:cy="170.59102"
inkscape:window-width="2560"
inkscape:window-height="1361"
inkscape:window-x="-9"
inkscape:window-y="-9"
inkscape:window-maximized="1"
inkscape:current-layer="g12634" /><g
id="g12634"
inkscape:groupmode="layer"
inkscape:label="static"
transform="matrix(1.3333333,0,0,-1.3333333,-82.864623,530.67999)"><path
d="m 76.977,299.76 44.523,-20.85 -0.96,-2.03 -44.517,20.84 z m 44.453,-18.33 4.69,-5.92 -7.55,-0.19 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path12646" /><g
id="g12648"><g
id="g12650"
clip-path="url(#clipPath12654)"><text
transform="matrix(1,0,0,-1,159.26,278.26)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:20.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12658"><tspan
x="0"
y="0"
id="tspan12656">Y</tspan></text></g></g><path
d="m 81.578,233.01 34.612,23.81 -1.28,1.86 -34.608,-23.81 z m 34.952,21.32 3.65,6.61 -7.47,-1.05 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path12660" /><g
id="g12662"><g
id="g12664"
clip-path="url(#clipPath12668)"><text
transform="matrix(1,0,0,-1,63.168,292.25)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12672"><tspan
x="0"
y="0"
id="tspan12670">W</tspan></text></g></g><path
d="m 151.26,269.99 27.18,-0.01 v -2.24 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path12674" /><g
id="g12676"><g
id="g12678"
clip-path="url(#clipPath12682)"><text
transform="matrix(1,0,0,-1,63.168,227.47)"
style="font-style:italic;font-variant:normal;font-weight:bold;font-size:18px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPS-BoldItalicMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12686"><tspan
x="0"
y="0"
id="tspan12684">A</tspan></text></g></g><path
d="m 125.1,268.86 c 0,7.09 5.86,12.84 13.08,12.84 7.22,0 13.08,-5.75 13.08,-12.84 0,-7.09 -5.86,-12.84 -13.08,-12.84 -7.22,0 -13.08,5.75 -13.08,12.84 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12690" /><g
id="g12692"
transform="translate(-1.1347518,-4.5390076)"><g
id="g12694"
clip-path="url(#clipPath12698)"><text
transform="matrix(1,0,0,-1,130.13,257.09)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12702"><tspan
x="0"
y="0"
id="tspan12700">*</tspan></text></g></g><path
d="m 183.3,269.7 c 0,11.07 8.97,20.04 20.04,20.04 11.07,0 20.04,-8.97 20.04,-20.04 0,-11.07 -8.97,-20.04 -20.04,-20.04 -11.07,0 -20.04,8.97 -20.04,20.04 z"
style="fill:none;stroke:#000000;stroke-width:2.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12706" /><g
id="g12708"><g
id="g12710"
clip-path="url(#clipPath12714)"><text
transform="matrix(1,0,0,-1,187.1,264.62)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'Times New Roman';-inkscape-font-specification:TimesNewRomanPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12718"><tspan
x="0 9.3646803 15.59844 24.12072"
y="0"
sodipodi:role="line"
id="tspan12716">ReLU</tspan></text></g></g><path
d="m 223.38,269.99 27.18,-0.01 v -2.24 h -27.18 z m 26.05,2.25 6.75,-3.38 -6.75,-3.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path12720" /><path
d="m 278.16,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path12722" /><path
d="m 278.16,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12724" /><path
d="m 357.9,196.74 h 87.84 v 147.6 H 357.9 Z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12726" /><g
id="g12728"><g
id="g12730"
clip-path="url(#clipPath12734)"><text
transform="matrix(1,0,0,-1,369.77,296.23)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12738"><tspan
x="0 32.040001"
y="0"
sodipodi:role="line"
id="tspan12736">静态</tspan></text></g></g><g
id="g12740"><g
id="g12742"
clip-path="url(#clipPath12746)"><text
transform="matrix(1,0,0,-1,369.77,257.81)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12750"><tspan
x="0 32.040001"
y="0"
sodipodi:role="line"
id="tspan12748">计算</tspan></text></g></g><g
id="g12752"><g
id="g12754"
clip-path="url(#clipPath12758)"><text
transform="matrix(1,0,0,-1,385.85,219.41)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12762"><tspan
x="0"
y="0"
id="tspan12760"></tspan></text></g></g><path
d="m 469.44,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path12764" /><path
d="m 469.44,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12766" /><path
d="m 558.06,301.26 c 0,24.26 19.66,43.92 43.92,43.92 v 0 c 24.26,0 43.92,-19.66 43.92,-43.92 V 241.5 c 0,-24.26 -19.66,-43.92 -43.92,-43.92 v 0 c -24.26,0 -43.92,19.66 -43.92,43.92 z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12768" /><g
id="g12770"><g
id="g12772"
clip-path="url(#clipPath12776)"><text
transform="matrix(1,0,0,-1,585.91,297.02)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12780"><tspan
x="0"
y="0"
id="tspan12778"></tspan></text></g></g><g
id="g12782"><g
id="g12784"
clip-path="url(#clipPath12788)"><text
transform="matrix(1,0,0,-1,585.91,258.62)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12792"><tspan
x="0"
y="0"
id="tspan12790"></tspan></text></g></g><g
id="g12794"><g
id="g12796"
clip-path="url(#clipPath12800)"><text
transform="matrix(1,0,0,-1,585.91,220.22)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12804"><tspan
x="0"
y="0"
id="tspan12802"></tspan></text></g></g><path
d="m 671.16,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:#4472c4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path12806" /><path
d="m 671.16,273.78 h 55.08 v 4.86 l 9.72,-9.72 -9.72,-9.72 v 4.86 h -55.08 z"
style="fill:none;stroke:#2f528f;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12808" /><path
d="m 756.42,300.42 c 0,24.26 19.66,43.92 43.92,43.92 v 0 c 24.26,0 43.92,-19.66 43.92,-43.92 v -59.76 c 0,-24.26 -19.66,-43.92 -43.92,-43.92 v 0 c -24.26,0 -43.92,19.66 -43.92,43.92 z"
style="fill:none;stroke:#2f528f;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path12810" /><g
id="g12812"><g
id="g12814"
clip-path="url(#clipPath12818)"><text
transform="matrix(1,0,0,-1,784.3,276.84)"
style="font-variant:normal;font-weight:normal;font-size:32.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12822"><tspan
x="0"
y="0"
id="tspan12820"></tspan></text></g></g><g
id="g12824"><g
id="g12826"
clip-path="url(#clipPath12830)"><text
transform="matrix(1,0,0,-1,784.3,238.42)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12834"><tspan
x="0"
y="0"
id="tspan12832"></tspan></text></g></g><g
id="g12836"><g
id="g12838"
clip-path="url(#clipPath12842)"><text
transform="matrix(1,0,0,-1,95.976,336.1)"
style="font-variant:normal;font-weight:normal;font-size:32.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12846"><tspan
x="0 32.040001 64.080002 96.120003"
y="0"
sodipodi:role="line"
id="tspan12844">前端定义</tspan></text></g></g><g
id="g12850"><path
d="m 328.5,351.3 h 146.76 v 45.96 H 328.5 Z"
style="fill:none;stroke:#2f528f;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1"
id="path12852" /></g><g
id="g12854"><g
id="g12856"
clip-path="url(#clipPath12860)"><text
transform="matrix(1,0,0,-1,341.71,367.08)"
style="font-variant:normal;font-weight:normal;font-size:20.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12864"><tspan
x="0 20.040001 40.080002 60.119999 80.160004 100.2"
y="0"
sodipodi:role="line"
id="tspan12862">特殊数据结构</tspan></text></g></g><g
id="g12866"><g
id="g12868"
clip-path="url(#clipPath12872)"><text
transform="matrix(1,0,0,-1,287.3,233.18)"
style="font-variant:normal;font-weight:normal;font-size:20.064px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12876"><tspan
x="0 20.040001"
y="0"
sodipodi:role="line"
id="tspan12874">重构</tspan></text></g></g><g
id="g12878"><g
id="g12880"
clip-path="url(#clipPath12884)"><text
transform="matrix(1,0,0,-1,287.3,284.52)"
style="font-variant:normal;font-weight:normal;font-size:20.04px;font-family:'Microsoft YaHei';-inkscape-font-specification:MicrosoftYaHei;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text12888"><tspan
x="0 20.040001"
y="0"
sodipodi:role="line"
id="tspan12886">分析</tspan></text></g></g></g></svg>

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -1,321 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg765"
xml:space="preserve"
width="573.44"
height="259.83206"
viewBox="0 0 573.44 259.83206"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs769"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath779"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path777" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath793"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path791" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath805"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path803" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath821"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path819" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath837"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path835" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath853"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path851" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath869"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path867" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath885"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path883" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath897"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path895" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath913"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path911" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath929"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path927" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath941"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path939" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath957"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path955" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath969"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path967" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath981"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path979" /></clipPath></defs><g
id="g771"
transform="matrix(1.3333333,0,0,-1.3333333,-279.35999,533.43999)"><g
id="g773"><g
id="g775"
clip-path="url(#clipPath779)" /></g><path
d="m 249.72,333.76 c 0,8.59 6.97,15.56 15.56,15.56 h 62.24 c 8.59,0 15.56,-6.97 15.56,-15.56 V 271.4 c 0,-8.59 -6.97,-15.56 -15.56,-15.56 h -62.24 c -8.59,0 -15.56,6.97 -15.56,15.56 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path783" /><path
d="m 249.72,333.76 c 0,8.59 6.97,15.56 15.56,15.56 h 62.24 c 8.59,0 15.56,-6.97 15.56,-15.56 V 271.4 c 0,-8.59 -6.97,-15.56 -15.56,-15.56 h -62.24 c -8.59,0 -15.56,6.97 -15.56,15.56 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path785" /><g
id="g787"><g
id="g789"
clip-path="url(#clipPath793)"><text
transform="matrix(1,0,0,-1,268.61,305.66)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text797"><tspan
x="0 4.8000002 10.776 17.148001 21.84 28.164 32.375999 37.883999 40.644001 47.004002"
y="0"
id="tspan795">TensorFlow</tspan></text></g></g><g
id="g799"><g
id="g801"
clip-path="url(#clipPath805)"><text
transform="matrix(1,0,0,-1,281.45,291.26)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text809"><tspan
x="0 7.5871439 11.518992 17.278488 23.627159"
y="0"
id="tspan807">Graph</tspan></text></g></g><path
d="m 419.04,377.82 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path811" /><path
d="m 419.04,377.82 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path813" /><g
id="g815"><g
id="g817"
clip-path="url(#clipPath821)"><text
transform="matrix(1,0,0,-1,436.1,365.93)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text825"><tspan
x="0 6.2280002 11.268 18.216 20.988001 28.427999 33.228001"
y="0"
id="tspan823">XLA HLO</tspan></text></g></g><path
d="m 419.04,344.1 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path827" /><path
d="m 419.04,344.1 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path829" /><g
id="g831"><g
id="g833"
clip-path="url(#clipPath837)"><text
transform="matrix(1,0,0,-1,433.1,332.18)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text841"><tspan
x="0 4.8000002 10.776 17.148001 21.84 28.164 32.375999 35.015999 41.375999"
y="0"
id="tspan839">Tensor RT</tspan></text></g></g><path
d="m 419.64,310.38 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path843" /><path
d="m 419.64,310.38 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path845" /><g
id="g847"><g
id="g849"
clip-path="url(#clipPath853)"><text
transform="matrix(1,0,0,-1,439.15,298.46)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text857"><tspan
x="0 6.348 13.92 17.868 23.615999 29.976"
y="0"
id="tspan855">nGraph</tspan></text></g></g><path
d="m 419.64,276.66 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:#bfbfbf;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path859" /><path
d="m 419.64,276.66 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path861" /><g
id="g863"><g
id="g865"
clip-path="url(#clipPath869)"><text
transform="matrix(1,0,0,-1,436.99,264.72)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text873"><tspan
x="0 6.3600001 12.684 16.799999 22.775999 25.440001 35.748001"
y="0"
id="tspan871">Core ML</tspan></text></g></g><path
d="m 407.04,242.94 c 0,2.15 1.75,3.9 3.9,3.9 h 92.76 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -92.76 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path875" /><path
d="m 407.04,242.94 c 0,2.15 1.75,3.9 3.9,3.9 h 92.76 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -92.76 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path877" /><g
id="g879"><g
id="g881"
clip-path="url(#clipPath885)"><text
transform="matrix(1,0,0,-1,419.33,230.98)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text889"><tspan
x="0 4.8000002 10.776 17.148001 21.84 28.164 32.375999 37.883999 40.644001 47.004002"
y="0"
id="tspan887">TensorFlow</tspan></text></g></g><g
id="g891"><g
id="g893"
clip-path="url(#clipPath897)"><text
transform="matrix(1,0,0,-1,477.65,230.98)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text901"><tspan
x="0 5.04 7.8000002 11.76"
y="0"
id="tspan899">Lite</tspan></text></g></g><path
d="m 563.88,395.7 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:#94c57e;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path903" /><path
d="m 563.88,395.7 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path905" /><g
id="g907"><g
id="g909"
clip-path="url(#clipPath913)"><text
transform="matrix(1,0,0,-1,582.36,383.78)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text917"><tspan
x="0 5.0500798 9.2344322 16.05204 26.380655 28.905697 31.935743"
y="0"
id="tspan915">LLVM IR</tspan></text></g></g><path
d="m 563.88,364.52 c 0,2.14 1.74,3.88 3.88,3.88 h 67.48 c 2.14,0 3.88,-1.74 3.88,-3.88 V 349 c 0,-2.14 -1.74,-3.88 -3.88,-3.88 h -67.48 c -2.14,0 -3.88,1.74 -3.88,3.88 z"
style="fill:#94c57e;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path919" /><path
d="m 563.88,364.52 c 0,2.14 1.74,3.88 3.88,3.88 h 67.48 c 2.14,0 3.88,-1.74 3.88,-3.88 V 349 c 0,-2.14 -1.74,-3.88 -3.88,-3.88 h -67.48 c -2.14,0 -3.88,1.74 -3.88,3.88 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path921" /><g
id="g923"><g
id="g925"
clip-path="url(#clipPath929)"><text
transform="matrix(1,0,0,-1,585.48,352.63)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text933"><tspan
x="0 5.8439999 12.108 19.812 22.656 25.68"
y="0"
id="tspan931">TPU IR</tspan></text></g></g><g
id="g935"><g
id="g937"
clip-path="url(#clipPath941)"><text
transform="matrix(1,0,0,-1,566.95,325.94)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text945"><tspan
x="0 5.5079999 11.508 16.788 22.764 26.747999 32.495998 35.256001 37.787998 44.112 48.216 54.563999 60.540001 64.524002"
y="0"
id="tspan943">Several others</tspan></text></g></g><path
d="m 563.88,247.5 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:#bfbfbf;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path947" /><path
d="m 563.88,247.5 c 0,2.15 1.75,3.9 3.9,3.9 h 67.44 c 2.15,0 3.9,-1.75 3.9,-3.9 v -15.6 c 0,-2.15 -1.75,-3.9 -3.9,-3.9 h -67.44 c -2.15,0 -3.9,1.75 -3.9,3.9 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path949" /><g
id="g951"><g
id="g953"
clip-path="url(#clipPath957)"><text
transform="matrix(1,0,0,-1,585.6,235.51)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text961"><tspan
x="0 7.7880001 15.576 22.524 28.764"
y="0"
id="tspan959">NNAPI</tspan></text></g></g><g
id="g963"><g
id="g965"
clip-path="url(#clipPath969)"><text
transform="matrix(1,0,0,-1,575.88,207.62)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text973"><tspan
x="0 10.308 16.056 22.188 27.624001 30.108 36.431999 40.535999 46.883999 52.860001 56.844002"
y="0"
id="tspan971">Many others</tspan></text></g></g><g
id="g975"><g
id="g977"
clip-path="url(#clipPath981)"><text
transform="matrix(1,0,0,-1,278.52,367.87)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text985"><tspan
x="0 7.572 11.52 17.268 23.628 29.976 32.736 38.712002"
y="0"
id="tspan983">Grappler</tspan></text></g></g><path
d="m 344.29,326.84 70.66,40.33 -0.5,0.87 -70.66,-40.34 z m 71.03,37.66 3.72,5.58 -6.7,-0.37 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path987" /><path
d="m 343.22,313.83 71.09,20.65 -0.28,0.96 -71.09,-20.65 z m 70.83,17.97 4.92,4.56 -6.6,1.21 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path989" /><path
d="m 343.08,303.14 h 71.54 v -1 h -71.54 z m 70.54,2.5 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path991" /><path
d="m 342.14,291.36 72.86,-20.69 -0.27,-0.96 -72.87,20.69 z m 72.58,-18.01 4.96,-4.52 -6.6,-1.25 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path993" /><path
d="m 343.37,280.25 59.79,-41.89 -0.57,-0.82 -59.8,41.89 z m 60.41,-39.27 3.19,-5.9 -6.63,0.99 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path995" /><path
d="m 209.52,321.26 h 35.22 v -1 h -35.22 z m 34.22,2.5 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path997" /><path
d="m 209.52,303.14 h 35.22 v -1 h -35.22 z m 34.22,2.5 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path999" /><path
d="m 209.52,285.62 h 35.22 v -1 h -35.22 z m 34.22,2.5 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1001" /><path
d="m 306.81,349.92 -2.67,2.43 h 1.22 c -0.85,4.29 -3.8,7.29 -7.18,7.29 h 2.43 c 3.38,0 6.33,-3 7.18,-7.29 H 309 Z"
style="fill:#5b9bd5;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path1003" /><path
d="m 299.39,359.51 c -3.58,-0.78 -6.2,-4.84 -6.2,-9.59 h -2.43 c 0,5.37 3.32,9.72 7.42,9.72 0.4,0 0.81,-0.04 1.21,-0.13 z"
style="fill:#497dab;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path1005" /><path
d="m 299.39,359.51 c -3.58,-0.78 -6.2,-4.84 -6.2,-9.59 h -2.43 c 0,5.37 3.32,9.72 7.42,9.72 h 2.43 c 3.38,0 6.33,-3 7.18,-7.29 H 309 l -2.19,-2.43 -2.67,2.43 h 1.22 c -0.85,4.29 -3.8,7.29 -7.18,7.29"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path1007" /><path
d="m 494.4,369.52 64.73,16.59 -0.25,0.97 -64.72,-16.59 z m 64.38,13.92 5.07,4.4 -6.56,1.42 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1009" /><path
d="m 494.37,370.57 64.66,-12.36 -0.19,-0.98 -64.65,12.36 z m 64.15,-9.71 5.33,-4.08 -6.46,-1.82 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1011" /><path
d="m 494.51,370.52 65.14,-34.16 -0.46,-0.89 -65.14,34.17 z m 65.42,-31.48 3.92,-5.45 -6.71,0.13 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1013" /><path
d="m 507.64,234.6 51.29,4.14 -0.08,1 -51.29,-4.14 z m 50.49,1.57 5.74,3.47 -6.22,2.51 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1015" /><path
d="m 507.79,235.54 51.65,-21.43 -0.38,-0.93 -51.65,21.44 z m 51.69,-18.74 4.39,-5.07 -6.69,-0.47 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1017" /></g></svg>

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -1,380 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg25"
xml:space="preserve"
width="902.39996"
height="387.03998"
viewBox="0 0 902.39996 387.03998"
sodipodi:docname="MindIR.svg"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs29"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath39"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path37" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath53"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path51" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath69"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path67" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath85"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path83" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath101"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path99" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath117"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path115" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath133"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path131" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath149"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path147" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath165"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path163" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath181"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path179" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath197"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path195" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath213"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path211" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath229"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path227" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath245"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path243" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath261"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path259" /></clipPath></defs><sodipodi:namedview
id="namedview27"
pagecolor="#ffffff"
bordercolor="#cccccc"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="1"
inkscape:pagecheckerboard="0"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.8375"
inkscape:cx="458.50746"
inkscape:cy="275.8209"
inkscape:window-width="1792"
inkscape:window-height="1120"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="g31" /><g
id="g31"
inkscape:groupmode="layer"
inkscape:label="9"
transform="matrix(1.3333333,0,0,-1.3333333,-181.92,635.83998)"><path
d="m 422.16,472.08 c 0,2.39 1.93,4.32 4.32,4.32 h 66.6 c 2.39,0 4.32,-1.93 4.32,-4.32 V 454.8 c 0,-2.39 -1.93,-4.32 -4.32,-4.32 h -66.6 c -2.39,0 -4.32,1.93 -4.32,4.32 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path43" /><path
d="m 422.16,472.08 c 0,2.39 1.93,4.32 4.32,4.32 h 66.6 c 2.39,0 4.32,-1.93 4.32,-4.32 V 454.8 c 0,-2.39 -1.93,-4.32 -4.32,-4.32 h -66.6 c -2.39,0 -4.32,1.93 -4.32,4.32 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path45" /><g
id="g47"><g
id="g49"
clip-path="url(#clipPath53)"><text
transform="matrix(1,0,0,-1,437.98,459.36)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text57"><tspan
x="0 6.948 13.2 16.908001 24.695999 31.02 37.403999"
y="0"
sodipodi:role="line"
id="tspan55">AnfNode</tspan></text></g></g><path
d="m 323.16,386.74 c 0,2.6 2.1,4.7 4.7,4.7 h 65.84 c 2.6,0 4.7,-2.1 4.7,-4.7 v -18.8 c 0,-2.6 -2.1,-4.7 -4.7,-4.7 h -65.84 c -2.6,0 -4.7,2.1 -4.7,4.7 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path59" /><path
d="m 323.16,386.74 c 0,2.6 2.1,4.7 4.7,4.7 h 65.84 c 2.6,0 4.7,-2.1 4.7,-4.7 v -18.8 c 0,-2.6 -2.1,-4.7 -4.7,-4.7 h -65.84 c -2.6,0 -4.7,2.1 -4.7,4.7 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path61" /><g
id="g63"><g
id="g65"
clip-path="url(#clipPath69)"><text
transform="matrix(1,0,0,-1,344.09,373.22)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text73"><tspan
x="0 6.9720001 14.784 21.156 27.528"
y="0"
sodipodi:role="line"
id="tspan71">ANode</tspan></text></g></g><path
d="m 512.28,386.68 c 0,2.63 2.13,4.76 4.76,4.76 h 65.72 c 2.63,0 4.76,-2.13 4.76,-4.76 v -19.04 c 0,-2.63 -2.13,-4.76 -4.76,-4.76 h -65.72 c -2.63,0 -4.76,2.13 -4.76,4.76 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path75" /><path
d="m 512.28,386.68 c 0,2.63 2.13,4.76 4.76,4.76 h 65.72 c 2.63,0 4.76,-2.13 4.76,-4.76 v -19.04 c 0,-2.63 -2.13,-4.76 -4.76,-4.76 h -65.72 c -2.63,0 -4.76,2.13 -4.76,4.76 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path77" /><g
id="g79"><g
id="g81"
clip-path="url(#clipPath85)"><text
transform="matrix(1,0,0,-1,533.45,373.08)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text89"><tspan
x="0 6.3606958 14.1282 20.512943 26.861616"
y="0"
sodipodi:role="line"
id="tspan87">CNode</tspan></text></g></g><path
d="m 136.92,302.44 c 0,2.56 2.08,4.64 4.64,4.64 h 86 c 2.56,0 4.64,-2.08 4.64,-4.64 v -18.56 c 0,-2.56 -2.08,-4.64 -4.64,-4.64 h -86 c -2.56,0 -4.64,2.08 -4.64,4.64 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path91" /><path
d="m 136.92,302.44 c 0,2.56 2.08,4.64 4.64,4.64 h 86 c 2.56,0 4.64,-2.08 4.64,-4.64 v -18.56 c 0,-2.56 -2.08,-4.64 -4.64,-4.64 h -86 c -2.56,0 -4.64,2.08 -4.64,4.64 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path93" /><g
id="g95"><g
id="g97"
clip-path="url(#clipPath101)"><text
transform="matrix(1,0,0,-1,145.75,289.06)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text105"><tspan
x="0 6 11.748 15.72 21.468 31.056 36.959999 40.919998 46.896 51.108002 58.896 65.220001 71.603996"
y="0"
sodipodi:role="line"
id="tspan103">ParameterNode</tspan></text></g></g><path
d="m 422.16,302.66 c 0,2.44 1.98,4.42 4.42,4.42 h 66.4 c 2.44,0 4.42,-1.98 4.42,-4.42 v -17.68 c 0,-2.44 -1.98,-4.42 -4.42,-4.42 h -66.4 c -2.44,0 -4.42,1.98 -4.42,4.42 z"
style="fill:#a5c3f4;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path107" /><path
d="m 422.16,302.66 c 0,2.44 1.98,4.42 4.42,4.42 h 66.4 c 2.44,0 4.42,-1.98 4.42,-4.42 v -17.68 c 0,-2.44 -1.98,-4.42 -4.42,-4.42 h -66.4 c -2.44,0 -4.42,1.98 -4.42,4.42 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path109" /><g
id="g111"><g
id="g113"
clip-path="url(#clipPath117)"><text
transform="matrix(1,0,0,-1,433.01,289.7)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text121"><tspan
x="0 6.1199999 11.868 14.628 20.988001 26.964001 34.776001 41.099998 47.484001"
y="0"
sodipodi:role="line"
id="tspan119">ValueNode</tspan></text></g></g><path
d="m 136.92,187.08 h 95.28 v 22.08 h -95.28 z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path123" /><path
d="m 136.92,187.08 h 95.28 v 22.08 h -95.28 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path125" /><g
id="g127"><g
id="g129"
clip-path="url(#clipPath133)"><text
transform="matrix(1,0,0,-1,159,193.99)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text137"><tspan
x="0 6 11.748 15.72 21.468 31.056 36.959999 40.919998 46.896"
y="0"
sodipodi:role="line"
id="tspan135">Parameter</tspan></text></g></g><path
d="m 269.64,187.68 h 54.24 v 21.96 h -54.24 z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path139" /><path
d="m 269.64,187.68 h 54.24 v 21.96 h -54.24 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path141" /><g
id="g143"><g
id="g145"
clip-path="url(#clipPath149)"><text
transform="matrix(1,0,0,-1,282.31,194.5)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text153"><tspan
x="0 5.5190158 10.436832 16.196327 18.961847 24.721344"
y="0"
sodipodi:role="line"
id="tspan151">Scalar</tspan></text></g></g><path
d="m 330.36,187.68 h 54.12 v 21.96 h -54.12 z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path155" /><path
d="m 330.36,187.68 h 54.12 v 21.96 h -54.12 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path157" /><g
id="g159"><g
id="g161"
clip-path="url(#clipPath165)"><text
transform="matrix(1,0,0,-1,339.62,194.5)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text169"><tspan
x="0 7.7675042 13.527 23.134176 29.146175"
y="0"
sodipodi:role="line"
id="tspan167">Named</tspan></text></g></g><path
d="m 390.96,187.08 h 54.12 v 23.04 h -54.12 z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path171" /><path
d="m 390.96,187.08 h 54.12 v 23.04 h -54.12 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path173" /><g
id="g175"><g
id="g177"
clip-path="url(#clipPath181)"><text
transform="matrix(1,0,0,-1,401.83,194.5)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text185"><tspan
x="0 4.797576 10.785528 17.146223 21.847609 28.184256"
y="0"
sodipodi:role="line"
id="tspan183">Tensor</tspan></text></g></g><path
d="m 451.68,187.8 h 54.12 v 23.04 h -54.12 z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path187" /><path
d="m 451.68,187.8 h 54.12 v 23.04 h -54.12 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path189" /><g
id="g191"><g
id="g193"
clip-path="url(#clipPath197)"><text
transform="matrix(1,0,0,-1,467.18,195.14)"
style="font-variant:normal;font-weight:normal;font-size:12.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text201"><tspan
x="0 5.2785358 10.677312 17.025984"
y="0"
sodipodi:role="line"
id="tspan199">Type</tspan></text></g></g><path
d="m 512.28,188.16 h 54.12 v 22.92 h -54.12 z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path203" /><path
d="m 512.28,188.16 h 54.12 v 22.92 h -54.12 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path205" /><g
id="g207"><g
id="g209"
clip-path="url(#clipPath213)"><text
transform="matrix(1,0,0,-1,524.35,195.46)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text217"><tspan
x="0 5.5079999 11.868 17.615999 23.976"
y="0"
sodipodi:role="line"
id="tspan215">Shape</tspan></text></g></g><path
d="m 572.88,188.16 h 60.84 v 22.92 h -60.84 z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path219" /><path
d="m 572.88,188.16 h 60.84 v 22.92 h -60.84 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path221" /><g
id="g223"><g
id="g225"
clip-path="url(#clipPath229)"><text
transform="matrix(1,0,0,-1,581.52,195.46)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text233"><tspan
x="0 6.204 10.428 13.188 22.775999 25.535999 29.615999 32.375999 37.655998"
y="0"
sodipodi:role="line"
id="tspan231">Primitive</tspan></text></g></g><path
d="m 640.2,188.16 h 94.08 v 22.92 H 640.2 Z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path235" /><path
d="m 640.2,188.16 h 94.08 v 22.92 H 640.2 Z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path237" /><g
id="g239"><g
id="g241"
clip-path="url(#clipPath245)"><text
transform="matrix(1,0,0,-1,647.74,195.46)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text249"><tspan
x="0 10.308 16.188 20.148001 25.896 31.403999 37.776001 44.124001 49.164001 56.736 60.683998 66.431999 72.683998"
y="0"
sodipodi:role="line"
id="tspan247">MetaFuncGraph</tspan></text></g></g><path
d="m 740.76,188.16 h 72 v 22.92 h -72 z"
style="fill:#7cc2f2;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path251" /><path
d="m 740.76,188.16 h 72 v 22.92 h -72 z"
style="fill:none;stroke:#41719c;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path253" /><g
id="g255"><g
id="g257"
clip-path="url(#clipPath261)"><text
transform="matrix(1,0,0,-1,750.12,195.46)"
style="font-variant:normal;font-weight:normal;font-size:12px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text265"><tspan
x="0 5.5079999 11.868 18.216 23.256001 30.827999 34.776001 40.523998 46.883999"
y="0"
sodipodi:role="line"
id="tspan263">FuncGraph</tspan></text></g></g><path
d="m 459.5,450.91 -94.62,-56.47 0.51,-0.85 94.62,56.46 z m -95.04,-53.81 -3.62,-5.65 6.69,0.5 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path267" /><path
d="m 459.99,450.9 85.98,-56.29 -0.54,-0.84 -85.98,56.29 z m 86.52,-53.65 3.37,-5.8 -6.66,0.78 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path269" /><path
d="m 360.68,363.72 -171.51,-54.6 0.31,-0.95 171.5,54.59 z m -171.31,-51.91 -4.81,-4.68 6.63,-1.04 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path271" /><path
d="m 361.09,363.67 94.57,-53.64 -0.5,-0.87 -94.57,53.65 z m 94.93,-50.97 3.74,-5.57 -6.7,0.35 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path273" /><path
d="m 185.06,279.24 v -65.05 h -1 v 65.05 z m 2.5,-64.05 -3,-6 -3,6 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path275" /><path
d="m 459.53,281.02 -158.38,-68.87 0.39,-0.92 158.39,68.87 z m -158.46,-66.18 -4.31,-5.14 6.7,-0.36 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path277" /><path
d="m 459.4,280.97 -98.21,-68.02 0.56,-0.82 98.22,68.02 z m -98.82,-65.39 -3.22,-5.88 6.64,0.95 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path279" /><path
d="m 460.2,280.69 17.66,-64.9 -0.96,-0.27 -17.66,64.91 z m 19.81,-63.28 -1.32,-6.58 -4.47,5 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path281" /><path
d="m 460.05,280.94 75.85,-66.12 -0.66,-0.76 -75.85,66.12 z m 76.73,-63.58 2.56,-6.21 -6.5,1.69 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path283" /><path
d="m 459.94,281.01 139.08,-67.23 -0.43,-0.9 -139.09,67.23 z m 139.27,-64.54 4.09,-5.31 -6.7,-0.09 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path285" /><path
d="m 459.87,281.04 222.71,-67.95 -0.29,-0.95 -222.72,67.94 z m 222.49,-65.26 4.86,-4.62 -6.61,-1.12 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path287" /><path
d="m 459.83,281.05 312.13,-68.34 -0.22,-0.97 -312.13,68.33 z m 311.68,-65.68 5.22,-4.21 -6.5,-1.65 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path289" /><path
d="m 459.32,280.81 -39.12,-66.07 0.86,-0.51 39.12,66.08 z m -40.76,-63.94 -0.48,-6.69 5.64,3.64 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path291" /></g></svg>

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -1,364 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg915"
xml:space="preserve"
width="993.91998"
height="272.47998"
viewBox="0 0 993.91998 272.47998"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs919"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath929"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path927" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath943"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path941" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath955"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path953" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath971"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path969" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath983"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path981" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath999"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path997" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1011"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1009" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1023"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1021" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1039"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1037" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1055"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1053" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1071"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1069" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1087"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1085" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1099"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1097" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1115"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1113" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1127"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1125" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1143"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1141" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1155"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1153" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1167"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1165" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1195"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1193" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath1207"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path1205" /></clipPath></defs><g
id="g921"
transform="matrix(1.3333333,0,0,-1.3333333,-127.84,518.39999)"><path
d="m 96.36,356.4 h 102.96 v 31.92 H 96.36 Z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path933" /><path
d="m 96.36,356.4 h 102.96 v 31.92 H 96.36 Z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path935" /><g
id="g937"><g
id="g939"
clip-path="url(#clipPath943)"><text
transform="matrix(1,0,0,-1,109.3,367.39)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text947"><tspan
x="0 14.04 28.08 42.119999 56.16"
y="0"
id="tspan945">源程序语言</tspan></text></g></g><g
id="g949"><g
id="g951"
clip-path="url(#clipPath955)"><text
transform="matrix(1,0,0,-1,179.52,367.39)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text959"><tspan
x="0"
y="0"
id="tspan957">1</tspan></text></g></g><path
d="m 96.36,283.92 h 102.96 v 31.8 H 96.36 Z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path961" /><path
d="m 96.36,283.92 h 102.96 v 31.8 H 96.36 Z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path963" /><g
id="g965"><g
id="g967"
clip-path="url(#clipPath971)"><text
transform="matrix(1,0,0,-1,109.3,294.86)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text975"><tspan
x="0 14.04 28.08 42.119999 56.16"
y="0"
id="tspan973">源程序语言</tspan></text></g></g><g
id="g977"><g
id="g979"
clip-path="url(#clipPath983)"><text
transform="matrix(1,0,0,-1,179.52,294.86)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text987"><tspan
x="0"
y="0"
id="tspan985">2</tspan></text></g></g><path
d="m 96.36,184.92 h 102.96 v 31.8 H 96.36 Z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path989" /><path
d="m 96.36,184.92 h 102.96 v 31.8 H 96.36 Z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path991" /><g
id="g993"><g
id="g995"
clip-path="url(#clipPath999)"><text
transform="matrix(1,0,0,-1,106.78,195.82)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1003"><tspan
x="0 14.04 28.08 42.119999 56.16"
y="0"
id="tspan1001">源程序语言</tspan></text></g></g><g
id="g1005"><g
id="g1007"
clip-path="url(#clipPath1011)"><text
transform="matrix(1,0,0,-1,176.98,195.82)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1015"><tspan
x="0"
y="0"
id="tspan1013">M</tspan></text></g></g><g
id="g1017"><g
id="g1019"
clip-path="url(#clipPath1023)"><text
transform="matrix(1,0,0,-1,143.04,246.96)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1027"><tspan
x="0"
y="0"
id="tspan1025"></tspan></text></g></g><path
d="m 277.92,252.12 h 96.24 v 31.8 h -96.24 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path1029" /><path
d="m 277.92,252.12 h 96.24 v 31.8 h -96.24 z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path1031" /><g
id="g1033"><g
id="g1035"
clip-path="url(#clipPath1039)"><text
transform="matrix(1,0,0,-1,312.05,263.04)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1043"><tspan
x="0 14.04"
y="0"
id="tspan1041">前端</tspan></text></g></g><path
d="m 417.12,251.16 h 96.24 v 31.8 h -96.24 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path1045" /><path
d="m 417.12,251.16 h 96.24 v 31.8 h -96.24 z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path1047" /><g
id="g1049"><g
id="g1051"
clip-path="url(#clipPath1055)"><text
transform="matrix(1,0,0,-1,444.19,262.08)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1059"><tspan
x="0 14.04 28.08"
y="0"
id="tspan1057">优化器</tspan></text></g></g><path
d="m 557.16,251.16 h 96.24 v 31.8 h -96.24 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path1061" /><path
d="m 557.16,251.16 h 96.24 v 31.8 h -96.24 z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path1063" /><g
id="g1065"><g
id="g1067"
clip-path="url(#clipPath1071)"><text
transform="matrix(1,0,0,-1,591.26,262.08)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1075"><tspan
x="0 14.04"
y="0"
id="tspan1073">后端</tspan></text></g></g><path
d="m 737.88,356.4 h 102.96 v 31.92 H 737.88 Z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path1077" /><path
d="m 737.88,356.4 h 102.96 v 31.92 H 737.88 Z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path1079" /><g
id="g1081"><g
id="g1083"
clip-path="url(#clipPath1087)"><text
transform="matrix(1,0,0,-1,757.78,367.39)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1091"><tspan
x="0 14.04 28.08 42.119999"
y="0"
id="tspan1089">目标机器</tspan></text></g></g><g
id="g1093"><g
id="g1095"
clip-path="url(#clipPath1099)"><text
transform="matrix(1,0,0,-1,813.94,367.39)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1103"><tspan
x="0"
y="0"
id="tspan1101">1</tspan></text></g></g><path
d="m 737.88,284.16 h 102.96 v 31.92 H 737.88 Z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path1105" /><path
d="m 737.88,284.16 h 102.96 v 31.92 H 737.88 Z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path1107" /><g
id="g1109"><g
id="g1111"
clip-path="url(#clipPath1115)"><text
transform="matrix(1,0,0,-1,757.78,295.13)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1119"><tspan
x="0 14.04 28.08 42.119999"
y="0"
id="tspan1117">目标机器</tspan></text></g></g><g
id="g1121"><g
id="g1123"
clip-path="url(#clipPath1127)"><text
transform="matrix(1,0,0,-1,813.94,295.13)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1131"><tspan
x="0"
y="0"
id="tspan1129">2</tspan></text></g></g><path
d="m 737.88,184.92 h 102.96 v 31.8 H 737.88 Z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path1133" /><path
d="m 737.88,184.92 h 102.96 v 31.8 H 737.88 Z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path1135" /><g
id="g1137"><g
id="g1139"
clip-path="url(#clipPath1143)"><text
transform="matrix(1,0,0,-1,756.82,195.82)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1147"><tspan
x="0 14.04 28.08 42.119999"
y="0"
id="tspan1145">目标机器</tspan></text></g></g><g
id="g1149"><g
id="g1151"
clip-path="url(#clipPath1155)"><text
transform="matrix(1,0,0,-1,812.98,195.82)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1159"><tspan
x="0"
y="0"
id="tspan1157">N</tspan></text></g></g><g
id="g1161"><g
id="g1163"
clip-path="url(#clipPath1167)"><text
transform="matrix(1,0,0,-1,784.56,241.99)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1171"><tspan
x="0"
y="0"
id="tspan1169"></tspan></text></g></g><path
d="m 199.32,300.38 h 39.76 v -32.34 l -0.5,0.5 h 34.27 v -1 h -34.77 v 32.34 l 0.5,-0.5 h -39.26 z m 72.53,-29.34 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1173" /><path
d="m 374.17,268.46 37.93,-0.84 -0.02,-1 -37.93,0.84 z m 36.98,1.68 5.94,-3.13 -6.07,-2.87 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1175" /><path
d="m 513.36,267.62 h 38.69 v -1 h -38.69 z m 37.69,2.5 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1177" /><path
d="m 653.4,266.58 h 37.63 v 33.54 l -0.5,-0.5 h 42.31 v 1 h -42.81 v -33.54 l 0.5,0.5 H 653.4 Z m 78.44,30.54 6,3 -6,3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1179" /><path
d="m 653.4,259.34 h 23.83 v -58.5 l -0.5,0.5 h 56.16 v -1 h -56.66 v 58.5 l 0.5,-0.5 H 653.4 Z m 78.49,-55.5 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1181" /><path
d="m 199.32,372.86 h 52.15 v -95.13 l -0.5,0.5 h 21.92 v -1 h -22.42 v 95.13 l 0.5,-0.5 h -51.65 z m 72.57,-92.13 6,-3 -6,-3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1183" /><path
d="m 199.32,200.31 h 52.85 v 59.49 l -0.5,-0.5 h 21.18 v 1 h -21.68 v -59.49 l 0.5,0.5 h -52.35 z m 72.53,56.49 6,3 -6,3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1185" /><path
d="m 653.4,275.91 h 21.37 v 92.49 l -0.5,-0.5 h 58.06 v 1 h -58.56 v -92.49 l 0.5,0.5 H 653.4 Z m 77.93,89.49 6,3 -6,3 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path1187" /><g
id="g1189"><g
id="g1191"
clip-path="url(#clipPath1195)"><text
transform="matrix(1,0,0,-1,390.12,275.09)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1199"><tspan
x="0 3.4800279"
y="0"
id="tspan1197">IR</tspan></text></g></g><g
id="g1201"><g
id="g1203"
clip-path="url(#clipPath1207)"><text
transform="matrix(1,0,0,-1,529.73,273.79)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text1211"><tspan
x="0 3.47998"
y="0"
id="tspan1209">IR</tspan></text></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,744 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg25"
xml:space="preserve"
width="871.03998"
height="274.07776"
viewBox="0 0 871.03998 274.07776"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs29"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath39"><path
d="M 0,1.2207e-4 H 960 V 540.00012 H 0 Z"
clip-rule="evenodd"
id="path37" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath53"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path51" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath65"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path63" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath77"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path75" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath89"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path87" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath101"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path99" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath121"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path119" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath133"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path131" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath145"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path143" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath157"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path155" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath169"><path
d="m 562.56,350.52 h 65.64 v 117.6 h -65.64 z"
clip-rule="evenodd"
id="path167" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath181"><path
d="m 562.56,350.52 h 65.64 v 117.6 h -65.64 z"
clip-rule="evenodd"
id="path179" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath193"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path191" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath205"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path203" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath217"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path215" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath229"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path227" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath241"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path239" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath253"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path251" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath265"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path263" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath277"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path275" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath289"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path287" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath301"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path299" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath313"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path311" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath325"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path323" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath337"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path335" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath349"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path347" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath361"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path359" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath373"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path371" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath385"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path383" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath401"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path399" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath413"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path411" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath425"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path423" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath437"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path435" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath449"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path447" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath461"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path459" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath473"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path471" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath485"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path483" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath497"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path495" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath509"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path507" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath521"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path519" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath533"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path531" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath545"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path543" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath557"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path555" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath569"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path567" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath581"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path579" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath593"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path591" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath605"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path603" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath617"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path615" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath629"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path627" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath641"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path639" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath653"><path
d="M 1.4305e-5,0 H 960.00001 V 540 H 1.4305e-5 Z"
clip-rule="evenodd"
id="path651" /></clipPath></defs><g
id="g31"
transform="matrix(1.3333333,0,0,-1.3333333,-182.08,565.27999)"><path
d="m 137.04,401.08 c 0,12.3 9.98,22.28 22.28,22.28 h 89.12 c 12.3,0 22.28,-9.98 22.28,-22.28 V 297.32 c 0,-12.3 -9.98,-22.28 -22.28,-22.28 h -89.12 c -12.3,0 -22.28,9.98 -22.28,22.28 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path43" /><path
d="m 137.04,401.08 c 0,12.3 9.98,22.28 22.28,22.28 h 89.12 c 12.3,0 22.28,-9.98 22.28,-22.28 V 297.32 c 0,-12.3 -9.98,-22.28 -22.28,-22.28 h -89.12 c -12.3,0 -22.28,9.98 -22.28,22.28 z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path45" /><g
id="g47"><g
id="g49"
clip-path="url(#clipPath53)"><text
transform="matrix(1,0,0,-1,167.28,386.38)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text57"><tspan
x="0 9.4499998 18.936001 25.974001 35.478001 39.653999"
y="0"
id="tspan55">push 5</tspan></text></g></g><g
id="g59"><g
id="g61"
clip-path="url(#clipPath65)"><text
transform="matrix(1,0,0,-1,167.28,364.78)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text69"><tspan
x="0 9.4499998 18.936001 25.974001 35.478001 39.653999"
y="0"
id="tspan67">push b</tspan></text></g></g><g
id="g71"><g
id="g73"
clip-path="url(#clipPath77)"><text
transform="matrix(1,0,0,-1,167.28,343.18)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text81"><tspan
x="0 14.382 23.832001 27.972 34.001999 38.034 47.484001 51.624001"
y="0"
id="tspan79">multiply</tspan></text></g></g><g
id="g83"><g
id="g85"
clip-path="url(#clipPath89)"><text
transform="matrix(1,0,0,-1,167.28,321.58)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text93"><tspan
x="0 9.4625998 18.9252 26.026655 35.489258 39.688847"
y="0"
id="tspan91">push a</tspan></text></g></g><g
id="g95"><g
id="g97"
clip-path="url(#clipPath101)"><text
transform="matrix(1,0,0,-1,167.28,299.95)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text105"><tspan
x="0 7.0380001 16.542 25.902 32.742001 38.771999 44.622002 53.243999 60.858002"
y="0"
id="tspan103">substract</tspan></text></g></g><path
d="M 388.54,421.84 V 274.53"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path107" /><path
d="M 628.19,421.84 V 274.53"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path109" /><path
d="M 388.04,421.34 H 628.69"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path111" /><path
d="M 388.04,275.03 H 628.69"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path113" /><g
id="g115"><g
id="g117"
clip-path="url(#clipPath121)"><text
transform="matrix(1,0,0,-1,398.69,404.4)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text125"><tspan
x="0 14.04"
y="0"
id="tspan123">目标</tspan></text></g></g><g
id="g127"><g
id="g129"
clip-path="url(#clipPath133)"><text
transform="matrix(1,0,0,-1,445.73,404.4)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text137"><tspan
x="0 14.04 28.08"
y="0"
id="tspan135">运算符</tspan></text></g></g><g
id="g139"><g
id="g141"
clip-path="url(#clipPath145)"><text
transform="matrix(1,0,0,-1,505.01,404.4)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text149"><tspan
x="0 14.04 28.08"
y="0"
id="tspan147">操作数</tspan></text></g></g><g
id="g151"><g
id="g153"
clip-path="url(#clipPath157)"><text
transform="matrix(1,0,0,-1,547.13,404.4)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text161"><tspan
x="0"
y="0"
id="tspan159">1</tspan></text></g></g><g
id="g163"><g
id="g165"
clip-path="url(#clipPath169)"><text
transform="matrix(1,0,0,-1,570.86,404.4)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text173"><tspan
x="0 14.04 28.08"
y="0"
id="tspan171">操作数</tspan></text></g></g><g
id="g175"><g
id="g177"
clip-path="url(#clipPath181)"><text
transform="matrix(1,0,0,-1,613.01,404.4)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text185"><tspan
x="0"
y="0"
id="tspan183">2</tspan></text></g></g><g
id="g187"><g
id="g189"
clip-path="url(#clipPath193)"><text
transform="matrix(1,0,0,-1,406.85,380.23)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text197"><tspan
x="0 4.6799998"
y="0"
id="tspan195">t1</tspan></text></g></g><g
id="g199"><g
id="g201"
clip-path="url(#clipPath205)"><text
transform="matrix(1,0,0,-1,460.37,380.23)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text209"><tspan
x="0"
y="0"
id="tspan207"></tspan></text></g></g><g
id="g211"><g
id="g213"
clip-path="url(#clipPath217)"><text
transform="matrix(1,0,0,-1,526.01,380.23)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text221"><tspan
x="0"
y="0"
id="tspan219">5</tspan></text></g></g><g
id="g223"><g
id="g225"
clip-path="url(#clipPath229)"><text
transform="matrix(1,0,0,-1,406.85,355.85)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text233"><tspan
x="0 4.6799998"
y="0"
id="tspan231">t2</tspan></text></g></g><g
id="g235"><g
id="g237"
clip-path="url(#clipPath241)"><text
transform="matrix(1,0,0,-1,460.37,355.85)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text245"><tspan
x="0"
y="0"
id="tspan243"></tspan></text></g></g><g
id="g247"><g
id="g249"
clip-path="url(#clipPath253)"><text
transform="matrix(1,0,0,-1,525.89,355.85)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text257"><tspan
x="0"
y="0"
id="tspan255">b</tspan></text></g></g><g
id="g259"><g
id="g261"
clip-path="url(#clipPath265)"><text
transform="matrix(1,0,0,-1,406.85,331.46)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text269"><tspan
x="0 4.6800399"
y="0"
id="tspan267">t3</tspan></text></g></g><g
id="g271"><g
id="g273"
clip-path="url(#clipPath277)"><text
transform="matrix(1,0,0,-1,459.77,331.22)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text281"><tspan
x="0"
y="0"
id="tspan279">×</tspan></text></g></g><g
id="g283"><g
id="g285"
clip-path="url(#clipPath289)"><text
transform="matrix(1,0,0,-1,523.73,331.46)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text293"><tspan
x="0 4.6800399"
y="0"
id="tspan291">t1</tspan></text></g></g><g
id="g295"><g
id="g297"
clip-path="url(#clipPath301)"><text
transform="matrix(1,0,0,-1,589.61,331.46)"
style="font-variant:normal;font-weight:normal;font-size:14.064px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text305"><tspan
x="0 4.6800399"
y="0"
id="tspan303">t2</tspan></text></g></g><g
id="g307"><g
id="g309"
clip-path="url(#clipPath313)"><text
transform="matrix(1,0,0,-1,406.85,307.06)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text317"><tspan
x="0 4.6799998"
y="0"
id="tspan315">t4</tspan></text></g></g><g
id="g319"><g
id="g321"
clip-path="url(#clipPath325)"><text
transform="matrix(1,0,0,-1,460.37,307.06)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text329"><tspan
x="0"
y="0"
id="tspan327"></tspan></text></g></g><g
id="g331"><g
id="g333"
clip-path="url(#clipPath337)"><text
transform="matrix(1,0,0,-1,526.25,307.06)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text341"><tspan
x="0"
y="0"
id="tspan339">a</tspan></text></g></g><g
id="g343"><g
id="g345"
clip-path="url(#clipPath349)"><text
transform="matrix(1,0,0,-1,406.85,282.67)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text353"><tspan
x="0 4.6799998"
y="0"
id="tspan351">t5</tspan></text></g></g><g
id="g355"><g
id="g357"
clip-path="url(#clipPath361)"><text
transform="matrix(1,0,0,-1,464.57,282.67)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text365"><tspan
x="0"
y="0"
id="tspan363">-</tspan></text></g></g><g
id="g367"><g
id="g369"
clip-path="url(#clipPath373)"><text
transform="matrix(1,0,0,-1,523.73,282.67)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text377"><tspan
x="0 4.6799998"
y="0"
id="tspan375">t4</tspan></text></g></g><g
id="g379"><g
id="g381"
clip-path="url(#clipPath385)"><text
transform="matrix(1,0,0,-1,589.61,282.67)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text389"><tspan
x="0 4.6799998"
y="0"
id="tspan387">t3</tspan></text></g></g><path
d="m 650.52,400.34 c 0,12.78 10.36,23.14 23.14,23.14 h 92.56 c 12.78,0 23.14,-10.36 23.14,-23.14 V 298.18 c 0,-12.78 -10.36,-23.14 -23.14,-23.14 h -92.56 c -12.78,0 -23.14,10.36 -23.14,23.14 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none"
id="path391" /><path
d="m 650.52,400.34 c 0,12.78 10.36,23.14 23.14,23.14 h 92.56 c 12.78,0 23.14,-10.36 23.14,-23.14 V 298.18 c 0,-12.78 -10.36,-23.14 -23.14,-23.14 h -92.56 c -12.78,0 -23.14,10.36 -23.14,23.14 z"
style="fill:none;stroke:#000000;stroke-width:0.96;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:8;stroke-dasharray:none;stroke-opacity:1"
id="path393" /><g
id="g395"><g
id="g397"
clip-path="url(#clipPath401)"><text
transform="matrix(1,0,0,-1,676.94,386.04)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text405"><tspan
x="0 6.0300002 15.156"
y="0"
id="tspan403">t1 </tspan></text></g></g><g
id="g407"><g
id="g409"
clip-path="url(#clipPath413)"><text
transform="matrix(1,0,0,-1,696.26,386.04)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text417"><tspan
x="0"
y="0"
id="tspan415"></tspan></text></g></g><g
id="g419"><g
id="g421"
clip-path="url(#clipPath425)"><text
transform="matrix(1,0,0,-1,716.54,386.04)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text429"><tspan
x="0"
y="0"
id="tspan427">5</tspan></text></g></g><g
id="g431"><g
id="g433"
clip-path="url(#clipPath437)"><text
transform="matrix(1,0,0,-1,676.94,364.8)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text441"><tspan
x="0 6.0300002 15.156"
y="0"
id="tspan439">t2 </tspan></text></g></g><g
id="g443"><g
id="g445"
clip-path="url(#clipPath449)"><text
transform="matrix(1,0,0,-1,696.26,364.8)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text453"><tspan
x="0"
y="0"
id="tspan451"></tspan></text></g></g><g
id="g455"><g
id="g457"
clip-path="url(#clipPath461)"><text
transform="matrix(1,0,0,-1,716.54,364.8)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text465"><tspan
x="0"
y="0"
id="tspan463">b</tspan></text></g></g><g
id="g467"><g
id="g469"
clip-path="url(#clipPath473)"><text
transform="matrix(1,0,0,-1,676.94,342.84)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text477"><tspan
x="0 6.0300002 15.156"
y="0"
id="tspan475">t3 </tspan></text></g></g><g
id="g479"><g
id="g481"
clip-path="url(#clipPath485)"><text
transform="matrix(1,0,0,-1,696.26,342.84)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text489"><tspan
x="0"
y="0"
id="tspan487"></tspan></text></g></g><g
id="g491"><g
id="g493"
clip-path="url(#clipPath497)"><text
transform="matrix(1,0,0,-1,716.54,342.84)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text501"><tspan
x="0 6"
y="0"
id="tspan499">t1</tspan></text></g></g><g
id="g503"><g
id="g505"
clip-path="url(#clipPath509)"><text
transform="matrix(1,0,0,-1,731.66,342.84)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text513"><tspan
x="0"
y="0"
id="tspan511">×</tspan></text></g></g><g
id="g515"><g
id="g517"
clip-path="url(#clipPath521)"><text
transform="matrix(1,0,0,-1,749.66,342.84)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text525"><tspan
x="0 6"
y="0"
id="tspan523">t2</tspan></text></g></g><g
id="g527"><g
id="g529"
clip-path="url(#clipPath533)"><text
transform="matrix(1,0,0,-1,676.94,321.6)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text537"><tspan
x="0 6.0380402 15.122136"
y="0"
id="tspan535">t4 </tspan></text></g></g><g
id="g539"><g
id="g541"
clip-path="url(#clipPath545)"><text
transform="matrix(1,0,0,-1,696.26,321.6)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text549"><tspan
x="0"
y="0"
id="tspan547"></tspan></text></g></g><g
id="g551"><g
id="g553"
clip-path="url(#clipPath557)"><text
transform="matrix(1,0,0,-1,716.54,321.6)"
style="font-variant:normal;font-weight:normal;font-size:18.024px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text561"><tspan
x="0"
y="0"
id="tspan559">a</tspan></text></g></g><g
id="g563"><g
id="g565"
clip-path="url(#clipPath569)"><text
transform="matrix(1,0,0,-1,676.94,299.98)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text573"><tspan
x="0 6.0300002 15.156"
y="0"
id="tspan571">t5 </tspan></text></g></g><g
id="g575"><g
id="g577"
clip-path="url(#clipPath581)"><text
transform="matrix(1,0,0,-1,696.26,299.98)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text585"><tspan
x="0"
y="0"
id="tspan583"></tspan></text></g></g><g
id="g587"><g
id="g589"
clip-path="url(#clipPath593)"><text
transform="matrix(1,0,0,-1,716.54,299.98)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text597"><tspan
x="0 6.0300002 15.156"
y="0"
id="tspan595">t4 </tspan></text></g></g><g
id="g599"><g
id="g601"
clip-path="url(#clipPath605)"><text
transform="matrix(1,0,0,-1,735.86,299.98)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text609"><tspan
x="0"
y="0"
id="tspan607"></tspan></text></g></g><g
id="g611"><g
id="g613"
clip-path="url(#clipPath617)"><text
transform="matrix(1,0,0,-1,748.94,299.98)"
style="font-variant:normal;font-weight:normal;font-size:18px;font-family:Calibri;-inkscape-font-specification:Calibri;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text621"><tspan
x="0 6"
y="0"
id="tspan619">t3</tspan></text></g></g><g
id="g623"><g
id="g625"
clip-path="url(#clipPath629)"><text
transform="matrix(1,0,0,-1,171.38,219.43)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text633"><tspan
x="0 14.04"
y="0"
id="tspan631">堆栈</tspan></text></g></g><g
id="g635"><g
id="g637"
clip-path="url(#clipPath641)"><text
transform="matrix(1,0,0,-1,199.46,219.43)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text645"><tspan
x="0 14.04 28.08"
y="0"
id="tspan643">机代码</tspan></text></g></g><g
id="g647"><g
id="g649"
clip-path="url(#clipPath653)"><text
transform="matrix(1,0,0,-1,570.7,219.43)"
style="font-variant:normal;font-weight:normal;font-size:14.04px;font-family:'宋体';-inkscape-font-specification:'宋体';writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text657"><tspan
x="0 14.04 28.08 42.119999 56.16"
y="0"
id="tspan655">三地址代码</tspan></text></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 717 KiB

After

Width:  |  Height:  |  Size: 114 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 105 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 112 KiB

BIN
img/ch08/distillation.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 768 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Some files were not shown because too many files have changed in this diff Show More