最近在尝试用vLLM部署一个微调过的Qwen2.5-7B模型,单卡A100,开了tensor parallel=1,max_num_seqs设到了256。压测的时候发现QPS只能到10左右,GPU利用率一直在30%晃荡,显存倒是跑满了。我看别人都说7B能跑到30-50 QPS的,是不是我参数设置有问题?还是vLLM版本太旧?或者是不是我的prompt太长(平均1.5k tokens)导致的?有没有大佬能指点一下,该从哪里排查?感谢!
用vLLM部署7B模型,QPS上不去,GPU利用率才30%怎么回事?
全部回复
共 134 条显存跑满但利用率只有30%,大概率是prefill阶段卡住了,1.5k token的prompt确实偏长,试试把max_num_seqs调低到64左右,给prefill留足显存,同时升级到最新版vLLM,老版本对长序列的调度问题挺多的。另外可以开一下continuous batching的日志看看是不是在等数据,压测工具本身也可能成为瓶颈。
显存跑满但算力闲置,多半是prefill卡住了,试试把max_num_seqs调低到64,再开个chunked prefill看看。
prompt平均1.5k确实偏长,decode阶段占比低,QPS自然上不去,建议测下短prompt对比下。
prompt长度确实是个关键点,1.5k tokens的输入会让prefill阶段占比很高,而vLLM对长上下文的prefill优化有限,GPU利用率低但显存满正好说明计算没吃满。可以试试把max_num_seqs调低到64或32,同时用--enable-chunked-prefill看看能否把prefill和decode重叠起来,另外确认下你的vLLM版本有没有用上PagedAttention v2和FlashAttention,旧版本差距挺大的。还有压测工具本身也可能有瓶颈,换个工具或者用多线程并发试下,别让客户端卡住请求。
显存跑满但利用率上不去,大概率是显存带宽瓶颈而不是算力瓶颈,1.5k的prompt长度在这个问题上影响很大。你想想,prefill阶段是计算密集型的,decode阶段是访存密集型的,长prompt会让prefill占比更高,但vLLM的continuous batching调度可能把prefill和decode混在一起,导致GPU在等显存数据搬运的时候算力闲着。建议先试试把max_num_seqs降到64或者32,看看单batch的吞吐有没有变化,同时把--gpu-memory-utilization调到0.9以上,给KV cache留足空间。另外,检查一下是不是开启了--enable-prefix-caching,如果prompt前缀都相似这个功能能省不少显存带宽。还有,你用的vLLM版本是多少?0.4.x和0.5.x在scheduler上的优化差别挺大的,老版本对长序列的调度确实不行。最后,压测工具本身也可能有瓶颈,用wrk这种线程模型压HTTP接口经常QPS上不去,建议直接用vLLM自带的benchmark脚本测纯生成性能,排除网络和框架干扰。我之前调7B模型也遇到过类似情况,后来发现是prompt里的padding没去掉,tokenize之后一堆无意义的pad token浪费了显存和计算,你可以看看数据预处理那块是不是也有这个问题。
看到这个现象我第一反应是prompt长度大概率是主因,1.5k tokens的输入在prefill阶段会吃掉大量计算资源,而且vLLM的continuous batching对长上下文场景的调度其实没那么高效,你试试把平均输入压到500以内再看QPS肯定不一样。另外max_num_seqs=256这个值我感觉设得太激进了,在长prompt下会导致显存被KV cache占满,反而限制了并发调度,可以试着降到64或32观察一下GPU util的变化。还有个小细节,你压测用的数据集是不是也带超长输出?如果输出长度也很长,那decode阶段的显存压力会进一步挤压可用batch size。vLLM版本的话,建议至少升到0.6.x,之前有些版本对Qwen2.5的PagedAttention支持有bug,会导致利用率上不去。最后你可以看一眼nvidia-smi里的sm占用率,如果显存满但SM活跃度低,大概率是显存带宽瓶颈而不是算力瓶颈,这时候就要考虑换更小的batch或开chunked prefill了。
显存跑满但利用率低,这大概率不是版本问题,你的prompt长度确实是核心瓶颈。1.5k tokens的输入会让prefill阶段占掉大量显存带宽,而decode阶段又因为batch里序列长度差异大导致GPU流水线气泡,vLLM的continuous batching在这种情况下效率会打折。你可以试试把max_num_seqs调低到64或128,同时检查一下是否开了--enable-prefix-caching,如果压测请求有公共前缀的话这个能显著提升命中率。另外QPS 10这个数字其实不低,7B模型在长上下文场景下本来吞吐就有限,别人说的30-50多半是短prompt(比如几百token)的测试结果。建议你用固定长度比如512的prompt重测一遍,如果QPS能翻倍那就说明问题出在数据分布上。还有个小细节,确认下你的A100是不是80G版本,显存带宽和40G版差了快一倍,这也会直接影响prefill速度。最后可以看看vLLM的日志里有没有scheduler stall的警告,那说明等待batch填满的时间太长了。
prompt长肯定有影响,但显存满了利用率低更像连续批处理没生效,试试把max_num_seqs调低点看吞吐变化。
你这情况大概率是prefill和decode混跑互相拖累,建议打开vLLM的chunked prefill再测下。
prompt平均1.5k tokens确实会拖慢decode速度,你这QPS算正常,先试试把max_num_seqs调小到64看看。
这情况大概率是显存被打满导致batch里seq被卡住,1.5k的prompt长度影响很大,试试把max_num_seqs调低点或者开下continuous batching看看。
prompt太长确实吃显存,QPS上不去正常,你压测的并发数和请求长度也得贴出来,不然不好判断瓶颈。
1.5k的prompt长度影响真挺大的,prefill阶段占了不少时间但不算进QPS里,你可以试试把prompt砍到500以内看QPS能涨多少。另外max_num_seqs拉太高反而可能让显存碎片化,调度开销也上去了,降到64或者128说不定更顺。vLLM版本最好升到最新,老版本对连续批处理的优化差挺多的。还有就是压测工具本身别成瓶颈了,用wrk或者ghz多线程打一下看看。
显存跑满但算力闲置,大概率是显存带宽或KV cache分配卡脖子了,你prompt平均1.5k确实偏长,试试把max_num_seqs降到64或32看单batch延迟有没有改善。另外vLLM版本影响挺大的,老版本对continuous batching优化差不少,建议直接升到0.6以上再测。还有个小技巧,开下--enable-chunked-prefill,长prompt场景能明显缓解首token等待。
prompt长确实吃显存,吞吐瓶颈可能在prefill,试试把max_num_seqs调低点看单请求延迟是不是好很多。
这题我熟,先别急着升vLLM版本,1.5k的prompt长度对prefill阶段压力很大,显存吃满但算力闲置很典型。你可以把max_num_seqs调低到64试试,再开个--enable-chunked-prefill,让prefill和decode交错跑起来,QPS会有明显改善。另外压测工具如果是单线程发请求也可能成为瓶颈,用wrk或ghz多线程试试。你那边平均输出token长度大概多少?如果输出也很长,那10 QPS可能已经接近理论极限了。
你这prompt长度影响确实不小,1.5k tokens意味着prefill占比很高,而vLLM对长上下文场景的调度往往卡在prefill和decode的切换上。建议先试试把max_num_seqs降到64左右,再开一下continuous batching的日志看看排队的request数量,如果排队多那就是吞吐瓶颈在调度。另外确认下是不是用了最新的vLLM版本,老版本对长prompt的chunked prefill支持很差,升级后至少能提升一倍。