最近在折腾本地部署,用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降到0.4.2版本,我上次用新版也是莫名OOM,降级后稳得很。
遇到过类似情况,后来发现是vLLM的默认内存预留机制在两张卡上会额外占掉不少显存,试试启动时加个--gpu-memory-utilization 0.85,强制限制一下利用率。另外检查下CUDA版本是否匹配,有些新版本vLLM对11.8以下的兼容性确实有坑。我最后换成了AWQ量化,7B模型直接压到6G左右,稳得很。
vLLM确实有内存分配策略的问题,尤其是新版本默认会预分配一些缓存,可以试试加--gpu-memory-utilization 0.85来限制显存占用。另外7B模型FP16推理虽然理论14G,但实际加载时优化器状态、中间激活值也会吃不少,尤其双卡时通信开销也可能导致临时显存飙升。我之前被类似问题卡过,最后是切了AWQ量化才稳住的,你可以试试4bit量化,显存直接砍半。
这情况我也踩过坑,vLLM默认会预留一部分显存做调度和碎片管理,实际可用比nvidia-smi看到的少不少。建议试试显存分配加个0.9的限额参数,或者换FlashAttention看看能不能省点。另外7B模型用FP16推理理论14G没错,但加上attention层和中间激活值,实际峰值很容易冲到20G+,两张卡的话最好检查下张量并行有没有正确启用。最后可以换一下transformers原生推理先跑通,排除vLLM版本问题。
我也遇到过类似情况,后来发现是vLLM默认的显存预留策略太激进了,有个--gpu-memory-utilization参数,设成0.85左右会好很多。另外检查下是不是用了多卡但不均匀,用CUDA_VISIBLE_DEVICES=0强制单卡跑试试,有时候两卡之间的通信也会额外吃显存。
这问题我也踩过坑,vLLM默认会预分配大量显存作为缓存池,就算模型本身只占14G,它可能一口气吞掉20G+。建议试试把--gpu-memory-utilization调到0.7左右,或者换用--enforce-eager模式禁用CUDA图优化,能省不少显存。另外Qwen2.5的某些版本对vLLM兼容性确实有问题,可以降级到0.6.3试试,我换完就稳了。
同样遇到过这个坑,后来发现vLLM默认的gpu_memory_utilization是0.9,但4090上容易因为碎片化导致实际可用显存比预期小。可以试试把这个参数调到0.7或者0.8,再配合--enforce-eager模式关掉CUDA图优化,能缓解很多。另外确认下用的是最新版vLLM吗,0.6.0之后有个显存预分配的逻辑改动,老版本反而更稳定。
这情况我也遇到过,折腾了一周才发现坑在哪。7B模型FP16理论14G没错,但vLLM的显存分配机制很激进,它会预分配一个很大的内存池,默认可能直接占满单卡24G,加上你两张4090之间通信还得留点余量,实际可用显存比标称少很多。我建议你先试下把tensor-parallel-size改成1强制单卡,再用--gpu-memory-utilization 0.85限制显存利用率,别让它全吞。另外你提到其他进程占显存,可以跑之前用fuser -v /dev/nvidia*查下是不是有残留的python进程没杀干净,我上次就是Jupyter后台偷偷占着2G。至于量化,你可以试试AWQ或GPTQ的4bit版本,显存直接降到7-8G,但vLLM对4bit支持偶尔有碎片问题,建议先用FP16的基础配置跑通再说。vLLM版本的话,0.6.3之后有个batch size的显存泄漏bug,回退到0.5.5可能会稳很多。最后检查下CUDA版本是不是11.8以上,低版本对H100架构的4090调度会有问题。
我遇到过类似的情况,其实很多时候OOM不是模型本身的问题,而是vLLM的预分配策略太激进了。你可以试试在启动时加上--gpu-memory-utilization 0.85或者更低的值,给系统留点缓冲空间。另外,检查一下是不是开了tensor parallelism,两张卡之间通信也会吃显存。还有个小细节,有些版本的vLLM默认会加载FlashAttention,但4090上可能不如手动关闭来得稳。
看到这个我也头大,之前搞7B模型也遇到过类似玄学问题,后来发现是vLLM的内存预分配策略搞的鬼——它默认会吃掉整个GPU的显存pool,哪怕你实际只用14G,它也会先申请24G的预留空间,两张卡就是48G,7B模型那点显存根本填不满这个坑。你可以试试在启动命令里加个——gpu-memory-utilization 0.7,强行限制显存占用比例,或者换成Text Generation Inference(TGI),它的内存分配更保守些。另外Qwen2.5-7B的FP16推理其实可以压到12G左右,但如果你用到了FlashAttention之类的优化库,版本不对也会悄悄爆显存,建议先把所有CUDA相关的环境变量清掉,比如CUDA_VISIBLE_DEVICES只留一张卡,然后跑个最简单的推理脚本看看是不是vLLM本身的问题。还有个小技巧——用nvidia-smi -pm 1把GPU设为持久模式,防止驱动动态回收显存导致误判。实在不行就换llama.cpp量化成Q4_K_M,8G单卡都能跑,虽然速度慢点但起码不报错。
遇到过类似情况,后来发现是vLLM默认会预留一部分显存给调度和碎片化,实际占用比理论值高不少。试试把--gpu-memory-utilization调到0.85以下,或者手动限制max-model-len到2048,能省不少空间。另外检查下CUDA版本和vLLM的兼容性,之前某个版本确实有内存泄漏的bug,回退到0.4.2就稳了。
试试把vLLM降个版本,或者换transformers直接跑,新版vLLM最近确实有显存泄漏的问题。
我前几天也遇到过类似的问题,后来发现是vLLM的默认内存预留策略太激进,可以在启动时加个--gpu-memory-utilization 0.85试试,给系统留点余量。另外7B模型用FP16推理实际吃掉的显存会比理论值多几G,因为还有attention的中间结果和碎片化开销,建议换AWQ量化或者用ExLlamaV2跑,能省不少显存。
这个我踩过一样的坑,而且折腾了快两天才找到原因。vLLM默认会预分配显存池,哪怕你实际推理只用了14G,它可能一启动就占满两张卡的显存作为缓存,尤其是你那个max_num_seqs调小了反而可能触发预分配策略异常。建议你先试试在启动参数里加个--gpu-memory-utilization 0.5,强制限制显存占用比例,看能不能启动起来。另外你提到量化方式,7B模型用FP16其实没问题,但vLLM新版本对Qwen2.5的KV Cache管理好像有优化不到位的情况,我切回0.4.2版本就稳定了。还有个细节,检查下你的CUDA版本和驱动,vLLM对12.1以上的依赖很敏感,我同事降了驱动版本就解决了。最后建议用nvidia-smi的--query-gpu=memory.free实时监控,别只看总显存,有时候系统预留的显存块会让vLLM误判可用空间。
4090双卡跑7B按理说确实没道理炸,但vLLM默认会预留一部分显存做预分配和碎片管理,尤其是新版本可能改了显存分配策略。试试把gpu_memory_utilization调低到0.8或者0.7,再配合--enforce-eager模式关掉CUDA图优化,能省不少显存。另外Qwen2.5的attention结构对显存占用比传统模型敏感,可以换HuggingFace原生的transformers先跑一次看基线占用,排除vLLM自身问题。如果还崩,检查下是不是开了tensor parallel但没正确设置环境变量。
我也遇到过类似的坑,vLLM对显存碎片挺敏感的,建议试试把gpu_memory_utilization设到0.85或者更低,默认0.9有时候会爆。另外你两张卡之间通信会不会有额外开销?可以先用CUDA_VISIBLE_DEVICES=0只跑单卡排除一下多卡问题。
遇到过类似情况,最后发现是vLLM默认会预留一部分显存给调度器,7B模型实际推理时峰值可能接近18G,加上两张卡之间通信也得吃显存。建议试试把gpu_memory_utilization调到0.85以下,或者换下Hugging Face原生的transformers库跑一次,排除下vLLM版本兼容问题。另外检查下CUDA版本,太新的vLLM对驱动要求比较苛刻。
我也遇到过类似的情况,当时用的也是双卡4090跑7B模型,最后发现是vLLM默认的显存分配策略太激进了。它会把两张卡的显存都预留出来做张量并行,哪怕你只用单卡推理,它也会尝试初始化跨卡通信,结果就是每张卡都被吃满。你可以试试加个--tensor-parallel-size 1强行指定单卡模式,或者用--gpu-memory-utilization 0.85手动限制显存占用率,别让它全占了。另外你说看到显存被其他进程占了一部分,建议用nvidia-smi查一下有没有残留的python进程或者jupyter notebook没关,有时候即便你手动kill了,显存释放也会有延迟。还有个小坑是vLLM的某些新版本对Qwen2.5的attention实现优化有问题,我换成0.6.0版本就正常了,你可以降级试试。量化的话7B用FP16其实完全够,除非你同时跑长上下文,不然不用急着上AWQ或GPTQ。最后检查一下你的CUDA版本是否匹配,太新的驱动反而容易触发奇怪的OOM。卡这里确实难受,但排查一圈总能找到原因的。
遇到过,大概率是vLLM的显存预分配策略问题,默认会预留大量显存给调度和缓存,比实际推理需求多不少。可以试试加上--gpu-memory-utilization 0.85或者更低的值来限制显存占用,或者换个框架比如SGLang跑跑看。另外7B模型用FP16确实14G左右,但两张4090跨卡通信也会吃一点显存,建议先单卡跑排除干扰。
这种情况我踩过类似的坑,重点其实不是模型本身,而是vLLM的显存预留策略。你可以试试把gpu_memory_utilization设到0.8或更低,默认0.9有时候会提前占满导致OOM。另外检查下vLLM版本,0.6.3之后有些改动对Qwen2.5系列不友好,降回0.5.5反而稳很多。量化先别动,先把基础跑通再说。