用的两张4090,vLLM 0.6.3,Qwen2.5-7B-Instruct,max_model_len设的8192,QPS压到20左右就开始报KV cache不够,但nvidia-smi看显存明明还剩8G多。怀疑是预填充和decode阶段显存分配打架,试过调--gpu-memory-utilization从0.9降到0.8,反而更慢了。另外,用OpenAI兼容接口接LangChain时,第一个请求总是特别慢,后续才正常,是不是warmup没做对?有没有大佬指点一下,这种场景下是应该开chunked prefill还是手动调一下调度策略?或者干脆换TensorRT-LLM?先谢过各位了。
vLLM部署Qwen2.5-7B遇到显存碎片化,吞吐上不去怎么调?
全部回复
共 65 条我之前也踩过这个坑,vLLM 0.6.x在长上下文下默认的调度确实容易把显存碎片留在decode阶段,试试把--max-num-batched-tokens调小点(比如4096)同时开chunked prefill,能明显缓解KV cache的假性不足。至于第一个请求慢,多半是CUDA kernel和paged attention的初始化开销,建议用真实请求先打一轮warmup,或者直接给vLLM传个--enable-prefix-caching看看能不能省点事。
vLLM 0.6.3 对 4090 的 KV cache 分块确实不太友好,你 nvidia-smi 看到剩 8G 多半是显存池化但没实际可用块。先试试开 --enable-chunked-prefill 并配合 --max-num-batched-tokens 调小到 2048 左右,通常能缓解预填充和 decode 抢显存。首个请求慢大概率是 CUDA graph 和编译 warmup 没生效,启动后手动发个短请求预热一下,别等 LangChain 打进来才触发。换 TensorRT-LLM 不是不行,但得重新折腾量化,Qwen2.5 在这上面坑也不少,先别急着换。
两张4090跑7B还压8192的max_model_len,这个配置本身对KV cache就挺紧张的。nvidia-smi剩8G不代表能直接用,vLLM那边是按block粒度预分配的,碎片一多就容易报不够,实际可用远小于账面数字。gpu-memory-utilization降到0.8会更慢我一点不意外,等于把留给KV的额度又砍了一刀,调度器只能更频繁地抢。chunked prefill建议开,对prefill和decode混跑的场景确实能缓解抢占,配合enable-prefix-caching如果有重复系统提示词效果更明显。调度这块可以试试调max_num_batched_tokens,别让它一口气吃太大块,减小单批预填充占用。第一个请求慢基本就是编译加warmup没跑,vLLM首次会做CUDA graph捕获和kernel autotune,起服务后自己先发一两条短请求预热一下就行。真要说换TensorRT-LLM,7B这规模收益没那么夸张,先把vLLM这几个参数调顺了再看。
先开chunked prefill试试,碎片化多半是调度问题,换TRT-LLM成本太高了。
你这个显存还剩8G但KV cache不够,大概率是gpu-memory-utilization里预留的激活和碎片没算进去,vLLM按比例切的时候会偏保守。chunked prefill在0.6.3上对混合负载提升挺明显的,建议先开起来试试,调度策略默认就行,别急着换TRT-LLM,迁移成本不小。首请求慢那个基本就是编译和cuda graph没预热,LangChain这边可以在服务起来后自己发个短请求打一下。