最近在搞开源大模型本地部署,想用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按理说绰绰有余,你这OOM大概率是vLLM默认把KV cache和激活层给吃满了,试试gpu_memory_utilization调到0.85以下,swap_space设个4G左右,给torch留点余量。AWQ变慢可能是量化后batch size没跟上,把max_num_seqs调高到256试试,质量损失在长上下文场景其实能接受。另外确认下CUDA版本和vLLM是否匹配,我之前就是torch2.1跟vLLM0.4不兼容导致显存分配异常。
4090跑7B按理说应该够啊,你试试gpu_memory_utilization设0.9然后关掉swap_space,另外把max_model_len砍到4096看看。
这问题我上周刚踩过坑,4090跑7B按理说绰绰有余,你八成是被vLLM的默认显存预留坑了。试试把gpu_memory_utilization直接调到0.85,然后swap_space设成4到8G,这两个参数比max_num_batched_tokens管用多了。另外别用AWQ,Qwen2.5这代模型对GPTQ支持更好,速度基本不掉,质量也稳。我这边还顺手把tokenizer的preload关了,能再省出1G多,你可以试试。
4090跑7B不该OOM啊,你试试把gpu_memory_utilization调到0.85,swap_space留2G,max_model_len砍到4096。
这卡跑7B其实挺宽裕的,我怀疑是你环境里别的进程占显存了,先nvidia-smi看下再说。
试试把gpu_memory_utilization调到0.85,swap_space设4G,max_model_len先砍到4096,基本能稳。
4090跑7B按理说完全够用,你这个问题大概率不是模型太大,而是vLLM默认预分配显存太激进了。试试把gpu_memory_utilization调到0.85左右,然后swap_space设成4或者8,给KV cache留点余量,但别开太大,不然反而占显存。另外你说的AWQ变慢,可能是没设好--quantization参数,或者batch size太小导致量化开销没摊薄,7B模型其实FP16加长上下文也能凑合,别急着上量化。你跑的是官方example还是自己写的脚本?建议用vllm的benchmark脚本先测个底,看看是不是哪里配置写死了导致prefill阶段爆掉。
4090跑7B按理说很宽裕,问题大概率出在vLLM的预分配策略上。你试试把gpu_memory_utilization设到0.85,swap_space给4G,再把max_num_seqs调小到16,这三样配合起来能压不少显存。另外AWQ变慢可能是没开vLLM的量化内核支持,检查下是不是用的最新版本,老版本对4bit优化很拉胯。
4090跑7B按理说应该够的,你试试把gpu_memory_utilization调低到0.85,别让它默认全占满,同时swap_space设成4或者8,给CPU留点回退空间。AWQ慢可能是没开vLLM的量化优化,要用--quantization awq_marlin这种专用内核,不然等于白量化。另外max_model_len其实可以砍到4096,很多场景用不了那么长上下文,显存能省出一大截。
4090跑7B按理说绰绰有余,你八成是没调gpu_memory_utilization,默认0.9其实很激进,改成0.75左右给显存留点余量试试。另外max_model_len别硬顶8192,4090上跑7B撑死也就4K上下文,除非你上量化。AWQ变慢很正常,7B模型小,4bit反而不如FP16划算,建议直接FP16把swap_space设成2到4G,大概率能稳。还有个小坑,vLLM对CUDA版本敏感,记得用官方推荐的12.1环境。
4090跑7B不该OOM啊,试试把gpu_memory_utilization调到0.85,swap_space设4,max_model_len砍到4096再慢慢加。
楼上正解,另外检查下vLLM版本,老版本显存管理有bug,升到最新版说不定就好了。
我之前也遇到过一模一样的情况,4090跑7B按理说完全够用,问题多半出在你给的KV cache预留太多了。试试把gpu_memory_utilization设到0.85,然后把swap_space直接设成0,max_num_batched_tokens别动它,让它默认就行——这个参数跟显存占用关系不大,真正吃显存的是并发和序列长度。
另外你那个AWQ变慢很可能是没开vLLM的量化后端,光换了模型文件但启动参数里没加--quantization awq,等于白换。还有个小技巧,可以开--enable-chunked-prefill,对长prompt的显存峰值能压不少。
我目前单卡4090跑Qwen2.5-7B,max_model_len=8192,gpu_memory_utilization=0.9,并发8,稳定在19G左右,没炸过。你先把swap关掉试试,那个参数默认会吃显存做交换区,很多OOM都是它搞的鬼。
4090跑7B按理说不该这么惨,你试试把gpu_memory_utilization设到0.9,swap_space留个4G,但关键是max_model_len别硬顶8192,先降到4096跑通再说。AWQ变慢大概率是没开vLLM的量化推理优化,检查下版本和启动参数,老版本对AWQ支持很拉胯。另外检查下是不是有其他进程占了显存,nvidia-smi看一眼最直观。
4090跑7B按理说完全够用,你这情况大概率是vLLM默认把KV cache和激活都塞进显存了。试试把gpu_memory_utilization设到0.85左右,swap_space留个4GB,再把max_num_batched_tokens和max_num_seqs都调小到256试试,别用AWQ,原生FP16配合这些参数应该能稳。另外确认下是不是开了--enforce-eager,关掉它能省不少显存。
你这不是模型问题,是vLLM的显存预分配策略太贪了。我3070跑Qwen2.5 7B都行,你把--kv-cache-dtype改成fp8能省一大截,或者干脆手动指定--max-model-len 4096,别跟8k死磕。FP16其实最省心,AWQ速度慢大概率是没装对应的kernel,检查下autoawq和vllm版本匹配不。
我猜你是用默认配置裸跑的,vLLM默认会预留90%显存给KV cache,7B模型光KV cache就能吃掉10G+。直接设--gpu-memory-utilization 0.6,--swap-space 8,然后--max-num-batched-tokens 1024,基本能压到15G以内。另外别用AWQ,Qwen2.5的GQA
这问题我上周刚踩过坑,4090跑7B理论上完全够,但vLLM默认会预分配KV cache和CUDA context,24G看着大实际很紧。你试试把gpu_memory_utilization调到0.85以下,我设成0.8才稳定,swap_space直接设0,这玩意在4090上反而拖慢。另外max_model_len别硬拉8192,7B模型实际跑长文本时中间激活值暴涨,先设4096跑通再慢慢往上加。AWQ慢大概率是因为vLLM对量化层的kernel优化没生效,你检查下是不是装了最新版本,旧版跑4bit反而没原生FP16快。还有个冷门技巧:如果只是API服务,可以开--enforce-eager模式禁用CUDA graph,首token延迟高点但显存能省2-3G。最后建议直接看nvidia-smi盯显存,如果加载完模型只剩10G,那肯定是预分配太激进,调低utilization比降量化更有效。
4090跑7B按理说绰绰有余,你这多半是vLLM版本和CUDA不匹配的锅,换12.1试试。
我遇到类似情况是把gpu_memory_utilization拉到0.92,再把max_model_len砍到4096才稳,量化真没必要。
建议先开个不带vLLM的原生transformers加载看基准显存,再一步步排查。
这问题我踩过一模一样的坑,4090跑7B其实完全够用,你八成是卡在显存分配上。试试把gpu_memory_utilization调到0.85,swap_space设成4或者8,别用默认值。另外max_model_len先砍到4096跑通再说,8192对7B来说KV cache吃得太狠了。AWQ慢可能是没开vLLM的量化推理优化,加个--quantization awq看看,质量下降的话可以换GPTQ试试。
4090跑7B按理说绰绰有余,你OOM大概率是vLLM默认把KV cache和激活内存一起占了,试试把gpu_memory_utilization调到0.85以下,再给swap_space留个4G,别用AWQ,用GPTQ或者FP8更稳。另外max_model_len其实不用设那么高,4096够用的话能省一大截显存,我这边7B跑4096长度单卡很流畅。
4090跑7B按理不该OOM,试下把gpu_memory_utilization设到0.85,swap_space留2G,max_model_len砍到4096试试。
4090跑7B按理说绰绰有余,你试试把gpu_memory_utilization调到0.85,swap_space设成4,然后max_model_len先砍到4096跑通再说。另外别用AWQ,7B模型FP16本身就不大,量化反而触发反优化,我怀疑你显存爆是vLLM默认预分配了全部显存,跟模型大小关系不大。之前我跑同架构模型遇到过类似情况,把--enforce-eager打开能省不少显存,你可以对比下速度损失,应该比AWQ强多了。
说实话你这个问题我上个月刚踩过,4090跑7B按理说绰绰有余,问题大概率出在vLLM的显存预留策略上。gpu_memory_utilization默认是0.9,但对24G卡来说,KV cache加上CUDA context还有torch的碎片化预留,实际可用比你想的少得多,建议直接调到0.6甚至0.55试试,牺牲一点吞吐换稳定。swap_space别乱动,默认4G就行,开大了反而会频繁换入换出导致延迟飙升。max_num_batched_tokens调到512其实没意义,这参数管的是并发调度,不是单请求显存,真正吃显存的是max_model_len和KV cache的head维度。另外别用AWQ,Qwen2.5的GQA结构对4bit量化不太友好,你用bitsandbytes的8bit加载,配合vLLM的--quantization bitsandbytes,速度损失比AWQ小很多,质量也接近FP16。实在不行就手动算一下KV cache:7B是28层,每层GQA的kv_heads是4,head_dim是128,按8K上下文来算,一并发请求的cache也就不到2G,剩下全给权重和激活应该够。还有个野路子,把--enforce-eager打开,禁掉CUDA graph,能省下大概2-3G显存,虽然首token延迟会高一点,但至少能跑起来。你先试试gpu_memory_utilization=0.6加enforce-eager,不行再回来聊。