最近在试着微调一个7B的chat模型,用的LoRA,单卡A100 40G。训练的时候loss降得挺正常,但一跑推理就报CUDA OOM,而且加载模型的时候就要吃掉快25G显存。我试了FP16和int8量化,感觉也没好多少。看别人的部署教程好像很轻松,是不是我的batch size或者max length设置有问题?还是说7B模型本来就这德行,得用vLLM或者什么其他框架才行?求有经验的大佬指点一下,给个大致的方向就行,谢谢了!
部署7B大模型微调后显存爆了,求大佬看看是不是我配置有问题?
全部回复
共 33 条25G加载其实挺正常的,7B的FP16光权重就14G,加上KV cache和中间激活值,40G卡跑长序列确实容易爆。你试试把max length砍到512,batch size设1,顺便开一下gradient checkpointing,推理时用torch.inference_mode加上no_grad,应该能省不少。vLLM主要优化的是吞吐不是显存,单卡部署上PagedAttention能省一点但别指望质变。
你那个int8量化要是用的bitsandbytes,注意下是否在推理时也把模型转成了8bit,加载和推理分开处理。我之前遇到过类似情况,最后发现是tokenizer的padding策略导致序列被拉长,显存直接翻倍,检查下你的数据预处理有没有这个问题。
加载25G确实不对劲,LoRA推理不该吃这么多,你试试把max length降到512,batch size设1看看。
7B用FP16加载本来就要14G,加上KV cache和中间激活,40G确实紧,换vLLM能省不少显存。
我7B全参微调也这样,40G根本不够,换LoRA+gradient checkpointing能省不少,vLLM推理确实香。
跑推理别用训练那套配置,max length调小点,用vLLM或者TGI,7B量化后十几G就能跑。
7B模型加载确实就得20多G,FP16下光权重就14G,加上KV cache和激活值25G不夸张。你LoRA微调完推理时是不是没合并权重?试试merge后再加载,能省不少显存。另外max length如果设到2048以上,显存会涨得飞快,先调到512看看。vLLM对这种场景帮助挺大,但单卡40G其实不用上,调低batch size到1,开torch.compile,基本能压到16G以内跑起来。
说实话你这个情况我太熟悉了,7B模型加载本身就占20G左右,FP16下光权重就14G,加上KV cache和激活值,40G卡跑推理确实紧巴巴的。你那个25G加载占用其实正常,问题大概率出在推理时的序列长度和batch上,试试把max length砍到1024,batch size设成1,应该能跑起来。LoRA微调本身不增加推理显存,但如果你微调时用了gradient checkpointing,推理时忘了关,也会额外吃显存,这个容易忽略。至于int8,虽然能省显存,但有些层还是会以FP16跑,提升有限,不如直接用bitsandbytes的4bit量化,能把占用压到10G以内。另外别迷信vLLM,它主要优化吞吐,单条请求的峰值显存反而可能更高,你这种场景先用transformers的静态图模式试下,或者换用GPTQ量化模型,效果更直接。最后检查下你的推理脚本有没有把微调时的LoRA权重合并掉,没合并的话会额外占一份显存,很多人栽在这。
25G加载显存确实不太正常,我怀疑你是把模型权重直接塞进显存了,没走device_map或者低比特加载,试试transformers的load_in_8bit配合bitsandbytes,加载能压到12G左右。推理OOM的话,把max_new_tokens调小点,或者开torch.inference_mode,另外batch size设1先跑通再说。7B模型确实吃显存,但40G跑LoRA微调都够了,推理没道理爆,vLLM不是必须的,先把基础加载优化下。
7B加载25G有点离谱,你试试把max length调到2048,batch size设1,实在不行上vLLM,推理省显存立竿见影。
说实话你这情况太典型了,7B fp16光权重就要14G,加上KV cache和激活值,25G起步真不奇怪。LoRA微调时显存大头在反向传播的梯度,但推理时反而吃在序列长度上,你max length要是开到2048以上,40G也得抖三抖。建议先试试把max length砍到512,batch size调成1,用greedy search跑一下看还爆不爆。另外int8加载慢但显存确实能省不少,你确认下量化后模型加载是不是真的生效了,有时候transformers会自动回退到fp16。vLLM确实能省显存,但主要优化的是并发和连续批处理,单条推理提升没那么神,先把基础参数捋顺再说。
你这配置其实没啥大毛病,但7B模型推理就是吃显存,尤其你训练完还留着优化器状态没清干净吧?加载25G可能是把训练时的显存碎片也算进去了。试试torch.cuda.empty_cache(),或者直接重启内核再加载模型。另外LoRA微调后合并没有?没合并的话推理时还是得跑完整基座模型,那显存肯定下不来。batch size和max length影响的是峰值,你单卡推理batch size固定1就行,max length调到1024以下看看。vLLM是好东西,但你这情况先排查下是不是代码
25G加载占用对7B来说正常,FP16光权重就14G,加上KV cache和激活值肯定吃紧。你试试把max length砍到1024,batch size调成1,推理时用torch.compile或者直接上vLLM,显存能省一大截。另外LoRA微调后合并权重再导出,别带着adaptor跑推理。
说实话你这个问题我太有共鸣了,之前我拿4090跑7B也差点被整崩溃。加载模型吃掉25G这个数字其实挺正常的,因为光权重就要14G左右,加上KV cache和激活值,FP16下40G卡想舒舒服服跑长序列确实悬。int8按理说能省不少,但你得确认是不是真的加载了量化权重,有些库默认还是会转回FP16,那就白折腾了。batch size和max length影响的是训练时的显存峰值,推理阶段主要是序列长度在吃KV cache,你要是max length拉到2048以上,那OOM真不怪别人。我个人经验是,先试试把max length砍到512,batch size设成1,如果还爆,那大概率是框架的显存预分配策略问题,可以在加载模型前设置一下环境变量,比如显存按需分配那个开关。vLLM确实是为推理优化的,但你这情况更可能是配置细节,别急着换框架,先把能关的优化项全关了试试。另外你训练和推理用的难道不是同一个模型导出格式?有时候训练完的checkpoint没合并回LoRA权重,推理时等于加载了完整模型加额外适配器,那肯定爆。
讲真7B模型FP16加载就要14G左右,加上推理时的KV cache和中间激活,25G不算离谱,你这卡40G按理说够用,但OOM多半是max length拉太长或者batch size没降下来。我之前跑7B用vLLM,显存占用直接砍半,吞吐还高不少,你不如先试试把max length调到512,batch size设1,看能不能跑起来。另外LoRA微调后合并权重再导出,有时候能省点显存,你也可以检查下是不是推理时把训练时的梯度设置带过去了。
推理阶段OOM基本跟LoRA训练配置关系不大,你加载模型就吃掉25G,那40G卡跑7B其实挺吃紧的,尤其如果max length设到2k以上,KV cache会占掉一大块。int8理论上能压到15G左右,但你没说用没用bitsandbytes,如果只是转成int8但加载方式不对,显存照样下不来。vLLM确实能省不少,但7B本身推理也要10G+,建议先查一下推理时的batch size和max_new_tokens,别默认开太大。另外可以试试把模型分片到CPU或者用flash attention,有时候比换框架更立竿见影。
25G加载7B其实有点偏高了,可能是你HF的默认缓存机制和padding策略在作怪,试试把max_length砍到512,batch size调到1,然后开gradient checkpointing。另外推理和训练最好分开配环境,vLLM确实能省不少显存,但你这情况更像是模型并行没设对,检查下device_map是不是auto。