为什么要进行并行训练:
模型越来越大,单张显卡张不下
三种并行方式
数据并行,流水线并行,张量并行
数据并行(DP)
原理:
假设我们有 4 张显卡。我们把完整的模型复制 4 份,分别放在 4 张卡上。 然后,如果我们的一批数据(Batch Size)是 32,我们就把它切成 4 份,每张卡领 8 条数据。
总结:其实就是将数据进行了切分,多个模型共同处理大批数据
流程:
1、 每张卡独立进行前向传播(Forward)和反向传播(Backward)。
2、 计算出各自的梯度。
3、关键步骤: 所有显卡之间进行通信,把大家的梯度加起来取平均,所有卡使用相同的平均梯度更新参数,保证模型权重始终一致,保证大家的模型更新方向是一致的。
总结:每张卡独立前向反向传播,但是在更新梯度时,需要把所有模型的梯度进行相加求和取平均,每张卡的模型使用平均梯度进行更新,保持一致。
局限性与进阶
- 局限:它假设单张显卡的显存能装下整个模型。对于 70B+ 的大模型,单卡直接 OOM (Out Of Memory)。
- 进阶技术 (ZeRO):DeepSpeed 的 ZeRO 系列(零冗余优化器)是对 DP 的改进。它不仅切分数据,还将优化器状态 (Optimizer States)、梯度 (Gradients) 甚至参数 (Parameters) 切分到不同卡上,从而大幅降低单卡显存占用。
流水线并行(PP,我感觉我更想叫管道并行,也就是模型切分)
原理:
LLM 本质是 Transformer Layer 的深层堆叠(例如 GPT-3 有 96 层)。
- 纵向切分:将模型的层切开。例如,GPU 0 负责第 1-8 层,GPU 1 负责第 9-16 层,以此类推。
流程
数据像流水线上的产品一样流动:
- GPU 0 接收 Input,计算前几层,得到中间结果 (Activations)。
- GPU 0 将结果发送给 GPU 1。
- GPU 1 继续计算... 直到最后一个 GPU 输出 Loss。
- 反向传播时,梯度按相反方向回传
这就像工厂流水线:
- GPU 0 是做“初级特征提取”的工人。
- GPU 1 是做“中级语义理解”的工人。
- GPU 2 是做“分类头/生成”的工人、
痛点
最朴素的 PP 效率很低。当 GPU 0 在工作时,下游的 GPU 都在空闲等待。
解决方案:1F1B (One Forward One Backward) 策略。将一个大 Batch 切成很多微批次,让前后向计算交错进行,尽量填满空闲时间。
1F1B具体解决原理及流程请见
张量并行
原理:
这是最“硬核”的切分方式。LLM 的计算核心是矩阵乘法 Y=X·W
- 横向/纵向切分:不切分层数,而是把每一层内部巨大的权重矩阵 W撕开。
- Transformer 特性:例如 Multi-Head Attention 有 32 个头,可以让 GPU 0 算前 16 个头,GPU 1 算后 16 个头。
工作流程:
- 输入 X 复制到两张卡上。
- GPU 0 计算 X·Wpart1,GPU 1 计算 X·Wpart2。
- All-Reduce (高频通信):每一层计算结束,必须立刻通信,将两部分结果拼起来(或相加),才能进入下一层的计算。
局限性:
通信量巨大! 因为每一层 Layer 都要通信,所以 TP 通常仅限于同一台机器内部(通过 NVLink 连接)使用,跨机器使用 TP 会导致通信瓶颈,严重拖慢速度。
总结:张量并行意味着把模型权重分别放在不同的GPU上,这也就是意味着把模型撕开了,不是按层分开放,而是把层给撕了,也就是两张卡拼起来才是模型的一个层,这更加友好于矩阵,因为可以拆开嘛
具体详情请看
3D并行
在实际的千亿参数模型 (如 Llama-3-70B, GPT-4) 训练中,我们通常混合使用这三种策略:
- 单机内部:使用 TP (利用 NVLink 高带宽)。
- 机器之间:使用 PP (利用网线/Infiniband,减少通信量)。
- 整体扩展:在上述基础上复制多组,使用 DP (增加吞吐量)。
我自己画了一张图方便理解,如果又画的不对的地方,请大家批评指正。

具体详情看
536

被折叠的 条评论
为什么被折叠?



