大模型通信笔记1

流水线并行

朴素层并行

朴素层并行,将模型拆分为多个层,放在不同的GPU上执行
但是问题很明显:

  • GPU利用率低:任意时刻只有一个GPU在工作,其他GPU都在等待结果
  • 计算和通信没有重叠
  • 显存占用高,GPU1需要保存所有激活。等待参数更新完成

GPipe

Gpipe将整个minibatch分为4个microbatch,然后由GPU0进行计算,之后每个microbatch计算完直接传递给GPU1,以此类推,进行整个前向、反向传播。
假设pipeline深度n,microbatch数量m,那么浪费的时间占比为:
$$
1-\frac{m}{m+n-1}
$$
所以需要增加microbatch数量m
Gpipe在计算过程中,把中间激活用完即弃,因此节省了显存,但是增加了计算代价。

PipeDream

PipeDream在GPipe的基础上,在每个microbatch前向结束后就开始反向传播,节省了一些显存,bubble和Gpipe是一样的

数据并行可以和流水线并行同时进行

对任意给定GPU,有两个通信部份,一部分包含所有相同层GPU进行All_Reduce(数据并行)。另一部分和上下层进行通信(流水线)。

张量并行

张量并行分为两种情况:列划分行划分
列划分:
$$
XA = X[A_1,A_2···A_n]=[XA_1,XA_2,···,XA_n]
$$

行划分:

$$
\mathbf{x}*A = \begin{bmatrix} x_1 & x_2 & \cdots & x_n \end{bmatrix} * \begin{bmatrix}A_1\A_2\A_3\··· \A_n\end{bmatrix}=X_1A_1+X_2A_2+X_3A_3···
$$

对列并行来说,由于GeLU函数并不是线性的,因此需要在输出前进行一次通信来合并。

2D并行

具体来说,两个矩阵的结果仍然需要串行的计算。但是,单个矩阵中的4个子矩阵可以使用2*2的处理器来并行计算。

2.5D并行

这个就是在2D并行的基础上,左矩阵为两个2*2矩阵垂直拼接,那么这两个矩阵是可以分开计算的,所以可以8处理器并行计算。

3D并行

流水线+数据+张量并行

首先,每个节点8个GPU,共两个节点

8个GPU,分为两组,每组负责一个Layer,一共四个组进行流水线并行。
每个组内,用两张卡进行张量并行,一个组分为两个张量小组。一个张量小组负责一个具体的张量运算。
对于两个张量小组之间,分享同一个batch不同的数据,在计算结束后两个小组之间要进行all reduce通信。