Optimum 文件
面向HPU的DeepSpeed
並獲得增強的文件體驗
開始使用
面向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 個步驟完成
- 必須定義DeepSpeed配置。
- `deepspeed` 訓練引數允許指定 DeepSpeed 配置的路徑。
- 必須使用 `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 配置。
啟動指令碼
最後,有兩種可能的方式來啟動您的指令碼:
- 使用 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不相容。