最近在试着用LoRA微调一个7B的Llama模型,任务挺简单的,就是给客服对话做情感分类。我用的是一张4090(24G显存),batch size设到4就直接OOM了,换成1倒是能跑,但训练慢得离谱,而且loss下降特别不稳定。已经试过gradient checkpointing和混合精度训练,感觉效果有限。看网上有人说可以用DeepSpeed ZeRO或者量化到4bit,但不知道怎么配置才不崩。想问问有经验的老哥,显存不够的情况下,怎么平衡速度和效果?另外,有没有推荐的库或者trick,能让我这张卡撑住微调?先谢过了!
自己用PyTorch微调Llama,显存总爆掉,有什么省钱又实用的技巧吗?
全部回复
共 157 条试试QLoRA加4bit量化,24G跑7B绰绰有余,batch size能上到8,速度也不慢。
我之前搞7B也是被显存折磨得够呛,24G卡跑LoRA其实4bit量化就够了,用bitsandbytes加载模型时直接指定load_in_4bit=True,batch size能拉到8甚至16。另外DeepSpeed ZeRO Stage 2或者3配合gradient accumulation也挺管用,我一般是设accumulation steps=4,这样单卡也能跑大batch的效果,loss曲线稳很多。还有个小trick是调低lora的r值,比如从16降到8,参数量少一半,对下游任务影响不大但省显存明显。
说实话你这情况我太熟了,4090跑7B LoRA确实得精打细算。4bit量化真的值得试,用bitsandbytes加QLoRA那套,显存能直接压到12G左右,batch size开4甚至8都稳,我试过效果和FP16差别不大。但注意量化后要把lora模块改成float32或者bf16训练,不然loss飘得厉害。DeepSpeed ZeRO Stage 2或3配合offload也能救急,不过配置要改对,尤其offload_params和offload_optimizer得分开写,不然容易崩。你提到loss不稳定,我猜是学习率太高或者warmup步数不够,试试把lr降到1e-4以下,加个cosine scheduler,收敛会平滑很多。另外如果数据量不大,可以试试把embedding层和lm_head也冻结,只训lora的A和B矩阵,显存能再省一点。库的话推荐用Hugging Face的PEFT加transformers,版本别太老,4.35以后对Llama支持好很多,有些bug修了。最后啰嗦一句,batch size 1虽然慢,但用梯度累积模拟大batch也能稳loss,设个8步累积效果接近batch size 8,显存还是只占1份。
老实说24G跑7B LoRA其实挺够用的,我怀疑你这batch size 4爆掉可能是数据处理或者配置上有点小问题。LoRA本身只更新低秩矩阵,显存大头还在模型本身和梯度上,你试试把gradient checkpointing打开之后再配合DeepSpeed ZeRO stage 2,一般能把激活内存压到很低的水平。4bit量化我也用过,用bitsandbytes的NF4配置,只要加载时设好bnb_4bit_compute_dtype为float16,基本不会崩,而且模型大小能直接砍到5G左右,这样你batch size就能提到8甚至16。不过量化有个坑是训练收敛会慢一点,尤其情感分类这种任务对精度敏感,建议先跑个小数据集验证一下loss走势。另外你可以考虑用Unsloth这个库,它对LoRA做了显存优化,配合4bit甚至能跑到batch size 32,而且速度比原版Hugging Face快不少。不过你说loss下降不稳定,我猜也可能是学习率没调好,LoRA的rank值设到8或16就行,别太高,试试把lr降到2e-4左右看看。
试试bitsandbytes的4bit量化加LoRA,24G能塞下7B,batch size开到8都稳。
4090跑7B用LoRA按理说24G是够的,你batch size设1然后loss不稳可能是学习率没调好,试试把lr降到1e-4以下,配合warmup步数拉长点。量化到4bit的话推荐bitsandbytes,配置起来不复杂,跑7B大概能省一半显存,batch size提到4或8问题不大。DeepSpeed ZeRO 2也可以开,配合gradient checkpointing基本能稳住,就是代码里要多加几行配置,网上搜个模板照着改就行。另外你数据量不大的话,试试用PEFT库里的LoRA,rank设8或16,效果够用还省显存。
同感,我拿4090试过7B LoRA,batch size开1确实折磨,loss跳得跟心电图一样。后来用了bitsandbytes的4bit量化加载模型,配合peft库的LoRA配置,batch size能撑到8,速度也能接受。deepseed zero stage 2也能用,但别用stage 3,容易踩坑。另外你试试把优化器换成Adafactor,省显存又稳,梯度累积步数设到8-16步效果不错。
4090跑7B LoRA的话,4bit量化确实是目前最省显存的路子,搭配bitsandbytes直接load_in_4bit就行,batch size能提到8甚至16,速度反而比没量化时快。DeepSpeed ZeRO 2或3也可以试试,但7B模型单卡开ZeRO 3反而可能因为通信开销变慢,ZeRO 2配合gradient checkpointing更实际。另外别忽略数据集大小——如果数据量不大,试试只微调最后几层transformer block,效果和全量LoRA差不多,显存能省下一大截。
LoRA加4bit量化基本能压住,batch size设1开梯度累积,我4090跑7B就这么稳的。
4090跑7B用LoRA按理说24G不该这么惨,你试试把LoRA的rank降到8或者4,再配合bitsandbytes的4bit量化,显存能压到12G左右。DeepSpeed ZeRO Stage 2或3确实有用,但别开offload到CPU,速度会慢到怀疑人生。另外可以看看Unsloth这个库,专门优化过微调显存,我试过同样配置batch size能翻倍。
直接上QLoRA加4bit量化,24G跑7B绰绰有余,batch size开8都没问题。
batch size设1确实太慢了,试试用bitsandbytes做4bit量化加LoRA,显存能省一半。
显存不够确实头疼,我之前也遇到过类似情况。建议试试bitsandbytes的4bit量化+QLoRA,7B模型能压到6-8G显存,batch size设8都没问题。跑的时候记得把target_modules选对,别全量微调,loss不稳定的话把学习率降到1e-4以下再看看。
4090跑7B LoRA确实得精打细算,4bit量化加Unsloth库能省不少显存,我试过batch size调到8还能稳住。DeepSpeed ZeRO stage 2可以配一下,但注意别开offload否则速度反而拉垮。另外你的学习率是不是设太高了?loss不稳有时候是优化器参数没调好,试试warmup steps加一点。
建议试试QLoRA+4bit量化,刚用3090跑过7B,batch size能到8,loss也稳很多。
一张4090跑7B的LoRA,batch size=4爆显存大概率是因为序列长度没控制好,试试把max_length砍到512甚至256,很多时候情感分类用不到那么长的上下文。DeepSpeed ZeRO 2实测能省不少显存,配置起来也就改几行代码的事,网上模板直接抄就行;4bit量化可以用bitsandbytes,但注意LoRA适配器也转成4bit可能会掉点,建议先试NF4加双重量化。还有个小trick:开启torch.compile能稍微提速,虽然第一次编译慢点,但后面迭代会快不少。
试试QLoRA加4bit量化,batch size开到2再配合梯度累积,24G跑7B完全够用。
同款痛苦,4090跑7B确实得抠着用。我试过QLoRA的4bit量化,配置起来没想象中那么玄乎,直接用bitsandbytes库加个参数就行,batch size能提到8,loss也稳很多。另外可以试试把序列长度砍到512,情感分类用不了太多上下文,省下的显存够你提batch size了。
显存不够的话试试bitsandbytes的4bit量化加LoRA,batch size能拉到8以上,速度也还行。
4bit量化加LoRA显存直接砍半,我3090跑7B batch size能到8,建议试试bitsandbytes库。