最近在试着把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新版本对CUDA 12要求高,建议先升到545+再试,能解决不少显存异常问题。
显存18G和延迟3秒确实离谱,我上次也是535驱动跑AWQ,换到545直接正常了,先升驱动试试。
显存多半是上下文长度或KV cache没调,试试把max-model-len改小点,延迟高大概率是驱动太老。
试试加--max-model-len调低点,显存能省不少;延迟高大概率是驱动老,升到550那版再测测。
这情况我上周刚踩过一遍,最后发现是vLLM版本的问题,旧版对AWQ的kernel支持不太好,显存分配策略特别激进。你试试升到0.6.3以上,我更新完显存直接掉了4个G,延迟也降了一半。另外你双卡3090是不是没开tensor parallel?官方那个12-13GB大概率是单卡纯推理的数据,你如果没设tensor_parallel_size=2,模型默认只会在单卡上跑,另一张卡空着,但显存统计会把两卡加起来算,18GB就说得通了。首token延迟3秒的话,检查下有没有开continuous batching,虽然batch=1但vLLM默认还是会预留KV cache的空间,把gpu_memory_utilization调到0.7试试。驱动535确实有点老,但影响最多是性能波动,不至于差6倍,先软后硬排查吧。我最后是把模型重新用AutoAWQ量化了一遍,官方那个量化文件可能跟新版vLLM不兼容,重做完延迟就正常了。
我前两天也踩过类似的坑,双卡3090跑量化模型显存经常虚高,后来发现是vLLM默认把context length拉满到32k了,你可以试试--max-model-len 8192,显存能掉不少。至于首token延迟,AWQ推理时如果没开--enable-lora或者gpu_memory_utilization没调好,性能差距会很大,建议先看下nvidia-smi里两张卡的利用率是不是均衡。另外驱动535确实有点老,vLLM对CUDA 12.1+的要求在535上偶尔会静默回退到非paged attention路径,有条件升到545或更新版本再对比下。
显存这块儿我怀疑你看到的官方数字是单卡纯推理的理想值,双卡3090跑vLLM会默认做tensor parallel,权重分配和KV cache的显存开销是叠加的,18GB不算离谱。延迟高的话,先看看是不是没开--enable-prefix-caching,或者输入长度没限制,Qwen2.5对长上下文很敏感。驱动535确实有点老,建议升到545或550,paged attention在旧驱动上偶尔会有诡异的性能问题,但不至于差6倍。另外确认下有没有用--gpu-memory-utilization限制显存,默认会占满所有空闲显存,反而影响并发调度。
535驱动确实容易出幺蛾子,建议先升到545+再对比,另外检查下vLLM版本和CUDA对齐没。
显存这块差5GB大概率不是vLLM的锅,AWQ量化后模型权重确实小,但KV cache、CUDA context还有碎片化内存都会额外吃显存,双卡3090跑7B本来就是大炮打蚊子,18GB里可能有6-7GB是CUDA context和临时buffer。延迟3秒更可能是量化方式和paged attention的交互问题,AWQ对7B这种规模收益本来就有限,你试试不用AWQ直接FP16跑,首token应该能压到1秒以内。另外驱动535确实太老了,vLLM最近的版本对Hopper架构优化很多,但3090是Ampere,你至少升到545或550,很多paged attention的kernel会走不同分支。还有个细节,官方demo的0.5秒是A100或者H100跑的,3090的显存带宽差了一倍多,这个基准本身就不公平。建议你先用默认参数跑一遍官方example,不动量化,把环境问题排除掉,再逐步加量化对比。如果还是卡,看看vLLM版本是不是最新,老版本对Qwen2.5的MLA支持不全,也会拖慢首token。
说实话这差距有点离谱了,18GB显存我怀疑AWQ压根没生效,你确认下模型加载日志里有没有quantization: awq字样,有时候路径不对会静默回落到FP16。延迟3秒大概率不是驱动问题,535版本虽然老但跑vLLM不至于这么拉胯,先看看是不是max_model_len设太大导致prefill计算量上去了,或者把gpu_memory_utilization调低点试试。另外双卡3090的话,如果没开tensor parallel,第二个卡其实在摸鱼,显存占用自然比官方单卡测试虚高。
显存这块其实不用太纠结官方数字,他们测的时候多半是关掉了CUDA graph和continuous batching的,你生产环境开起来占用自然高。延迟倒是可以查查是不是没走FP8的KV cache,AWQ对7B模型收益本来就不大,换个GPTQ或者直接FP16试试说不定更快。驱动535确实有点老,建议升到545以上,paged attention在旧驱动上会有莫名性能问题。另外你双卡3090是不是没开tensor parallel?单卡跑7B会吃紧,加上--tensor-parallel-size 2也许能压延迟。
显存高大概率是context长度和KV cache没调,试试--max-model-len砍到4096,延迟先查下CPU内存和磁盘加载瓶颈。
我之前也遇到过类似情况,不过用的是4bit的GPTQ量化,显存同样比官方标的高出不少。官方那个12-13GB大概率是纯模型权重+固定KV cache的极限值,但vLLM实际跑起来还要算上CUDA context、激活值、以及paged attention的预留块,尤其双卡场景下通信缓冲区也会吃掉一部分显存,18GB我觉得不算离谱。延迟差这么多的话,先别急着怪驱动,535其实支持CUDA 12.2,vLLM一般没问题,你可以确认下是不是没开continuous batching,因为batch size=1的时候首token延迟反而会被调度开销拖累。另外,AWQ量化对Qwen2.5的MLP层压缩率可能不如GPTQ,你换个GPTQ或者FP8试试?还有个小坑,如果你用了--enforce-eager或者忘开flash-attention,推理速度会直接掉一半以上。建议先看下vLLM启动日志里有没有提示“Using default cache config”之类的警告,然后跑个简单的benchmark脚本对比下不同量化格式,别只看官方demo,他们那环境是A100+特定CUDA版本,3090上本来就有差距。
这问题我上周刚踩过一模一样的坑,后来发现是vLLM的版本问题,0.4.2和0.5.0的显存管理策略差挺多,旧版本对AWQ的KV cache预留特别保守,硬是给你多占好几个GB。你试试升级到0.5.4以上,或者干脆用官方docker镜像,能省掉一堆奇奇怪怪的兼容性麻烦。延迟那块,首token3秒多半不是量化的问题,你看下是不是没开continuous batching,或者max_num_seqs设太低,vLLM默认是256,你手动改1反而会触发每次请求都重新预分配显存,那延迟能不高吗。另外535驱动确实有点老,paged attention在40系以上才吃新特性,但你双3090是Ampere架构,理论上影响不大,不如先跑个nvidia-smi看看GPU利用率是不是满了,如果只有30%左右那肯定是调度没吃满。最后建议你换个思路,直接用fp16跑一下对比,如果显存和延迟都正常,那就是量化路径的问题,可以试试GPTQ或者把AWQ的group_size调成128,有时候官方给的参数是为A100调的,在3090上反而会触发碎片化。
显存18G确实不对劲,AWQ 4bit的7B模型理论占用应该在7-8G左右,你检查下是不是加载时把双卡都占了但没开tensor parallel,或者量化版本和模型config不匹配。延迟3秒更像是paged attention没生效,建议先确认vLLM日志里有没有启用“PagedAttention”相关提示,另外535驱动确实偏老,建议升到545+再测。我之前遇到过类似问题,后来发现是vLLM版本和CUDA版本没对齐,换了个新版本就好了。
我上次用AWQ量化跑7B也遇到过类似情况,显存和你差不多,后来发现是vLLM默认给每个序列预留的KV cache太多了,把max_num_seqs或gpu_memory_utilization调低点能明显降下来。至于首token延迟,3秒确实不正常,你试试关掉前缀缓存或者换一下调度策略,另外535驱动确实有点老,建议升到545+,paged attention对驱动版本挺敏感的。最后可以看下是不是偷偷加载了lora适配器或者--enable-lora没关,这玩意会白吃不少显存。
535驱动确实太老了,paged attention的兼容性坑挺多的,建议先升到545+再对比下数据。
驱动版本影响挺大的,我上次升完驱动延迟直接砍半,你试试再说。
你这配置跑AWQ还占18G确实不正常,我猜可能是vLLM默认给每个卡都预留了KV cache空间,就算batch=1也会占满,试试设--gpu-memory-utilization 0.6看看。另外535驱动确实有点老,之前我换到545后paged attention的显存碎片问题明显好转,建议先升个驱动再对比下。首token延迟3秒大概率是量化后的kernel没有走triton优化,可以检查下vllm的版本是不是太旧,更新到最新版对Qwen2.5系列有专门优化。
显存这块我倒是觉得官方那个12-13GB大概率是纯模型权重加少量KV cache的理想值,你实际跑起来还得算上activation、CUDA context还有vLLM自己预留的显存池,18GB在双卡环境下真不算离谱。不过首token延迟3秒确实有点不对劲,你这模型是放在单卡上还是做了tensor parallel?如果是跨卡通信,3090的NVLink带宽可能成为瓶颈,特别是小batch时反而更明显。驱动535有点旧了,我印象里vLLM对CUDA 12.1+的优化更激进,你试试升到545或者550,paged attention那块可能有性能提升。另外你确认下vLLM的版本,老版本对Qwen2.5的GQA支持不完善,会导致KV cache放大,建议升到0.6.0以上。还有个容易忽略的点,AWQ量化后如果没跑calibration直接用,激活分布偏移也可能让显存和延迟变差,你试试用AutoAWQ重新量化一遍。最后建议你开下vLLM的--enable-chunked-prefill,对单请求场景能显著降首token延迟。
这情况我蹲过,AWQ 4bit在vLLM里显存虚高挺常见的,多半不是驱动问题,你试试把gpu_memory_utilization调低到0.7再看看。首token延迟3秒大概率卡在prefill阶段,确认下max_model_len是不是被设成8k了,改成2k试试。还有双卡的话记得设tensor_parallel_size=2,不然第二张卡纯吃显存不干活。