Optimum 文档
加速训练
并获得增强的文档体验
开始使用
加速训练
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 上更新