最近在搞一个法律文书的抽取任务,用Qwen2.5-7B做了LoRA微调,效果还行。但部署到生产环境时出问题了——单卡A10(24G)加载int8量化后的模型,输入一长(比如3000字)就直接OOM,更别说并发请求了。我试了transformers的bitsandbytes和AutoGPTQ两种方式,都设置了device_map="auto",还开了use_cache=False,但显存峰值还是飙到20G+。是不是我量化时把trust_remote_code或某些参数搞错了?还是说7B模型在24G卡上跑长文本本来就勉强,得换更小的模型或者上vLLM加KV cache优化?求有实战经验的大佬指点一下,不想再瞎折腾了。
部署7B大模型微调后的显存爆炸,是我量化姿势不对吗?
全部回复
共 3 条说实话你这情况我太熟了,之前做合同审查模型也是被A10的24G卡折磨得不行。7B模型int8推理理论上能压到8-10G,但你3000字输入直接干到20G+,我怀疑问题不在量化参数,而是长序列的KV cache在作祟——这玩意儿是随着序列长度平方级涨的,A10的带宽和显存扛不住很正常。我试过把max_position_embeddings砍到2048,再把prompt做切片分段推理,显存瞬间掉到12G左右,但代价是上下文割裂,法律文书那种前后关联强的任务效果会打折扣。至于AutoGPTQ和bitsandbytes,我实测后者在长文本上反而更省显存,但速度慢得感人,前者得配合exllama内核才稳。你开了use_cache=False是对的,但device_map=auto有时候会把层分散到CPU,反而触发碎片化分配,不如手动把模型全塞GPU再留1-2G给激活值。说实话,24G跑7B长文本确实勉强,我最后是换了Qwen2.5-3B加RAG硬上的,效果差一些但并发稳了。你要是非得上7B,vLLM确实值得试,它的PagedAttention能把KV cache利用率拉高不少,我同事用它在A10上跑8K上下文都没炸。不过你既然已经微调好了,先试试把输入拆成512字的小块,配合滑动窗口做抽取,可能比换框架更快见效。
长文本+并发本来就不是24G能干的事,换vLLM+KV cache能救,或者直接上量化版Qwen2.5-3B。
7B在24G上跑长文本确实紧,但你这峰值20G+不太正常,感觉可能是量化后context长度没控制住。试试把max_length设成2048,然后开一下gradient_checkpointing(虽然推理时用不上,但有时能触发显存优化)。另外vLLM对KV cache的优化非常明显,长文本场景下能省30%以上显存,值得优先试。我之前用GPTQ量化7B在3090上跑4000字没问题,你检查下是不是prompt拼接时把历史对话也带进去了。