最近在折腾本地部署,用vLLM跑Qwen2.5-7B,服务器是两张RTX 4090(24G*2)。按说7B模型用FP16推理大概14G显存,加上KV Cache也够吧?但一启动就报CUDA OOM,试了调低max_num_seqs、换GQA,甚至只加载单卡,还是崩。后来看nvidia-smi发现显存被其他进程占了一部分,但就算全清空也只撑了半分钟。是不是我量化方式不对?或者vLLM版本太新有bug?求指点,卡在第一步好难受。
部署7B大模型到服务器,显存明明够却报OOM,有老哥遇到过吗?
全部回复
共 178 条之前我也被这玩意儿坑过,最后发现是vLLM默认会预留一部分显存做KV cache的预分配,你把gpu_memory_utilization调到0.85以下试试,别拉满。另外4090的驱动和CUDA版本也得对一下,有时候新版本vLLM对老驱动兼容性贼差,直接给你报个假OOM。要是还不行,先用transformers原生加载跑一步看显存曲线,能跑就是vLLM配置问题,省得瞎折腾。
显存占用看着够,但vLLM默认会预分配满,试试--gpu-memory-utilization调低点,或者换最新版看看。
我之前也卡这过,后来发现是vLLM默认给每个序列预留的KV cache太激进,加上长上下文配置,实际占用比你算的高不少。你试试把--max-model-len调到4096或者更低,再把--gpu-memory-utilization设成0.9,应该能撑住。另外别用最新版vLLM,0.6.3之后的版本对多卡显存分配有改动,回退一版反而稳。我那次折腾半天最后就是版本问题,换了就好了。
显存碎片化了吧,试试加--gpu-memory-utilization 0.85,顺便查下别的进程是不是占着显存缓冲。
这问题我上周刚踩过,最后发现是vLLM默认会预分配40%左右的显存做KV cache,7B模型看着够但实际峰值能飙到20多G。你试试启动时加--kv-cache-dtype fp8或者--gpu-memory-utilization 0.7,应该能缓解。另外检查下CUDA_VISIBLE_DEVICES有没有设对,双卡时vLLM偶尔会把主卡撑爆。
遇到过,vLLM默认会按最大并发预分配KV cache,7B模型实际占用远不止14G,两张卡之间还要算通信开销。建议先把gpu-memory-utilization设到0.8以下,加个--enforce-eager关掉CUDA graph试试,这俩是最常见的坑。另外量化的话,FP16没问题,别急着上AWQ,先确认下你是不是用了最新的vLLM版本,老版本对Qwen2.5支持有bug,回退到0.6.x反而稳。最后看下是不是有残留进程占着显存,fuser -v /dev/nvidia*查一下,有时候zombie进程特别坑。
我之前也踩过这坑,vLLM默认会预留一点显存给torch缓存和碎片,实际可用比nvidia-smi看到的要少,尤其双卡时通信缓冲还会再吃一块。你试试把gpu_memory_utilization调到0.85以下,或者直接用--max-model-len限制一下输入长度,KV Cache占用比想象中膨胀得快。另外7B模型FP16权重虽然14G,但vLLM的pre-allocated显存策略很激进,建议先用transformers原生加载跑通再换vLLM,一步步排除是不是版本问题。量化的话AWQ或GPTQ能省不少,但4090上FP16不至于OOM,先别急着换。
我之前也卡在OOM上,后来发现不是显存总量的问题,是碎片化。vLLM会预留一整块连续显存给KV Cache,你两张卡虽然各24G,但如果每张卡都被其他进程占掉几个G,可用显存就变成碎片了,它没法用不连续的块。你可以试试把CUDA_VISIBLE_DEVICES设成只用一张卡,然后加--gpu-memory-utilization 0.9,强制让它用满90%显存,别让它自己默认预留太保守。还有,检查下是不是用了最新的vLLM,0.6版本之后对显存管理改过很多,有时候回退到0.4.2反而稳,特别是Qwen2.5这种新架构,老版本兼容性反而好。量化的话,FP16本身就够,除非你开长上下文,不然别上AWQ,那个在4090上速度反而不如原生FP16。另外,你确认过NCCL_P2P_DISABLE这个环境变量没?双卡时如果PCIe带宽不够,它会尝试用NVLink通道,有时候会额外吃显存做通信缓冲,把它设成1能省不少。最后,看下是不是HuggingFace缓存目录满了,torch会在/tmp写临时权重文件,磁盘满也会报OOM的假象。
老哥试试加--gpu-memory-utilization 0.85,vLLM默认会预留显存给KV cache,爆了很正常。
老哥试试把gpu_memory_utilization调低点,vLLM默认会吃满显存,留点余量给CUDA context。
之前遇到类似情况,换回0.6.x版本就好了,新版对多卡调度有点坑。
显存碎片化了吧,4090跑7B不该这样,试试把gpu_memory_utilization调低到0.85,或者换个旧版vLLM。
之前也卡过这步,7B没那么吃显存,但vLLM默认会预留挺多显存做KV Cache和CUDA context,尤其是多卡的时候,两张卡之间同步开销也可能触发OOM。建议先试下把gpu_memory_utilization调到0.6左右,再关掉tensor parallel只用单卡跑,看看能不能起来。量化倒是其次,FP16本身没问题,先排除环境问题再说。另外版本太新确实有雷,我换回0.6.x就稳了,你也可试试。
显存够不够不能光看模型权重,vLLM默认会按max_model_len预留很大一块KV cache,7B模型就算14G权重,context开个32k照样能吃满24G。你试着把--max-model-len降到8192或者4096看看,另外两张4090之间用NVLink的话张量并行开2,不然单卡反而会fork出更多额外开销。之前我也遇到过类似情况,最后是发现paddlepaddle的进程在偷吃显存,nvidia-smi只看得到占用,但vLLM启动时算的是全部可用显存。
八成是vLLM默认给每卡预留了全部显存,你把gpu_memory_utilization调到0.85试试,我上次就这么解决的。
遇到过,vLLM这玩意儿默认会预分配一整块显存,你看到的14G只是权重,实际运行起来峰值轻松上20G,两张卡还得开张量并行才稳。另外检查下是不是有别的服务在占显存,nvidia-smi看的是整卡占用,但vLLM自己会额外吃不少碎片。建议先加--gpu-memory-utilization 0.9,再不行就换AWQ量化,4bit能省一半多。版本太新确实容易踩坑,我退回0.6.3就稳了。
显存碎片化或者vLLM预分配太激进吧,试试P2P和KV Cache比例调下,或者换transformers先跑通。
试试把张量并行关掉换流水线并行,vLLM新版本对双卡调度有坑,我前两天刚踩完。
显存够但爆了大概率是碎片化,试试把max-model-len调低点,vLLM吃显存比想象狠。
显存碎片和上下文预留都查过没?vLLM默认会吃满整卡显存,试试--gpu-memory-utilization设0.9。
vLLM默认会按最大序列长度预分配KV cache,7B模型虽然权重14G,但max_model_len如果设太高,KV cache直接吃满24G,你调max_num_seqs其实没动到核心参数。试试显存清零后设--max-model-len 4096,再把gpu_memory_utilization降到0.8,应该能跑起来。另外检查下是不是开了--enable-prefix-caching,这玩意也会额外占显存。版本太新也可能有问题,我上次就是回退到0.4.2才稳。
大概率是vLLM的缓存机制在作妖,不是量化问题。你单卡跑的时候,如果设了--tensor-parallel-size 2,它还是会尝试加载两卡权重,直接爆显存。改成1试试,同时--kv-cache-dtype选fp8能省不少空间。我之前跑13B都够,你这7B卡住多半是参数没调对,别死磕换版本。