最近在试着把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确实该升了,我升到550后延迟掉了一半。
你这显存和延迟都对不上,八成是驱动或者vLLM版本问题,535太老了,升到545+试试。
显存这块先查下gpu-memory-utilization默认值,vLLM会预分配90%显存,把它调到0.8试试,延迟大概率是驱动旧了。
驱动升到550试试,paged attention在老驱动上确实容易出幺蛾子。
显存跟驱动关系不大,vLLM的KV cache默认预留了挺多,18G其实算正常,延迟高大概率是没开--enable-prefix-caching。
这问题我之前也踩过坑,AWQ量化后显存和延迟跟官方数据对不上太正常了,他们测的时候多半是A100或者H100,3090的带宽和显存频率本来就有差距。你双卡3090跑单模型的话,vLLM默认可能会把张量并行开到2,数据切分后显存反而翻倍,试试把tensor_parallel_size改成1看看。另外535驱动确实有点老,paged attention新版对CUDA版本有要求,建议升到545以上或者直接换550,顺便把vLLM版本更新到最新,老版本bug挺多的。首token延迟3秒多半是没开--enable-prefix-caching,加上这个能快不少。
这问题我当初也踩过,先别急着怀疑驱动,535其实跑vLLM没毛病,paged attention跟驱动版本关系真没那么大。你显存18G大概率是没开gpu_memory_utilization,vLLM默认会预分配整卡显存,双卡3090你得手动设个0.9或者更低,不然它把两块卡都吃满。至于延迟,3秒首token太夸张了,AWQ 4bit推理不该这么慢,我怀疑你实际跑的是FP16而不是量化版本,检查下模型加载日志里有没有quantization: awq这行,没有的话就是模型路径指错了。另外官方demo的0.5秒是单卡A100或者H100的数据,3090本身带宽就差一截,你别直接对标那个数字。batch size设1没问题,但记得把max_num_seqs也调小点,默认256会占用额外显存做调度缓存。最后建议你开个--enable-chunked-prefill,首token能明显降下来,这功能对长prompt特别有效。实在不行就换个GPTQ量化对比下,AWQ在某些卡上兼容性确实不如GPTQ稳定。
显存这块我踩过类似的坑,AWQ量化后实际占用跟官方标称差2-3个G挺正常的,官方数据大概率是纯模型权重+单batch的极限值,你还没算上KV cache和CUDA context的开销。延迟3秒的话建议先看下是不是没开--enable-prefix-caching,或者输入长度比demo长很多,首token对长prompt特别敏感。驱动535确实偏老,vLLM新版对paged attention的优化很吃驱动,我升到550之后显存碎片化问题明显缓解了,你可以先试试更新驱动,顺便把vLLM升到最新版看下release note。
535驱动确实可能影响paged attention,建议先升到545再测,不然排查半天白费功夫。
巧了,我上周刚在双卡3090上跑过同款模型,AWQ量化后显存确实会到17GB左右,官方那个12GB估计是纯单卡+极限压缩的测试环境,你这18GB挺正常的。延迟方面建议先看看是不是没开continuous batching,或者把--max-num-seqs调低试试,我改成8之后首token直接降到1秒内。另外驱动535确实有点老,我升到550后paged attention的报错明显少了,你可以先升个驱动再对比下。
显存这块我觉得挺正常的,AWQ虽然压了权重但KV cache和中间激活还是实打实吃显存,3090双卡的话得确认下是不是两张卡都各占了18G,vLLM默认会做张量并行,单卡其实只要9G左右。延迟高大概率跟驱动脱不了干系,535确实有点老,我之前升到550之后paged attention的吞吐直接翻倍了,你试试更新驱动再跑一遍benchmark。另外首token延迟也受输入长度影响,官方demo用的短prompt,你如果测试文本长,3秒不算离谱。
显存这块儿你算下KV cache的预留,vLLM默认会吃掉剩余显存,18G很可能包含这部分,官方数字一般是纯模型权重。可以设下--gpu-memory-utilization=0.5再对比看看。延迟3秒多半不是驱动问题,先确认下是不是走了CPU offload,另外AWQ对7B来说收益本来就有限,试下FP16跑个对比,说不定没准儿量化版本反而更慢。
显存这块我建议你先别急着怪驱动,535虽然老点但跑vLLM一般够用。你双卡3090是不是开了tensor parallel?vLLM默认按卡数切分模型权重,如果没设置好,两块卡都会加载完整权重,显存直接翻倍,这跟官方单卡数据对不上很正常。另外AWQ量化后KV cache还是会占不少,你把gpu_memory_utilization调低点试试,比如0.7,让显存预留出更多给运行时。
首token延迟3秒确实有点离谱,但官方0.5秒那个数字大概率是单请求、无并发、且预热过的测试环境。你如果是第一次发请求,vLLM要做CUDA kernel编译和显存分配,慢个几秒很正常。建议你跑个连续几十次的压测,看稳态延迟是多少,别拿第一次请求当参考。
还有个小坑,你检查下模型是不是真的加载了AWQ版本,有时候transformers会fallback到fp16,显存直接爆炸。可以打印下model config里的quantization_config字段确认下。如果方便的话,用官方给的benchmark脚本跑一遍,排除掉自己代码里的问题。驱动我倒是觉得可以先不升,等确认完这些再说。
驱动535确实有点旧了,我上次用535跑vLLM也遇到类似问题,换到550之后显存占用和吞吐都正常了不少,你可以先试试升级驱动。另外检查下是不是没开--gpu-memory-utilization,默认0.9的话双卡3090会预留很多显存给KV cache,实际模型权重占的不多,但总占用看着吓人。首token延迟3秒也可能是量化后没有走awq_marlin内核,vLLM对某些老驱动会回退到通用kernel,速度差好几倍。你可以在日志里看看有没有用上marlin,没有的话手动指定--quantization awq_marlin试试。如果还不行,对比下官方demo的vLLM版本,有时候新版本改了默认配置,old checkpoint的量化参数不兼容也会有影响。
你这配置跑AWQ 4bit还占18G确实不太对,我拿单卡4090跑同模型也就13G上下。驱动版本确实有点老,建议至少升到545以上,paged attention对驱动版本挺敏感的,另外可以看看vLLM的日志里有没有提示kernel fallback。还有个思路是显存占用高可能是预分配了上下文长度,你试试把--max-model-len调小到4096或2048,首token延迟多半是量化后推理没走优化的缘故,换个最新版vLLM试试。
我之前也踩过差不多的坑,官方那个数字大概率是纯推理、不带对话模板和显存碎片化的理想值,你加了服务化组件之后多出几个GB很正常。首token延迟3秒的话,先试试把gpu-memory-utilization调到0.9,然后确认一下是不是真的加载了AWQ的权重(有时候vLLM会静默回落到fp16)。另外535驱动确实太老了,paged attention在旧驱动上会有诡异的性能问题,建议先升到550+再测一轮,别急着改模型参数。
双卡3090跑7B量化还占18G,八成是张量并行把KV cache翻倍了,试试单卡加--tensor-parallel-size 1看看。
显存这个我倒觉得正常,AWQ虽然压了权重但KV cache和中间激活值还是实打实的,双卡3090跑7B本来就会多占一份显存,官方数据多半是单卡+极限优化环境跑出来的。延迟3秒确实离谱,建议先确认下是不是没开continuous batching,或者max_num_seqs设太低了。另外535驱动确实偏老,vLLM有些版本对cuda 12.1+有额外优化,建议升到545以上再试,说不定paged attention就正常了。
驱动535确实低了,建议升到550+,vLLM对paged attention的优化很吃新驱动,我升完显存直接砍了3G。
这情况我也踩过坑,AWQ量化后显存虚高大概率是vLLM默认把context length拉满了,你试试启动时加--max-model-len 4096或者8192,能省下不少缓存空间。延迟差距大倒不一定是驱动问题,535版本其实够用,先看下是不是没开--enable-prefix-caching,另外首token慢也可能是模型权重没完全加载进显存,预热一两次请求后再测比较准。