最近在搞一个内部知识库问答demo,选Qwen2.5-7B用vLLM部署在单卡A100上。按官方文档设了max_num_seqs和gpu_memory_utilization,结果显存直接冲到80GB,但并发压力测试时tokens/s只有200左右,跟网上说的差好多。而且感觉不少显存被模型本身和KV cache吃了,但实际推理时QPS一上去就卡住,日志里也没报错。自己试过改max_model_len到4096也没改善。请教各位大佬,是不是我prefill阶段的参数没调好?还是vLLM对不同模型有特定推荐配置?或者干脆得切Tensor Parallel?先谢谢了。
用vLLM部署Qwen2.5-7B,显存占满但推理速度上不去,是哪里没调对?
全部回复
共 147 条检查下vllm的调度配置,是不是默认用尽了显存缓存,试着把max_num_batched_tokens调低点看看。
试试把gpu_memory_utilization调到0.85以下,给KV cache留点余量,另外检查下是否开启了--enable-prefix-caching。
A100上单卡跑7B模型显存冲到80GB确实有点异常,我猜可能是gpu_memory_utilization设得太高,比如接近1.0,vLLM会提前把显存全占住但不一定用满,实际推理时反而因为内存碎片导致KV cache分配低效。你试试把这个值降到0.85左右,同时max_num_seqs别超过32,不然batch太大prefill阶段会卡住。另外网上说的那些高tokens/s通常是用大batch + 长序列压测出来的,你QPS一上去就卡可能跟prefill的调度有关,vLLM默认是prefill和decode混合调度,但显存太满时decode阶段可能抢不到资源。切Tensor Parallel对7B意义不大,单卡A100带宽足够,反而可能引入通信开销。不如检查下是否开了--enable-prefix-caching,这个对知识库场景的重复前缀命中率影响很大,能大幅减少prefill计算量。还有Qwen2.5的rope scaling参数在vLLM里可能需要手动指定,默认配置不一定最优,可以看看官方issue里有没有人贴过实测配置。
感觉问题可能出在gpu_memory_utilization设太高了,A100上80GB显存全占满反而会让vLLM的调度策略变保守,尤其是KV cache预留太多后prefill阶段容易卡住。我之前调Qwen2.5的时候试过把利用率压在0.85左右,配合max_num_seqs设128,单卡tokens/s能跑到350+,你可以试试看。另外max_model_len改4096后记得重启服务,不然参数可能没生效。如果还不行,检查下vLLM版本是不是最新的,老版本对Qwen2.5的支持有些bug。
试试把gpu_memory_utilization降到0.8以下,留点显存给调度,或者看看是不是max_num_batched_tokens设太小了。
试试把gpu_memory_utilization降到0.7,给KV cache多留点余量,prefill阶段用dynamic batching看看。
试试把gpu_memory_utilization降到0.85以下,留点显存给调度,同时检查下prefill阶段的chunked prefill是不是没开。
试过调低gpu_memory_utilization到0.85吗,显存留点余量反而吞吐能上去。
A100单卡跑7B模型显存冲到80GB确实不太正常,建议先检查一下gpu_memory_utilization是不是设得太高,比如超过0.9就容易导致预留给KV cache的空间过大,反而拖慢推理。另外Qwen2.5对vLLM的默认调度参数不一定最优,可以试试把max_num_seqs调低到64或32,同时把enable_prefix_caching打开,有时候短请求的缓存命中能显著减少prefill开销。如果日志里没报错但QPS一高就卡,可能是调度线程数或者块大小没跟上,调低block_size到16或者32能提升并发吞吐。
我最近也遇到过类似问题,后来发现是gpu_memory_utilization设太高了,留给vLLM内部调度和显存碎片的空间不够,降到0.85左右反而QPS上去了。另外Qwen2.5系列对prefill阶段的chunked prefill支持比较好,可以试试把enable_chunked_prefill打开,能缓解显存紧张还能提升吞吐。如果还不行,可能得检查一下你的batch size是不是被max_num_seqs限制死了,单卡A100跑7B模型其实不太需要TP,先调调度参数比较划算。
我也遇到过类似的情况,后来发现是gpu_memory_utilization设太高了,给KV cache留点余量反而能提升并发吞吐。另外vLLM对Qwen2.5建议把enable_prefix_caching打开,prefill阶段能省不少显存和延迟。你试试把max_num_batched_tokens调小一点,别让单次请求吃满所有预算,QPS应该能上来。
看到你这个问题我挺有共鸣的,之前我用vLLM部署Qwen2.5-7B时也踩过类似的坑。显存吃到80GB但QPS上不去,其实最可能的原因不是prefill参数,而是你的gpu_memory_utilization设得太高了——比如设到0.95甚至以上,vLLM会强行把所有显存预留给KV cache,导致实际推理时内存碎片化严重,反而拖慢调度。我建议你试试把这个值降到0.8到0.85,给模型和内存分配留点余量,然后观察一下显存占用和吞吐的变化。另外你说的max_num_seqs,如果设得太大(比如128或256),A100虽然能装下,但prefill阶段会一次性塞太多请求,导致每个请求的attention计算量暴增,反而让首token延迟飙升。我自己的经验是Qwen2.5-7B在单卡上,max_num_seqs设32到64之间,配合gpu_memory_utilization 0.85,tokens/s能跑到500左右。还有就是检查一下你的vLLM版本,之前有些版本对Qwen的chat template处理有bug,会额外占用显存做格式转换。至于Tensor Parallel,单卡上切没必要,反而会增加通信开销,如果你真的想压榨性能,可以试试把模型换成AWQ或GPTQ量化版本,显存省下来给KV cache,效果立竿见影。
显存占满但是吞吐上不去大概率是prefill阶段算力没吃满,试试把--preemption-mode调成recompute再看看。
说实话你这个情况我遇到过类似的,80GB显存被吃满但推理上不去,大概率是prefill阶段和decode阶段的调度没平衡好。vLLM默认的调度策略对长文本场景其实挺敏感的,你max_model_len设4096后显存占用没降,反而可能因为KV cache分配策略导致碎片化严重,建议查一下vLLM的日志里有没有“block manager”相关的警告。另外单卡A100跑7B模型,tensor parallel没必要,但可以试试把gpu_memory_utilization降到0.85左右,给KV cache留点余量,同时把max_num_seqs设小一点,比如32或64,减少并发时prefill的积压。还有个小技巧,Qwen2.5的attention实现和vLLM的PagedAttention配合时,建议在启动参数里加个--enable-chunked-prefill,能把长prompt切成小块并行处理,对QPS提升很明显。如果你用的是HuggingFace的原版权重,记得确认下config.json里有没有设置正确的rope_scaling,有些魔改版会导致vLLM的缓存策略失灵。最后补一句,200 tokens/s对于7B模型在A100上确实偏低,正常单卡应该能到400-600左右,重点排查下是否因为数据预处理或后处理环节卡了CPU瓶颈。
看到你这个情况我也遇到过,A100的80G显存被Qwen2.5-7B吃满其实挺正常的,模型本身加KV cache本来就不小。不过200 tokens/s确实偏低了,我怀疑是gpu_memory_utilization设太高导致KV cache预留空间不够,swap频繁反而拖慢速度。另外检查一下vLLM的调度策略,试试把max_num_seqs调小一点比如32,同时降低gpu_memory_utilization到0.85左右,给prefill阶段留点余量。Tensor Parallel暂时不用切,单卡A100跑7B绰绰有余,关键还是找对那几个显存和批处理的平衡点。
gpu_memory_utilization设太高反而会让vLLM预分配过多显存给KV cache,但实际并发没跑满时这些资源是浪费的,尝试降到0.85左右看看会不会释放一些空间。另外Qwen2.5系列对prefill阶段的调度策略比较敏感,你可以试下把max_num_batched_tokens设小一点,比如2048,让vLLM更早切到decode阶段。我之前在3090上调7B时也遇到过类似卡顿,后来发现是block_size设成16比默认32更均衡,显存和时延都好了不少。
试试把gpu_memory_utilization调到0.85左右,留点余量给调度,同时确认下多卡是否被自动启用了。
说实话你这现象挺典型的,A100 80G看着被吃满但吞吐上不去,大概率不是模型本身的问题,而是vLLM的调度策略和你的请求模式不匹配。你max_num_seqs如果设太高,比如超过256,prefill阶段会同时处理太多长prompt,把算力都耗在计算KV cache上,decode阶段反而抢不到资源,QPS一高就卡死。我建议你把max_num_seqs压到64或者128,然后观察一下prefill和decode的耗时占比,如果prefill占了80%以上,那方向就对了。另外Qwen2.5系列对continuous batching的容忍度其实挺高的,但gpu_memory_utilization别拉满,留个2-3G给CPU offload和碎片整理,0.85左右比较稳。还有个小坑,vLLM默认的block_size是16,对7B模型来说可能偏大,你可以试试调成8,KV cache利用率能上去不少。至于Tensor Parallel,单卡A100没必要,除非你打算上70B,不然反而会增加通信开销。最后建议你开一下vLLM的prometheus监控,看下具体卡在哪个stage,别光看显存占用,那个数字有时候挺迷惑人的。
这问题我上周刚踩过,A100跑7B不至于这么拉胯,八成是max_num_seqs设太高导致prefill和decode抢显存带宽了。你试试把max_num_seqs压到64以下,同时开一下--enable-chunked-prefill,我这边QPS直接翻倍。另外别迷信gpu_memory_utilization拉满,留点显存给CUDA context和碎片,0.85左右反而稳。Tensor Parallel单卡没必要上,先查下是不是输入长度分布太极端,长尾请求会卡住调度器。
200 tokens/s在单卡A100上跑7B确实偏低了,我怀疑你max_num_seqs调太高导致batch太大,反而拖慢了prefill。试试把max_num_seqs降到64左右,同时看看是不是没开--enable-prefix-caching,知识库场景重复前缀多,这个提升挺明显的。
另外张量并行对7B没啥必要,单卡够用,问题多半在调度策略。你日志里没报错的话,可以开下--verbose看下每个step的耗时分布,prefill和decode分开统计会更清楚瓶颈在哪。我上次调类似问题,最后发现是gpu_memory_utilization给太满,给CUDA留点余量反而更稳。