Transformers 文档
并行方法
并获得增强的文档体验
开始使用
并行方法
多 GPU 设置能有效加速训练,并将大型模型载入内存,否则这些模型将无法适应单个 GPU。它依赖于跨 GPU 的工作负载并行化。有几种并行类型,如数据并行、张量并行、流水线并行和模型并行。每种并行类型以不同的方式拆分工作负载,无论是数据还是模型。
本指南将讨论各种并行方法、它们的组合以及为您的设置选择合适的策略。有关分布式训练的更多详细信息,请参阅 Accelerate 文档。
有关扩展大型语言模型的综合指南,请查阅 Ultrascale Playbook,它提供了详细的策略和大规模训练的最佳实践。
可扩展性策略
使用 模型内存计算器 计算模型所需的内存。然后参考下表,根据您的设置选择策略。
设置 | 场景 | 策略 |
---|---|---|
单节点/多 GPU | 适合单个 GPU | DistributedDataParallel 或 ZeRO |
不适合单个 GPU | PipelineParallel、ZeRO 或 TensorParallel | |
最大模型层不适合 | TensorParallel 或 ZeRO | |
多节点/多 GPU | 节点间连接速度快 (NVLink 或 NVSwitch) | ZeRO 或 3D 并行(PipelineParallel、TensorParallel、DataParallel) |
节点间连接速度慢 | ZeRO 或 3D 并行(PipelineParallel、TensorParallel、DataParallel) |
数据并行
数据并行将数据均匀分布到多个 GPU 上。每个 GPU 都持有一个模型的副本并同时处理其数据部分。最后,每个 GPU 的结果会同步并合并。
数据并行通过并行处理数据显著缩短了训练时间,并且可以根据可用的 GPU 数量进行扩展。然而,同步每个 GPU 的结果可能会增加开销。
数据并行有两种类型:DataParallel (DP) 和 DistributedDataParallel (DDP)。
DataParallel
DataParallel 支持在单机多 GPU 上进行分布式训练。
- 默认 GPU,即
GPU 0
,读取一批数据并将其中的一小批数据发送到其他 GPU。 - 从
GPU 0
复制一份最新模型到其他 GPU。 - 在每个 GPU 上执行一次
前向
传播,并将它们的输出发送到GPU 0
以计算损失。 - 损失从
GPU 0
分布到其他 GPU 进行后向
传播。 - 每个 GPU 的梯度发送回
GPU 0
并进行平均。
DistributedDataParallel
DistributedDataParallel 支持跨多台机器多 GPU 进行分布式训练。
- 主进程将模型从默认 GPU(
GPU 0
)复制到每个 GPU。 - 每个 GPU 直接处理一小批数据。
- 在
反向
传播过程中,局部梯度在所有 GPU 上进行平均。
建议使用 DDP,因为它减少了 GPU 之间的通信开销,有效地利用了每个 GPU,并且可以扩展到多台机器。
ZeRO 数据并行
零冗余优化器(Zero Redundancy Optimizer)是一种更内存高效的数据并行类型。它通过在数据并行进程中划分参数、梯度和优化器状态来显著提高内存效率,从而减少内存使用。ZeRO 有三个阶段:
- 第一阶段划分优化器状态
- 第二阶段划分优化器和梯度状态
- 第三阶段划分优化器、梯度和参数

模型并行
模型并行将模型分布到多个 GPU 上。有多种方法可以拆分模型,但典型的方法是将模型层分布到 GPU 上。在前向传播中,第一个 GPU 处理一批数据并将其传递给下一个 GPU 上的下一组层。对于反向传播,数据从最后一层反向发送到第一层。
模型并行是一种训练模型的好策略,这些模型太大而无法适应单个 GPU 的内存。然而,GPU 利用率是不平衡的,因为一次只有一个 GPU 处于活动状态。在 GPU 之间传递结果也会增加通信开销,这可能是一个瓶颈。
流水线并行
流水线并行在概念上与模型并行非常相似,但它效率更高,因为它减少了 GPU 空闲时间。流水线并行不是等待每个 GPU 完成处理一批数据,而是创建数据的微批次。一旦一个微批次完成,它就会被传递到下一个 GPU。这样,每个 GPU 都可以同时处理部分数据,而无需等待其他 GPU 完全完成处理一个迷你批次数据。
流水线并行与模型并行具有相同的优点,但它优化了 GPU 利用率并减少了空闲时间。但是,流水线并行可能更复杂,因为模型可能需要重写为 nn.Sequential 模块的序列,而且也不可能完全减少空闲时间,因为最后一次 前向
传播也必须等待 反向
传播完成。
张量并行
张量并行将大型张量计算分布到多个 GPU 上。张量被水平或垂直切片,每个切片由一个单独的 GPU 处理。每个 GPU 对其张量切片执行计算,最后同步结果以重建最终结果。
张量并行对于训练不适合单个 GPU 内存的大型模型非常有效。它也更快、更高效,因为每个 GPU 都可以并行处理其张量切片,并且可以与其他并行方法结合使用。然而,与其他并行方法一样,张量并行增加了 GPU 之间的通信开销。
混合并行
并行方法可以结合使用,以实现更大的内存节省和更高效地训练具有数十亿参数的模型。
数据并行和流水线并行
数据并行和流水线并行将数据分布到 GPU 上,并将每个迷你批次数据分成微批次以实现流水线并行。
每个数据并行等级都将该过程视为只有一个 GPU 而不是两个,但 GPU 0 和 1 可以将微批次数据卸载到 GPU 2 和 3,从而减少空闲时间。
这种方法通过减少空闲 GPU 利用率来优化并行数据处理。

ZeRO 数据并行、流水线并行和模型并行(3D 并行)
数据并行、流水线并行和模型并行相结合,形成 3D 并行,以优化内存和计算效率。
内存效率通过将模型分割到 GPU 上并将其分成多个阶段以创建流水线来实现。这使得 GPU 可以在微批次数据上并行工作,从而减少模型、优化器和激活的内存使用。
ZeRO 数据并行实现了计算效率,其中每个 GPU 只存储模型、优化器和激活的一部分。这允许数据并行节点之间有更高的通信带宽,因为通信可以独立进行或与其他流水线阶段并行进行。
这种方法可扩展到具有数万亿参数的超大型模型。
