1.含义
ZeRO是一种针对大规模分布式深度学习的新型内存优化技术。
在DeepSpeed下,ZeRO训练支持了完整的ZeRO Stages1, 2和3,以及支持将优化器状态、梯度和模型参数从GPU显存下沉到CPU内存或者硬盘上,实现不同程度的显存节省,以便训练更大的模型。
2.不同stage的区别
Stage 1: 把 优化器状态(optimizer states) 分片到每个数据并行的工作进程(每个GPU)下
Stage 2: 把优化器状态(optimizer states) + 梯度(gradients)分片到每个数据并行的工作进程(每个GPU)下
Stage 3: 把优化器状态(optimizer states) + 梯度(gradients) + 模型参数(parameters)分片到每个数据并行的工作进程(每个GPU)下
这段配置看起来像是深度学习训练过程中的一些优化选项,特别是针对大规模分布式训练场景。下面我将尽量用简单的方式解释每个参数的作用:
Zero Optimization 零冗余优化
- stage: 这里设置为1,意味着使用ZeRO-Offload技术的第一阶段,它主要是减少内存使用,通过将模型的状态(比如梯度)卸载到CPU或磁盘上来节省GPU显存。
- allgather_partitions: 如果为真,则在AllReduce操作期间,将数据分区并并行传输,这样可以提高通信效率。
- allgather_bucket_size: 控制AllGather操作的数据包大小,较大的值可以减少通信开销,但可能会增加内存需求。
- overlap_comm: 如果为真,则允许通信与计算重叠,从而提高效率。
- reduce_scatter: 使用ReduceScatter操作代替传统的AllReduce操作,可以减少通信量。
- reduce_bucket_size: 控制ReduceScatter操作的数据包大小。
- contiguous_gradients: 如果为真,则确保梯度在内存中是连续存储的,这有助于提高性能。
FP16 混合精度训练
- enabled: 设置为"auto"意味着框架会自动决定何时启用FP16(半精度浮点数)训练。
- auto_cast: 如果为真,则自动将模型的操作转换为FP16,从而加速计算。
- loss_scale: 初始损失缩放因子,通常设为0表示让系统自动调整。
- initial_scale_power: 初始损失缩放的指数。
- loss_scale_window: 在多少个步骤内调整一次损失缩放因子。
- hysteresis: 调整损失缩放因子时的迟滞系数。
- min_loss_scale: 最小损失缩放值。
BF16 混合精度训练
- enabled: 设置为"auto"意味着框架会自动决定何时启用BF16(bfloat16,一种浮点数格式)训练。
Optimizer 优化器
- type: 使用AdamW优化器。
- params: AdamW的参数。
- lr: 学习率,设置为"auto"意味着自动调整。
- betas: 动量项,通常保持默认值即可。
- eps: 防止除零错误的小常数。
- weight_decay: 权重衰减,防止过拟合,设置为"auto"意味着自动调整。
其他参数
- gradient_accumulation_steps: 多少步梯度累积后更新一次权重,设置为"auto"意味着自动调整。
- gradient_clipping: 梯度裁剪的阈值,设置为"auto"意味着自动调整。
- steps_per_print: 每多少步打印一次训练状态。
- train_batch_size: 训练批次大小,设置为"auto"意味着自动调整。
- train_micro_batch_size_per_gpu: 每个GPU上的微批次大小,设置为"auto"意味着自动调整。
- wall_clock_breakdown: 如果为真,则记录各个训练阶段的时间消耗。
总的来说,这些配置项帮助我们有效地管理训练过程中的内存使用、计算资源分配以及训练速度,同时尽可能减少训练时间和成本。设置为"auto"的地方通常意味着让训练框架根据实际情况自动选择最佳策略。