最近在搞一个内部知识库问答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 条是不是max_num_seqs设太高了,试试调低到16或32,让prefill阶段别太贪心。
试试调低gpu_memory_utilization到0.9以下,给KV cache留点余量,prefill阶段batch size设小点看看。
a100单卡跑7b模型按理说不会这么惨,你试试把gpu_memory_utilization调到0.9以下,留点余量给显存管理。另外max_model_len设4096可能还是太高,可以降到2048看看,prefill阶段的内存分配跟这个参数关系挺大的。如果qps一上去就卡死,可能是vllm的调度策略对qwen2.5默认设置不敏感,建议检查一下是否开了–enable-prefix-caching,有时候这个反而拖慢速度。实在不行可以看下vllm的issue,qwen系列有专门的tuning参数讨论。
检查下vLLM的prefill chunk size和KV cache复用配置,A100上7B模型跑200 tok/s明显偏低了。
这情况我也遇到过,vLLM对Qwen2.5的默认配置其实挺吃显存的,尤其是prefill阶段如果max_num_seqs设太大,显存会先被KV cache占满然后推理卡住。可以试试把gpu_memory_utilization降到0.85或0.8,同时把max_num_seqs调到64或32,给prefill留点余量。另外你用的是不是最新版vLLM?之前有版本对Qwen2.5的prefix caching有bug,更新到0.6.3以上可能会好不少。单卡A100跑7B其实不用TP,那玩意反而增加通信开销,重点还是调prefill的batch size和显存分配比例。
看着像是prefill阶段的计算瓶颈,毕竟Qwen2.5的注意力机制对长序列挺敏感的,你试试把--enable-prefix-caching打开,能跳过重复计算的token。另外单卡A100跑7B其实没必要上TP,反而会增加通信开销,不如把gpu_memory_utilization降到0.8,给KV cache留点余量,再配合--max-num-batched-tokens调低到2048,看看能不能把显存压下来。
试试把gpu_memory_utilization调低到0.85,给KV cache留点余量,prefill阶段卡顿可能是batch_size没压住。
试试把max_num_seqs调低点,可能并发太多导致显存碎片化了。
A100上Qwen2.5-7B跑到80GB显存确实有点怪,这模型本身用BF16也就14GB左右,八成是gpu_memory_utilization设太高或者max_num_seqs没卡住并发数,导致KV cache提前把显存撑爆了。我之前试过把这俩参数调低到0.9和256,然后配合--enable-prefix-caching能缓解不少,prefill阶段瓶颈通常跟max_model_len关系不大。你换个思路试试把调度策略改成--scheduler-policy为“fcfs”看看,有时候默认的“max”调度在高并发下反而会卡prefill。如果还是不行,那就只能切TP了,单卡A100上7B模型切2路其实挺浪费的,不如直接换8B模型用FP8精度跑。
我之前也踩过类似的坑,A100上80G显存被吃满是vLLM默认prefill阶段会预分配大量KV cache,哪怕实际序列不长也占着不释放。试试把gpu_memory_utilization调低到0.85左右,同时显式指定max_num_batched_tokens不要太大,不然prefill和decode会互相争资源。如果还是卡,可以检查下是不是用了动态batching但请求长度差异太大,这会导致内部碎片化,建议先用固定长度压测排除干扰。
看到这个情况我第一反应是检查gpu_memory_utilization是不是设得太高了,vLLM官方建议一般留10%-15%的显存给CUDA kernel和临时变量,你冲到80GB可能把剩余空间全吃了,导致prefill阶段内存分配紧张。另外max_num_seqs这个参数得和模型的实际batch能力配合,Qwen2.5-7B在A100上单卡推理时,batch size太大反而会因为显存碎片化拖慢速度,我试过设到32反而比64快。还有你可能忽略了vLLM的调度策略,如果max_model_len和实际输入长度差距太大,KV cache会预分配大量无效空间,建议先用小batch跑一遍看每个请求的实际tokens分布再调参数。至于Tensor Parallel,单卡A100跑7B模型完全没必要,切了反而因为通信开销更慢,问题大概率出在prefill阶段的chunked prefill没开,或者block size设得太大导致浪费。最后可以试试把quantization换成FP8或者AWQ,显存压力小很多,QPS也能拉起来。
A100上跑7B模型显存占满但吞吐上不去,大概率是gpu_memory_utilization设太高导致KV cache预留过大,反而挤占了batch size的弹性空间。我之前试过把max_num_seqs降到64、gpu_memory_utilization调到0.85,同时把--preemption-mode设成recompute,能缓解预填充阶段的阻塞。另外你检查下vLLM版本是不是0.6.0以上,新版本对Qwen2.5的sliding window支持有优化,不然容易卡在长序列上。
试试把--enable-prefix-caching打开,还有检查下是不是max_num_seqs设太高导致prefill阶段卡住。
这个思路不错,收藏了。
我之前也遇到过类似问题,后来发现是vLLM的prefill阶段默认会分配较多资源,可以试试调低--preemption-mode或者硬限制一下--max-num-batched-tokens,别让它一次塞太多请求进prefill。另外A100单卡跑7B其实不用上TP,主要是你gpu_memory_utilization设太高了,留个10%给显存碎片和调度会好很多,不然KV cache占满后新请求就卡住了。
说实话你这个情况我也踩过坑,A100上Qwen2.5-7B跑vLLM显存吃满但吞吐上不去,大概率是gpu_memory_utilization设太高了,留点余量给调度和动态batch反而更稳。另外可以试试把max_num_seqs调小一点,比如32或64,同时开启--enable-prefix-caching,让重复问题的prefill阶段省点计算。如果QPS一高就卡,再检查下prefill的chunked prefill是不是没开,vLLM默认可能把长prompt全塞进一次prefill,会拖垮延迟。
是不是block size没调?默认16的话长序列显存利用率很低,试试32或64。
显存占满但吞吐上不去,大概率是prefill阶段的计算瓶颈被忽略了,Qwen2.5的attention计算量其实比想象中重。建议你试试把gpu_memory_utilization降到0.85以下,给KV cache留点余量,同时把max_num_seqs调小到32左右,再观察一下。另外vLLM对7B模型默认用FP16,如果A100是80G版,可以切到FP8或者开启kv cache的int8量化,能显著释放显存给并发请求。如果还是卡,看看是不是调度策略默认用fcfs,改成priority或者age-based可能会改善高并发时的排队问题。
我之前也踩过类似的坑,vLLM的gpu_memory_utilization设太高反而会让KV cache预分配过多,导致prefill阶段卡顿,建议先降到0.85试试。另外Qwen2.5-7B对max_num_seqs敏感,我试过设成64左右比默认256更稳,能腾出显存给推理。如果QPS一上去就卡住,可以检查下vLLM的调度策略是不是被长序列拖慢了,或者试试开--enable-prefix-caching看有没有改善。
遇到过类似情况,A100显存拉满但tokens上不去很可能是因为gpu_memory_utilization设得太高,导致KV cache预分配过多,实际推理时反而被内存碎片卡住了。建议试试把这个值降到0.8到0.85之间,同时把max_num_seqs调小一点,比如32或64,让vLLM有更多预留空间给调度。另外Qwen2.5的prefill阶段对长上下文确实比较敏感,如果知识库文档偏长,可以试试开启enable_prefix_caching来复用公共前缀,能明显减少重复计算。TP倒不一定需要,单卡A100跑7B完全够用,主要还是显存分配和batch size的平衡问题。