Merge branch 'main' into main

This commit is contained in:
Zihan Ding
2022-05-01 22:47:22 -04:00
committed by GitHub
39 changed files with 133 additions and 927 deletions

View File

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

View File

@@ -1,3 +1,3 @@
## 章节总结
## 总结
本章我们围绕着易用性、高效性和保序性三个维度展开研究如何设计实现机器学习系统中的数据预处理模块。在易用性维度我们重点探讨了数据模块的编程模型通过借鉴历史上优秀的并行数据处理系统的设计经验我们认为基于描述数据集变换的编程抽象较为适合作为数据模块的编程模型在具体的系统实现中我们不仅要在上述的编程模型的基础上提供足够多内置算子方便用户的数据预处理编程同时还要考虑如何支持用户方便的使用自定义算子。在高效性方面我们从数据读取和计算两个方面分别介绍了特殊文件格式设计和计算并行架构设计。我们也使用我们在前几章中学习到的模型计算图编译优化技术来优化用户的数据预处理计算图以进一步的达到更高的数据处理吞吐率。机器学习场景中模型对数据输入顺序敏感于是衍生出来保序性这一特殊性质我们在本章中对此进行了分析并通过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**:使用分布式训练,我们也可以进一步减少训练及其模型所需的成本。受限于单节点散热的上限,单节点的算力越高,其所需的散热硬件成本也更高。因此,在提供同等的算力的条件下,组合多个计算节点是一个更加经济高效的方式。这促使云服务商(如亚马逊和微软等)需要更加注重给用户提供成本高效的分布式机器学习系统。
- **抵御硬件故障**分布式训练系统同时能有效提升抵御硬件故障的能力。机器学习训练集群往往由商用硬件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

@@ -16,8 +16,7 @@
- 为了提供海量的带宽机器学习集群拥有异构的网络以太网机内网络NVLink和InfiniBand。
- 为了解决单节点瓶颈,我们可以使用
Allreduce来分摊梯度聚合过程中的计算和通讯开销。
- 为了解决单节点瓶颈,我们可以使用Allreduce来分摊梯度聚合过程中的计算和通讯开销。
- 参数服务器可以帮助机器学习集群实现计算-存储的分离,从而更好的支持大型稀疏模型。

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

@@ -10,7 +10,7 @@
: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在开发并应用于谷歌应用商店中该模型在谷歌的实际生产环境中可以大幅提升应用的下载率。

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`中都发现模型更新可以有效缓解概念漂移带来的危害,而且更新的频率越高,模型的性能越好。

View File

@@ -6,7 +6,7 @@
理论方面线性二次控制Linear-Quadratic
Control是经典的控制方法最近有关于图神经网络在分布式线性二次控制的研究 :cite:`pmlr-v144-gama21a`。作者称将线性二次问题转换为自监督学习问题能够找到基于图神经网络Graph
Neural
NetworksGNN的最佳分布式控制器他们还推导出了所得闭环系统稳定的充分条件。随着基于数据和学习的机器人控制方法不断得到重视研究人员必须了解何时以及如何在现实世界中最好地利用这些方法因为安全是至关重要的有的研究通过学习不确定的动力学来安全地提高性能鼓励安全或稳健的强化学习方法以及可以正式认证所学控制策略的安全性的方法 :cite:`brunke2021safe`:numref:`safe\_learning\_control`展示了安全学习控制Safe Learning
NetworksGNN的最佳分布式控制器他们还推导出了所得闭环系统稳定的充分条件。随着基于数据和学习的机器人控制方法不断得到重视研究人员必须了解何时以及如何在现实世界中最好地利用这些方法因为安全是至关重要的有的研究通过学习不确定的动力学来安全地提高性能鼓励安全或稳健的强化学习方法以及可以正式认证所学控制策略的安全性的方法 :cite:`brunke2021safe` :numref:`safe\_learning\_control`展示了安全学习控制Safe Learning
Control系统的框架图用数据驱动的方法来学习控制策略兼顾安全性。Lyapunov :cite:`pmlr-v144-mehrjou21a`
函数是评估非线性动力系统稳定性的有效工具最近有人提出Neural
Lyapunov来将安全性纳入考虑。
@@ -20,3 +20,5 @@ Lyapunov来将安全性纳入考虑。
:label:`safe\_learning\_control`
:bibliography:`../mlsys.bib`

View File

@@ -1,6 +1,6 @@
# 机器人学习系统
# 机器人系统
在本章中,我们介绍机器学习的一个重要分支——机器人学习及其在系统方面的知识。本章的学习目标包括:
在本章中,我们介绍机器学习的一个重要分支——机器人及其在系统方面的知识。本章的学习目标包括:
- 掌握机器人学习基本知识。

View File

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

View File

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

View File

@@ -6,10 +6,10 @@
Learning:cite:`peters2016robot`。机器人学习包含了计算机视觉、自然语言处理、语音处理、强化学习和模仿学习等人工智能技术在机器人上的应用,让机器人通过学习,自主地执行各种决策控制任务。
机器人学习系统Robot Learning
System是一个较新的概念。作为系统和机器人学习的交叉方向仿照机器学习系统的概念我们把机器人学习系统定义为"支持机器人模型训练和部署的系统"。按照涉及的机器人数量,可以划分为单机器人学习系统和多机器人学习系统。多机器人学习系统协作和沟通中涉及的安全和隐私问题,也会是一个值得研究的方向。最近机器人学习系统在室内自主移动 :cite:`zhu2017target`:cite:`pmlr-v100-bansal20a`:cite:`9123682`:cite:`huang2018navigationnet`,道路自动驾驶 :cite:`pmlr-v155-huang21a`:cite:`pmlr-v155-sun21a`:cite:`Sun2022SelfSupervisedTA`,机械臂工业操作 :cite:`tobin2017domain`:cite:`finn2017deep`:cite:`chen2020transferable`:cite:`duan2017one`等行业场景得到充分应用和发展。一些机器人学习基础设施项目也在进行中,如具备从公开可用的互联网资源、计算机模拟和
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和
(如 :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`,可以让模型训练与部署系统与这些平台对接。
@@ -20,7 +20,7 @@ Deadline-Driven) :cite:`10.1145/3492321.3519576`和强调模块化思想的Pylot
:label:`vehicle\_computing`
图 :numref:`learning\_decision\_module`是一个典型的感知、规划、控制的模块化设计的自动驾驶系统框架图,接下来,我们也将按照这个顺序依次介绍通用框架、感知系统、规划系统和控制系统。
:numref:`learning\_decision\_module`是一个典型的感知、规划、控制的模块化设计的自动驾驶系统框架图,接下来,我们也将按照这个顺序依次介绍通用框架、感知系统、规划系统和控制系统。
![通过模仿学习进行自动驾驶框架图。
绿线表示自主驾驶系统的模块化流程。橙色实线表示神经判别器的训练。而橙色虚线表示规划和控制模块是不可微的。但是决策策略可以通过判别器对控制行动的奖励,重新参数化技术进行训练,如蓝色虚线所示 :cite:`pmlr-v155-huang21a`。](../img/ch13/idm.png)
@@ -28,3 +28,5 @@ Deadline-Driven) :cite:`10.1145/3492321.3519576`和强调模块化思想的Pylot
:width:`800px`
:label:`learning\_decision\_module`
:bibliography:`../mlsys.bib`

View File

@@ -27,7 +27,7 @@ Ardent Apalone
是于2017年发布。ROS2增加了对多机器人系统的支持提高了多机器人之间通信的网络性能而且支持微控制器和跨系统平台不仅可以运行在现有的X86和ARM系统上还将支持MCU等嵌入式微控制器不止能运行在Linux系统之上还增加了对Windows、MacOS、RTOS等系统的支持。更重要的是ROS
2还加入了实时控制的支持可以提高控制的时效性和整体机器人的性能。ROS
2的通信系统基于DDSData Distribution
Service即数据分发服务,如:numref:`ROS2\_arch`所示。
Service即数据分发服务,如 :numref:`ROS2\_arch`所示。
ROS2依赖于使用shell环境组合工作区。"工作区"Workspace是一个ROS术语表示使用ROS2进行开发的系统位置。核心ROS2
工作区称为Underlay。随后的工作区称为Overlays。使用ROS2
@@ -39,7 +39,7 @@ ROS
Graph是一个由ROS2元素组成的网络在同一时间一起处理数据。它包括所有的可执行文件和它们之间的联系。ROS2
中的每个节点都应负责一个单一的模块用途(例如,一个节点用于控制车轮马达,一个节点用于控制激光测距仪等)。每个节点都可以通过主题、服务、动作或参数向其他节点发送和接收数据。一个完整的机器人系统由许多协同工作的节点组成。在
ROS 2 中单个可执行文件C++ 程序、Python
程序等)可以包含一个或多个节点,如:numref:`ros2\_graph`
程序等)可以包含一个或多个节点,如 :numref:`ros2\_graph`
![一个完整的机器人系统由许多协同工作的节点组成。在ROS 2
单个可执行文件C++ 程序、Python
@@ -64,10 +64,10 @@ ROS 2 中单个可执行文件C++ 程序、Python
### ROS2 Topics
ROS2将复杂系统分解为许多模块化节点。主题Topics是 ROS
Graph的重要元素它充当节点交换消息的总线。一个节点可以向任意数量的主题发布数据同时订阅任意数量的主题:numref:`ros2\_topics`所示。主题是数据在节点之间以及因此在系统的不同部分之间移动的主要方式之一。
Graph的重要元素它充当节点交换消息的总线。一个节点可以向任意数量的主题发布数据同时订阅任意数量的主题 :numref:`ros2\_topics`所示。主题是数据在节点之间以及因此在系统的不同部分之间移动的主要方式之一。
rqt是ROS的一个软件框架以插件的形式实现了各种 GUI 工具。可以在 rqt
中将所有现有的GUI工具作为可停靠窗口运行这些工具仍然可以以传统的独立方法运行但rqt可以更轻松地同时管理屏幕上的所有各种窗口。
中将所有现有的GUI工具作为可停靠窗口运行这些工具仍然可以以传统的独立方法运行但rqt可以更轻松地同时管理屏幕上的所有各种窗口。
![一个节点可以向任意数量的主题发布数据,同时订阅任意数量的主题](../img/ch13/ros2_topics.png)
@@ -102,5 +102,7 @@ rqt是ROS的一个软件框架以插件的形式实现了各种 GUI 工具。
:label:`ros2\_actions`
:bibliography:`../mlsys.bib`
[^1]: https://docs.ros.org/en/foxy/Tutorials/Understanding-ROS2-Nodes.html

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

View File

@@ -36,9 +36,9 @@
第13章 - 可解释性AI系统[@HaoyangLee](https://github.com/HaoyangLee)
第14章 - 机器人学习系统:[@HaoyangLee](https://github.com/HaoyangLee)
第14章 - 机器人学习系统:[@Jack](https://github.com/Jiankai-Sun)
附录:机器学习介绍:[@Jack](https://github.com/Jiankai-Sun)
附录:机器学习介绍:[@Hao](https://github.com/zsdonghao)
## 加入我们

View File

@@ -1017,15 +1017,6 @@ howpublished = {\url{https://github.com/PRX-Kinodynamic/ML4KP}},
year = {2021--2021}
}
@article{kadubandimotion,
title={Motion Planner Guided Visuomotor Policy Learning},
author={Kadubandi, Venkata Pradeep and Salhotra, Gautam and Sukhatme, Gaurav S and Englert, Peter}
}
@article{jangdeep,
title={Deep Neural Network-based Fast Motion Planning Framework for Quadrupedal Robot},
author={Jang, Jinhyeok and Shin, Heechan and Yoon, Minsung and Hong, Seungwoo and Park, Hae-Won and Yoon, Sung-Eui}
}
@article{aradi2020survey,
@@ -1043,13 +1034,6 @@ year = {2021--2021}
year={2021}
}
@article{tartanvo2020corl,
title = {TartanVO: A Generalizable Learning-based VO},
author = {Wang, Wenshan and Hu, Yaoyu and Scherer, Sebastian},
booktitle = {Conference on Robot Learning (CoRL)},
year = {2020}
}
@article{qiu2021egocentric,
title={Egocentric Human Trajectory Forecasting with a Wearable Camera and Multi-Modal Fusion},
author={Qiu, Jianing and Chen, Lipeng and Gu, Xiao and Lo, Frank P-W and Tsai, Ya-Yen and Sun, Jiankai and Liu, Jiaqi and Lo, Benny},
@@ -1497,8 +1481,9 @@ series = {EuroSys '22}
year={2022}
}
@inproceedings{Sun2022SelfSupervisedTA,
@article{Sun2022SelfSupervisedTA,
title={Self-Supervised Traffic Advisors: Distributed, Multi-view Traffic Prediction for Smart Cities},
author={Jiankai Sun and Shreyas Kousik and David Fridovich-Keil and Mac Schwager},
journal={arXiv preprint},
year={2022}
}