各位大佬好,最近在折腾本地部署,用的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,显存明明够用是为什么?
全部回复
共 42 条我之前也踩过这个坑,后来发现大概率是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。
我之前也遇到过一模一样的坑,vLLM其实会在启动时预分配KV cache,0.9的利用率对24G卡来说反而容易踩到CUDA context的保留内存,建议先直接用默认值试试。另外检查下是不是用了最新的transformers,vLLM对版本很敏感,锁到4.40左右比较稳。FP16其实没问题,7B模型大概14G,理论上够用,但如果你开了--enforce-eager可能会好点,别急着上量化。最后可以试试把--max-model-len再调小到1024,同时加--swap-space 0,我以前这么弄就好了。
我之前也遇到过一模一样的情况,4090跑7B按理说绰绰有余。后来发现是vLLM的paged attention预分配机制在搞鬼,它会把CUDA context和KV cache都算进显存预算里,你看到的几百MB空闲可能被系统保留了。建议先试试把--gpu-memory-utilization降到0.7,同时加上--enforce-eager禁用CUDA graph,这个组合拳对OOM特别管用。
另外别急着转量化,FP16跑7B在24G卡上完全够,你先把vLLM升到0.6.x以上版本,旧版本对Qwen2.5的attention mask处理有bug,会莫名多占显存。如果还不行,看看是不是开了多个进程占显存,用fuser -v /dev/nvidia*查一下。
我之前也卡在过这个坑,最后发现是vLLM默认会预分配KV cache,虽然你设了0.9但实际启动时还要额外留一部分给CUDA context和碎片,建议先试试把gpu-memory-utilization调低到0.8,同时加上--enforce-eager关掉CUDA graph试试。另外你用的transformers版本如果太新(比如4.46+),和vLLM 0.6.x确实有冲突,我换回4.44.2就稳了。FP16本身不是问题,4090跑7B完全够,不用急着量化,先把环境对齐再说。
换个思路,你nvidia-smi只看到几百MB占用是因为进程还没真正起来就崩了,实际是vLLM在初始化时尝试一次性分配整块显存,而24G里可能有部分被别的服务或桌面环境占了(比如Windows下DWM会吃几百M),加上CUDA的reserved memory,实际可用不到22G。你可以先跑个简单的torch测试看最大能分配多少,如果只有20G左右,那9成是驱动或BIOS里resizable bar没开,vLLM对显存碎片特别敏感。另外别用--max-model-len硬压,反而会触发重新计算,试试直接指定--block-size=16或者升级到最新vLLM 0.7.2,
碰到过类似情况,先别急着量化,问题大概率不在权重精度上。4090跑7B的FP16理论上是够的,但vLLM有个坑是它默认会预留一部分KV cache和CUDA context,加上你设的0.9利用率,实际可用显存可能比nvidia-smi看到的空闲值要保守得多。你可以试试把gpu-memory-utilization降到0.6以下先跑通,看是不是能正常加载,如果能的话再逐步往上调,我怀疑是某个驱动或CUDA版本跟vLLM的显存管理逻辑冲突了。另外transformers版本太新确实有概率跟vLLM的paged attention不兼容,建议直接看下你当前vLLM版本对应的requirements,把transformers锁到它要求的范围内,别用最新版。还有个小细节,你启动命令里有没有加--enforce-eager?没加的话vLLM会尝试用CUDA graph优化,那玩意儿在4090上有时会突然多占几个G的显存,关掉之后经常能解决这种“看得到吃不到”的OOM。如果还是不行,那就再检查下是不是开了多个进程或者有别的程序偷偷占显存,比如浏览器硬件加速之类的,先排除干净再说。量化确实能降显存,但那是最后的手段,因为7B模型部署到4090上没必要牺牲精度,先解决环境问题更划算。
我之前也碰到过一模一样的情况,后来发现是vLLM版本和CUDA版本不匹配导致的,你试试用官方推荐的vllm容器镜像跑一下,基本能避坑。另外FP16加载7B其实24G应该够,但如果你是同时跑着别的进程占显存,哪怕nvidia-smi看着少也会冲突,建议把--gpu-memory-utilization降到0.8再加个--enforce-eager试试。量化倒不急,先把环境对齐了再说,AWQ后续再折腾也不迟。
我之前也踩过这个坑,最后发现是vLLM和CUDA的版本匹配问题,尤其你用的4090如果驱动够新但PyTorch的CUDA runtime偏旧,显存分配会出奇怪的冲突。建议先确认下vllm的版本,0.4.0以后对transformers的依赖很敏感,最好直接建个干净的新环境装最新版,别跟其他项目混着。另外你设置gpu-memory-utilization=0.9时,vLLM会预留一部分KV cache,但FP16的7B模型权重本身就占大概14GB,加上激活和临时buffer,如果还开了prefix caching或者并发数默认值很高,其实24G非常紧张,不是光看nvidia-smi空闲显存就够的。量化倒不是必须,我试过直接加载FP16但把--max-num-seqs调成1,--max-num-batched-tokens设到4096,反而能跑起来,虽然慢但至少不OOM。你可以先跑一下最简单的命令,比如只加--model和--gpu-memory-utilization=0.85,别的都别加,看能不能正常加载,如果还报错就查下vllm的日志里具体是在哪个阶段爆的,是权重映射还是CUDA context创建,这俩解法完全不一样。还有个小技巧,设环境变量VLLM_ATTENTION_BACKEND=FLASH_ATTN,有时候能绕过一些显存碎片问题,但前提是你装了flash-attn,别用默认的xformers。如果实在搞不定,先用transformers原生加载跑通,再回来排查vLLM,毕竟工具是死的,模型是活的。
之前也踩过这个坑,4090跑7B理论上很宽裕,问题多半出在vLLM的显存预分配机制上,它会把CUDA context和KV cache一起预留,你nvidia-smi看到的几百MB其实是加载前的状态。试试先升级vllm到最新版,然后启动时加--enforce-eager参数关掉CUDA graph,能省下不少碎片显存。另外确认下是不是开了多个进程占着显存,或者驱动和CUDA版本不匹配,有时候报OOM但实际是驱动层的坑。量化暂时不急,FP16应该够跑,先把环境问题解决了再说。
这问题我上个月刚踩过坑,折腾了两天才发现是vLLM版本太老导致的。你先把vllm升到0.6.3以上试试,旧版本对Qwen2.5的attention实现有bug,会预分配超量显存。另外别一上来就上FP16,虽然24G看起来够,但vLLM默认会留KV cache的余量,实际峰值占用能到20G+,加上CUDA context和碎片,很容易触顶。我用的办法是先--quantization awq加载4bit版本,显存直接降到8G左右,稳得很。还有个小细节,你nvidia-smi看的是空闲显存,但vLLM启动时会瞬间申请一大块连续内存,如果系统里其他进程占了点碎片空间也会失败,建议先关掉所有GUI和浏览器再试。至于transformers兼容性,vLLM是自带kernel的,不太依赖它,但最好把transformers也升到4.45以上。最后说下max-model-len,这个不是调小就能解决的,它影响的是KV cache上限,如果你输入长度很短,反而应该调大一点让vLLM别预留太多空间,试试设成4096配合gpu-memory-utilization=0.95。如果还不行,直接换exllama2或者llama.cpp,别死磕一个框架。
4090跑7B按理说很轻松,检查下是不是vllm版本旧了或者和cuda不匹配,换个版本试试。
我之前也踩过这个坑,4090跑7B按理说完全没压力。你试试把--gpu-memory-utilization降到0.85以下,有时候vLLM预分配和CUDA context有冲突,留点余量反而能跑。另外检查下是不是有别的进程占着显存,比如浏览器或者之前的python进程没杀干净,nvidia-smi显示的几百MB可能只是表面。量化确实能缓解,但我觉得先别急着转AWQ,你换个老一点的vLLM版本试试,0.6.x和transformers 4.44的搭配我这边是稳的。
我之前也遇到过一模一样的情况,4090跑7B按理说绰绰有余,后来发现是vLLM在初始化的时候会预分配KV cache,而它默认的显存计算方式有时候会跟驱动或者别的进程抢资源。你nvidia-smi看的是实时占用,但vLLM启动时可能一次性申请了整块显存,表面看只有几百MB在用,实际是分配失败导致的假性OOM。建议先试试把--gpu-memory-utilization降到0.7,同时加上--enforce-eager模式,这能跳过CUDA graph的预编译,有时候是这块在吃显存。另外你提到FP16,其实7B的FP16权重也就14G左右,24G完全够,问题大概率不在量化上,可以先不折腾AWQ。还有个小坑,如果你用的vLLM版本比较旧,跟新版transformers的Qwen2.5系列确实存在兼容问题,试试升级到0.6.3以上的vLLM,或者干脆用官方推荐的镜像。最后建议你把启动日志贴出来,看看具体是卡在哪个阶段,是加载权重还是构建cache时爆的,这样比较好定位。
遇到过一模一样的情况,4090跑7B按理说富余得很,结果vLLM直接爆显存,当时排查了半天。你那个显存占用只有几百MB其实是假象,因为CUDA context和碎片化内存没算进去,真正的问题是vLLM预分配策略跟4090的驱动或CUDA版本不匹配。我后来把vllm升级到0.6.3.post1,同时把transformers锁到4.44.2,问题直接消失了,你可以先试试这个组合。另外你提到FP16权重,其实7B模型FP16也就14G左右,24G卡完全够,不用急着量化,关键是别开--gpu-memory-utilization太高,0.9会让vLLM尝试预分配整个可用显存,反而触发某些环境下的分配失败,改成0.85或者干脆不设这个参数让它默认。还有一个坑是如果你开了--enforce-eager,它会绕过CUDA graph优化,但某些版本反而会额外吃显存,建议去掉。最后检查下是不是有残留的python进程占着显存,nvidia-smi看不到但torch能看到,用fuser -v /dev/nvidia*查一下最稳。
24G跑7B的FP16确实挺紧的,权重就占14G左右,剩下全给KV cache和激活值了,0.9的utilization可能把预分配拉太满直接炸了。先试试降到0.8或者0.85看看能不能起来,另外nvidia-smi那几百MB是没算上vLLM预分配的,别被那个数字骗了。max-model-len调小只是减KV cache,权重加载阶段就OOM的话问题不在这。实在不行上AWQ,4bit量化后显存压力小很多,4090跑起来会舒服不少。
4090跑7B FP16理论上是够的,但vLLM启动时会先预分配KV cache,你看到的几百MB是还没到那一步就崩了。试试把gpu-memory-utilization降到0.85,再确认下有没有其他进程占着卡,有时候jupyter或者之前的残留进程会偷偷吃显存。max-model-len调小确实有用,但2048还OOM的话感觉更像是环境问题,检查下torch和vllm版本对不对得上。实在不行直接上AWQ量化版,4090跑起来轻松很多,精度损失也不大。
试试设 --max-model-len 4096 并把 --gpu-memory-utilization 降到 0.85,7B 的 FP16 光权重就快 15G 了。