最近想试试微调LLaMA-3-8B,按照网上的教程用LoRA在单卡A100上跑,batch size设了1,结果刚加载模型就OOM了,显存直接飙到70多G。我查了资料说用bitsandbytes做4bit量化能降显存,但装完量化后加载模型报错说“不支持的架构”,一脸懵……
有没有大佬指点一下,具体应该怎么配置量化参数?或者有没有更省显存的方法(比如gradient checkpointing、混合精度之类的)?我主要想做文本分类微调,数据集不大(约5000条),但卡在环境配置这一步了,求靠谱的实操经验!🙏
新手求教:用PyTorch跑LLaMA-3微调,显存爆炸怎么优化?
全部回复
共 173 条4bit量化加载LLaMA-3报“不支持的架构”,多半是bitsandbytes版本太旧,更新到0.43以上再试试。LoRA微调8B模型,A100上光加载就70G有点离谱,你是不是没设device_map或者load_in_4bit?我一般用bnb_config里开nf4加double quant,配合gradient checkpointing,单卡40G都能跑起来。5000条文本分类其实不用微调整个模型,冻结底层只训分类头也够用。
4bit量化得把模型转成bnb格式,直接load原版肯定报错,建议先看官方example。
LLaMA-3的架构在bitsandbytes里得手动指定,你试试load_in_4bit=True加上bnb_4bit_compute_dtype=torch.bfloat16,然后别忘了把prepare_model_for_kbit_training也加上,不然LoRA挂上去还是会炸。5000条数据的话其实可以考虑用QLoRA配gradient checkpointing,A100单卡完全够用,我之前跑分类任务batch size开到8都没问题。报“不支持的架构”多半是transformers版本太老,升到4.40以上再试试。
你那个“不支持的架构”报错,大概率是bitsandbytes版本太旧,LLaMA-3的模型结构它还没认。先pip install -U bitsandbytes升级到最新版试试。加载时记得用load_in_4bit=True,bnb_4bit_compute_dtype设成float16,再把device_map设成auto。另外5000条做分类其实不用硬刚8B,换LLaMA-3-1B或者用embedding+分类头,省事得多。
A100 80G加载8B模型按理说不该直接爆,你确认下是不是把模型以fp32加载了?默认from_pretrained不带量化是fp16,大概16G左右权重,70多G明显不对劲。bitsandbytes报“不支持的架构”通常是版本太旧,升级到最新版,加载时加load_in_4bit=True和bnb_4bit_compute_dtype=torch.bfloat16试试。文本分类5000条数据用LoRA加gradient checkpointing完全够,不用太折腾。
bitsandbytes那个报错八成是版本没对齐,transformers和accelerate都得升到最新,不然不认LLaMA-3的架构。我上周也踩过,换成bnb-4bit加load_in_4bit=True就顺了,A100跑8B分类显存大概20G出头。gradient checkpointing记得开,能省不少,但速度会慢点,数据集5000条其实忍忍就过去了。混合精度用torch.bfloat16就行,别用fp16容易nan。
4bit量化加载报“不支持架构”大概率是bitsandbytes版本太旧,跟transformers对不上,升到最新版再试试,记得加load_in_4bit=True和bnb_4bit_compute_dtype=torch.bfloat16。另外你A100跑8B还OOM有点怪,是不是没开gradient checkpointing?加上mixed precision和gradient_accumulation,bs=1应该稳的。5000条数据做分类其实LoRA足够了,别一上来就全参微调。
装bitsandbytes记得版本要跟transformers匹配,不然就报架构不支持,先pip show看下版本再调。
试试把设备映射改成自动分配,device_map="auto"配合4bit量化基本能压到10G以内,不过你那个“不支持架构”的报错八成是bitsandbytes版本太老,升级到0.43以上再试。文本分类5000条其实用不上LLaMA-3这么猛的模型,换BERT类或者小参数模型性价比高得多,实在要用记得开gradient checkpointing,能省不少显存。
试试用4bit量化加载时加个bnb_4bit_compute_dtype=torch.bfloat16,LLaMA-3架构报错多半是transformers版本太老,升到4.40以上基本能解决。LoRA本身不省多少显存,关键还是量化+梯度检查点+flash attention一起上,5000条数据bs开到4都够用。另外确认下是不是加载模型时没设device_map,有时候默认全塞GPU也会直接爆。
LLaMA-3的架构在bitsandbytes里确实容易踩坑,你试试换用transformers自带的BitsAndBytesConfig,把load_in_4bit和bnb_4bit_compute_dtype设成bfloat16,别用老版本手动注入的方式。还有A100上70G爆显存有点怪,先确认是不是没开device_map,模型默认全丢一张卡了。文本分类5000条数据的话,其实可以冻结大部分层只训分类头,配合gradient checkpointing基本能压到20G以内,LoRA都不一定需要。
单卡A100 80G加载LLaMA-3-8B理论上不该直接OOM,除非你加载的是fp32权重或者中间有重复实例。先确认下transformers和bitsandbytes版本,4bit报“不支持的架构”大概率是bnb版本太老不认llama3,升到0.43以上一般就好了。量化参数用load_in_4bit=True配bnb_4bit_quant_type="nf4"和bnb_4bit_compute_dtype=torch.bfloat16,这个组合比较稳。另外LoRA的target_modules记得覆盖q_proj、k_proj、v_proj、o_proj还有gate、up、down这些,只挂q和v效果会打折。gradient checkpointing一定要开,配合bf16混合精度,显存能再降不少。文本分类5000条数据其实用不上8B,可以考虑先拿小模型跑通流程,或者试试QLoRA加flash attention,A100上单卡跑8B微调是完全可行的。
我之前也遇到过类似问题,后来换了方案。