跳到主要内容

分布式训练

问题

大模型训练为什么需要分布式?数据并行和模型并行有什么区别?

答案

一、为什么需要分布式训练

单张 GPU 无法满足大模型训练需求:

模型参数量FP16 显存(仅模型)训练显存(含梯度+优化器)
7B7B14 GB~56 GB
70B70B140 GB~560 GB
405B405B810 GB~3.2 TB

训练需要存储的内容:模型参数 + 梯度 + 优化器状态(Adam 需要 2 份额外参数)。

二、并行策略

数据并行(DP)

每个 GPU 持有完整模型,数据分片:

GPU 0: 完整模型 + 数据 batch 0 → 梯度 0 ─┐
GPU 1: 完整模型 + 数据 batch 1 → 梯度 1 ─┼→ AllReduce → 同步更新
GPU 2: 完整模型 + 数据 batch 2 → 梯度 2 ─┘

张量并行(TP)

将单个层的计算分割到多个 GPU:

线性层 Y = XW,W 按列切分:
GPU 0: Y₀ = X × W₀
GPU 1: Y₁ = X × W₁
然后拼接 Y = [Y₀, Y₁]

流水线并行(PP)

将模型的不同层放到不同 GPU:

GPU 0: Layer 0-7   → 输出 →
GPU 1: Layer 8-15 → 输出 →
GPU 2: Layer 16-23 → 输出 →
GPU 3: Layer 24-31 → 最终输出

三、主流框架

框架维护方特点
DeepSpeedMicrosoftZeRO 优化器,功能最全
FSDPPyTorchPyTorch 原生,使用简单
Megatron-LMNVIDIA张量/流水线并行,超大模型

DeepSpeed ZeRO

ZeRO(Zero Redundancy Optimizer)分三个阶段减少显存冗余:

Stage分片内容显存节省
ZeRO-1优化器状态4x
ZeRO-2+ 梯度8x
ZeRO-3+ 模型参数N_gpu ×

四、3D 并行

大型训练通常组合使用多种并行策略:

例如 Llama 3 405B 训练使用 16K GPU:

  • 张量并行 = 8(同一节点 8 GPU)
  • 流水线并行 = 16(跨节点 16 段)
  • 数据并行 = 128(128 份数据)

常见面试问题

Q1: 数据并行和模型并行的区别?

答案

  • 数据并行:每个 GPU 有完整模型,数据分片。适合模型能放进单卡的情况
  • 模型并行:模型切分到多个 GPU,数据不分片。适合模型太大无法放入单卡
  • 实践中常组合使用

Q2: DeepSpeed ZeRO-3 和 FSDP 有什么区别?

答案

  • 二者原理相似:都是将参数、梯度、优化器状态分片到多个 GPU
  • DeepSpeed ZeRO-3:功能更多(offload 到 CPU/NVMe、更灵活的配置)
  • FSDP:PyTorch 原生,API 更简洁,不需要额外配置文件
  • 新项目推荐 FSDP(更轻量),需要 offload 等高级功能时用 DeepSpeed

相关链接