模型并行
在数据并行训练中,一个明显的特点是每个 GPU 持有整个模型权重的副本。这就带来了冗余问题,因为最终你只需要一个更新后的模型权重。因此可以使用模型并行的训练方式,即模型被分割并分布在一个设备阵列上。
通常有两种类型的模型并行:张量并行和流水线并行。
张量并行是在一个操作中进行并行计算,如矩阵乘法。将单层内的张量操作拆分到多个 GPU 上,减少单卡内存压力。
流水线并行是在各层之间进行并行计算。将模型的不同层分布在不同设备上,通过 micro-batching 和交错调度减少 pipeline bubble(设备空闲时间)。
因此,从另一个角度来看,张量并行可以被看作是层内并行,流水线并行可以被看作是层间并行。

1 张量并行
张量并行的数学本质是对矩阵乘法 Y=XA 进行分块计算。主要分为两种基础切分方式:
1.1 行并行和列并行
1.1.1 行并行 (Row Parallelism)
切分逻辑:
权重 A 按行切分 ( A1,A2)。
输入 X 需按列切分 ( X1,X2) 以匹配维度。
计算过程:
GPU0: Y1=X1A1
GPU1: Y2=X2A2
最终结果: Y=Y1+Y2 (需要 All-Reduce 求和)
1.1.2 列并行 (Column Parallelism)
切分逻辑:
权重 A 按列切分 ( A1,A2)。
输入 X 在所有 GPU 上保持一致(复制/广播)。
计算过程:
GPU0: Y1=XA1
GPU1: Y2=XA2
最终结果: Y=[Y1,Y2] (拼接/Concat,需要 All-Gather)
2 张量并行的实现
2.1 1D 张量并行
1D的意思是张量全部按照某一维度进行划分(横切或者竖切)。1D张量并行是目前 Transformer 架构大模型最主流的方案,由 Megatron-LM 提出。
以一个线性层为例:
考虑一个线性层的 GEMM 运算:
给定2个处理器,我们将权重矩阵 A 按列划分为:
在每个处理器上独立计算:
最终得到:
这种划分方式称为列并行方式。
当第二个线性层 Z=YB 接在上述列并行层之后时,我们需要将 B 按行划分:
为计算:
计算过程分为两步(使用 stepper 表示顺序流程):
在后向计算中,列并行线性层需要聚合输入张量 X 的梯度。原因在于:
在每个处理器 i 上,我们仅持有部分输出梯度 Y˙i,因此本地计算得到:
为获得完整的输入梯度,必须在各处理器间执行 all-reduce 操作:
2.2 2D 张量并行
1D张量并行没有对 activations 进行划分,就大规模模型而言,这也会消耗大量的内存。为了平均分配计算和内存负荷,在 SUMMA(可扩展的通用矩阵乘法算法)的基础上,2D张量并行被引入。
还是以线性层为例:
给定 P = q × q 个处理器(必要条件),如 q = 2,我们把输入 X 和权重 A 都划分为:
该计算包括 q 步(使用 stepper 展示每个时刻的操作):
通过将第1步和第2步的结果相加,我们得到:
2.3 2.5D 张量并行
与一维张量并行相比,二维并行降低了内存成本,但可能引入更多的通信。因此,2.5D张量并行在2.5D SUMMA的基础上被提出,它通过使用更多的设备来减少通信开销。
以线性层为例:
Y=XA
给定 P = q × q × d 个处理器(必要条件),如 q = d = 2:
我们把输入 X 划分为 d × q 行和 q 列:
它可以被重塑为 d 层:
权重 A 被分割为:
对于 X 相关的每一层,我们使用 SUMMA 算法将 X 与 A 相乘。然后,我们得到输出:
第1层输出:
第2层输出:
2.4 3D 张量并行
3D张量并行是一种将神经网络模型的计算并行化,以期望获得最佳通信成本优化的方法。
以线性层为例:
给定 P = q × q × q 个处理器(必要条件),如 q = 2,我们把输入 X 和权重 A 划分为:
其中每个 Xijl 和 Alji 都被存储在处理器 (i,j,l) 上,如下图所示:

前向传播时的流程可以用 stepper 表示:
反向传播时:
需要 all-gather 梯度 Yijl˙
然后 reduce-scatter 梯度:
X 的梯度:Xil˙=Yij˙AljT
A 的梯度:Alj˙=XilTYij˙
3 流水线并行
流水线并行的核心思想是,模型按层分割成若干块,每块都交给一个设备。
在前向传播过程中,每个设备将中间的激活传递给下一个阶段。
在后向传播过程中,每个设备将输入张量的梯度传回给前一个流水线阶段。
这允许设备同时进行计算,从而增加训练的吞吐量。

4 流水线并行的实现
4.1 朴素流水线并行
原理:
假设我们有 4 个 GPU(GPU0 - GPU3),模型也被切分为 4 段。下面使用 stepper 展示数据在各 GPU 间的流动:

流水线并行训练的一个明显缺点是训练设备容易出现空闲状态(因为后一个阶段需要等待前一个阶段执行完毕),导致计算资源的浪费,加速效率没有数据并行高。

4.2 微批次流水线并行
为了解决“朴素并行”的空泡问题,引入了微批次(Micro-batch)的概念。
原理: 将一个大的全局 Batch(Global Batch)切分成多个小的 Micro-batch。
例如:Global Batch = 1024,切分成 4 个 Micro-batch,每个大小 256。
作用: GPU0 处理完 Micro-batch 1 后,立刻发送给 GPU1,紧接着 GPU0 可以马上处理 Micro-batch 2,而不需要等待。
这样,流水线就像工厂的传送带一样流动了起来,多个 GPU 可以同时工作。
基于“微批次”思想,可以设计不同的“调度策略”来平衡显存占用和计算效率:
调度模式
F … F → B … B
稳定期交替 1F → 1B
持续循环,无 Flush
限制版本的持续循环
显存占用 (激活值)
极高 (存 M 份)
低 (存 N 份,及时释放)
低
低
显存占用 (模型权重)
低 (1 份)
低 (1 份)
高 (多版本 stashing)
中 (固定 2 份)
权重更新语义
同步 SGD (准确)
同步 SGD (准确)
异步 SGD (有误差)
异步 SGD (有误差)
流水线空泡
较大 (取决于 M/N 比例)
与 GPipe 相同 (但在同显存下可跑更大 M,从而稀释空泡)
极小 / 无
极小
适用场景
教学、小模型
当前大模型训练主流 (LLaMA, GPT-3)
研究性质,追求极致吞吐
显存受限的异步训练
参考
Last updated