最近在折腾本地部署,想用vLLM跑个Qwen2.5-7B做API服务,结果单卡A100 80G跑8个并发请求就OOM了,看了下显存占用直接飙到75G+。我知道可以开--max-model-len降低序列长度,但业务需要处理4K以上的长文本,不敢砍太多。
用vLLM部署Qwen2.5-7B时显存总爆,有人试过量化加流水线并行吗?
全部回复
共 115 条单卡80G跑7B还爆显存,这确实不正常,我怀疑不光是序列长度的问题。Qwen2.5-7B的KV cache在4K上下文下虽然占不少,但8个并发也不至于直接75G,你检查过vLLM的gpu_memory_utilization设置没?默认好像是0.9,但有时候它会把整个剩余显存都预占掉,实际可用反而更紧张。量化的话,AWQ或者GPTQ对7B模型效果挺稳的,4bit精度下显存能省一半左右,但你要注意vLLM对量化格式的支持,有些版本对AWQ的兼容性更好。至于流水线并行,单卡上其实意义不大,因为它是跨多卡拆分的,你这情况更适合开--enable-chunked-prefill,把预填充和解码阶段拆开,能显著降低峰值显存。另外可以试试把--max-num-seqs调小到2或者4,配合--max-parallel-loading-workers,有时候并发数不是靠显存硬扛的,排队机制反而更稳。我自己的经验是,先上4bit量化,再把gpu_memory_utilization调到0.75,max-num-seqs设4,4K文本下20个并发都没爆过。你试完反馈下结果,我挺好奇是不是vLLM版本的问题,之前0.6.x有个版本对长上下文处理有bug。
我试过类似组合,量化到4bit确实能省不少,但流水线并行在vLLM里对单卡意义不大,它主要是多卡场景用的。你不如看看是不是max-num-seqs没调,默认值在并发高的时候会吃满显存,手动设个8或16能缓解不少。另外Qwen2.5的KV cache优化挺重要的,试试开--enable-prefix-caching,长文本重复前缀多的话显存能降一大截。你那个75G是不是还包含了CUDA context和框架本身的占用?可以开--gpu-memory-utilization设到0.9再看实际峰值。
试过AWQ量化加tensor parallel,8个并发稳在40G左右,长文本没缩水但得调下gpu_memory_utilization。
量化后吞吐会掉一点,但你这场景明显显存是瓶颈,建议先上4bit试试,vLLM对Qwen支持还挺顺的。
试过AWQ 4bit量化加流水线并行,A100上8并发能压到45G左右,但吞吐会掉一些,得看你能不能接受。另外vLLM的continuous batching对显存峰值影响挺大的,试试把--gpu-memory-utilization调到0.9,再配个--enable-chunked-prefill,有时候比单纯并行更管用。4K上下文其实不算长,真要保长度,量化比砍max-model-len靠谱多了。
80G单卡跑8并发还OOM确实不正常,我怀疑你vLLM的prefill和decode没走chunked,显存碎片化严重。量化的话建议试下AWQ 4bit,能省一半多,配合流水线并行把层切到两张卡上,吞吐会稳很多。不过你长文本4K+的话,KV cache还是大头,可以试试把max-model-len设到4096然后开prefix caching,重复请求能省不少显存。另外确认下是不是没开gpu_memory_utilization,默认只用到90%但有时会预留过头。
说实话我也遇到过这情况,单卡A100 80G跑7B按理说绰绰有余,但vLLM的显存预分配机制确实吃紧,尤其是并发一起来。量化可以试试AWQ或者GPTQ,4bit下显存能省三分之一左右,但你要留意推理速度会不会掉,有时候batch大了反而更慢。流水线并行我倒没在单卡上试过,感觉不如直接把tensor_parallel_size调成1,然后开--gpu-memory-utilization到0.95,再把KV cache的block数手动设大点,比并行更直接。另外你检查过vLLM版本吗?旧版本对Qwen2.5的支持有bug,升到0.6.x之后显存管理好很多,建议先升级再折腾量化。
试过AWQ量化+流水线并行,显存直接砍半,吞吐还稳,你可以试试4bit配tp=2。
说实话你这个情况我上周刚踩过差不多的坑,A100 80G跑7B按理说余量很大,但vLLM默认的KV cache预分配策略太激进了,8并发加4K上下文直接给你吃满。我后来试了下GPTQ的4bit量化,显存占用能砍掉差不多一半,但你要注意量化后吞吐反而可能下降,因为反量化有额外开销,得用--quantization gptq配合--kv-cache-dtype fp8才能把收益拉回来。
至于流水线并行,我建议你先别急着上,vLLM的PP在单机多卡场景下通信开销挺明显的,尤其你这种单卡就能塞下的模型,反而可能拖慢延迟。我更推荐先试试--gpu-memory-utilization 0.9加上--max-num-seqs 4,把并发数手动压住,给KV cache留足预分配空间,这样就算长文本也不会爆。
另外你确认下是不是开了--enable-prefix-caching?如果业务里没有大量共享前缀,这个功能会额外吃显存,关掉能省出不少。还有个偏方,把Qwen2.5的tokenizer里的chat template精简一下,有些系统提示词会偷偷撑长序列,实测能省几百token的显存占用。
我之前跟你一模一样,A100 80G跑Qwen2.5-7B,稍微来点并发就爆。后来试了AWQ 4bit量化,显存直接降到40G左右,8并发稳得很,就是精度损失你得自己测测能不能接受。另外流水线并行对单卡没啥用,那是多卡才玩的,你这种情况不如先看看是不是vLLM的pre-allocate显存策略太激进,调下gpu_memory_utilization到0.85试试。长文本4K其实还好,量化后应该能扛住,你设个--max-model-len 8192再观察下。
这问题我也踩过坑,单卡A100跑7B其实没必要硬撑满血精度,AWQ或GPTQ量化到4bit之后显存能砍一半还多,并发8个基本能稳。流水线并行更吃多卡环境,单卡上不如把--gpu-memory-utilization调到0.95,再配合--enable-chunked-prefill把prefill和decode拆开,显存峰值能平滑很多。你那边如果量化后还爆,建议查下是不是vLLM版本太老,新版对连续批处理的显存复用优化挺明显的。
看到这个情况挺有共鸣的,我之前用vLLM跑别的7B模型也遇到过类似瓶颈。量化这块我试过AWQ,显存能降不少,但精度损失在长文本场景下偶尔会有点明显,得看你对输出质量的要求有多高。流水线并行我倒没在vLLM里试过,感觉它更多是配合张量并行用,单卡场景下会不会反而增加通信开销?另外你检查过KVCache的分配策略没,有时候把--gpu-memory-utilization调低点给调度留些余量,反而能避免OOM的毛刺。
我试过类似组合,量化到INT4确实能明显压显存,但要注意精度损失对生成质量的影响,尤其是长文本场景。流水线并行的话,单卡上开反而可能增加通信开销,不如先试试把KV cache换成FP8,或者调整--gpu-memory-utilization到0.9看看。你8并发是不是还开了前缀缓存?那个有时候会偷偷吃不少显存。
单卡A100 80G跑8并发就75G+确实有点离谱,我怀疑你主要不是被模型权重吃的,而是被KV cache和预填充阶段的临时张量撑爆的。量化肯定能救一部分,比如AWQ或GPTQ压到4bit,权重直接从14G降到4G左右,但长文本下KV cache才是大头,这块量化帮不上忙。流水线并行我倒觉得意义不大,vLLM本身对张量并行的支持更成熟,你不如试试把TP=2但只用一个卡池,或者干脆拆成两个服务实例,每个处理4个并发,反而更灵活。另外别忽略--gpu-memory-utilization这个参数,我习惯留10%给碎片和CUDA context,你如果设成0.95可能就爆了。还有个小技巧,可以把--enable-prefix-caching打开,如果业务里有重复的system prompt或者相似query前缀,能省不少显存。最后想问下你用的vLLM版本,0.6.x和0.7.x的显存管理差别还挺大的,升级有时候比调参更管用。
量化加流水线并行确实能救,但vLLM对PP的支持一直有点微妙,跨卡通信开销不小,你几张卡?我之前用AWQ 4bit跑Qwen2.5-7B,单卡A100 80G开gpu-memory-utilization 0.9,8并发4K上下文大概占55G左右,比FP16省太多了。建议先试量化,实在不够再考虑TP而不是PP,vLLM里张量并行成熟得多。另外记得把enforce-eager关了,CUDA graph能省不少显存碎片。
量化加流水线并行确实能缓解,但vLLM对AWQ的支持比GPTQ稳一些,你可以先试AWQ 4bit加--max-model-len 8192。流水线并行在vLLM里其实主要是TP,单机多卡开TP=2能明显降单卡显存,不过通信开销会拉高延迟。另外检查下是不是没开--enable-prefix-caching和--gpu-memory-utilization 0.9,默认值有时候偏保守反而浪费显存。