各位大佬好,最近在折腾本地部署,用的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,显存明明够用是为什么?
全部回复
共 25 条我之前也踩过这个坑,后来发现大概率是vLLM和CUDA版本或者PyTorch的兼容性问题,尤其是你这种4090新卡,老版本vLLM对Hopper架构支持有bug,会错误预留显存。你可以先试试直接装最新版vLLM,或者换个conda环境用pip重装,别用之前缓存的wheel包。至于FP16转量化,其实7B模型24G显存跑FP16完全够,不用急着上AWQ,量化反而可能掉精度。你观察下启动日志里有没有显示“total GPU memory”和“available memory”,如果显示的数字跟你nvidia-smi看到的不一致,那就是vLLM误判了。另外检查下是不是有其他进程占用了显存,比如Jupyter内核或者别的python进程,有时候nvidia-smi只显示当前用户的部分进程。还有个骚操作,可以先把--gpu-memory-utilization调成0.85再配合--enforce-eager,能绕开一些预分配问题。如果还不行,就试试把transformers降到4.43左右,别追最新版,我上次就是被transformers新版坑了一把。
我之前也踩过这个坑,后来发现大概率是vLLM和CUDA版本或者PyTorch的兼容性出了问题,尤其是你用的4090如果驱动太新或者太旧,vLLM的某些算子在初始化时会申请一大块临时显存,导致明明看着占用低但实际分配失败。你试试把vLLM降到0.4.2或者0.5.0看看,我之前升到0.6.x就各种诡异OOM。另外你提到FP16,其实7B模型在24G上完全够跑,不需要急着量化,先排查环境问题。还有个小细节,检查一下是不是开了多个进程或者有个残留的python进程占着显存,虽然nvidia-smi显示只有几百MB,但有时候显存碎片化严重也会导致大块分配失败。另外--gpu-memory-utilization设0.9反而可能触发问题,你试试默认值或者0.85,因为vLLM会预留一部分KV cache和激活内存,设太高反而跟框架自己预留的冲突。最后建议你直接跑个最简单的官方示例,用transformers加载模型试试是不是同样OOM,如果transformers没问题,那就锁定是vLLM版本的问题了。
我之前也遇到过一模一样的情况,后来发现是vLLM版本和CUDA版本不匹配导致的,特别是12.4以下的CUDA跑新版vLLM很容易出这种玄学OOM。你检查下vllm和torch的版本组合,最好按官方requirements装一套匹配的。另外4090跑7B其实不用量化,FP16完全够,重点是把--max-model-len设成4096或更低,然后别开--enforce-eager试试?如果还不行,可以看看是不是多卡环境变量没清干净,有时候别的进程占着显存但nvidia-smi显示不全。
我之前也遇到过类似情况,后来发现是vLLM的page注意力机制会预分配显存,加上CUDA context本身吃掉的显存,nvidia-smi显示不准。试试把--gpu-memory-utilization调到0.5以下,或者加--enforce-eager禁用图模式,能省不少显存。FP16其实没问题,不用急着量化,但可以留意下是不是vLLM版本太新跟CUDA 12不匹配,换个0.6.x的稳定版试试。你用的vLLM是pip装的还是源码编译的?
我之前也踩过这个坑,后来发现大概率是vLLM版本和CUDA/PyTorch的匹配问题,特别是新版vLLM对CUDA 12.4+和PyTorch 2.5+有强制要求,你检查下是不是用了太新的组合导致显存碎片化严重。另外你观察到的nvidia-smi只显示几百兆其实是个假象,vLLM启动时会一次性预分配大部分显存作为KV cache和activation buffer,这时候如果系统里其他进程(比如桌面环境或者浏览器)占了哪怕1-2G,它就可能直接判定不够用。建议先试试把--gpu-memory-utilization降到0.7,同时加上--swap-space=4让它用一点内存做缓冲,看看能不能先把权重加载进去。还有个小技巧:在启动前用fuser -v /dev/nvidia*查一下有没有残留的Python进程占着显存,我遇到过之前崩溃的进程没完全释放的情况。量化这事不急,FP16跑7B在24G上其实很宽裕,问题多半不在权重精度上。最后如果还不行,干脆把transformers和vLLM都降到官方requirements里指定的版本,我记得有段时间vLLM和transformers 4.46+确实有ABI不兼容的bug,会莫名其妙报OOM。