最近在搞开源大模型本地部署,想用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 条说实话24G跑7B按理说是够的,你max_model_len设8192配合gpu_memory_utilization默认0.9确实容易爆,可以试试先设成0.7,然后swap_space给个4G,让一部分KV cache走CPU。AWQ变慢大概率是vLLM版本对Qwen2.5的4bit kernel支持不到位,建议直接升到最新版或者换GPTQ试试,另外检查下是否开了--enable-prefix-caching,这个对长文档场景省显存挺明显的。还有个小坑,如果API服务有并发,记得把--max-num-seqs调小到2-4,不然显存会在batch时瞬间飙高。
4090跑7B不该这么惨,我怀疑你vLLM版本太旧,老版本对Qwen2.5的KV cache管理有bug,直接升到0.6.3+再试。另外max_model_len别硬顶8192,先砍到4096跑通,gpu_memory_utilization设0.85,swap_space给4G,剩下交给vLLM自动调度。AWQ慢大概率是没开--quantization awq_marlin,换成这个内核能快不少。你跑的是vLLM还是SGLang?后者对4090的显存分配更激进。
4090跑7B按理说绰绰有余,你这个OOM大概率是vLLM默认把KV cache吃得太多,试试gpu_memory_utilization设到0.85左右,别让它全占满,swap_space先给个4G兜底。另外max_model_len别硬顶8192,实际业务用不到那么长就砍到4096,显存瞬间能省出一大块。AWQ慢可能是没走对vLLM的量化接口,或者batch太小导致kernel开销占比高,我这边实测4bit吞吐反而比FP16高,你检查下是不是没开--quantization awq。输出质量下降的话,可以考虑用GPTQ但调低group_size,或者干脆FP16+KV cache量化,效果和速度平衡很多。
我上周也踩过这个坑,24G跑7B按理说够的,问题多半出在KV cache上。你试下把gpu_memory_utilization设成0.85,别开满,再手动给swap_space留个8G左右,很多报错是预分配炸的。AWQ慢不一定是量化的问题,可能是没开--quantization awq的配套flag,或者batch size没调对。另外你max_model_len其实可以砍到4096试试,长上下文对7B来说收益不大,显存能省一大截。
4090 24G跑7B按理说绰绰有余,你这OOM八成是vLLM默认把KV cache吃满了,试试把gpu_memory_utilization调到0.85,swap_space设成2或者4,别让显存全被预分配。另外AWQ慢可能是没开--quantization awq_marlin,用新内核能快不少,质量损失其实没那么夸张。max_model_len 8192对7B来说有点浪费,改成4096能省出一大块显存,毕竟日常API调用长上下文需求没那么高。
你这情况我太熟了,4090跑7B按理说绰绰有余,问题八成出在vLLM的预分配机制上。gpu_memory_utilization默认是0.9,但vLLM会一次性把KV cache和中间激活全塞进去,24G看着够,实际跑起来峰值直接爆。我建议你先把它调到0.7,swap_space设成4到8G,让显存留点冗余给碎片和临时张量,别让KV cache把显存吃满。另外max_model_len别硬扛8192,Qwen2.5 7B的attention开销是二次方增长的,你先降到4096试试,基本能立省5G以上。AWQ慢大概率是因为你没开vLLM的量化后端支持,要用--quantization awq_marlin这个参数,否则它走的是反量化再计算的老路,当然又慢又损精度。还有个歪招,直接上vLLM 0.6.3以上的版本,新版的PagedAttention对长上下文优化很多,老版本容易莫名多占显存。如果还不行,就把--enforce-eager打开,关掉CUDA graph,虽然单次推理慢点,但显存占用能降个4G左右,适合你这种服务刚启动就挂的场景。最后提醒一句,检查下是不是有别的进程占了显存,nvidia-smi看一眼,有时候是上次崩了的残留进程没清干净。
4090跑7B按理说应该是绰绰有余的,你这个问题大概率不是模型本身的问题,而是vLLM的显存分配策略没调对。我怀疑你之前是不是用了默认的gpu_memory_utilization=0.9?vLLM会预先把90%的显存都锁给KV cache,再加上CUDA context和激活值,24G很容易就爆了。你可以试试把gpu_memory_utilization调到0.75左右,然后强制设置max_num_seqs=4或者更小,这样能明显降低峰值占用。至于AWQ变慢,这很反常,通常4bit推理应该比FP16快才对,我猜你可能是没开vLLM的量化推理优化,需要确认一下是不是真正加载了量化权重,而不是只换了存储格式。另外swap_space这个参数我一般直接设0,因为一旦走CPU offload,速度会断崖式下跌,对于7B这种尺寸完全没必要。我自己在3090上跑过同系模型,主要就是靠牺牲一点并发数来换显存余量,单条请求的延迟反而更稳定。你试试把max_model_len砍到4096,然后开--enable-prefix-caching,如果只是做API服务,长上下文场景不多的话,这个组合基本能稳在15G以内。最后想问你一下,OOM报错是发生在启动阶段还是推理请求进来之后?如果是启动就挂,那可能是你装了多个CUDA版本导致vLLM没正确检测到可用显存,重新装一下对应torch版本可能就解决了。
4090跑7B按理说绰绰有余,你八成是没给KV cache留够余量,试试把gpu_memory_utilization设到0.85,swap_space调成1到2G,别让vLLM默认把显存全吃满。AWQ慢可能是没开vLLM的量化算子优化,得加--quantization awq_marlin参数才行,纯4bit加载反而亏。另外max_model_len别一上来就8192,先开2048跑通流程,再逐步往上加,很多时候是prefill阶段峰值显存爆的。
4090 24G跑7B按理说绰绰有余,你这个问题大概率不是模型本身的问题,而是vLLM的显存分配策略太激进了。我一开始也遇到过类似的坑,后来发现关键在gpu_memory_utilization,这玩意儿默认值是0.9,但实际它会预先把KV cache和激活都算进去,导致你看到的“显存爆炸”其实是预分配而不是真的用满了。你可以试试先设成0.6,把swap_space设成4或者8,让一部分压力走CPU内存,虽然会慢一点但至少能跑起来。另外max_model_len别硬顶8192,Qwen2.5 7B的rope scaling在长文本下KV cache会疯涨,你日常API请求如果大多在2K以内,设成4096甚至2048就够了,省出来的显存能让你把max_num_batched_tokens调高,吞吐反而更稳。至于AWQ变慢,我猜你可能是没开vLLM的awq kernel优化,或者用的老版本,试试升级到最新版再跑一下,4bit的latency应该能接近FP16才对。还有一个容易忽略的点,检查下是不是开了--enforce-eager,这个会禁用CUDA graph,显存占用会掉一截但显存碎片会少很多,对OOM特别有效。最后如果实在不行,可以退一步用llama.cpp的server模式,虽然功能没有vLLM全,但显存控制是真的良心,单卡7B能压到12G以内。
这问题我踩过一模一样的坑,4090跑7B按理说绰绰有余,问题多半出在KV cache上。你先试试把gpu_memory_utilization调到0.85,swap_space设成4到8G,让显存和内存换着用。另外max_model_len别贪,4096就够大多数场景,8192对7B来说KV cache直接吃掉十几个G。AWQ慢是因为你的batch太小,量化反而亏在反量化开销上,单卡建议先跑FP16,实在不行再考虑GPTQ。
4090跑7B还OOM不太正常,试试把gpu_memory_utilization拉到0.95,max_model_len降到4096够用。
你这个配置跑Qwen2.5 7B其实完全够用,OOM多半是vLLM默认把显存吃太满了。试试把gpu_memory_utilization压到0.85左右,别用默认的0.9,留点余量给KV cache和临时张量。max_model_len 8192对24G卡确实有点激进,除非你确定业务真需要这么长上下文,不然降到4096能省一大块KV cache显存。max_num_batched_tokens调到512反而可能让调度更碎,建议配合max_num_seqs一起看,比如max_num_seqs设8到16试试。AWQ变慢我怀疑是你没开enforce_eager或者cuda graph没吃到,4bit本来计算开销就高,吞吐掉一点正常但不会特别夸张。swap_space默认好像4G,如果你CPU内存够可以拉到8到16G,但别指望它救急,主要还是靠gpu_memory_utilization和上下文长度这两个杠杆。单卡4090跑7B API服务完全可行,我这边类似配置QPS能到十几,关键就是别让KV cache把显存撑爆。