最近在搞一个内部工具的对话接口,用VLLM部署了Qwen2.5 7B,单次调用挺流畅的,但并发一上到10个请求左右就开始频繁OOM,直接Kill进程。我看配置里设了max_num_seqs=256,gpu_memory_utilization也调到了0.8,还是顶不住。是不是我模型加载方式不对?还是需要换量化版本?或者得拆成多个副本?求有经验的老哥指点一下,预算有限暂时上不了A100,就一张3090。
VLLM部署Qwen2.5 7B,并发一高就OOM怎么办?
全部回复
共 160 条3090跑7B并发10就爆显存不正常,先看下是不是vllm的cache没复用,把max_num_seqs调低到32试试。
3090就16G显存,跑7B还开256的max_num_seqs属实有点贪了,这参数不是越高越好,10并发时KV cache直接炸了。你把max_num_seqs降到32或者64试试,gpu_memory_utilization也别硬顶0.8,留点余量给CUDA context。要是还不行就上AWQ或者GPTQ的4bit量化,7B量化后显存占用能砍一半,3090跑起来会从容很多,单副本应该够用。
你这配置单看没啥大问题,但3090就24G显存,7B模型加KV cache在max_num_seqs=256下并发10个就爆挺正常的。建议先把max_num_seqs降到32或64试试,同时把--enable-chunked-prefill打开,能省不少显存。量化的话AWQ 4bit效果挺明显,质量损失不大,可以先试这个。另外别拆多副本,3090单卡拆了更浪费,优先调参和换量化。
max_num_seqs调太大反而容易爆显存,试试降到32或64,配AWQ量化能撑住。
3090的显存跑7B并发本来就很吃紧,max_num_seqs=256这值设太大了,实际并发10根本用不到这么多,反而会让显存预分配爆掉,改成32或64试试。另外gpu_memory_utilization别只盯着0.8,建议配合--swap-space和--block-size调一下,或者干脆开--enable-prefix-caching省显存。量化的话建议直接上AWQ或者GPTQ的4bit版本,效果几乎无损,单卡能扛的并发能翻一倍。实在不行就拆两个vllm实例各占一半显存,用nginx分流,比一个实例硬扛稳定得多。
3090跑7B并发10就炸挺正常,max_num_seqs改32试试,显存得给KV cache留够。
3090就24G显存,跑7B满血版本来回旋余地就小,max_num_seqs=256那个值在这种卡上基本是摆设,实际并发10个就炸很正常。建议先看看是不是prefill阶段显存峰值爆的,可以把max_num_batched_tokens调小点试试,比如512或者1024。另外量化确实值得试,AWQ或者GPTQ的4bit版本显存能省不少,我自己的7B模型量化后并发提升挺明显的。要是还不行,就别硬扛单卡了,拆两个副本各占12G,用vLLM的并行推理,可能比死磕一个进程省心。
3090跑7B还要扛10并发,OOM太正常了,把max_num_seqs砍到32再试试,量化到4bit能救急。
3090跑7B并发10个就OOM挺正常的,你这max_num_seqs=256设得太激进了,实际显存根本扛不住,先把它降到32或者16试试。另外gpu_memory_utilization调到0.8对7B来说反而容易爆,建议改到0.65左右,给KV cache留点余量。我怀疑你还没开continuous batching的显存优化,VLLM默认应该开着,但可以检查下--enable-prefix-caching有没有生效,这能省不少重复计算。如果还不行,直接上AWQ或者GPTQ的4bit量化,精度损失不大,但能轻松把并发拉到20以上,一张3090跑7B量化版是够用的。
3090就24G显存,跑7B开256的max_num_seqs属实有点激进,这参数不是越大越好,显存得按实际并发来算。我之前用2080Ti跑7B,max_num_seqs压到32,gpu_memory_utilization设0.85,并发20左右才稳。你试试把max_num_seqs调低到64或者32,再配合--swap-space,应该能缓解。另外Qwen2.5 7B有AWQ量化版,显存占用能砍一半还多,精度损失不大,预算有限的话这路子最划算,单卡并发能翻倍。
3090上跑7B本来显存就紧巴巴的,你max_num_seqs开到256在这个卡上基本是给自己找麻烦,这个参数不是越大越好,它直接影响KV cache的预分配,建议先砍到32或者64试试,并发10个请求根本用不到256的槽位。另外gpu_memory_utilization调到0.8其实有点激进,因为vLLM还会额外占一些显存做CUDA context和中间buffer,你可以试试0.7,留出更多余量给碎片化内存,OOM往往不是峰值不够,而是碎片太多导致分配失败。
说实话7B模型fp16权重就要14G左右,3090才24G,你剩下的空间全给KV cache也撑不住高并发,量化是个更实际的思路,AWQ或者GPTQ的4bit能直接把权重压到7G,KV cache空间瞬间翻倍,效果基本无损,你可以试试用autoawq量化一下再部署。另一个思路是开vLLM的prefix caching,如果你们内部工具的对话有system prompt或者固定前缀,能省下不少重复计算和缓存。
还有个坑是vLLM默认会做continuous batching,但你要确认一下是不是开了swap space,如果没设swap空间,一旦并发超了直接OOM而不是排队,可以设个--swap-space=16让部分KV cache落到内存里,虽然慢点但至少不会崩。最后如果并发还是上不去,别拆副本,一张卡拆多个实例反而显存浪费更严重,不如把max_num_seqs调低加上量化,基本能扛住20并发左右。
3090就24G显存,跑7B满血版本来回留不了多少KV cache,max_num_seqs=256基本是给A100那种80G准备的,你调成32或者64试试,并发10个应该够用了。另外gpu_memory_utilization别拉太高,0.8容易和CUDA context抢显存,降到0.7再配合--swap-space说不定能缓解。真要省显存不如直接上AWQ或GPTQ的4bit量化,精度损失在你那个内部工具场景几乎感知不到。单卡多副本就别想了,3090跑两个7B实例反而更吃内存,不如把请求排队逻辑做好。
3090也就24G显存,跑7B满血版本来回旋余地就小。max_num_seqs=256设太大了,这参数是给A100那种80G卡用的,你改成32或64试试,能把显存留给KV cache。另外gpu_memory_utilization调到0.9问题不大,别低于0.85。
如果还不行,直接上AWQ或GPTQ的4bit量化版,7B量化后显存占用能砍一半,并发翻倍没问题。别拆多副本,3090单卡拆了反而增加显存碎片。我这边之前用4090跑Qwen2.5 7B,就是量化+限制num_seqs,20并发稳得很。你先看下是不是VLLM版本太老,更新到0.6.3以上对显存管理好很多。
3090就24G显存,跑7B还得留KV cache的余量,max_num_seqs=256设得太激进了,并发10个请求时每个序列的显存占用会暴涨,建议先砍到32试试。另外gpu_memory_utilization别拉满0.8,给CUDA context留点空间,0.7左右更稳。量化的话AWQ或GPTQ能省一半显存,但精度损失看你能不能接受,实在不行拆两个副本用--tensor-parallel-size 1各占12G,配合负载均衡也能扛住。我之前用4090部署同类模型,就是靠调低max_num_seqs和换量化才稳住的,你可以先按这个思路排查。
3090就24G显存,跑7B满血版本来回swap就很吃力,max_num_seqs=256这值设太大了,实际并发10个都到不了,建议先砍到32试试。另外gpu_memory_utilization可以再往上调,0.9没问题,但得留点给KV cache,别全吃满。量化的话AWQ 4bit效果挺明显,显存占用能降一半,精度损失在这种内部工具场景基本感知不到。单卡实在扛不住的话,可以试试把vllm的--enable-prefix-caching打开,重复对话场景能省不少显存。
3090显存就24G,max_num_seqs别拉满,降到64试试,同时上AWQ量化版能省一半显存。
3090上跑7B还开256的max_num_seqs,OOM太正常了,这参数是按A100的显存设计的。你可以先降到32试试,gpu_memory_utilization调到0.9,再把vLLM的--enable-prefix-caching打开,能省不少显存。要是还不行就上AWQ量化,4bit下7B大概只要6G多,并发能翻一倍。另外别拆多副本,单卡拆了反而增加显存碎片,不如调低并发上限保稳定。
3090显存跑7B并发10个确实有点极限,max_num_seqs调太高反而会让显存碎片化加剧,试试降到32-64,同时把gpu_memory_utilization降到0.7以下留点余量给KV cache。另外别用AWQ,直接上GPTQ的4bit量化,配合--kv-cache-dtype fp8能省不少显存,我这边同配置稳过20并发。实在不行就开两个vllm实例各绑一半显存,比单实例硬扛稳得多。
3090也就24G显存,跑7B满血版本来回切换KV cache就很吃紧,max_num_seqs调256有点激进了,先降到32试试,再把gpu_memory_utilization降到0.7留点余量给CUDA context。另外建议直接上AWQ或GPTQ的4bit量化,显存占用能砍一半,并发翻倍问题不大,我这边用同样卡部署Qwen2.5 7B AWQ,20并发稳得很。
3090也就24G显存,跑7B满血版本身就很吃紧,你max_num_seqs设256其实是把显存预留给KV Cache了,但并发一高反而容易爆。建议先降到32试试,或者开--enable-prefix-caching减轻重复计算。另外可以看看是不是vLLM版本太老,0.6.x对Qwen2.5支持有问题,更新到最新版说不定有改善。量化的话AWQ或GPTQ能省不少显存,但损失点精度,内部工具够用就行。