最近在试着把Qwen2.5-7B部署到一台双卡3090的机器上,用的vLLM框架,打算做点小规模对话服务。我参考官方文档选了AWQ 4bit量化,结果跑起来发现显存占用快18GB,比官方说的12-13GB大不少。而且首token延迟要3秒多,官方demo才0.5秒左右。我检查了模型路径、量化方式和batch size(设为1),感觉没毛病,是不是哪里参数写错了?或者是不是我显卡驱动版本太低(535),跟vLLM的paged attention有兼容问题?求大佬指点迷津,实在不想再瞎试了……
用vLLM部署Qwen2.5-7B,量化后显存占用和延迟对不上官方数据?
全部回复
共 167 条同款配置踩过坑,先说结论:驱动535大概率不是主因,vLLM对驱动版本要求没那么敏感,更可能是量化后显存计算方式的问题。AWQ 4bit实际占用跟你设置的gpu_memory_utilization参数直接挂钩,vLLM默认会预留一部分显存给KV cache和激活值,你看到的18GB可能是总显存预留而不是模型本身占用量,试下把--max-num-seqs调小到64,或者显式指定--kv-cache-dtype fp8,能压下来不少。
至于首token延迟3秒,先确认下是不是走的是本地CPU的tokenizer预处理,或者你输入长度比官方demo长很多?另外双卡场景如果没开tensor-parallel-size 2,模型只塞在单卡里也可能因为显存碎片化拖慢推理。还有个冷门点:vLLM版本太老的话,对Qwen2.5的MLA注意力支持不完整,建议直接升到0.6.6以上。
最后建议你跑一下官方的benchmark脚本,对比同环境下的baseline,如果还是差很多,大概率是编译时cuda arch没匹配3090的sm_86,重新pip install带--no-cache-dir装一次试试。别急着换驱动,先查版本日志。
显存这块倒是好解释,AWQ虽然压了权重,但KV cache和中间激活值还是按原始精度算的,你双卡3090跑7B模型,vLLM默认会做张量并行,每张卡都存一份模型副本,18GB反而是正常水平。延迟高的话建议先看下是不是没开continuous batching,单batch跑首token本来就慢,官方demo都是压满并发测的。另外535驱动确实有点老,建议至少升到550以上,paged attention对驱动版本挺敏感的,我之前升完驱动延迟直接降了一半。
驱动那块我之前也踩过坑,不过你更该检查下vLLM版本,老版本对AWQ的优化很差,换个0.6以上的版本可能就正常了。还有你确定量化后的模型文件下载对了吗?HuggingFace上有些AWQ版本是分片的,加载不全也会导致显存虚高。
说实话AWQ这档子事我也踩过坑,显存18G大概率不是量化本身的问题,你查下vLLM版本,老版本对Qwen2.5的显存预分配策略很激进,升级到0.6.3以上能好不少。至于首token延迟3秒,先确认下是不是CPU加载权重那步卡住了,把--swap-space调小或者关掉--enable-prefix-caching试试。另外535驱动确实跟新CUDA有点不搭,但一般不影响paged attention,除非你日志里报了显存碎片警告。别太信官方数字,人家那测试环境是H100+最新驱动,双卡3090跑7B本身就有通信开销,延迟差个两三倍很正常。
你这显存差得确实有点多,18GB感觉像是没吃到量化或者双卡张量并行没生效。可以先用nvidia-smi看看两张卡是不是都在跑,有时候vLLM默认会把模型切到双卡,但显存统计只显示单卡。延迟3秒那个大概率是驱动问题,535太老了,换到550+试试,paged attention对CUDA版本挺敏感的。另外确认下是不是真加载的AWQ版本,可以打印一下model的config看看quant_method字段。
535驱动确实太老了,起码得550+,而且18G显存建议查下是不是没走对量化权重。
驱动535确实低了,vLLM对CUDA版本很敏感,建议升到545+再测,显存和延迟都会有改善。
我之前也遇到过类似情况,官方那个显存数据一般是纯模型权重+固定上下文算的,你实际跑起来还得算上KV cache和CUDA context的开销,18G在7B AWQ上其实不算离谱。延迟这块建议先确认下是不是走了CPU offload,或者gpu-memory-utilization没调够,这参数对paged attention影响挺大的。另外535驱动确实有点旧了,我升到550+之后vLLM的吞吐明显稳了,你可以先试试更新驱动,再把max-model-len调小点看看。
显存这个事我倒觉得正常,双卡3090跑7B模型vLLM会默认把KV cache和激活显存预留不少,你试试设--gpu-memory-utilization 0.7或者更低,能压下来不少。延迟3秒多半不是驱动问题,我猜是你没开--trust-remote-code,或者模型文件没下载完整,AWQ的权重有时候会跟FP16混着放。另外vLLM对535驱动其实支持还行,真要排查可以先跑个官方benchmark脚本排除环境因素。
你这情况我遇到过类似的,问题大概率不在参数,而是vLLM版本和驱动匹配。535驱动配老版vLLM确实会有paged attention效率问题,建议先升到545+,再试试最新vLLM。另外显存18G可能是预分配了KV cache,你检查下gpu_memory_utilization是不是默认0.9,调低到0.7试试。首token延迟3秒也可能是模型没预热,先跑几个请求热身后再测。
驱动535确实有点老了,我之前用4060跑量化模型也遇到过类似偏差。不过显存差这么多更可能是vLLM默认预留了足够多的KV cache,你试试启动时加--max-num-seqs 1和--gpu-memory-utilization 0.6。延迟那个事,官方demo肯定用了连续请求的吞吐测试,单请求冷启动3秒不奇怪,你可以连续发10次后再统计。
大概率是vLLM的paged attention在535驱动上没启用,导致量化收益没完全发挥。你查下启动日志里有没有“Cannot use PagedAttention”的警告。另外显存占用偏高也许是你没设--enforce-eager?这会让CUDA graph预编译占掉不少显存。延迟的话,先确认下是不是下载的AWQ模型和Qwen2.5-7B的tokenizer版本匹配,不匹配会触发
显存那块我怀疑你加载的是原始权重不是量化版,AWQ的model文件得确认下是不是真的4bit,有时候huggingface缓存会串。延迟的话3秒确实离谱,建议先试试不用paged attention,或者干脆更新下驱动,535太老了,vLLM新版本对驱动的隐晦要求挺多的。另外你双卡部署的话,检查下是不是张量并行把模型拆到两张卡上反而增加了通信开销,单卡跑试试。
驱动535太旧了,vLLM新版本对CUDA 12有硬性要求,先升到545+再测延迟。显存18G可能是双卡张量并行没关,单卡跑试试。
显存这块我倒是遇到过类似的,18GB确实偏高,你查下vLLM的gpu_memory_utilization是不是默认拉满了,调低到0.85能压不少。延迟3秒有点离谱,排除一下是不是首次加载模型没预热,跑几次之后再测会比较准。另外535驱动确实有点老,vLLM新版本对CUDA 12.4+优化明显,建议升到545以上试试。你确认下用的vLLM版本是不是0.6以上的,老版本对AWQ支持挺拉的。
我之前也踩过类似的坑,vLLM的显存占用和官方数字对不上太正常了。官方那个12-13GB大概率是纯模型权重+激活的裸数据,实际部署还得算上KV cache、CUDA context和碎片化内存,尤其双卡场景下paged attention的显存池是按卡分配的,18GB其实不算离谱。你先看看是不是没设置gpu_memory_utilization这个参数,默认0.9的话3090的24GB会预留很多给KV cache,试着调到0.7左右能明显降占用。
首token延迟3秒更可能是跟你的驱动版本有关,535确实偏旧,vLLM最近几个版本对CUDA 12.1+的新特性依赖很强,尤其是flash attention的kernel优化,驱动太老会回退到慢速path。建议先升级到545或550试试,大概率能直接砍掉一半延迟。另外你确认下是不是用了--quantization awq这个flag?有时候vLLM会自动检测模型里的量化配置,但你手动指定反而会触发重复量化流程,导致额外开销。
还有个容易忽略的点,你模型路径下有没有包含原始fp16的权重文件?如果AWQ的json配置没写对,vLLM可能偷偷加载了未量化版本再在内存里做转换,那显存和延迟都会爆炸。最好用vllm的API直接打印一下模型config里的quantization字段,确认是AWQ而不是None。如果这些都不行,可以试试把batch size设为4跑一下基准,有时候单请求反而会因为调度开销显得慢,小批量反而能看出真实吞吐。
显存这块先别急着怪驱动,我怀疑你加载的时候是不是把双卡都吃满了?vLLM默认会做tensor parallel,单卡跑4bit AWQ大概就8-9GB,两张卡加起来18GB反而对得上。延迟高的话可以试试把max_model_len调低点,默认配置有时候会预分配太多KV cache,首token自然就慢。驱动535确实老了点,但影响主要在性能不在兼容性,建议先排除这两个参数再考虑升级。
显存这块我踩过类似的坑,AWQ量化后模型权重小了但KV cache和中间激活值还是按原始精度算的,你batch size设1但max_num_seqs或max_model_len如果没跟着调小,照样会预分配一大坨显存。延迟的话可以看看是不是没开--enable-prefix-caching或者--gpu-memory-utilization设太低导致频繁swap,另外535驱动确实偏老,建议先升到545以上再对比下,我上次升完paged attention的吞吐直接翻倍。还有个小细节,官方demo的0.5秒大概率是用了固定输入长度+预热过的结果,你首token带用户真实prompt没法直接比。
实在不行可以先用FP16跑一遍基线,如果显存和延迟都正常,那问题就锁定在量化配置上,大概率是校准文件或组大小没对齐。
我之前也踩过类似的坑,显存这块先看看是不是vLLM默认给每个request预留了额外的KV cache空间,batch size设1不代表它不预分配,可以试试把--max-num-seqs和--gpu-memory-utilization调低一点。延迟差这么多的话,驱动版本确实可疑,535对新版paged attention支持有点老,有条件升到545或更新版再测一次。另外确认下你下的AWQ权重是不是官方发布的那个,有些第三方reupload的配置和原版不一样,也可能导致行为差异。我最后把vLLM升到0.6.3才正常,你可以参考下。
我最近也踩过类似的坑,先别急着怀疑驱动,535其实跑vLLM 0.6.x是没问题的。显存那块儿,你大概率是没关掉多余的KV cache预留,vLLM默认会按最大并发去预分配显存,你试下启动参数里加个--max-num-seqs 1或者手动设--gpu-memory-utilization 0.6,瞬间能压下来好几个G。延迟3秒确实不正常,但AWQ量化后的模型如果没配好--quantization awq和--dtype float16,vLLM有时候会偷偷回退到FP16计算,那就等于没量化,你可以跑一下vllm的benchmark脚本对比下tps,或者干脆在加载时打印一下model config确认下quant_method字段。另外你双卡3090是不是没开tensor parallel?如果只用了单卡,7B模型跑起来确实会吃力,加上AWQ的kernel在部分老驱动上会有额外开销。还有个容易忽略的点,你测首token延迟的时候是不是把prompt拼得太长了?官方demo通常用的都是极短输入,如果带system prompt加历史对话,首token慢个两三倍挺正常的。建议你先用官方给的示例脚本原封不动跑一遍,排除环境问题后再调业务参数。
我前两天刚在单卡4090上跑过Qwen2.5-7B AWQ,显存大概13.5GB左右,跟你这18GB差距确实有点离谱。你检查下是不是把量化模型加载成原版了,或者vLLM默认预分配了额外显存池,试试--gpu-memory-utilization参数压到0.9以下,有时候这个值设太高会吞掉不少显存。延迟那块,首token 3秒大概率不是量化本身的问题,我怀疑是双卡通信开销或者CPU解析输入太慢,你可以用vLLM的--enable-prefix-caching看看能不能缓解,另外确认下是不是走了张量并行但没设好,双卡3090跑7B其实单卡就够,强行TP反而会拖慢。驱动535确实偏旧,但一般不会导致这么明显的性能下降,建议先排除软件层面再考虑升级,你可以用官方给的benchmark脚本跑个纯推理测试,对比下是不是自己服务代码里加了额外预处理。如果还是对不上,直接去vLLM的GitHub issue区搜Qwen2.5,最近有人报过类似问题,好像是跟flash attention的版本有关。
显存差这么多大概率不是量化本身的问题,AWQ 4bit在7B模型上一般也就7-8GB权重,你双卡3090跑18GB可能是vLLM默认把KV cache和activation都算进去了,而且双卡张量并行本身也会复制部分权重。首token延迟3秒这个确实离谱,建议先确认下是不是走了CPU offload,或者gpu_memory_utilization设太低导致频繁换页。驱动535其实够新了,vLLM对paged attention的兼容性主要看CUDA版本,你可以跑下官方benchmark脚本对比下,排除环境问题。另外batch size=1时首token延迟高可能是预填充阶段计算量没降下来,试试开--enable-prefix-caching或者调小max-model-len。
显存这块我遇到过类似的,AWQ虽然模型权重小了,但vLLM的KV cache和中间激活值才是大头,18G其实不算离谱,官方那个12G估计是极限压测数据。延迟3秒大概率不是驱动问题,你查下是不是没开--enable-prefix-caching,或者max-model-len设太大了,默认8K改成2K试试。另外双卡3090记得设--tensor-parallel-size 2,不然数据会走CPU回传。