最近在搞开源大模型本地部署,想用vLLM跑Qwen2.5 7B做API服务。我机器是RTX 4090 24G,按官方文档设置max_model_len=8192,结果一启动就报OOM,连单次推理都跑不了。试了调低max_num_batched_tokens到512,还是不行,显存直接冲到22G+。看网上说用FP16或者量化,但我试了AWQ 4bit,速度反而变慢了,而且输出质量下降明显。是不是我参数设置有问题?或者这个模型根本不适合单卡部署?有没有大佬分享下实际部署时的显存优化trick?比如gpu_memory_utilization、swap_space这些参数到底怎么调才合理?先谢过!
vLLM部署Qwen2.5 7B遇到显存爆炸,求大佬分享优化经验
全部回复
共 152 条老实说,4090跑7B模型默认参数确实容易爆,我踩过一样的坑。你可以试试把gpu_memory_utilization设到0.85以下,同时把swap_space调成2到4G,vLLM默认的显存预留策略太激进了。另外max_model_len别硬撑8192,降到4096对大部分场景够用,显存能省下好几个G。AWQ 4bit速度慢可能是没开vLLM的vLLM_USE_FLASH_ATTN,或者你换GPTQ量化试试,质量损失小一点。
你这配置跑7B按理说没问题,我怀疑是vLLM的默认显存预留策略太激进了,试试把gpu_memory_utilization降到0.7-0.8,同时把swap_space设成1或2,给KV cache留点喘息空间。另外max_model_len先降到4096跑通再说,8K对24G卡确实有点极限,后续再慢慢往上调看显存变化。
4090跑7B按理说不会这么惨,你试试把gpu_memory_utilization调到0.85-0.9,默认0.9有时候反而会预占太高。另外max_model_len降到4096看看,8192对24G卡确实有点极限,单次推理质量影响不大。AWQ 4bit速度慢可能是vLLM的量化优化还没完全适配Qwen2.5,换GPTQ或者直接FP16加少量KV cache offload试试。
4090跑7B按理说不会这么惨,我怀疑是vLLM的显存分配策略太激进了。你可以试试把gpu_memory_utilization调到0.85左右,然后swap_space设成4或者8,给系统留点余量。另外AWQ 4bit速度慢可能是你用的量化版本不对,推荐用AutoAWQ重新量化一次,别直接下别人打包好的,效果差异挺大的。
4090跑7B按理说绰绰有余,你这问题大概率出在vLLM的显存预分配上。试试把gpu_memory_utilization调到0.85以下,默认的0.9对24G卡太激进,另外swap_space设成2或4就行别太大。还有max_model_len其实不用设那么高,根据你实际业务场景砍到4096或2048能省不少显存,4bit量化慢可能跟vLLM的算子优化有关,换AutoGPTQ试试。
同用4090踩过同样的坑,这问题其实不在max_model_len,而是vLLM默认会预分配KV cache,24G显存对Qwen2.5 7B的FP16推理来说确实吃紧。建议你先试下把gpu_memory_utilization设到0.85左右,别用默认的0.9,给OS和其他进程留点余量;swap_space设成2或4就行,别太大,否则反而会抢占显存。另外max_num_seqs可以降到32甚至16,这参数直接影响并发时的显存峰值。AWQ 4bit速度变慢很可能是你batch size太小或者没有用vLLM的v1调度器,可以试试加--enable-prefix-caching和--use-v2-block-manager,对长文本生成有奇效。如果还不行,建议换GPTQ 4bit,vLLM对它的支持比AWQ成熟一点,我用下来精度损失和速度都更平衡。最后提醒下,检查下系统其他进程有没有占显存,有时候nvidia-smi里看着空闲,其实环境里开了别的推理进程没释放干净。
试试把gpu_memory_utilization调到0.85,再开个swap_space=4,我4090跑8k长度没问题。
4090跑7B按理说不会这么惨,你试试把gpu_memory_utilization调到0.85以下,默认0.9容易爆,swap_space设成2G就够了。另外vLLM对长上下文优化一般,max_model_len可以先降到4096跑通再慢慢往上加,不然显存预分配太激进。AWQ慢可能是没调好tensor_parallel或者没开vLLM的量化优化,换成GPTQ试试速度会好点。
4090 24G跑7B模型按理说够的,但vLLM默认显存预留策略比较激进,建议你把gpu_memory_utilization调到0.85左右试试,别让它一股脑全占上。另外swap_space设成2到4G就够了,设太大反而会挤占模型空间。AWQ 4bit慢可能是batch size没调好,或者没装对cuBLAS算子,可以换GPTQ试试,速度损失小一些。
实测把gpu_memory_utilization调到0.9以下,再配合--enforce-eager模式能省不少显存。
4090跑7B按理说应该是够的,我怀疑你max_model_len设太高了,vLLM默认会预分配大量显存做KV cache,建议先降到4096试试。另外gpu_memory_utilization别写默认的0.9,改成0.75左右给系统留点余量,swap_space设个1G就够了。AWQ降速可能是你没开vLLM的half-precision融合算子,试下启动参数加个--dtype auto看看能不能救回来。
4090单卡跑7B按理说24G是够的,感觉你max_model_len设太高了,8k长度对7B来说显存压力很大,可以先降到2048试试。gpu_memory_utilization我一般设0.9到0.95,别拉满,留点余量给kv cache;swap space设到2-4G应急用。AWQ 4bit慢可能是vLLM版本对qwen支持不够好,试试换GPTQ量化或者干脆用FP16加offload,速度和质量平衡会好一些。
4090 24G跑Qwen2.5 7B确实容易卡在显存分配上,我上周也踩过这个坑。问题可能出在vLLM默认会预分配KV cache,你设的max_model_len=8192对7B模型来说太激进了,实际部署可以砍到4096甚至2048,毕竟大多数场景用不到那么长的上下文。另外gpu_memory_utilization别留太多给系统,我设到0.85左右能稳住,swap_space设成2-4G就够了,太大反而会让显存碎片化。AWQ 4bit速度慢可能是模型没正确优化,试试用最新版vLLM或者换GPTQ量化,有些量化后的小模型在4090上反而能开更高并发。还有个小trick:如果你单次推理不需要高吞吐,可以把调度策略改成prefill-only模式,vLLM的continuous batching在你这个场景下反而会吃掉不少显存。至于输出质量下降,建议先跑个原版FP16做基准,再对比量化版本,有时候是采样参数不同导致的错觉。
gpu_memory_utilization调到0.85试试,swap_space设512MB基本够用,max_model_len先砍到4096跑通再说。
4090跑7B full precision确实容易爆,试试把gpu_memory_utilization降到0.85再加--enforce-eager模式。
我也是用4090跑过vLLM的,你这情况太真实了。其实max_model_len设8192对7B模型来说有点激进,即便官方文档这么说,但实测下连续推理时显存碎片化会很严重,尤其vLLM的PagedAttention在长序列下额外开销不小。建议先降到4096试试,如果业务允许甚至2048更稳,这样显存占用能控制在15G左右。gpu_memory_utilization我一般设0.85到0.9之间,别拉满,留点余量给vLLM的KV cache动态分配;swap_space设个2-4G就够,别太大,因为磁盘IO反而拖慢速度。另外你试AWQ 4bit变慢,可能是vLLM的量化核没吃透,换成GPTQ 4bit或者直接用FP8看看?不过4090对FP8支持一般,建议用bitsandbytes的8bit加载,实测显存比FP16省30%且速度不掉。如果还不行,干脆改用llama.cpp的server模式,那个对单卡优化更暴力,显存压到12G还能跑流畅。最后提醒一下,检查下vLLM版本,0.6.0之后对Qwen2.5有专项优化,老版本可能没打补丁。
4090跑7B按理说没那么容易爆,你max_model_len设8192确实有点激进,我一般先用4096试水,配合gpu_memory_utilization=0.85,swap_space设4G左右,基本能稳住。AWQ 4bit速度变慢可能是vLLM版本对量化支持不够好,试试GPTQ或者直接用FP16,牺牲点显存换速度更划算。另外检查下是不是vLLM版本太旧,新版本对Qwen2.5有优化,更新到最新能省不少显存。
4090跑7B不该OOM啊,你是不是忘关其他占显存的东西了,试试gpu_memory_utilization调0.85再看。
4090单卡跑7B别开满上下文,gpu_memory_utilization先锁0.85,swap_space设个2G试试。
4090 24G跑7B按理说绰绰有余,你这个OOM大概率不是显存不够,而是vLLM的KV cache预分配太激进了。官方默认的gpu_memory_utilization是0.9,但加上CUDA context和中间激活值,实际可用显存会比你想象的小很多,建议直接设成0.7甚至0.6试试,同时把swap_space调到4G以上,给显存留点缓冲余量。
另外max_model_len=8192对7B来说确实有点吃紧,KV cache是按这个长度预先分配的,如果你业务上不需要那么长的上下文,砍到4096能省出将近一半的显存。AWQ变慢这个现象很常见,因为4bit反量化在推理时反而会增加计算开销,尤其在4090这种算力过剩的卡上,不如直接用FP16配合vLLM的continuous batching,吞吐量反而更好。
还有个容易忽略的点,检查下你是不是开了--enforce-eager模式,如果没开,vLLM默认会用CUDA graph优化,这玩意在首次推理时会额外占不少显存。最后建议用nvidia-smi盯着看,观察到底是模型权重占得多还是KV cache占得多,这样调整参数更有针对性。你实际业务里单并发多还是并发请求多?如果是单发延迟敏感,可能直接用transformers pipeline反而更省心。