Optimum 文档
面向 HPU 的 DeepSpeed
并获得增强的文档体验
开始使用
面向 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 个步骤完成
- 必须定义 DeepSpeed 配置。
deepspeed
训练参数允许指定 DeepSpeed 配置的路径。- 必须使用
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 配置。
启动您的脚本
最后,有两种可能的方法来启动您的脚本
- 使用 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 运行的脚本的参数。
- 直接在代码中使用
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 兼容。