最近在搞一个内部知识库问答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 条A100跑7B还卡成这样,多半是并发时prefill挤占decode了,试试调低max_num_seqs加开prefix caching。
显存吃满但吞吐上不去,八成是max_model_len设太大导致KV cache预分配过多,改成2048看看。
单卡A100跑7B这个吞吐确实不太对,我怀疑你卡在prefill和decode的调度上,vLLM默认对长prompt的prefill很吃显存带宽。可以试试把--enable-prefix-caching打开,内部知识库问题前缀重复度高应该能省不少算力。另外你这80GB占用有点夸张,检查下是不是装了多个副本,或者gpu_memory_utilization设太高导致KV cache预留空间被挤压。TP暂时没必要,7B单卡足够,除非你batch size开得特别大。
说实话A100跑7B这个吞吐确实不太正常,我怀疑你八成是卡在prefill和decode的调度上。vLLM默认对长prompt的prefill很保守,你可以试试把--enable-prefix-caching打开,再把--max-num-batched-tokens调大点,比如8192,让prefill阶段能塞更多请求。另外别光看显存占用,KV cache本来就是动态分配的,80G满了不代表都用上了,建议用nvidia-smi看看实际算力利用率,如果卡在30%以下基本就是调度瓶颈。TP先别急着上,单卡7B用不着,我怀疑你并发时是不是prompt长度分布太极端,有些超长请求把batch拖死了,可以看下日志里有没有scheduler相关警告。
会不会是max_num_seqs开太大导致prefill挤占了解码预算?试试调小到32同时开下continuous batching看看。
你这显存全吃满但吞吐上不去,八成是KV cache预留太狠了,把gpu_memory_utilization降到0.85再配个--enable-chunked-prefill试试。
A100 80G跑7B模型,显存余量其实很充裕,问题大概率不是Tensor Parallel,单卡就够了。你先把max_num_seqs降下来试试,比如设成32或64,这个参数对prefill阶段影响很大,太高会频繁做context切换。另外看看是不是QPS上去后调度策略在等小请求凑batch,vLLM默认是贪心等满,可以调一下max_paddings或者直接上continuous batching的调度参数。还有你确认一下是不是装了flash attention,Qwen2.5对长上下文很吃这个优化,没开的话速度能差两倍。最后建议用vllm自带的benchmark脚本压测,别用自己写的脚本,排除下网络和响应解析的开销。
看到这个现象我第一反应是vLLM的默认配置其实挺吃显存的,尤其是你把gpu_memory_utilization拉满的话,KV cache会预分配一大块,但实际并发没上去时这些cache利用率很低。你QPS一高就卡,很可能是prefill阶段的计算瓶颈,而不是显存带宽问题——A100上7B模型prefill的算术强度很高,单卡跑200 tokens/s其实不算离谱,网上那些数字多半是理想连续推理或用了更高并发加continuous batching优化过的。你可以试试把max_num_seqs调小一点,比如32或16,同时开一下--enable-prefix-caching,对知识库这种重复前缀多的场景帮助很大。另外别急着上TP,单卡7B先确认是不是CPU offload或者tokenizer那层有瓶颈,比如输入长度波动大时padding浪费太多。建议你开vLLM的--verbose日志看看每个step的时间分布,或者用--num-scheduler-steps调一下批量策略,有时候调度步长太小反而让GPU空转。最后如果还是不行,可以对比下FP8或AWQ量化版本,显存占用降下来后KV cache能开更大,并发能力反而可能上去。
这显存吃满但速度上不去,八成是KV cache预留太大挤了算力,试试把gpu_memory_utilization降到0.6再压测下。
这问题我调Qwen系列的时候也踩过,vLLM默认的continuous batching对7B这种小模型反而容易吃满显存但吞吐上不去,因为prefill和decode混在一起时调度开销占比大。你可以试试把--enable-prefix-caching打开,再手动把--max-num-batched-tokens调小到4096或8192,别让batch塞太满。另外单卡A100跑7B完全不用上TP,先看下是不是max_num_seqs设太高导致显存全被KV cache预留了,实际并发没跑起来。日志没报错但卡住的话,大概率是输入长度分布不均,长序列拖慢了整体步进,可以试试用--block-size 16而不是默认32。
显存吃满但吞吐上不去,大概率是prefill和decode的调度没平衡好,你可以试试把max_num_seqs调小到8-16,同时开一下--enable-chunked-prefill,让prefill和decode混着跑,A100上这个组合一般能救回来不少。另外Qwen2.5对KV cache的显存占用比较敏感,max_model_len砍到2048看看曲线变化,200 tokens/s如果是单流那其实不算离谱,但要是并发下掉的厉害,检查下是不是没开continuous batching的dynamic scheduling。TP暂时不用切,7B单卡完全够,除非你batch size想拉到32以上。
显存吃满但吞吐上不去,大概率不是模型本身的问题,是vLLM的调度参数没匹配上你的实际请求模式。你试试把--max-num-batched-tokens调小点,比如4096或8192,同时把--max-num-seqs降到64左右,A100上7B模型根本不需要吃到80G,多半是KV cache预分配太激进了。另外如果请求里长文本多,prefill阶段会严重挤占decode的算力,可以开一下--enable-prefix-caching看看有没有帮助。我这边之前跑类似模型,也是调了这几个参数才把tokens/s拉上去的,建议你重点检查下这两个值的组合。
这问题我之前也踩过坑,A100上80G显存看着吓人但实际vLLM默认会把70%左右预留给KV cache,你QPS上不去大概率是prefill和decode争资源了。试试把--enable-chunked-prefill打开,再把--max-num-batched-tokens调小到2048看看,另外确认下是不是用的默认调度策略。单卡跑7B其实不用上TP,先看下nvidia-smi里算力利用率是不是跑满了,我怀疑是卡在CPU和GPU数据搬运上。
八成是并发时prefill和decode互相抢显存带宽,试试把max_num_batched_tokens调小点,或者开个chunked prefill看看。
A100跑7B其实远没到要上TP的程度,单卡就够了。你显存吃满但速度上不去,大概率是并发开的太大,prefill和decode互相抢资源了,试试把max_num_seqs降到64或者32,同时看看是不是QPS高的时候都卡在长query的prefill上。另外vLLM对Qwen的官方推荐配置其实没啥特殊,但你可以留意下--enable-chunked-prefill有没有开,这个对混合负载影响挺大的。我上次调类似问题,最后发现是max_num_batched_tokens没跟着改,默认值太小反而成了瓶颈。
之前跑Qwen2.5-7B也踩过这个坑,A100上显存吃满但吞吐上不去,多半是prefill和decode阶段的调度没分开调。你可以试试把--enable-chunked-prefill打开,再把max_num_batched_tokens调小一点(比如2048),让prefill别一次性占满所有显存。另外QPS卡住不报错的话,看一眼是不是--max-num-seqs设太大导致队列排队,降到128左右试试。别急着上TP,单卡7B用不上,先把这几个参数跑了对比下。
我之前也遇到过类似情况,后来发现是--max-num-batched-tokens这个参数在起作用,默认值会卡住prefill的batch大小,你试试调高它,比如设成8192或更大。另外A100上80GB显存吃满其实正常,但QPS上不去往往不是KV cache的问题,而是continuous batching的调度没生效,看看是不是没开--enable-chunked-prefill。还有,TP切2卡对7B模型收益不大,反而可能增加通信开销,建议先单卡把--schedule-mode调成simple对比一下。日志没报错但卡住,可能是预热没做够,多跑几轮请求再看。
试试把max_num_seqs调小点,prefill和decode混在一起会互相拖慢,200多tokens/s在7B上确实不正常。
你查下是不是vllm版本老,新版本对qwen有专门优化,升级下说不定直接解决。
A100上单卡跑7B应该是绰绰有余的,200 tokens/s确实不正常。你检查下是不是vLLM默认给prefill分配的chunked space太小了,试试把--preemption-mode改成recompute或者把--max-num-batched-tokens调低点,有时候并发高反而被batch size拖累。另外确认下Qwen2.5的official config里rope_theta和max_position_embeddings是不是跟你的max_model_len匹配,不匹配会导致额外显存浪费。如果压力测试是短query长回复,那瓶颈多半在decode阶段,可以看看是不是max_num_seqs设太高导致内部queue积压。我之前遇到过类似情况,最后发现是没开--enable-prefix-caching,知识库场景重复前缀多,开了能省不少算力。
显存吃满但吞吐上不去,大概率是prefill和decode阶段资源没解耦,A100上7B模型其实用不到80G,可以试试把gpu_memory_utilization降到0.6以下,给KV cache留点余量,同时把max_num_seqs调小到16左右看看。另外QPS卡住没报错,可能卡在continuous batching的调度上,你查下vllm的日志里有没有“Waiting for available seq slots”这类提示。我之前跑类似模型时发现,把--enable-prefix-caching打开能省不少重复计算的显存,速度会稳一些。如果还不行,别急着上TP,先单卡把block_size调到16或32试试,这参数对吞吐影响挺大的。
这问题我踩过类似的坑,A100 80G看着大但vLLM默认会把能塞的全塞进去,你gpu_memory_utilization设太高反而让KV cache预分配过多,留给实际计算的内存就紧张了。建议先降到0.7左右跑跑看,另外max_num_seqs别贪大,prefill和decode的并发是共抢资源的,小batch反而延迟更低。还有Qwen系列建议开一下chunked prefill,不然长上下文时首token延迟会拖垮整体吞吐。TP暂时不用想,单卡7B没必要。
检查下是不是开了 enforce_eager,这玩意儿一开性能直接砍半,关掉再试试。