第一步,同步权重 ls -l /data/xxx/gpu008/MoeRemake/train/etuning/LLaMA-Factory2/models/xxx-Base-10B-200k-Llama |
第二步,同步环境: ./scp_batch.sh "/data/xxx/miniconda3/envs/etuning4/" "/data/vayu/miniconda3/envs/etuning4/" gpu004 gpu006 ./scp_batch.sh "/data/xxx/train/etuning/LLaMA-Factory/etuning44.tar.zst" "/data/xxx/miniconda3/envs/etuning44.tar.zst" gpu004 gpu007 |
3.配置hostfile vim /data/xxx/train/config/hostfile gpu004 slots=8 gpu006 slots=8 gpu007 slots=8 |
Accelerate和DeepSpeed都是用于分布式训练的框架,但它们在多机多卡训练方面有一些主要区别:
总的来说,Accelerate更适合快速上手和一般规模的模型训练,而DeepSpeed则更适合大规模模型和需要高度优化的场景。选择哪个框架取决于具体的项目需求、模型规模和可用的硬件资源。
{
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"gradient_clipping": "auto",
"zero_allow_untested_optimizer": true,
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"bf16": {
"enabled": "auto"
},
"zero_optimization": {
"stage": 3,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"stage3_gather_16bit_weights_on_model_save": true
}
}
{
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"gradient_accumulation_steps": "auto",
"gradient_clipping": "auto",
"zero_allow_untested_optimizer": true,
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"bf16": {
"enabled": "auto"
},
"zero_optimization": {
"stage": 3,
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"stage3_gather_16bit_weights_on_model_save": true
}
}
这两个DeepSpeed配置文件的主要区别在于ZeRO-3优化的设置,特别是参数和优化器的卸载策略。让我们逐行比较并解释为什么第一个脚本(ds_z3_offload_config.json)能够顺利训练,而第二个脚本(ds_z3_config.json)更容易出现显存错误。
相同部分:
关键区别:
ds_z3_offload_config.json 包含了以下额外设置:
json
复制
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
这是两个脚本之间最关键的区别。第一个脚本启用了参数和优化器状态的CPU卸载,而第二个脚本没有。
为什么第一个脚本能顺利训练:
为什么第二个脚本容易出现显存错误:
总结:
第一个脚本通过充分利用CPU内存和高效的内存管理策略,能够处理更大的模型和更复杂的训练场景。它在GPU显存有限的情况下提供了更好的灵活性和稳定性。
第二个脚本虽然也使用了ZeRO-3优化,但由于缺乏CPU卸载策略,在处理大型模型时更容易遇到显存不足的问题,特别是在GPU资源有限的环境中。
为了改善第二个脚本的性能和稳定性,建议添加类似的CPU卸载设置,或者使用具有更大显存的GPU。
DeepSpeed提供了多种优化策略和工具,其中ZeRO和Offload是两种重要的技术,它们有以下主要区别:
总的来说,ZeRO专注于分布式内存优化,而Offload侧重于CPU-GPU异构计算。根据具体的硬件资源和模型规模,可以选择合适的优化策略或组合使用。