最近在折腾AI Agent,后端用vLLM部署了Qwen2.5-7B,本地测试单轮对话没问题。但一旦接入多用户并发(大概10个左右),服务就频繁报OOM,GPU显存直接爆了。我试过调低max_num_seqs和gpu_memory_utilization,但还是撑不住。是不是vLLM的paged attention在Agent场景下频繁切换上下文时反而更吃显存?还是说7B模型本身就不适合做多轮Agent?有没有大佬能给个部署建议,比如用量化或者换框架?先谢谢了!
用vLLM部署Qwen2.5做Agent,并发一高就OOM怎么办?
全部回复
共 169 条这问题我也踩过坑,vLLM在Agent场景下每个请求的context长度差异太大,预分配显存浪费得厉害,10并发确实容易爆。你可以试试把Qwen2.5-7B用AWQ量化到4bit,显存占用能降一半多,或者干脆换更轻量的Qwen2.5-3B做agent,效果差不了太多。另外调度上把max_num_seqs降到4,再加个简单的请求排队,会比硬扛并发稳很多。
量化到4bit试试,显存能省一半,我这边8并发稳得住。7B跑Agent确实吃紧,不如上Qwen2.5-14B量化。
vLLM的paged attention在长上下文切换时确实会放大显存碎片,尤其Agent场景下多轮历史+工具调用会让KV cache膨胀。7B做多轮并发本来就吃紧,建议先用AWQ或GPTQ量化到4bit,能省一半显存,再把max_model_len限制到4k试试。之前我遇到过类似问题,把连续推理请求拆成单轮无状态调用,配合Redis存会话历史,并发就稳多了。另外也可以看看SGLang,它的RadixAttention对这类场景管理更高效。
这问题我上周刚踩过坑,7B做多轮Agent确实容易爆,主要是每轮request的context长度差异太大,paged attention的显存碎片化反而更严重。我最后是切到AWQ 4bit量化+把max_model_len砍到4096才稳住,并发能撑到15左右。另外你可以试试把系统提示词抽出来共用,别每次都塞进完整历史里。要是还不行就换SGLang试试,它对这种长上下文切换的显存管理比vLLM激进一些。
看到你这个情况我第一反应是显存分配策略的问题,不是7B模型扛不住,而是vLLM默认会为每个序列预留完整的KV cache空间,Agent场景下工具调用和上下文切换会生成大量短序列,反而把预留的缓存撑满了。你可以试试把--max-model-len调低到4096或2048,同时把--max-num-batched-tokens设成一个较小的值,这样能强制vLLM更频繁地释放空闲块,我这边跑类似场景时这个组合挺管用的。另外,量化确实值得考虑,AWQ或GPTQ的4bit版本在显存占用上能砍掉将近一半,而且对Agent这种对单token延迟不敏感的任务来说精度损失几乎无感。不过我有点好奇,你确认过OOM是显存真满了还是vLLM的显存碎片化问题吗?如果方便的话可以看下nvidia-smi和vLLM日志里的显存统计,有时候swap到CPU内存反而能救急。换框架的话,如果你不排斥换推理后端,可以试试SGLang,它的RadixAttention在处理这类多前缀共享的请求时效率比vLLM高不少,我移过去之后并发数直接翻了倍。最后一个建议,如果你一定要用vLLM,可以考虑开--enable-chunked-prefill,配合前缀缓存能减少重复计算,至少在我这边是把OOM频率降到了原来的十分之一以下。
这场景我踩过,先试试AWQ量化到4bit,能压不少显存,同时把max_num_seqs砍到4左右。
换个思路,7B做agent确实勉强,不如直接上Qwen2.5-14B量化版,吞吐反而更稳。
Agent多轮场景KV cache涨得飞快,试试开enable_prefix_caching,或者直接上AWQ量化能省不少显存。
10个并发就OOM有点离谱,先看看是不是KV cache没限制住,试试加--max-model-len压一下上下文长度。
10个并发就OOM有点离谱了,7B的模型FP16也就占14G左右,你显卡是多大的?Agent场景确实有个坑,就是每轮对话的prompt会越来越长,历史全塞进去的话KV cache涨得飞快。建议把max_model_len调小一点,别默认开太大,另外开enable_prefix_caching能省不少重复计算的显存。量化的话AWQ或GPTQ跑7B基本不掉点,显存能压到一半以下,可以试试。