deepspeed config 键值使用
train_batch_size:设置训练时的批量大小。
gradient_accumulation_steps:设置梯度累积的步数,以减少通信开销和内存占用。
fp16:设置是否使用混合精度训练,以提高速度和减少内存占用。
min_loss_scale
参数有时候可以设置为1e-10
防止loss scale at minimum问题。"fp16": { "enabled": "auto", "auto_cast": false, "loss_scale": 0, "initial_scale_power": 16, "loss_scale_window": 1000, "hysteresis": 2, "consecutive_hysteresis": false, "min_loss_scale": 1 }
zero_optimization:设置是否使用ZeRO优化器,以进一步减少内存占用和提高扩展性。ZeRO-stage-1优化梯度;ZeRO-stage-2优化梯度和优化器参数;ZeRO-stage-3优化梯度、优化器、模型参数。
overlap_comm
: 控制是否使用通信与计算的重叠。当设置为True
时,DeepSpeed将在梯度计算时尝试并行执行梯度通信。可以有效地减少通信时间,从而加速整个训练过程allgather_bucket_size
用于控制Allgather操作的分桶大小。Allgather操作是指在分布式训练中,每个进程收集其他所有进程的张量,并将这些张量按顺序拼接起来。通过将张量划分为较小的桶(buckets),可以在通信过程中更高效地传输数据。allgather_bucket_size
值越大,每个桶的大小越大,通信操作可能会变得更快,但也需要更多的内存来存储中间结果。合适的桶大小要根据实际情况调整。reduce_bucket_size
:类似于allgather_bucket_size,用于控制Allreduce操作的分桶大小。Allreduce操作是将所有进程的某个张量进行规约(例如求和),并将结果广播回所有进程。通过将张量划分为较小的桶,可以更高效地传输数据。reduce_bucket_size
值越大,每个桶的大小越大,通信操作可能会变得更快,但同时也需要更多的内存来存储中间结果。合适的桶大小需要根据实际情况进行调整。overlap_comm
使用的是allgather_bucket_size
和reduce_bucket_size
值的4.5倍。如果它们被设置为5e8
,需要9GB显存(5e8 x 2Bytes x 2 x 4.5)。如果内存大小是8GB或更小,需要将这些参数减少到约2e8
,从而避免OOM,这需要3.6GB显存。如果在大容量GPU上也出现OOM,也需要做同样的调整。stage3_gather_16bit_weights_on_model_save
在保存模型时启用模型 fp16 权重合并。 对大型模型和多GPU,在内存和速度方面都是一项昂贵的操作。 需要设置为True,否则pytorch_model.bin
将不会被创建。
"zero_optimization": {
"stage": [0|1|2|3],
"allgather_partitions": [true|false],
"allgather_bucket_size": 5e8,
"overlap_comm": false,
"reduce_scatter": [true|false],
"reduce_bucket_size": 5e8,
"contiguous_gradients" : [true|false],
"offload_param": {
...
}
}
- optimizer:设置训练优化器的类型和参数,如Adam、Lamb等。具体参数可能由transformers设置,因此config设置为“auto”即可。
"optimizer": { "type": "Adam", "params": { "lr": "auto", "betas": "auto", "eps": "auto", "weight_decay": "auto" } }
- scheduler:设置学习率调度器的类型和参数,如WarmupLR、OneCycle等。
- DS scheduler + DS optimizer: Yes
- HF scheduler + HF optimizer: Yes
- DS scheduler + HF optimizer: Yes
- HF scheduler + DS optimizer: Yes
- train_micro_batch_size_per_gpu:设置每个GPU上训练时的微批量大小。
- steps_per_print:设置每隔多少步打印训练日志。
- wall_clock_breakdown:设置是否记录训练过程中各个部分的时间消耗。
- communication_data_type:设置通信时使用的数据类型,如float16、float32等。
- sparse_gradients:设置是否使用稀疏梯度,以减少通信开销。
- gradient_clipping:设置是否使用梯度裁剪,以防止梯度爆炸。
- prescale_gradients:设置是否在累积梯度之前进行缩放,以防止数值溢出