前言
随着深度学习模型规模的不断扩大,单个计算设备(如 GPU)的显存和算力已无法满足训练需求。为了解决这一问题,分布式并行训练技术应运而生。本文将详细介绍几种主流的深度学习并行方法,包括数据并行(Data Parallelism)、模型并行(Model Parallelism)、张量并行(Tensor Parallelism)、流水线并行(Pipeline Parallelism)、序列并行(Sequence Parallelism)以及零冗余数据并行(ZeRO)。
在深入具体算法之前,我们需要明确模型训练中涉及的两类主要数据:
- Model Data:
- 模型权重(Model Weights)
- 模型权重的梯度(Gradients)
- 优化器的状态(Optimizer States)
- Non-Model Data:
1. 数据并行 (Data Parallelism, DP)
经典的数据并行算法是在多个设备上分别拷贝一份完整的模型参数副本。每个设备接收不同的输入数据批次(Batch),独立进行前向传播和反向传播计算。由于各设备计算的是同一模型的不同数据子集,因此它们之间需要定期同步模型参数的梯度。
通常采用 AllReduce 操作来聚合梯度,确保所有设备上的模型参数保持一致。随着模型参数量增大,单卡显存无法容纳完整模型时,单纯的数据并行会遇到瓶颈,此时需要引入模型并行技术。
1.1 分布式数据并行 (DDP)
DDP 是 PyTorch 等框架中广泛使用的数据并行实现。它通过进程组(Process Group)管理多卡通信,利用 NCCL 库加速 GPU 间通信。相比传统 DP,DDP 避免了主节点处理梯度的瓶颈,实现了更高效的梯度同步。
2. 模型并行 (Model Parallelism, MP)
当模型过大无法放入单卡显存时,需要将模型切分到多个设备上。模型并行主要分为层间划分和层内划分两种策略。
2.1 流水线并行 (Pipeline Parallelism, PP)
流水线并行是对模型层间进行划分(Inter-layer Parallelism)。假设一个模型有 N 层,将其划分为 K 个阶段,每个阶段分配给一个 GPU。数据像流水线一样依次流过各个阶段。
- 优点:可以显著降低单卡显存占用。
- 缺点:存在气泡时间(Bubble Time),即部分 GPU 在前向传播完成后等待后续阶段完成反向传播,导致计算资源闲置。
- 优化方案:通过微批次(Micro-batching)技术,将一个大 Batch 拆分为多个小批次交错执行,减少气泡时间。相关研究包括 PipeDream、GPipe 和 Chimera。
2.2 张量并行 (Tensor Parallelism, TP)
张量并行是对模型层内进行划分(Intra-layer Parallelism),主要针对矩阵乘法运算。例如,在 Transformer 的 Self-Attention 或 MLP 层中,将大矩阵按行或列切分到不同 GPU 上。
- 1D Tensor 并行:每一层的输出是不完整的,传入下一层前需执行 All-gather 操作使每个 GPU 获得完整输入。
- 2D/2.5D/3D Tensor 并行:对输入和权重同时进行多维划分,中间层无需频繁通信,仅在最后做一次通信。这大幅降低了扩展至大量设备时的通信开销,且能与 Pipeline 并行兼容。
硬件连接方式对 TP 性能影响显著。高带宽互联(如 NVLink)可显著降低通信延迟,而节点间 PCIe 连接则可能成为瓶颈。在实际部署中,常采用节点内 NVLink 高速互联,节点间 PCIe 互联的混合架构。
2.3 序列并行 (Sequential Parallelism, SP)
张量并行主要解决 Model Data 导致的内存瓶颈,但 Non-Model Data(如 Activations)也可能成为限制因素。例如在 NAS(神经架构搜索)任务或长序列 Transformer 训练中,Self-attention 机制的复杂度为 O(L^2),其中 L 为序列长度,会导致激活值占用大量显存。
序列并行旨在解决由激活值引起的性能瓶颈。其原理是将序列维度切分到不同设备上,结合张量并行使用,进一步释放显存空间。
3. 零冗余数据并行 (ZeRO)
ZeRO (Zero Redundancy Optimizer) 是一种旨在消除数据并行中冗余内存占用的技术。训练过程中的 GPU 内存开销主要包括:
- 模型状态内存:
- 梯度
- 模型参数
- 优化器状态(如 Adam 的二阶动量,往往占据最大比例)
- 激活内存:前向传播产生的中间结果,用于支持反向传播。
- 碎片内存:由于张量生命周期不同导致的内存碎片,可能导致即使总内存充足也无法分配连续块。
ZeRO 根据张量的不同生命周期主动管理内存,防止碎片并减少冗余。ZeRO 分为三个阶段:
- Stage 1:仅分片优化器状态。
- Stage 2:分片优化器状态 + 梯度。
- Stage 3:分片优化器状态 + 梯度 + 模型参数。
通过 ZeRO Stage 3,可以将模型参数也分片存储,使得在有限显存下能够训练更大的模型。同时,ZeRO 还引入了动态内存管理,有效缓解内存碎片问题。
4. 总结与选型建议
在实际工程中,选择何种并行策略取决于模型规模、硬件资源和网络环境:
- 小模型:优先使用 DDP,简单高效。
- 中等模型:若显存不足,可结合 PP 和 TP。
- 超大模型:必须使用 ZeRO Stage 3 配合 TP 和 PP,以最大化显存利用率。
- 长序列任务:考虑引入 Sequence Parallelism 以减少激活内存。
理解这些并行技术的原理与权衡,有助于构建更高效、可扩展的大模型训练系统。