各位大佬好,最近在折腾本地部署,用的vLLM加载Qwen2.5-7B-Instruct,显卡是4090 24G。按照官方文档设置了--gpu-memory-utilization=0.9,但启动时直接报CUDA out of memory,连模型权重都加载不完。我查了下nvidia-smi,显存占用显示只有几百MB,按理说空间是够的。网上搜了一圈,有人说要设置--max-model-len,但我试了调小到2048还是不行。另外我注意到加载的是FP16的权重,是不是应该先转成AWQ或者GPTQ量化版本?还是说vLLM和最新的transformers版本有兼容问题?求有经验的前辈指点一下,已经折腾两天了,心态有点崩。
求教:VLLM部署Qwen2.5-7B一直OOM,显存明明够用是为什么?
全部回复
共 48 条24G跑7B的FP16确实挺悬的,权重就占15G左右,vLLM还要预留KV cache和激活值,你那个0.9的utilization直接就把显存吃满了。建议先把gpu-memory-utilization降到0.7试试,能让权重加载完再谈别的。另外nvidia-smi看到几百MB是因为报OOM的时候进程还没真正分配完就挂了,别被这个数字骗了。真要省显存的话转AWQ挺有效,4bit量化后7B也就5G出头,跑起来舒服很多。
nvidia-smi只显示几百MB是因为vLLM默认会预分配显存,启动时你看到的那个数字还没算上KV cache的预留。0.9的gpu-memory-utilization在24G卡上其实挺激进的,试着降到0.85看看能不能先跑起来。另外FP16的7B权重本身就要占14G左右,剩下给KV cache和激活值的空间不多,max-model-len设2048意义不大因为瓶颈不在那。可以先用--enforce-eager关掉CUDA graph省点显存,跑通再慢慢调。量化版本确实能省不少,但先确认不是版本问题再说。
4090 24G跑7B FP16其实挺紧的,vLLM启动时会预分配KV cache,你设了0.9等于它要一口气占掉21G多,权重才14G但中间激活和CUDA graph那些加起来就爆了。先试试把gpu-memory-utilization降到0.8甚至0.75,再配合max-model-len调到4096以内看看能不能起来。nvidia-smi显示几百兆是因为报错发生在预分配阶段,进程还没真正吃满显存就挂了,所以看不到占用。真要稳的话直接上AWQ量化版,7B AWQ大概6G左右,24G随便跑长上下文。
试试把gpu-memory-utilization降到0.8,vLLM预分配显存会算上KV cache,4090跑7B FP16本来就紧。
你这情况我之前也撞过,nvidia-smi显示几百MB其实挺有迷惑性的,因为vLLM启动时会先做一轮profiling,按gpu-memory-utilization去预分配KV cache,这时候显存就被吃掉了但nvidia-smi刷新的瞬间可能还没反映出来。24G跑FP16的7B权重本身大概15G左右,剩给KV cache和激活值的空间就不多了,0.9的utilization意味着vLLM想占满21.6G,一旦模型加载加cache超过这个阈值就直接OOM。建议先把gpu-memory-utilization降到0.7试试,别一上来就拉满,很多人默认这个值调太高反而更容易炸。另外max-model-len影响的是KV cache大小,你调到2048确实能省不少,但如果profiling阶段就挂了那可能不是它的锅。还有一点容易忽略的是你机器上是不是有其他进程占着显存,比如之前的python残留或者桌面环境,用nvidia-smi看的时候要确认没有僵尸进程。量化版本确实能缓解,AWQ的7B大概只占6-7G,但前提是你得先确认是显存真不够还是配置参数打架。你可以先跑个官方的最小示例,把utilization设成0.5看看能不能起来,能起来再一步步往上加,这样定位最快。
你nvidia-smi看到几百MB那大概率是还没真正分配显存就挂了,vLLM启动时是先预分配KV cache再加载权重的,所以OOM报在加载阶段不一定是权重本身装不下。4090 24G跑7B的FP16其实绰绰有余,权重也就15G左右,问题很可能出在max-model-len和gpu-memory-utilization的组合上,0.9乘以24G是21.6G,如果max-model-len默认给到32K,KV cache预分配直接就能把这21.6G吃满,权重反而没地方放了。你把max-model-len调到2048还不行的话,建议再显式加个--max-num-seqs限制并发,或者干脆把gpu-memory-utilization降到0.8试试。另外检查下是不是开了tensor并行或者环境变量里有什么残留配置,有时候CUDA_VISIBLE_DEVICES没设对也会出这种玄学问题。量化不是必须的,FP16完全跑得动,先别急着转AWQ,把参数理清楚再说。版本兼容性方面vLLM对transformers版本确实挑,建议用官方推荐的版本组合,别自己乱升。
4090跑7B用FP16不至于OOM,先看看是不是没加--dtype float16,默认可能按float32加载了。
nvidia-smi只显示几百MB这个细节挺关键的,说明OOM不是发生在权重加载阶段,而更可能是vLLM在预分配KV cache的时候炸了。vLLM默认会一口气把gpu-memory-utilization指定的那部分显存全占掉,用来做paged attention的缓存池,所以你会看到启动瞬间显存直接飙到90%然后CUDA报错。4090的24G跑FP16的7B其实挺紧的,权重本身就要14G左右,再加上activation、CUDA context、还有vLLM自己的开销,剩下的空间可能不够它按默认配置去分KV cache。你可以先把gpu-memory-utilization降到0.85甚至0.8试试,别一上来就给0.9。max-model-len调小是有用的,但2048还是偏大,可以先压到1024确认能起来再往上加。另外检查下是不是有其他进程偷偷占着显存,比如之前的python没退干净,或者桌面环境、浏览器硬件加速在吃显存。量化版本确实能省不少,AWQ 4bit大概只要5-6G权重,跑起来会宽裕很多,但得确认vLLM版本支持对应的量化kernel。版本兼容也值得排查,vLLM对transformers和torch版本挺挑的,建议按官方requirements装,别用系统里现成的环境。