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) 是一种更节省内存的数据并行类型。它通过在数据并行进程之间划分参数、梯度和优化器状态来显著提高内存效率,从而减少内存使用。ZeRO 有三个阶段
- 阶段 1 划分优化器状态
- 阶段 2 划分优化器和梯度状态
- 阶段 3 划分优化器、梯度和参数

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

ZeRO 数据并行、流水线并行和模型并行(3D 并行)
数据并行、流水线并行和模型并行结合形成 3D 并行,以优化内存和计算效率。
内存效率是通过跨 GPU 拆分模型并将其划分为阶段以创建流水线来实现的。这允许 GPU 并行处理数据微批次,从而减少模型、优化器和激活的内存使用量。
计算效率由 ZeRO 数据并行实现,其中每个 GPU 仅存储模型、优化器和激活的一个切片。这允许数据并行节点之间更高的通信带宽,因为通信可以独立于其他流水线阶段或与其并行发生。
这种方法可扩展到具有数万亿参数的超大型模型。
