最近在尝试用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%怎么回事?
全部回复
共 149 条prompt 1.5k确实偏长,先看看是不是卡在prefill了,可以试试chunked prefill或者调低max_num_batched_tokens。
prompt 1.5k确实偏长,prefill阶段吃满算力但decode阶段batch太小,利用率自然上不去。先看看实际并发请求数有没有打满256。
平均1.5k tokens的prompt情况下QPS只有10其实不算特别离谱,你算一下,10 QPS × 1.5k tokens输入差不多就是15k tokens/s的prefill吞吐,这在单卡A100上已经接近比较吃力的水平了,尤其如果输出也不短。GPU利用率30%这个数我觉得要分情况看,如果是nvidia-smi那种瞬时采样其实不太准,建议用vLLM自带的metrics或者dcgm看实际SM occupancy和显存带宽占用。显存跑满但GPU闲,一个很典型的原因是block space不够,你的max_num_seqs=256听着很大,但1.5k的prompt会占用大量KV cache block,真正能并发的序列数可能远小于256,调度器大部分时间在等block释放,GPU自然就闲下来了。可以试试调gpu_memory_utilization到0.95,同时把max_model_len按实际需要调小一点,别默认开太大,能省下不少KV cache空间给并发。另外确认下有没有开chunked prefill,长prompt场景这个开关对吞吐影响挺大的,没开的话长请求会把整个batch卡住。还有enable_prefix_caching如果你们请求有公共前缀也值得开。版本方面至少用0.6以上的,老版本调度器确实拉胯。最后建议压测时把输入输出长度分布固定下来再对比,不然不同workload的QPS没法横向比。
1.5k的prompt确实太长了,prefill阶段就吃掉大部分算力,试试看开chunked prefill,或者把max_num_seqs降一点反而可能更快。
1.5k的prompt确实不短,prefill阶段吃算力,建议先看下首token延迟,别光盯QPS。
我之前也遇到过类似问题,后来换了方案。
prompt 1.5k tokens的话prefill占比不小,QPS上不去挺正常的。你这个显存跑满但利用率才30%,感觉是KV cache把max_num_seqs撑太大了,调度反而变慢,可以试试降到64-128看看。另外确认下是不是开了enable_prefix_caching或者chunked prefill,版本太旧确实会有调度上的坑,建议升到最新版对比下。还有压测的并发数和请求方式也影响挺大,用benchmark脚本跟真实流量差别不小。
1.5k的prompt确实太长了,prefill阶段吃满算力但decode阶段batch撑不起来,QPS自然上不去,试试看能不能把输入截短点。
1.5k的prompt太长了,prefill占大头,QPS上不去很正常,先看看是不是卡在prefill阶段了。