最近在试着用LoRA微调Llama3-8B来做我们公司的客服问答模型,数据集大概一万多条。我显卡是两张RTX 4090,但每次设batch size=4就显存溢出,降到2又跑得慢得要命,一个epoch要十几个小时。我看别人说用gradient accumulation可以等效大batch,但设成4步累积之后,loss曲线一直抖,收敛效果很差。想问问有经验的大佬,这种规模的模型和数据集,batch size和累积步数到底怎么搭配比较合理?还有,是不是我LoRA的rank设太高了(我设的32)?或者数据集里长文本太多(平均500 tokens)导致的?求指教,我调了好几天了,心态有点崩。
用LoRA微调Llama3-8B做客服,batch size设多大才不崩?
全部回复
共 167 条两张4090跑Llama3-8B的LoRA,batch size=4就OOM其实挺正常的,别忘了4090只有24G显存,模型权重加载完加上优化器状态和激活值,留给batch的空间真不多。你LoRA rank=32确实偏高了,做客服问答这种任务rank 8到16基本够用,rank翻倍显存占用也会涨不少,建议先降到16试试,说不定batch就能开到4了。gradient accumulation那个抖动问题,我觉得不一定是累积步数本身的锅,学习率可能得跟着调,等效batch变大之后学习率不匹配就会导致loss震荡,可以试试把学习率稍微降一点或者加个warmup。平均500 tokens不算特别长,但你得看max_length设了多少,如果padding到1024那显存浪费就很严重了,用packing或者按batch内动态padding能省不少。一个epoch十几个小时确实折磨,不过一万多条数据如果质量高,其实LoRA微调1到2个epoch就差不多了,不用死磕很多轮。实在不行可以考虑QLoRA,4bit量化之后显存压力小很多,两张4090跑起来会舒服不少,速度损失也能接受。
rank 32确实偏高了,客服任务8或16就够,先降rank再开gradient checkpointing试试。
rank 32有点高,降到8或16先试试,4090双卡跑500token确实吃力。
两张4090跑8B别硬堆batch,试试per_device=1累积8步,rank降到16先。长文本才是真凶,500token建议截断或分桶。
两张4090跑8B的LoRA,batch size=2其实挺正常的,别太焦虑。我建议你试试per_device_batch=1配gradient accumulation=8或16,再把lr稍微降一点(比如1e-4),loss抖很多时候是累积步数大了但学习率没跟着调。rank=32对客服这种任务确实偏高,16甚至8通常够用,还能省显存。500 token不算长,但你可以开gradient checkpointing,配合flash attention,显存能松不少。
有没有更详细的教程推荐?
两张4090跑Llama3-8B的LoRA,batch=4就OOM有点反常,先确认下有没有开gradient checkpointing和flash attention,这俩开了显存能省不少。rank=32对客服这种垂直场景其实偏高了,16甚至8一般就够,降下来显存和过拟合都会好一些。gradient accumulation后loss抖是正常的,因为BN统计和优化步频变了,建议把lr稍微调低、warmup拉长再看曲线。另外500 tokens平均不算长,但要看分布,如果有不少两三千的样本,按token数分桶能明显提速。