最近在折腾一个RAG+Agent的小项目,用的Llama-3-8B-Instruct,量化到4bit,按理说显存应该够,但跑起来之后发现占用直接飙到12G+。我显存是16G,单开一个模型感觉还行,但一旦加上embedding模型、重排序模型,还有向量数据库在后台跑,直接爆显存了。我看网上很多人说8B量化之后6G就能跑,为什么我实际体验差这么多?是我加载方式有问题,还是说上下文长度、KV cache这些设置没调对?另外,如果要同时跑多个小模型做Agent,有没有什么实践上的优化方案,比如共享显存、流式卸载之类的?求有经验的大佬指点一下,别让我再硬怼了。
部署本地大模型做Agent,显存占用比想象的高太多,正常吗?
全部回复
共 47 条KV cache和上下文长度很吃显存,网上6G是短上下文跑推理,Agent多轮对话完全两码事。
KV cache 和上下文长度真是隐形杀手,我跑 4bit 的 8B 时把 max_model_len 从 8k 降到 4k,显存立马少了快 2G。那些说 6G 能跑的,基本是空载或者短上下文,真跑起 agent 多轮对话根本不够看。embedding 和 rerank 模型别硬塞同一张卡,换个小点的或者走 CPU,不然抢显存抢到怀疑人生。
16G显存跑8B的4bit模型还要带embedding和reranker,确实容易爆。网上说的6G能跑一般是空载或者短上下文,你真跑Agent的话KV cache随对话涨得很快,长上下文直接吃掉好几G。建议限制max_model_len,再把embedding和reranker换成小一点的或者走CPU,向量库别常驻显存。多个小模型可以试试vLLM的sleep模式或者llama.cpp的mmap,能省不少。
12G+太正常了,网上说的6G基本是空载加极短上下文的理想值。KV cache随上下文线性涨,Agent场景动不动就塞几K token,这块吃掉好几个G。embedding和reranker虽然小,但同时驻留显存就叠加了,vLLM的gpu_memory_utilization也得留余量。可以试试把embedding和reranker丢CPU,或者用llama.cpp的mmap加分层卸载,多模型轮换加载比硬塞一起跑更稳。
12G其实挺正常的,网上那些6G跑8B多半是短上下文加没算KV cache。你上下文一拉长、并发一上来,光KV cache就能吃掉好几G。embedding和rerank模型虽然小,但同时驻留显存就是会互相挤,爆了不奇怪。可以试试把rerank和embedding换成CPU跑或者按需加载,vLLM的gpu_memory_utilization也调低点留余量。多模型场景下想省显存,基本就是量化加卸载加错峰加载这几招,共享显存没那么美好。
写得挺好,建议补充一些性能数据。
刚入门,这个对我帮助很大。