Transformers 文档

并行方法

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

并行方法

多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的*单个机器*上进行分布式训练。

  1. 默认GPUGPU 0读取数据批次,并将其中的一个迷你批次发送给其他GPU。
  2. 最新的模型会从GPU 0复制到其他GPU。
  3. 在每个GPU上执行forward传递,并将其输出发送到GPU 0来计算损失。
  4. 损失从GPU 0分发到其他GPU进行backward传递。
  5. 每个GPU的梯度会发送回GPU 0并进行平均。

DistributedDataParallel

DistributedDataParallel支持在*多台机器*上进行分布式训练,每台机器有多张GPU。

  1. 主进程将模型从默认GPUGPU 0复制到每张GPU。
  2. 每张GPU直接处理一个数据迷你批次。
  3. 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只存储模型、优化器和激活的一个切片。这允许数据并行节点之间更高的通信带宽,因为通信可以独立于其他流水线阶段或与之并行发生。

这种方法可扩展到具有数万亿参数的超大型模型。

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.