最近在试着用LoRA微调一个7B的对话模型(基座是Qwen2.5),训练阶段用的batch size=1,显存勉强够用(24G)。但微调完合并权重后,用vLLM部署推理,居然比原始模型多吃了快6G显存,而且并发一高就OOM。我确认过合并后的权重没问题,推理时也没加载训练时的优化器状态。查了一圈,有人说可能是KV cache的预分配问题,也有人说是LoRA的adapter没卸载干净。但我用lora_merge_and_unload()合并后明明只保存了合并权重。有没有大佬遇到过类似情况?是LoRA本身就会增加推理时的显存开销,还是我哪里配置错了?求指点,卡在部署这步好几天了。
LoRA微调7B模型后推理显存爆炸,是我的方法不对吗?
全部回复
共 45 条合并权重后推理不该多出这么多显存,先排除下vLLM的gpu_memory_utilization是不是默认吃满了90%,那6G很可能只是KV cache预分配变多了。另外确认下你保存的是不是真的合并权重,有时候adapter目录和merged目录搞混,vLLM加载的其实是带LoRA的版本。还有个坑是dtype,训练用bf16但推理加载成了fp32,权重直接翻倍。建议先用max_model_len调小、并发设1跑个baseline,再逐步加压看显存曲线。
合并权重后显存反而涨了,我第一反应也是KV cache那块,vLLM默认的gpu_memory_utilization是0.9,会尽量多占,你并发一高自然就炸。不过你说比原始模型多吃6G,这个量有点大,不太像单纯的cache预分配。建议你对比一下合并前后的config.json,尤其是max_position_embeddings和rope scaling这些,LoRA训练时如果动过这些参数,合并后推理长度上限变了,cache占用会差很多。另外确认下是不是真用了merged权重,别是vLLM偷偷又加载了adapter。
合并权重后理论上推理开销应该和原模型一致,多出6G显存大概率不是LoRA本身的问题。你检查下vLLM启动时的gpu_memory_utilization和max_model_len,vLLM默认会预分配90%显存做KV cache,如果max_model_len设得大,并发一上来直接爆。另外确认下tokenizer和config有没有跟着一起更新,之前遇到过一次合并后config里vocab_size对不上导致embedding层多占显存。建议先用--enforce-eager关掉cuda graph跑一下,对比下峰值显存,能排除不少干扰因素。
合并后比原始模型多吃6G显存,这个量级不太像单纯KV cache的锅,更像是vLLM那边gpu_memory_utilization没调好,默认0.9会把剩余显存全预占,合并模型参数量其实没变。你可以先试试把max_model_len调小,或者显存利用率降到0.85看看并发表现。另外确认下合并后保存的dtype是不是fp16,有时候merge会偷偷变成fp32,那就正好对应多出来的显存了。
合并权重后应该和原始模型一样大,你对比过文件大小吗?