最近在搞开源大模型本地部署,想用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-0.9之间,同时把swap_space降到4G左右,给KV cache多留点空间。另外max_model_len别硬上8192,先降到4096跑通再说,毕竟24G卡跑7B满血本来就很极限。AWQ 4bit慢可能是vLLM对量化支持的问题,我换成GPTQ反而流畅了,你可以交叉验证下。
4090 24G跑7B全精度确实有点紧,vLLM默认的显存预留策略挺激进的,试试把gpu_memory_utilization调到0.85左右,再给swap_space留2-3G,这样能挤出点空间。另外max_model_len别设太高,4090跑7B我一般控制在4096以内,8192确实容易爆。AWQ 4bit按理说应该显存压力小很多,速度慢可能是batch size没调对,你检查下vLLM的调度参数?个人感觉单卡跑7B还是可行的,关键是把这几个核心参数摸透。
4090 24G跑Qwen2.5 7B确实有点极限,vLLM默认的显存分配策略对单卡很不友好。你遇到的OOM大概率是gpu_memory_utilization设太高了,官方默认是0.9,但4090的显存带宽和容量都有限,建议直接调到0.6-0.7试下,配合swap_space设成2-4G,这样能腾出空间给KV cache。另外max_model_len其实不用设到8192,如果是API服务,512-1024的上下文长度对大多数场景完全够用,调低这个参数对显存释放效果很明显。至于AWQ 4bit变慢,可能是vLLM的量化核优化还没跟上Qwen2.5的架构,或者你用的vLLM版本太老,试试升级到0.5.0以上,对AWQ的推理速度有专门优化。还有个小trick:如果单次推理都崩,可以先启用--enforce-eager模式,跳过CUDA图优化,虽然吞吐会降一点但能稳定跑起来。最后提醒下,7B模型在4090上FP16推理其实勉强能跑,但并发请求一多必炸,建议通过--max-num-seqs限制并发数到1-2,显存占用能压到20G以内。
4090跑7B其实24G是够的,问题可能出在vLLM默认的显存预留策略上。建议把gpu_memory_utilization从默认0.9调到0.95甚至0.98,同时把swap_space降到1G以下,因为4090显存带宽高,不需要太多CPU交换。另外试试把max_model_len降到4096看看,8K对于7B模型确实容易爆,而且实际API场景很少需要那么长上下文。AWQ掉速可能和batch size没调好有关,试试把max_num_seqs设小一点,比如8或16,卡在计算瓶颈上反而更慢。
4090 24G跑7B模型按理说不会这么惨,我怀疑你max_model_len设太高了,8192对7B来说确实有点激进,尤其vLLM的显存分配机制是按最大长度预分配的,实际用不到那么长的话白白浪费空间。试试降到4096或2048,配合gpu_memory_utilization设到0.85或0.9,swap_space不用动默认就行。另外AWQ量化后速度变慢,大概率是batch size没调好,vLLM对量化模型的动态批处理策略和FP16不一样,你把max_num_batched_tokens稍微提高点比如1024,再配合--quantization awq --dtype half试试看。还有个小细节,Qwen2.5在vLLM里默认会用闪存注意力,但4090的显存带宽有限,偶尔反而会增加临时显存开销,可以在启动参数里加上--enforce-eager强制用原始注意力,虽然会慢一丢丢但能省下不少显存。如果还不行,考虑换ExLlamaV2跑,它对单卡显存利用率比vLLM更友好,就是API功能弱一些。
老实说,4090跑7B模型按理说应该没问题,但你设max_model_len=8192确实有点猛,vLLM的显存预分配是按这个长度算的,7B模型光KV cache就能吃掉十几G,加上模型权重和其他开销,24G真扛不住。我试过把max_model_len降到4096,同时gpu_memory_utilization设到0.85,swap_space留个4G,基本能稳在18G左右,单次推理没问题。AWQ 4bit慢可能是因为vLLM对量化模型的批处理优化不如原生FP16,而且小模型量化后精度损失确实明显,建议你先用FP16把max_num_batched_tokens降到256试试,另外检查下是否开了多余的后处理功能。还有一个坑:vLLM默认会预分配所有显存,你可以在启动时加--enforce-eager模式,虽然牺牲一点速度但能避免预分配爆炸。实在不行就切到TGI或者llama.cpp吧,vLLM对大显存更友好,24G单卡跑7B其实挺极限的。
试过把gpu_memory_utilization降到0.85再配合--enforce-eager模式吗?我4090跑同款模型这么调才稳。
试试把gpu_memory_utilization调到0.85以下,再配合--enforce-eager参数,我4090跑Qwen2.5-7B稳在16G左右。
4090跑7B按理说是够的,你这情况可能是vLLM默认分配显存太激进了。试试把gpu_memory_utilization调到0.85左右,给显存留点余量,swap_space设成2-4G,别用默认值。另外检查下是不是开了太多并行请求,max_num_seqs改小到4或8能省不少显存。AWQ 4bit按理不会比FP16慢太多,你看看是不是用了老版本vLLM,最新版对量化支持优化过。
4090跑7B理论上够的,你max_model_len设8192确实有点狠,一般对话场景4096就够用了,先降到4096试试。gpu_memory_utilization可以设到0.85-0.9,别低于0.8,swap space给个1-2G就行。另外AWQ 4bit在vLLM上可能需要调下并行参数,不然吞吐反而下降,我这边实测FP16配合合理的batch size反而更稳。
4090 24G跑7B全精度确实容易爆,我之前也踩过坑。你可以试试把gpu_memory_utilization设到0.85到0.9之间,swap_space别开太大(512MB左右就够了),然后max_num_seqs调小到8或者16,这样能省不少显存。另外如果追求速度,FP16其实比AWQ更稳,量化后的质量损失在长文本场景下会更明显,不如直接上FP16配合vLLM的continuous batching。
4090 24G跑Qwen2.5 7B其实够用,但vLLM默认的显存分配策略太激进。试试把gpu_memory_utilization调到0.85左右,swap_space设成4或者8,这两个参数不调好确实容易爆。另外你AWQ 4bit变慢可能是没开vLLM的量化优化,加个--kv-cache-dtype fp8_e4m3能缓解不少,质量损失也小。如果还不行,考虑用HuggingFace的transformers配合bitsandbytes做4bit加载,虽然吞吐低点但至少能跑稳。
4090 24G跑Qwen2.5 7B其实不一定要上AWQ,FP16配合vLLM默认参数确实容易爆,我建议你试试把gpu_memory_utilization降到0.85左右,同时把swap_space设成2或者4,这样能留出点缓冲空间。另外max_model_len先别设太高,4096起步慢慢往上加,我这边同样卡用这个配置跑得很稳。如果你追求速度又不介意微调,可以看看GPTQ量化版,比AWQ快一点且质量损失更小。
你这问题我也踩过坑,4090 24G单卡跑7B模型其实完全够,但vLLM默认的显存预留策略太激进。试试把gpu_memory_utilization降到0.85到0.9之间,同时swap_space设成2到4G,别开太高,不然会额外吃显存。另外如果不用长上下文,max_model_len改成4096就够了,8192对7B来说确实容易爆。至于AWQ 4bit变慢,可能是你用的量化版本不对,建议换GPTQ或者直接FP16,配合vLLM的连续批处理,单次推理显存能压到16G以内。
4090跑7B按理说够用,你这情况大概率是vLLM默认把KV cache占满了。试试把gpu_memory_utilization调到0.8左右,同时给swap_space留个4-8G,应该能缓过来。AWQ 4bit变慢可能是量化没调对线程数,或者vLLM版本对量化支持有bug,可以切到最新版再试。另外max_model_len别硬拉到8192,7B模型用4096对大多数场景也够,能省不少显存。
4090跑7B全精度确实吃紧,试试把gpu_memory_utilization降到0.85,同时开--enforce-eager。
说实话你遇到的这个情况挺典型的,vLLM在4090上跑7B模型确实需要精细调参,不是简单设置就能跑起来。我自己的经验是,gpu_memory_utilization别默认用0.9,先降到0.7左右试试,给系统留点冗余空间,不然光tensor parallelism那部分就会抢爆。swap_space设成4或者8也行,但别太大,否则显存反而被预留给swap的部分占死。另外max_model_len你直接砍到4096试试,很多场景下8192并不必要,而且7B模型的KV cache占显存是线性增长的,降一半长度能省出好几个G。至于AWQ 4bit变慢,可能是因为vLLM对4bit kernel的优化还没到位,尤其在4090这种没官方支持的高端卡上,反而会拖累推理速度。其实你可以先用FP16配合上述参数把服务跑通,输出质量没问题再考虑量化。单卡绝对能跑,只是vLLM的显存管理逻辑比较激进,需要你手动帮它划清边界。
4090跑7B模型默认参数确实容易爆,试试把gpu_memory_utilization调到0.85以下,再配合--enforce-eager禁用图编译能省不少显存。
试着把gpu_memory_utilization调到0.85以下,swap_space留个2GB,应该能跑起来。
4090跑7B按理说应该够的,你max_model_len设8192确实太激进了,我试过设4096配合gpu_memory_utilization=0.9就能稳在20G以内。AWQ 4bit变慢可能是动态批处理没开对,或者显卡没跑满,可以检查下vLLM的调度参数。另外swap_space设1G就够了,别留太多给CPU交换,不然显存反而更紧张。你试试paged attention的预分配倍数调低点?