最近在折腾本地部署,用vLLM跑一个微调过的7B模型(Qwen2.5),显存占用大概14GB,但吞吐量一直上不去。我试过调max_model_len和gpu_memory_utilization,也开了flash_attn,但QPS只有20左右,比官方说的差好多。我看网上有人用同样的卡跑13B都能到50+,不知道是哪里配置有问题?还是说我的模型量化没做好?另外,我是用docker部署的,会不会有额外的性能损耗?求大佬指点一下排查方向,谢谢!
用vLLM部署7B模型,单卡A100推理速度只有20tokens/s正常吗?
全部回复
共 169 条20的QPS对7B来说确实偏低了,我怀疑你docker里vLLM默认没把CPU和内存绑好,试试加--num-cpu-threads或者直接host网络模式跑一下,差距可能挺大。另外你说开了flash_attn,但有没有确认编译版本跟CUDA匹配?之前我遇到过pytorch和vLLM的CUDA版本不一致,直接吞掉一半性能。还有你那个微调模型如果是FP16但没做continuous batching的优化,建议看下vLLM的serve日志里有没有显示通过率瓶颈,多半是max_num_seqs设太小了。
20 tokens/s确实偏低了,先确认下是不是微调后模型没做张量并行,另外docker网络模式最好用host试试。
检查下是不是QPS算错了,tokens/s和QPS不是一回事,20 tokens/s对7B来说确实偏慢但没到离谱的程度。
20的吞吐确实不太正常,我怀疑你docker里没开共享内存或者没绑核,vLLM对NUMA和CPU亲和性很敏感,容器化部署容易吃这个亏。另外你确认下是不是真正加载了量化权重,Qwen2.5 7B FP16跑满A100应该能摸到40-60,除非你的微调模型结构改动过导致显存碎片化。可以先试试不用docker直接裸机跑一遍对比,排除容器开销,再把--max-num-seqs调低到64看看。
你这情况我上周刚踩过坑,最后发现是vLLM版本太老,升级到0.6.3后直接翻倍。还有个小技巧是检查下是不是开了--enable-prefix-caching,如果输入带长system prompt这玩意反而拖慢。另外20tokens/s是单请求还是并发测的?单流20正常,并发跑满才看吞吐,官方50+都是压测数据。你可以用vllm的benchmark脚本跑个标准测试,别拿自己业务prompt当基准。
20 tokens/s确实偏低,我怀疑你微调时如果用了PEFT或者LoRA,vLLM加载适配器会有额外开销,建议先看看是不是这个原因。另外docker跑vLLM一般损耗很小,但你把max_model_len调小到2K试试,显存利用率高不一定代表吞吐好,有时候batch_size没跑满才是关键。还有,你确认是用的最新版vLLM吗?老版本对Qwen2.5支持有bug,更新到0.6+可能直接翻倍。
20 tokens/s确实有点不对劲,我怀疑你docker里是不是没把共享内存调大,vLLM的page cache很吃这个。另外Qwen2.5的7B用A100应该轻松上百,你检查下是不是微调时把pad token或者attention mask搞坏了,导致实际生成长度远超预期。量化方面如果只是bf16其实影响不大,别急着上AWQ。建议先裸机跑个官方7B对比下,再逐层加你的改动,问题基本一下就定位了。
20 tokens/s对7B来说确实偏慢,试试加--enable-chunked-prefill和--disable-custom-all-reduce,docker网络模式换host能提不少。
我之前也遇到过类似问题,后来换了方案。
20 tokens/s确实偏低了,我之前用vLLM跑7B(Mistral)在A100上不量化也能到40左右,你试试把--max-num-seqs调小点(比如4),同时确认下是不是开了--enable-prefix-caching,这俩对吞吐影响挺大的。另外docker的话只要别加奇怪的网络限制,性能损耗基本可忽略,重点还是看vLLM的日志里有没有prefill和decode的耗时占比。你微调过的模型有没有合并LoRA权重?有时候没合并会导致显存碎片化,反而拖慢速度。
20的QPS确实不太对劲,我之前用vLLM跑7B的Qwen2.5,同样A100单卡,吞吐量至少在60以上。你显存只占了14GB,说明gpu_memory_utilization可能设得偏保守,建议直接拉到0.9以上,让KV cache吃满余量。另外,你用的微调模型如果加了自定义算子或者长上下文rope,可能会影响vLLM的预优化,试试用官方原始权重跑一下做对比。Docker本身损耗可以忽略,但确认下是不是没开--ipc=host或者没用最新CUDA镜像,老版本驱动会导致kernel launch变慢。最后看看是不是输入输出长度太长,20的QPS如果是长序列生成其实算正常,短文本就肯定有配置问题。
你这情况我太熟了,之前我拿A100跑7B也卡在20多,折腾半天发现是vLLM的版本太老,换到0.6.x之后直接翻倍。你可以先看一眼是不是用了旧版,另外你显存占用14GB说明gpu_memory_utilization给得挺高,但有时候反而会触发KV cache的碎片化,试试调低到0.7左右,同时把max_model_len砍到4096,很多微调模型其实用不了那么长上下文。还有docker本身损耗可以忽略,但你要是没用--ipc=host和--shm-size,vLLM的CPU张量调度会受点影响。至于13B跑50+那种,多半是量化过的GPTQ或者AWQ,你如果拿FP16硬比肯定吃亏,建议先跑一下llama.cpp的基准对比,排除代码层面的问题。最后查一下你的输入输出长度,如果平均prompt有2000+ tokens,那20的QPS其实不算离谱,毕竟QPS跟token长度是强相关的。
20 QPS确实偏低,但先别急着怀疑量化,qwen2.5 7B在A100上跑这个数很可能跟batch size有关,vLLM默认的continuous batching如果没触发,单请求延迟会被拉满。你试试把--max-num-seqs调大到64甚至128,同时把--max-num-batched-tokens设成4096以上,吞吐应该能翻倍。另外docker确实有网络和内存拷贝开销,但影响没这么大,建议先用host模式跑个对比测试排除掉。最后确认下你微调时是不是加了奇怪的padding或attention mask,这些会让vLLM的预填充阶段变慢。
20 tokens/s确实偏低了,我之前用vLLM跑7B的Qwen2.5在A100上随便都能到40+,你先查下是不是微调后的模型权重没合并好,导致KV cache没生效。另外docker本身损耗可以忽略,但如果你没设--ipc=host或者共享内存给太小,vLLM的调度会卡在数据拷贝上,这个很容易被忽略。量化这块如果用的是AWQ或者GPTQ,注意下是否真的加载了量化版本,有时候代码里没指定就默认跑FP16了。建议先用官方未微调的模型跑个baseline,排除模型本身的问题再调其他参数。
20 tok/s确实偏低,但先别急着怪量化,Qwen2.5的7B在A100上这个数更像是没吃到长上下文红利——你把max_model_len调到4096试试,有时候短序列反而让vLLM的continuous batching跑不起来。另外docker本身损耗可以忽略,但记得检查下容器里是不是没开共享内存(--shm-size),这会影响tokenizer的并行预处理。我之前遇到过类似情况,最后发现是HuggingFace缓存目录权限问题导致每次请求都重新加载权重,你可以在启动命令里加--disable-custom-all-reduce看看。如果还不行,直接对比下官方benchmark脚本的输入长度,别拿短query去比长文档的吞吐。
检查下是不是被CPU瓶颈卡住了,docker网络和共享内存也容易拖后腿,试试加--pipeline-parallel-size看看。
量化到4bit再对比下,20确实低了,我跑7B默认参数都能到40多,先排除下是不是微调后模型结构变了。
这吞吐量确实不太对劲,我之前用vLLM跑7B的Qwen在A100上随便都能到40+。你先确认下是不是微调时用了padding到固定长度,或者generation参数里把max_tokens设太大了,这两个坑最容易拖慢速度。另外docker本身损耗可以忽略,但记得检查下是不是没用--privileged模式导致GPU直通没生效。还有你试过把tensor_parallel_size设为1吗?有时候vLLM默认配置反而会限制单卡性能。
20 tokens/s确实偏低了,我拿3090跑同尺寸的Qwen2.5都能到30+,你A100按理说该翻倍。先查下是不是微调时加了太多padding或者长序列导致prefill瓶颈,试试把输入长度压到512看吞吐变化。另外docker本身损耗很小,但要注意是不是CPU分配不够导致tokenize和调度跟不上。量化那块别急着上,先确认下vLLM版本和CUDA版本匹配,有时候老版本对新的架构支持有问题。
A100跑7B才20 tokens/s确实不对劲,先查下是不是docker里共享内存设太小了,另外确认下微调时padding有没有搞乱模型结构。
20 tok/s对于7B模型在A100上确实偏低了,但先别急着怪vLLM,我怀疑问题出在微调后的模型本身。你试过用原版Qwen2.5-7B跑一下对比吗?如果原版能到50+,那大概率是微调时加的某些自定义算子或者注意力变体把vLLM的优化路径给打断了,导致它回退到兼容模式。另外你提到显存占14GB,这个数字有点微妙——A100是40GB还是80GB?如果gpu_memory_utilization设得太高,vLLM的paged attention可能频繁做swap,反而拖慢速度,建议把利用率调到0.7左右再试试。Docker的话性能损耗基本可以忽略,除非你没加--shm-size参数导致IPC瓶颈,但这个一般只影响多卡通信。还有一个容易忽略的点:确认一下你用的vLLM版本,0.6.x对Qwen2.5系列有过专门的优化,老版本可能没吃到这些更新。量化方面,如果你用的是AWQ或GPTQ,注意校准数据集要和你的微调数据分布一致,不然激活值离群会让量化后的算子跑得特别慢。最后,你测QPS的时候有没有设置--disable-log-requests?日志打印也会吃掉不少IO,尤其是长prompt的情况下。先按这几个方向排查,大概率能翻倍。
20 tokens/s对7B来说确实偏低,但先别急着怀疑量化,Qwen2.5本身跑起来就比同尺寸Llama系吃显存带宽。你试试把--max-num-seqs调小到4或者8,有时候并发太高反而会拖慢单请求延迟。另外docker如果用的默认网络模式可能有性能损失,建议加--network=host跑一下对比。13B到50+那个大概率是带投机采样或者张量并行,单卡A100纯7B能稳定30左右就算正常了。