用的两张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遇到显存碎片化,吞吐上不去怎么调?
全部回复
共 69 条我之前也踩过这个坑,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这边可以在服务起来后自己发个短请求打一下。
先开chunked prefill试试,首请求慢八成是没warmup,跑个空推理预热下就好。
KV cache不够但显存还剩8G,多半是block碎片问题,vLLM的PagedAttention按块分配,长序列混跑时确实容易浪费。试试开--enable-chunked-prefill,再把max_num_seqs压低点,让调度别一次塞太多请求进来。第一个请求慢基本是CUDA graph和编译没热身,启动后先打几个短请求跑一遍就好了。TensorRT-LLM吞吐可能更好但调起来更折腾,先把这个榨干再说。
你这情况八成是KV cache的block没吃满,vLLM默认按max_model_len预分配逻辑块,8192下两张4090的碎片确实容易打架。建议先把enable_chunked_prefill打开,再把max_num_batched_tokens压到2048试试,预填充别一次吞太多。至于首请求慢,那是CUDA graph和编译在首次跑,跟LangChain没关系,跑个空请求预热就行。TensorRT-LLM吞吐确实猛但部署折腾,Qwen2.5这种规模vLLM调好够用了,先别换。
显存还剩8G但KV cache报不够,这个现象挺典型的,nvidia-smi看到的是预留后的总量,vLLM内部是按block粒度分配的,碎片化严重时确实会出现“看着有空间但拼不出连续block”的情况。两张4090跑7B用8192上下文,如果并发一上来prefill和decode抢block,调度器很容易顾此失彼。chunked prefill建议开,0.6.x里对长prefill切分后跟decode混跑会平滑很多,吞吐一般能涨一截。gpu-memory-utilization别往下降,降了等于主动缩小可用池子,反而更容易触发抢占和重算。第一个请求慢基本是CUDA graph和编译kernel的冷启动,跟warmup关系不大,可以在服务起来后先打几个短请求预热一下,LangChain那边加个超时重试就行。换TensorRT-LLM不是不能换,但7B这个量级收益没那么夸张,调度的坑也不少,先把vLLM的enable-chunked-prefill和max-num-batched-tokens调明白再说。