Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
## 1.1.2 深度学习方法

在展开后面的系统设计之前,我们需要首先了解深度学习的原理与特点。我们将以下面图中的实例介绍深度学习是如何工作的。我们假定读者有一定机器学习经验,其中的一些概念暂不在本章过多解释,我们会在第2章中介绍机器学习,神经网络与深度学习的原理,让读者对整体的执行流程有更加深刻的理解。

<style>table{margin: auto;}</style>
<center><img src="./img/1/1-2-1-dl-method.png" ch="500" width="900" height="500"></center>
<center>图1-1-1. 深度学习方法 </center>

Expand All @@ -67,7 +67,7 @@
后面章节将要介绍的深度学习系统,就是围绕以上的各个环节,提供良好的开发体验,极致的执行性能,提升效率,保证安全性,以及应对更大规模的数据,更大的模型结构,多租的执行环境,同时利用新的加速器硬件特性,开掘硬件的极致算力。

## 1.1.3 神经网络的基本理论在深度学习前已基本奠定

<style>table{margin: auto;}</style>
<center><img src="./img/1/1-3-1-history.jpg" ch="500" /></center>
<center>图1-1-2. 神经网络的基本理论与发展 (图片引用自互联网)</center>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- [3. 其他领域算法的进步](#3-其他领域算法的进步)
- [1.2.3 计算机体系结构和计算能力的进步](#123-计算机体系结构和计算能力的进步)
- [1.2.4 计算框架的进步](#124-计算框架的进步)
- [小节与讨论](#小节与讨论)
- [小结与讨论](#小结与讨论)
- [参考文献](#参考文献)

## 1.2.1 大数据和分布式系统
Expand Down Expand Up @@ -62,11 +62,12 @@
[MNIST](http://yann.lecun.com/exdb/mnist/)手写数字识别数据库是一个大型手写数字图像数据集,在早期通常用于训练和研究各种图像分类的深度学习模型,当前也常常用于教学或神经网络结构(NAS)搜索的研究。该数据集当前还在广泛用于机器学习领域的训练和测试。

我们可以观察下图,观察不同的机器学习算法取得的效果。

<style>table{margin: auto;}</style>
<center><img src="./img/2/2-3-5-mnist.png" ch="500" /></center>
<center>图1-2-1. MNIST数据集上各算法的Test Error (%)</center>



从图中可以观察到这样的趋势:

1998年,一个简单的卷积神经网络可以取得和SVM取得的最好效果相同。
Expand All @@ -81,7 +82,7 @@

随着每年ImageNet数据集上的新模型取得突破,我们看到新的深度学习模型结构和训练方式被研究者和工程师设计出来。
除了深度学习算法本身的潜力,通过在IMAGENET数据集上不断验证不同的深度学习模型结构,我们观察到,更加复杂的模型结构有潜力提升当前预测的效果。

<style>table{margin: auto;}</style>
<center><img src="./img/2/2-3-4-dl-imagenet-improve.png" ch="500" /></center>
<center>图1-2-1. 不同的深度学习模型在IMAGENET数据集上的效果不断取得突破</center>

Expand Down Expand Up @@ -152,7 +153,7 @@
- 代表性框架:PyTorch, Chainer, DyNet
- 特点:用户不仅表达模型结构,还需要表达执行步骤,并且按照每一步定义进行执行,由于无法像声明式编程获取完整计算图并优化后执行,所以难以提供全面的计算图优化,但是由于其简单易用,灵活性高,在模型研究人员中也有很高的用户基础,并不断在新的研究工作中被广泛使用,从而打下增长势头较好且广泛的用户基础。

<style>table{margin: auto;}</style>
<center><img src="./img/2/2-3-2-framework1to2.png" ch="500"></center>
<center>图1-2-2. 第一代框架到第二代框架的进步</center>

Expand All @@ -163,7 +164,7 @@
**第三代框架**:

我们除了设计框架解决当前的问题,还应该思考关注和设计下一代的框架支持未来的模型趋势。

<style>table{margin: auto;}</style>
<center><img src="./img/2/2-3-3-framework-2to3.png" ch="500"></center>
<center>图1-2-3. 第二代框架到第三代框架的发展趋势</center>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,27 +36,28 @@

一般的深度学习系统我们大致可以分为以下部分:

- 开发体验负责提供用户前端的编程语言,接口和工具链。包括并不限于以下领域:
- 开发体验负责提供用户前端的编程语言,接口和工具链。包括并不限于以下领域:
- 模型构建:卷积,循环神经网络,控制流等基本结构实现。
- 算法实现:同步与异步优化算法等。
- 流水线和工作流支持:高性能数据加载器等。
- 实验规划与配置:批量超参数调优与模型结构搜索等。
- 工具链: 模型转换,调试,可视化,类型系统等。
- 生命周期管理:数据读取,训练与推理等流程开发与管理。
- 框架负责静态程序分析与计算图构建,编译优化等。包括并不限于以下领域:
- 框架负责静态程序分析与计算图构建,编译优化等。包括并不限于以下领域:
- 计算图构建:静态,动态计算图构建等。
- 自动求导:高效与高精度自动求导等。
- 中间表达构建:多层次中间表达等。
- 编译优化:内核融合等。
- 运行时负责系统的运行时的系统动态调度与优化。包括并不限于以下部分。
- 运行时负责系统的运行时的系统动态调度与优化。包括并不限于以下部分。
- 优化器:运行时JIT优化,内省(Introspective)优化等。
- 调度器:算子并行与调度。
- 执行器:线程池等。
- 资源管理与硬件体系结构负责程序的执行,互联与加速。包括并不限于以下部分。
- 资源管理与硬件体系结构负责程序的执行,互联与加速。包括并不限于以下部分。
- 硬件接口抽象:GPU, CPU,FPGA和ASIC等。
- 资源池化管理与调度:异构资源集群管理等。
- 可扩展的网络栈:RDMA,IB,NVLink等。


<style>table{margin: auto;}</style>
<center><img src="./img/3/3-3-1-dl-sys-stack.png" ch="500" /></center>
<center>图1-3-1. 深度学习系统的大致组成</center>

Expand All @@ -79,7 +80,7 @@
- 安全与隐私:人工智能模型与应用的安全与隐私保护支持。
- 模型推导、压缩与优化:基于深度学习特有性质进行模型的训练与部署性能提升。


<style>table{margin: auto;}</style>
<center><img src="./img/3/3-3-2-dl-ecosystem.png" ch="500" /></center>
<center>图1-3-2. 深度学习系统生态</center>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@
如下图所示,我们可以看到一个深度学习模型可以接受输入(例如,当前手写数字图片),产生输出(例如图中为数字分类),这个过程叫前向传播(Forward Propagation),也叫做推理(Inference)。这其中图片经过深度学习模型的处理产生输出结果,这个过程我们一般称作推理(Inference)。那么如何得到一个针对当前已有的输入输出数据上,预测效果最好的模型呢?我们需要通过训练的过程,训练过程可以抽象为一个优化问题,优化目标为:
$$\theta = argmin_{\theta}\sum[Loss(f_{\theta}(x), y)]$$
其中的$f_{\theta}$代表深度学习模型,例如后面提到的LeNet,$Loss$代表损失函数,$x$代表数据中的输入也就是图像,$y$代表数据中的标签值,也就是输出,训练的过程就是找到最小化$Loss$的$\theta$取值,$\theta$也称作权重。在训练过程中将通过梯度下降算法进行求解,$\theta = \theta - \alpha \delta_{\theta}Loss(\theta)$,其中$\alpha$也叫学习率(Learning Rate)。当训练完成,就可以通过$\hat{y} = f_\theta(x)$进行推理,使用和部署模型。

<style>table{margin: auto;}</style>
<center><img src="./img/4/4-1-2.png" ch="500" /></center>
<center>图1-5-1. 深度学习训练过程</center>


如下图所示,左上角的图示中展示的是输入为手写数字图像,输出为分类向量,中间的矩形为各层输出的特征图。我们可以看到深度学习模型就是通过各个层将输入图像处理为类别输出概率向量。用户一般经过两个阶段进行构建: (1)定义网络结构,例如图中和下面代码实例中构建的LeNet网络,其中包含有二维卷积(Conv2D),最大池化(max_pool2d),全连接(Linear)层。(2)开始训练,遍历一个批尺寸(Batch Size)数据,设置计算资源,前向传播计算,计算损失(Loss)。


<style>table{margin: auto;}</style>
<center><img src="./img/4/4-1-1.png" ch="500" /></center>
<center>图1-5-2. PyTorch训练LeNet实例</center>

Expand Down Expand Up @@ -125,6 +125,7 @@ if __name__ == '__main__':

图1-5-3的卷积层实例中,每次选取输入数据一层的一个窗口(例如和卷积核一样的宽高)然后和对应的卷积核(例如Filter-1中的5$\times$5卷积核)进行矩阵内积计算,最后将所有的计算结果与偏置项$b$相加后输出,产生特征图。输入张量形状(Tensor Shape)为(3x32x32),经过2x3x5x5的卷积(2代表输出通道数,3代表输入通道数,5代表卷积核高,5代表卷积核宽)后,输出张量形状(Tensor Shape)为(2x28x28)。

<style>table{margin: auto;}</style>
<center><img src="./img/4/conv3d.png" ch="500" /></center>
<center>图1-5-3. Conv2d计算过程实例</center>

Expand Down Expand Up @@ -155,6 +156,8 @@ for n in range(batch_size):
- 从算法来说,当前7层循环是否能转换为更加简单的矩阵计算(例如,[cuDNN](https://docs.nvidia.com/deeplearning/cudnn/)库中的卷积就提供了[多种实现算法](https://docs.nvidia.com/deeplearning/cudnn/api/index.html#cudnnConvolutionForward))。这些算法被封装在库中,有些框架会在运行时动态调优选择不同算法策略,读者可以参考第3章进行更多的了解。

为了利用张量核心的矩阵乘法算子,先进的深度学习加速库,例如cuDNN,通常通过应用[im2col](https://hal.inria.fr/inria-00112631/document)函数将卷积转换为通用矩阵乘法(General Matrix Multiplication)缩写[GEMM](https://en.wikipedia.org/wiki/GEMM)。通用矩阵乘是自然语言处理中的主要的计算原语,同时卷积也可以转换为通用矩阵乘,同时底层GPU和其他专有人工智能芯片也针对矩阵乘作为底层支持(例如张量核([Tensor Core](https://www.nvidia.com/en-us/data-center/tensor-cores/))),这样的转换就可以让算子利用底层硬件和软件的优化。

<style>table{margin: auto;}</style>
<center> <img src="./img/4/1-4-4-imtocol.png" ch="500" width="500" height="160" /></center>
<center>图1-4-4. 卷积通im2col转换为通用矩阵乘(<a href="https://arxiv.org/pdf/2105.09564.pdf">图片引用</a>)</center>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,11 @@ for i in range(10):
例如,我们通过Python调用PyTorch实现一个简单的向量加法。
```python
impor torch

a = torch.randn(4)
b = torch.randn(4)
torch.add(a, b)
...
K = ... # 定义向量维度(Dimension)
a = torch.randn(K) # 初始化
b = torch.randn(K)
torch.add(a, b) # PyTorch执行向量加法
```

在本层,我们可以编写深度学习模型,通过卷积,池化,全连接,注意力机制,等算子,组合出复杂的数据流图模型。
Expand All @@ -48,7 +49,7 @@ torch.add(a, b)
例如,在CUDA层就会实现
```c++
...
// CUDA内核.每个线程执行一个元素的加法
// CUDA内核每个线程执行一个元素的加法
__global__ void vecAdd(double *a, double *b, double *c, int n)
{
// 获取全局线程Id
Expand All @@ -59,6 +60,12 @@ __global__ void vecAdd(double *a, double *b, double *c, int n)
c[id] = a[id] + b[id];
}
...
int main( int argc, char* argv[] )
{
...
// 发起(Launch) vecAdd CUDA内核(Kernel),通过gridSize和blockSize配置并行线程数量
vecAdd<<<gridSize, blockSize>>>(d_a, d_b, d_c, n);
...
```
- 汇编指令:NVIDIA GPU中有PTX, SASS等

Expand All @@ -75,10 +82,10 @@ PTX 是一种低级并行线程执行虚拟机(Virtual Machine)和指令集架
.param .u32 _Z6vecAddPdS_S_i_param_3 // 对应CUDA代码int n
)
{
.reg .pred %p<2>; // 定义谓词(Predicate),用于放置比较运算符结果
.reg .b32 %r<6>; // 定义一组32比特无类型(Untyped),寄存器变量
.reg .f64 %fd<4>; // 定义一组64比特浮点型,寄存器变量,用于存取中间结果
.reg .b64 %rd<11>; // 定义一组64比特无类型(Untyped),寄存器变量,未来用于放置地址
.reg .pred %p<2>; // 定义谓词(Predicate)寄存器变量,用于放置比较运算符结果
.reg .b32 %r<6>; // 定义一组32比特无类型(Untyped),寄存器变量,未来用于存放常量数组索引
.reg .f64 %fd<4>; // 定义一组64比特浮点型,寄存器变量,用于存取中间结果,未来用于存放输入参数的数据地址
.reg .b64 %rd<11>; // 定义一组64比特无类型(Untyped),寄存器变量,未来用于放置存储结构的数据地址


ld.param.u64 %rd1, [_Z6vecAddPdS_S_i_param_0]; // a加载到%rd1寄存器
Expand Down Expand Up @@ -141,8 +148,9 @@ ret; // 返回
- 对模型中的每个算子计算可以转换为底层的循环执行,这其中对输入输出数据的访问有一定的缓存复用机会。

计算机的内存层次结构很深,不同层级的访存时间,带宽,空间和价格都不同,但遵循一定的递增或递减的关系。

<style>table{margin: auto;}</style>
<center><img src="img/5/5-1-3-MemoryHierarchy.png" ch="500" /></center>
<center>图1-5-1. (<a href="">图片引用</a>)</center>

图1-5-1. 内存层次结构(Memory Hierarchy)[图片引用](https://diveintosystems.org/book/C11-MemHierarchy/mem_hierarchy.html)
在图中我们看到传统的内存层次结构问题总结中没有覆盖GPU和AI加速器,我们可以通过PCIe总线将AI加速器与当前已有体系结构互联,让计算机利用AI加速器加速模型的训练与推理。
Expand All @@ -151,14 +159,18 @@ ret; // 返回
- GPU L1, L2缓存:
- 片上缓存较小,对算子内计算负载进行切片以及访存调度优化是减少缓存失效是常见思路。深度学习编译器关注循环(Loop)的块(Tile)优化很大程度上因为缓存较小引起。
- 缓存预取(Prefetch)指令设计:例如在NVIDIA GPU的PTX指令中,提供缓存预取指令,此例子通过预取指令加载数据到L2缓存["```ld.global.L2::64B.b32 %r0, [gbl]; // Prefetch 64B to L2```"](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html)。

<style>table{margin: auto;}</style>
<center><img src="img/5/5-1-1-gpumem.png" ch="500" width="400" height="300" /></center>
<center>图1-5-2. GPU缓存与GPU内存数据传输(<a href="">图片引用</a>)</center>

图1-5-2. NVIDIA GPU架构与内存层次结构[图片引用](https://docs.nvidia.com/deeplearning/performance/dl-performance-gpu-background/index.html)

- GPU显存DRAM(与主存通过PCIe总线互联):
- GPU显存和主存之间通常传输的是批次(Batch)数据和模型。可以利用深度学习模型对批次数据的访问时间局部性做相应优化,例如可以通过[vDNN](https://dl.acm.org/doi/10.5555/3195638.3195660)等方式对假设已知访存模式情况下的数据预取与卸载。
<center><img src="img/5/5-1-2-host_device.png" ch="500" /></center>

<style>table{margin: auto;}</style>
<center><img src="img/5/5-1-2-host_device.png" ch="500" width="600" height="300" /></center>
<center>图1-5-3. 主机和GPU之间的数据传输 (<a href="">图片引用</a>)</center>

图1-5-3. GPU显存和主存关系[图片引用](https://www.telesens.co/2019/02/16/efficient-data-transfer-from-paged-memory-to-gpu-using-multi-threading/)
- 主存:
Expand All @@ -183,6 +195,10 @@ ret; // 返回

**线性代数**:大部分的深度学习算子可以抽象为线性代数运算。其较少的控制流,并且大量的矩阵乘等计算让硬件可以通过单指令多数据流(SIMD)进行指令流水线精简设计,并将更多的片上资源用于计算。或者在更高的层次上通过多卡或分布式计算方式进行加速。这种特性的应用我们将在1.3.5中进行总结。同时我们也看到,由于矩阵计算早在几十年前在科学计算与高性能计算(HPC)领域有过大量的成熟研究,在深度学习系统领域也有很多工作会借鉴并优化传统科学计算与高性能计算领域的系统设计与开源组件。

<style>table{margin: auto;}</style>
<center><img src="img/5/5-1-4-sisd-simd.png" ch="500" width="600" height="300" /></center>
<center>图1-5-4. SISD对比SIMD (<a href="">图片引用</a>)</center>

**缺陷容忍**:在学术界, 神经网络芯片在2010年左右开始萌芽。ISCA 2010上,来自法国国立计算机及自动化研究院(INRIA Saclay)的Olivier Temam教授做了["The Rebirth of Neural Networks"](https://pages.saclay.inria.fr/olivier.temam/homepage/ISCA2010web.pdf)的报告,指出了指出ANN(Artificial neural network)的缺陷容忍(Defect Tolerance)特点,并利用这种特点后续开启了一系列的神经网络加速器工作,其中和中科院计算所合作的DianNao系列加速器工作也曾多次获得奖项并商业化。这种缺陷容忍(Defect Tolerance)特点的利用不仅在芯片领域,目前已经拓展到软件层,在计算框架,编译器等部分也常常被作为更为激进优化方式的动机,例如,稀疏,量化,模型压缩等优化。

例如,我们可以在深度学习系统的以下相关领域关注到这类特性假设的应用。
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified Textbook/第1章-人工智能系统概述/img/5/5-1-1-gpumem.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
- [7.1 异构计算集群管理系统简介](#71-异构计算集群管理系统简介)
- [7.1.1 多租环境运行的训练作业](#711-多租环境运行的训练作业)
- [7.1.2 作业生命周期](#712-作业生命周期)
- [小节与讨论](#小节与讨论)
- [小结与讨论](#小结与讨论)
- [参考文献](#参考文献)

## 7.1.1 多租环境运行的训练作业


<style>table{margin: auto;}</style>
<center><img src="./img/1/7-1-1-jobsubmission.png" ch="700" width="600" height="400" /></center>
<center>图7-1-1. 多租环境提交运行作业</center>

Expand Down Expand Up @@ -50,7 +50,7 @@


接下来,让我们先了解一下,一个深度学习作业,在平台上是如何提交并执行的,也就是作业的生命周期。

<style>table{margin: auto;}</style>
<center><img src="./img/1/7-1-2-cluster.png" ch="500" width="600" height="400"/></center>
<center>图7-1-2. GPU集群</center>

Expand Down
Loading