Optimum 文档

面向 HPU 的 DeepSpeed

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

并获得增强的文档体验

开始使用

面向 HPU 的 DeepSpeed

DeepSpeed 使您能够在 HPU 上拟合和训练更大的模型,这得益于 ZeRO 论文中描述的各种优化。特别是,您可以使用以下两种 ZeRO 配置,经验证它们与 Gaudi 完全兼容

  • ZeRO-1:跨进程划分优化器状态。
  • ZeRO-2:跨进程划分优化器状态 + 梯度。
  • ZeRO-3:ZeRO-2 + 完整模型状态跨进程划分。

这些配置与 Intel Gaudi 混合精度完全兼容,因此可用于以 bf16 精度训练您的模型。

您可以在此处找到有关 DeepSpeed Gaudi 集成的更多信息。

设置

要在 Gaudi 上使用 DeepSpeed,您需要安装适用于 Intel Gaudi 的 Optimum 和 适用于 Intel Gaudi 的 DeepSpeed fork,方法如下

pip install optimum[habana]
pip install git+https://github.com/HabanaAI/DeepSpeed.git@1.20.0

将 DeepSpeed 与适用于 Intel Gaudi 的 Optimum 结合使用

GaudiTrainer 允许像 Transformers Trainer 一样轻松地使用 DeepSpeed。这可以通过 3 个步骤完成

  1. 必须定义 DeepSpeed 配置。
  2. deepspeed 训练参数允许指定 DeepSpeed 配置的路径。
  3. 必须使用 deepspeed 启动器来运行您的脚本。

以下详细介绍了这些步骤。有关如何将 DeepSpeed 与 Transformers Trainer 结合使用的综合指南也在此处提供 here

DeepSpeed 配置

要使用的 DeepSpeed 配置通过 JSON 文件传递,使您可以选择要应用的优化。以下是应用 ZeRO-2 优化和 bf16 精度的示例

{
    "steps_per_print": 64,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "gradient_accumulation_steps": "auto",
    "bf16": {
        "enabled": true
    },
    "gradient_clipping": 1.0,
    "zero_optimization": {
        "stage": 2,
        "overlap_comm": false,
        "reduce_scatter": false,
        "contiguous_gradients": false
    }
}

特殊值 "auto" 允许自动获取正确或最有效的值。您也可以自己指定值,但如果这样做,您应该注意不要使值与您的训练参数冲突。强烈建议阅读 Transformers 文档中的 此部分,以完全理解其工作原理。

Intel 在 此处 提出了用于 HPU 的其他配置示例。

Transformers 文档很好地解释了如何从头开始编写配置。有关所有配置可能性的更完整描述,请访问 此处

deepspeed 训练参数

要使用 DeepSpeed,您必须在 GaudiTrainingArguments 实例中指定 deespeed=path_to_my_deepspeed_configuration

training_args = GaudiTrainingArguments(
    # my usual training arguments...
    use_habana=True,
    use_lazy_mode=True,
    gaudi_config_name=path_to_my_gaudi_config,
    deepspeed=path_to_my_deepspeed_config,
)

此参数既指示应使用 DeepSpeed,又指向您的 DeepSpeed 配置。

启动您的脚本

最后,有两种可能的方法来启动您的脚本

  1. 使用 gaudi_spawn.py 脚本
python gaudi_spawn.py \
    --world_size number_of_hpu_you_have --use_deepspeed \
    path_to_script.py --args1 --args2 ... --argsN \
    --deepspeed path_to_deepspeed_config

其中 --argX 是要使用 DeepSpeed 运行的脚本的参数。

  1. 直接在代码中使用 DistributedRunner
from optimum.habana.distributed import DistributedRunner
from optimum.utils import logging

world_size=8 # Number of HPUs to use (1 or 8)

# define distributed runner
distributed_runner = DistributedRunner(
    command_list=["scripts/train.py --args1 --args2 ... --argsN --deepspeed path_to_deepspeed_config"],
    world_size=world_size,
    use_deepspeed=True,
)

# start job
ret_code = distributed_runner.run()

您应该在 Gaudi 配置中设置 "use_fused_adam": false,因为它尚不与 DeepSpeed 兼容。

< > 在 GitHub 上更新