Transformers 文档
并行方法
并获得增强的文档体验
开始使用
并行方法
多GPU设置可有效地加速训练,并将单个GPU无法容纳的大型模型装入内存。它依赖于跨GPU进行工作负载的并行化。有几种并行类型,如数据并行、张量并行、流水线并行和模型并行。每种并行类型都会以不同的方式分割工作负载,无论是数据还是模型。
本指南将讨论各种并行方法、它们的组合以及为您的设置选择合适的策略。有关分布式训练的更多详细信息,请参阅Accelerate文档。
有关大规模语言模型的全面指南,请查看Ultrascale Playbook,其中提供了大规模训练的详细策略和最佳实践。
可扩展性策略
使用模型内存计算器来计算模型所需的内存量。然后参考下表,根据您的设置选择策略。
| setup | 场景 | 策略 |
|---|---|---|
| 单节点/多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上执行
forward传递,并将其输出发送到GPU 0来计算损失。 - 损失从
GPU 0分发到其他GPU进行backward传递。 - 每个GPU的梯度会发送回
GPU 0并进行平均。
DistributedDataParallel
DistributedDataParallel支持在*多台机器*上进行分布式训练,每台机器有多张GPU。
- 主进程将模型从默认GPU
GPU 0复制到每张GPU。 - 每张GPU直接处理一个数据迷你批次。
- 在
backward传递期间,局部梯度会在所有GPU之间进行平均。
推荐使用DDP,因为它减少了GPU之间的通信开销,有效地利用了每张GPU,并且可以扩展到多台机器。
ZeRO数据并行
Zero Redundancy Optimizer是一种更节省内存的数据并行类型。它通过在数据并行进程之间划分参数、梯度和优化器状态来显著提高内存效率,从而减少内存使用。有三个ZeRO阶段
- 阶段1划分优化器状态
- 阶段2划分优化器和梯度状态
- 阶段3划分优化器、梯度和参数

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

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