最近在折腾本地部署,机器是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 条说实话gpu-memory-utilization这个参数影响挺大的,你试过手动设成0.85或者0.9吗?默认值有时候会预留太多给碎片,而且vLLM对GPTQ的KV cache管理确实不如AWQ那么激进。另外代码补全场景其实上下文长度要求没你想的那么高,4096可能真够用,问题在换页的话试试加--enable-chunked-prefill,能把显存使用摊平很多。
24G跑7B的量化模型还OOM,这肯定不是显存容量的问题,我怀疑瓶颈在KV cache的预留策略上。vLLM默认会按max-model-len和gpu-memory-utilization预先分配整块连续显存,你设了8192长度但没调utilization参数,默认值0.9会让它试图一次性吃满显存,结果和模型权重抢空间就崩了。建议先试试--gpu-memory-utilization 0.6到0.7,给KV cache留出余量,同时把--max-num-seqs调小,比如4或8,减少并发序列的缓存占用。另外你提到AWQ或FP8,我实际测过,vLLM对AWQ的支持比GPTQ更稳,尤其Qwen系列,FP8在4090上效率也不错,但需要留意显存碎片问题——你可以先开个nvidia-smi看看是不是有别的进程占着显存。说到llama.cpp,它的flash attention和mmap机制确实更省内存,但吞吐量比vLLM低不少,代码补全场景如果单用户用,反而可能更顺滑。最后建议你开--enable-prefix-caching,代码补全常见重复前缀,能减少重复计算,显存压力会小很多。
把gpu-memory-utilization调到0.9试试,另外4090跑7B用FP8比GPTQ省心,我换了之后就没爆过。
24G跑7B还OOM,多半是gpu-memory-utilization默认值太高了,直接设个0.85试试,我这么调好的。
24G跑7B还爆显存大概率是gpu-memory-utilization默认值太高,手动设到0.85试试。另外vLLM对GPTQ支持确实一般,换AWQ会稳很多。
4090跑7B还爆显存,八成是--gpu-memory-utilization没设成0.9以上,vLLM默认留太多给CPU了。
24G跑7B 4bit按理说确实不该OOM,问题大概率不在量化精度上。你注意到没,vLLM的KV cache分配是按max-model-len和gpu-memory-utilization的乘积来预占显存的,默认值好像是0.9,留给模型权重的空间就被压缩了。如果没显式调低这个比例,哪怕权重只占6G,剩余18G也会被KV cache全抢走,7B模型加上中间激活值,一碰就爆。我之前跑同尺寸模型,直接把gpu-memory-utilization设成0.6,再配合block-size调小一点,就能稳在8K上下文。另外你提到AWQ,说实话对vLLM来说,GPTQ和AWQ在后端实现上差别不大,FP8反而可能因为部分算子没优化好更吃显存。至于llama.cpp,它确实更省,但吞吐量跟vLLM不是一个量级,做代码补全这种低延迟场景可能不如后者。建议你先试试把utilization降到0.65以下,顺便看看vLLM的版本,老版本对量化模型的KV cache管理有已知bug。还有个骚操作,可以开启--enable-chunked-prefill,减少预填充阶段的峰值显存。最后确认下你的代码补全是不是真需要8K上下文,很多场景4K都够用,别为了参数好看把自己卡死。
你这情况我上周刚遇到过,问题大概率不是量化格式,而是vLLM默认会预分配整块显存给KV cache,--gpu-memory-utilization设个0.85左右,再配合--max-num-seqs调小点试试。4090跑7B 4bit其实余量很大,但代码补全这种场景建议把--enforce-eager加上,关掉CUDA graph能省下不少临时显存。另外别用GPTQ了,AWQ在同显存下能多塞30%的KV cache,FP8反而在4090上没优势。llama.cpp的flash attention对长上下文确实更稳,但吞吐量不如vLLM,你这种交互式补全其实够用。
24G跑7B按理说真不该炸,问题大概率出在KV cache的预留上。vLLM默认会按max-model-len给KV cache分配显存,你设8192时可能没给权重留够余量,试试把--gpu-memory-utilization调到0.85以上,或者干脆开--enforce-eager关掉CUDA graph能省不少显存。另外GPTQ在vLLM里的兼容性确实不如AWQ丝滑,有条件换AWQ或者FP8对比下,老版本vLLM对量化模型的支持也容易踩坑。llama.cpp那个方向我也在试,显存占用是真低,就是速度上限摆在那,代码补全场景可能还得看具体延迟需求。
显存爆大概率是gpu-memory-utilization默认值太高,留点余量设到0.85试试,另外4090跑7B用AWQ比GPTQ更稳。
24G跑7B 4bit还爆显存,这确实不太正常,我怀疑你看到的那个6-7G估算值是把权重和激活分开算的,压根没把KV cache和运行时开销算进去。vLLM的显存分配策略是预占式的,--gpu-memory-utilization默认0.9,但它会优先给KV cache预留空间,你max-model-len设8192,光是KV cache可能就要吃掉10G+,加上权重和CUDA context,24G就非常紧了。建议你先把那个参数调到0.85以下,同时把--max-num-seqs调小到16试试,有时候并发序列数太高也会导致显存碎片化。另外,GPTQ在vLLM里确实存在反量化开销,但通常不至于直接OOM,我怀疑你用的是动态量化而非预量化模型,加载时临时做量化会多吃一倍内存。如果换AWQ的话,显存占用会稍微低一点,但提升有限,FP8在4090上支持得不错,你可以试试,不过代码补全这种场景,我反而觉得llama.cpp的mmap映射更省心,虽然速度慢点但至少不会秒挂。最后问一句,你启动命令里有没有加--enforce-eager?这个选项能关掉CUDA graph,减少约1.5G的静态显存占用,对排查问题很关键。
24G跑7B按理说真不该OOM,我之前用AWQ的4bit版本,同样vLLM,max-model-len开到16k都没事。你检查下--gpu-memory-utilization是不是默认值0.9,有时候配合gptq会预留太多,手动调到0.95试试。另外vLLM对gptq的KV cache管理确实有点迷,换AWQ或GPTQ-Marlin能省不少显存,FP8在4090上也不错就是得看量化工具链是否支持。llama.cpp那个我也试过,胜在灵活,但吞吐量跟vLLM差一截,代码补全这种低延迟场景还是vLLM舒服。
24G跑7B 4bit按理说真不该爆,你八成是卡在--gpu-memory-utilization上,默认值0.9会预留一部分给CUDA context和激活值,尤其开长上下文时KV cache的预分配特别激进,试试直接设成0.95或者干脆0.98,再把--max-num-seqs压到1或2看看。另外vLLM对GPTQ的支持确实没AWQ那么顺滑,量化格式不匹配会导致显存碎片化,建议你直接换AWQ版权重,或者试试FP8,这俩在vLLM里走的是kernel-level优化,显存管理会更稳。llama.cpp那个方向我也试过,flash attention加mmap跑长上下文确实不爆,但吞吐量跟vLLM没法比,代码补全场景可能还是vLLM调参更划算。
4090跑7B按理说真不该这么憋屈,但你大概率是撞上vLLM那套PagedAttention的显存预留逻辑了。--gpu-memory-utilization默认值是0.9,但你得算上KV cache的额外开销,尤其max-model-len设8192时,KV cache峰值能吃掉接近10G,加上权重和激活值,24G卡确实会被瞬间塞满。我建议你先别急着换量化格式,把utilization调到0.95试试,同时把--max-num-seqs从默认的256降到32,这能显著减少临时缓存占用。另外,你提到llama.cpp的flash attention,其实vLLM也支持--enable-flash-attn,但新版好像默认开了,你可以显式关掉--swap-space来避免硬盘换页。如果实在不行,再考虑AWQ,因为GPTQ在vLLM里有时会因为反量化计算导致额外显存峰值,AWQ的kernel更省内存。还有个小技巧,代码补全场景其实不用那么长上下文,如果你能接受,把max-model-len锁在4096,但把--block-size改成32(默认16),能减少碎片化,换页频率会明显下降。