最近在搞一个内部工具的对话接口,用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其实显存带宽和容量都挺吃紧的,max_num_seqs=256设得太激进了,实际并发10个左右时KV cache会瞬间爆掉,先把这个值降到32或者64试试。另外gpu_memory_utilization可以再往0.9调,但记得留点显存给CUDA context。如果还不行,建议直接上AWQ或GPTQ的4bit量化,显存占用能砍一半,速度损失对7B来说感知不强。多副本就别想了,3090显存不够还得加CPU offload,反而更慢。
3090的显存带宽扛7B并发确实吃力,max_num_seqs调256反而可能让显存碎片化更严重,试试砍到32-64,同时把gpu_memory_utilization降到0.7以下留点缓冲。另外别死磕VLLM原版,换个AWQ或GPTQ的4bit量化,显存占用能降一半,10并发基本稳了。单卡多副本就别想了,3090的24G跑两个7B副本也容易互相挤爆,先把KV cache的复用率调高更实际。
3090跑7B并发10就炸,说实话这配置瓶颈不在显存大小,而是带宽和KV cache的分配逻辑。你max_num_seqs设256但实际并发才10,vllm会预分配那么多槽位的显存,反而浪费,试着降到32甚至16看看,同时把gpu_memory_utilization调到0.9试试,但别超过0.92否则容易触发碎片化。
另外量化版本可以试AWQ或GPTQ的4bit,显存占用直接砍半,但7B模型量化后精度损失在对话场景其实能接受,尤其你只是内部工具。不过3090的24G跑7B fp16理论够,OOM更可能是vllm的continuous batching没生效,你确认一下是不是在生成阶段爆的,如果prompt特别长,那KV cache占比会暴涨。
还有一个骚操作,把max_model_len从默认的32K砍到8K或4K,很多人忽略这个,7B模型实际用不到那么长上下文,砍完显存立刻宽松很多。拆多副本不如单卡调优,3090本身带宽有限,多副本反而互相抢显存。
最后建议开个swap或者zram做兜底,虽然慢但至少不直接Kill进程,能争取时间看日志定位是哪个环节炸的。你用的vllm版本是0.6还是0.7?新版本对KV cache的复用优化差挺多,记得升级。
3090显存就那么大,max_num_seqs调低点试试,256太激进了,或者直接上AWQ量化。
max_num_seqs设太高了,3090显存扛不住,调成64试试,顺便开下--enable-chunked-prefill。
3090跑7B还得量化,AWQ或GPTQ直接安排,fp16并发必炸。
说实话你这配置我熟,3090 24G跑7B本来就很吃紧,max_num_seqs=256基本是给A100那种80G显存准备的,在24G卡上这个值设这么高等于把显存预算全预留给KV cache了,实际并发一上来直接炸。我建议先把max_num_seqs砍到32或者16,然后gpu_memory_utilization降到0.7左右,给PyTorch和CUDA context留点余量,不然光框架开销就能吃掉几个G。另外你确认下是不是vLLM的continuous batching在排队时把所有请求的KV cache都预分配了,这玩意儿在低并发下不明显,一高就露馅。量化确实是个路子,AWQ或者GPTQ的4bit能省一半显存,7B大概能压到6-7G,但3090上跑4bit可能会损失点精度,看你那个内部工具对回答质量要求高不高。还有个土办法,就是拆两个vLLM实例,每个绑定一半显存,前面用nginx或者简单的round-robin负载均衡,虽然单实例并发低但整体吞吐能上去,而且一个崩了另一个还能顶。最后提醒下,检查下是不是OOM killer把进程杀了,有时候不是显存爆而是CPU内存被swap拖死,vLLM的tokenizer和scheduler也会吃内存。
3090跑7B并发10个确实极限,试试把max_num_seqs砍到32或者直接上AWQ量化,能省不少显存。
max_num_seqs开256太激进了,3090才24G,改成64再配个--enable-prefix-caching试试。
说实话max_num_seqs=256在3090上跑7B有点过于激进了,这参数不是越大越好,它直接影响KV cache的预分配,你并发10个请求每个请求的序列长度稍微涨一点,显存直接就爆了。我之前用4090部署类似模型时,max_num_seqs调到64,并发压到20左右反而稳得很,OOM基本都是显存碎片和预分配冲突,不是单纯算力不够。
另外gpu_memory_utilization=0.8看着合理,但VLLM实际会按这个比例把显存全占住,包括预留的上下文空间,你不如先降到0.7,给CUDA和PyTorch留点喘息余地,再配合--enforce-eager关掉CUDA graph,虽然慢一点但能省不少显存。量化版本建议直接上AWQ 4bit,7B模型在3090上能省出将近一半显存,而且精度损失对对话场景几乎无感,比你拆多个副本划算多了。
还有个小坑,你是不是用了默认的--max-model-len?如果设到4096以上,每个序列的KV cache会吃掉大量显存,建议显式改成2048,大多数内部工具对话根本用不到那么长上下文。最后实在不行就在应用层加个信号量,把并发控制在8以内,比折腾底层配置更省事,毕竟3090的24G物理上限摆在那。
3090跑7B并发10就炸很正常,max_num_seqs调太高反而容易爆,先砍到64试试。
3090跑7B并发10个就OOM,大概率不是vllm配置问题,是显存带宽和KV cache的物理瓶颈。max_num_seqs调太高反而会加剧显存碎片,试试降到32-64,同时把gpu_memory_utilization降到0.7以下留点余量。量化肯定要上,AWQ或GPTQ的4bit能省一半多显存,但注意vllm对量化格式支持有差异,实测AWQ兼容性更稳。如果还顶不住,不如直接上2个副本各占半张卡,用nginx分流,比单卡硬扛灵活多了。
3090跑7B并发10个就OOM挺正常的,你这max_num_seqs开太大了,显存全被预分配出去了,实际并发根本用不到256,调成32或者64试试。另外量化版肯定要上,AWQ或者GPTQ能把显存占用砍一半,你这情况大概率能多扛几个并发。要是还不行就拆两个副本吧,反正VLLM多实例也不难搞,总比老被kill强。
3090跑7B还开256序列,显存肯定爆,max_num_seqs调到32试试,再不行上AWQ量化。
3090就24G显存,跑7B满血版本来回放KV cache本来就紧,你这max_num_seqs=256设得有点太激进了,实际并发10个就OOM说明显存分配全被预留给序列了,试试砍到64或者32,顺便把--enable-prefix-caching打开能省不少重复计算。实在不行上个AWQ或GPTQ的4bit量化,画质损失一点但并发能翻倍,别拆多副本,3090单卡拆了反而浪费显存。
另外你gpu_memory_utilization调到0.8可能还留了20%给其他东西,但vllm默认会预分配整个KV cache池,建议直接干到0.95,然后--max-model-len能调小就调小,比如4096或2048,内部工具够用就行。我之前用4090跑同款模型,这套参数改完从6并发稳到20并发不崩,OOM基本就是显存预算没算明白,不是加载方式问题。
一张3090跑7B还开max_num_seqs=256确实有点激进,这参数不是越大越好,显存会按上限预分配KV cache的。建议先砍到32或者64试试,同时把gpu_memory_utilization降到0.7以下,留点余量给碎片和峰值。另外可以看看是不是paged attention没生效,VLLM版本太老的话对Qwen2.5支持也不好,升到最新版往往有惊喜。量化的话AWQ 4bit能省不少显存,但你这场景先调参大概率能解决,别急着换模型。
3090跑7B并发10个就OOM,大概率不是max_num_seqs的问题,你gpu_memory_utilization调到0.8反而可能让KV cache预留不够,试试降到0.7或者直接看vllm日志里的显存分配详情。另外你用的是不是默认的float16?换成AWQ或GPTQ量化,显存占用能少三分之一,并发能翻倍。还有个小坑,确认下是不是每个请求都开了长上下文,max_model_len设太大会吃掉大量显存,改成2048或4096试试。实在不行就开两个vllm实例各占一半显存,用nginx分流,比单实例硬扛稳得多。
3090就24G显存,跑7B满血版本来回显存开销就不小,max_num_seqs=256这配置在单卡上基本是摆设,并发10个时KV cache直接炸了。建议先把max_num_seqs降到32甚至16,同时把gpu_memory_utilization降到0.7以下,给显存留点缓冲。另外可以试试AWQ或GPTQ的4bit量化版,显存占用能砍一半,3090上跑起来余量会大很多。
3090就24G显存,跑7B满血版本来回显存开销就吃紧,max_num_seqs=256这个值设得太激进了,并发10个请求时KV cache直接爆掉。建议先把max_num_seqs降到32或者更小,同时看看是不是prompt长度都偏长,长上下文对显存压力翻倍。另外量化还是有必要的,AWQ或者GPTQ能省不少,7B量化后画质损失基本无感,但并发能力提升明显。我自己的经验是单卡3090跑7B,量化版+限制并发到16左右很稳,你可以试试先调低max_num_seqs看能不能撑住,再决定要不要上量化。
3090跑7B并发10就OOM挺正常的,24G显存扣掉模型权重和KV cache其实剩不了多少。你试试把max_num_seqs降到32甚至16,gpu_memory_utilization拉到0.9,再开enable_chunked_prefill能缓解不少。真要扛并发还是得上AWQ或者GPTQ量化,4bit能省一半显存,精度损失在对话场景基本感知不到。预算有限就别想着多副本了,一张卡塞两个量化实例还不如单实例调优来得实在。
3090跑7B并发10就OOM,瓶颈基本就是KV cache,不是权重本身。max_num_seqs=256太激进了,先砍到32或64,再把max_model_len按你实际对话长度往下压,别默认开满。gpu_memory_utilization 0.8在3090上可以提到0.9,但前提是留够系统显存。实在不行就上AWQ 4bit,单卡扛十几个并发会稳很多,代价是质量略降一点。
max_num_seqs降到32试试,256对3090太贪了,显存根本扛不住。