最近在折腾本地部署,用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 条这情况我也踩过坑,当时差点把显卡驱动重装了。7B模型FP16推理14G显存只是理论值,vLLM实际加载时还会额外吃不少内存用于调度和缓存,加上你两张卡之间通信也得占显存,实际占用可能奔着20G去了。另外有个容易忽略的点——你检查下vLLM的版本,我遇到过0.4.x某个版本对Qwen2.5支持有问题,换回0.3.x或者更新到0.6.0之后直接好了。量化方式也是个思路,试试用AWQ或者GPTQ的4-bit版本,显存能压到10G以内,速度影响不大。还有个小技巧:启动时加个——cpu-offload-gb 4,把部分KV cache放CPU内存里,虽然慢点但至少能跑起来。如果还崩,可以先用transformers原生加载跑一次,排除是不是vLLM本身的问题。别灰心,7B模型部署就是玄学,调通一次后面就顺了。
这问题我折腾过,vLLM确实有时候对显存预分配比较激进,可以试试把--gpu-memory-utilization调低到0.85左右,或者换用Hugging Face原生的transformers跑一下排除软件问题。另外7B模型FP16推理虽然理论14G,但实际加载时还有分词器、优化器状态等隐性开销,两张卡的话注意设置tensor parallel时要确保每卡显存独立够用。
这问题我上周刚踩过坑,简直一模一样。两张4090看着显存大,但vLLM默认会预分配大量显存给KV Cache,尤其是开启了PagedAttention之后,实际占用比理论值高不少。你可以试试把--gpu-memory-utilization调低到0.7甚至0.6,别让它一股脑把显存吃满。另外Qwen2.5-7B对GQA的支持其实有点迷,有些版本的vLLM在非官方支持的量化方式下会额外申请缓冲区,导致OOM。我最后是换成了AWQ量化版本,配合4bit推理,显存直接降到8G左右,跑得稳得很。你检查下是不是Tensor Parallel时跨卡通信占用了额外显存,那个很容易被忽略。还有个小细节:如果服务器上跑了桌面环境或者监控软件,光看nvidia-smi的进程列表不一定准,用fuser -v /dev/nvidia*查一下谁在占显存更干净。vLLM最新版确实有内存泄漏的issue,降级到0.5.x试试,我在这版本上没再崩过。
你这情况我太熟了,之前部署llama3-8b也卡在同样位置,后来发现根本不是显存总量的事,是vLLM默认给每个sequence分配的显存buffer太夸张了,尤其你开了GQA之后KV cache的显存占用算法会变,建议直接看日志里gpu_memory_utilization那一栏,默认0.9其实很坑,你得手动设成0.6试试。另外4090的驱动和vLLM版本兼容性问题也大,新版vLLM对sm_89架构有时候会异常预留显存,建议直接降到0.6.3或者0.5.5这种稳定版,别追新。还有你检查下是不是用了--tensor-parallel-size 2,两张卡通信要占额外显存,单卡跑7B其实完全够,先单卡加--max-model-len 2048把长度砍半,肯定能起来。量化的话FP16没问题,别急着上AWQ,先把基础跑通再说。最后提醒下,nvidia-smi显示的占用是动态的,你清空后半分钟才崩,八成是vLLM初始化时候预分配了所有可用显存,然后跟CUDA context抢内存,你把--gpu-memory-utilization设成0.45再试试,我这么调完就没再OOM过。
之前用vLLM跑7B也遇到过类似问题,后来发现是默认的KV Cache分配策略太激进了,直接把剩余显存全吃了。你试试加个--kv-cache-dtype fp8或者手动设--max-num-seqs再配合--gpu-memory-utilization 0.8,别全清空,留点给CUDA context。vLLM新版本确实有些坑,我降到0.5.4就稳了。量化的话7B没必要上AWQ,FP16够用,先排除你显存是不是被别的服务占着没释放干净。
vLLM的预分配机制挺坑的,它默认会按最大并发和序列长度去预留显存,7B模型加默认4096的max_model_len,光KV cache就能吃满10G+,加上CUDA context和碎片,24G单卡其实很紧张。建议把gpu_memory_utilization调到0.85以下试试,同时显存里别留其他进程,另外降级到0.6.x版本可能更稳,新版对PagedAttention的改动确实容易出幺蛾子。还有,你用的FP16是torch.float16还是半精度权重?如果是从HuggingFace直接加载的,记得看下config里的torch_dtype,别被自动转成fp32了。
你这情况我上周刚踩完坑,多半不是vLLM版本问题,而是显存碎片化和CUDA context占坑。7B模型虽然权重14G,但vLLM默认会预分配大量KV cache和paged memory,两张卡加起来实际要吃掉40G左右。建议先试试--gpu-memory-utilization 0.6,强制限制显存占用,再不行就换llama.cpp或者SGLang对比一下。另外确认下CUDA版本和驱动是否匹配,4090太新了,旧驱动会有诡异的OOM。
我遇到过类似的,最后发现是vLLM的pre-allocated memory机制在作怪,它不光加载权重,还会为每个request预留一块连续显存。你调低max_num_seqs确实有效但还是崩,大概率是卡间通信的buffer也占了显存。建议用--enforce-eager模式关掉CUDA graph,能省不少显存,或者直接上AWQ量化版,4bit跑起来稳得很。
这问题我也卡过两天,最后是看官方issue才明白,vLLM 0.5版本后默认开启chunked prefill,会把显存切成固定块,如果你没设置--max-model-len,它默认按4096算,但Qwen2.5实际需要更多。先把--max-model-len降到2048试试,另外检查下是不是有
显存碎片和CUDA context占坑真能把人搞疯,你这配置跑7B绰绰有余,试试先设GPU=0单卡加--gpu-memory-utilization 0.9,再不行就换transformers直接加载对比下。
遇到过,vLLM新版本对多卡分配有坑,先把CUDA_VISIBLE_DEVICES设成单卡,再手动设KV cache比例,八成能跑起来。
你这情况我上周刚踩过一模一样的坑,最后发现是vLLM默认的KV cache预留策略太激进了,即使显存够也会先预留一大块导致OOM。你试试启动参数加--kv-cache-dtype fp8_e5m2,或者直接--max-num-seqs调成8以下,能缓解不少。另外4090的驱动和CUDA版本不匹配也会触发假OOM,建议先nvidia-smi确认下驱动是不是535以上。还有个小概率但别忽略的点,检查下是不是有别的进程占用了统一内存,用nvidia-smi --query-compute-apps=pid,used_memory看看。
4090的显存带宽跑7B其实有点虚,可能是碎片化分配问题,试试PagedAttention或者升级vLLM到最新版。
试试把gpu_memory_utilization调低到0.8,vLLM默认会预分配全部显存,和别的进程抢就炸了。
先看下是不是vLLM默认给两卡都分配了显存,试试CUDA_VISIBLE_DEVICES=0只留一张卡,顺便加个--gpu-memory-utilization 0.9参数。
遇到过,先看下是不是CPU内存swap把显存挤爆了,vLLM默认预分配很大。
或者试试降低gpu_memory_utilization到0.8,我调完就好了。
你这情况我太熟了,之前跑13B也这样,问题多半不在量化,而是vLLM默认会预分配显存给KV cache,哪怕max_num_seqs调低也照样吃满。你试试设--gpu-memory-utilization 0.6,再配合--max-model-len 2048,能省一大块。另外两张4090的话,如果单卡能放下就别开tensor parallel,卡间通信也会占额外显存。还有,vLLM新版本偶尔有显存碎片bug,换0.6.3这种稳定版说不定就通了。
遇到过,而且就是4090双卡跑的Qwen2.5-7B。你这情况大概率不是显存总量问题,是vLLM默认把KV Cache预分配得太狠,加上CUDA context本身吃几百M,两张卡还得均分,单卡24G其实很紧。试试启动参数里加--kv-cache-dtype fp8_e5m2或者--gpu-memory-utilization 0.85,别让它全占。另外vLLM更新到0.6.3之后有个显存碎片优化,老版本确实容易莫名OOM,建议直接升到最新版再跑一次。
量化方式倒不是关键,FP16够用,除非你开长上下文。还有个小坑,如果你用了PagedAttention,记得把--max-model-len设短一点,默认8192对7B来说KV Cache占得比你想的多。我上次就是没限制这个,半分钟稳定爆。你清完显存再试,应该能跑起来。
我也遇到过类似的坑,后来发现是vLLM默认会给每个序列预留很大比例的KV cache,就算你调低max_num_seqs,显存碎片化也会导致OOM。你可以试试显存利用率设成0.8,或者干脆用--max-model-len把上下文长度砍到2048,能省不少。另外检查下CUDA_VISIBLE_DEVICES是不是真的只映射了一张卡,有时候驱动会偷偷占一些显存。量化的话FP16没问题,要是还不行就换TGI试试,vLLM某些版本确实有显存分配bug。
试试开--gpu-memory-utilization 0.9限制显存占用,vLLM新版默认预留太多,我上次也是这么解决的。
显存占用得看torch预留和碎片化,试试降低gpu_memory_utilization或者换旧版vLLM,多半是版本坑。
检查下CUDA_VISIBLE_DEVICES是不是只认了单卡,另外量化用AWQ试试,FP16加长上下文确实容易顶爆。
先看下是不是vLLM默认预分配了全部显存,加个--gpu-memory-utilization参数限到0.9试试,我之前就是这么解决的。
说实话你这情况我太熟了,上周刚被同款问题折磨过两晚上。vLLM最近几个版本对显存预分配策略改得挺激进,它默认会按最大并发数把KV Cache全占满,哪怕你max_num_seqs调低了,它内部还有gpu_memory_utilization这个参数在作怪,默认0.9直接吃掉20多G。你试试启动时加个--gpu-memory-utilization 0.6,然后--max-model-len设个1024或2048,别让它按默认的4096去算。另外你提到单卡也崩,那大概率不是双卡通信问题,而是Qwen2.5-7B的attention实现跟vLLM某个版本有冲突,我后来换成0.6.3.post1就稳了,你如果用的是0.7以上,建议直接降级。还有个小坑,nvidia-smi看着显存全空,但其实有CUDA context占着虚拟显存,你得用nvidia-smi --query-compute-apps=used_memory --format=csv看清楚到底哪个进程在吃。最后问一句,你用的量化是GPTQ还是AWQ?如果是FP16硬跑,那14G只是权重,激活值峰值能冲到18G以上,3090和4090都容易卡在边缘,换个4bit量化可能直接就通了。