最近在折腾本地部署Qwen2.5-7B-Instruct,用的vLLM,显卡是4090(24G显存)。模型加载没问题,显存占用大概14G,但跑起来生成速度只有8-10 tokens/s,看别人帖子说同样配置能到40+。我试过调--max-model-len、--gpu-memory-utilization,也换了FlashAttention,还是没改善。CPU和内存占用都不高,GPU利用率只有30%左右,感觉像在等什么。是不是我量化选得不对(用的AWQ)?还是说vLLM版本和CUDA版本有兼容问题?求大佬指点一下排查方向,或者给个能参考的启动参数,谢谢!
部署Qwen2.5-7B本地服务,显存够但推理慢得离谱,是哪里配置不对?
全部回复
共 12 条看描述像是vLLM的调度问题,4090跑7B AWQ正常应该能到50+。你试试加--enable-chunked-prefill,然后把--max-num-seqs调低到16,另外确认下是不是旧版vLLM没开--use-flash-attn的自动检测。我之前遇到过类似情况,最后是更新vLLM到0.6.3+才解决,CUDA 12.1配flash-attn 2.6.1比较稳。还有个小坑,AWQ的group size如果设128比32慢不少,你检查下模型配置。
之前也遇到过类似情况,后来发现是vLLM默认的prefill和decode比例没调好,长上下文输入时特别明显。你试试加--enable-prefix-caching和--max-num-seqs调低到64,另外确认下是不是跑在PCIe 4.0上,带宽不够也会卡在30%利用率。AWQ本身没问题,但可以对比下GPTQ,有时候量化格式对特定显卡的kernel优化差异很大。实在不行换个官方推荐的vLLM版本,0.6.x和0.7.x对Ada架构支持差挺多的。
这速度确实不对劲,我拿4090跑同款模型用vLLM默认参数都能稳定在35+。你说的GPU利用率低很像显存带宽瓶颈,但AWQ已经减少了显存访问量,所以问题可能出在vLLM的预填充和decode阶段混在一起了,试试加--enable-chunked-prefill或者把--max-num-seqs调低到4,有时候并发请求会把batch撑爆导致等待。另外确认下你CUDA 12.1和vLLM 0.6.3的版本匹配吗,之前有人用新卡老驱动遇到过类似症状。
你试试把--quantization参数直接写成awq_marlin,新版vLLM对AWQ的kernel选择很影响速度,默认可能是老的实现。还有检查下是不是开了--enforce-eager,那个模式会牺牲吞吐量,如果没开可以去掉--use-flash-attn,因为vLLM默认就带优化了,重复指定反而可能触发bug。我上次是更新了vLLM到0.7.2才解决这种等待问题,你对比下自己的版本。
我怀疑你测速时是不是带着system prompt或者用了很长的上下文,decode阶段如果输入长度超过1024,首token延迟会拖慢整体tokens/s。单测可以固定max_tokens到512,用
4090跑7B才8 tokens/s肯定不对,试试加--enable-chunked-prefill或者换GPTQ,AWQ在vLLM上有时确实抽风。
4090跑7B AWQ只有8-10 tok/s肯定不对劲,先看看是不是vLLM版本太老没支持新架构,我上次升到0.6.3直接翻倍。
你试试加--enable-chunked-prefill或者把--max-num-seqs调小点,有时候并发请求排队会卡住利用率,单测一下最稳。
我之前也遇到过类似情况,后来发现是vLLM版本太老,对新一代显卡的调度优化跟不上,换了个最新的release直接翻倍。另外你试试不用AWQ,直接用FP16或者BF16加载,有些量化在7B这种小模型上反而因为反量化开销拖慢速度。GPU利用率30%很像是在等CPU搬运权重,看看是不是--dtype和模型权重类型不匹配,或者把--num-gpu-blocks调大点试试。还有个小细节,确认下是不是被CPU offload了部分层,nvidia-smi里看看显存是否稳定在14G没波动。
4090跑7B这速度确实不对劲,试试不用AWQ用BF16,或者换个vLLM版本看看。
会不会是CPU和GPU之间数据搬运卡住了?开个--enable-chunked-prefill看看。
4090跑Qwen2.5-7B AWQ只有8-10 tokens/s确实不对劲,我怀疑问题不在量化上,AWQ在这卡上应该能跑到30+。你GPU利用率才30%,典型的“吃不饱”状态,先别折腾max-model-len那些参数了,查一下是不是vLLM的版本太老,之前2.x早期版本对AdaLoRA或者某些算子支持有问题,换最新版或者直接上master分支试试。另外你确认过是不是被CPU的tokenizer卡住了吗?我遇到过类似情况,prompt处理阶段特别慢,后来发现是transformers和vLLM的版本不匹配,重新装了配套版本就好了。还有个冷门的点,如果你开了--enable-prefix-caching,某些情况下会反而拖慢速度,关掉看看。启动参数的话,我建议你试试--quantization awq --max-model-len 8192 --gpu-memory-utilization 0.9,然后加个--enforce-eager看是不是CUDA graph的问题。如果还不行,直接跑一下vllm的benchmark脚本,排除是API调用还是生成环节的瓶颈,这能省很多排查时间。
4090跑7B这个速度确实不对劲,我怀疑瓶颈在vLLM的调度上而不是模型本身。你试试加个--enable-prefix-caching看有没有变化,另外确认下是不是没开--use-v2-block-manager。还有个小坑,AWQ对vLLM的算子优化没FP16好,你换BF16跑一版对比下,排除量化影响。如果还不行就查下pinned memory和PCIe带宽,有时候主板设置会限制数据传输。
8-10 tokens/s这个速度确实不太对劲,4090跑AWQ量化的7B不该这么慢。你GPU利用率只有30%这点很关键,说明瓶颈大概率不在计算本身,而是在调度或者数据搬运上。先确认一下你vLLM的版本,0.6.x之前对AWQ的支持有些坑,尤其是marlin kernel没默认启用的时候,速度会掉一大截。可以试试在启动参数里加--quantization awq_marlin,或者直接换成GPTQ Int4对比一下,有时候AWQ在特定vLLM版本上就是会莫名其妙地拉胯。另外batch size也很重要,如果你是单请求测试,试试加--max-num-seqs 256并且用并发压一下,单条请求本来就跑不满GPU。还有个容易忽略的点是PCIe带宽和CPU主频,如果模型分片或者KV cache频繁换页也会拖慢。建议你跑一下vLLM自带的benchmark脚本,看throughput和latency分别是什么水平,这样能更快定位是kernel问题还是调度问题。
AWQ在4090上按理说不该这么慢,我怀疑是vLLM没走到对应的kernel,你启动时加没加--quantization awq?如果没显式指定,它可能按fp16加载权重再跑,速度反而更差。另外看下是不是被--enforce-eager坑了,这个关了CUDA graph,40+的帖子基本都是默认开graph的。GPU利用率30%多半是在等调度或者采样,试试把--max-num-seqs调大点,或者换个0.6.x的vLLM版本,老版本对AWQ支持确实有点拉。
AWQ在vLLM上有时反而拖速度,换GPTQ或直接bf16试试,4090跑7B不该这么慢。