最近在用LoRA微调一个7B的开源模型,配置是单卡A100 40G。我看很多教程都说batch size设1或者2就行,但我只要seq length超过2048就报CUDA OOM,哪怕batch size=1也崩。我试了gradient checkpointing和混合精度,稍微好一点,但训练速度慢得离谱,一步要十几秒。是我哪里设置错了,还是7B模型本来就不适合单卡微调长文本?求有经验的大佬指条路,是不是得上8bit量化?或者有没有什么trick能稳定跑起来,感谢!
微调7B模型总OOM,是不是我batch size设得不对?
全部回复
共 148 条试试把优化器从Adam换成Adafactor或者8bit的AdamW,优化器状态在长序列下占显存很凶。另外A100 40G单卡跑2048长度的7B LoRA,激活值本身就不小,gradient checkpointing能省显存但确实会拖速度,十几秒一步算正常范围。8bit量化能救急,但QLoRA对长文本效果会打折扣,建议先确认你的数据是不是真的需要2048,很多任务截断到1024影响不大。
试试flash attention加8bit优化器,长序列下显存能省不少。
试试deepspeed zero3加cpu offload,长序列确实吃显存,单卡40G跑2048有点勉强,换8bit量化能省不少。
单卡A100 40G跑7B的LoRA,seq length 2048以上OOM其实挺常见的,不一定是batch size的锅。关键得看你的优化器状态和激活值占用,LoRA虽然冻结了原模型参数,但前向激活和gradient checkpointing的临时缓存还是吃显存的大头。你开gradient checkpointing后变慢是正常的,它本质是用计算换显存,一步十几秒在长序列下不算离谱。可以试试把optimizer换成adafactor或者8bit adamw,优化器状态能省不少。另外flash attention 2一定要开,对长序列的显存和速度改善非常明显,比单纯调batch size管用。如果还不行,就得考虑deepspeed zero2或者zero3的offload,把优化器和部分参数扔到CPU内存。8bit量化微调也是个路子,qlora在40G上跑2048长度基本稳,但推理和合并权重时要注意精度损失。7B单卡长文本不是不能跑,是得把显存花在刀刃上,建议先查一下torch.cuda.max_memory_allocated看瓶颈到底在哪。
试试deepspeed zero3加cpu offload,40G跑2048序列单卡确实紧,8bit量化也值得试。
seq length 2048 以上单卡 40G 跑 7B LoRA 确实会吃紧,光模型权重加优化器状态就占掉不少,激活值再一叠加基本就爆了。我建议先上 8bit 量化加载,再配合 gradient checkpointing,一般能稳住,速度慢是正常的,毕竟重算前向。另外可以试试 flash attention 2 和把 LoRA 的 target modules 调一下,别全挂上去。真要跑长文本,QLoRA 加 paged optimizer 会更实际,单卡能撑住但别指望快。
刚入门,这个对我帮助很大。
有没有更详细的教程推荐?