最近在搞一个RAG项目,用LoRA微调了Llama 3 8B,微调完导出合并权重后,尝试用vLLM部署到本地一张4090(24G)上。模型量化用的AWQ 4bit,按理说显存占用才7G左右,但实际推理时每秒只能出6-7个token,比我预想的慢太多。我看别人部署同档次模型都能到30-40 token/s。已经确认过vLLM版本是0.5.3,也设置了gpu_memory_utilization=0.9,但感觉它好像没把KV cache用满。想问问是我的量化格式和vLLM兼容性有问题,还是需要额外开启什么并行参数?或者干脆是LoRA合并时权重没处理干净,导致模型结构残留了原版某些慢路径?求有经验的老哥指点一下排查方向,现在卡在这边项目进度完全动不了。
部署Llama 3 8B微调模型,显存够但推理极慢,是量化问题还是我姿势不对?
全部回复
共 6 条这速度确实不对劲,AWQ 4bit在4090上跑8B正常应该30+ token/s起步。vLLM 0.5.3对AWQ支持挺成熟了,不太像兼容性坑,我怀疑你合并LoRA时是不是用了什么脚本把模型结构里的attention实现搞乱了,比如rope缩放或者key/value重复逻辑残留。另外确认下是不是走对了量化入口,vLLM对AWQ要传quantization=awq,别让它自动检测成fp16了。还有个偏方,你试着把gpu_memory_utilization降到0.8,留点余量给显存碎片,有时反而能触发更大的KV cache块分配。
先查下vLLM的版本日志,0.5.3对AWQ的KV cache复用支持有bug,升级到0.6.0再试。
我之前也卡在这,后来发现是tokenizer的pad侧没对齐,改成左padding直接翻倍了。
量化没问题,AWQ配vLLM挺稳的,你这速度八成是gpu_memory_utilization设太高导致KV cache没预留够,降到0.85试试。
看看是不是合并时把adapter权重也带进去了,vLLM对残差结构挺敏感,重新导出一次clean权重说不定直接翻倍。
4090跑AWQ 4bit的8B模型,6-7 token/s确实不正常,我怀疑不是KV cache的问题,而是vLLM对AWQ的kernel优化没生效。你检查下是不是在跑CPU算子,或者量化后的模型文件有没有被vLLM正确识别成量化格式,有时候它会偷偷回退到FP16计算。另外LoRA合并如果用的是peft的merge_and_unload,理论上不会留慢路径,但你可以试着用transformers直接加载原始模型对比下速度,排除权重问题。还有个偏方,把vLLM升到0.6.x试试,老版本对AWQ支持确实有坑。
AWQ 4bit在vLLM上一般不至于慢成这样,6-7 token/s确实太低了。你先看看是不是max_model_len设得特别大,或者没开enable_chunked_prefill,这两个会明显影响吞吐。另外LoRA合并后建议对比一下原版模型的输出速度,如果原版也慢,那就不是合并的问题,可能是vLLM没吃到tensor parallel或者CUDA graph没生效。
6-7 token/s这个数字确实太离谱了,4090上跑AWQ 4bit的8B模型,正常怎么也得30往上。你提到gpu_memory_utilization=0.9但KV cache没吃满,我第一反应是vLLM可能根本没走量化kernel,而是把AWQ权重反量化回fp16在跑,这样显存看着省了但计算量翻倍。可以先查一下启动日志里有没有类似"Loading model weights took"之后跟着量化相关的提示,或者直接用vLLM的benchmark脚本测一下纯模型吞吐,排除RAG链路本身的瓶颈。另外LoRA合并那块也值得怀疑,如果你是用peft的merge_and_unload,理论上权重是干净的,但要是手动合并或者中间过了什么转换脚本,有可能把base model的某些层搞重了。还有个容易被忽略的点:4090虽然算力够,但如果你没开enforce_eager而用了CUDA graph,某些vLLM版本在AWQ+LoRA合并权重上会有capture失败回退的情况,反而拖慢速度。建议先拿官方AWQ模型跑个基线,再换你自己的权重对比,这样能快速定位是量化兼容问题还是权重本身的问题。