最近在折腾本地部署,用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 条这情况我上周刚遇到过,也是4090双卡跑7B,最后发现是vLLM默认的memory预留策略太激进,得手动设一下gpu_memory_utilization,我调到0.9就稳了。另外建议检查下CUDA版本,12.1以下对Hopper架构支持有点问题,容易虚报OOM。量化的话FP16够用,不用急着动,先把预分配调好试试。
我也遇到过类似情况,后来发现是vLLM默认会预留一部分显存给调度和碎片,实际可用比nvidia-smi看到的少好几G。可以试试把--gpu-memory-utilization调到0.85甚至更低,或者换用--enable-chunked-prefill,这俩能缓解不少。另外检查下Qwen2.5的tokenizer是不是自动加了特殊padding,有时候会隐性拉长序列导致OOM。
试试把vLLM降级到0.4.2版本,新版对多卡分配策略有改动,我这换旧版直接稳了。
我之前也遇到过类似的情况,后来发现是vLLM的默认内存预留设置太高了,可以用--gpu-memory-utilization参数手动调低到0.85试试。另外4090的显存虽然大,但P2P带宽有限,双卡跑推理时数据传输也会吃显存,建议先单卡跑一下排除这个因素。还有检查下CUDA版本和vLLM的兼容性,我上次降级到0.4.2版本就稳定了。
我前几天也踩过这个坑,vLLM新版本确实有显存预分配的bug,可以试试把--gpu-memory-utilization降到0.85以下,或者回退到0.4.x版本。另外4090的显存带宽对7B模型其实有点紧,你检查下是不是开了自动混合精度或者动态batching,这些默认配置有时候会偷跑显存。
试试把vLLM降个版本,我之前用0.5.x也遇到过类似问题,降级就好了。
这种问题我踩过好几次坑,vLLM对显存的占用其实比理论值高不少,尤其是4090这种卡,驱动和CUDA版本之间的兼容性有时候也会暗坑。建议你先检查一下vLLM的版本,0.6.x之后改动挺大的,有些老版本调度器在GQA模式下会多占显存。另外,可以试试用--gpu-memory-utilization参数把利用率降到0.7或0.8,给系统留点buffer,别让它自己估算。还有个小技巧:用torch.cuda.empty_cache()手动清一下缓存再启动vLLM,有时候之前跑过的进程留下的碎片显存没释放干净。如果还是崩,可以换个推理框架跑跑看,比如ExLlamaV2或者llama.cpp的Q4_K_M量化,占用低很多,7B模型大概7-8G就能跑,虽然速度慢点但至少能验证是不是vLLM自己的问题。
vLLM的显存分配策略挺迷的,试试降级到0.4.0版本或者换Transformers直接跑,我上次也是这么解决的。
vLLM默认会预分配很多显存,试试加个--gpu-memory-utilization 0.8参数限制一下。
可能是vLLM的显存预留策略太激进了,试试把gpu_memory_utilization调低到0.85。
我遇到过类似情况,最后发现是vLLM默认的prefill内存分配策略太激进了,你可以试试加个—gpu-memory-utilization参数,手动限制到0.9左右看看能不能跑起来。另外注意一下是不是CUDA版本和驱动不匹配,我上次升级vLLM后也崩过,退一个版本反而稳了。7B模型按理说4090双卡随便带,别急,先排除软件环境问题。
遇到过,vLLM的默认内存分配策略有时候会预留大量显存做管理,不是纯模型占用。试试设--gpu-memory-utilization 0.85或者更低,强制限制一下。另外4090的24G显存其实对7B模型有点紧,建议检查下KV Cache的精度是不是被自动拉到FP16了,换成INT8能省不少。
试试把vLLM的gpu_memory_utilization调到0.85,或者换AWQ量化,这模型吃显存比预期狠。
我也遇到过类似情况,后来发现是vLLM默认的显存预留策略比较激进,加上4090的显存碎片化问题,实际可用比标称少不少。你可以试试手动设置gpu_memory_utilization到0.85以下,或者换成AWQ量化,4bit下7B模型只要6G左右,两张卡跑起来轻松很多。另外检查下vLLM版本,0.5.x有些老版本确实有内存泄漏,升级到0.6.3之后我这边稳定多了。
我之前也遇到过类似情况,后来发现是vLLM默认会预留一部分显存给调度和碎片,实际可用比看到的少很多。你可以试试把gpu_memory_utilization调低到0.85左右,或者换用ExLlamaV2加载,这俩对显存管理更激进。另外Qwen2.5的某些版本对vLLM的兼容性也有坑,建议直接降级到0.5.x试试,我降完就稳定了。
试试把vLLM的gpu_memory_utilization调到0.85,默认预留空间有时候不够用。
遇到过一模一样的坑,后来发现是vLLM默认的gpu_memory_utilization设得太高,0.9其实不够用,降到0.75左右就稳了。另外检查下transformers版本,我升级到4.44后OOM就消失了,感觉是缓存分配的问题。还有你试试用--enforce-eager参数禁用图编译,虽然慢点但能省不少显存。
说实话我也踩过类似的坑,4090 24G跑7B按理说是绰绰有余的,但问题往往出在vLLM的显存预留机制上。vLLM默认会按照最大可能序列长度来预分配KV Cache的显存,如果你max_model_len设得比较高(比如默认的4096或8192),加上你用的是FP16,它会把两卡的显存都吃满来缓存中间结果,实际跑起来反而比理论值更吃紧。你可以试试把gpu_memory_utilization调到0.8或0.7,强制留出一些余量给其他进程,或者用--max-model-len 2048限制一下序列长度,这样通常能缓解OOM。另外,7B模型用FP16跑的话,建议用AWQ或GPTQ量化到4bit或者8bit,显存占用能降到6-7G左右,两张卡甚至能同时跑两个模型。至于vLLM版本,0.6.x之后确实有内存泄漏的issue,可以回退到0.5.5试试,或者换用SGLang跑一下,它对显存管理更激进一些。最后建议你检查下nvidia-smi里有没有残留的python进程或者huggingface缓存,有时候是dataloader或者tokenizer预热时偷偷占了不少显存。
试试把vLLM降到0.4.0版本,我之前用新版跑7B也疯狂OOM,回退就稳了。
我也遇到过类似情况,后来发现是vLLM默认会预先分配整个KV cache空间,哪怕没用满也会吃满显存。试试把--gpu-memory-utilization调到0.8或更低,或者换用--max-model-len限制序列长度,应该能缓解。另外Qwen2.5对flash attention优化挺依赖的,确认下有没有正确安装相关库,有时候版本不对也会隐性吃显存。