在训练大规模深度学习模型(特别是LLMs)时,单块GPU的计算能力和内存往往无法满足需求。分布式训练是解决这一问题的核心手段。面试中,区分数据并行(DP)、模型并行(MP/TP)和流水线并行(PP)及其切分依据,是考察候选人分布式系统理解能力的关键。
本文将深入探讨这三种并行策略的工作机制,并给出明确的切分选择标准。
1. 数据并行 (Data Parallelism, DP)
原理与切分场景
数据并行是最常用且最容易实现的并行方式。它不切分模型,而是将完整的模型复制到每个设备上,然后将训练数据集切分成小的批次(Mini-batches),每个设备处理不同的数据批次。
切分依据:
- 场景: 模型可以完整地放入单个GPU的内存中 ($M_{model} \le M_{GPU}$)。
- 目标: 提高训练吞吐量(即加快训练速度)。
- 切分点: 沿着数据的批次维度(Batch Dimension)进行切分。
同步机制: 在反向传播计算完梯度后,所有设备上的梯度需要通过 All-Reduce 操作进行同步和平均,确保所有设备上的模型参数保持一致。
实用操作示例 (PyTorch DDP)
在 PyTorch 中,实现数据并行通常使用 DistributedDataParallel (DDP)。
import torch.nn as nn
from torch.nn.parallel import DistributedDataParallel
import torch.distributed as dist
def setup(rank, world_size):
dist.init_process_group("nccl", rank=rank, world_size=world_size)
# 假设在多进程环境中运行
# setup(rank, world_size)
# 定义模型
model = nn.Linear(10, 1)
# 将模型包裹在 DDP 中,实现数据并行
# 注意:模型首先需要被移动到相应的设备上
device = torch.device(f"cuda:{rank}")
model.to(device)
ddp_model = DistributedDataParallel(model, device_ids=[rank])
# 后续训练使用 ddp_model 进行前向传播和后向传播
2. 模型并行 (Model Parallelism, MP) 或 张量并行 (Tensor Parallelism, TP)
原理与切分场景
当模型的参数量巨大,无法被单个设备的内存容纳时(例如 Llama 65B 或更大的模型),必须使用模型并行。
切分依据:
- 场景: 模型太大,无法在单个GPU上完整加载 ($M_{model} > M_{GPU}$)。
- 目标: 使巨型模型能够被训练。
- 切分点: 沿着模型的权重矩阵或层的维度进行切分。
A. 层内切分 (张量并行, Tensor Parallelism, TP)
TP 是最常见的模型并行形式,它将单个运算(如线性层或注意力层)的权重矩阵切分到多个设备上。例如,一个大的权重矩阵 $W$ 可以按列或按行切分。
- 切分方式: 将 $W$ 拆分成 $W_1, W_2, \dots$。在每次前向传播中,需要进行集合通信操作(如 All-Gather 或 Reduce-Scatter)来同步激活值或梯度。
- 适用性: 适用于LLMs中的FFN层和Attention层,能够最大限度地减少通信次数。
B. 层间切分 (Layer-wise Parallelism)
将不同的层分配给不同的设备。例如,GPU 1 负责 $L_1, L_2$,GPU 2 负责 $L_3, L_4$。
* 局限性: 这种方式效率较低,因为当前一个 GPU 完成计算后,下一个 GPU 才能开始,导致设备利用率低下(空闲气泡)。
3. 流水线并行 (Pipeline Parallelism, PP)
流水线并行是为了解决层间模型并行带来的设备利用率低下问题(即“气泡”问题)而诞生的。
原理与切分场景
流水线并行依然采用层间切分的方式,将模型的连续层分配给不同的设备(流水线阶段)。但它引入了微批次(Micro-batching)机制。
切分依据:
- 场景: 当模型需要按层切分,且希望提高GPU利用率、减少激活值内存消耗时。
- 目标: 通过并发处理不同的微批次,隐藏通信和计算的等待时间。
- 切分点: 沿着模型的层序列进行切分。
工作流:
- 将原始的 Mini-batch 切分成更小的微批次(Micro-batches, MB)。
- 第一个阶段的设备(GPU 1)首先处理第一个 MB 的前向传播。
- 一旦 GPU 1 完成了第一个 MB,它将激活值发送给 GPU 2,并立即开始处理第二个 MB。
- GPU 2 在接收到激活值后,开始对第一个 MB 进行前向传播。
通过这种方式,多个 GPU 可以同时对不同微批次的不同层进行计算,形成了流水线,大大提高了整体的硬件利用率。
场景选择总结
在面试中,可以按照以下标准快速判断最佳的并行策略:
| 策略 | 关键问题 | 切分对象/维度 | 优化目标 | 适用场景 | 常用库支持 |
|---|---|---|---|---|---|
| 数据并行 (DP) | 模型是否能装进单个GPU?(是) | 数据(Batch Size) | 吞吐量 | 模型较小,需要提速 | PyTorch DDP |
| 模型并行 (MP/TP) | 模型是否能装进单个GPU?(否) | 张量/权重矩阵(层内) | 内存限制 | 巨型模型(如 >10B 参数) | Megatron-LM/DeepSpeed |
| 流水线并行 (PP) | 如何高效利用层切分的设备? | 模型层(层间) | 吞吐量与内存(减少激活值) | 结合TP,或当层数极多时 | DeepSpeed/PipeDream |
汤不热吧