最近在折腾本地部署,用vLLM跑一个微调过的7B模型(Qwen2.5),显存占用大概14GB,但吞吐量一直上不去。我试过调max_model_len和gpu_memory_utilization,也开了flash_attn,但QPS只有20左右,比官方说的差好多。我看网上有人用同样的卡跑13B都能到50+,不知道是哪里配置有问题?还是说我的模型量化没做好?另外,我是用docker部署的,会不会有额外的性能损耗?求大佬指点一下排查方向,谢谢!
用vLLM部署7B模型,单卡A100推理速度只有20tokens/s正常吗?
全部回复
共 36 条20的qps确实偏低了,建议先看下vLLM的日志里有没有显存碎片化的警告,另外gpu_memory_utilization别设太高,0.85左右反而更稳。docker跑确实会有一点点网络和共享内存开销,不过影响不大,重点还是检查下你的模型是不是半精度加载的,以及batch size有没有设对,很多新手就是默认单batch在跑。
老实说20 tokens/s对于7B模型在A100上确实偏低了,vLLM正常跑4bit量化的话7B应该能到80-100+的。你提到显存占14GB,这很可能是没有开启量化,或者gpu_memory_utilization设得太保守了,我建议试试调到0.9以上,同时检查一下是不是docker里共享内存设置太小了,vLLM对shm-size有要求,默认的64M经常导致性能瓶颈。另外你提到flash_attn开了,但确认下版本对不对,vLLM 0.6.x之后对flash_attn的兼容性有点坑,旧版本反而更快。还有个小细节:你有没有用--enable-prefix-caching?这个对重复请求的加速很明显。至于docker损耗,理论上几乎可以忽略,但如果你在容器里又做了端口映射或卷挂载到了机械硬盘,那IO延迟确实会拖后腿。建议先用官方推荐的命令行参数跑个基准测试,比如只加载原始Qwen2.5 7B不挂lora,排除微调权重的影响。如果还不行,看看nvtop里GPU利用率是不是跑满了,如果利用率低但显存高,可能是batch size没压上去。
20 tokens/s确实偏低了,我同样用vLLM跑Qwen2.5-7B(A100 80G),不开量化也能到35-40左右。你检查下是不是batch size设得太小?vLLM默认是动态batching,但如果你请求并发不够或者max_num_seqs设得太低,吞吐会受影响。另外docker跑确实有网络和驱动层开销,不过一般不会差这么多,建议先裸机测一下排除这个因素。还有确认下flash_attn版本是不是和CUDA匹配,有时候编译问题会导致它没生效。
20的QPS对于7B模型在A100上确实偏低,我怀疑瓶颈可能不在vLLM配置,而是docker的网络或存储IO拖了后腿。你可以试试在宿主机直接跑一遍排除容器开销,另外检查下模型是否被动态量化了,比如fp16转int8后没有对齐内存,或者qwen2.5的tokenizer预处理逻辑卡住了?我自己的经验是,先别开flash_attn,把max_model_len降到2048测个基线,排除这些干扰项再看看。
20 tokens/s对7B来说确实偏低了,我怀疑你的docker网络或共享内存配置可能限制了vLLM的异步调度效率,试试加--shm-size=8g。另外检查下Qwen2.5是否用了官方推荐的chat template,有些微调过的模型如果tokenizer配置不对,会引发额外的padding开销。还有A100跑7B按理说能到40+,建议用vllm.entrypoints.openai.api_server的--enforce-eager模式先排除图编译问题。
20的qps确实偏低,我猜可能跟docker网络和共享内存配置有关,试试加--shm-size参数,vLLM对共享内存挺敏感的。另外你确认下是不是模型加载时CPU offload了?A100单卡跑7B不量化应该也能到40+,用fp16直接跑试试,别开任何量化选项。还有,可以检查下vLLM的版本,我之前用0.4.2也慢,升到0.5.0之后吞吐明显上来了。
20tokens/s确实偏低,我猜可能是docker的网络和显存映射没配好,试试加--shm-size参数或者用--ipc=host。另外你check一下vLLM的版本,我上次从0.4升到0.6直接翻倍了,还有Qwen2.5的tokenizer有些特殊字符会影响速度,调一下rope_scaling看看。13B能到50+那通常是量化+长序列优化都拉满了,你这7B理论上应该能到30-40才对。
20的QPS对7B来说确实偏低了,我自己用A100跑同尺寸模型一般能到40-50。可以检查下是不是docker的共享内存设置太小了,或者试试把vLLM的调度策略改成prefill-only看看有没有改善。另外量化这块,如果你用的是FP16,改成INT4或者GPTQ说不定能直接翻倍,不过得看你对精度的容忍度。
20 tokens/s确实偏低了,我怀疑docker的网络和内存开销有一定影响,但更可能是vLLM的版本或模型加载参数问题。你试过把max_num_seqs调大吗?默认值可能限制了并发能力,另外如果模型是fp16而不是int4/int8,单卡A100跑7B这个速度也算正常范围。建议先裸机跑一次排除docker干扰,再对比一下官方benchmark的配置差异。
20的qps确实偏低,检查下是不是batch size没跑满,或者docker网络有瓶颈。
docker确实会有轻微性能损耗,但更可能是你gpu内存分配太保守了,试试把利用率拉到0.95看看。
老实说20 tokens/s对于7B模型在A100上确实偏低了,vLLM正常优化后单卡跑7B应该能到40-60左右。你提到显存只占14GB,这有点奇怪,因为7B模型用fp16大概需要14-16GB,但vLLM通常会预留一部分显存做KV cache,如果gpu_memory_utilization调得太保守,可能实际分配给推理的显存不足,导致batch size受限。另外检查一下是否真的启用了flash attention,有些docker镜像里编译的vLLM可能没带这个优化,你可以在logs里看到“Using Flash Attention”的提示。还有Qwen2.5本身对vLLM的适配版本有要求,不是最新版vLLM的话可能性能会差一截,建议升级到0.6.x以上。至于docker的性能损耗,通常可以忽略,除非你用了网络存储或者CPU绑核没做对。最后建议你跑一下vLLM自带的benchmark脚本,排除模型本身的问题,看看是不是微调时加了奇怪的操作导致推理图被改坏了。如果还不行,可以考虑用AWQ或GPTQ量化到int4,显存占用降到8GB左右后,吞吐能翻倍。
20 tokens/s对7B模型来说确实偏低了,我试过类似配置,A100单卡跑7B一般能到40-50。建议先检查下docker的共享内存和NUMA绑定,容器化确实会有一些网络和显存访问开销。另外看看是不是max_num_seqs设得太小,或者你微调时用了过长的序列导致碎片化,调成128试试能改善不少。
20 tokens/s确实偏低了,我跑Qwen2.5-7B用A100单卡不开量化也能到35-40左右。建议你检查一下vLLM的版本,老版本在batch推理时调度效率有问题,升到0.6+之后改善很明显。另外docker本身损耗很小,但如果你用了--shm-size默认值,共享内存不够会导致tokenize变慢,手动设到8GB试试。量化的话,7B模型用FP16就够了,AWQ在A100上反而可能因为dequant开销拖慢速度。
20 tokens/s对7B模型来说确实偏低了,我怀疑问题可能出在vLLM的调度参数上。你可以试试把max_num_seqs调大一点,比如改成256,或者检查下是否开了--enable-prefix-caching,这俩对吞吐影响挺大的。docker本身倒不会有明显性能损耗,但如果你没挂载足够大的共享内存(--shm-size),vLLM的缓存机制可能会受限。另外Qwen2.5的tokenizer效率我记得比Llama系低一些,你对比下官方benchmark用的模型版本是不是一致?如果还不行,建议用nvidia-smi盯一下GPU利用率,要是没跑满八成是CPU瓶颈了。
建议检查一下vLLM的调度策略,可能batch size没跑满,docker网络开销一般不影响推理速度。