最近在折腾本地部署,用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预分配策略的问题。你试试把gpu_memory_utilization调低到0.8,然后关掉所有其他进程再跑,有时候NCCL初始化会额外吃不少显存。另外7B-FP16实际峰值不止14G,光权重就要15G左右,加上CUDA context和KV cache,单卡24G其实挺紧的,建议直接用AWQ量化版,4bit跑起来舒服很多。vLLM版本的话,0.6.x有个已知的显存泄漏bug,换个稳定版比如0.5.5试试,我上次就是降版本解决的。
我之前也卡在这儿过,后来发现是vLLM默认给每个序列预留的KV cache太贪了,你试试把--kv-cache-dtype改成fp8_e4m3,或者手动设--gpu-memory-utilization到0.85,别让它自动算。另外双卡的话注意下张量并行是不是真的生效,有时候环境变量没配对会变成每张卡都塞完整模型,那必炸。实在不行换个老点的版本,0.6.3我记得挺稳的。
4090的48G跑7B都OOM,八成是vLLM默认把KV Cache吃满了,设下gpu_memory_utilization试试。
我之前也卡这过,后来发现是vLLM默认给每个sequence预留的显存太激进了,你把gpu_memory_utilization手动设到0.85试试,别让它自动算。另外4090的驱动和CUDA版本对vLLM新版本兼容性有点玄学,我换回0.6.3.post1就稳了。量化倒不急,先看看是不是P2P通信或者NVLink把显存也算成开销了。
我之前也踩过类似的坑,而且也是vLLM,后来发现根本不是显存总量的问题,是碎片化。你两张4090虽然一共48G,但vLLM默认会给每个卡预留一部分显存做KV cache和算子缓冲,再加上CUDA context和cuDNN那些,实际可用可能就20G出头,7B FP16权重都14G了,剩6G跑KV cache对于长序列确实容易爆。你可以试试把gpu_memory_utilization调低到0.7左右,别用默认值,这个参数在vLLM里特别关键。另外,量化方式我建议直接上AWQ或者GPTQ的4bit版本,显存占用能降到6G,剩下空间给KV cache就很宽裕了,FP16跑7B其实挺浪费的,尤其4090上速度又不是瓶颈。还有你说单卡也崩,那大概率不是显存不够,而是vLLM版本和CUDA版本不匹配,我之前用0.4.2配CUDA 11.8就正常,升到0.5.0直接OOM,换回老版本就好了。最后建议你启动前先跑一下nvidia-smi看下有没有别的进程占显存,比如桌面环境或者别的docker,有时候Jupyter也会偷偷吃几百M。实在不行就换个推理框架,比如TGI或者llama.cpp,虽然慢点但内存管理更稳。
我之前也被这玩意坑过,最后发现是vLLM的pre-allocated显存机制太激进,默认会预留一部分给KV cache以外的buffers,建议试试设gpu_memory_utilization=0.8,别让它自己猜。还有你这环境如果是CUDA 12.1以下,vLLM新版本确实有兼容问题,要么换0.6.3,要么干脆用transformers+accelerate先跑通。另外7B FP16理论14G没错,但实际推理时activation峰值能冲到接近18G,4090单卡真不够,得两张卡做张量并行,别抱侥幸心理。
我之前也踩过这坑,vLLM新版本对显存预分配很激进,哪怕模型本身够,它也会把剩余显存全吃进KV Cache的预留里。你试试设个--gpu-memory-utilization 0.7,强制限制一下比例,别让它默认往上探。另外两张4090的话,NVLink带宽和PCIe差异挺大,先单卡纯CPU offload跑通再上多卡。量化方面FP16没问题,别换AWQ,那个反而容易因为反量化报怪错。
检查下vLLM的gpu_memory_utilization参数,默认0.9容易爆,调成0.7试试,另外双卡记得开tensor-parallel-size 2。
试试把tensor parallel size设成1,然后手动设一下gpu_memory_utilization到0.85,别让它默认全吃满。之前我也碰到过类似情况,后来发现是vLLM默认会预留一部分显存做CUDA context,加上其他进程残留,实际可用比你算的少很多。另外确认下是不是用了最新版,有些版本对多卡调度有坑,回退到0.6.x可能更稳。
显存占用得看实际峰值,vLLM默认会预留不少显存给KV cache和CUDA context,14G只是纯权重,加上缓存和碎片轻松破20G。两张卡记得设tensor_parallel_size=2,但也要看是不是双卡通信初始化就吃掉了大半显存。建议先用transformers原生加载试试排除vLLM的问题,另外换一下gptq或awq量化版本说不定有惊喜。我上次也是4090跑7B,最后发现是CUDA版本和vLLM不匹配,降一版就好了。
显存碎片化吧,4090上跑7B不该这么脆,试试先清干净环境再上PagedAttention。
我之前也踩过这个坑,搞了半天发现根本不是模型本身的问题。你看一下vLLM的日志,是不是有“Unable to allocate”这种提示,然后后面跟了个具体数字?那个数字往往比你预估的14G大得多,因为vLLM默认会为每个序列预留很大的KV cache空间,而且还会把CUDA context、torch的缓存都算进去。你先试试把--gpu-memory-utilization调到0.8以下,再配合--max-model-len降到2048,大概率能跑起来。另外你说的显存被其他进程占,这个真的很坑,我后来习惯在启动前先跑个nvidia-smi --query-compute-apps=pid,used_memory --format=csv看下是不是有僵尸进程,尤其是之前崩过的python进程会卡着显存不释放。至于量化,FP16其实没问题,你要是想省显存可以换AWQ或者GPTQ的4bit版本,但7B模型用BF16加上KV cache优化,两张4090应该绰绰有余。版本太新确实可能有bug,我上次用0.6.3就莫名其妙OOM,退回0.5.5就好了,你可以试下换个稳定版本。最后一个小建议,如果单卡也崩,先单独跑个最简单的hf的from_pretrained脚本,排除是不是vLLM的分配策略问题。
我之前也遇到过类似情况,结果发现是vLLM默认会为每个序列预留很大的KV cache空间,7B模型实际峰值占用比理论值高不少,尤其双卡时显存分配不均衡也会触发OOM。你可以试试加--kv-cache-dtype fp8或者手动设置--gpu-memory-utilization到0.8,别让它全自动分配。另外确认下CUDA版本和vLLM是不是匹配,新版有时候会抽风,回退到0.6.x更稳。我最后是换了AWQ量化才跑通的,速度还更快,你可以参考下。
显存够不够得看碎片化,4090上跑7B建议开--gpu-memory-utilization 0.9试试,vLLM新版经常预分配太猛。
遇到过类似的坑,不是显存总量的问题,是vLLM默认给每个请求预留的KV Cache和中间激活层太吃显存了,你试试把gpu_memory_utilization调到0.8以下,再把max_model_len砍到2048看看。另外4090的驱动和CUDA版本不匹配也会出这种玄学OOM,先排除这个。量化方式倒是不用急,FP16本身没问题,等能跑起来再折腾AWQ也不迟。
遇到过类似的坑,7B模型在vLLM里显存开销其实比你想的要高不少,除了权重和KV Cache,还有激活值、CUDA context和碎片化预留,14G只是纸面数据。建议先用--gpu-memory-utilization 0.9把显存利用率拉满,再试试--max-model-len设个512或1024,把KV Cache压到极限看能不能跑起来。另外你两张卡的话,vLLM默认会做张量并行,但跨卡通信也会吃额外显存,单卡崩很可能是context没清干净或者驱动残留,先重启下服务器再只指定单卡试试。如果还是不行,换个旧一点的版本比如0.4.2,新版有时候确实会抽风。
我之前也卡在过这步,折腾半天发现是vLLM默认会预留一部分显存给torch的缓存池,不是实际占用,nvidia-smi看着够但CUDA context一开就超了。你试试设--gpu-memory-utilization 0.85,把预留比例压低点,另外两个4090之间如果开了NCCL通信,每张卡还得额外留出几百MB做peer-to-peer,别卡太死。还有个坑是Qwen2.5的GQA在vLLM某些版本里实现有问题,会额外放大KV cache的显存估算,建议直接降级到0.5.4或者升到0.6.3,我换版本后立刻就正常了。量化方式其实不必急着上AWQ,FP16本身没问题,先确保--max-model-len别设太高,4090跑7B建议从4096起步调,有时候默认的32k会直接炸。最后检查下是不是有别的python进程在偷偷占显存,fuser -v /dev/nvidia*能查到,我之前就是被jupyter notebook的kernel坑了。反正别全信显存余量,vLLM的日志里会打印实际分配情况,那个才准。
显存碎片化试过没?先开个空进程占满显存再启动vLLM,有时能避开分配问题。
这问题我上周刚踩过一模一样的坑,最后发现是vLLM默认会预分配整个显存池,哪怕你设了gpu_memory_utilization=0.9,它也会把两张卡都占住,其中一张卡只要有点碎片就崩。你试试启动参数加个--tensor-parallel-size 1,然后明确指定只用单卡,同时把--max-model-len砍到4096,能省出不少KV Cache空间。另外别用最新版vLLM,0.6.3之前的版本对Qwen2.5支持反而稳,我降级后就没再报过OOM。量化的话FP16没问题,除非你想塞更长上下文,不然别折腾GPTQ或AWQ,那些反而会引入额外显存开销。还有个隐蔽点,检查下是不是有进程偷偷占了HBM,比如显卡驱动自带的持久化线程,用fuser -v /dev/nvidia*看看。如果还不行,试试把swap打开,虽然慢但至少能跑起来排查问题。
检查下是不是vLLM默认给每张卡都分配了完整内存池,设个gpu_memory_utilization试试,之前我降到0.8就好了。