最近开始尝试用Llama 3.1 8B做领域微调,跟着教程写了LoRA,batch size设到1,gradient checkpointing也开了,结果3090(24G)还是OOM。我的输入长度大概2k tokens,是不是跟序列长度有关?看到有人说用DeepSpeed ZeRO-3或者Flash Attention能省显存,但配置起来有点复杂,不太确定是哪里出了问题。另外,torch.compile会有帮助吗?现在用的是PyTorch 2.1,cuda 12.1。求有经验的大佬指点下常见坑,谢谢!
刚转大模型方向,用PyTorch跑LLM微调,显存总爆掉怎么优化?
全部回复
共 189 条2k序列确实吃显存,试试Flash Attention,能省不少,torch.compile帮助不大。
2k序列长度在8B模型上确实挺吃显存的,LoRA虽然省了优化器状态,但激活值还是按全模型算。我3090上跑类似配置时把max_length砍到1024,再开Flash Attention 2,显存直接从22G掉到14G左右。ZeRO-3单卡收益不大,反而通信开销拖速度,不如先试试gradient accumulation配合更小的micro-batch。torch.compile在2.1上对LLM支持还不太稳,建议先升到2.3再考虑。
2k长度8B模型LoRA不该爆啊,检查下是不是没冻结base权重或者梯度累积没设对。
2k序列长对8B模型确实挺吃显存,试试Flash Attention 2,能省不少,配起来没想象中难。
2k序列长度在8B模型上确实挺吃显存的,LoRA虽然省了优化器状态但激活值还是跑不掉。建议先试试把max_length降到512看能不能跑通,能跑通就说明是激活显存的问题,再上Flash Attention 2(pip装flash-attn就行,不用改太多代码)。ZeRO-3在单卡上意义不大,反而拖速度,单卡更推荐用gradient accumulation配合小batch。torch.compile对显存帮助有限,主要是提速,PyTorch 2.1的compile还不太稳定,建议先别折腾。
我之前也遇到过类似问题,后来换了方案。
2k序列长度在8B模型上确实挺吃显存的,光KV cache和激活值就占不少,batch size 1还OOM说明瓶颈可能不在batch维度。你试试把max_length先砍到1024跑通流程,确认是序列长度导致的再往上加。Flash Attention对PyTorch 2.1支持还行,装flash-attn 2.x版本,模型加载时attn_implementation设成flash_attention_2,能省一截激活显存,配置没想象中复杂。DeepSpeed ZeRO-3单卡其实收益有限,它主要解决多卡参数冗余,你3090单卡的话不如先上8-bit优化器或者把LoRA的r调小点试试。torch.compile在2.1上对LLM微调加速有但显存优化不明显,有时候还会因为重编译把显存撑爆,建议先别开。另外检查下是不是dataloader或者tokenizer那边有隐藏的显存泄漏,比如没设pin_memory或者batch里padding到最长序列。gradient checkpointing开了还OOM的话,可以试试把checkpoint的粒度调细,或者用bitsandbytes做4bit量化加载底座模型,LoRA训练时只算适配器梯度,显存能压到10G以内。
2k序列8B模型LoRA不该爆啊,检查下是不是没冻结base只训LoRA,还有优化器别用32位Adam。
2k序列对8B模型确实偏长,先试试把max_length砍到512看还爆不爆,Flash Attention优先上,比ZeRO-3省心多了。