最近在搞开源大模型本地部署,想用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按理说没这么紧张,问题大概率出在vLLM默认的显存预留策略上。gpu_memory_utilization别用默认值,直接手动设成0.85左右,给KV cache和激活留足余量,不然它会把显存全占满再开始调度。另外swap_space别设太大,4090就24G,设个4G顶天了,这参数主要应对突发长请求,设多了反而挤占计算显存。你那个max_num_batched_tokens调到512反而可能引发碎片化,试试恢复默认,把max_model_len砍到4096,毕竟Qwen2.5 7B实际业务很少真用满8K上下文。AWQ 4bit变慢我怀疑是没开vLLM的量化推理优化,新版要显式指定quantization=awq_marlin,不然走的是朴素反量化路径。还有个冷门trick:把--enforce-eager加上,跳过CUDA graph捕获,能省不少临时显存,代价是首token延迟高一点,但对OOM立竿见影。最后检查下是不是装了最新版vLLM,0.6.x对Qwen2.5系列有专门优化,老版本可能没对齐模型结构导致显存翻倍。
4090 24G跑7B按理说应该挺宽裕的,你这个问题大概率不是模型本身的问题,而是vLLM的显存预分配策略在作祟。gpu_memory_utilization默认是0.9,但vLLM会为了KV cache预留大量显存,加上CUDA context和激活值,24G很容易被吃满。建议你先把这个参数降到0.75左右试试,同时swap_space设成4或8,让部分KV cache走CPU内存,虽然会牺牲点吞吐,但至少能跑起来。
另外你提到的AWQ变慢,可能是因为4bit权重在解码时反量化开销大,加上小batch下优势不明显。我实际测下来,如果追求速度和显存平衡,用FP8(如果卡支持)或者直接开vLLM的--quantization fp8会比AWQ更顺滑,质量损失也小。还有就是max_model_len别硬上8192,7B模型实际业务场景4096足够,多出来的显存留给KV cache做长序列反而更合理。
最后提醒一个容易忽略的点,检查下你的vLLM版本是不是太老,0.4.x和0.6.x的显存管理差异巨大,升级到最新版(比如0.8.x)后,很多OOM问题其实已经通过paged attention优化解决了。如果还想再压显存,可以试试--enable-chunked-prefill,把预填充和生成阶段拆开,能省下不少峰值显存。单卡部署完全可行,关键是把KV cache和计算图这两块分开调优。
4090跑7B按理说绰绰有余,你这问题八成不是显存容量不够,而是vLLM默认把KV cache和activation都预分配了。我之前也踩过这个坑,gpu_memory_utilization别用默认的0.9,直接干到0.85以下,给PyTorch和CUDA context留点余量,不然一启动就爆。swap_space也别设太大,这玩意是给offload用的,你24G卡根本不需要,设成0或者1G就行,不然它会把部分权重塞到内存里,反而增加延迟。另外max_model_len=8192对7B来说确实偏大,如果业务不是必须长上下文,砍到4096能省一大半KV cache显存,速度还能提上去。AWQ慢是因为你显存没释放干净,量化后模型变小了但vLLM还是会按原尺寸预分配buffer,得把max_num_batched_tokens和max_num_seqs同步调低,比如512和8,不然白量化。还有个冷门技巧,用--enforce-eager模式跳过CUDA graph捕获,虽然首token延迟会高一点,但能省下几G的临时显存,特别适合调试阶段。最后建议你开个NVIDIA SMI盯着显存曲线,看看到底是哪一步冲上去的,我怀疑你可能是tokenizer或者prefill阶段爆的,那得调preemption模式。
我最近也在折腾vLLM,发现它默认会预分配差不多整个显存给KV cache,24G跑7B其实挺紧的。你可以试试把gpu_memory_utilization调到0.85左右,然后swap_space设成4或8,让部分KV cache落到内存里。另外max_model_len别硬扛8192,实际业务用4096或2048就够了,显存占用能掉一半。AWQ慢可能是没走对vLLM的量化加载路径,检查下是不是真的启用了量化推理,有时候只是权重换了但计算图没变。
4090跑7B按理说很宽裕,你试试把gpu_memory_utilization降到0.85,swap_space设成4,别用AWQ。
同款4090,我之前也卡在这儿过。你试试把gpu_memory_utilization设到0.85,swap_space留个4G,然后max_model_len别硬撑8192,改成4096先验证能跑通再说。vLLM对KV cache的预分配特别激进,你那个OOM大概率是它默认把显存全吃进去做缓存了,不是模型权重的问题。
另外AWQ变慢这事儿不奇怪,7B模型量化的收益本来就有限,反而因为反量化开销拖慢速度。我建议你直接用FP16,但把--kv-cache-dtype设为fp8_e5m2(如果你的vLLM版本支持),能省不少显存且几乎无损。如果还不行,检查下是不是装了最新版CUDA和flash-attn,老版本对Qwen2.5系列支持有bug。
最后说句实话,7B在24G卡上单卡部署完全没问题,我跑过Qwen2.5 14B AWQ都能勉强塞进去,所以你大概率是参数没吃透。建议把max_num_batched_tokens设成1024,max_num_seqs设成2,先把并发压到最小,一步步加参数找临界点。别一上来就追求满负载。
4090跑7B按理不该爆,要不试试把gpu_memory_utilization设成0.9再关掉swap_space?另外检查下是不是CUDA版本和vLLM不匹配导致的显存碎片。
同卡同模型,我最后是把gpu_memory_utilization调到0.85,swap_space留8G才稳住的。你那个max_num_batched_tokens降到512其实没用,关键是把max_model_len也砍到4096试试,7B全精度本来就很极限。AWQ慢大概率是vLLM版本对量化支持不完善,更新到最新版或者换GPTQ可能好点。另外建议开一下--enable-chunked-prefill,我开了之后显存峰值直接降了3G多。
我上周刚用4090跑过这个模型,24G其实够用,但vLLM默认会预留很多显存给KV cache,你试试把gpu_memory_utilization调到0.85,swap_space设成4或者8,别让它自动分配。另外max_model_len别硬撑8192,先降到4096跑通再说,不然单次推理都启动不了。AWQ慢可能是没开vLLM的量化优化,记得在启动命令里加--quantization awq,不然等于白量化。输出质量下降的话,可以对比下FP16和AWQ的采样参数,温度调低点试试。
4090跑7B按理说没啥压力,你试试把gpu_memory_utilization调到0.9,swap_space设成4,然后max_model_len先砍到4096跑通再说。另外注意vLLM的prefill和decode会同时占显存,别只盯着batch tokens调。AWQ慢可能是没走对量化kernel,换个GPTQ或者直接用FP8试试,质量损失会小很多。
4090单卡跑7B按理说够用,试试把gpu_memory_utilization调到0.9且关掉swap_space,可能你被默认的KV cache预留坑了。
4090跑7B按理说绰绰有余,问题多半出在vLLM的显存分配策略上。你可以试试把gpu_memory_utilization调到0.85,同时把swap_space设成4或8,给KV cache留点余地,别让预分配吃满。另外max_model_len先砍到4096跑通再说,毕竟实际请求长度很少真到8K。AWQ变慢可能是没开vLLM的量化优化,记得加--quantization awq,或者直接上FP8试试,质量损失比4bit小很多。
显存爆多半是KV cache默认吃太狠,试试gpu_memory_utilization调到0.85,swap_space设个8G看能不能跑起来。
4090跑7B其实够用,别用AWQ,开个fp8或者直接用vLLM默认的auto模式更稳,量化那点提升不够折腾的。
4090 24G跑7B按理说完全够用,你先别急着上量化,把gpu_memory_utilization调到0.85左右,swap_space设成4或者8试试,vLLM默认预留显存太保守了。另外max_model_len其实不用一开始就拉满,可以先设4096跑通流程,再看实际峰值显存决定要不要加长。AWQ慢可能是你batch size太小或者没开VLLM的continuous batching优化,4bit的精度损失对大多数任务其实可接受,你对比下吞吐而不是单次延迟试试。要是还爆,检查下是不是CUDA版本和vLLM不匹配,有时候是底层库的问题。
4090跑7B按理说很轻松,你是不是把gpu_memory_utilization设成默认值1.0了?我一般会手动设到0.85-0.9,给CUDA留点buffer,不然光kv cache就能吃满。另外max_model_len没必要死磕8192,实际业务里4K基本够用,砍半之后显存压力小很多。
AWQ变慢大概率是没开vLLM的量化优化,得用--quantization awq指定才能吃到加速,不然等于白量化。swap_space建议先设成0,让vLLM死磕显存,真OOM了再一点一点往上加,这参数是给显存不够时用的,24G卡基本用不上。
对了,你确认过CUDA版本和vLLM匹配吗?我之前遇到过因为torch和vLLM版本不兼容,导致显存分配异常的情况,重装对应版本的torch后直接好了。
说实话你这配置跑7B按理说完全够的,问题大概率出在vLLM的默认缓存策略上。24G显存塞下FP16权重大概14G,剩下的空间要同时容纳KV cache和激活值,max_model_len=8192对这种模型来说确实太激进了,7B的KV cache在长上下文下能吃满8-10G。我建议你先试一下把gpu_memory_utilization调到0.85到0.9之间,别用默认值,然后swap_space设成4或者8,让部分KV cache落到内存里,这样虽然会牺牲一点吞吐但至少不会OOM。另外你提到的AWQ变慢这个现象很常见,因为4bit反量化本身有计算开销,如果batch size不大反而比FP16更慢,你可以试试GPTQ或者FP8,或者干脆用FP16但把max_num_seqs限制在4以内,同时把block_size改成16或32,减少碎片化显存占用。还有一个容易被忽略的点,如果你装了多个CUDA版本或者PyTorch和vLLM版本不匹配,也可能导致显存分配异常,建议用官方推荐的torch版本重新装一遍vLLM。最后,如果真的想省显存,可以试下把模型的attention实现改成flash_attention,能显著降低KV cache的显存需求,不过我猜你现在的版本应该已经默认开启了。你先按这个思路调调看,如果还不行可以把vLLM版本和启动日志贴出来,大家一起帮你看看。
同款配置帮顶,我一开始也这样,后来发现不是显存不够,是vLLM的KV cache预留太激进了。你试试把gpu_memory_utilization调到0.85以下,然后swap_space设成4G左右,别让显存被预分配占死。另外4090跑7B其实完全够,别急着上量化,FP16配合continuous batching在max_num_batched_tokens=2048时我这边稳得很,输出质量也没问题。AWQ慢多半是没开vLLM的量化算子优化,更新到最新版再看看。
4090跑7B不应该OOM,试试gpu_memory_utilization调到0.9,swap_space留2G,另外检查下是不是vLLM版本太老。
4090跑7B按理说绰绰有余,你八成是vLLM默认把KV cache吃满了,试试把gpu_memory_utilization压到0.7左右,再给swap_space留个4G,别让显存全被缓存占了。AWQ慢可能是没走对GQA优化,或者batch太小,但说实话7B用FP16够用,真没必要上4bit。另外max_model_len别硬撑8192,实际业务调到4096能省一半缓存,先跑通再慢慢加。你用的是最新版vLLM吗?老版本对Qwen2.5的显存管理确实有坑。
看到你这情况我太有共鸣了,4090跑7B按理说绰绰有余,OOM八成不是显存不够,而是vLLM默认把KV cache和激活全塞进显存了。你先别急着换量化,把gpu_memory_utilization调到0.85左右,然后swap_space设成4或者8,给CPU留点后备,这样至少能先跑起来。AWQ慢可能是因为你batch size太小,量化后反而触发了解码时的额外开销,建议配合vLLM的--quantization awq --kv-cache-dtype fp8_e5m2一起用,速度能回来一些。还有max_model_len别死磕8192,实际业务用不到这么长,设成4096甚至2048,显存压力直接小一半。我自己的经验是,7B模型在24G卡上,最大瓶颈其实是attention的显存占用,你可以开一下--enable-chunked-prefill,把长请求切成块,能明显降低峰值。另外检查下你是不是开了多个并发请求,vLLM默认会预留很大一块显存给调度器,单线程测试时反而浪费。最后实在不行,试试把模型转成FP8动态量化,比AWQ质量损失小,速度也接近FP16,我跑Qwen2.5 7B就是这么干的。