最近在试着用LoRA微调7B的LLaMA模型,机器是两张3090(24G),按说应该能跑吧?但一加载模型就报CUDA out of memory。
我参考了几个GitHub仓库,有的说用bitsandbytes量化成4bit就行,但我试了还是炸。是不是我dataloader的batch size设太大了(设了4)?还是说需要把模型分到多卡?
另外,我看很多人直接用Hugging Face的Trainer,是不是里面有些默认参数会爆显存?有没有什么通用的显存优化trick,比如gradient checkpointing到底该咋开?
求各位大佬指点,真的有点怀疑人生了……
用PyTorch微调LLaMA,总是OOM,是我显存不够还是代码有问题?
全部回复
共 170 条说实话两张3090跑7B LoRA完全够用,问题大概率出在加载权重时没开device_map="auto"或者load_in_4bit配置没写对。batch size=4确实偏大,但更关键的是gradient checkpointing一定要开,Trainer里设gradient_checkpointing=True就行。还有dataloader的num_workers设成0试试,有时候多进程反而会复制模型到每个worker显存里。我上次也是折腾半天,最后发现是bitsandbytes版本和transformers不兼容,换了个版本就好了。
7B模型加载的时候光权重fp16就得占14G,两张3090单卡24G按理说够,但你把batch size设4还开梯度,activation直接吃满。gradient checkpointing肯定要开,Trainer里设gradient_checkpointing=True就行,但记得同时把model.gradient_checkpointing_enable()调了。还有bitsandbytes别只量化模型,dataloader的num_workers别拉太高,不然CPU换页也容易爆。实在不行就试试DeepSpeed stage3,两张卡分权重,3090跑7B绰绰有余。
24G两张卡跑7B LoRA按理说够用的,问题大概率出在加载基座模型时没开4bit或者8bit量化,光bf16权重就占14G了,再算上梯度直接爆。gradient checkpointing在Trainer里设gradient_checkpointing=True就行,但注意要和model.gradient_checkpointing_enable()配合,不然不生效。另外batch size=4对7B来说确实偏大,可以先调成1试试,用gradient accumulation凑等效batch。还有个容易忽略的点,dataloader的num_workers别设太高,有时候内存碎片也会导致显存分配失败。
7B模型加载本来就要占十几个G,两张3090分开用不如先用单卡batch size调1试试。
24G双卡跑7B LoRA按理说够用了,问题大概率不是显存容量而是显存碎片化。你试试在加载模型前先设置torch.cuda.empty_cache(),然后把batch_size降到1,开gradient_accumulation_steps=4,LoRA的r值调到8,基本能稳住。另外Trainer里fp16=True和gradient_checkpointing=True一定要开,这俩能省一半显存。bitsandbytes那个4bit其实挺挑版本的,建议用load_in_4bit=True配合bnb_4bit_compute_dtype=torch.float16,别用默认的float32。分卡的话用device_map="auto"让transformers自己分配就行,手动分反而容易出问题。我之前单卡24G跑13B都试过,主要是别让模型权重和梯度同时占满一整块卡。
试试gradient checkpointing加上per_device_train_batch_size调到1,3090跑7B LoRA 4bit完全够用,你这配置大概率是batch size和默认参数量叠一起炸的。
两张3090跑7B还早着呢,先检查下是不是Trainer默认的eval accumulation把显存吃了。试试gradient checkpointing加上batch size调到1,稳很多。
7B全参数都不止24G,3090单卡本来就紧,你还要算激活值,batch=4不炸才怪。LoRA虽然省了优化器状态,但模型本身还是要加载的,建议先试试4bit加gradient checkpointing,把batch降到1,梯度累积开大点。另外Trainer默认会开混合精度,但你要是没显式设fp16,它可能反而多占内存,检查下training_args里bf16/fp16是不是没开。两张卡别急着张罗张量并行,先把单卡能跑通再考虑数据并行。
两张3090跑7B LoRA按理说完全够,但加载就炸大概率不是batch size的锅,先看看是不是把模型整块塞到单卡上了,device_map得设成auto或者balanced。4bit量化确实能省不少,但bnb有时候跟新版transformers会有兼容问题,可以试试换版本或者直接用unsloth。gradient checkpointing在Trainer里加个gradient_checkpointing=True就行,配合use_cache=False,能省一大截激活值。batch size 4对7B来说确实偏大,先降到1跑通再往上加,别一上来就怀疑人生哈哈。
两张3090跑7B LoRA按理是够的,但Trainer默认会同时把模型、参考模型和优化器状态都放显存里,不炸才怪。4bit量化记得配bnb的paged optimizer,不然优化器状态照样吃满。gradient checkpointing在TrainingArguments里设gradient_checkpointing=True就行,但得先把use_cache关掉。batch size先降到1试试,能跑通再往上加,别一上来就4。