最近在折腾本地部署,照着教程用vLLM跑Qwen2.5-7B-Instruct,开的是默认配置(gpu-memory-utilization=0.9,max-model-len=8192)。结果nvidia-smi一看,显存直接干到39.8G,我4090都差点爆了。但看别人博客说同样配置也就20G出头,差距有点大啊。我怀疑是不是我的transformers版本和vLLM不兼容,或者启动参数漏了什么?另外,用OpenAI接口调用时,首token延迟要2秒多,感觉比fastchat慢不少。有没有大佬指点下,哪些参数会影响显存占用和推理速度?还是说我这个数据其实算正常,只是被网上那些“优化后”的截图误导了?真诚求教。
用vLLM部署Qwen2.5-7B,显存占用飙升到40G正常吗?
全部回复
共 11 条40G确实偏高,但也不一定算异常,vLLM默认会预分配显存给KV cache和CUDA context,0.9的比例下4090基本就是全占满了。你可以试试把gpu-memory-utilization降到0.7或0.8,再加个--max-num-seqs限制并发,显存能掉不少。首token延迟2秒大概率是max-model-len太大导致prefill阶段计算量激增,改成4096试试,速度会有明显改善。另外transformers版本太新有时候会跟vLLM的paged attention冲突,建议直接装vLLM官方推荐的版本组合。网上那些20G的截图多半是开了量化或者把模型分片到CPU了,别太当真。
说实话40G这个数确实离谱了点,我同一张4090跑7B默认配置也就23-25G浮动,你这都快翻倍了。不过先别急着怪transformers,vLLM现在对huggingface依赖很浅,版本不匹配一般直接报错而不是静默吃显存。我怀疑你八成是开了--enable-prefix-caching或者--kv-cache-dtype fp8这类隐藏开关?或者你检查下是不是把tensor-parallel-size设成2了,虽然单卡不会生效但偶尔会触发额外显存预留。另外首token两秒确实慢了,我这边同配置基本在800ms左右,你可以试试把--block-size改成32或者调低--max-num-seqs,这两个参数对吞吐和延迟影响特别大。还有个坑是如果你用OpenAI接口时开了stream,vLLM会为每个请求预分配完整输出长度的缓存,这也会吃掉不少显存。最后建议你直接跑一下官方benchmark脚本对比,排除环境噪声,有时候CUDA graph预热状态也会让nvidia-smi数值虚高。
40G肯定不正常,我同配置跑满也就22G左右,八成是transformers版本和vLLM没对齐,试试升到最新版再清下缓存。
40G确实不对劲,我同配置跑Qwen2.5-7B也就19-21G浮动。你检查下是不是vLLM版本太新,跟transformers有兼容问题,回退到0.6.x试试。另外max-model-len虽然设了8192,但实际prefill时如果输入长度波动大,显存会按峰值预留,建议用--max-num-seqs限制并发数。首token延迟2秒大概率是没开--enable-prefix-caching,加上这个能快不少。还有,nvidia-smi显示的显存可能包含CUDA context和碎片,实际可用显存看torch.cuda.max_memory_allocated更准。
40G这个数字确实不太对劲,我拿3090跑同款模型开默认参数也就23G左右。你八成是撞上vLLM的隐式KV cache预分配了,它按max-model-len=8192和0.9的利用率一次性把显存全锁了,但实际生成时根本用不满。试试把gpu-memory-utilization降到0.75,再手动加个--max-num-seqs=4,应该能压到25G以内。另外transformers版本别追新,vLLM对特定版本有硬依赖,我之前升到4.44直接报错,回退到4.42就稳了。至于首token延迟,vLLM在并发低时确实不如fastchat的streaming优化,但你可以把--enable-prefix-caching打开,长对话场景能省不少时间。不过最可疑的还是你nvidia-smi显示的占用,有没有可能是别的进程吃显存?先清干净环境再测一次比较靠谱。
40G确实不正常,但大概率不是版本问题,是你没关掉默认的prefill缓存或者显存碎片化太严重。试试把gpu-memory-utilization调到0.6,再手动加个--max-num-seqs=4,应该能压到25G以内。首token延迟2秒多更多是vLLM的continuous batching机制在单请求下没发挥优势,fastchat走的是流式直出,体感快但并发一高就露馅。另外你transformers版本要是低于4.45,可能没吃到Qwen2.5的flash-attn优化,升一下再跑个benchmark对比下。
40G确实偏高,但不算离谱,vLLM默认会预分配显存给KV cache和CUDA context,你gpu-memory-utilization设0.9基本就是把剩余显存全吃满了。可以试试把max-model-len降到4096,或者加--enforce-eager关掉CUDA graph,显存能掉不少。首token延迟2秒多半是因为预填充阶段算力全开,加上7B模型在4090上本来就不算快,fastchat走的是流式输出所以体感快些。另外检查下transformers版本,vLLM对版本敏感,最好用官方requirements里锁定的组合。
说实话你这数据还真不算离谱,我之前用3090跑同样模型,默认配置下显存也到过35G左右。关键点在于gpu-memory-utilization=0.9这个参数,它意味着vLLM会尽量吃满可用显存,哪怕实际用不到那么多,它会预先分配KV cache和显存池。网上那些20G的截图多半是把比例调到0.5或者手动设置了max-num-seqs和KV cache大小,属于“优化后”展示,不是默认状态。另外transformers版本不兼容确实会导致碎片化分配,你试试把transformers锁到4.44.x,vLLM升级到最新版,有时能降个5-8G。首token延迟2秒多其实不算慢,fastchat走的是动态batch,vLLM是continuous batching,调度策略不同,感知上会有点差别。你要是想压显存,可以试试--max-num-seqs 128,再把--gpu-memory-utilization调到0.7,配合--max-model-len降到4096,基本能稳定在22G以内。还有个坑是开flash-attention没,没开的话显存和延迟都会高不少,vLLM 0.6以上默认启用,但老版本需要手动加--enable-flash-attention。总之你这现象正常,不用太焦虑,先跑通再慢慢调参吧。
40G确实不太对劲,我拿4090跑同样配置大概也就22-24G左右。你查过vLLM的版本没?0.6.0之后对Qwen系列有过专门的显存优化,老版本会默认预分配很多KV cache空间。另外你那个gpu-memory-utilization=0.9其实是给vLLM预留的总显存池,不是实际占用,但如果模型加载时transformers版本太旧,可能会导致中间激活值没被正确释放,你可以试试把transformers升到4.44以上再跑一次。首token延迟2秒多也偏高,vLLM的continuous batching在单请求时本来就不占优势,但如果你开了--enable-prefix-caching或者设置了--max-num-seqs太小,反而会拖慢调度。建议先跑一下官方benchmark脚本,排除是不是OpenAI接口的包装层额外开销。最后,网上那些20G的截图很可能用了--quantization awq或者--kv-cache-dtype fp8_e5m2,你如果不想折腾量化,可以试试把max-model-len降到4096,显存能掉不少——不过7B模型长上下文本来就不是强项,牺牲点长度换速度其实挺划算的。
40G确实偏高了,我同样的卡跑7B一般也就25G上下。你检查下是不是vLLM版本太新,默认预分配了额外KV cache,或者transformers缓存了旧权重导致的碎片。首token延迟2秒多半是max-model-len设太大,8192对7B来说有点浪费,试试砍到4096,显存和速度都能改善不少。另外别太信网上截图,很多人开量化或者阉割了精度,默认配置参考价值有限。
40G确实偏高,但也没到离谱的程度,vLLM默认会预分配显存给KV cache,4090上跑7B本来就得留够余量,你试试把gpu-memory-utilization降到0.6再看看。首token延迟2秒多半是max-model-len开太大导致prefill变慢,或者你没开continuous batching的流式输出,改小点或者加--enable-prefix-caching应该能改善。另外transformers版本确实容易跟vLLM打架,建议直接升到最新版再清一下缓存重装试试。网上那些20G的截图大多是关掉了显存预分配或者用4bit量化,别太当真。