最近在搞开源大模型本地部署,想用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 条我最近也在折腾vLLM,跟你配置差不多,4090跑7B其实完全够用,问题多半出在显存分配策略上。你试过把gpu_memory_utilization降到0.85左右吗?默认0.9会预留太少给KV cache和中间激活,24G卡实际可用可能不到22G,稍微复杂点的prompt就爆。另外max_model_len别一上来就拉满8192,先设4096跑通再说,这个参数直接影响显存里的KV cache预留量,7B模型在8K长度下光KV cache就得吃掉好几G。swap_space其实没必要调,除非你batch特别大,对单卡服务来说设成4G就够,太大反而频繁换页拖慢速度。AWQ慢可能是你量化后没调对vLLM的推理后端参数,比如没启用--quantization awq或者没跑calibration,4bit理论上应该比FP16快,但如果你显存没省下来反而因为反量化开销变慢,那就干脆用FP16配合更小的max_num_batched_tokens试试。我现在的配置是gpu_memory_utilization=0.88,max_model_len=4096,batch size限制在16以内,跑Qwen2.5 7B稳定在12G左右,还能剩不少空间给并发。你检查下是不是CUDA版本或者vLLM版本太老,有些版本对KV cache管理有bug,升级到最新版有时候能解决很多玄学问题。
4090跑7B按理说绰绰有余,你试试把gpu_memory_utilization调到0.85,然后swap_space设成4,别用默认值。另外max_model_len别死磕8192,先降到4096跑通流程再说,OOM很多时候是KV cache预分配太贪了。
AWQ慢可能是没配合vLLM的量化推理优化,或者batch size太小没发挥优势,你可以对比下GPTQ或者直接用FP16加--enforce-eager,绕开CUDA graph的显存开销。我这边跑同模型,24G卡留2G给系统,峰值能稳在19G左右,关键是把--max-num-seqs压到4。
说实话你这个情况我上周刚踩过一模一样的坑,4090跑7B按理说绰绰有余,问题八成出在vLLM的显存预分配机制上。gpu_memory_utilization默认是0.9,但vLLM会按max_model_len预留KV cache,你设8192等于给4090挖了个大坑,试试调到0.6以下,然后max_num_batched_tokens保持默认反而更稳。另外swap_space别动,默认4G就够,调大了会走CPU卸载反而更慢。AWQ慢可能是你没开--quantization awq的配套flag,或者用的旧版本vLLM对W4A16支持不好,建议先升级到0.6.3以上再说。还有个野路子,把--enforce-eager打开,能省大概2G显存,代价是首token延迟高一点,但至少能跑起来。你试过把max_model_len砍到4096吗?如果业务上不需要超长上下文,这个改动最立竿见影。最后提醒一下,别用HuggingFace默认的config.json里的rope_scaling,Qwen2.5的7B有个已知bug会额外吃显存。
4090跑7B按理说绰绰有余,你这个问题大概率不是卡不够,而是vLLM的显存分配逻辑在捣鬼。gpu_memory_utilization默认0.9太激进了,24G卡实际能用的就21G左右,你试试直接设成0.75到0.8,给CUDA context和KV cache留点缓冲,不然容易和PyTorch的缓存打架。另外swap_space别用默认值,设成1或者2就行,这玩意儿在单卡上基本没用,反而会预占显存。AWQ变慢我猜是vLLM对量化kernel的优化没生效,你检查下是不是装了最新的flash-attn,或者干脆换GPTQ试试,有时候4bit在7B上收益真不大。我之前用Qwen2.5 7B跑过,max_model_len设4096,max_num_batched_tokens调成2048,batch size限制1,然后显存utilization调到0.8,稳得很,连续跑几百个请求没崩过。你试试把max_model_len降到4096,这个模型对长上下文支持一般,而且8192的KV cache在FP16下就吃掉好几个G,非常不值。还有个冷门技巧:环境变量里设VLLM_ATTENTION_BACKEND=FLASH_ATTN,强制走flash attention路径,有时候能避开默认kernel的显存碎片问题。最后,如果量化质量掉太多,可以考虑FP8动态量化,vLLM新版支持,速度和显存都比FP16强,质量损失几乎感知不到。
说实话你这个问题我上个月也踩过,4090跑7B按理说空间是够的,问题大概率出在vLLM默认的KV cache预留上。max_model_len=8192对7B来说太激进了,尤其Qwen2.5的GQA头数虽然优化了,但context一旦拉长,KV cache会按层数×头数×序列长度指数涨,你看到的22G+基本就是cache吃满后留给权重和激活值的空间被挤爆了。我当时的做法是先关掉swap_space(设成0),再把gpu_memory_utilization从默认的0.9降到0.75左右,同时把max_num_batched_tokens设成2048而不是512——你那个值反而会触发频繁的调度开销,显存碎片化更严重。另外AWQ变慢不奇怪,vLLM对4bit的kernel优化不如FP16成熟,尤其小batch下反而不如原生精度,我建议你直接试FP8或者干脆用BF16配合--kv-cache-dtype fp8_e5m2,能省不少cache容量。最后确认一下你的CUDA和vLLM版本,老版本对Qwen2.5的RoPE和注意力计算有内存泄漏bug,升级到0.6.6+大概率能解决。你先按这个思路调,如果还爆就贴一下启动日志,我帮你看看具体是哪个阶段炸的。
说实话你这情况我一开始也遇到过,24G跑7B按理说绰绰有余,问题多半出在vLLM的显存预分配机制上。gpu_memory_utilization默认值0.9太激进了,4090上系统还要吃几个G,你直接砍到0.75左右试试,把swap_space设成4或者8,让CPU兜底一部分KV cache。另外max_model_len=8192对于Qwen2.5 7B其实偏大,这模型实际处理长文本时KV cache膨胀非常快,建议先降到4096验证一下能不能跑通,再逐步往上加。至于AWQ变慢,可能是你量化格式和vLLM的算子没对齐,试试GPTQ或者把量化粒度调成128,有时候反而比4bit更稳。我自己的配置是max_num_batched_tokens=4096,max_num_seqs=64,配合0.8的显存利用率,单卡跑7B还能同时挂个embedding模型。还有个小技巧,如果你只是做API服务,可以把模型加载时把--enforce-eager打开,关掉CUDA graph,能省不少显存,代价是首token延迟高一点点。你先照这个调一遍,大概率能解决,不行再贴下vLLM的启动日志,我帮你看看具体哪儿爆了。
这问题我上周刚踩过坑,4090跑7B按理说完全够,关键在vLLM默认会预分配显存。你可以试试把gpu_memory_utilization调到0.85左右,给KV cache和torch留点余量,swap_space设成0或者1就行,这俩参数比max_num_batched_tokens影响大得多。另外AWQ慢可能是因为没开vLLM的awq专用kernel,更新到最新版再试下,4bit正常应该比FP16快才对。
4090跑7B按理说绰绰有余,你把gpu_memory_utilization降到0.85试试,另外别开swap_space,默认值反而拖慢速度。
我遇到过类似问题,其实是vLLM版本太新和CUDA不匹配,换回0.6.3稳定版直接就好了。
4090跑7B全精度本来就不宽裕,试试gpu_memory_utilization设0.9加preemption模式切换,别死磕量化。
4090跑7B按理说应该是够的,问题大概率出在vLLM的显存预留策略上。你设的max_model_len=8192其实不算夸张,但vLLM默认会按最大长度预分配KV cache,加上CUDA context和激活值,24G很容易被吃满。我建议先把gpu_memory_utilization调到0.85左右,别用默认的0.9,同时把swap_space设成0或4,避免它把部分权重挪到CPU导致碎片化。另外你试AWQ变慢很可能是没开量化推理的专属优化,vLLM对AWQ支持其实不错,但得确认有没有装对应版本的flash-attention,以及是不是用了--quantization awq参数而不是只加载了权重。还有个冷门trick:把--max-num-seqs调低到2或3,限制并发序列数,能明显降低峰值显存。如果还不行,试试不用vLLM,直接HuggingFace Transformers配合torch.compile跑,虽然吞吐低点,但至少能稳定单卡推理。最后检查下CUDA版本和PyTorch是不是匹配,我遇到过因为cu121和cu118混装导致显存泄漏的怪问题。
这问题我踩过一模一样的坑,4090跑7B按理说完全够用,但你大概率是卡在KV Cache的预分配上了。max_model_len设8192时,vLLM会按最大长度预留缓存,24G根本扛不住,我建议直接砍到4096,同时把gpu_memory_utilization调到0.9,这参数不是越大越好,得给CUDA context和激活值留点余地。swap_space千万别乱开,设成0或者1就行,开大了反而触发频繁换页导致卡顿。AWQ慢我觉得不一定是量化本身的问题,可能是你没开vLLM的量化推理优化,确认下--quantization awq有没有正确传递,还有注意批处理大小,单请求时量化模型的overhead确实明显。另外试试FP8或者GPTQ,在4090上比AWQ更友好,质量损失也小。最后建议开一下--enable-prefix-caching,多轮对话场景能省不少显存。这模型单卡部署完全可行,就是参数得慢慢调,别被默认值骗了。
同款配置踩过坑,说下我的排查逻辑。24G跑7B全精度理论上够,但你max_model_len=8192在vLLM里会预分配KV cache,实际峰值比理论高不少,尤其Qwen2.5的GQA结构对显存占用挺敏感。建议先把max_model_len砍到4096,同时gpu_memory_utilization设0.85,swap_space从默认的4G降到1G试试,这参数不是越大越好,swap会频繁搬运反而拖慢速度。
另外AWQ变慢很可能是因为你用的推理后端没开marlin kernel,vLLM默认对某些量化格式支持不完善,可以试试GPTQ配合--quantization gptq --kv-cache-dtype fp8_e5m9,或者干脆用bitsandbytes的8bit加载,速度损失比4bit小很多。还有个冷门trick,把--enable-prefix-caching打开,如果API请求有重复system prompt能省不少算力。
最后确认下CUDA版本和vLLM的匹配性,我上次就是torch和vllm版本不兼容导致显存分配异常。这模型单卡肯定能跑,只是7B的性价比真不如直接上Qwen2.5 3B的int8,响应速度翻倍还稳。你现在是必须用7B还是可以换小模型?
我之前也踩过这个坑,24G跑7B按理说空间是够的,问题大概率出在vLLM默认会预分配KV cache上。你把gpu_memory_utilization调到0.85左右,swap_space设为4或8,然后max_num_seqs别太高,比如16,这样能明显缓解。AWQ变慢可能是没开--quantization awq的配套flag,或者batch_size太小导致并行度上不去,但说实话7B用FP16加这些参数调整,单卡4090完全能稳跑,不用急着量化。
4090跑7B按理说绰绰有余,你试试把gpu_memory_utilization调到0.9,swap_space设成4,别用AWQ了。
这问题我踩过一模一样的坑,4090跑7B按理说绰绰有余,你试试把gpu_memory_utilization设成0.85,swap_space留个4G,别用默认值。另外max_model_len先砍到4096,能跑通了再慢慢加,vLLM对KV cache的预分配很激进。AWQ变慢大概率是没装对应的量化kernel,检查下是不是用了纯pytorch回退,不过说实话7B用FP16加这些参数调整完全够用,没必要上量化。
4090 24G跑7B按理说很宽裕,你八成是没给KV cache留够余量,试试把gpu_memory_utilization调到0.85,同时swap_space设成2-4G,让显存和内存有个缓冲。另外AWQ慢可能是没开vLLM的量化推理优化,得配合--quantization awq启动,纯加载模型不生效。我这边同卡跑Qwen2.5 7B,max_model_len设4096,batch token数256,稳态显存大概13G,你可以先按这个配置跑通再慢慢往上加。
这问题我也踩过坑,4090跑7B按理说绰绰有余,关键卡在vLLM默认的KV cache预留上。建议先把gpu_memory_utilization调到0.85左右,swap_space设成1或2,别让显存全被缓存占了。另外max_model_len不用非得8192,实际业务没这么长上下文的话改成4096能省一大块。AWQ慢可能是没走对vLLM的量化入口,检查下是不是用了transformers的加载方式,直接传quantization=awq会快很多。输出质量下降的话试试GPTQ 4bit,感觉比AWQ稳一点。
这题我熟,4090跑7B真不用这么憋屈。你试着把gpu_memory_utilization调到0.9,同时把swap_space设成4或8,vLLM会自己管理KV cache的。另外max_model_len没必要一口气吃满,先设4096跑通,后面再按需往上加。AWQ变慢大概率是没开--quantization awq,或者在vLLM里用的不是对应版本,4bit推理不该比FP16慢的。
4090跑7B按理说完全够,你先看下是不是vLLM默认把KV cache占满了,试试gpu_memory_utilization设到0.7左右,给torch留点余量,swap_space设成1到2G就行。AWQ慢很可能是量化后kernel没吃到最佳配置,建议直接上GPTQ或者用bitsandbytes的NF4试试,不过说实话FP16配合上述参数应该就能跑起来,别一上来就量化。另外max_model_len别硬顶8192,实际业务用不到那么长就砍到4096,显存压力会小很多,你那个OOM八成是KV cache预分配的锅。
4090 24G跑7B按理说绰绰有余,你这大概率是vLLM默认把KV cache和激活值一起算进显存了,试试把gpu_memory_utilization调到0.7左右,给torch留点余量,swap_space设成0,别让CPU兜底。AWQ慢可能是因为没有走vLLM的量化内核,检查下是不是用了--quantization awq而不是只加载权重。另外max_model_len别死磕8192,实际业务用4096就够,KV cache瞬间少一半,基本能解决OOM。如果还不行就换flash-attention后端,老版本vLLM对Qwen2.5支持有bug,升到0.6.6以上再试。