趋近智
大师班
数据并行(DP)、张量并行(TP)和流水线并行(PP)等方法各自在分布式训练中具备独特的优点。为了提升模型规模上限,通常需要结合使用这些技术。没有单一策略是普遍最佳的;适合的方法取决于具体的模型架构、硬件限制(GPU内存、互联带宽/延迟)和期望的吞吐量。混合方法让工程师能够更好地安排更精细的工作分配,平衡内存节省、计算效率和通信开销。
混合方法的主要思路是同时运用多种并行方式的优点。一种常见做法是使用TP或PP来让模型能够 容纳 在一组设备上(处理内存限制),然后使用DP在这些集合的副本之间扩展训练吞吐量。
这是一种常用的组合,尤其适合具有非常宽层级的模型,TP在这种情况下能大幅节省内存。
一个2向TP x 2向DP配置。GPU 0和1构成一个TP组(DP 0级),GPU 2和3构成另一个(DP 1级)。TP通讯发生在组内(蓝色虚线),DP梯度同步发生在对应的TP等级间(红色实线)。
像NVIDIA的Megatron-LM这样的框架尤其适合用于实现TP,并提供将其与用于DP部分的标准PyTorch DistributedDataParallel (DDP) 集成的方法。
这种组合对深度模型很有效,其中PP用于降低激活所需的峰值内存,而DP则提升吞吐量。
一个2阶段PP x 2向DP配置。GPU 0和1构成一个流水线(DP 0级),GPU 2和3构成另一个(DP 1级)。PP通讯发生在阶段之间(绿线)。DP梯度同步发生在对应的阶段之间(红色虚线)。
DeepSpeed之类的库提供复杂的流水线并行实现,可以轻松地与其基于ZeRO的数据并行结合使用。
对于最大的模型,参数量超过数千亿或万亿时,可能需要将所有三种主要策略结合起来。这通常称之为“3D”并行。
ZeRO,特别是ZeRO Stage 3,并非与DP、TP和PP相同的并行维度,而是一种优化数据并行内存使用的技术。它将优化器状态、梯度以及(可选地)参数本身分布到数据并行等级上。ZeRO几乎总是与其他策略 配合使用:
DeepSpeed是用于实现ZeRO的具有代表性的框架,并提供集成功能,能有效结合TP和PP(通常借助Megatron-LM的TP实现)。
选择并应用合适的混合策略需要仔细分析:
一个PyTorch代码片段,展示如何组合这些(使用类似于DeepSpeed或Megatron-LM中的高级API),可能如下所示:
import torch
import torch.distributed as dist
from some_framework import (
initialize_parallelism,
get_data_parallel_group,
get_tensor_parallel_group,
get_pipeline_parallel_group,
PipelineModule,
TensorParallelLinear, # 示例TP层
ZeROOptimizer # 示例ZeRO集成
)
# 假设环境变量或配置文件已设置等级/组
# 示例:2向DP,4向TP,2阶段PP(总计2*4*2 = 16个GPU)
initialize_parallelism(
data_parallel_size=2,
tensor_parallel_size=4,
pipeline_parallel_size=2
)
# 根据需要使用TP层定义模型部分
class Stage0(torch.nn.Module):
def __init__(self):
super().__init__()
# 输入嵌入层可能使用张量并行
self.embedding = TPInputEmbedding(...)
# 一些Transformer层,其中可能使用TP
self.layer1 = TPLayer(...)
self.layer2 = TPLayer(...)
def forward(self, x):
# ... 阶段0的前向传播 ...
return self.layer2(self.layer1(self.embedding(x)))
class Stage1(torch.nn.Module):
def __init__(self):
super().__init__()
# 更多层
self.layer3 = TPLayer(...)
# 输出层可能使用TP
self.output = TPOutputLayer(...)
def forward(self, x):
# ... 阶段1的前向传播 ...
return self.output(self.layer3(x))
# 创建流水线模型
model = PipelineModule(
stages=[Stage0(), Stage1()],
num_microbatches=8 # 示例微批次配置
)
# 使用ZeRO包装优化器(ZeRO理解DP组)
optimizer = ZeROOptimizer(
model.parameters(),
lr=1e-4,
# ZeRO配置选项...
)
# 训练循环(简化版)
for data in dataloader:
optimizer.zero_grad()
# PipelineModule处理跨阶段的前向/后向传播
# 并在内部处理微批次
loss = model(data)
optimizer.step() # ZeRO处理DP组的梯度平均
PyTorch代码,呈现如何使用张量并行层(
TPLayer、TPInputEmbedding)定义模块并组合成一个PipelineModule。ZeROOptimizer隐式处理数据并行维度上的梯度同步。
成功训练大型模型通常需要对不同的混合配置(例如,改变TP大小、PP阶段、微批次大小)进行迭代实验,以找到最大化硬件利用率和最小化给定模型和集群架构训练时间的最佳平衡点。因此,理解这些策略之间的关联对于任何从事大规模模型训练的工程师都非常重要。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造