最近在试着用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 条7B加2048长度本来就要20G左右,LoRA省的是优化器显存,你这配置正常,想稳就开8bit量化。
24G跑7B LoRA不算宽裕,正常。试试把gradient_accumulation_steps拆成4,或者开8bit优化器,能省不少。
我也遇到过,7B加LoRA真没想象中省。检查下是否把bias也设成trainable了,顺手把optimizer换成adamw_8bit试试。
24G跑7B LoRA这个占用其实挺正常的,我3090跑类似配置也差不多20G往上。你试试gradient_checkpointing开了没,能省不少,另外target_modules别全选,像q_proj和v_proj就够用了。还有,LoRA省显存主要省在优化器状态和梯度上,但激活值该占还是占,所以seq_len影响没那么大。我之前用deepspeed stage2再加cpu offload才压到16G左右,你可以参考下。
别说,7B加2048长度24G确实紧,我跑13B lora也就这占用,试试8bit加载能省不少。
24G跑7B LoRA本来就很紧,试试把lora_alpha降到8或者关掉梯度检查点,能省不少。
24G跑7B+LoRA这个占用其实挺正常的,我3090跑类似配置也差不多20G出头。你target_modules如果全选了q/k/v/o,占用的确会上去,但主要还是7B基座本身的前向激活值吃显存,LoRA省的是优化器状态和梯度。建议试试把gradient_checkpointing开了,能再省3-4G,代价是训练慢个20%左右。另外你max_seq_len 2048其实挺激进的,代码数据集里长样本多的话,可以试试用排序截断把样本控制在1024以内,效果不比硬拉到2048差。
这配置看着没啥毛病,问题大概率不在target_modules,而是7B模型本身在2048长度下,即使LoRA也得吃下完整的激活值。我跑过类似实验,24G卡上batch_size=1,seq_len压到1024,LoRA显存大概在16-18G,你那个23G确实偏高。建议检查下是不是把gradient_checkpointing漏了,那个能省不少,还有attention的flash attention开了没,这两个加起来差距能有5G以上。
另外你参考的开源项目里,训练时有没有用deepspeed或者accelerate的zero2?有时候框架默认行为也会额外吃显存。我自己的经验是,7B+LoRA在24G卡上,batch=1,seq=2048,不开梯度检查点就是会逼近极限,开了之后能稳在20G以内。你先试试把gradient_checkpointing打开,再把optimizer换成adamw_8bit,应该能解决OOM。
7B用LoRA在24G上就是这个量级,正常,想省显存试试梯度检查点加8bit优化器。
4090跑7B LoRA这配置差不多到头了,想再省就上8bit或4bit量化吧。
24G跑7B LoRA这个占用其实挺正常的,我之前用A10也是类似情况。你注意看,LoRA省的是优化器状态和梯度,但激活值这块它一点没省,seq_len2048的时候激活值才是显存大头。你把batch_size降到1其实已经极限了,建议看看是不是开了gradient_checkpointing,没开的话能省3-4G,但训练速度会慢大概30%。另外target_modules别贪多,我一般只打q_proj和v_proj,全打上虽然效果可能好点,但显存确实会涨。还有个小技巧,把optimizer换成adamw_8bit,或者用torch.compile配合混合精度,能再挤出一部分空间。不过说实话,24G跑7B做代码生成就是比较吃紧,我最后是换成了6.7B的模型才舒服点,或者你试试把max_seq_len按代码长度动态裁剪,别固定2048。你那偶尔OOM是不是发生在loss计算或者梯度同步的时候?如果是,检查下有没有把label也pad到max_len,有时候这个小细节会爆内存。
24G跑7B LoRA这个占用其实挺正常的,我3090之前跑类似配置也差不多,关键是你把gradient checkpointing开了没?那个能省不少。另外target_modules别贪多,我一般只打q_proj和v_proj,效果也没差太多。你试试把optimizer换AdamW8bit,显存能再挤点出来,不过说实话这个规模想流畅跑还是得上双卡或者A100。
24G跑7B LoRA这个占用其实挺正常的,我拿3090试过类似配置,seq_len 2048下基本也是23G上下浮动。问题大概率不在target_modules,而是7B的KV cache和激活值本身就吃显存,LoRA省的是优化器状态和梯度,这部分省下来的空间被长序列吃回去了。你试试gradient_checkpointing开了没,我开了之后能压到17G左右,代价是训练慢个20%。另外可以看看是不是把未冻结的模块也算了梯度,有些库默认会把layernorm也设为可训练,那显存就上去了。
24G跑7B LoRA确实有点紧,但你这个占用不太正常。我之前用同样配置跑过,显存大概在16-18G左右,你把gradient_checkpointing开了吗?这个能省不少。另外target_modules别贪多,我一般只改query和value,全改了显存涨得飞快。还有optimizer选paged_adamw,能再挤出一点空间。
24G跑7B LoRA这个占用确实不正常,我怀疑你target_modules把attention里的q、k、v、o全加上了吧?那样可训练参数量直接翻倍,显存自然压不住。我最近跑CodeLlama 7B,lora_r=16,alpha=32,只挂q和v,seq_len还是2048,batch_size=1,峰值大概15G左右,挺稳的。另外你检查下是不是把梯度和优化器状态也塞进显存了,开了gradient_checkpointing没?那个能省不少,代价就是慢一点。
24G跑7B LoRA本来就紧,你试试gradient checkpointing再关掉all_linear,能省不少。
这配置没毛病,7B加2048长度就是吃显存,4090跑满正常,代码没啥大问题。
说实话你这个配置我太熟了,之前用4090跑7B的时候也是卡在23G左右,后来发现瓶颈其实不在batch size。LoRA省显存主要是省了优化器状态和梯度,但激活值这块完全没省,7B模型2048序列长度单卡就是很吃紧。你可以试试gradient_checkpointing打开,能省差不多4-5G,代价是训练慢个20%左右。还有target_modules别贪多,我试过只选q_proj和v_proj比全选能省1.5G,效果其实差别不大。另外你看下是不是用了flash-attention,没换的话建议换上,显存能再降一点。说实话24G跑7B LoRA不算勉强,但确实是贴着上限,要留出余量的话建议把seq_len压到512,或者换Qwen1.5-4B这种更小的基座。我最后是batch_size=1, seq=1024, checkpointing开着,峰值稳定在17G左右,你可以参考下。
24G跑7B+LoRA本来就这么紧,我batch_size=1也得关梯度检查点才稳。
target_modules别贪多,只喂q和v试试,能省不少显存。
24G跑7B LoRA确实就是紧巴巴的,我拿4090试过跟你几乎一样的配置,峰值也就比你低一两个G。关键其实不在target_modules,而是7B的基座模型权重加载本身就要占14G左右,LoRA省的是优化器状态和梯度,不是模型本体。你可以试试把优化器换成AdamW8bit,再把gradient_checkpointing打开,我这边显存能压到19G上下,就不怎么OOM了。另外seq_len从2048砍到1024只少2G很正常,因为KV cache才是大头,这模型长序列就是吃显存。
7B加2048长度24G就这样,正常,想省显存得上qlora或者gradient checkpointing。
7B+2048长度本来就要20G打底,LoRA省的是优化器显存,你这配置正常,把seq_len砍到512试试。