最近在折腾本地知识库,用vLLM部署Qwen2.5-7B-Instruct,开--max-model-len 8192,单卡A10(24G)。单线程测速还行,大概40 tokens/s,但一旦用gradio开个web demo,3-4个人同时问问题,显存直接爆掉,报CUDA out of memory。
vLLM部署Qwen2.5-7B,并发一高就OOM,是量化还是换框架?
全部回复
共 28 条这问题我也踩过坑,vLLM的显存预分配策略在并发上来时特别激进,尤其gradio每个session还会额外占context显存。你可以先试试把--gpu-memory-utilization降到0.85,再开--enable-prefix-caching,如果还不行就考虑下FP8量化,A10跑7B损失不大但显存能省不少。换框架的话,SGLang在动态batching上更省显存,不过迁移成本你得权衡下。你现在的KV cache具体怎么设置的?感觉这个参数比模型本身更影响高并发下的显存占用。
vLLM的pre-allocated显存策略就是吃这个亏,建议开--gpu-memory-utilization 0.9再配个AWQ量化试试。
我之前也踩过这个坑,A10的24G跑7B其实余量不算大,尤其gradio那套会把多份请求的中间态都留在显存里。建议先别急着换框架,试试把--max-num-seqs调小到4或8,再开个--gpu-memory-utilization 0.85,能压掉不少峰值占用。如果还是炸,再考虑AWQ量化,4bit下速度基本不掉,显存能省一半多,我这么改完就没再OOM过。
这情况我太熟了,A10的24G跑7B其实挺尴尬的,显存带宽和容量都不算宽裕。你这个现象大概率不是框架问题,vLLM本身对并发支持已经算好的了,OOM多半是KV cache吃满了,加上gradio那层还要额外占显存。你可以先试试把--max-model-len降到4096,或者干脆设个--gpu-memory-utilization 0.85,给KV cache留点缓冲,不然并发一上来必炸。量化的话,AWQ或GPTQ能省不少显存,但如果你追求速度,其实可以先换掉gradio,用FastAPI加流式输出,单纯加个排队机制就能缓解不少。另外,你单测40 tokens/s,多人并发掉到十几也正常,别指望A10能扛住真正的多用户场景,真想上生产还是得看多卡或者更大的显存。我之前用T4跑过类似配置,最后发现是--enforce-eager没开导致显存碎掉,你也可以查一下这个参数。总之先别急着换框架,把profiling打开看看峰值显存分配在哪再做决定。
试试把gpu-memory-utilization从默认0.9降到0.85左右,再限制下max-num-seqs,比如设成8,vLLM默认会按最大并发去预留KV cache,不炸才怪。A10这卡7B模型8192上下文单请求就吃掉不少,3-4个并发爆显存挺正常的。换框架意义不大,先开enable-prefix-caching,知识库场景system prompt能省不少。真要再稳一点就上AWQ量化,7B对精度影响很小,显存直接砍一半。
A10 24G跑7B不量化,还要8192上下文,并发一上来OOM太正常了。关键得看--gpu-memory-utilization和--max-num-seqs怎么设的,默认值可能太激进。可以先把gpu-memory-utilization调到0.85,max-num-seqs压到4试试,再考虑上AWQ或者GPTQ量化。其实换框架未必解决问题,SGLang在显存管理上会好一点但也不是万能药,先调参数性价比最高。
试试把gpu-memory-utilization调到0.85,再限制max-num-seqs,我之前也这么爆过。
你这个问题其实挺典型的,vLLM的PagedAttention虽然省显存,但它省的是KV cache的碎片,不是省KV cache的总量。8192的max-model-len配上并发请求,每个序列都要预留对应长度的KV空间,A10这24G扣掉模型权重(7B fp16大概14-15G)剩给KV的本来就不多,三四个人同时进来直接把block pool吃满了。你单线程40 tokens/s说明模型加载和推理本身没问题,瓶颈纯粹在并发时的显存预算。先别急着换框架,试试把max-model-len降到4096,或者用--gpu-memory-utilization 0.9把水位调高一点,再用--max-num-seqs限制同时处理的序列数,通常能撑住更多并发。真要上量化的话,AWQ或GPTQ的4bit版本能把权重压到5-6G,省下来的全给KV cache,同样硬件下并发数能翻不少。不过量化对知识库这种需要精确检索回答的场景可能有精度损失,建议先测一下效果再决定。换框架倒不是必须的,llama.cpp或者TGI在并发上也不会比vLLM好到哪去,本质还是显存和KV预算的问题。