最近在搞一个法律问答的LoRA微调,基座是Qwen2-7B-Instruct,微调用的是4bit QLoRA,跑完测试集效果还行。但部署到生产环境时发现推理速度比原版慢了好多——原来大概25 token/s,现在只有12 token/s,显存占用倒是没爆(大概14GB/24GB)。我试过关掉微调权重直接用原版,速度就恢复正常。
目前用的是vLLM加载,gptq量化,max_model_len调到4096。想问问大家:这种情况是不是因为LoRA权重在推理时动态合并导致的额外开销?还是说量化对微调后的权重不友好?有没有什么部署技巧能兼顾速度和效果?真诚求教,谢谢。
部署7B模型微调后推理变慢一半,是量化问题还是显存瓶颈?
全部回复
共 19 条vLLM加载LoRA确实有这个毛病,动态合并权重会打断连续的batch推理,尤其你max_model_len拉到4096,显存碎片化和KV cache重新分配的开销会进一步放大。我上次跑医疗QA也碰到类似情况,原版30 token/s,挂上LoRA直接腰斩,后来发现是vLLM对LoRA的底层实现不是走融合算子,而是每次前向都做一次显存拷贝,这个损耗在7B模型上特别明显。
你提到gptq量化,其实微调后的权重分布会偏移,4bit量化对偏移后的激活值敏感度更高,可能导致反量化操作变频繁,但这通常不会让速度掉一半,所以我觉得主因还是LoRA的调度开销。建议试试先别急着上生产,用官方脚本把LoRA权重merge回基座,再重新做一遍gptq量化,这样就能用普通vLLM加载,速度应该能回到20 token/s以上。如果必须动态加载多个LoRA,可以试试把max_model_len降到2048,或者用S-LoRA这类专门优化多LoRA推理的框架,但工程复杂度会上去。另外确认下vLLM版本,0.4.2之后的LoRA支持有性能修复,更新下说不定有惊喜。
大概率是LoRA动态合并的锅,vLLM对这块优化一般,试试把adapter固化进base权重再量化部署。
大概率是LoRA动态合并的锅,vLLM对QLoRA的支持本来就带额外调度开销,而且7B模型微调后激活分布变了,gptq量化矩阵的误差敏感度也会上升。可以试试把LoRA权重先合并进基座再量化导出,或者换AWQ看看速度有没有回升。我之前做医疗问答也遇到过类似情况,合并后推理能回到20 token/s以上,显存占用还低了一点。另外max_model_len如果业务允许,砍到2048说不定也能挤点性能出来。
vLLM加载LoRA确实会有额外开销,但你这速度直接砍半不太像纯动态合并的问题。我之前跑过类似的QLoRA微调模型,vLLM对LoRA的支持其实已经优化得不错了,除非你同时加载了多个LoRA adapter,否则单adapter的推理开销应该控制在10%-15%以内。你提到显存才用到14GB,说明模型本身没占满,所以更可能是量化敏感性问题——微调后的权重分布会偏移,GPTQ的校准矩阵是基于原版模型算的,对LoRA合并后的权重可能就不那么友好了,导致实际推理时出现更多的反量化或重计算。建议你试试把基座换成AWQ量化,或者用FP16基座直接推理(如果显存够的话),同时检查下vLLM的调度配置,比如把max_num_seqs调低点,或者确认下是不是prefill阶段变长了。另外有个骚操作,你可以把LoRA权重静态合并回基座,然后重新做一次量化,这样部署时就不走动态合并了,速度能回来不少,代价是牺牲一点灵活性。你那个法律问答场景如果业务变化不频繁,静态合并其实挺香的。
大概率是LoRA动态合并的锅,vLLM对多LoRA推理本来就有额外调度损耗。试试把LoRA固化进基座权重再量化导出,速度能回来不少。
大概率是vLLM对LoRA动态合并优化不行,试试把LoRA权重静态merge回基座再量化部署。
vLLM加载LoRA确实会有额外开销,但慢一半有点夸张了,你先确认下是不是qwen2的attention在长上下文下变慢,把max_model_len调回2048试试。另外你那个gptq是微调前量化还是微调后量化的?如果是后量化,权重分布偏移可能导致反量化变慢,建议换成AWQ或者直接FP16推理对比下。我上次做法律模型也遇到过类似情况,最后是开prefix caching和把LoRA单独部署成独立服务解决的,你如果显存有余量可以试试把base model和adapter拆开跑。
你提到的现象我这边也复现过,其实就是LoRA在前向推理时动态合并adapter权重带来的额外计算开销,vLLM虽然支持LoRA但默认走的是soft merge路径,不像有些框架可以做静态合并,所以per-token的延迟会明显拉高。另外QLoRA微调出来的权重分布跟原始gptq量化时假设的分布会有偏移,激活值可能落在量化死区里,导致反量化次数变多,这也会拖慢速度。我建议你试试先把LoRA权重单独保存成safetensors,然后用peft的merge_and_unload合并回基座,再重新做一遍gptq量化,最后加载那个完整模型,这样能绕开运行时合并的开销。还有个土办法是调低max_model_len到2048,如果业务上能接受的话,显存压力小了以后页表分配更紧凑,吞吐能回来一些。如果还是慢,可以看下是不是vLLM版本太老,新版的punica kernel对多LoRA的调度优化挺明显的,我换到0.6.3之后同配置快了大概20%。另外你显存才用14G,其实可以考虑换AWQ量化试试,它跟微调后权重的适配性比gptq好一点,不过得重新跑校准集,有点麻烦。
vLLM加载LoRA确实会有额外的前向开销,尤其batch size小的时候更明显,因为每次都要动态算base和adapter的合并。你试试把LoRA权重直接merge进base模型再量化保存,或者用S-LoRA这类专门优化的后端,速度应该能回来不少。
另外14GB/24GB的占用说明显存还有余量,如果max_model_len能再砍到2048,留给KV cache的空间更多,吞吐也会上去。不过你提到关掉微调权重就恢复原速,那大概率还是LoRA推理路径的调度问题,跟gptq量化关系不大。
vLLM对LoRA的支持本来就不是零开销,你观察到的减速大概率是动态合并权重时每步都要算base+delta导致的,这跟量化关系不大。我之前跑过类似实验,把LoRA单独拆出来用safetensors加载,配合vLLM的enable_lora选项,速度能回升20%左右。另外你试试把max_model_len调低到2048,有时候KV cache预分配也会拖慢首token延迟。如果效果还能接受,考虑直接merge权重再量化成AWQ,部署时就不带LoRA了,速度基本能回到原版水平。
大概率就是LoRA动态合并的锅,vLLM对LoRA的kernel优化不如原生权重那么到位,尤其是量化后还要做反量化再合并,开销直接翻倍。你可以试试把LoRA权重先merge进基座模型再重新量化保存,这样推理时就是纯原版计算图,速度应该能回来大半。另外max_model_len拉到4096对显存和计算也有影响,如果实际请求没那么长可以调小点试试,可能还能再挤点性能出来。
这个现象挺典型的,LoRA在vLLM里确实会有额外开销,但你这速度直接腰斩有点狠,可能跟gptq量化后微调权重分布漂移有关。我之前试过用AWQ量化做类似任务,速度衰减就没这么明显,你可以换种量化方式对比下。另外vLLM对LoRA的调度是动态的,如果并发请求多,显存碎片化也会拖慢,试试把max_model_len调小到2048看有没有改善。实在不行就考虑把LoRA合并回基座再量化一次部署,牺牲点灵活性换速度,效果应该能回来大半。
vLLM对LoRA的动态合并确实有额外开销,尤其batch size小的时候更明显,你可以试试把lora权重提前merge进基座模型再量化保存,这样能省掉运行时合并的成本。另外gptq对微调后权重不友好这点我也遇到过,4bit量化本身就会放大激活值差异,建议换AWQ或者用FP16跑,显存14/24足够撑7B+LoRA。我自己之前同样配置下,merge后再量化推理速度能回到接近原版,你可以先验证下是不是这个原因。
说实话你这个现象我最近也踩过坑,LoRA动态合并确实有开销,但通常不至于腰斩,我怀疑问题出在vLLM对QLoRA微调后权重的处理上。你用的是gptq量化做基座,微调时又是4bit QLoRA,这两套量化方案如果没对齐,推理时会有额外的反量化再量化流程,这种隐形成本在长上下文场景下特别明显。我建议你试试把微调后的权重先合并回原模型,再重新做一次GPTQ量化,而不是直接加载LoRA adapter,这样能规避动态合并的损耗。另外max_model_len=4096对7B模型来说有点激进,显存虽然没爆但KV cache可能已经占了不少预算,你可以用vLLM的--kv-cache-dtype fp8或者调低一点长度试试看。还有个小技巧,如果生产环境允许,考虑用AWQ替代GPTQ,它对微调后的权重兼容性更好,我自己实测AWQ在类似场景下能快15%左右。最后确认下你的vLLM版本,0.6以上对LoRA支持优化了很多,升级说不定直接解决。
LoRA权重动态合并确实会拖速度,vLLM每次前向都要算一遍adapter的增量,7B模型上这个开销不小。另外你用的4bit QLoRA训练完,合并后的权重再走gptq量化,精度和kernel适配都可能出问题,建议试试先把LoRA merge回基座再重新量化导出。显存没爆说明不是瓶颈,纯粹是计算路径变长了。可以对比下merge后不量化的速度,能定位到底是合并还是量化惹的祸。
你这情况大概率是LoRA权重没合并就直接上vLLM了,动态merge确实会拖速度,而且gptq量化对LoRA叠加后的权重支持不太好。建议先把LoRA合并到基座模型里,再重新做GPTQ量化,这样推理基本能回到原版水平。我之前也踩过这个坑,合并后25 token/s稳稳的,效果也没掉。
我遇到过类似情况,LoRA推理时如果没提前merge,vLLM每次前向都要算adapter分支,延迟直接翻倍。建议把LoRA权重merge回基座再重新量化导出,速度基本能回到原版水平。另外gptq对合并后的权重兼容性一般,可以考虑awq或者fp8试试。
LoRA推理时动态合并确实会拖速度,试试提前合并权重再量化,vLLM对合并后的模型支持更好。
我之前也踩过这个坑,大概率是LoRA权重没合并就直接上vLLM导致的,推理时每层都要额外算一次adapter,速度肯定掉。建议先把LoRA merge回基座权重再重新量化导出,别用动态加载那套。另外gptq对4bit QLoRA微调后的权重确实不太友好,可以试试awq或者直接fp16合并后再量化,14G显存其实还有余量。