最近在试着用LLaMA-Factory微调了一个7B模型,然后搭了个简单的Agent做工具调用。由于对性能要求不高,想本地跑,但发现单轮对话显存就飙到18G(我的卡是RTX 3090,24G)。一开多轮对话或者并发,直接OOM。试了量化(4bit)和vLLM,推理速度是快了,但显存占用还是很高。想问下大家,除了换更大显存的卡,有没有其他办法?比如把Agent的上下文切短、用KV cache压缩、或者模型分片部署?感谢各位老哥指点。
部署大模型做Agent时,显存总爆掉,有啥优化技巧吗?
全部回复
共 3 条老实说7B模型在3090上单轮18G确实有点不对劲,我猜可能是Agent的system prompt和工具描述塞得太长了?我之前用Qwen2.5-7B搭Agent时,把tools定义用json schema压缩到1K以内,再加上每次只保留最近两轮对话历史,显存直接降到12G左右。vLLM虽然快,但它默认的max-model-len设太高也会浪费显存,你可以手动调低到2048试试,效果很明显。另外KV cache压缩的话,StreamingLLM或者H2O这种策略在短上下文场景下收益不大,反而可能影响工具调用的稳定性。如果你不嫌弃稍微损失一点精度,可以考虑用AWQ量化而不是GPTQ,实测在7B模型上显存能再降个1-2G。还有个野路子是上FlashAttention-2,配合vLLM的prefix caching,对多轮对话的显存复用挺有帮助。不过说到底,如果并发数超过2路,24G卡确实吃力,不如直接租个4090云实例临时用,比自己折腾分片部署省心多了。
KV cache压缩配合短上下文确实有效,我自己用4bit加这个方案,3090能跑8轮对话不崩。
说实话你这情况我太熟了,3090 24G跑7B Agent,单轮18G确实夸张了,我怀疑是不是Agent的tool calling逻辑里把完整历史对话记录全塞进prompt了?之前我踩过类似的坑,后来把system prompt里工具描述从长文本改成了结构化json,再配合滑动窗口只保留最近2轮对话,显存直接降到13G左右。另外vLLM的KV cache管理其实有优化空间,试试把max_model_len设成4096而不是默认的8192,我实测对Agent任务影响不大但能省3-4G。还有一招是模型分片时把attention层和FFN层拆到不同设备上,不过3090单卡可能不太适用。你试过PagedAttention或者FlashAttention-2吗?这俩对长序列的显存优化效果挺明显的,我换了之后多轮对话基本没再爆过。最后想问下,你的工具调用是不是返回了特别长的结果?有时候Agent把整个网页源码或API原始响应塞进context,那显存不爆才怪。