最近在调一个BERT的微调任务,单卡显存不太够,想把训练改成多卡并行。查了一些资料,发现PyTorch自带DistributedDataParallel(DDP),但很多人又说DeepSpeed或者Hugging Face的Trainer更省心。我试了一下DDP,写了个torchrun命令,跑是能跑,但loss曲线有点奇怪,不知道是不是梯度同步出了问题。另外DeepSpeed的ZeRO优化看起来挺香,但配置又复杂,怕踩坑。想问下大家,对于一个还在熟悉分布式训练的萌新,应该从哪个框架入手比较稳?有没有一些现成的模板或者最佳实践可以抄作业?感谢!
PyTorch 分布式训练用DDP还是DeepSpeed?新手有点懵
全部回复
共 167 条先用DDP把单机多卡跑通再说,loss怪就检查下每卡batch和lr是不是没按卡数缩放。
ZeRO香是香,但新手建议直接抄HF Trainer的DDP默认配置,省得自己调同步踩坑。
先用DDP跑通,loss曲线怪大概率是没设对seed或batch size,等稳定了再上DeepSpeed不迟。
先别急着上DeepSpeed,DDP的loss曲线怪多半是learning rate没按卡数调,你把batch size和lr同步放大试试。
DDP的loss曲线怪,先检查下batch size是不是没按卡数翻倍,多卡默认是data parallel,学习率没调的话收敛路径确实会不一样。新手别一上来就上DeepSpeed,配置坑多,debug起来更头疼。建议先用HF Trainer,它把DDP和梯度累积都封装好了,改几个参数就能跑。等彻底搞懂DDP的同步机制了,再碰ZeRO不迟。
DDP的loss曲线奇怪大概率是梯度同步或者学习率没跟着卡数调,我刚开始也踩过这坑,建议先把batch size和lr按线性缩放试试。如果单卡只是显存不够、模型不算超大,其实DDP加gradient checkpointing就够用了,没必要一上来就DeepSpeed。DeepSpeed的ZeRO确实省显存,但配置门槛对新手不太友好,可以先拿Hugging Face Trainer跑通,它内部能直接切DDP和DeepSpeed,当模板抄最省事。
DDP跑起来loss曲线怪,大概率不是梯度同步的问题,而是学习率没跟着卡数调整。很多人第一次用torchrun都会踩这个坑,单卡的学习率直接搬到多卡上,等效batch size翻倍了,loss不飘才怪。建议先把warmup拉长一点,学习率按线性缩放试试,一般能救回来。DeepSpeed的ZeRO确实香,但配置那个json对新手不太友好,光是stage 2和stage 3的区别就够研究半天,而且跟Trainer耦合之后出问题更难debug。我的建议是先用Hugging Face Trainer加DDP把流程跑通,Trainer内部已经帮你处理了梯度累积、混合精度这些杂事,等你能稳定复现单卡效果了,再考虑换DeepSpeed上ZeRO-2省显存。真要用DeepSpeed的话,Hugging Face的examples仓库里有现成的ds_config模板,直接抄比自己从零写靠谱多了。
建议先用Hugging Face Trainer跑通,它底层就是DDP,但把sampler、梯度累积、混合精度都封装好了,改几个参数就能多卡,loss曲线也稳。等你摸清数据并行这套逻辑之后,再上DeepSpeed的ZeRO-2或ZeRO-3,配置文件直接抄官方example就行,别自己从零写。DDP那个loss诡异大概率是没加DistributedSampler或者忘了set_epoch,多卡重复采样很常见。