Early Fusion & Late Fusion & 3D CNN

Early Fusion vs Late Fusion

2D Conv VS 3D Conv

1
2
对2D而言,卷积层只需要在xy方向上移动
而对3D,卷积层还需要再z方向上移动

Early Fusion vs Late Fusion

DP

就是数据的分批放入不同的GPU上相同参数的模型上
然后用平均梯度等来反向传播

FSDP (Fully Sharded Data Parallelism) 工作流程详解

示意图

Early Fusion vs Late Fusion ## 摘要

FSDP (完全分片数据并行) 是一种先进的分布式训练技术,旨在解决标准数据并行 (Data Parallelism) 中模型大小受限于单张GPU显存的瓶颈。其核心思想是将模型的参数 (Parameters)梯度 (Gradients)优化器状态 (Optimizer States) 全部“切分”(Shard) 到所有参与训练的GPU上。每个GPU只负责持有和更新模型的一部分,从而使得集群能够训练远超单卡内存容量的巨型模型。


核心流程

FSDP的训练过程可以分解为前向传播 (Forward Pass) 和反向传播 (Backward Pass) 两个主要阶段。

1. 前向传播 (Forward Pass)

对于模型中的第 i 层,其权重为 WiW_i,前向传播的步骤如下:

  1. [All-Gather] 收集权重:

    • 在计算第 i 层之前,拥有权重 WiW_i 的那个GPU会将其广播给集群中所有其他的GPU。
    • 所有GPU接收到分片后,在本地 reconstruct (重构) 出完整的权重 WiW_i
  2. [Compute & Discard] 计算并丢弃:

    • 所有GPU利用刚刚重构出的完整权重 WiW_i 和它们各自的数据分片 (minibatch slice),独立执行第 i 层的前向计算。
    • 计算完成后,为了最大限度地节省内存,每个GPU会立即删除临时的权重副本 WiW_i (属主GPU除外)。

🚀 性能优化 #1 (预取):
为了隐藏通信延迟,系统会在使用 WiW_i 进行计算的同时,在后台异步地开始为下一层(第 i+1 层)收集权重 Wi+1W_{i+1}。这种计算与通信的重叠是FSDP保持高效的关键。

💡 性能优化 #2 (末层保留):
在前向传播的最后,最后一层的权重不会被立即删除。因为反向传播紧接着就会从这一层开始,需要用到它,这样就避免了一次不必要的“删除-再获取”操作。

2. 反向传播 (Backward Pass)

当整个前向传播完成后,会从模型的最后一层开始,逐层进行反向传播来计算梯度和更新权重。对于第 i 层:

  1. [All-Gather] 再次收集权重:

    • 为了计算梯度,我们同样需要该层的权重。因此,和前向传播类似,属主GPU再次将 WiW_i 广播给所有GPU。
  2. [Compute] 计算本地梯度:

    • 所有GPU利用权重 WiW_i 和前向传播中保存的中间激活值,计算出关于 WiW_i本地梯度 (local gradient) LlocalWi\frac{\partial L_{local}}{\partial W_i}
    • 计算完成后,临时的权重副本 WiW_i 再次被删除以释放内存。
  3. [Reduce-Scatter] 聚合梯度并分发:

    • 所有GPU将它们计算出的本地梯度 LlocalWi\frac{\partial L_{local}}{\partial W_i} 发送给拥有 WiW_i 的那个属主GPU。
    • 在此过程中,梯度会被聚合(通常是求和)。操作完成后,属主GPU得到了最终的、全局同步的梯度 LWi\frac{\partial L}{\partial W_i}
    • 其他非属主的GPU在发送完自己的本地梯度后,会将其从内存中删除。
  4. [Update] 属主更新权重:

    • 拥有 WiW_i 的属主GPU,利用聚合后的全局梯度 LWi\frac{\partial L}{\partial W_i},更新其负责的优化器状态,并最终更新它所持有的权重分片。

🚀 性能优化 #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

  • 不保存所有中间的激活值,而是在反向传播的时候重新计算
  • 内存与计算之间的权衡:O(N2/C)O(N²/C) 计算,O(C)O(C) 内存

标准训练过程中的内存

  • 前向传播 (Forward Pass): 模型从输入开始,逐层计算,直到最终输出。在这个过程中,每一层的输出,即激活值 (Activations),都必须被保存在GPU内存中。
  • 反向传播 (Backward Pass): 计算损失函数对模型参数的梯度。关键在于,计算第 i 层的梯度 GiG_i 时,不仅需要从上层传回的梯度 Gi+1G_{i+1},还需要该层在前向传播时产生的激活值 AiA_i。数学上表示为:

    Gi=Fi(Ai,Gi+1)G_i = \overleftarrow{F_i}(A_i, G_{i+1})

这个依赖关系意味着,从第一层到最后一层所有中间激活值都必须保存下来,需要 O(N)O(N) 的内存,通常是很大的。

改进方法

想法一

在每次反向传播需要第i层激活值的时候重新计算,内存此时需要 O(1)O(1) ,但此时计算需要 O(N2)O(N^2)

想法二

设立检查点,每隔C层进行一次检查点O(N2/C)O(N²/C) 计算,O(C)O(C) 内存

3. 总结与对比

策略 (Strategy) 计算复杂度 (Compute) 内存复杂度 (Memory) 核心思想
标准训练 O(N)O(N) O(N)O(N) 存储所有激活值,计算最快,内存最高。
完全重计算 O(N2)O(N^2) O(1)O(1) 只存输入,计算最慢,内存最低。
定期 C 个检查点 O(N2/C)O(N^2/C) O(C)O(C) 在计算和内存之间进行灵活权衡。
平方根检查点 O(NN)O(N\sqrt{N}) O(N)O(\sqrt{N}) 理论上在计算和内存之间达到最优平衡。

四种主流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) 方案,以同时解决不同层面的瓶颈。

一个典型的组合方案可能是:

  1. 节点内使用张量并行 (Intra-node TP): 在一台拥有8个高速互联(如NVLink)GPU的服务器内部,使用张量并行来切分模型的每一层,共同完成矩阵运算。
  2. 节点间使用流水线并行 (Inter-node PP): 将整个模型的几十上百层切分到多台服务器(节点)上,每台服务器负责流水线的一个阶段。
  3. 全局使用数据并行 (Global DP): 将上述整个流水线复制多份,构成一个数据并行的副本。这样就可以用更大的全局批次来进行训练,进一步提升吞吐量。
  4. 按需使用上下文并行 (CP when needed): 当需要处理的序列长度突破了单卡的极限时,再引入上下文并行来切分序列维度。