最近在折腾本地部署,机器是4090 24G,想跑Qwen2.5-7B-Instruct做代码补全。我用了vLLM,开了gptq量化(4bit),max-model-len设了8192,结果一启动就OOM,看日志显示KV cache分配失败。后来把max-model-len降到4096勉强能跑,但上下文一长就开始疯狂换页,速度慢到没法用。我查了文档,说7B 4bit大概要6-7G显存,按理说24G应该绰绰有余啊?是不是我--gpu-memory-utilization参数没调好?还是说vLLM对量化模型的支持有问题,应该直接用AWQ或者FP8?另外我注意到有人推荐用llama.cpp的flash attention,说显存占用更低,有点犹豫要不要换方案。有没有大佬指点一下,我这配置到底该怎么调优?
vLLM部署Qwen2.5-7B显存总爆,是量化不够还是我姿势不对?
全部回复
共 74 条4090跑7B按理说真不该爆,你试下把gpu-memory-utilization调到0.9以上,vLLM默认只吃85%左右,但24G卡其实能分更多。另外max-model-len别硬拉,vLLM的KV cache是预分配的,8192对7B来说本身就吃不少,建议先开个paged attention的日志看看实际占用。AWQ和GPTQ在vLLM上其实差不多,但FP8对40系有加成,可以试试。最后提醒下,代码补全场景可以考虑offload几层到CPU,或者直接上llama.cpp的flash attention,不过那又是另一套折腾了。
4090跑7B还OOM,八成是--gpu-memory-utilization给太低,留点余量给KV cache试试0.9。
24G跑7B按理说真够用了,问题大概率出在vLLM的KV cache预留上,--gpu-memory-utilization默认值0.9但配合gptq反而容易踩坑,建议直接显式设成0.85再配--max-num-seqs小一点试试。另外你这场景代码补全其实对长上下文没那么刚需,不如把max-model-len砍到4096然后专注调--block-size,换页问题能缓解不少。AWQ和FP8在vLLM里确实比gptq稳,但先别急着换,我之前遇到类似情况是swap空间设太小导致的,检查下--swap-space是不是设了0。
4090跑7B按理说真不该这么憋屈,我之前用AWQ同样4bit,max-model-len开8K,gpu-memory-utilization设0.9,跑代码补全没爆过。你试试别用GPTQ,vLLM对AWQ的kernel优化更成熟,显存碎片少很多。另外检查下是不是paged attention的block大小没调,默认值在长上下文下挺吃显存的,手动调小点能缓解换页。换llama.cpp也是条路,但vLLM的continuous batching优势就没了,建议先排除参数问题。
24G跑7B还爆显存多半是gpu-memory-utilization没给够,设个0.9试试,AWQ确实比GPTQ省心不少。
4090 24G跑7B还爆显存,你这肯定不是量化的问题,gptq 4bit加载模型本身也就5G出头,问题大概率出在vLLM的预分配策略上。我上次跑同款模型,把--gpu-memory-utilization调到0.85,然后--max-num-seqs设成4,立马就稳了,你试试看。另外vLLM对gptq支持其实挺成熟的,AWQ反而在7B上没明显优势,FP8在4090上倒是能省点显存但速度提升有限。还有你提到的llama.cpp,如果只是本地单机用,它的flash attention和动态KV cache确实更省心,不过并发请求多的话还是vLLM更合适。
说实话我第一反应也是想问你--gpu-memory-utilization到底设了多少,因为vLLM这玩意儿默认值是0.9,但你开了4bit量化后它还是会按未量化模型的原始参数去估算KV cache的预留空间,这就会导致它把显存全占了然后给KV cache分配的时候发现压根不够。我之前用A100跑7B AWQ也踩过这坑,后来直接把utilization调到0.6-0.7,同时把--max-num-seqs压到16,才勉强稳住。不过你提到换页慢,这更像是vLLM的block管理策略问题,它不像llama.cpp那样动态调整上下文窗口,而是预分配固定大小的KV cache,所以8192长度对7B来说确实是个巨大的显存黑洞。至于AWQ还是FP8,我个人体感是AWQ在vLLM上的兼容性比GPTQ好不少,尤其是配合最新的vLLM版本,显存占用能再低个10%左右,但FP8得看你的卡支不支持,4090倒是没问题。最后你提到llama.cpp的flash attention,那个换页问题确实会好很多,但速度上跟vLLM比还是有点差距,如果你是纯代码补全场景,不如试试把vLLM的--enable-prefix-caching打开,能省不少重复计算。
4090跑7B还爆显存,多半是vLLM的KV cache策略问题,试试加--kv-cache-dtype fp8_e5m2能省不少。
另外换AWQ也行,gptq在vLLM里确实兼容性一般,我上次用llama.cpp反而稳。
说真的,24G跑7B 4bit还OOM,问题大概率不在量化本身,而是你给KV cache留的空间太少了。--gpu-memory-utilization默认是0.9,但你如果没显式设过,vLLM会按模型权重+激活去估算,有时候对量化模型的预留值偏保守,反而导致KV cache那部分被卡死。我建议你直接把它设成0.95,然后max-model-len先保持8192试试。
另外,你提到换页慢,这其实是vLLM在显存不够时走CPU offload的典型表现,不是量化精度的问题。说实话,7B模型用GPTQ 4bit在24G上应该很舒服,我甚至跑过32K上下文都没事,但你得确认一下是不是--max-num-seqs设太大,或者--block-size太小,这俩参数对显存碎片化影响很大。
至于AWQ和FP8,理论上AWQ在vLLM里的kernel优化更成熟,但我不觉得是当前瓶颈。你不如先看下启动日志里的显存分配明细,或者用nvidia-smi盯着看,是不是有其他进程占了显存。我猜你是把--enforce-eager漏了,导致CUDA graph预分配了一堆显存,这个在量化模型上特别明显。
最后,llama.cpp那个方向确实能省显存,但你要做代码补全的话,它的采样接口和vLLM的吞吐差距挺大的,建议先把vLLM的参数调明白再说。
24G跑7B按理说真不该爆,我之前用同卡跑过13B的AWQ都没事。你问题八成出在--gpu-memory-utilization上,默认是0.9,但vLLM在量化模型上计算KV cache时经常高估内存占用,试下直接设成0.85或者0.8,留出更多余量给碎片。另外gptq和awq在vLLM里的显存管理逻辑确实不一样,awq的算子优化更好,特别是对7B这种小模型,换awq大概率能解决。还有max-model-len别只看长度,它会直接影响KV cache的预分配大小,你设8192但实际代码补全根本用不到那么长,改成5120或者6144试试,比调量化实在。llama.cpp的flash attention确实省显存,但跑在4090上性能和vLLM差太远,不建议换。最后提个容易忽略的点,检查下你是不是开了--enforce-eager,有时候默认的CUDA graph会额外占几百M。如果这些都不行,直接上FP8,实测比4bit还省。
4090跑7B按理说真不该爆,你试试把gpu-memory-utilization调到0.85左右,然后给vLLM加个--enforce-eager参数关掉CUDA graph,这俩经常是显存刺客。另外别用GPTQ了,这格式在vLLM里调度效率确实一般,换AWQ或者直接上FP8能省不少KV cache的碎片。还有你max-model-len设8192但实际补全根本用不到那么长,改成4096然后调大block大小,换页问题会好很多,别被文档里那个6-7G忽悠了,那是纯权重,KV cache才是大头。
4090跑7B按理说真不该OOM,你试试把--gpu-memory-utilization调到0.85左右,然后--max-num-seqs调小点,我怀疑是预分配的KV cache太大把显存吃满了。另外vLLM对GPTQ的支持确实不如AWQ稳,之前我换AWQ后同样的长度就没再炸过,你也可以看看是不是pytorch版本和CUDA没对齐。还有那个llama.cpp的flash attention选项,我试过在长上下文下速度提升挺明显的,但你要用的话得把模型转成GGUF,有点折腾。
这问题我上周刚踩过一模一样的坑,24G跑7B 4bit理论上确实够,但vLLM的KV cache默认分配策略特别激进,你八成是没给--gpu-memory-utilization留余量。我之前设0.9都OOM,后来改成0.7加--max-num-seqs=1才稳,但代价是batch吞吐直接砍半,代码补全这种低并发场景倒是能忍。另外gptq在vLLM里确实不如AWQ省显存,尤其你max-model-len拉满时,KV cache是按最大长度预分配的,8192对7B来说本身就占不少。建议你直接换AWQ量化,实测同样4bit比gptq能多塞30%的上下文,或者干脆用FP8,虽然模型体积大点但显存占用反而更线性。还有个骚操作是把--swap-space调小到1GB,强制走CPU换页,能续命但延迟会飙到秒级。不过说真的,要是追求长上下文流畅度,llama.cpp的flash attention确实比vLLM省心,就是API兼容性差点,得自己写调度。你最后那句被截断的话是啥?想推荐fla...啥?
gpu-memory-utilization设到0.9试试,另外4090跑7B别开8192长度,vLLM对长上下文显存开销比你想的大。
你这配置不背锅,八成是vLLM预分配太激进,试试把gpu-memory-utilization调到0.85以下。另外别惦记AWQ了,先换llama.cpp把4090吃满再说。
把gpu-memory-utilization调到0.85试试,另外4090跑vLLM确实容易预留空间不足,换AWQ可能更稳。
你这情况大概率是gpu-memory-utilization默认值太高,vLLM会预占满显存给KV cache留空间,但量化后权重实际占用和它预估的对不上,试着手动设成0.85-0.9看看。另外7B模型就算4bit,长上下文下KV cache才是大头,8192长度对24G本来就有压力,4096能跑但换页说明你scheduler策略可能没调,加个--enable-chunked-prefill试试。AWQ和GPTQ在vLLM上差别不大,FP8反而可能更吃显存,别急着换。llama.cpp那个推荐我试过,速度不如vLLM,但显存控制确实更灵活。
24G跑7B按理说真不该爆,你这更像是vLLM预分配策略的问题,--gpu-memory-utilization默认是0.9,但配合gptq有时候会吃满显存还不释放。建议试试先手动设成0.7或者0.8,再把--max-num-seqs调小一点,比如4或8,这参数对KV cache影响特别大。另外你提到换页慢,大概率是--swap-space设太大,直接设成0或者干脆换成AWQ版模型,vLLM对AWQ的显存管理比gptq成熟不少。llama.cpp那个方向我也试过,但做代码补全的连续请求场景下,它的批处理效率确实不如vLLM,除非你愿意牺牲速度换稳定。
试试把gpu-memory-utilization调到0.9,再关掉前缀缓存,我这么配跑8k上下文稳得很。
4090跑7B其实很宽裕,问题多半出在vLLM默认的KV cache预留策略上,你试试把gpu-memory-utilization调到0.9,然后显式设置--kv-cache-dtype fp16,有时候默认的auto会翻车。另外GPTQ在vLLM里兼容性确实一般,我后来换AWQ之后同样的配置直接能跑满8192,速度也稳。如果你主要做代码补全,其实llama.cpp的flash attention优化比vLLM更吃香,因为它省掉了很多调度开销,长上下文换页会少很多。