最近在尝试微调一个7B的模型,用的LoRA,rank设的8,batch size调到了2,看显存占用才10G左右(显卡是24G的),按理说应该稳的。但每次训练到大概四五百步的时候,突然就Out of Memory了,训练直接崩掉。我查了日志也没看到什么明显错误,就是显存突然飙升。
我怀疑是不是gradient checkpointing没开对,或者中间缓存没清?也试过把batch size降到1,但还是会在不同步数挂掉。有没有大佬遇到过类似情况?是不是LoRA本身在某个阶段会突然占更多显存?还是我用的peft库版本有bug?
先谢过,真有点被搞懵了。
用LoRA微调7B模型,显存够但训练到一半就OOM了,咋回事?
全部回复
共 28 条遇到过类似情况,十有八九是梯度累积或者中间变量缓存的问题。你试试把gradient_checkpointing打开,再手动清一下torch的缓存,在每次step结束时加个torch.cuda.empty_cache(),虽然慢点但能稳住。另外peft的某些旧版本确实有显存泄露的bug,可以更新到最新版再看看。
这种情况我也遇到过,大概率不是LoRA本身的问题,而是PyTorch的显存分配机制在搞鬼——训练到某个点,之前累积的中间变量或优化器状态突然被完整保留,导致显存峰值飙升。可以试试在训练循环里手动加torch.cuda.empty_cache(),或者把gradient_checkpointing开得更彻底些,尤其是如果用了长序列输入,缓存爆炸很常见。另外检查一下peft的版本,之前0.5.0有个已知的显存泄漏bug,升到最新版能解决。如果还崩,建议监控一下loss曲线,有时候是某个batch的数据异常导致计算图膨胀。
我也遇到过类似情况,大概率不是LoRA本身的问题,而是显存碎片化或者中间激活值缓存没释放干净。你可以试试在训练循环里手动加个torch.cuda.empty_cache(),或者检查一下dataloader的num_workers是不是设得太高导致数据预加载爆了。另外peft某些版本确实有内存泄漏的bug,建议先升级到最新版看看。
可能是peft库的gradient checkpointing跟某些层有冲突,试试手动清一下缓存或者换个版本。
这情况我也遇到过,大概率不是LoRA本身的问题,而是PyTorch的显存分配策略在某个step触发了碎片化。建议试一下在训练脚本里加上torch.cuda.empty_cache(),或者把gradient_accumulation_steps设为2,这样等效batch size不变但能缓解显存尖峰。另外可以检查下是不是dataloader的pin_memory导致缓存堆积,关掉或者调小num_workers试试。
这个情况我也遇到过,大概率不是LoRA本身的问题,而是PyTorch的显存分配机制在作祟——训练过程中某些中间变量(比如attention的key/value缓存)会随着步数累积,如果没及时释放就容易在某个点突然爆掉。建议你试试在optimizer step之后手动调一下torch.cuda.empty_cache(),或者检查下dataloader的num_workers是不是设太高了,有时候数据预加载也会偷偷吃显存。另外peft库最近几个版本确实有过显存泄漏的bug,可以换个稳定版试试。
你这情况我也遇到过,折腾了好几天才排查出来。显存突然飙升通常不是LoRA本身的问题,更像是某个中间变量在特定步数下被缓存了,比如attention的kv cache或者优化器状态没及时释放。我怀疑跟你用的peft版本有关,之前0.6.0有个已知bug,在特定梯度累积步数下会泄露显存,建议先升级到0.10.0以上试试。另外gradient checkpointing最好在模型配置里显式打开,而不是靠peft的默认设置,有些层不会自动启用。还有个小技巧:在训练循环里手动调一下torch.cuda.empty_cache(),虽然治标不治本,但能帮你判断是不是缓存累积的问题。如果还崩,可以试试把gradient_accumulation_steps设大一点,同时保持batch size为1,这样每步的显存峰值会降低不少。最后检查下数据加载器是不是用了pin_memory=True,有时候预加载的tensor会卡在显存里不释放。
我之前也遇到过类似情况,后来发现是PyTorch的缓存分配器在搞鬼,训练过程中会逐渐占满显存但不释放。你可以试试在训练循环里手动调一下torch.cuda.empty_cache(),或者设置PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128这个环境变量,能缓解碎片化问题。另外PEFT的版本确实有坑,我之前用0.7.0就稳定很多,你可以降级试试看。