Optimum 文档

加速训练

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

并获得增强的文档体验

开始使用

加速训练

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

执行模式

支持以下执行模式

  • 惰性模式:操作在图中累积,其执行以惰性方式触发。这允许图编译器优化这些操作的设备执行。
  • 即时模式:一次执行一个操作。
  • 即时模式结合 torch.compile:模型(或模型的一部分)被封装在一个图中。

并非所有模型都支持即时模式和结合 torch.compile 的即时模式(仍在开发中)。惰性模式是默认模式。

在惰性模式下,图编译器会生成优化的二进制代码,用于在 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 自动类型转换
  • 参数 --half_precision_backend [hpu_amp, cpu_amp] 用于指定应执行混合精度操作的设备

有关 Gaudi 上高级自动类型转换用法的更多信息,请参阅此链接

  • 默认自动类型转换操作
  • 默认自动类型转换操作重写

HPU 图

PyTorch 的灵活性是有代价的——通常相同的 Python 逻辑在每个训练步骤中一遍又一遍地处理。这可能导致 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 计算时,它就成为瓶颈,HPU 计算无法在 CPU 代码解释完成之前触发。因此,对于这种情况,一个潜在的优化是在 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 内存使用*。

使用更多 Worker 进行数据加载

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

我们**建议将其与包含图像的数据集一起使用。**此外,在大多数情况下,使用 --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 的默认 epsilon 值为 1e-8

融合梯度范数剪裁

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

Gaudi 优化的 Flash Attention

支持用于惰性模式和即时模式的带有额外 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 上更新