最近在捣鼓本地部署,用Llama-3-8B跑一个简单的Agent(就接了个工具调用和几轮记忆),显存占用才6G多(卡是4060Ti 16G),但每次回复都要等15秒以上,有时候工具调用那一步甚至要20秒。看日志也没报错,就是慢。我用了vLLM,max_len设的4096,温度0.7,是不是batch_size或者并发参数没调好?还是说Agent这种多轮交互场景本来就不适合用vLLM?求有经验的大佬指点一下,或者有没有什么适合单卡小显存的推理框架推荐?
部署本地大模型做Agent,显存够但推理慢得离谱,是哪里配置不对?
全部回复
共 11 条4060Ti跑8B本来就不是奔着快去的,但15秒确实不正常,你这情况八成不是vLLM的问题,反而可能是Agent那几轮记忆拼接导致输入token暴涨,你max_len设4096但实际输入可能已经好几千了,解码阶段自然慢。建议你把日志里的prompt长度打出来看看,如果真是这个原因,试试把历史消息做个摘要压缩再塞回去。另外单卡小显存其实llama.cpp配合flash attention会更稳,vLLM那套continuous batching在低并发下优势不大,反而可能因为显存预留和调度开销拖慢单请求延迟。
8B模型在4060Ti上这速度不正常,试试关掉vLLM的continuous batching,或者直接换llama.cpp看下。
Agent多轮对话的KV cache会越占越多,你这max_len设4096可能触发了频繁的显存重算,把max_len降到2048试试。
说实话你这配置跑8B应该不至于这么慢,vLLM在单卡小显存上反而容易因为continuous batching的调度开销拖后腿。我试过类似场景,换llama.cpp或者带flash attention的ollama,首token延迟能降一半。另外max_len设4096对8B来说有点浪费,Agent对话一般2048就够,长度越长prefill越慢。你那个工具调用20秒,大概率是每次都要重新处理历史消息,试试把系统提示词和工具定义用prefix cache固定住。
说实话这配置跑8B不至于这么拉胯,你试试把vLLM的gpu_memory_utilization调到0.9,然后关掉continuous batching看看,这俩参数在单卡上经常打架。另外Agent多轮调用时每次请求都是独立前缀,vLLM的radix cache基本废了,换成llama.cpp的server模式可能反而快,毕竟它针对单卡优化更狠。我4060跑Qwen2.5-7B,工具调用一轮也就4-5秒,你可以对比下是不是max_len设太长导致prefill爆炸。
4060Ti跑8B本来就不是冲着速度去的,15秒其实算正常范围,vLLM在单卡小显存上的优势主要在吞吐而不是延迟,你这种单用户交互场景反而吃不满它的优化。我之前试过用transformers原生加载+量化到4bit,配合flash-attention,延迟能压到8秒左右,但显存占用会上去一点。你那个工具调用慢20秒,大概率不是推理框架的问题,是Agent循环里每次调用都重新走了一遍完整的prompt拼接和tokenization,加上max_len设4096,prefill阶段计算量太大了,试试把历史记忆截断到1024或者用滑动窗口,能明显改善。另外batch_size在vLLM里对单请求几乎没影响,真正关键的是--max-num-seqs和--max-num-batched-tokens,你确认下是不是默认值太小导致频繁调度。如果还想再压延迟,可以看看llama.cpp的server模式,支持continuous batching,单卡4090上跑8B量化版能到30 token/s左右,比vLLM在低并发下更跟手。不过说实话,Agent场景瓶颈经常在工具返回解析和状态维护上,你可以在每次工具调用前先打印下时间戳,定位下是模型生成慢还是逻辑处理慢。
这配置跑8B不至于这么拉胯,vLLM在单卡小显存上反而容易因为prefill和显存管理开销拖慢速度。你可以试试把max_len降到2048,或者关掉continuous batching看看,另外Agent场景多轮对话的KV cache复用率低,vLLM的优势确实发挥不出来。我之前用llama.cpp跑类似任务,虽然吞吐不如vLLM,但单轮延迟反而稳很多,你可以对比下。
大概率是vLLM的prefill阶段在单卡上吃满了,试试把max_len砍到2048,温度拉低点,或者换llama.cpp试试。
这配置跑8B不至于这么拉,大概率是vLLM的prefill和decode没分开调,试试把max_num_seqs调小点。
Agent多轮对话每次都要重新处理历史,慢很正常,换llama.cpp加flash attention能快不少。
4060Ti跑8B其实瓶颈不在显存,大概率是vLLM的continuous batching没吃满,你试试把--max-num-seqs调到32以上,再把--gpu-memory-utilization设成0.9,这俩参数对单卡小显存影响挺大的。另外Agent多轮调用有个坑,就是每轮都要重新处理历史token,vLLM的prefix caching得手动开一下,不然重复计算拖慢一倍都有可能。我之前用同配置跑过,把这两个改了之后延迟能砍到7-8秒,你可以先排查下这个。要是还不行就换llama.cpp,虽然吞吐低但单请求延迟反而更稳,尤其适合这种交互式场景。
说实话你这配置跑8B不至于这么拉胯,vLLM本身对单卡小显存优化就一般,尤其是Agent这种多轮场景,每轮都要重新算KV cache,prefill阶段被拖得很厉害。你max_len设4096有点浪费,实际对话历史加工具返回根本用不了这么多,砍到2048试试,显存省下来能提batch。另外vLLM默认continuous batching对短请求不太友好,可以看看是不是paged attention的block大小没调,默认16可能太小,换成32或64会有改善。不过我觉得你这情况更可能是CPU瓶颈,Agent里工具调用那步如果涉及Python回调或者正则解析,GPU根本在等CPU,你可以开个nvidia-smi盯一下,如果GPU利用率忽高忽低那基本就是这问题。真要换框架的话,试试llama.cpp的server模式,配合flash attention和--parallel 1,单卡延迟反而更低,就是并发能力弱。还有个野路子,把工具调用那部分逻辑从Agent循环里摘出去,用单独的prompt模板跑一次生成,别混在主对话流里,有时候能省好几秒。最后建议你开一下vLLM的--enable-prefix-caching,多轮记忆如果前缀重复度高,这个能直接命中缓存,我这边实测能快30%左右。
说实话我觉得你这情况大概率不是vLLM配置的问题,8B模型在4060Ti上本来就不是主打低延迟的。vLLM的continuous batching对单请求多轮对话提升有限,它强在并发吞吐,你单个Agent来回调用工具反而会频繁触发prefill,那才是真瓶颈。我之前用7B模型跑Agent也遇到过类似情况,后来发现把max_len从4096砍到2048,温度调低到0.3,延迟能降个30%左右,但根本原因还是模型参数量摆在那。你试试把工具调用的输出token限制到128以内,另外把KV cache的复用打开,vLLM有个--enable-prefix-caching参数,对多轮重复前缀很管用。要是还嫌慢,可以换llama.cpp配grammar约束,单卡上CPU offload加GPU推理,延迟反而更稳,就是装起来麻烦点。最后提醒一下,Agent场景里每次工具返回的文本长度也很关键,你日志里看看是不是工具结果特别长,那玩意会直接拖垮下一轮prefill。