From 5ff00cf99ef653bc09609a703406d255406a507f Mon Sep 17 00:00:00 2001 From: Eric_lai Date: Thu, 27 Jan 2022 11:26:38 +0800 Subject: [PATCH] Update table reference --- .../components_of_computational_graph.md | 5 +++-- .../generation_of_computational_graph.md | 11 +++++++---- .../requirements_for_machine_learning_systems.md | 7 +++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/chapter_computational_graph/components_of_computational_graph.md b/chapter_computational_graph/components_of_computational_graph.md index feebb6d..ce2e7bf 100644 --- a/chapter_computational_graph/components_of_computational_graph.md +++ b/chapter_computational_graph/components_of_computational_graph.md @@ -7,8 +7,9 @@ :label:`simpledag` ### 张量和算子 -在计算框架中,基础组件包含张量和算子,张量是基础数据结构,算子是基本运算单元。在数学中定义中张量是基于向量与矩阵的推广,涵盖标量、向量与矩阵的概念。可以将标量理解为零阶张量,向量为一阶张量,我们熟悉的RGB彩色图像即为三阶张量。在计算框架中张量不仅存储数据,还存储数据类型、数据形状、维度或秩以及梯度传递状态等多个属性,如下表所示,列举了主要的属性和功能。 +在计算框架中,基础组件包含张量和算子,张量是基础数据结构,算子是基本运算单元。在数学中定义中张量是基于向量与矩阵的推广,涵盖标量、向量与矩阵的概念。可以将标量理解为零阶张量,向量为一阶张量,我们熟悉的RGB彩色图像即为三阶张量。在计算框架中张量不仅存储数据,还存储数据类型、数据形状、维度或秩以及梯度传递状态等多个属性,如表3.2.1所示,列举了主要的属性和功能。 +:张量属性 |张量属性|功能| |:-: |:-:| @@ -17,7 +18,7 @@ | 数据类型(dtype) |表示存储的数据类型,如bool、int8、int16、float32、float64等| | 存储位置(device) | 创建张量时可以指定存储的设备位置,如CPU、GPU等| | 名字(name) | 张量的标识符 | - +:label:`tensor_attr` 张量的形状是一个重要的属性,它记录了每个轴的长度,也就是张量每个维度的元素数量。秩则代表张量的轴数或者阶数。张量中通常可以保存布尔类型、浮点数、整型数以及复数和字符串数据。每一个张量都具有唯一的数据类型,在计算过程中会对所有参与运算的张量进行类型检查,当发现类型不匹配时就会报错。部分特殊的计算则必须使用指定的数据类型,比如逻辑运算应为布尔类型。在部分计算框架中张量的属性中包含可以指明张量存储的设备位置,比如存储于CPU、GPU等。张量数据的存储状态可以分为可变和不可变两种,不可变张量一般用于用户初始化的数据或者网络模型输入的数据;而可变张量则存储网络权重参数,根据梯度信息更新自身数据。 diff --git a/chapter_computational_graph/generation_of_computational_graph.md b/chapter_computational_graph/generation_of_computational_graph.md index e39ffaa..02ce050 100644 --- a/chapter_computational_graph/generation_of_computational_graph.md +++ b/chapter_computational_graph/generation_of_computational_graph.md @@ -75,8 +75,9 @@ def model(X1, X2): ``` 在静态生成过程中,计算框架获取完整的计算图可以分析出计算$\boldsymbol{Y_1}$和$\boldsymbol{Y_2}$的过程相对独立,可以将其进行自动并行计算,加快计算效率。而动态生成的过程中,若无手动配置并行策略,计算框架无法获取图结构不能分析出算子之间的独立性,则只能按照代码顺序执行。模型在输出结果之前执行了*add*和*relu*算子操作,在静态生成过程中利用计算图优化策略中的算子融合方法,可以将这两个算子融合为一个算子执行,这样减少了中间变量$\boldsymbol{Y}$的存储与读取过程,加快了计算效率,减少了内存占用。而动态生成过程则需要按照顺序执行*add*和*relu*两步操作,需要存储变量$\boldsymbol{Y}$。除此之外,由于静态生成能够同时分析重构出前向计算图和反向计算图,可以提前确定反向计算中需要保存的前向中间变量信息。而动态生成则在完成前向计算后才能构建出反向计算图,为了保证反向计算效率需要保存更多的前向计算中间变量信息,相比之下静态生成的过程更加节省内存占用。 -为了方便读者对比,将静态图和动态图特性总结见表。 +为了方便读者对比,将静态图和动态图特性总结见表3.3.1。 +:静态图和动态图对比 |特性|静态图|动态图| |:---:| :---: | :---: | @@ -86,7 +87,7 @@ def model(X1, X2): | 性能 | 优化策略多,性能更佳 | 图优化受限,性能较差 | | 内存占用 | 内存占用少 | 内存占用相对较多 | | 部署能力 |可直接部署 | 不可直接部署| - +:label:`cmp_dynamic_static` 针对两种模式的特性,结合任务需求选择合适的模式可以事半功倍,学术科研以及模型开发调试阶段,为了快速验证思想和迭代更新模型结构可以选择动态图模式进行构建算法;网络模型确定,为了加速训练过程或者为硬件部署模型,可以选择静态图模式。 @@ -128,7 +129,9 @@ def model(X, flag): ``` 代码中模型整体可以采用动态生成,而\@ms\_function可以使用基于源码转换的技术将模块*add_and_relu*的转化为静态图结构。与动态生成中代码执行相同,模型接受输入按照模型定义的计算顺序进行调度执行,并生成临时图结构,当执行语句*Y=add_and_relu(Y,b)* 时,计算框架会自动调用该模块静态生成的图结构执行计算。模块*add_and_relu* 可以利用静态图中的优化技术来提高计算性能,实现动态图和静态图的混合执行。此外,动静态转换的技术常用于模型部署阶段,动态图预测部署时除了需要已经训练完成的参数文件,还须提供最初的模型组网前端代码,这使得动态图部署受到局限性,部署硬件中往往难以提供支持前端语言执行环境。因此当使用动态图模式训练完成模型参数后,可以将整体网络结构转换为静态图格式,将神经网络模型和参数文件进行序列化保存,与前端代码完全解耦,扩大模型部署的硬件支持范围。 -主流的计算框架TensorFlow、MindSpore等中均提供动静态相互转换与融合执行的技术,我们将各框架中支持源码转换和追踪转换技术的接口梳理如下表所示。 +主流的计算框架TensorFlow、MindSpore等中均提供动静态相互转换与融合执行的技术,我们将各框架中支持源码转换和追踪转换技术的接口梳理如下表3.3.2所示。 + +:主流框架动态图转换静态图支持 |框架|动态图转静态图| | :-:| :---: | @@ -136,5 +139,5 @@ def model(X, flag): | MindSpore | context.set_context(mode=context.PYNATIVE_MODE) 动态图模式
context.set_context(mode=context.GRAPH_MODE) 静态图模式
\@ms_function支持基于源码转换 | | PyTorch | torch.jit.script()支持基于源码转换,
torch.jit.trace()支持基于追踪转换 | | PaddlePaddle | paddle.jit.to_static()支持基于源码转换,
paddle.jit.TracedLayer.trace()支持基于追踪转换 | - +:label:`dynamic_static_switch` diff --git a/chapter_introduction/requirements_for_machine_learning_systems.md b/chapter_introduction/requirements_for_machine_learning_systems.md index 713b42e..2c80c67 100644 --- a/chapter_introduction/requirements_for_machine_learning_systems.md +++ b/chapter_introduction/requirements_for_machine_learning_systems.md @@ -31,12 +31,15 @@ 在设计机器学习系统之初,开发者曾尝试通过传统的**神经网络开发库**(如Theano和Caffe)、以及**大数据计算框架**(如Apache Spark和Google -Pregel)等方式来达到以上设计目标。可是他们发现(如表1.2.1机器学习框架和相关系统的比较所示), +Pregel)等方式来达到以上设计目标。可是他们发现(如表1.2.1所示), 神经网络库虽然提供了神经网络开发、自动微分和加速器的支持,但是其缺乏管理和处理大型数据集、模型部署和分布式执行的能力,使得其无法满足产品级机器学习应用的开发。 此外,虽然大数据计算框架具有成熟的分布式执行和数据管理能力,但是其缺乏对神经网络、自动微分和加速器的支持,使得其并不适合开发以神经网络为核心的机器学习应用。因此,业界从头设计出了包括MindSpore、PaddlePaddle、TensorFlow,PyTorch等一系列机器学习框架。 +:机器学习框架和相关系统的比较 + | | 神经网络 | 自动微分 | 数据管理和处理 | 训练和部署 | 加速器 | 分布式 | |:-: |:-:| :-: |:-:|:-: |:-:|:-:| | 神经网络库 | 是 | 是 | 否 | 否 | 是 | 否 | | 大数据框架 | 否 | 否 | 是 | 否 | 否 | 是 | -| 机器学习框架 | 是 | 是 | 是 | 是 | 是 | 是 | \ No newline at end of file +| 机器学习框架 | 是 | 是 | 是 | 是 | 是 | 是 | +:label:`comparison_of_ml_frameworks` \ No newline at end of file