跳到主要内容

数据并行(DP、DDP)

要解决的问题

单卡显存无法放下 billion 级参数,但同一份模型权重可在多卡上处理不同 micro-batch,通过同步梯度等价于更大 batch 训练。数据并行(Data Parallelism, DP)是最基础的分布式维度,理解它是掌握 DDP、ZeRO、FSDP 的前提。

核心概念

KK 个 GPU,每卡样本 batch BlocalB_{\text{local}},全局 batch:

Bglobal=KBlocalGaccB_{\text{global}} = K \cdot B_{\text{local}} \cdot G_{\text{acc}}

GaccG_{\text{acc}}梯度累积 步数。

DDP(DistributedDataParallel):每卡前向/反向,AllReduce 平均梯度 gˉ=1Kkgk\bar{g} = \frac{1}{K}\sum_k g_k,各卡同步更新相同权重。

方式通信量/步显存/卡
DP(朴素)全参数+优化器
DDP2×2\times 参数量梯度全参数+优化器
ZeRO/FSDP分片后更低见 3.5.4/3.5.6

方法/算法

训练一步:

  1. 各卡 backward() 得本地梯度 gkg_k
  2. torch.distributed.all_reducegkg_k 求和并除以 KK
  3. 优化器 step 更新 θ\theta(各卡 θ\theta 保持一致);
  4. 梯度累积:前 Gacc1G_{\text{acc}}-1 步可不同步或局部累积,最后一步再 AllReduce。

注意 BatchNorm(若存在)需 SyncBN;LLM 多用 LayerNorm/RMSNorm 无此问题。

工程实践

  • 启动torchrun --nproc_per_node=K train.py;环境变量 MASTER_ADDR/PORT
  • 数据DistributedSampler 保证 epoch 内样本不重复。
  • 性能:通信与计算重叠(gradient_as_bucket_view=True、bucket 大小调优)。
  • 瓶颈:当模型极大,显存先于通信成为瓶颈 → ZeROFSDP
  • 与 TP/PP3.5.5 3D 并行 组合使用。

代表工作

局限与注意点

  • 线性扩展上限KK 过大时通信占比上升,见 3.5.7
  • 有效 batch:过大 BglobalB_{\text{global}} 可能需调学习率(线性缩放规则 ηB\eta \propto B 仅近似成立)。
  • 随机性:不同 KK 下 RNG 与 sampler 需固定以复现。
  • 单卡调试:先在 1 GPU 跑通再开 DDP,避免 NCCL 错误难排查。

延伸说明

增大 BglobalB_{global} 时尝试线性缩放 LR,并用 warmup 验证稳定性。

实践检查清单

  • AllReduce
  • DistributedSampler
  • no_sync

小结

本节核心:AllReduce 与全链路 DistributedSampler 协同;上线前用检查清单做回归。

相关章节