最近在折腾一个RAG+工具调用的Agent项目,用的Qwen2.5-7B-Instruct,量化到4bit后单卡3090勉强能跑。但问题是加上embedding模型和向量库,显存直接爆了,只能不停清缓存。我看很多人说用vLLM部署能省显存,但我试了下,配合LangChain的Agent时总报兼容性问题,要么是tool calling格式不对,要么是流式输出卡住。想请教下各位,本地部署大模型做Agent到底怎么选推理框架?是继续用transformers硬扛,还是换更小的模型(比如3B)?另外,有没有办法让embedding模型和LLM共享显存而不互相干扰?求具体可行的方案,谢谢!
部署本地大模型做Agent,显存总是不够用,大佬们有什么优化思路吗?
全部回复
共 48 条试试把embedding换bge-small,显存占用直接砍半,和LLM共用也没那么挤。
或者干脆用SGLang替代vLLM,对LangChain的tool calling兼容性好很多,流式也不卡。
说实话你这个配置我太理解了,3090看着24G挺大,真跑起RAG+Agent就是处处捉襟见肘。vLLM那个兼容性问题我踩过一样的坑,尤其是tool calling的格式,它跟LangChain的预期经常对不上,建议你试试把工具调用逻辑从LangChain里拆出来,直接用Qwen的官方API格式写,绕开那层封装反而稳。至于embedding和LLM共享显存,我现在的做法是把embedding模型也量化到8bit,然后单独放一个进程用ONNX跑,跟LLM的显存池隔离开,虽然慢点但至少不互相踢缓存。另外你提到换3B,真别急着换,7B量化后能力下降不算太狠,但3B做工具调用经常理解错参数,最后调bug的时间够你优化十次显存了。还有个土办法,就是给embedding模型设个定时任务,不让它在Agent循环里反复加载,只在第一次初始化时载入,后续查询直接走内存副本,能省下一大块常驻显存。你要是实在嫌麻烦,可以试试SGLang,它最近对工具调用的支持比vLLM好不少,而且有自动显存碎片整理,我换了之后至少没再爆过。
显存爆这个事儿太真实了,我之前也是被卡得没脾气。你可以试试把embedding模型换小一点,比如bge-small,或者干脆用API来跑向量化,把显存全留给LLM。另外vLLM配LangChain确实容易踩坑,建议直接用vLLM的OpenAI兼容接口,让LangChain走标准API调用,tool calling格式反而更稳。
实话实说,3090跑7B量化+Agent确实有点极限,我建议你别死磕transformers了,vLLM其实可以绕开LangChain的兼容坑,直接自己写个tool calling的解析层,也就几十行代码的事。embedding模型的话,试试把bge-small和LLM放同一个显存池里,用显存碎片管理工具或者干脆把向量库挪到内存里,检索慢点但至少不爆卡。另外3B模型真不是降级,qwen3-4b或者phi-4做工具调用反而更稳,显存剩下来给上下文和向量库,整体体验可能还更好。
试试把embedding换轻量版或者直接塞进GPU显存里用unified memory,3B模型配Agent其实够用。
vLLM那套确实跟LangChain的agent兼容性有点折磨人,我之前也被tool calling的格式坑过,后来直接换成了SGLang,配合OpenAI兼容接口反而稳很多。显存不够的话,embedding模型可以试试用CPU跑,或者干脆换个更小的bge-small,反正检索质量差距也没那么大。另外建议把向量库的mmap模式开起来,能省不少显存占用,但要注意磁盘IO别成瓶颈。
试试把embedding模型也量化成int8,或者直接换bge-small这种轻量款,能省下不少显存。vLLM对LangChain兼容性确实头疼,我后来是用FastAPI自己包了一层OpenAI兼容接口,tool calling直接走原生格式,稳多了。3B模型做简单工具调用其实够用,关键看你的RAG检索质量,别太迷信7B。共享显存的话,可以给LLM和embedding分别设显存上限,用环境变量控制,别让它们抢资源。
显存不够就上SGLang吧,tool calling支持比vLLM稳,3B模型配量化embedding其实够用。