最近在搞一个内部工具的对话接口,用VLLM部署了Qwen2.5 7B,单次调用挺流畅的,但并发一上到10个请求左右就开始频繁OOM,直接Kill进程。我看配置里设了max_num_seqs=256,gpu_memory_utilization也调到了0.8,还是顶不住。是不是我模型加载方式不对?还是需要换量化版本?或者得拆成多个副本?求有经验的老哥指点一下,预算有限暂时上不了A100,就一张3090。
VLLM部署Qwen2.5 7B,并发一高就OOM怎么办?
全部回复
共 169 条3090跑7B并发10个OOM挺正常的,显存就24G,模型权重加KV Cache很容易爆。先把max_num_seqs降到32左右试试,256太激进了,gpu_memory_utilization可以拉到0.9但得盯着别把系统卡死。量化确实能救急,AWQ或GPTQ版本显存能省不少,精度损失在对话场景基本感知不到。另外看看是不是开了enable_prefix_caching或者chunked prefill,这俩对长上下文并发帮助挺大的。
3090跑7B并发10确实悬,试试把gpu_memory_utilization降到0.7再开enable_prefix_caching,或者直接上AWQ量化版省显存。
3090跑7B并发10个确实悬,试试降到0.85并开量化,再不行就限流吧。
3090 24G跑7B的FP16本身就有点紧,模型权重就占掉15G左右,剩下给KV cache的没多少了。max_num_seqs=256太激进了,你试试降到32或者64,gpu_memory_utilization拉到0.9,另外加个--max-model-len限制下上下文长度。实在不行上AWQ或者GPTQ量化,显存能省一半,并发翻倍问题不大。
3090跑7B其实挺吃力的,关键瓶颈在KV cache。你把max_num_seqs设256太大了,单卡24G显存根本扛不住这么多序列的缓存,建议降到16-32试试。gpu_memory_utilization 0.8也可以再往上提到0.9,留一点给CUDA就行。另外强烈建议上AWQ或GPTQ的4bit量化版,显存能省一半,并发10个应该问题不大。实在不行就限制下并发数,加个队列排队,别硬扛。
单张3090跑7B并发10路OOM其实挺常见的,24G显存要装权重、KV cache还有激活值,7B的fp16权重就快15G了,剩下那点空间分给KV cache根本不够几路并发吃。max_num_seqs=256是上限不是预留,真正吃显存的是实际并发的序列长度乘以层数乘以head维度,你请求一多KV cache直接指数级涨。建议先把gpu_memory_utilization拉到0.9甚至0.92试试,vllm会自己算剩余空间给KV cache,0.8有点保守了。另外看下你的max_model_len是不是默认拉满了,Qwen2.5支持32K,如果没改的话vllm会按模型最大长度预分配block,那显存直接被吃干。可以显式设成4096或8192,配合enable_prefix_caching能省不少。量化的话AWQ或GPTQ 4bit确实能把权重压到5G左右,但精度会掉一点,内部工具对话够用了。实在不行就限制并发数,加个信号量卡在6-8路,比OOM重启强。
3090跑7B其实挺吃紧的,0.8的显存利用率再叠加KV cache,10并发OOM不奇怪。max_num_seqs=256是上限,不是让你真跑满,实际并发受显存限制。建议先把gpu_memory_utilization降到0.9但max_model_len压到2048,再开enable_chunked_prefill,能明显缓解。不行就上AWQ量化,3090跑7B的AWQ版本并发20+问题不大。
刚入门,这个对我帮助很大。
max_num_seqs调小点试试,3090显存就那么大,256个序列预分配直接把显存吃满了。