Optimum 文档

加速训练

您正在查看 main 版本,该版本需要从源码安装。如果您想要常规的 pip 安装,请查看最新的稳定版本 (v1.24.0)。
Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

加速训练

Gaudi 提供了几种加速训练的可能性。它们彼此兼容,并且可以与 分布式训练 结合使用。

执行模式

支持以下执行模式

  • 延迟模式,其中操作累积在一个图中,该图的执行以延迟方式触发。这允许图编译器优化这些操作的设备执行。
  • Eager 模式,其中一次执行一个操作。
  • 带有 torch.compileEager 模式,其中模型(或模型的一部分)被封闭在一个图中。

并非所有模型都支持 Eager 模式和带有 torch.compile 的 Eager 模式(仍在开发中)。延迟模式是默认模式。

在延迟模式下,图编译器生成优化的二进制代码,该代码在 Gaudi 上实现给定的模型拓扑。它执行运算符融合、数据布局管理、并行化、流水线和内存管理,以及图级优化。

要在延迟模式下执行训练,您必须提供以下训练参数

args = GaudiTrainingArguments(
    # same arguments as in Transformers,
    use_habana=True,
    use_lazy_mode=True,
    gaudi_config_name=path_to_my_gaudi_config
)

在延迟模式下,默认情况下,最后一个批次会填充额外的样本,使其具有与先前批次相同的维度。这使得在训练期间避免额外的图编译。您也可以使用 dataloader_drop_last=True 丢弃最后一个批次。

在延迟模式下,由于图编译,前两次或三次训练迭代可能会较慢。为了不在训练结束时的吞吐量计算中考虑它们,您可以添加以下训练参数:throughput_warmup_steps=3

混合精度训练

混合精度训练允许使用更轻的数据类型计算某些操作,以加速训练。Intel Gaudi 的 Optimum 启用混合精度训练的方式与 🤗 Transformers 类似

  • 参数 --bf16 启用 PyTorch autocast 的使用
  • 参数 --half_precision_backend [hpu_amp, cpu_amp] 用于指定应在其上执行混合精度操作的设备

有关更多信息,请参阅 Gaudi 上的高级 autocast 用法,了解

  • 默认的 autocast 操作
  • 默认的 autocast 操作覆盖

HPU 图

PyTorch 的灵活性是有代价的 - 通常相同的 pythonic 逻辑在每个训练步骤中一遍又一遍地处理。这可能会导致这样一种情况,即 CPU 在 Gaudi 上调度工作的时间比 Gaudi 有效计算的时间更长。为了应对这种受主机限制的工作负载,您可能需要尝试启用 HPU 图 功能,该功能记录计算图一次,然后仅触发它以更快地多次执行。

为此,请指定 --use_hpu_graphs_for_training True。此选项会将模型包装在 habana_frameworks.torch.hpu.ModuleCacher 中,它会在模型的用法上自动记录 HPU 图

对于多工作进程分布式训练,您还需要指定 --distribution_strategy fast_ddp。此选项将 torch.nn.parallel.DistributedDataParallel 的用法替换为更简单且通常更快的 optimum.habana.distributed.all_reduce_gradients

谨慎使用:当前使用 HPU 图进行训练可能不支持所有可能的情况。但是,潜在的性能提升可能是巨大的!

快速 DDP

对于多个设备上的分布式训练,您还可以指定 --distribution_strategy fast_ddp。此选项将 torch.nn.parallel.DistributedDataParallel 的用法替换为更简单且通常更快的 optimum.habana.distributed.all_reduce_gradients

流水线化前向和后向传递

在 Intel Gaudi HPU 上运行模型时,有两个阶段:CPU 上的 python 代码解释和 HPU 配方计算。HPU 计算阶段可以手动触发,也可以在请求复制到 CPU 时触发,通常 HPU 计算在 loss.backward() 之后触发,以使 CPU 代码解释和 HPU 配方计算重叠,如下面的图示所示

CPU:...forward + backward   ...optimizer  ...forward + backward   ...optimizer  ...
HPU:........................forward + backward...optimizer......forward + backward...optimizer

但是,当 CPU 代码解释花费的时间比 HPU 计算的时间长时,CPU 代码解释会成为瓶颈,并且在 CPU 代码解释完成之前无法触发 HPU 计算。因此,对于这种情况的一个潜在优化是在 CPU 前向 解释之后和 CPU 后向 解释之前立即触发 HPU 前向 计算。您可以在下面的示例中看到 CPU 后向 解释与 HPU 前向 计算重叠

CPU:...forward   ...backward   ...optimizer  ...forward   ...backward   ...optimizer   ...
HPU:.............forward.......backward......optimizer......forward.....backward.......optimizer

要启用此优化,您可以设置以下训练参数 --pipelining_fwd_bwd True

我们建议在 Gaudi2 上使用它,因为主机通常会成为瓶颈。您应该也能够在第一代 Gaudi 上看到加速,但它不如 Gaudi2 上的加速显着,因为您的运行更有可能受到 HPU 限制。

此外,当训练需要大量设备内存的模型时,我们建议禁用此优化,因为它会增加 HPU 内存使用量

使用更多工作进程进行数据加载

如果数据加载器的工作负载很大,您可以增加工作进程的数量以加快运行速度。您可以使用训练参数 --dataloader_num_workers N 启用此功能,其中 N 是要使用的工作进程数。

我们建议将其与包含图像的数据集一起使用。 此外,在大多数情况下,使用 --dataloader_num_workers 1 应该有所帮助,因为它可以在与主线程不同的线程中启用数据加载。

非阻塞数据复制

此优化非常适合将数据从主机复制到设备的成本较高的模型(例如 ViT 或 Swin 等视觉模型)。您可以使用训练参数 --non_blocking_data_copy True 启用它。

我们建议在 Gaudi2 上使用它,其中主机可以继续执行其他任务(例如,图构建),以在主机和设备之间获得更好的流水线。在第一代 Gaudi 上,设备执行时间更长,因此不应期望获得任何加速。

自定义运算符

Intel Gaudi 提供了一些自定义运算符,这些运算符在 Gaudi 上比其 PyTorch 对等物具有更好的性能。您还可以按照 此处 所述为 Gaudi 定义您自己的自定义运算符。

融合 ADAM

Intel Gaudi 提供了一个 自定义融合 ADAM 实现。可以通过在 Gaudi 配置文件中指定 "use_fused_adam": true 来使用它。

对于 Intel Gaudi 融合 ADAM 优化器,epsilon 的默认值为 1e-6,而对于 torch.optim.AdamW,则为 1e-8

融合梯度范数裁剪

Intel Gaudi 提供了一个 自定义梯度范数裁剪实现。可以通过在 Gaudi 配置文件中指定 "use_fused_clip_norm": true 来使用它。

Gaudi 优化 Flash Attention

对于延迟和 Eager 模式,都支持具有额外 Intel® Gaudi® AI 加速器优化的 Flash attention 算法。请参阅 使用融合缩放点积注意力 (FusedSDPA)

跟踪内存使用情况

实时内存统计信息每 logging_steps 步(默认为 500 步)显示一次

  • memory_allocated (GB) 指的是 当前 内存消耗(单位为 GB),
  • max_memory_allocated (GB) 指的是运行期间达到的最大内存消耗(单位为 GB),
  • total_memory_available (GB) 指的是设备上总共可用的内存(单位为 GB)。

这些指标可以帮助您调整运行的批次大小。

在分布式模式下,内存统计信息仅由主进程传递。

您可以查看 Intel Gaudi AI 加速器的官方文档,以获取有关内存统计信息 API 的更多信息。

< > 在 GitHub 上更新