最近在尝试微调一个7B的基座模型,用的LoRA,但batch size设到2就爆显存了(24G卡)。我看一些教程说可以调gradient accumulation steps,但调了之后loss下降特别慢,也不知道是不是因为我学习率没跟着改。想问问有经验的朋友:你们微调时batch size大概设多少?显存不够是不是只能换更小的基座模型?另外,gradient accumulation steps设到8以上会不会影响模型收敛质量?有点迷茫,谢谢大家!
微调大模型时显存总爆,大家batch size一般设多少?
全部回复
共 170 条24G跑7B LoRA,batch size 2就爆,大概率是序列长度拉太长了,先看看max_seq_len是不是设了2048甚至更高,砍到512能省不少。gradient accumulation本身不影响收敛质量,它只是等价于大batch,但你学习率得跟着放大,不然loss当然降得慢。我一般accumulation开到8到16,lr同步乘个两三倍,效果挺正常的。显存实在不够优先上gradient checkpointing和8bit优化器,换小模型是最后一步。
24G卡跑7B LoRA,bs=2就爆有点奇怪,你开gradient checkpointing了吗?这个能省不少显存,代价是慢一点。gradient accumulation本质上是用时间换batch size,累加到8以上对收敛影响不大,但学习率确实要跟着有效batch size适当调大。我之前用3090跑7B,bs=1加accumulation=16,lr调到2e-4左右效果还行。显存实在不够可以考虑QLoRA,4bit量化后能省一半多显存,质量损失也不算明显。
24G卡跑7B的LoRA,batch size开到2就爆其实挺常见的,你试试把max_length降一降,很多时候是序列长度把显存吃光了。gradient accumulation steps调到8以上一般不会影响收敛质量,等效batch size大了反而更稳,但学习率确实得跟着往上提一点,不然loss下降慢很正常。显存实在不够也不一定要换小模型,先开gradient checkpointing加上8-bit优化器,通常能再挤出不少空间。
24G卡跑7B LoRA,bs=2就爆确实有点紧,先看看是不是没开gradient checkpointing,或者optimizer用了普通Adam而不是8bit的。我一般bs=1配合grad accum 4到8,学习率会按累积步数适当放大一点,不然loss降得慢很正常。累积步数本身不太影响收敛质量,只要总batch size和学习率匹配就行,倒是训练时间会拉长。显存实在不够优先考虑换QLoRA或者更小的基座,别硬扛。
24G跑7B LoRA设2就爆有点怪,试试开gradient checkpointing,能省不少显存。
24G跑7B LoRA,bs=2就爆有点快了,你是不是max_length拉得特别大?我一般把cutoff设512,bs=1配grad accumulation 8,等效batch也够用。accumulation本身不伤收敛,但它不改变每步的样本多样性,学习率还是得跟着等效batch适当调一下。实在不行先上gradient checkpointing,能省不少显存,比直接换小模型划算。
24G跑7B LoRA确实紧,我一般也就设1到2,grad accum开大了记得把学习率按比例提上去,不然loss掉得慢很正常。
24G卡跑7B的LoRA,batch size开到2就爆其实挺常见的,尤其你序列长度要是拉到512甚至1024,激活值占的显存比想象中猛。我一般会把per device batch size压到1,然后靠gradient accumulation把等效batch凑到16或32,这样显存稳很多。不过gradient accumulation steps调大本身不会直接拖慢收敛,真正的问题是你等效batch变了但学习率没动,相当于每步更新幅度相对变小了,loss看着就磨叽。建议学习率按sqrt或线性比例跟着放大一点试试,比如原来2e-4,等效batch翻四倍可以往3e-4到4e-4靠。另外LoRA的rank和target modules也影响显存,r=8和r=16差别不大,但全挂qkv和只挂qk差挺多。显存不够不一定非得换小模型,先试gradient checkpointing、flash attention、bf16,再把序列长度砍一砍,很多时候就够用了。accumulation设到8以上对收敛质量一般没本质伤害,只要总步数和数据量够,更多是训练动态和调参匹配的问题。
写得挺好,建议补充一些性能数据。
我之前也遇到过类似问题,后来换了方案。