最近想自己微调一下Qwen2.5-7B模型做垂直领域任务,用的两张4090,显存24G。试了LoRA,batch_size调到1,gradient_accumulation_steps也设了4,但跑不到几百步就OOM。看HuggingFace官方文档说用bitsandbytes量化到4bit可以省显存,加载是成功了,但训练时loss反而比fp16高不少,不知道是不是我参数设错了?另外,有没有必要用DeepSpeed ZeRO Stage 2或者3?看网上说两张卡用Stage 2效果不大,但显存确实紧张。有没有老哥分享下实际能跑起来的配置,或者换个更小参数的模型(比如1.8B)会不会更适合新手入门?求指点,感谢!
新手求问:用PyTorch跑千问7B微调,显存一直爆该怎么办?
全部回复
共 172 条4090双卡跑7B其实挺尴尬的,24G单卡上4bit LoRA勉强能塞下,但你说loss比fp16高不少,这大概率不是参数设错,而是4bit下优化器状态和梯度的精度损失被放大了,尤其你用AdamW的时候,一阶二阶动量在低精度下很容易飘。我之前试过用bnb的nf4配合双卡,把模型切到两张卡上但LoRA只挂在一张卡上,另一张专门放优化器状态,这样能省不少,但速度会慢一些。
DeepSpeed ZeRO Stage 2在双卡上确实收益不大,主要它省的是优化器状态和梯度,但你这情况瓶颈在激活值和中间张量上,Stage 3的话通信开销又太大,两张卡反而可能更慢。我建议你先试试把max_seq_len砍到512或者更短,很多垂直领域任务用不到那么长上下文,这比任何量化都管用,能直接砍掉一大半激活内存。
另外你提到1.8B模型,说实话如果任务不是特别复杂,直接上Qwen2.5-1.8B加LoRA会舒服很多,训练速度快好几倍,调参也容易,等把流程跑通了再换7B也不迟。还有个偏方,你可以把gradient_checkpointing打开,虽然会慢30%左右,但能省不少显存,配合batch_size=1基本不会OOM了。最后问下你用的transformers版本是多少?新版对Qwen2.5的attention实现优化过,有时候老版本会多占不少显存。
4bit量化loss高正常,建议先用1.8B跑通流程,同时把序列长度砍到512再试。
说实话你这情况我太熟了,当初我用单卡跑7B也是这样,折腾半天最后发现瓶颈不在显存,在内存交换上。bitsandbytes的4bit量化确实会掉点,尤其你用的是NF4而不是FP4的话,loss偏高很正常,而且QLoRA对学习率很敏感,建议把lr降到1e-4以下试试,另外注意target_modules别选太多,全量喂进去照样爆。DeepSpeed ZeRO Stage 2在双卡上确实收益有限,但Stage 3可以配合offload把优化器状态扔到CPU内存,代价是训练速度会慢一半,你要是能忍,可以试试。不过说实话,你这两张4090跑7B LoRA理论上不该这么惨,检查下是不是序列长度设太长或者padding策略有问题,我见过有人把max_length设成4096结果显存直接翻倍的。如果实在调不动,换1.8B绝对是个明智选择,微调速度快十倍,而且垂直领域任务小模型往往够用,等跑通流程再上7B也不迟。另外别忘了关掉梯度检查点,那个虽然省显存但会拖慢速度,有时候反而让OOM更频繁。
4bit训练掉点正常,推理还行,微调还是建议换1.8B或者上DeepSpeed ZeRO3,两张卡能撑住。
说实话7B在双4090上玩LoRA真不该这么憋屈,你这OOM大概率不是显存总量不够,而是峰值显存被中间激活值吃满了。我建议先别急着上4bit量化,试试把seq_len砍到1024或者甚至512,垂直领域任务一般不需要长上下文,这招立竿见影。bitsandbytes那个4bit训练loss偏高挺正常的,因为量化误差在反向传播时会放大梯度噪声,尤其你对学习率不敏感的时候更明显,要么把lr调低到1e-4以下,要么干脆用8bit加NF4混合精度,会稳很多。DeepSpeed ZeRO Stage 2在双卡上确实收益有限,因为每张卡还要存一份完整模型副本,Stage 3倒是能把优化器状态分片,但通信开销和配置复杂度对新手不友好,我建议先手动把gradient_checkpointing打开,配合batch_size=2和accumulation=8,显存压力能降一半。另外你检查下是不是把model.half()和LoRA的dtype搞混了,有时候fp16参数没对齐会导致loss异常。至于换1.8B,如果是纯入门验证流程那当然更省心,但要是任务本身需要7B的语义理解能力,1.8B可能效果差一大截,不如先试QLoRA加PEFT的默认配置,很多坑其实都是自己改参数改出来的。对了,你跑OOM的时候看的是nvidia-smi还是torch.cuda.memory_summary?后者能看到具体哪块分配器爆的,能帮你定位是权重还是激活值的问题。
4bit训练掉点正常,推理够用但微调不推荐,建议先拿1.8B跑通流程再换大的。
直接换1.8B吧,7B双卡微调纯折磨自己,先把流程跑通再说。
量化掉点正常,4bit配合lora微调损失大就换8bit试试,两张卡直接上zero2省心。
4bit量化训起来loss偏高挺正常的,尤其如果你没开bf16或者学习率没重新调,精度损失会被放大。我之前的经验是量化后得把学习率降到原来的1/3左右,不然收敛会很难看。两张4090其实可以考虑不用bitsandbytes,直接fp16+ZeRO Stage2,显存应该够,关键是把seq_len限制到2048以内,然后attention用flash-attention,能省不少。另外你gradient_accumulation设4但batch_size是1,等效batch才4,太小了模型容易震荡,建议直接batch_size=2,accumulation=2,显存压力反而可能更小。如果还是爆,那就别硬撑7B了,1.8B微调出来的效果在垂直领域未必差很多,跑通流程比追求大参数重要。
4bit下loss偏高挺正常的,量化误差在训练中会被放大,尤其LoRA本身也吃精度。建议试下把LoRA的rank调低到8或者4,同时用paged_optimizer,能省不少显存。DeepSpeed Stage 2在两张卡上确实收益有限,但配合offload能把优化器状态挪到CPU,你这种情况可以试试。如果还不行,1.8B起步绝对舒服很多,先把流程跑通再上7B也不迟,毕竟调参和debug才是新手最该练的。
说实话你这个问题我前段时间刚踩过,4bit量化后loss变高挺正常的,尤其QLoRA在低rank下对7B这种模型敏感,建议把lora_rank从8提到16甚至32,学习率降到1e-4附近再试,效果会接近fp16但显存能省一半。
我自己的经验是两张4090跑7B,纯LoRA其实不需要上DeepSpeed,ZeRO Stage 2那点通信开销对双卡反而拖慢速度,真正吃显存的是激活值,你可以试试开启gradient_checkpointing,配合batch_size=1和accumulation=8,峰值能压到16G以内。
另外bitsandbytes加载时注意把bnb_4bit_compute_dtype设成float16,别用默认的float32,不然量化后计算图会额外吃显存,loss波动也会更明显。
不过说实话,新手直接上7B微调有点激进,我一开始也硬刚,后来换Qwen2.5-1.8B+LoRA,一个下午就能跑通全流程,先把数据pipeline和超参调明白,再回来换7B会顺畅很多。
你那个OOM是发生在forward还是backward?如果是backward,多半是optimizer状态没处理好,可以试试paged_adamw_8bit,省下那部分显存。
最后问下你用的什么数据集?如果序列长度超过2048,7B的attention就是显存杀手,裁剪到1024或者用flash-attention能明显改善。
4bit下loss偏高挺正常的,尤其你如果没开bf16混合精度,量化误差会被放大。可以试试把4bit的bnb_4bit_compute_dtype设成bf16,或者换8bit,显存多占点但训练稳很多。ZeRO Stage 2在双卡上确实性价比不高,优先检查下是不是优化器状态和梯度没被正确切分。另外Qwen2.5本身对LoRA的target_modules有推荐配置,默认只调q_proj和v_proj可能收敛慢,试着把gate_proj、up_proj也加上。实在不行直接换1.8B,跑通流程比硬啃7B重要,后面再换大模型调参也顺手。
说实话4bit下loss偏高挺正常的,尤其Qwen2.5这种模型对量化敏感,你试试把NF4改成FP4或者用LLM.int8(),有时候只是量化策略和LoRA的target_modules没搭配好。另外你确认下是不是把量化后的模型也传给了optimizer,很多人犯这个错——4bit权重但Adam状态还是fp32,显存照样爆炸。
双卡4090跑7B其实不用太折腾DeepSpeed,ZeRO Stage 2的通讯开销在两张卡上确实不划算,反而你可以考虑用FlexLoRA或者直接把LoRA的r值降到8甚至4,同时把attention的维度砍一截。我怀疑你OOM的点其实在激活值,开gradient_checkpointing没有?这比调batch size有效得多。
如果实在不想折腾,换1.8B真的是个明智的选择,我认识好几个新手都被7B的显存问题劝退过,1.8B微调完部署也方便,而且垂直领域效果未必差——数据量不够大的话,小模型反而更容易收敛。不过你要是坚持7B,可以试试unsloth这个库,它对Qwen专门优化过,显存占用能再降30%。
顺便问下你用的哪个版本的transformers?最近更新到4.46以后bitsandbytes的4bit训练兼容性出了点问题,回退到4.44试试说不定loss就正常了。
你试试把4bit量化的NF4换成FP4,或者干脆用8bit,我之前遇到过类似情况,量化精度对loss影响挺大的,尤其是小batch下。另外LoRA的target_modules别全加上,只选q_proj和v_proj试试,能省不少显存还说不定更稳。两张4090用ZeRO Stage 2确实鸡肋,不如直接开gradient_checkpointing,这招最管用,我跑13B都能稳住。真要是调不明白,1.8B练手完全够,先把流程跑通再换大模型不亏。
4bit量化loss高正常,先试试ZeRO3+offload,不行就换1.8B练手吧。
4bit量化loss高正常,先把target_modules和lora_alpha调调看,1.8B练手够了,7B两张4090确实紧巴。
DeepSpeed Stage 2在你这个规模收益不大,QLoRA加gradient_checkpointing才是关键,顺手把优化器换成AdamW8bit。
7B在双卡4090上做LoRA其实挺极限的,你这配置OOM大概率是seq_len或者gradient checkpointing没开,先把这两样搞定再考虑量化。4bit下loss偏高很常见,尤其新手调参容易踩坑,不如先用bf16跑通流程,稳定了再折腾量化。DeepSpeed ZeRO Stage 2对双卡确实提升有限,但Stage 3配合offload能救急,就是速度会慢不少。如果只是练手熟悉流程,1.8B绝对更友好,迭代快能试更多想法,等上手了再换7B不迟。
建议先上1.8B练手,把流程跑通再说,7B对新手来说坑太多了。
量化4bit掉点很正常,新手先别折腾DeepSpeed,直接上1.8B跑通流程比硬啃7B划算多了。
4bit量化掉精度正常,试试QLoRA加paged_optimizer,能稳不少。1.8B入门确实更友好,先跑通再上7B。