最近在试着用LoRA微调Llama 3 8B,设备是RTX 4090 24G,数据集大概5万条对话。结果刚跑第一轮batch size设成4就直接OOM了,试了梯度累积和混合精度(bf16),还是撑不住。
我看网上有人说用bitsandbytes量化到4bit能省显存,但我加载模型后生成文本变慢了好多,而且微调完效果有点飘。
想问问大家,除了换硬件,有没有什么实用的显存优化技巧?比如分片加载、offload或者改attention?另外,8B模型用4bit微调会不会损失太多能力?求指个路,有点迷茫。
大佬们,用PyTorch跑Llama 3微调,显存爆了怎么办?
全部回复
共 172 条4bit微调确实掉点,试试QLoRA加paged optimizers,能稳不少。
其实24G跑8B LoRA,batch=1加梯度累积就够了,别硬刚batch size。
试试把micro batch size降到1,梯度累积步数拉上去,4090跑8B的LoRA其实没这么容易爆。真正吃显存的大头是优化器状态和激活值,可以开gradient checkpointing,再把max_seq_len砍到512或1024,能省一大截。4bit微调确实会掉点效果,建议QLoRA只量化基座,LoRA层保持bf16,学出来的adapter质量会稳很多。另外数据5万条有点多,先抽几千条跑通流程再放大,别一上来就硬刚全量。
4090跑8B LoRA按理说没那么吃力,你查下是不是max_seq_length设太长了,5万条对话如果没截断很容易炸。可以试试flash attention 2加gradient checkpointing,再配合8bit AdamW,显存能松不少。4bit微调确实掉点,尤其对话任务上容易变得啰嗦或答非所问,建议QLoRA只当过渡,真要效果还是得bf16加小batch慢慢磨。
4bit微调掉点挺正常的,LoRA本身还能救回来一些,但你要是量化完还开着bf16再叠加梯度检查点,显存其实省不了太多。建议先试gradient checkpointing加flash attention 2,再把batch size压到1配合梯度累积,5万条数据的话学习率也得调低点。bitsandbytes那个4bit加载慢是正常的,推理延迟换显存嘛,效果飘可能是LoRA rank设太高了,试试降到8或者16。
4bit微调掉点挺正常的,LoRA本身已经省了优化器状态,再叠量化相当于双重压缩,效果飘不意外。24G跑8B的LoRA其实够用,你把max_seq_len砍到512试试,5万条对话如果都是长文本,激活值才是吃显存的大头。再就是开gradient_checkpointing,用batch size 1加梯度累积,比硬撑batch 4稳得多。offload慢得离谱,除非实在没卡否则别碰。
24G跑8B的LoRA按理说没那么夸张,但你batch size 4加上5万条对话样本,序列长度估计也不短,激活值一下就顶上去了。先别急着上4bit,试试把per_device_batch_size压到1,gradient_accumulation拉大,同时开gradient_checkpointing,这个对显存帮助最直接。还有检查下是不是max_length设太大了,对话数据很多其实截断到512或1024就够,别默认2048硬跑。bitsandbytes的4bit微调确实会掉点效果,尤其对话任务上容易变得保守或者答非所问,QLoRA原论文也是靠更多数据和更长训练来补的。如果非要用量化,可以试试4bit加载但LoRA适配器用bf16训练,别把整个计算都压到4bit里。另外flash attention 2一定要开,能省不少激活显存,4090支持得挺好。实在不行就上DeepSpeed ZeRO-2做offload,但速度会慢,看你取舍了。
5万条对话用4090跑LoRA还爆显存,大概率是max_seq_length设太长了,先试试砍到512或者768,能省不少。4bit微调效果飘是正常的,QLoRA本身就有精度损失,关键是LoRA rank别设太低,64起步会稳一些。另外可以开gradient checkpointing,再把优化器换成paged_adamw_8bit,这套组合我跑7B基本能压到20G以内。实在不行就上FSDP或者DeepSpeed ZeRO-2,单卡也能分片优化器状态。
我之前也遇到过类似问题,后来换了方案。
我之前也遇到过类似问题,后来换了方案。
有没有更详细的教程推荐?
4090跑8B的LoRA还OOM,多半是batch size和sequence length堆太高了,先把max_length砍到512试试,很多时候对话数据根本用不着那么长。4bit量化微调确实会掉点,尤其对话任务上容易变得啰嗦或者答非所问,建议QLoRA只当过渡,真要效果还是得bf16加梯度检查点。另外可以看看是不是optimizer状态占了太多,换成8bit AdamW能省一截,配合gradient checkpointing基本就能跑起来了。
试试把LoRA的rank调小点,再开gradient checkpointing,我4090跑8B bf16也就batch=2。4bit微调确实容易掉点,不如试试QLoRA配小rank。