Optimum 文档

面向HPU的DeepSpeed

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

并获得增强的文档体验

开始使用

面向HPU的DeepSpeed

DeepSpeed 通过 ZeRO 论文 中描述的各种优化,让您能够在 HPU 上适应并训练更大的模型。特别是,您可以使用以下两种经过验证与 Gaudi 完全兼容的 ZeRO 配置:

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

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

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

设置

要在Gaudi上使用DeepSpeed,您需要安装用于Intel Gaudi的Optimum和用于Intel Gaudi的DeepSpeed分支,通过

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

将DeepSpeed与Intel Gaudi的Optimum结合使用

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

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

这些步骤将在下文详细说明。关于如何将 DeepSpeed 与 Transformers Trainer 结合使用的全面指南也在此处提供:此处

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 实例中指定 deepspeed=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 上更新