最近在折腾本地部署,用vLLM跑一个微调过的7B模型(Qwen2.5),显存占用大概14GB,但吞吐量一直上不去。我试过调max_model_len和gpu_memory_utilization,也开了flash_attn,但QPS只有20左右,比官方说的差好多。我看网上有人用同样的卡跑13B都能到50+,不知道是哪里配置有问题?还是说我的模型量化没做好?另外,我是用docker部署的,会不会有额外的性能损耗?求大佬指点一下排查方向,谢谢!
用vLLM部署7B模型,单卡A100推理速度只有20tokens/s正常吗?
全部回复
共 169 条docker跑vLLM基本没损耗,重点检查下是不是微调后模型结构变了导致显存碎片化,试试把max_model_len砍半看吞吐有没有提升。
20 tokens/s对7B来说确实偏低了,不过先别急着怀疑量化,A100跑7B正常应该能到40-60。你试试把--max-num-seqs调大点,比如64或128,有时候并发太低会严重拖慢吞吐,另外确认下vLLM版本是不是最新的,老版本对Qwen2.5支持有坑。docker基本没损耗,但记得shm-size给够,不然会莫名卡IO。还有个常见问题,如果微调时用了padding,推理时可能没对齐,也影响速度。
20 tokens/s对7B来说确实偏低了,不过先别急着怀疑量化,vLLM对Qwen2.5的continuous batching很吃batch size,你单测并发1的话吞吐肯定上不去。可以试试把max_num_seqs调到64以上,或者用--enable-chunked-prefill看看长prompt场景的优化。另外docker如果是默认bridge网络倒没啥损耗,但记得挂载时别用overlay2的写层,直通数据卷会好点。还有你显存才占14GB,说明KV cache可能没吃满,把gpu_memory_utilization提到0.9再试试。
20的吞吐确实偏低了,我怀疑问题不在vLLM本身,而是你微调后的模型权重有碎片化或者padding没对齐,导致prefill阶段变慢。你先试试把max_batch_tokens调小到2048,同时把--enable-prefix-caching打开,看有没有改善。Docker的话基本没有性能损耗,除非你网络模式用了bridge导致端口转发占CPU,但影响不至于这么大。另外确认下你是不是用的H20或者A100-40G,有些云厂商给的卡是限速的,跑分差距能到30%以上。
20 tokens/s确实不对劲,先看下是不是docker的共享内存限制或者CPU分配不够,再把prefill和decode分开测下。
量化不是主因,A100跑7B推理这速度大概率是请求并发没调好,试试调高--max-num-seqs到256看看。
20的吞吐确实偏低,A100跑7B正常应该能到40-60。你先看看是不是微调时padding没对齐,或者数据集里长样本太多导致prefill占比过高,这比量化影响大得多。docker本身损耗很小可以忽略,重点检查下vLLM版本和CUDA版本是否匹配,另外试试把--max-num-batched-tokens调大点,有时候默认值会卡瓶颈。
这速度确实不太对劲,我拿A100跑7B一般都能到40+。你先确认下是不是微调时加了什么奇怪的padding或者用了动态shape,另外docker网络模式如果走bridge会有点影响但不会差这么多。可以试试把--max-num-batched-tokens调低点,有时候默认值太大反而卡调度。量化这块倒不是重点,FP16就够了。
你这20 tokens/s确实偏低,我怀疑不是vLLM本身的问题,而是输入输出长度比导致的。如果生成长度很短,吞吐量会被prefill阶段拖累,试试把max_num_seqs调大点比如64,或者用--enable-prefix-caching看有没有改善。另外docker跑vLLM理论上没太大损耗,但记得确认下NCCL和共享内存设置,--shm-size给够。量化的话,20 tokens/s不像量化问题,更像是配置或请求并发没上去,你单测还是压测的结果?
Docker确实有网络和IO开销,但这速度差距太大了,先查下是不是微调后权重没合并导致的推理变慢。
20的tps确实偏低了,A100跑7B正常应该能到40-60。你不如先确认下是不是微调时把padding或者attention mask搞坏了,这会影响vLLM的连续批处理效率。另外docker网络模式如果是bridge,也可能有额外延迟,试试host模式。量化的话,fp16就够了,别上int8,反而会降低吞吐。建议用vllm自带的benchmark脚本先跑个原版qwen2.5对比下,排除模型本身问题。
20的QPS对7B来说确实偏低了,我之前用A100跑Qwen2.5-7B不开量化也能到40+。你试试把--max-num-seqs调小到64或者32,有时候并发太高反而会卡在调度上,另外确认下是不是用了最新的vLLM版本,老版本对Qwen2.5的支持有bug。docker的话一般影响不大,除非你网卡或者共享内存没配好,可以排除一下。量化那块你要是只跑bf16就别折腾了,先看下nvidia-smi的GPU util是不是满载,如果没吃满多半是预处理瓶颈,试试开--enable-prefix-caching。
20 tok/s对7B来说确实偏低了,不过先别急着怪docker,容器本身网络和CPU开销影响很小,重点还是看显存和GPU利用率。你确认下vLLM版本是不是最新的,老版本对Qwen2.5的attention优化差很多,另外看下nvidia-smi里GPU利用率是否跑满,没满的话可能是max_model_len设太小导致频繁重新计算。量化这块,FP16应该没问题,但如果你是用AWQ或GPTQ,得确认下校准数据集跟你的微调数据分布一致,不然推理速度会掉得厉害。最后建议直接对比一下官方vLLM的benchmark脚本,用同样参数跑原版Qwen2.5-7B,能快速定位是不是模型本身的问题。
20多确实偏低,我之前用vLLM跑7B大概能到40左右,建议先看下是不是QPS的计算口径问题,比如有没有算上prefill和decode的混合场景。另外docker本身损耗很小,但要注意容器里CUDA版本和驱动是否匹配。
20 tokens/s对7B来说确实偏低了,我怀疑瓶颈不在vLLM本身,而在数据预处理或者batch策略上。你试试把max_num_seqs调大点,比如从默认的256往上加到512,有时候并发请求少反而喂不满GPU的算力。另外,Qwen2.5的7B如果没量化,FP16在A100上理论吞吐应该能到80+,你检查下是不是显存碎片化严重,可以试着把gpu_memory_utilization设到0.95然后重启容器,让缓存重新分配。
Docker确实会有影响,但不是主要因素,除非你网络走了NAT或者存储挂载是慢盘。我建议你直接用host网络模式跑一次对比,如果差距超过10%再考虑优化容器。还有个小细节,flash_attn版本和vLLM版本要匹配,你确认下是不是用的最新版vLLM,老版本对Qwen2.5支持不好,经常出现计算图优化不到位的情况。
最后问个关键问题,你测QPS的时候是不是用单并发压测的?如果只是单条请求循环发送,那20tokens/s很正常,vLLM强在连续批处理,得用工具同时发几十个请求才能看到真实吞吐。你可以用vllm的benchmark脚本跑一下,我怀疑实际并发性能没你想的那么差。
docker跑vllm性能损耗很小,重点查下是不是量化精度和batch size没拉满,20确实偏低了。
20 tokens/s确实有点偏低了,不过先别急着怀疑量化,7B在A100上这个数更像是没吃到并发红利。你试试把--max-num-seqs调高到128或者256,vLLM吞吐和并发强相关,单请求测速会误导。另外docker本身损耗很小,但如果没加--shm-size参数,页缓存会拖后腿,建议给个8g。还有,官方benchmark是拿共享前缀的合成数据跑的,实际业务里长上下文+随机访问很容易腰斩,13B跑50+大概率是开了投机采样或者用了更短的输入长度。你重点看下服务端日志里的prefill和decode耗时占比,如果decode单token超过40ms,那大概率是显存碎片化,重启容器换个更激进的gpu_memory_utilization试试。
20的QPS对7B来说确实偏低了,我之前用A100跑Qwen2.5-7B,在vLLM默认配置下大概能到40左右,关键得看你的batch size是不是太小,vLLM喜欢大的并发请求。你试试把max_num_seqs调高到256,然后看看是不是预热没做够,头几次请求慢很正常。docker确实有性能损耗,但主要影响在小包网络IO,纯推理的话建议加--ipc=host和--shm-size参数试试。另外量化这块,如果用的是AWQ或GPTQ,记得确认vLLM加载的是量化权重,不是原模型重新跑,不然显存和速度都不对。
docker跑vllm性能损耗很小,先查下是不是微调后模型结构没对齐,或者试试把tensor parallel和batch size拉满。
20 tokens/s对于7B模型来说确实偏低,但先别急着怪vLLM,这个数字跟你的微调模型本身关系很大。Qwen2.5的7B如果没做int8或int4量化,半精度下A100的算力其实喂不满,显存14GB说明batch size可能太小了,vLLM默认会动态batching,但如果你max_num_seqs没调大(比如默认256),并发上不去吞吐就卡死。docker本身几乎没损耗,除非你网卡或PCIe透传没配好,但推理是纯计算,不用太纠结这个。我怀疑你更可能卡在prefill阶段——如果输入prompt很长,每次请求的prefill计算会拖慢整体tokens/s,试试把输入长度压到512以内看有没有提升。另外,网上那些50+的数字往往是拿纯生成、固定长度、无并发干扰的benchmark跑出来的,跟实际业务差很远。你可以用vLLM自带的benchmark脚本跑一下同样的模型,对比官方结果,如果还是20,那就看是不是微调时加了奇怪的layer或attention改动,有些自定义op会强制走fallback路径。如果benchmark能到40+,那就是你请求侧的问题,比如并发数太低或者输出长度太长。最后,检查一下你的vLLM版本,老版本对Qwen2.5的支持有问题,升级到0.6.3以上再试。
20 tokens/s确实偏低了,不过先别急着怀疑量化,你检查下vLLM的调度参数,比如--num-scheduler-steps和--max-num-batched-tokens,这两个对吞吐影响挺大的,默认值在7B上容易吃不满。另外docker跑vLLM一般损耗很小,除非你网络模式或共享内存没配好,--shm-size给大点试试。我怀疑你可能是单请求压测,这样吞吐天然上不去,得用并发工具像wrk或者vLLM自带的benchmark脚本测。还有个小坑,Qwen2.5的chat模板如果没正确传进去,也会导致prefill阶段变慢,你对比下官方example的启动命令差异。