自动调优
在逐步完成本教程之前,请确保您已阅读 DeepSpeed 关于 入门 和 零冗余优化器 的教程。
模型训练中的一大痛点是找出合适的性能相关配置,例如微批次大小,以充分利用硬件并实现高吞吐量。这种配置探索过程通常是手动完成的,但很重要,因为模型训练会重复多次,并且受益于使用良好的配置。手动调整过程不仅耗时,而且结果还取决于硬件。这意味着在一种硬件上良好的配置可能不是另一种硬件上的最佳配置。因此,用户必须再次手动调整配置。使用 DeepSpeed,可能存在更多可能影响训练速度的配置参数,因此手动调整配置更加繁琐。
DeepSpeed 自动调优器缓解了这一痛点,并自动发现提供良好训练速度的最佳 DeepSpeed 配置。它不仅减少了用户花费在调整上的时间和资源,而且还可以发现比手动调整方法更好的配置。在本教程中,我们将展示 DeepSpeed 自动调优功能的使用和优势。有关更多详细信息,请参阅 README.md。
调优范围和策略
DeepSpeed 自动调优器使用模型信息、系统信息和启发式方法来有效地调整影响计算和内存效率的系统参数,例如 ZeRO 优化阶段、微批次大小以及许多其他 ZeRO 优化配置。目前,DeepSpeed 自动调优器在用户在 DeepSpeed 配置文件中定义的其他配置(例如优化器、调度器、fp16)之上,调整 ZeRO 阶段、每个 GPU 的微批次大小以及 ZeRO 配置(卸载尚不支持)。请注意,要调整的 ZeRO 阶段、微批次大小和其他 ZeRO 配置也是可配置的,并且可以通过 DeepSpeed 配置文件由用户覆盖。有关详细信息,请参阅 配置调优范围。
易用性
DeepSpeed 自动调优易于使用,不需要 DeepSpeed 用户进行任何代码更改。与原始训练脚本(deepspeed your_program.py <normal cl args> --deepspeed ds_config.json
)相比,在 DeepSpeed 中调用自动调优功能只需要在 DeepSpeed 启动器之后设置一个 autotuning
标志(有关详细信息,请参阅 使用),并在 DeepSpeed 配置文件中添加 "autotuning": {"enabled": true}
。用户可以通过更改 DeepSpeed 配置 JSON 文件中的自动调优配置来进一步定制自动调优过程(有关详细信息,请参阅 自动调优配置)。
示例
我们使用 16 个 Nvidia V100 GPU 训练来自 Hugging Face 的 0.77 亿个参数的 GPT2-large 模型 来展示自动调优的使用和优势。有关更多示例,请参阅 DeepSpeedExamples 存储库中的 autotuning。请注意,自动调优适用于任何使用 DeepSpeed 加速的模型训练,而不限于 Hugging Face 模型。
该模型具有
- 36 层
- 1280 个隐藏维度
- 20 个注意力头
- 7.74 亿个参数。
环境
训练使用 fp16,并在具有 16 个 Nvidia V100 GPU 的 1 个节点上运行。自动调优使用与训练相同的硬件资源。未定义 max_train_batch_size
。使用以下 HF 包。
HF 示例需要从源代码安装 transformers
包
git clone https://github.com/huggingface/transformers.git
cd transformers
pip install .
可以通过 pip install datasets
安装 datasets
包
以下是本测试中使用的版本。
- transformers (4.12.0.dev0)
- datasets (1.11.0)
启用自动调优
要启用自动调优,请在训练脚本中添加 --autotuning run
,并在 DeepSpeed 配置文件中添加 "autotuning": {"enabled": true}
。如果用户训练脚本使用 DeepSpeed 配置参数作为训练脚本参数,则必须在 DeepSpeed 配置文件中的 autotuning
部分的 arg_mappings
字典中提供 DeepSpeed 配置中的参数和训练脚本参数之间的名称映射。
训练脚本
deepspeed --autotuning run --num_nodes=$NNODES --num_gpus=$NGPUS $HF_PATH/transformers/examples/pytorch/language-modeling/run_clm.py --deepspeed $DS_CONFIG\
--model_name_or_path $MODEL_NAME \
--dataset_name wikitext \
--dataset_config_name wikitext-2-raw-v1 \
--do_train \
--do_eval \
--fp16 \
--per_device_train_batch_size $PER_DEVICE_TRAIN_BATCH_SIZE \
--gradient_accumulation_steps $GRADIENT_ACCUMULATION_STEPS \
--learning_rate 2e-5 \
--num_train_epochs $NEPOCHS \
--output_dir ${OUTPUT_DIR} \
--overwrite_output_dir
DeepSpeed 配置文件
{
"train_micro_batch_size_per_gpu": "auto",
"fp16": {
"enabled": true
},
"autotuning": {
"enabled": true,
"arg_mappings": {
"train_micro_batch_size_per_gpu": "--per_device_train_batch_size",
"gradient_accumulation_steps ": "--gradient_accumulation_steps"
}
}
}
吞吐量比较
下表显示了吞吐量(每秒样本数)比较。括号中还显示了用于实现吞吐量值的每个 GPU 的微批次大小 (mbs 或 tmbspg) 和 ZeRO 阶段。假设用户在手动调整过程中将使用的策略是从 mbs = 1
开始,每次增加 2 个 mbs,直到 GPU 内存不足为止。
baseline
是没有 DeepSpeed (DS) 的原生 Hugging Face (HF),mbs 是手动调整的。HF + DS 手动调整
是带有 DS 的 HF,mbs 是手动调整的,而其他 DS 配置使用默认值。HF + DS 自动调优
是带有 DS 的 HF,DS 配置是从自动调优中选择的。
符号:Hugging Face (HF)、DeepSpeed (DS)、ZeRO 阶段 (z)、梯度累积步数 (gas)、每个 GPU 的微批次大小 (mbs 或 tmbspg)。
模型名称 | baseline (原生 HF) | HF + DS 手动调整 | HF + DS 自动调优(快速模式) |
---|---|---|---|
GPT2-large | 27.874 (mbs = 1) | 56.797 (z = 1, mbs = 2), | 69.061 (z = 1, mbs = 3) |
下面显示了详细的 HF + DS 自动调优
结果摘要。
请注意,自动调优中使用的性能指标是使用 DeepSpeed 正向传播、反向传播和步骤函数中捕获的计时计算的。这些计时之和小于实际训练步骤延迟,因此自动调优中使用的吞吐量指标值将高于训练中的端到端吞吐量。
- 快速模式自动调优时间:27 分钟
- 实验次数:13
- 相对于基线的吞吐量提升:2.48 倍
tuning_space | num_experiments | best_metric_val | best_exp_name |
---|---|---|---|
z0 | 4 | 59.0229 | z0_gas1_tmbspg2 |
z1 | 5 | 87.3017 | z1_gas1_tmbspg3 |
z2 | 3 | 77.8338 | z2_gas1_tmbspg3 |
z3 | 1 | 0 | z3_gas1_tmbspg3 |
global | 13 | 87.3017 | z1_gas1_tmbspg3 |
调优在 0:27:33.988447 中完成。总共进行的实验次数:13。
正如我们所看到的,DeepSpeed 自动调优器可以选择比手动调整配置更好的配置,并且实验次数合理。自动调优 Hugging Face 示例 中的示例将证明自动调优在不同模型上的有效性。
使用 AzureML 进行 DeepSpeed 自动调优
要尝试使用 AzureML 进行 DeepSpeed 自动调优,请参阅 此处 的示例。