最近在折腾本地部署,用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的网络或共享内存配置有瓶颈,特别是如果你没挂载大页或者没开shm_size的话。另外7B模型单卡A100理论上能跑到50-80的,建议先裸机跑一下排除容器影响,再检查下模型是不是加载了bf16而非fp16,量化参数也可能拖慢速度。
20 tokens/s对于7B模型确实偏低,你用的docker可能有一定影响,网络和共享内存的配置容易成为瓶颈,建议先裸机跑一次对比。另外Qwen2.5的官方实现里有些算子优化可能没完全在vLLM里适配,试试把max_batch_size稍微调大一点,可能单batch吞吐就上去了。还有你量化没做的话,可以试试AWQ或GPTQ,4bit能省不少显存,留给batch的余量多了速度自然会改善。
20 tokens/s确实偏低了,A100单卡跑7B正常应该能到40-50。你试试把gpu_memory_utilization调到0.9以上,同时检查下docker是不是限制了CPU内存或者NUMA绑定,这俩对推理吞吐影响挺大的。另外Qwen2.5的tokenizer在vLLM里有时会出奇怪的问题,可以换个其他7B模型对比下排除是不是模型本身的问题。
20tokens/s确实偏低了,检查下是不是docker的网络或共享内存限制影响了显存带宽。
20 tokens/s确实偏低了,我同样用A100跑7B模型(没开量化)一般能到40-50。你可以先检查下vLLM版本是不是最新的,老版本调度效率差很多。另外docker网络模式用host试试,bridge会有额外开销。还有确认下你的Qwen2.5是不是原生支持vLLM的架构,有些微调版本改了注意力层会导致flash_attn失效。
这个速度确实偏低,我自己的经验是7B模型在A100上vLLM正常应该能跑到40-60 tokens/s,20的话明显有瓶颈。你提到显存占14GB,说明gpu_memory_utilization可能设得太高了,留给KV cache的空间不够,反而导致调度开销变大,试试调到0.85-0.9看看。另外Qwen2.5的7B本身就不太吃显存,如果你用了docker,记得检查一下是不是容器里共享内存设太小了,或者CUDA版本跟vLLM不匹配,这两个坑我踩过好几次。对了,你确认一下有没有打开--enable-prefix-caching,对于长文本生成场景这个提升很明显。至于量化问题,7B模型用FP16跑就够,没必要上量化,除非你显存特别紧张,不然反而可能因为反量化降低吞吐。最后建议你直接用nvidia-smi监控一下GPU利用率,如果一直跑不满或者频繁跳变,那大概率是CPU瓶颈或者数据加载拖了后腿。
docker确实会有一些性能损耗,建议换裸机试试,另外检查下是否开了--enable-chunked-prefill。
20的QPS对于7B确实偏低,但20tokens/s这个单位是不是写错了?如果是tokens/s的话其实正常,QPS是请求数每秒,这两个指标容易混淆。另外vLLM默认的调度策略对长上下文不太友好,你试过调低max_num_seqs或者换一下调度策略吗?docker本身损耗不大,但如果你挂载了网络存储或者共享内存没调够,反而容易成瓶颈。
20的qps确实偏低,我猜是docker网络或者共享内存的锅,试试把vLLM的IPC通信改成host模式,或者挂载--shm-size=16g能提升不少。另外你确认下模型是不是加载了量化版本?FP16跑7B一般不会占14G那么多,可能是混合精度没开对。还有个小细节:Qwen2.5的tokenizer有点慢,可以试试把max_model_len设成2048先排除显存碎片问题。
同款模型在A100上跑过,20tokens/s确实有点偏低,但得先确认一下你用的具体是哪个精度的版本。如果是原生fp16没做量化,这个速度算正常偏下,毕竟7B模型显存占用14GB说明batch size设得比较保守,单卡推理时内存带宽瓶颈会比较明显。你提到的官方数据估计是用了vLLM的continuous batching配合大batch size打出来的,单条请求跑的话很难复现那个数字。
我建议你重点看看这几个地方:第一,确认一下vLLM的版本,老版本对Qwen2.5的支持有些bug,建议升到0.6.x以上;第二,检查一下docker启动时有没有加--shm-size参数,共享内存设太小会严重影响tensor parallelism的通信效率;第三,可以试着手动设一下batch size到8或16,vLLM默认的调度策略在小batch下表现很一般。
另外你说的13B跑到50+,那个大概率是用了int8量化或者awq,而且场景可能是多并发请求,单流延迟和吞吐量是两码事,别被那个数字搞焦虑了。你如果实在想提速度,可以试试把gpu_memory_utilization调到0.95以上,配合max_model_len砍到2048,牺牲一点长文本能力换吞吐。docker本身损失很小,但记得用--gpus all挂载所有CUDA库,有些镜像缺了libnccl会导致kernel启动变慢。
20 tokens/s确实偏低了,我拿同样的Qwen2.5-7B在单卡A100上跑vLLM,正常能到40-50的吞吐量。你提到开了flash_attn但效果不明显,建议先检查一下vLLM版本,0.6.0之后的版本对flash attention的调度做了优化,老版本可能没吃到红利。另外gpu_memory_utilization别设太高,我一般留0.85-0.9,留点余量给KV cache的碎片化问题,调太高反而会因为显存紧张触发频繁的显存交换。docker的性能损耗其实可以忽略,除非你用的是WSL2那种非原生环境。还有,你确认一下模型有没有被自动量化成fp16?如果pytorch默认加载的是fp32,那显存和计算量都会翻倍,速度直接腰斩。另外检查下vLLM的调度参数,比如max_num_batched_tokens和max_num_seqs,这俩没调对的话小batch下吞吐量上不去。你可以先跑个官方示例模型(比如Llama-3-8B)做基线对比,排除模型本身微调后结构改动导致的性能异常。
docker确实会有一些性能损耗,尤其是网络和内存带宽方面,建议先在裸机环境测试一下排除这个因素。另外7B模型20tokens/s在A100上确实偏低,可以检查下是不是batch size设太小了,vLLM在连续批处理下对并发请求很敏感。还有模型量化没做的话,试试FP16或者INT8,显存占用降下来后吞吐应该能提一截。你用的vLLM版本是多少?旧版本对Qwen2.5的优化可能不够好。
20 tokens/s确实偏低,试试调低gpu_memory_utilization到0.85,或者检查下docker的共享内存是不是太小了。
20的QPS对于7B来说确实偏低了,我猜问题可能出在docker的网络或者共享内存限制上,可以试试关掉docker直接跑对比下。另外你用的是AWQ还是GPTQ量化?如果是FP16的话,7B模型在A100上理论吞吐应该能到40-50,建议检查下vLLM的调度器是不是没发挥多batch能力。还有别忘了看下CPU负载,有时候数据预处理或者tokenizer会成为瓶颈。
20的QPS对于7B模型在A100上确实有点偏低了,我猜可能是docker的网络或共享内存配置拖了后腿,建议试试宿主机的裸机部署对比一下。另外你用的Qwen2.5原版还是量化版本?如果没做int4或int8量化,单卡A100的显存带宽利用率可能没跑满,可以开个--quantization awq或者gptq试试。还有vLLM的调度参数里--max-num-seqs调大一点(比如256)也有助于提高吞吐,但注意别把显存撑爆了。
20的qps确实偏低了,我单卡跑同尺寸模型不开flash_attn都有30多,docker可能有损耗但也不至于差这么多,建议排查下模型量化精度和vLLM版本。
docker跑确实会有性能损耗,建议直接裸机跑试试,另外可以检查下是否开启了--enable-chunked-prefill。
20的吞吐确实偏低,我怀疑问题出在batch size上,vLLM默认的动态batching有时会吃不满显存,你可以试试手动调高max_num_batched_tokens或者max_num_seqs。另外docker跑确实会有一些网络和显存映射的开销,但通常不会差这么多,建议先裸机跑一次对比下。还有检查下Qwen2.5的tokenizer是不是加载了自定义的配置,有时候特殊token处理会拖慢速度。
docker确实有额外损耗,建议裸机试试,另外检查下vLLM版本和CUDA版本是不是匹配。
20的tokens/s确实偏低了,我自己的经验是7B模型在A100上正常应该能到40-60,13B也能到30多。建议你先检查一下vLLM的版本,老版本调度效率差挺多的,还有docker的网络模式和共享内存大小会不会限制了带宽。另外,如果你用了AWQ或GPTQ量化,记得确认下是不是真的加载了量化权重,有时候没生效也会吃显存但速度上不去。