最近在搞一个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微调模型,显存够但推理极慢,是量化问题还是我姿势不对?
全部回复
共 18 条这速度确实不对劲,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模型跑个基线,再换你自己的权重对比,这样能快速定位是量化兼容问题还是权重本身的问题。
vLLM 0.5.3对AWQ支持一般,换0.6.x试试,4090跑AWQ 8B不该这么慢。
AWQ配vLLM确实容易踩坑,试试换成GPTQ或者直接FP8,4090上速度能翻几倍。
4090跑AWQ 4bit的Llama 3 8B出6-7 token/s确实不正常,正常应该能到50以上。先别怀疑量化,vLLM对AWQ支持挺好的,问题大概率在别处。你可以试试把enable_prefix_caching关掉,还有检查一下是不是没装flash-attn或者版本不对,这玩意没生效的话注意力那块会拖垮速度。另外合并LoRA后最好重新保存一次再加载,有时候merge_and_unload出来的权重会有奇怪的布局问题。
试试加 --enforce-eager 看看,有时候cuda graph没跑起来反而拖慢速度。
AWQ 4bit在vLLM上一般不会这么慢,6-7 token/s明显不对劲。你先看看日志里KV cache实际分配了多少块,有时候gpu_memory_utilization设了但被其他进程占了显存,vLLM只能缩水。另外4090跑AWQ要确认走的是Marlin kernel,老版本vLLM对某些量化格式支持不好,可以试试升级到0.6.x或者换成GPTQ。LoRA合并只要用官方脚本一般不会残留慢路径,但可以拿原版模型对比测一下排除这个变量。
先看vLLM日志里实际跑的量化kernel是哪个,AWQ有时候会fallback到慢路径,合并LoRA后最好再量化一遍。
AWQ 4bit 在 vLLM 上偶尔会踩到慢内核,先把量化换回 fp16 或 gptq 跑一遍对比下速度,能快速排除是不是量化的锅。
6-7 token/s 这个数确实不太对劲,4090 上 AWQ 的 Llama 3 8B 正常应该能跑到 80 以上,就算考虑 LoRA 合并后有些许开销也不至于掉到个位数。我第一反应是 KV cache 没吃满导致 batch 太小,但你说 gpu_memory_utilization 已经拉到 0.9 了,那更可能是 vLLM 根本没走 AWQ 的 kernel。你可以看下启动日志里有没有出现 “awq” 相关的字样,如果它把模型当成 FP16 加载了,那显存占用会直接飙到 16G 以上,同时速度暴跌,这跟你描述的现象挺吻合的。另一个坑是 LoRA 合并的时候如果用了 merge_and_unload 但没保存成正确的 safetensors 格式,vLLM 加载时可能静默回退到某种兼容模式,建议直接拿原始 Llama 3 8B 的 AWQ 版本跑一下对比,排除是模型本身的问题。还有个小点,vLLM 0.5.3 对 AWQ 的支持需要显式指定 quantization=awq,不然它会自己猜,猜错了就是你现在这个结果。
AWQ 4bit在vLLM上确实偶尔会踩到慢路径,尤其是0.5.3那会儿对Llama 3的AWQ kernel支持还不算特别顺。你先跑个原生FP16的基线看看速度,如果FP16反而更快,那基本就是量化kernel的问题了。另外合并LoRA后最好检查一下config里的architectures和量化配置有没有被覆盖掉,我之前就遇到过合并后量化标记丢了导致走回fp16路径的坑。
AWQ 4bit在vLLM上跑6-7 token/s确实不正常,4090再差也不至于这样。你先看看是不是enforce_eager没关,默认应该是开的CUDA graph,关了会慢一大截。另外AWQ的kernel在0.5.3上对Llama 3的支持有点挑,可以试试换成GPTQ或者直接fp16跑一下对比,排除量化兼容性问题。还有LoRA合并那块,确认下merge_and_unload之后有没有真的把base model的adapter层清掉,残留的话确实会走慢路径。
AWQ 4bit在vLLM上一般不会这么慢,6-7 token/s更像是KV cache没吃满或者enforce_eager没关。你试试加--disable-log-stats看下实际GPU利用率,如果显存只用了7G不到,说明max_model_len可能被默认值卡住了。另外LoRA合并后最好用merge_and_unload确认下权重,残留adapter层确实会拖速度。
4090跑AWQ 4bit的Llama 3 8B才6-7 token/s确实不正常,我这边同配置能到40+。你先看看vLLM启动日志里有没有报AWQ kernel fallback到慢路径,有时候量化版本和vLLM的CUDA kernel不匹配就会走通用实现。另外合并LoRA后建议检查一下config.json里的quantization_config还在不在,我之前合并完忘了保留量化配置,vLLM当成FP16加载直接爆显存降速了。