最近在折腾本地知识库,用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,是量化还是换框架?
全部回复
共 40 条这问题我也踩过坑,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预算的问题。
试试 --gpu-memory-utilization 0.9 并限制 --max-num-seqs 8,A10 24G 跑 7B 并发高确实容易炸,量化到 AWQ 会稳很多。
这个OOM其实多半不是模型权重本身的问题,7B的bf16权重也就15G出头,A10剩的那点显存全被KV cache吃掉了。你算一下,8192上下文、默认gpu-memory-utilization 0.9,vLLM会预分配一大块显存给cache,3-4个人并发如果每人塞进去几千token的对话历史,很快就把block占满了。可以先试试把max-model-len降到4096,再把gpu-memory-utilization压到0.85左右,看并发能不能扛住。真要保长上下文的话,量化确实能省权重显存,但省出来的空间有限,AWQ或GPTQ大概能把权重压到5-6G,多出来的10G给KV cache,并发能好不少,代价是长文本下质量会有点掉。不过我更怀疑是gradio那边每次都把完整历史重新灌进去,导致prompt长度炸了,可以先在请求层做个截断或者滑动窗口。换框架的话,SGLang的RadixAttention对多轮共享前缀的场景确实更省,但别指望换完就万事大吉,本质还是显存预算的问题。
24G单卡跑7B fp16权重就吃掉15G左右,剩下不到9G要扛KV cache,8192上下文下并发3-4路爆显存太正常了。建议先把max-model-len降到4096,再用--gpu-memory-utilization 0.9压一压,另外开--enable-chunked-prefill对多轮对话挺管用。真要多并发的话换AWQ或GPTQ量化能省一半显存,框架本身不用换,vLLM的PagedAttention已经算省的了。
试试把gpu-memory-utilization调到0.85再开--enable-chunked-prefill,24G跑7B并发确实紧,量化到AWQ能省不少。
试试把--gpu-memory-utilization往下调到0.85左右,再开--enable-chunked-prefill,vLLM默认会预分配一大块KV cache,并发一上来直接就顶满了。A10 24G跑7B其实不算宽裕,8192上下文本身就吃不少显存,三四个人同时进来很容易爆。另外可以看看是不是gradio那边没做好请求排队,一下子全丢给vLLM了,加个并发上限会稳很多。量化的话AWQ能省一截,但精度多少有点损失,先调参数试试再说。
A10 24G跑7B不量化,并发一上来KV cache直接吃满。换量化或者开--gpu-memory-utilization 0.9加限制并发数试试。
你这个问题大概率不是模型权重本身,而是KV cache把显存吃满了。8192上下文乘上并发数,A10那24G根本扛不住,建议先试试把max-model-len降到4096,再配上gpu-memory-utilization 0.9和max-num-seqs限制一下并发。量化当然能省显存,但Qwen2.5-7B用AWQ其实效果损失不大,可以先试量化,不一定非要换框架。如果预算允许,直接上双卡或者换L20会舒服很多。
这个OOM其实挺典型的,不是框架的锅,vLLM本身对并发显存的管理已经算克制了。你24G跑7B,8192上下文,光KV cache按fp16算每token大概1M多一点,4路并发一上来,光cache就得吃掉好几G,再加上模型权重本身15G左右,预热后基本就没剩多少余量了。真要扛并发,量化是最直接的路子,AWQ或者GPTQ 4bit能把权重压到5G出头,KV cache还能调gpu-memory-utilization和max-num-seqs来控制。不过量化对知识库这种任务得留神,检索类问答对精度掉一点其实感知不明显。另一个方向是别硬扛,直接换思路,把max-model-len降到4096,或者用vLLM的PagedAttention配合更激进的swap空间,反正知识库场景一般不需要那么长的上下文。如果还是不够,那可能得看是不是gradio那边的问题,比如没做请求队列,几个人同时点直接把batch打满了。
A10 24G 跑 7B 全精度权重就占 15G 左右,再开 8192 上下文,KV cache 一上来并发几个请求直接把剩余显存吃光,这 OOM 很正常。你可以先把 max-model-len 降到 4096 试试,再开 --enable-prefix-caching 和调低 --gpu-memory-utilization 到 0.9,一般能多撑几个并发。想彻底解决还是上 AWQ 或 GPTQ 量化,4bit 后显存能省一半多,A10 上跑 7B 并发七八个问题不大。换框架未必更划算,llama.cpp 省显存但吞吐和 vLLM 差挺多,看你是要稳还是要快。
你这情况其实挺典型的,A10跑7B不量化的话权重本身就占差不多15G,剩下给KV cache的余量真不多。8192的max-model-len加上并发一上来,KV cache是按并发数线性涨的,三四个人同时塞满上下文直接就把显存吃干净了,跟单线程测速那会儿完全两码事。我建议先把gpu-memory-utilization调到0.9左右试试,默认0.9已经挺激进了,但可以再确认下有没有被其他进程占着。真要提并发,量化基本是绕不开的路,AWQ或者GPTQ 4bit能把权重压到5G上下,省出来的全给KV cache,并发数能翻好几倍,精度损失在知识库问答这种场景基本感知不到。换框架的话其实意义不大,TensorRT-LLM或者SGLang在吞吐上确实有优势,但显存瓶颈的根子还是权重加KV,不量化换谁都得炸。还有个容易忽略的点是max-num-seqs,vLLM默认调度上限挺高,你可以显式限制一下,别让它无脑堆batch。
试试加 --gpu-memory-utilization 0.9 并限制 --max-num-seqs,并发上来KV cache才是吃显存的大头。
A10跑7B其实不算宽裕,你这一下并发三四个人,KV cache涨得飞快,OOM太正常了。先别急着换框架,把--gpu-memory-utilization调到0.9,再限制下--max-num-seqs,基本能扛住。真要稳的话上AWQ或GPTQ量化,显存能省不少,速度掉得也不算多。换框架解决不了根本问题,瓶颈还是在显存和KV cache这块。