最近在试着用LoRA微调一个7B的模型做代码生成,显卡是4090 24G。我参考了一些开源项目的写法,设置lora_r=8,lora_alpha=16,batch_size=1,gradient_accumulation_steps=8,max_seq_len=2048。结果跑起来显存直接飙到23G+,偶尔还会OOM。我看很多教程说LoRA应该很省显存,但我这个好像没比全参数微调省多少。已经试过把seq_len降到1024,也只降了2G左右。是不是我的target_modules选太多了?还是说7B模型本身就这样,24G就是勉强?有没有实际跑过类似配置的朋友能分享下你们的显存占用和参数设置?
LoRA微调7B模型显存一直爆,是batch size问题还是我代码写错了?
全部回复
共 100 条24G跑7B LoRA确实紧,但你这占用不对劲,试试gradient_checkpointing开了没,能省不少。
24G跑7B LoRA这个占用其实挺正常的,别被教程里那种“省显存”的说法误导了,那是相对全参微调而言的,不是绝对数值。你seq_len砍到1024只降2G也符合预期,因为激活值占比没那么夸张,大头都在优化器状态和梯度上。建议你检查下是不是把bias或layernorm也设成了可训练,或者target_modules里包含了所有linear层,试着只微调q_proj和v_proj试试。另外可以开gradient_checkpointing,配合8的accumulation steps,显存能压到16G左右,速度慢点但稳。
7B+2048长度本来就这样,24G真不宽裕,试试gradient checkpointing+8bit优化器能省不少。
24G跑7B LoRA这个占用其实挺正常的,我3090跑7B全参微调也是这个量级。你target_modules如果全选了q/k/v/o/gate/up/down,那参数量确实会上去,建议只挑q和v试试。另外检查下是不是把梯度检查点关了,开起来能省不少,就是慢点。我跑同配置大概15G左右,你那个23G确实有点高,代码里可能还有没释放的缓存。
说实话7B+2048长度在24G卡上跑LoRA确实就是这么紧,你那个23G+的占用挺正常的,主要是激活值吃的多,跟target_modules关系不大。我之前跑CodeLlama 7B,seq_len设成1536,batch_size=1,lora_r=16,峰值也到21G左右,后来把gradient_checkpointing开了才降到16G。你可以试试这个,代价是训练慢个20%左右,但至少不OOM。另外你lora_alpha设16配r=8其实偏大了,我一般设成r的两倍也就是16没问题,但如果你不调alpha只降r到4,显存还能再省一点。
同配置跑过,24G确实紧但能压住,试试把gradient_checkpointing开了,能省4-5G。
7B用24G跑LoRA确实紧,你试试开8bit量化加gradient checkpointing,能省不少。
7B用24G跑LoRA这占用确实不正常,检查下是不是把bias或embedding也加进trainable_params了。
24G跑7B LoRA确实紧,但你这占用不太正常。我同样配置跑过,seq_len 2048大概17-18G,你检查下是不是把embedding和lm_head也加进target_modules了,那俩显存大头。另外确认下gradient_checkpointing开了没,不开的话activation能吃掉好几个G。还有,transformers版本太新有时候会偷偷把模型转成bf16加载,反而比fp16更吃显存。
24G跑7B LoRA这占用是正常的,想省显存把gradient_accumulation_steps砍一半换batch试试。
这显存占用看着确实不太对,我拿4090跑7B LoRA一般也就14-16G左右。你试试把gradient_checkpointing打开,然后target_modules别全选,只挑q_proj和v_proj试试,能省不少。另外确认下是不是用了8bit或4bit的基座模型加载,这个对显存影响特别大。
说实话24G跑7B LoRA这个占用太正常了,我之前用3090跑llama2-7B,跟你差不多的配置,峰值也到21G左右。你那个seq_len降到1024只少2G,是因为激活值占大头,LoRA省的是优化器显存而不是这部分。可以试试把gradient_checkpointing打开,能直接砍掉一半激活显存,代价就是慢个20%。另外target_modules不用全加,先只攻q_proj和v_proj试试,我之前这么弄直接从23G降到18G。
24G跑7B LoRA本来就这么紧,我batch=1都得开gradient checkpointing才稳,你试试关掉flash attention。
24G跑7B LoRA其实不算宽裕,你这个配置我试过类似的,显存大头在优化器状态和中间激活值上,LoRA省的是梯度那部分,不是全部。建议把gradient_checkpointing打开,能省3-4G,另外target_modules别全选,像q_proj和v_proj就够了,选太多会增加额外显存开销。你seq_len降到1024只降2G也正常,因为激活值峰值主要集中在前面几层。
说实话24G跑7B LoRA这个占用挺正常的,我自己的经验是4090上batch_size=1、seq_len=2048,光模型权重加优化器状态就得15-16G,LoRA本身确实省显存,但省的是那份可训练参数的梯度,不是省在激活值和中间变量上。你那个23G+的占用,大头其实在反向传播时保存的激活,尤其代码生成这种长序列任务,2048长度的激活非常吃显存。target_modules选太多确实会增加一点显存,但通常不是决定性的,我试过全量target和只选q_proj,v_proj,差距也就1-2G。建议你开一下gradient_checkpointing,这个能直接砍掉一半还多的激活显存,代价是训练速度慢20%左右,但基本能稳在20G以内。另外你gradient_accumulation_steps=8这个设置没问题,它不额外吃显存,只是把梯度累加而已。我跑过类似配置,用bitsandbytes的4bit量化加载基座模型,再加上gradient_checkpointing,显存能压到14-15G,就是训练速度会慢一些。你如果代码没写错,大概率是没开量化或者没开梯度检查点,这两个才是24G跑7B的关键,LoRA本身反而不是瓶颈。
24G跑7B+LoRA确实差不多是这个数,我3090跑7B也经常看到20G上下,你那个23G+算正常偏高。不过你可以检查下是否把bias和embedding也加进target_modules了,这两个特别吃显存,只留q/k/v/o能省不少。另外试试用bitsandbytes加载4bit,配合LoRA能压到12-14G,效果损失很小。还有个小细节,gradient_checkpointing开了没?不开的话activation占大头,开了能再省3-4G。
24G跑7B LoRA其实挺正常的,你这配置我跑过类似的,峰值大概在22G左右,主要是激活值占大头。target_modules别全选,像代码模型只挑q_proj和v_proj能省不少,但效果可能略降。另外你可以开gradient_checkpointing,能再挤出来3-4G,虽然慢点但稳。我试过seq_len降到512配合4bit量化,显存能压到12G,不过代码生成质量确实会打折扣。
你这配置看着挺正常的,问题大概率不在target_modules,而是7B模型本身在2048长度下,即便LoRA也要把激活值留在显存里,24G就是会吃紧。我之前用4090跑7B LoRA,seq_len得压到1024,同时开gradient_checkpointing才能稳在20G左右,不然峰值照样飙。建议你把gradient_checkpointing打开,然后看一下是不是把bias或embedding也设成可训练了,这俩特别吃显存。
24G跑7B LoRA本来就紧巴巴的,你试试gradient checkpointing加8bit优化器能省不少。
说实话你这个配置我太熟了,之前用4090跑7B也踩过一模一样的坑。LoRA省显存是真的,但前提是你没把整个模型的所有线性层都塞进target_modules里,我猜你八成是把q,k,v,o,gate,up,down全加了,那其实跟微调大部分参数没区别,峰值显存自然下不来。我实测过只target q和v,lora_r=16,seq_len=2048,batch_size=1,梯度累积8,峰值能压在14G左右,训练速度还快不少。另外你算一下激活显存,7B模型光是权重加载就要14G,加上AdamW的优化器状态和梯度,如果LoRA层太多,额外开销确实会逼近全参数微调。建议你开一下gradient_checkpointing,这个能省3-4G,代价是慢20%左右,但总比OOM强。还有个小技巧,把模型加载成bf16而不是fp16,有时候能省一点显存还更稳定。最后说句实话,24G跑7B LoRA确实不算宽裕,但绝对够用,关键是别贪心,target_modules少选几个,seq_len别硬顶2048,我甚至见过有人用512的seq_len跑代码生成,效果也没差多少。