Skip to content

Commit 046222f

Browse files
committed
Fix ch8 & ch9
1 parent d8ba03c commit 046222f

File tree

11 files changed

+479
-480
lines changed

11 files changed

+479
-480
lines changed

docs/_sidebar.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
* [8.4 张量并行](chapter8/chapter8_4.md)
3636
* [8.5 并行总结](chapter8/chapter8_5.md)
3737
* 第9章 并发
38-
* [9.1 并发](chapter9/chapter9_0.md)
39-
* [9.2 异步](chapter9/chapter9_1.md)
40-
* [9.3 批处理](chapter9/chapter9_2.md)
41-
* [9.4 分布式](chapter9/chapter9_3.md)
38+
* [9.1 并发](chapter9/chapter9_1.md)
39+
* [9.2 异步](chapter9/chapter9_2.md)
40+
* [9.3 批处理](chapter9/chapter9_3.md)
41+
* [9.4 分布式](chapter9/chapter9_4.md)
4242
* 第10章 内存
4343
* [10.1 KV-Cache](chapter10/chapter10_1.md)
4444
* [10.2 PagedAttention](chapter10/chapter10_2.md)

docs/chapter8/chapter8_1.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
# 并行
1+
# 8.1 并行
22

3-
## 概述
3+
## 8.1.1 概述
44

55
如今的大语言模型虽然与传统预训练模型采用了相似的网络架构以及训练方法,但其通过扩展模型参数规模、训练数据量以及算力资源等方法,实现了模型性能的质变。为了提高大语言模型的推理效果,科研人员需要使用更大规模的模型并提供更多的训练数据,因此用于训练算力资源也会随之增加。当前主流的大模型如 ChatGPT 等都是在成百上千块 GPU 上训练的。为了进一步高效且经济地加速大模型训练推理,大模型的并行方法就成了人工智能领域越来越关注的重点。本文将介绍几种大模型部署中常用的并行方法。

docs/chapter8/chapter8_2.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 数据并行
1+
# 8.2 数据并行
22

33
数据并行算法主要是用于大模型的训练过程,即使用多个计算节点并行训练同一个模型的参数,同时不同节点之间相互通信聚合更新梯度信息,从而提高大模型数据处理的并行度。而大模型推理的数据并行则实现较为简单,如下图所示,在每个计算节点上复制一份完整模型,并将输入数据分成不同 batch 送入不同节点,各计算节点独立完成推理,输出对应的结果。但这种方法由于需要在每台机器上都复制一遍完整模型,因此内存利用率较低,并且如今的大模型通常都为百亿级别的参数规模,单张 GPU 无法加载整个模型,因此数据并行无法单独适用,于是引出模型并行的方法。
44

docs/chapter8/chapter8_3.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 流水线并行
1+
# 8.3 流水线并行
22

33

44
由于当前主流大模型的规模超出单块 GPU 的内存,因此需要将模型分布在不同设备上,这也称为模型并行方法。模型并行方法有两种:流水线并行和张量并行。这里首先介绍流水线并行,如下图所示,流水线并行将模型按层划分到不同 GPU 上,在各层之间并行地执行各自前向计算。

docs/chapter8/chapter8_4.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
2-
## 张量并行
1+
# 8.4 张量并行
32

43
与流水线并行不同,张量并行是将模型中的张量进行拆分然后分配到不同的 GPU 上,每块 GPU 都可以得到所有层张量的部分参数。这样在前向计算中有效减少了流水行并行中的空置时间,提高了 GPU 的显存利用率,因此张量并行也成了当下大模型训练和推理的主流并行方法。显存效率:模型并行会根据 worker 数量成比例地减少显存使用量。至关重要的是,这是减少单个网络层的激活显存的唯一方法。DeepSpeed 通过在模型并行 worker 之间划分激活显存来进一步提高显存效率。 计算效率:由于每次前向和反向传播中都需要额外通信激活值,模型并行的计算效率很低。模型并行需要高通信带宽,并且不能很好地扩展到通信带宽受限的节点。此外,每个模型并行worker 都会减少每个通信阶段之间执行的计算量,从而影响计算效率。模型并行性通常与数据并行性结合使用,以在内存和计算效率之间进行权衡。
54

6-
### 1D 张量并行
5+
## 8.4.1 1D 张量并行
76

87
从实现上看,张量并行就是把同一层的参数矩阵分块进行相互独立的矩阵乘法计算,然后合并结果,通过不同 GPU 之间的通信,保证计算图的正确性。对一个单独的矩阵,我们可以很自然想到基于行和列进行拆分,称为行并行和列并行。
98
如图 (a) 所示,以一般矩阵乘法为例,假设我们有 $Y=XW$ ,其中 $X\in\mathbb R^{2\times2}$ 为输入数据,$W\in\mathbb R^{2\times2}$ 为参数矩阵,在两块 GPU 上进行并行计算,输入数据 $X$ 与权重向量 $W$ 进行矩阵相乘时,计算行列对之间的点积是相互独立的。列并行就是将权重参数 $W$ 沿列分割成 $W=[W_0\ W_1]$,每块 GPU 持有一列参数 $W_0, W_1 \in \mathbb R^{2\times1}$,如图 (b) 所示,我们将 $X$ 分别输入 rank 0 和 rank 1 的 GPU 上,然后与 GPU 上的参数进行矩阵相乘,我们将得到 $Y_0, Y_1$ ,然后通过一次拼接操作就可以得到和 (a) 等价的 $Y$。而行并行则是将 $W$ 沿行进行切分 $W=[W_0 \ W_1]^{\mathrm T}$ 放置,每块 GPU 持有一行参数 $W_0, W_1 \in \mathbb R^{1\times2}$ ,然后将输入 $X$ 也沿列切分为 $X_0, X_1 \in \mathbb R^{2\times1}$ 并输入到两块 GPU 上分别进行矩阵乘法运算得到 $Y^\prime,Y^{\prime\prime}\in\mathbb R^{2\times 2}$ ,然后按元素位置相加 $Y^\prime+Y^{\prime\prime}$ 也可以得到等价的 $Y$。
@@ -29,7 +28,7 @@ Embedding的划分也分为两种策略:按行划分(即,以vocabulary size
2928
当以hidden size维度进行划分时,则是每个节点中存储词表的一部分,例如对于hidden size为128的,可以分为两个节点,第一个节点存储weight[:][0:63],第二个节点存储weight[:][64-127],embedding时将两个节点的结果进行AllGather得到最终结果。
3029
这种划分策略主要用在推荐系统领域,因为推荐系统每个输入进行embedding时,会有很多的特征,也就是说hidden size很大,所以这种划分方式会更高效一些。
3130

32-
### 2D 张量并行
31+
## 8.4.2 2D 张量并行
3332

3433
Nvidia Megatron-LM 使用的是 1D 张量并行,这种方法虽然将参数划分到多个处理器上,但每个处理器仍需要存储整个中间计算图结果,在每次计算中,每块 GPU 都需要与其他设备通信,在处理大模型时会浪费大量显存空间,通信成本会不断增加。对此,Colossal-AI 提供多维张量并行,与传统的分布式矩阵乘法相比,这些技术更节省内存和通信成本,适用于各种硬件规格。这里先介绍 2D 张量并行。2D 张量并行技术将输入数据、模型权重和层输出拆分成两个维度,与 1D 张量并行相比,内存消耗更低。对于一个 2×2 的矩阵乘法,假设我们有 4 块 GPU,那就可以将矩阵乘法分块到每块 GPU 上。将输入 $X$ 和参数 $W$ 进行如下分块 $X=[X_0\ X_1], W=[W_0\ W_1]^{\mathrm T}$,首先在 Step 1 进行 $X_0$ 与 $W_0$ 的矩阵乘法,将4 个算子分配到 4 块 GPU 上进行计算,同样,Step 2 进行 $X_1$ 与 $W_1$ 的运算,最后将两步的计算结果相加,便得到最终结果。
3534

@@ -103,7 +102,7 @@ print_rank_0(f'Input: {x.shape}')
103102
x = m(x)
104103
```
105104

106-
### 3D 张量并行
105+
## 8.4.3 3D 张量并行
107106

108107
3D 张量并行是一种更高级的并行技术,当扩展到更多设备时,3D 张量并行相比 1D 和 2D 张量并行可进一步减少内存和通信成本。3D 张量并行技术将张量分割成立方体形状,并对第一个和最后一个维度进行划分。对于矩阵乘法 $Y=XW$,给定 $2\times2\times2=8$个处理器,我们把输入 $X$ 和权重 $W$ 分别划分为 $[X_{000}\ X_{001}\ X_{010}\ X_{011}\ X_{100} \ X_{101}\ X_{110} \ X_{111}]$ 和 $[W_{000}\ W_{001}\ W_{010}\ W_{011}\ W_{100} \ W_{101}\ W_{110} \ W_{111}]$,假设 $a,b,c$分别代表矩阵的三个维度,每个 $X_{abc}$ 和 $W_{cba}$ 都被存储在 $(a,b,c)$ 的节点上,每个节点上的操作如下表所示
109108

docs/chapter8/chapter8_5.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
## 总结
1+
# 8.5 总结
22

33
张量并行是一种大模型可靠的并行方法。它将模型参数矩阵分成更小的部分,减少了通信时间,使训练和推理都更加高效。虽然张量并行解决了由模型数据造成的内存瓶颈,但它的实现和优化也更具挑战性。

docs/chapter9/chapter9_0.md

Lines changed: 0 additions & 153 deletions
This file was deleted.

0 commit comments

Comments
 (0)