最近在搞一个内部工具的对话接口,用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个确实有点极限。max_num_seqs设256其实太高了,7B模型单卡显存就那么点,建议先降到32或64试试,很多时候OOM是显存碎片化导致的。另外gpu_memory_utilization=0.8其实可以再拉高到0.92甚至0.95,只要不跑满就没问题,VLLM自己有内存管理。如果还不行,强烈建议换量化版本,Qwen2.5官方支持AWQ或者GPTQ量化,4bit下显存占用直接减半,而且推理速度损失很小,我实测8并发稳得很。至于拆多个副本,除非你打算用CPU offload或者多进程调度,否则单卡拆副本反而会加剧显存竞争,不推荐。还有个细节:检查一下你的prefill和decode阶段的batch策略,VLLM默认的调度有时会预分配过多显存,可以调小max_model_len或者开启enable_prefix_caching来减少峰值占用。总之先试量化,成本最低,效果最明显。
3090显存24G,跑7B全精度本来就很极限,10并发OOM太正常了。建议先试试AWQ或GPTQ量化到4bit,显存占用能降一半以上,我这边8B模型量化后20并发都稳得住。max_num_seqs别设太高,这参数不是越大越好,调成64或者128试试,gpu_memory_utilization可以再拉到0.9,同时加个--enforce-eager选项跳过图优化也能省点显存。
max_num_seqs改小到32试试,3090显存扛不住那么大并行,量化到int4也能省不少。
max_num_seqs调太高了,3090扛不住,改成64试试,顺便开个量化。
max_num_seqs调低到64试试,3090显存扛不住256的并行。
max_num_seqs设256对于7B模型来说确实太高了,显存会被预分配的KV Cache直接撑爆,建议先降到32试试。另外gpu_memory_utilization可以保守一点调到0.75,给模型推理留点余量。如果还是扛不住,可以考虑切成AWQ或GPTQ量化版,4bit下显存占用能少一半,单张3090跑并发会稳很多。
max_num_seqs设256确实太乐观了,7B模型在3090上显存就24G,并发10个左右建议先降到32或64试试,gpu_memory_utilization可以提到0.9。另外量化版本肯定能省不少显存,AWQ或GPTQ都行,推理速度影响也不大,我自己的项目就是这么解决的。如果还不行,考虑用vllm的分布式推理,一张卡部署两个worker实例,每个分一半并发,比单卡硬扛稳得多。
你这情况我遇到过类似的,3090跑7B其实挺吃紧的,max_num_seqs设256基本是给自己挖坑,这个数值在单卡上根本跑不满,反而会预分配大量显存导致OOM。建议先降到32或者64试试,gpu_memory_utilization其实可以再激进点调到0.95,VLLM本身有显存回收机制,0.8有点太保守了。另外量化版本确实值得试一下,AWQ或者GPTQ的4bit模型显存占用能降一半,推理速度损失不大,我换完之后并发从5个直接提到15个才炸。还有个小技巧是加上--enforce-eager参数,关掉CUDA图优化,虽然单次推理慢一点但能省不少显存碎片。如果这些都不行,那就只能考虑多卡或者上量化+动态批处理了,3090单卡跑7B并发10个确实到瓶颈了。
一张3090扛10并发确实有点勉强,7B模型光显存加载就快15G了,max_num_seqs设256反而会让调度更激进。建议先把gpu_memory_utilization降到0.7,同时把max_num_seqs砍到64试试,让VLLM多走CPU offload。另外可以试试AWQ量化版,4bit能把单卡并发拉到20左右,3090的显存带宽其实够用。如果还不行就拆两个副本用Ray Serve做负载均衡,虽然慢点但至少不会炸。
max_num_seqs设256太激进了,7B模型单卡3090实际能并行处理8-10个就不错了,调低到4-6试试。另外gpu_memory_utilization可以拉到0.9,但最好同时开enable_prefix_caching减少重复计算。如果还爆,直接上AWQ 4bit量化,显存占用能降一半,效果几乎无损。
max_num_seqs设256确实太高了,3090显存才24G,7B模型用FP16加载本身就快占满14G左右,实际留给KV cache的空间并不多。建议先降到32或者64试试,然后gpu_memory_utilization别超过0.85,不然容易触发碎片化OOM。另外也可以考虑用AWQ或GPTQ量化到4bit,显存占用能压到8-9G,并发能力会好很多。
我之前也遇到过类似问题,后来换了方案。
max_num_seqs调低到32试试,3090显存扛不住256个并行。
max_num_seqs设256太高了,3090显存扛不住那么多并行序列,建议先降到32或64试试。gpu_memory_utilization可以提到0.95,反正就一个服务在跑。另外Qwen2.5 7B的FP16大概占14G,你还可以开4bit量化,显存直接砍半,并发能翻倍。
试试把max_num_seqs降到64或32,3090显存扛不住256的。
3090显存扛10并发确实吃力,试试把max_num_seqs降到32,再开下--enable-prefix-caching。
max_num_seqs设256确实太高了,3090显存就24G,实际跑7B模型建议砍到8-12试试,不然显存分片直接炸。gpu_memory_utilization可以再大胆点上到0.92,我这么调之后并发能稳在15左右。另外量化还是建议做的,AWQ或GPTQ能省出将近一半显存,预算有限靠这个撑并发最实在。
max_num_seqs调低到64试试,3090扛不住256并发,量化成4bit能省一半显存。
一张3090跑7B并发10个确实容易爆,max_num_seqs设256太高了,这参数是给A100那种大显存用的,建议直接降到32或64试试。另外gpu_memory_utilization0.8还是偏保守,可以拉到0.95,注意留点给KV cache就行。要是还不行就上4bit量化,AWQ或者GPTQ都行,vLLM原生支持,显存能省一半多,并发稳很多。单卡搞多副本意义不大,反而增加调度开销,先把单实例调优再考虑分布式。
3090显存24G跑7B模型并发高确实容易爆,你max_num_seqs设256太大了,建议先降到32或者64试试,VLLM默认prefill和decode会吃不少显存。另外gpu_memory_utilization调到0.9也可以,但记得关掉--enforce-eager用PagedAttention能省点。实在不行就上AWQ 4bit量化,单卡并发能翻一倍还不怎么掉效果。