各位大佬好,最近在折腾本地部署,用的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 条4090 24G跑7B按理说绰绰有余,但vLLM对CUDA context和碎片化特别敏感,你试过加--enable-prefix-caching或者--swap-space参数吗?另外确认下是不是有残留进程占着显存,有时候nvidia-smi显示不准。FP16其实没问题,不用急着量化,先试试把--gpu-memory-utilization降到0.7,同时给vLLM加--dtype=half看看,我之前遇到类似情况是换了个cuda版本才好的。
这个问题我也踩过坑,查了vLLM的issue发现跟transformers版本有冲突,你试试把transformers降级到4.44.2,同时确保vLLM是0.6.3以上的版本。另外别用--max-model-len硬调,先看看日志里具体是哪个tensor分配失败,有时候是KV cache太大,加个--kv-cache-dtype=fp8能省不少显存。量化不是必须的,除非你想跑更长上下文。
是不是用了Docker或者虚拟环境?有时候容器默认显存限制没放开,导致vLLM看到的可用显存比实际小。你可以在启动前先跑个nvidia-smi -l 1监视一下,看是不是有别的进程峰值占用了没释放。另外确认下pytorch版本是不是2.1以上,老版本对4090的
显存占用几百MB但OOM,大概率是vLLM预分配显存和CUDA上下文冲突,试试不设gpu-memory-utilization,让它自动分配。
4090跑7B按理说轻松得很,你先别急着量化,看看是不是vLLM版本太老跟CUDA 12.4不匹配,我之前遇到过类似问题,换最新的0.6.x或者0.7.x就好了。另外--gpu-memory-utilization设0.9其实挺危险的,Pytorch缓存和CUDA context会额外吃不少,试下0.7或者干脆不加这个参数。还有个小坑,如果你开了huggingface缓存或者多个进程在跑,nvidia-smi看到的空闲显存不一定真能用。实在不行可以先用transformers直接加载试试,排除是不是vLLM自身的问题。
显存占用才几百MB还OOM,八成是vLLM预分配显存的锅,试试加--swap-space和--block-size参数。
4090跑7B按理说完全够,我怀疑是你显存碎片化的问题,试试先关掉所有占用显存的应用,然后加--swap-space=0强制禁用CPU交换。另外vLLM对transformers版本确实敏感,建议直接装vllm配套的固定版本,别用最新的,我之前就是版本冲突搞了半天。量化不是必须的,但AWQ能显著降低显存压力,不过先解决启动问题再说。
顺便问下你用的是pip装的vLLM还是源码编译的?有时候wheel包会默认编译成sm_90之外的架构,导致显存分配异常。
4090跑7B按理说很轻松,我怀疑是vLLM的KV cache预分配策略太激进了,你试试加个--max-num-seqs=1或者--kv-cache-dtype=fp8_e5m2,这俩参数能砍掉不少临时显存占用。另外vLLM和transformers版本确实容易打架,我之前0.6.x配transformers 4.46就死活起不来,后来锁版本到transformers 4.44.2才正常,你可以对照下自己的版本组合。量化倒不是必须的,FP16在24G上跑7B留的余量还挺大,主要是别让vLLM一次性把整张卡的显存都预占了。
我之前也踩过这个坑,问题多半不在显存总量,而是vLLM默认会预留一部分KV cache和CUDA context,加上你设的0.9利用率,它可能先尝试给后续推理分配空间,结果权重加载前就把显存预算撑爆了。建议你把--gpu-memory-utilization调到0.7左右试试,或者先不设这个参数,让它自动管理。另外,4090跑7B用FP16其实刚好,量化不是必须的,但你可以检查一下是不是有别的进程占着显存没释放,比如Jupyter或者浏览器。还有,试试更新vLLM到最新版本,我之前遇到过老版本和transformers 4.44以上不兼容导致类似报错。
试试先升vLLM到最新版,老版本跟transformers新版本确实容易炸,另外把--gpu-memory-utilization降到0.8留点系统缓冲。
试下先把transformers锁到4.45左右的版本,vLLM跟新版transformers的兼容性确实容易出这种诡异问题。另外4090跑7B其实不用量化,FP16完全够,但建议把--gpu-memory-utilization调回默认值,有时候手动设太高反而会触发预分配冲突。还有个小细节,确认下是不是有别的进程占着共享显存,nvidia-smi只看进程占用有时候会漏掉。
我之前也遇到过类似情况,后来发现是vLLM默认会预分配KV cache,就算你设了0.9它也会先尝试把整个模型和缓存塞进显存,4090跑7B其实挺紧的。你可以试试加上--enforce-eager参数关掉CUDA graph,或者先跑一下官方推荐的benchmark脚本确认环境没问题。另外transformers版本太新偶尔会有兼容坑,建议锁到4.43左右。量化的话FP16其实够用,AWQ主要是省显存但会掉点精度,最后实在不行就换exllamav2吧,对24G卡友好很多。
我之前也遇到过一模一样的情况,最后发现是vLLM的page内存和CUDA缓存冲突了,试试启动前先执行sudo sync && echo 3 > /proc/sys/vm/drop_caches,或者加个--swap-space=16参数。另外4090跑FP16的7B理论上是够的,但vLLM会额外预留KV cache和activation空间,0.9利用率反而容易爆,先改成0.5或者干脆不设,让它自动算。还有个小坑,transformers和vLLM版本不匹配确实会出莫名其妙的问题,我最后是pip install vllm==0.6.3.post1 + transformers==4.44.2才稳定。量化不是必须的,但AWQ能省一半显存,你可以试下,不过别指望速度提升太多。
4090跑7B按理说24G完全够,但vLLM这玩意儿有个坑,它默认会预留一部分显存给KV cache和CUDA context,你设0.9其实已经很高了,反而容易和驱动本身抢内存。我之前遇到过类似情况,最后是升级了vLLM到0.6.2并且把transformers降到4.44.0才好的,你可以先试试这个组合。另外建议看一眼是不是有别的进程占着显存,比如浏览器或者Jupyter,有时候看起来占用低但实际块被碎片化了。量化的话,AWQ对7B提升不大,FP16跑512长度上下文应该没问题,问题大概率还是版本兼容性上。
我之前也踩过这个坑,折腾了整整一晚上。你描述的情况很典型,显存看着够但vLLM就是报OOM,大概率不是量化或者transformers版本的问题,而是vLLM默认会预留KV cache的空间,加上CUDA context和碎片化,实际可用显存比nvidia-smi显示的少很多。你试了调max-model-len,但建议同时把gpu-memory-utilization降到0.7左右试试,有时候0.9太激进了,反而触发保护机制。另外检查下是不是开了多个进程或者有别的程序占着显存没释放,比如之前崩掉的python进程。还有个小细节,vLLM加载权重前会先做一次显存探测,如果这时候别的进程刚好在申请显存,也会炸。我个人经验是直接换AWQ量化版最省心,4bit下7B模型大概只需要5-6G显存,留足余量给KV cache,基本不会OOM。你可以先跑个最简单的命令,比如只加载模型不推理,看能不能过,逐步排查。最后想说,4090跑7B其实很轻松,问题多半出在环境配置上,别急着换硬件。
我之前也遇到过类似情况,后来发现是vLLM的page memory预留机制在搞鬼,它启动时会按最大并发token数预分配显存,跟你看的nvidia-smi空闲量不是一回事。可以试试加上--swap-space=0,还有把--gpu-memory-utilization稍微调低到0.7,再配合--max-model-len=512,这样大概率能挤进去。另外确认下是不是用了最新版vLLM,0.6.x后对Qwen2.5的支持有变化,建议直接装0.6.3,别用master分支。FP16没问题,量化不是必需的,先跑通再优化。
4090跑7B按理说绰绰有余,你先别急着量化,查下vLLM版本,0.6.x之前对transformers 4.46+有兼容坑,建议直接pip install -U vllm试试。另外启动时加--enforce-eager能关掉CUDA graph,这玩意儿有时候会预分配大量显存导致假OOM。权重的话FP16没问题,AWQ主要是为了提速不是省显存,你24G完全够。最后确认下是不是开了多个进程同时加载模型,nvidia-smi看下PID。
我之前也遇到过类似的坑,后来发现是vLLM默认会预留一部分显存给KV cache,加上CUDA context本身就吃不少,你设0.9反而容易在加载权重时瞬间爆掉。建议先试试把--gpu-memory-utilization调到0.7或0.8,同时加上--enforce-eager禁用CUDA graph,看看能不能过加载那关。另外transformers版本太新确实可能跟vLLM有兼容问题,我上次是回退到4.42才正常,你可以查下你当前的版本号。量化不是必须的,FP16在24G上跑7B应该没问题,先把前者搞定再说。
我之前也踩过这个坑,大概率不是显存不够,是vLLM在初始化时预分配的KV cache和CUDA context把显存占了,4090跑7B FP16按理说很轻松。你先试试把--gpu-memory-utilization降到0.6,再加个--enforce-eager禁用CUDA graph,能省不少显存。另外transformers版本太新确实会跟vLLM有冲突,建议直接装vLLM官方推荐的pinned版本组合,别用最新的。量化不是必须的,FP16在24G上跑7B完全够,别急着转AWQ。
之前也踩过这坑,其实大概率不是显存不够,是vLLM预分配逻辑的问题,试试不加--gpu-memory-utilization,让它默认值跑,或者直接设成0.85以下。另外检查下是不是别的进程占了显存,比如浏览器或者别的python进程,nvidia-smi有时候看不到完整占用。FP16不用急着量化,先确认下CUDA版本和vLLM匹不匹配,我之前就是torch和vLLM的CUDA版本不一致导致疯狂OOM。
我之前也遇到过类似的坑,排查半天发现是vLLM的版本和CUDA toolkit对不上,不是显存不够的问题。你可以试试用官方docker镜像,或者把vLLM降到0.6.x,大概率能解决。另外FP16其实没问题,7B模型24G跑得动,量化不是必须的,先别急着转格式。还有个小细节,启动前用nvidia-smi看看是不是有其他进程占着显存,有时候残留的python进程会占掉几个G。如果还不行,可以把--gpu-memory-utilization调到0.85再试一次,有时候开太高反而会触发某些bug。
这问题我上周刚踩过坑,最后发现是vLLM版本太老,跟transformers新版的缓存机制冲突了,升到0.6.3就正常了。你那个显存占用几百MB其实是预分配的假象,实际CUDA context已经吃掉了不少,可以试试先跑个最简单模型排除环境问题。另外FP16跑7B理论上24G够用,不用急着量化,先查下是不是tensor parallel设了2但单卡不支持。