主流训练并行策略一锅炖

224 阅读15分钟

LLM训练并行策略全面解析

1. 数据并行(Data Parallelism)

1.1 传统数据并行(DataParallel - DP)

核心原理: 在多个GPU上复制完整模型,每个GPU处理不同的数据批次,然后同步梯度。

优点:

  • 实现简单,易于理解和部署
  • 对模型架构无需修改
  • 接近线性的扩展性(在一定规模内)

缺点:

  • 每个GPU必须存储完整模型副本,内存冗余严重
  • GPU 0成为瓶颈(需要聚合所有梯度)
  • 通信开销随模型大小增长
  • 单机多GPU限制,无法跨节点

1.2 分布式数据并行(DistributedDataParallel - DDP)

技术演进: 针对DP的GPU 0瓶颈问题,PyTorch引入DDP,实现跨节点训练。

改进点:

  • 支持多机多GPU训练
  • 每个GPU直接处理mini-batch,本地梯度在backward时平均
  • 减少GPU间通信开销,更高效利用每个GPU

优点:

  • 比DP更高效的梯度同步机制
  • 可扩展到多节点
  • 通信效率更高

缺点:

  • 仍然需要每个GPU存储完整模型
  • 对于超大模型(100B+参数)内存消耗依然巨大
  • 通信量为2Ψ(Ψ为参数量)

适用场景: 模型能够完整放入单GPU内存的情况下。


2. ZeRO系列(Zero Redundancy Optimizer)

2.1 ZeRO的核心洞察

革命性思想: 消除数据并行中的内存冗余——参数、梯度和优化器状态可以跨设备分片,仅在需要时聚合。

背景痛点: 传统数据并行中,每个GPU存储完整的模型参数、优化器状态(对于AdamW,每个参数需要12字节)和梯度,导致大量内存浪费。

2.2 ZeRO Stage 1(Pos - Optimizer State Partitioning)

技术特点:

  • 仅对优化器状态进行分片
  • 模型参数和梯度在所有worker上复制
  • 每个GPU更新其分片的优化器状态

优点:

  • 内存减少约4倍(示例特定)
  • 通信量与baseline DDP相同(2Ψ)
  • 几乎没有额外开销
  • 实现简单

缺点:

  • 参数和梯度仍然冗余
  • 内存节省有限
  • 仍需模型完整放入单GPU

通信机制: reduce-scatter(梯度)+ all-gather(更新后的参数)

2.3 ZeRO Stage 2(Pos+g - Optimizer State + Gradient Partitioning)

技术演进: 针对Stage 1内存节省不足的问题,进一步分片梯度。

改进点:

  • 优化器状态和梯度都进行分片
  • 每个worker仅维护其参数分片对应的梯度

优点:

  • 内存减少约8倍(示例特定)
  • 通信量仍为2Ψ,无额外开销
  • 兼容现有模型并行和流水线并行

缺点:

  • 参数仍然复制,不适合万亿参数模型
  • 初始化时CPU RAM占用高(多GPU情况下可能超过1.5TB)
  • 仍需模型完整放入单GPU

2.4 ZeRO Stage 3(Pos+g+p - Full Sharding)

技术突破: 对参数、梯度和优化器状态全部进行分片,实现真正的内存民主化。

核心机制:

  • 每个worker仅存储1/N的模型状态(N为GPU数)
  • 按需通信参数(parameter communication on-demand)
  • forward和backward时通过all-gather操作获取所需参数片段

优点:

  • 内存减少N倍(N为GPU数),可达64倍甚至更高
  • 突破单GPU内存限制,理论上可训练任意大小模型
  • 与ZeRO-2相比,通信量仅增加1.5倍(从2Ψ到3Ψ)
  • 不需要修改模型架构

缺点:

  • 通信开销较高(每个训练步骤需要额外的all-gather操作)
  • backward时需要远程参数访问
  • 需要高带宽网络(尤其是多节点场景)
  • 模型状态管理更复杂

通信模式:

  • Forward: all-gather(参数)
  • Backward: all-gather(参数) + reduce-scatter(梯度)
  • 总通信量:3Ψ = 1.5x baseline

适用场景: 超大规模模型(100B+参数)训练,多GPU/多节点环境。

2.5 ZeRO-R(Residual Memory Optimization)

针对痛点: 除了参数、梯度和优化器状态,激活值(activations)也占用大量内存。

技术特点:

  • 对激活值进行分区
  • 优化内存碎片管理
  • 管理临时缓冲区(用于梯度累积和跨worker的归约)

优点:

  • 进一步降低激活值内存占用
  • 改善内存碎片问题

2.6 ZeRO-Offload

技术背景(2021年1月): ZeRO-3虽然内存高效,但仍受限于GPU内存。CPU内存通常远大于GPU(数百GB vs 32-80GB)。

核心策略:

  • 将优化器和部分计算offload到CPU
  • 仅将计算复杂度<O(MB)的操作移至CPU(M为模型大小,B为batch size)
  • Forward/backward的矩阵乘法仍在GPU上执行

优点:

  • 在单个V100 GPU上训练10B参数模型达到40 TFLOPS
  • 不改变总体计算复杂度
  • 兼容ZeRO所有阶段

缺点:

  • CPU-GPU通信开销
  • 吞吐量有所下降
  • ZeRO-2场景下仍受单GPU内存限制

性能对比: 10B模型在1 V100上40 TFLOPS;PyTorch DDP最大只能训练1.4B模型(30 TFLOPS)。

2.7 ZeRO-Infinity

技术突破(2021年4月): 在ZeRO-Offload基础上进一步扩展到NVMe存储。

关键创新:

  • 同时利用CPU和NVMe内存
  • 专门基于ZeRO-3构建
  • 在单个DGX-2节点上支持10-100万亿参数模型训练

优点:

  • 支持训练万亿参数模型
  • 在512 GPUs上训练20T参数模型,吞吐量达49 TFlops/GPU
  • 比3D并行策略支持的模型大40倍

缺点:

  • 需要高带宽NVMe-CPU和CPU-GPU通信
  • 吞吐量低于纯GPU训练
  • 配置复杂度高

与ZeRO-Offload区别: ZeRO-Infinity能offload更多数据,带宽利用更高效,计算与通信重叠更好。

2.8 ZeRO++

技术演进(2023年): 针对ZeRO-3通信开销高的问题进行优化。

三大改进:

  1. 量化权重(qwZ)

    • 将模型权重量化为int8
    • 参数all-gather通信量减半
  2. 层次分区(hpZ - Hierarchical Partitioning)

    • 节点内分片 + 跨节点复制
    • 避免昂贵的节点间参数通信
    • 适用于无InfiniBand的多节点场景
  3. 量化梯度(qgZ)

    • 梯度reduce-scatter时使用int4代替fp16
    • 进一步降低通信量

整体效果: 通信量比ZeRO-3减少4倍。

优点:

  • 显著降低通信开销
  • 多节点场景下吞吐量大幅提升
  • 灵活的分区策略

缺点:

  • 量化可能影响训练精度(虽然实践中影响很小)
  • 层次分区牺牲了部分内存节省

3. FSDP(Fully Sharded Data Parallel)

3.1 技术背景

起源: 基于Xu等人的研究和ZeRO思想,由PyTorch官方实现。

3.2 Full Sharding

核心机制: 与ZeRO-3基本相同,对参数、优化器状态和梯度进行完全分片。

操作流程:

  • Forward: all-gather收集分片→计算→丢弃分片
  • Backward: all-gather收集分片→计算→reduce-scatter同步梯度→丢弃参数

优点:

  • 与ZeRO-3类似的内存效率
  • PyTorch原生支持,集成度高
  • 易于使用

缺点:

  • 通信开销与ZeRO-3相似
  • 多节点场景需谨慎配置

3.3 Hybrid Sharding

技术特点: 节点内分片(Sharding) + 跨节点复制(Replication)。

应用场景示例: 2个节点,每节点8xA100

  • 节点内:8个GPU间分片参数
  • 节点间:参数复制,仅梯度all-reduce

优点:

  • 降低跨节点通信(避免参数all-gather)
  • 适合无InfiniBand的多节点环境
  • 与ZeRO++的hpZ理念相同

缺点:

  • 内存节省少于Full Sharding
  • 仍需高带宽节点间网络

推荐场景: 小规模多节点训练(2-4节点),无InfiniBand。


4. 模型并行(Model Parallelism)

4.1 Pipeline Parallelism(流水线并行)

核心思想: 将模型按层垂直切分到不同GPU,创建计算流水线。

基础机制:

  • 将模型分为顺序stage,分配到不同设备
  • 将mini-batch分割为micro-batch
  • 不同stage同时处理不同micro-batch

优点:

  • 分布式内存负载
  • 实现相对简单(PyTorch/TensorFlow支持)
  • 提高设备利用率(相比naive model parallelism)

缺点:

  • GPU利用率不均衡(存在pipeline bubble空闲时间)
  • forward必须等待backward完成,无法完全消除空闲
  • 需要将模型重写为nn.Sequential

主要实现:

  • GPipe:基础同步流水线,使用梯度累积
  • PipeDream:异步执行 + weight stashing
  • PipeDream-2BW:优化内存,使用双缓冲权重
  • PipeDream Flush (1F1B):One Forward One Backward调度,减少pipeline bubble

4.2 Tensor Parallelism(张量并行)

核心思想: 在单个layer内进行并行,将大型张量计算水平切分。

Attention层并行

分片策略:

  • 基于头的分片:8个attention heads分配到2个GPU,每个4个
  • QKV矩阵分区:沿输出维度分片投影矩阵
  • 注意力分数本地计算
  • all-gather收集输出
MLP层并行

分片策略:

  • 第一线性层:沿列维度分片
  • 激活函数:本地应用
  • 第二线性层:沿行维度分片
  • all-reduce合并输出

优点:

  • 突破单GPU内存限制
  • 每个GPU并行处理张量片段
  • 可与其他并行方法组合

缺点:

  • GPU间通信开销高(最高)
  • 实现复杂,需要修改forward pass
  • 需要高带宽互连(NVLink/NVSwitch)

主要实现:

  • Megatron-LM:1D张量并行
  • Colossal-AI:2D、2.5D、3D张量并行

5. 3D并行(3D Parallelism)

核心思想

终极策略: 结合数据并行、张量并行和流水线并行,实现最大化内存和计算效率。

组合方式

数据并行组1:
  流水线Stage 1: [GPU1,GPU2] (张量并行)
  流水线Stage 2: [GPU3,GPU4] (张量并行)
数据并行组2:
  流水线Stage 1: [GPU5,GPU6] (张量并行)
  流水线Stage 2: [GPU7,GPU8] (张量并行)

优点

  • 支持万亿参数模型训练
  • 高效利用数千GPU
  • 同时优化内存和计算
  • 并行策略灵活可配

缺点

  • 配置复杂,需要专业知识
  • 需要修改模型架构
  • 通信模式复杂
  • 调试困难

带宽优化建议

  • 张量并行:节点内(高带宽NVLink)
  • 流水线并行:跨节点(中等带宽)
  • 数据并行:跨节点(较低带宽需求)

典型应用

  • GPT-3、BLOOM-176B、Megatron-Turing等超大模型训练

6. 其他并行策略

6.1 Mixture-of-Experts(MoE)并行

核心思想: 将大模型分为多个专家子模型,每次迭代仅激活部分专家。

技术特点:

  • 稀疏MoE层架构
  • 可训练的gating机制控制专家选择
  • 不同专家分布在不同GPU

优点:

  • 模型规模增长时计算成本亚线性增长
  • 推理时吞吐量可提升8倍(16专家模型示例)
  • 在固定计算预算下训练更大模型

缺点:

  • 训练不稳定
  • gating机制需要精心设计
  • 负载不均衡问题

典型应用: Mixtral 8x7B(超越Llama 2 70B,计算需求更低)。

6.2 异构系统并行(Heterogeneous System Parallelism)

技术背景: CPU内存(TB级)远大于GPU内存(48-80GB)。

核心策略:

  • 将不活跃张量offload到CPU内存或NVMe
  • 需要时再加载回GPU
  • 在单机上训练大规模模型

实现: ZeRO-Offload、ZeRO-Infinity。

6.3 自动并行(Automatic Parallelism)

痛点: 手动实现多维并行需要平衡性能、内存、通信开销和训练效果,极其复杂。

解决方案:

  • 自动按算子或层分区模型
  • 自动选择最优并行策略
  • 减少开发者负担

典型实现: Alpa等自动并行框架。


7. 实用优化技术

7.1 混合精度训练(Mixed Precision Training)

核心思想: 使用半精度(BF16/FP16)存储权重、激活和梯度,同时保持FP32的"主副本"权重。

优点:

  • 内存占用减半
  • 计算速度提升(利用Tensor Core)
  • BF16无需loss scaling,更稳定

7.2 Flash Attention

技术特点:

  • 快速、内存高效、IO感知的精确注意力算法
  • Flash Attention 2在A100 80GB上达220+ TFLOPS(峰值315 TFLOPS)

优点:

  • 显著加速训练
  • 降低内存消耗
  • 无精度损失

限制:

  • 仅支持Ampere/Ada/Hopper GPU(A100, RTX 3090, H100等)
  • 仅支持bf16/fp16

7.3 梯度检查点(Gradient Checkpointing)

核心思想: 仅保留部分中间激活值,其余按需重新计算。

优点:

  • 激活值内存从O(N)降至O(√N)(N为层数)
  • 突破内存瓶颈

缺点:

  • 训练速度降低约20%
  • 额外的重计算开销

7.4 梯度累积(Gradient Accumulation)

核心思想: 多个训练步骤累积梯度,间隔更新权重。

优点:

  • 增加有效batch size
  • 多GPU/多节点场景可加速训练(减少all-reduce次数)
  • 内存消耗不变

缺点:

  • 单GPU场景吞吐量下降
  • 需要调整学习率等超参数

8. 技术选型指南

8.1 单节点/多GPU场景

场景推荐策略
模型适合单GPUDDP 或 ZeRO-1/2
模型不适合单GPUZeRO-3 或 Pipeline Parallelism
最大层不适合单GPUTensor Parallelism 或 ZeRO-3

8.2 多节点/多GPU场景

网络条件推荐策略
高速互连(InfiniBand 1000+ Gbps)ZeRO-3 或 3D并行
中速网络(100-400 Gbps)ZeRO++ (hpZ) 或 FSDP Hybrid Sharding
低速网络避免ZeRO-3,使用ZeRO-2 + Pipeline

8.3 最佳实践推荐

基础配置:

  1. 默认使用BF16/FP16混合精度
  2. 应用LoRA到所有线性层
  3. 启用Flash Attention(如GPU支持)
  4. 启用梯度检查点(除非有Flash Attention)
  5. 使用高效采样器(如multipack sampler)

多GPU场景:

  • 优先尝试:BF16 + LoRA + Gradient Checkpointing + ZeRO-3
  • 内存极度受限:启用CPU/NVMe offload
  • 多节点无InfiniBand:使用ZeRO++ hpZ或FSDP Hybrid Sharding

避免事项:

  • 不必要地增加batch size(可能伤害收敛)
  • 在有足够内存时使用量化(降低吞吐量)
  • 多节点场景使用plain ZeRO-3(需确保网络带宽)

9. 未来发展方向

9.1 自动化并行

趋势: 自动化并行策略选择和模型分区,减少开发者负担。

研究方向:

  • 基于硬件配置和模型特性的自动决策
  • 动态调整并行策略
  • 端到端优化

代表工作: Alpa、Megatron-LM自动配置等。

9.2 通信优化

问题: 通信开销是当前最大瓶颈。

优化方向:

  • 更激进的量化(<int4)
  • 通信与计算重叠优化
  • 新颖的通信模式设计
  • 硬件感知的通信策略

9.3 稀疏化与MoE

趋势: 模型越来越大,稀疏化成为必然选择。

发展方向:

  • 更高效的专家路由算法
  • 动态专家激活
  • MoE与其他并行策略的深度集成

9.4 硬件协同设计

趋势: 针对特定并行策略定制硬件。

方向:

  • 专用高带宽互连
  • 计算与通信融合加速器
  • 内存层次结构优化

9.5 量化与低精度训练

趋势: 从BF16向更低精度发展。

研究热点:

  • int8/int4训练
  • 混合精度策略优化
  • 量化感知训练改进

9.6 ZeRO与FSDP的融合

趋势: PyTorch FSDP与DeepSpeed ZeRO逐渐趋同。

方向:

  • 统一接口和API
  • 互操作性增强
  • 最佳实践融合

9.7 长序列与长上下文优化

新挑战: 模型上下文长度从2K扩展到128K甚至更长。

研究方向:

  • 激活值内存优化(sequence parallelism)
  • 长序列注意力机制并行化
  • KV cache管理优化

10. 工程实践建议

10.1 监控与调试

关键指标:

  • GPU利用率(目标接近100%)
  • 通信时间占比
  • 内存使用率
  • 每秒样本吞吐量

工具:

  • nvidia-smi(GPU监控)
  • htop(CPU/RAM监控)
  • NCCL_DEBUG=INFO(分布式调试)
  • DeepSpeed profiler

10.2 超参数调整

batch size相关:

  • 有效batch size = per_device_batch_size × gradient_accumulation_steps × num_gpus
  • 学习率与有效batch size成正比缩放(小心100B+模型可能例外)

通用建议:

  • BLOOM-176B预训练:全局batch size 2048,训练366B tokens
  • 过大batch size可能伤害泛化能力

10.3 常见问题

CPU RAM OOM:

  • ZeRO-2多GPU初始化可能需要>1.5TB RAM
  • 使用ZeRO-3 + zero_init=1解决

通信瓶颈:

  • 多节点场景确保网络带宽足够(建议400+ Gbps)
  • 使用ZeRO++或FSDP Hybrid Sharding

吞吐量低:

  • 检查数据加载是否为瓶颈
  • 优化数据预处理pipeline
  • 调整num_workers和prefetch_factor

11. 总结

LLM训练并行技术经历了从简单数据并行到复杂3D并行的演进历程。当前的最佳实践是:

  1. 内存优化:ZeRO系列/FSDP是数据并行的首选,相比传统方法有数十倍内存节省
  2. 通信优化:ZeRO++/FSDP Hybrid Sharding解决多节点通信瓶颈
  3. 极致扩展:3D并行(DP + TP + PP)支持万亿参数模型
  4. 易用性:ZeRO和FSDP无需修改模型架构,集成简单
  5. 未来方向:自动化、硬件协同、稀疏化和长上下文优化

技术选型的核心原则:先尝试简单方案(ZeRO/FSDP),仅在必要时引入复杂并行(TP/PP)


参考资源

  • ZeRO系列论文

    • ZeRO: Memory Optimizations Toward Training Trillion Parameter Models (2019)
    • ZeRO-Offload: Democratizing Billion-Scale Model Training (2021)
    • ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning (2021)
    • ZeRO++: Extremely Efficient Collective Communication for Giant Model Training (2023)
  • 框架文档

  • 工程资源

  • 论文

    • Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism (2019)
    • GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism (2019)
    • PyTorch FSDP: Experiences on Scaling Fully Sharded Data Parallel (2021)
    • Alpa: Automating Inter- and Intra-Operator Parallelism for Distributed Deep Learning (2022)

文档版本: v1.0
最后更新: 2025年10月
作者: MiniMax Agent