最近在搞一个内部工具的对话接口,用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其实瓶颈不在显存容量,而是带宽和KV cache的分配策略。max_num_seqs=256设太大了,实际并发10个请求根本用不到这么多槽位,反而让每个seq的KV cache预留空间膨胀,建议先压到32试试。另外gpu_memory_utilization=0.8对7B来说偏保守,可以试试0.92,配合--enable-prefix-caching能省不少重复计算。如果还不行就直接上AWQ量化,4bit下显存占用直接减半,吞吐能翻倍,3090跑起来很轻松。
3090就24G显存,跑7B还要硬顶256的max_num_seqs,OOM太正常了。你这配置其实等于把KV cache空间全占了,建议先砍到32或者64试试,然后把gpu_memory_utilization降到0.7,留点余量给碎片。真要扛10并发,直接上AWQ或者GPTQ的4bit量化,显存占用能少一半,速度影响不大。另外可以看看是不是prompt太长,把max_model_len调低点也能省不少显存。
3090跑7B并发10个确实勉强,试试awq量化加max_num_seqs调低到64,显存碎片能缓解不少。
max_num_seqs设256太激进了,7B模型KV cache撑不住,换GPTQ量化或者直接开两个实例分摊压力吧。
3090跑7B并发10个就OOM,大概率不是max_num_seqs的问题,而是KV cache爆了。你试试把gpu_memory_utilization降到0.6,同时显存里手动预留一点给推理,或者开下--enable-prefix-caching,能省不少显存。
另外Qwen2.5 7B的AWQ量化版在3090上兼容性还不错,可以试下4bit,显存占用直接砍半,精度损失对内部工具基本无感。不过注意vllm对量化格式有版本要求,别装太旧的。
如果还不行,就拆两个实例,每个并发5,用nginx轮询,实测比单实例硬扛稳得多。3090的24G其实挺尴尬,7B满血确实吃紧,别太指望一张卡能高并发。
max_num_seqs调太高了,3090显存扛不住,降到32试试,再上AWQ量化稳得很。
你这配置明显是给多卡写的,单卡3090老老实实开8并发,量化加低延迟模型,不然换啥都白搭。
3090跑7B并发10个就崩,大概率不是显存总量问题,是KV cache峰值爆了。max_num_seqs=256这个值在7B上太激进了,先砍到32试试,同时把gpu_memory_utilization降到0.7,给推理留点冗余。另外官方AWQ量化版能省一半显存,实测并发能翻倍,但得确认下你用的vllm版本支持不支持。实在不行就开两个vllm实例各绑一半显存,前面挂个负载均衡,比单实例硬扛稳得多。
3090也就24G显存,Qwen2.5 7B的KV cache吃得很凶,max_num_seqs=256这数字设太大了,实际并发10个就已经触顶,建议先砍到32试试。OOM基本都是显存碎片化或者KV cache预分配超了,不是模型加载方式的问题。量化可以上AWQ或者GPTQ,4bit能把显存占用压掉一半,但并发瓶颈还是在KV cache上。预算有限就别想多副本了,单卡老老实实把max_num_seqs调小,再配合vllm的continuous batching,10并发应该能稳。
说实话max_num_seqs=256在3090上跑7B本身就有点激进,这个值不是设得越高越好,它直接影响KV cache的显存预留。24G显存跑Qwen2.5 7B,建议先把max_num_seqs压到32或者64试试,同时把gpu_memory_utilization降到0.7左右,给torch和CUDA context留点余量,不然显存碎片化会特别严重。另外你确认下是不是用了--enable-prefix-caching,这个选项在某些版本下会额外吃显存,关了可能好很多。
如果压参数还是不行,那换AWQ或GPTQ的4bit量化是性价比最高的方案,7B量化后显存占用能砍一半,而且vLLM对量化支持很成熟,精度损失在对话场景基本感知不到。不过3090跑量化版要注意别用--dtype=float16,直接让它默认走int4权重,否则反而可能更慢。至于拆多个副本,3090单卡拆两副本意义不大,显存带宽会成瓶颈,不如单卡把并发调低点,用--max-model-len控制到2048或3072,能省不少KV cache。
还有个容易忽略的点,OOM不一定是显存爆了,也可能是CPU内存不够,vLLM的tokenizer和调度器在并发高时会占不少RAM,你看下系统日志里有没有OutOfMemory的kernel kill记录,如果是CPU内存问题,加个swap或限制--swap-space反而立竿见影。最后建议你开个--disable-log-stats,这玩意儿在高并发时也会产生额外显存开销,虽然不大但有时候就差那几百MB。
3090显存就24G,跑7B满血版本来回空间就紧,max_num_seqs设256太激进了,这参数默认16-32都够用,并发10直接堆到256显存肯定爆。建议先降到32试试,顺便把gpu_memory_utilization调到0.9,反正vllm会动态调度,别让KV cache太贪。另外可以试试AWQ或GPTQ的4bit量化,7B量化后显存占用能砍一半,精度损失对这个场景基本无感。多副本就别想了,3090单卡跑两个实例反而互相抢显存,不如先把并发和显存调优。
3090也就24G显存,Qwen2.5 7B的fp16权重大概15G,你留了0.8的利用率也就19G左右,KV cache空间其实很紧。max_num_seqs=256这个值在7B模型上太激进了,vllm会按这个数预分配KV cache,显存直接爆掉,就算不OOM也会疯狂触发显存交换。建议先把max_num_seqs降到32或者64试一下,同时把gpu_memory_utilization调到0.9,但前提是你要保证batch别超过实际能承受的范围。
另外3090的带宽和算力跑7B并发本来就不算宽裕,10个并发其实已经接近瓶颈了,不是单纯调参能解决的。你试试用AWQ或者GPTQ的4bit量化版本,显存占用直接砍一半,KV cache能多出不少空间,而且vllm对量化支持得挺成熟的,效果损失在内部工具上基本感知不到。还有个小坑,vllm的continuous batching对长上下文特别吃显存,你如果对话历史很长,得限制max_model_len,别默认拉到32K,设个8K或者4K能省一大块。
如果量化之后还是顶不住,那就别死磕单卡,拆两个vllm实例,每个挂4个并发,用nginx或者LB转发,比单卡硬扛稳得多。3090本身就不是为高并发设计的,实在不行只能降级到Qwen2.5 3B或者用蒸馏小模型顶一下,内部工具延迟敏感度低的话,体验差距没那么大。你先按这个顺序调吧,大概率是max_num_seqs的问题,这个参数很多人第一次用都会踩坑。
3090就16G显存,跑7B还得塞KV cache,10并发OOM太正常了。max_num_seqs调低点,先压到32试试,这参数不是越高越好,反而容易爆显存。另外gpu_memory_utilization提到0.9,但得留点给CUDA context。量化建议直接上AWQ或GPTQ的4bit,显存占用能少三分之一,精度损失对这个场景基本无感。真要扛并发,还不如拆两个副本各占8G,比硬撑一个实例稳得多。
3090就16G显存,跑7B满血版本来回拆kv cache就很吃紧,max_num_seqs设256反而容易把显存一次性撑爆,先降到32试试,另外gpu_memory_utilization别硬顶0.8,给torch和CUDA context留点余量。之前我跑同款模型是把max_model_len砍到4096,并发从8提到20才稳,你可以先拿这个组合压测一轮。真要上高并发,不如直接AWQ量化到4bit,显存占用能砍一半,3090跑起来余量就大很多了。
3090就16G显存,跑7B的KV cache确实吃紧,max_num_seqs开256等于给显存挖坑,实际并发10个就炸很正常。建议先把max_num_seqs降到32左右,gpu_memory_utilization提到0.9试试,另外开一下--enable-prefix-caching能省不少重复计算。如果还不行就上AWQ量化,4bit下显存占用能砍一半,速度和精度损失都还能接受。别急着拆多副本,3090单卡搞多实例反而容易撞显存,先调参再说。
3090也就24G显存,跑7B的KV cache本来就很吃紧,max_num_seqs=256这个值设得太激进了,并发10个请求时显存直接爆很正常。建议先把max_num_seqs降到32或64试试,同时把gpu_memory_utilization调到0.9,别给其他进程留太多空间。如果还不行就上AWQ或GPTQ的4bit量化,7B量化后显存占用能砍一半,速度损失也不大。单卡多副本就别想了,3090显存不够折腾,不如直接砍并发上限然后加个请求队列。
3090就24G显存,跑7B原版再加长上下文和KV cache,10并发确实容易爆。max_num_seqs=256这个值设太大了,实际并发10根本用不到,调成32或者64试试,能省不少显存。另外gpu_memory_utilization别拉到0.8,留点给CUDA context和碎片,0.7左右更稳。量化的话AWQ 4bit效果挺明显,精度损失不大,显存能省一半,你这种情况最划算。实在不行就拆两个副本,每个管5个并发,反正3090跑两个7B量化版也够。
max_num_seqs调太高了,3090显存扛不住,改成32试试,再上量化版AWQ能稳很多。
3090上跑7B还开256的max_num_seqs确实有点猛了,这数字是给A100那类大显存准备的。你可以先降到32或者64试试,OOM大概率是预分配显存和实际KV cache峰值对不上导致的。另外gpu_memory_utilization设0.8其实有点保守,3090的话可以试到0.92,但得留点给CUDA context和碎片。量化倒是可以救急,AWQ 4bit能把显存占用砍一半,不过小batch下速度会略降。实在不行就拆两个副本各占一半显存,配合负载均衡也能顶住并发。
3090就24G显存,跑7B本来就很吃紧,max_num_seqs设256太大了,KV cache直接爆炸,建议先降到32或者64试试。另外gpu_memory_utilization 0.8其实偏保守,可以试着拉到0.95,但得留点显存给CUDA context。量化确实是个路子,AWQ或者GPTQ的4bit能省一半多显存,首token延迟会稍微涨点但并发能稳不少。还有个小技巧,把--swap-space设成0,强制走GPU不用CPU offload,不然内存碎片一多照样OOM。
3090显存就那么大,max_num_seqs调低到32试试,再不行就上AWQ量化,保准稳。
3090就24G显存,跑7B满血版本来就紧张,max_num_seqs=256这配置对单卡来说太激进了,实际并发10个请求时KV cache直接爆掉很正常。建议先看下vllm日志里具体是哪块显存超了,大概率是KV cache分配的问题,可以把max_num_seqs降到32-64试试,同时开下enable_prefix_caching能省不少显存。如果还不行就换AWQ或GPTQ的4bit量化版,7B量化后显存占用能砍一半,3090跑起来会从容很多,精度损失对这种内部工具影响不大。