最近在试着用LoRA微调Qwen2.5-7B,用的是单张4090(24G),按理说显存应该很充裕。但我发现训练速度只有大概5-6 steps/s,batch size=1,序列长度也就512。看日志loss在降,但心里没底——这速度正常吗?我看网上有人说用同样的卡能跑到十几steps/s,他们是不是用了什么加速技巧?还是说7B模型本来就这样?另外我用的transformers+peft,没开flash attention,也没用deepspeed,是不是这里少了什么关键配置?希望有经验的朋友指点一下,先谢过了。
用LoRA微调7B模型,显存够但训练速度极慢正常吗?
全部回复
共 30 条5-6 steps/s对于7B模型单卡4090来说其实算正常范围了,尤其你还没开flash attention。网上那些十几steps/s的大概率是用了bf16混合精度+flash attention,再加上对输入做了padding对齐或者用了梯度累积来变相提高吞吐。你这配置里transformers+peft本身没问题,但建议把attention实现换成flash,能明显提速,另外确认下是不是用的torch.compile,这个对某些模型也有奇效。还有个小细节,你序列长度512但batch size=1,显存利用率其实不高,可以试试梯度累积加到8,然后把batch size提到2或4,吞吐会上去不少。至于loss在降就不用太焦虑,7B模型收敛速度本来就不快,关键是看每个step的loss下降趋势是否平滑。如果实在想对比,可以装个unsloth库,它对LoRA训练做了很多底层优化,同配置下速度能快30%以上。不过话说回来,训练速度只要稳定且显存不爆,就优先关注loss曲线和验证集效果,别太纠结那几个step数。
没开flash attention肯定慢啊,加上它速度能翻倍,再试试gradient checkpointing。
没开flash attention肯定慢啊,先把这个加上试试,序列512也不长。
5-6 steps/s 对于7B LoRA在4090上确实偏慢,我这边类似配置能跑到12-15左右,关键差别就是flash attention。没开FA的话attention那块计算量大不少,而且序列512其实不算短。建议先把attn_implementation换成flash_attention_2,再把gradient checkpointing关掉试试,应该能明显快一截。另外确认下peft版本,老版本有时候target_modules配得不对也会拖速度。
没开flash attention肯定慢啊,开上能快不少,另外bs=1本来就难跑满,试试gradient accumulation。
5-6 steps/s 对 7B LoRA 来说确实偏慢,但也不算离谱。关键问题是你没开 flash attention,这个对长序列影响很大,512 长度下能差出 30% 以上。另外 transformers+peft 默认的 dataloader 和 optimizer 配置也比较保守,试试开 gradient checkpointing 加 torch.compile,再把 dataloader num_workers 调大点。网上那些十几 steps/s 的基本都上了 flash attn2 或者 unsloth,纯原生配置很难跑到那个数。
没开flash attention肯定慢啊,开上能快不少,我4090跑7B LoRA也就这速度,别慌。
5-6 steps/s对7B LoRA来说确实偏慢了点,4090上正常应该能到10以上。flash attention影响挺大的,开了之后attention那块能快不少,建议先加上attn_implementation="flash_attention_2"试试。另外检查下dataloader的num_workers是不是设成0了,这个也会拖速度,设成4左右会好很多。
5-6 steps/s 这个速度确实偏慢了点,不过也不算离谱到不正常。你没开 flash attention 是个挺关键的点,Qwen2.5 本身支持 FA2,开了之后 attention 那块的计算和显存开销都能降不少,速度提升通常挺明显的。另外 transformers+peft 这套默认配置对 7B 模型来说本来就不是最优的,梯度检查点如果没关、dataloader 的 num_workers 设成 0,都会拖后腿。还有个容易被忽略的地方是 padding 策略,如果 batch size=1 但 padding 到固定长度或者动态 padding 没配好,实际算的 token 数可能比你想象的多。网上说十几 steps/s 的,大概率是开了 FA2、用了 bf16、关掉了 gradient checkpointing,甚至可能序列长度更短或者在做 packing。你可以先试试把 attn_implementation 设成 flash_attention_2,再把 torch.compile 和 bf16 打开,看看能提多少。如果还是卡在个位数,可以用 profiler 抓一下到底时间花在 forward、backward 还是数据加载上,别盲目调参。
这个速度确实偏慢了点,我之前用4090跑Qwen2.5-7B的LoRA,seq len 512、bs=1的情况下大概能到12-14 steps/s左右,你这才5-6确实有优化空间。没开flash attention影响挺大的,7B模型attention那块开销不小,装个flash-attn然后加attn_implementation="flash_attention_2"能明显快一截。另外你检查一下有没有开gradient checkpointing,如果开了会拖慢不少速度,显存够的话可以关掉试试。还有一个容易被忽略的点是dataloader的num_workers,默认是0的话数据加载会成为瓶颈,设成4或8会有改善。transformers+peft本身不是问题,我同样的组合也能跑到十几,不一定要上deepspeed。建议你先从flash attention和dataloader这两个入手排查,大概率能提上来。