generated from datawhalechina/repo-template
-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #7 from AmourWaltz/parallelism-byxue
7.24
- Loading branch information
Showing
22 changed files
with
172 additions
and
155 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
## 数据并行 | ||
|
||
数据并行算法主要是用于大模型的训练过程,即使用多个计算节点并行训练同一个模型的参数,同时不同节点之间相互通信聚合更新梯度信息,从而提高大模型数据处理的并行度。而大模型推理的数据并行则实现较为简单,如下图所示,在每个计算节点上复制一份完整模型,并将输入数据分成不同 batch 送入不同节点,各计算节点独立完成推理,输出对应的结果。但这种方法由于需要在每台机器上都复制一遍完整模型,因此内存利用率较低,并且如今的大模型通常都为百亿级别的参数规模,单张 GPU 无法加载整个模型,因此数据并行无法单独适用,于是引出模型并行的方法。 | ||
|
||
![alt text](image.png) | ||
|
||
![alt text](image-1.png) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
## 流水线并行 | ||
|
||
|
||
由于当前主流大模型的规模超出单块 GPU 的内存,因此需要将模型分布在不同设备上,这也称为模型并行方法。模型并行方法有两种:流水线并行和张量并行。这里首先介绍流水线并行,如下图所示,流水线并行将模型按层划分到不同 GPU 上,在各层之间并行地执行各自前向计算。 | ||
流水线并行的过程以下图为例,假设一个神经网络模型共有四层神经元,我们可以将其切分成两个层,分并别放置到两个不同的计算节点中进行计算,在计算过程中,输入数据input先进入到第一个计算节点Rank 0 中,等计算完毕后,再通过通信将Rank 1计算得到的数据结果传输到第二个计算节点 Rank 1中,再进行 Rank 1 所存储网络层的前向计算。 | ||
|
||
![alt text](image-2.png) | ||
|
||
|
||
但这种流水线并行有着明显的缺点:后续的计算节点 Rank 1 在 Rank 0 还没处理完数据的时候会一直处于闲置状态,直到Rank 0 计算节点传来数据,这使得整个计算过程中设备利用率较低,被称为 Bubble 问题。Bubble问题指的是在运行过程中有GPU闲置导致资源浪费的情况,顾名思义,其在整个流程看起来像是一个拱起来的气泡。以上图为例子,假设当前的运行的大模型被分成4个层,且将这4个层分布式的部署在4台GPU设备上,在整个推理过程中,后面阶段的层需要等待前面阶段的层执行完毕后才能继续往下执行,在这个过程中会出现设备闲置的情况。 | ||
|
||
![alt text](image-3.png) | ||
|
||
为了使得流水线并行中的设备利用率达到最佳,流水线并行的调度方式应当让每个阶段的执行时间应尽可能平衡。当当前节点处理完数据后,应当立即有后续数据可以处理,而非让设备限制着。该方式只在相对同构的模型(如 Transformers)中实现起来较为容易,因为其网络模型大多数层的大小通常相同,但在其他模型(如 Resnets 或 UNets)中实现则很困难。 | ||
|
||
![alt text](image-4.png) |
Oops, something went wrong.