CS231n-10-11
Early Fusion & Late Fusion & 3D CNN
2D Conv VS 3D Conv
1
2
对2D而言,卷积层只需要在xy方向上移动
而对3D,卷积层还需要再z方向上移动

1 | 对2D而言,卷积层只需要在xy方向上移动 |
DP
就是数据的分批放入不同的GPU上相同参数的模型上
然后用平均梯度等来反向传播
FSDP (Fully Sharded Data Parallelism) 工作流程详解
示意图
## 摘要
FSDP (完全分片数据并行) 是一种先进的分布式训练技术,旨在解决标准数据并行 (Data Parallelism) 中模型大小受限于单张GPU显存的瓶颈。其核心思想是将模型的参数 (Parameters)、梯度 (Gradients) 和优化器状态 (Optimizer States) 全部“切分”(Shard) 到所有参与训练的GPU上。每个GPU只负责持有和更新模型的一部分,从而使得集群能够训练远超单卡内存容量的巨型模型。
核心流程
FSDP的训练过程可以分解为前向传播 (Forward Pass) 和反向传播 (Backward Pass) 两个主要阶段。
1. 前向传播 (Forward Pass)
对于模型中的第 i 层,其权重为 ,前向传播的步骤如下:
-
[All-Gather]收集权重:- 在计算第
i层之前,拥有权重 的那个GPU会将其广播给集群中所有其他的GPU。 - 所有GPU接收到分片后,在本地 reconstruct (重构) 出完整的权重 。
- 在计算第
-
[Compute & Discard]计算并丢弃:- 所有GPU利用刚刚重构出的完整权重 和它们各自的数据分片 (minibatch slice),独立执行第
i层的前向计算。 - 计算完成后,为了最大限度地节省内存,每个GPU会立即删除临时的权重副本 (属主GPU除外)。
- 所有GPU利用刚刚重构出的完整权重 和它们各自的数据分片 (minibatch slice),独立执行第
🚀 性能优化 #1 (预取):
为了隐藏通信延迟,系统会在使用 进行计算的同时,在后台异步地开始为下一层(第i+1层)收集权重 。这种计算与通信的重叠是FSDP保持高效的关键。💡 性能优化 #2 (末层保留):
在前向传播的最后,最后一层的权重不会被立即删除。因为反向传播紧接着就会从这一层开始,需要用到它,这样就避免了一次不必要的“删除-再获取”操作。
2. 反向传播 (Backward Pass)
当整个前向传播完成后,会从模型的最后一层开始,逐层进行反向传播来计算梯度和更新权重。对于第 i 层:
-
[All-Gather]再次收集权重:- 为了计算梯度,我们同样需要该层的权重。因此,和前向传播类似,属主GPU再次将 广播给所有GPU。
-
[Compute]计算本地梯度:- 所有GPU利用权重 和前向传播中保存的中间激活值,计算出关于 的本地梯度 (local gradient) 。
- 计算完成后,临时的权重副本 再次被删除以释放内存。
-
[Reduce-Scatter]聚合梯度并分发:- 所有GPU将它们计算出的本地梯度 发送给拥有 的那个属主GPU。
- 在此过程中,梯度会被聚合(通常是求和)。操作完成后,属主GPU得到了最终的、全局同步的梯度 。
- 其他非属主的GPU在发送完自己的本地梯度后,会将其从内存中删除。
-
[Update]属主更新权重:- 拥有 的属主GPU,利用聚合后的全局梯度 ,更新其负责的优化器状态,并最终更新它所持有的权重分片。
🚀 性能优化 #3 (反向传播重叠):
反向传播过程也充满了计算和通信的重叠。例如,当GPU正在为第i-1层计算梯度时,系统可以同时将在第i层计算好的梯度发送回它的属主GPU,并由属主GPU在后台执行权重更新操作。
总结
| 特性 | 标准数据并行 (Data Parallelism) | 完全分片数据并行 (FSDP) |
|---|---|---|
| 模型存储 | 在每个GPU上完整复制 | 将模型切分到所有GPU上 |
| 内存瓶颈 | 受限于单张GPU的显存 | 受限于所有GPU的总显存 |
| 通信内容 | 仅在每次迭代后同步一次梯度 | 每层的前向/反向传播都需要通信权重和梯度 |
| 通信频率 | 低 | 高,但通过与计算重叠来优化 |
| 适用场景 | 模型可放入单卡,希望通过数据并行加速 | 模型巨大,无法放入单卡 |
FSDP通过一种精巧的“以通信换空间”的策略,有效地打破了硬件对模型规模的限制,是当今训练超大规模AI模型的基石技术。
Hybrid Sharded Data Parallel(HSDP)
就是分组的FSDP和DP的结合,这边不再过多赘述
Activation checkpointing
- 不保存所有中间的激活值,而是在反向传播的时候重新计算
- 内存与计算之间的权衡: 计算, 内存
标准训练过程中的内存
- 前向传播 (Forward Pass): 模型从输入开始,逐层计算,直到最终输出。在这个过程中,每一层的输出,即激活值 (Activations),都必须被保存在GPU内存中。
- 反向传播 (Backward Pass): 计算损失函数对模型参数的梯度。关键在于,计算第
i层的梯度 时,不仅需要从上层传回的梯度 ,还需要该层在前向传播时产生的激活值 。数学上表示为:
这个依赖关系意味着,从第一层到最后一层所有中间激活值都必须保存下来,需要 的内存,通常是很大的。
改进方法
想法一
在每次反向传播需要第i层激活值的时候重新计算,内存此时需要 ,但此时计算需要
想法二
设立检查点,每隔C层进行一次检查点 计算, 内存
3. 总结与对比
| 策略 (Strategy) | 计算复杂度 (Compute) | 内存复杂度 (Memory) | 核心思想 |
|---|---|---|---|
| 标准训练 | 存储所有激活值,计算最快,内存最高。 | ||
| 完全重计算 | 只存输入,计算最慢,内存最低。 | ||
定期 C 个检查点 |
在计算和内存之间进行灵活权衡。 | ||
| 平方根检查点 | 理论上在计算和内存之间达到最优平衡。 |
四种主流GPU并行训练策略总结
在训练大型神经网络时,模型通常操作的张量(Tensor)形状为 (Batch, Sequence, Dim),并且模型自身有 L 层。不同的并行策略通过切分不同的维度来将计算任务分配到多个GPU上。
| 并行策略 (Strategy) | 核心思想 (Core Idea) | 切分维度 (Split Dimension) | 主要优点 (Key Advantage) | 主要缺点/代价 (Main Disadvantage/Cost) |
|---|---|---|---|---|
| 数据并行 (DP) | 每个GPU上都有一个完整的模型副本,但处理不同批次的数据。 | Batch (批次) | 实现最简单,通用性强,能有效加速训练。 | 模型大小受限于单张GPU的显存;梯度同步有通信开销。 |
| 上下文并行 (CP) | 将一个超长的序列切分到不同GPU上进行处理。 | Sequence (序列) | 能够处理因序列过长而导致单卡显存不足的问题。 | 注意力机制的计算需要复杂的跨GPU通信(如Ring Attention)。 |
| 流水线并行 (PP) | 将模型的不同层切分到不同GPU上,形成一条流水线。 | L layers (模型层) | 能够训练因模型层数/参数量过大而无法放入单卡的模型。 | 存在“流水线气泡”导致的GPU空闲,需要微批次来优化。 |
| 张量并行 (TP) | 将模型单层内的巨大参数矩阵(如MLP)切分到不同GPU上协同计算。 | Dim (特征/隐藏层) | 降低了单层内的峰值内存,能加速巨型层的计算。 | 需要极高的GPU间通信带宽(如NVLink),通信非常频繁。 |
总结
如何选择?最终的答案:组合使用
正如幻灯片中提到的:
Q: 训练超大模型时该用哪一个?
A: 全部都要!(All of them!)
在实践中,训练最前沿的大语言模型(LLMs)并不会只选用其中一种策略,而是将它们组合起来,形成一个混合并行 (Hybrid Parallelism) 方案,以同时解决不同层面的瓶颈。
一个典型的组合方案可能是:
- 节点内使用张量并行 (Intra-node TP): 在一台拥有8个高速互联(如NVLink)GPU的服务器内部,使用张量并行来切分模型的每一层,共同完成矩阵运算。
- 节点间使用流水线并行 (Inter-node PP): 将整个模型的几十上百层切分到多台服务器(节点)上,每台服务器负责流水线的一个阶段。
- 全局使用数据并行 (Global DP): 将上述整个流水线复制多份,构成一个数据并行的副本。这样就可以用更大的全局批次来进行训练,进一步提升吞吐量。
- 按需使用上下文并行 (CP when needed): 当需要处理的序列长度突破了单卡的极限时,再引入上下文并行来切分序列维度。