最近在搞一个本地知识库Agent,后端用FastAPI接vLLM部署Qwen2.5-7B-Instruct,前端走流式输出。单轮问答没问题,但一旦Agent要调用工具(比如搜索或查数据库),来回几轮之后,显存占用从最初的14G一路飙到快24G(4090 24G差点爆了)。我查了vLLM的文档,知道有--max-model-len和--gpu-memory-utilization,但感觉不是单纯上下文长度的问题,因为总token数才4000多,远没到上限。是不是Agent场景下多轮tool call会累积隐藏状态?还是我的推理参数(比如max_tokens设置太大)导致prefill反复计算?有没有老哥用vLLM跑Agent的,求个调优思路,或者是不是该换SGLang/TGI?
用vLLM部署Qwen2.5-7B做Agent,多轮对话后显存暴涨正常吗?
全部回复
共 87 条这题我好像也踩过,Agent多轮tool call确实会让显存涨得比普通对话快,不只是token长度的问题。你可以看看是不是每次工具调用都把完整历史(包括工具返回的长文本)重新塞进prefill,vLLM的prefix cache在多轮工具切换时可能命中率不高。我试过把--max-model-len调小到8k,同时把--gpu-memory-utilization设成0.9,然后把每次工具返回内容截断到几百字符,显存曲线就平缓多了。另外max_tokens如果设成512或更高,流式生成时KV cache预留也会变大,建议先降到256试试。
这问题我也踩过坑,vLLM的显存增长其实和KV cache的碎片化关系很大,Agent工具调用时每轮对话结构差异会导致显存预分配策略失效,尤其多轮tool结果拼接后,有些旧的KV块没法及时释放。你把--max-model-len调低到8k试试,再把--gpu-memory-utilization设成0.9,应该能缓解不少。另外max_tokens别给太大,Agent里让工具返回时控制一下长度,不然prefill阶段确实会吃满显存。我这边之前也是4090,后来加了--enable-prefix-caching才稳住的,你可以看下日志里是不是有大量重复前缀的重新计算。
这问题我也踩过坑,vLLM对tool call的显存管理确实有bug,可以试试开prefix caching或者调低max_tokens。
显存涨这么猛确实不正常,你试试把max_tokens调小点,或者开下vllm的prefix caching看看效果?
你这情况我遇到过,大概率是vLLM的prefix caching加上Agent多轮拼接导致的。每次tool call返回后整个对话历史重新prefill,虽然token数不多,但KV cache会按最大序列长度预留,显存就慢慢吃满了。建议先关掉enable_prefix_caching试试,或者把max_num_seqs调小一点。另外检查下是不是每次请求都新开了session没复用,Agent框架很容易踩这个坑。
Agent多轮tool call确实会让KV cache反复累积,试试开--enable-prefix-caching并限制max-num-seqs。
我之前也遇到过类似情况,后来发现是vLLM默认的prefix caching没清,多轮tool call时不同请求的prompt前缀差异大,缓存块越积越多。你可以先试试关掉enable_prefix_caching或者手动调cache清理策略。另外Agent每次工具返回的JSON如果直接拼进context,token增长会比你以为的快很多,最好截断或摘要再喂回去。