最近在搞开源大模型本地部署,想用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试试。
我这边用0.9跑13B都稳,你先把max_model_len砍到4096,再调这个参数,大概率能救回来。
4090 24G跑7B按理说是够的,你这OOM大概率是vLLM默认把KV cache预分配太多了,试试gpu_memory_utilization设到0.85左右,同时把swap_space设成0或者4G,让显存别一次性吃满。另外max_model_len别硬拉到8192,先试4096跑通再往上加,7B模型实际生成长度很少超4k的。AWQ变慢可能是你用的量化版本没针对vLLM做优化,或者batch size太小导致kernel利用率低,我建议先别折腾量化,FP16配合上述参数调优大概率能稳。
4090跑7B按理说挺宽裕的,你试试把gpu_memory_utilization调到0.9,swap_space设成4或者8,别用默认值。另外max_model_len别死磕8192,先降到4096跑通再说,vLLM的KV cache是按最大长度预分配的,这个才是吃显存的大头。AWQ慢可能是没开vLLM的量化优化,记得加载时指定quantization=awq,不然白量化。
我之前也踩过这坑,4090跑7B按理说够用,问题多半出在vLLM默认把KV cache吃满了。试试把gpu_memory_utilization调到0.85左右,swap_space设成2或者4,别用默认值,OOM能缓解不少。另外AWQ慢可能是没开--quantization awq_marlin,vLLM新版对这个支持更好,速度和fp16差距就小了。你max_model_len如果实际用不到8k,砍到4k甚至2k,显存能省出一大截。
4090跑7B按理说绰绰有余,你这个问题大概率不是卡的问题,而是vLLM的显存分配策略在作怪。gpu_memory_utilization默认是0.9,但配合上KV cache的预分配,24G被吃满很正常,尤其你把max_model_len设到8192,KV cache会按最大长度预留,实际单次推理根本用不了那么多。我建议你先把这个值拉到0.75左右,同时把swap_space设成0,因为它会额外占用一部分显存做CPU offload,对单卡场景反而拖累。另外max_num_batched_tokens调低其实对峰值显存影响不大,真正管用的是--kv-cache-dtype fp8_e5m2,这个能直接砍掉一半KV cache显存,精度损失小到可以忽略。至于AWQ变慢,可能是你量化配置没跟上,比如没设--quantization awq_marlin,或者没有用vLLM自带的预量化权重,自己转的话效率肯定差。还有个小技巧,把模型加载改成--enforce-eager模式,能省掉CUDA graph的预分配显存,代价是首token延迟会高点,但至少能跑起来。你先试试这几个组合,大概率能压到15G以内,我最近用同样配置跑过Qwen2.5 7B,峰值才14.6G,很稳。
4090跑7B按理说完全够用,你这个问题大概率不是模型太大,而是vLLM的显存分配策略在作祟。gpu_memory_utilization别用默认值,我试过0.85到0.9之间比较稳,但前提是得把swap_space设成0或者极小值,否则它会预留给CPU交换的显存直接白给。另外max_model_len=8192对7B来说确实偏高,尤其是Qwen2.5的attention计算开销不小,你试着砍到4096,配合max_num_batched_tokens=2048,应该能跑起来。至于AWQ变慢,我怀疑是你没开vLLM的量化推理优化,它在加载量化模型时需要用--quantization awq参数显式指定,不然默认走反量化逻辑,速度反而更差。如果你不追求极致并发,其实FP16配合--enforce-eager模式也能省不少显存,因为默认的CUDA graph会额外吃掉几百MB到1GB。最后建议你开个nvidia-smi盯着看,vLLM启动时显存是分段申请的,如果峰值冲到22G但实际推理时没掉,那可能是prefill阶段爆了,把--max-num-seqs调小到2-4能缓解。这模型单卡绝对能部署,主要是参数之间互相牵制,得慢慢试。
4090 24G跑7B按理说完全没问题,问题大概率出在vLLM的显存预留上,你可以试试把gpu_memory_utilization设到0.85左右,给KV cache留点余量但别太贪。另外max_model_len别硬顶8192,先降到4096跑通再说,其实很多场景用不到那么长上下文。AWQ慢可能是没开vLLM的量化推理优化,得确认下是不是用了对应的量化版本和启动参数,纯靠加载4bit权重不会自动加速。swap_space默认值其实挺保守的,建议先设成1或者2试试,别一下给太多。
4090跑7B按理说绰绰有余,先查下是不是vLLM版本太老,老版本对Qwen2.5的attention缓存计算有bug,更新到0.6.3+基本能解决。另外gpu_memory_utilization别直接拉满,先设0.85留点给CUDA context,swap_space其实对单卡没啥用,设4就够。AWQ变慢大概率是没开--quantization awq_marlin,默认的awq算子确实拉胯。
我上次部署也是撞了一晚上墙,最后发现是max_model_len跟KV cache的预分配逻辑冲突,你把max_num_batched_tokens调回默认,单独把--max-model-len降到4096试试,显存能瞬间掉到14G左右。如果还爆,直接换FP8静态量化,速度和显存都兼顾,质量损失比AWQ小很多。
说实话你这配置跑7B按理说完全够用,问题大概率出在vLLM的显存分配策略上。gpu_memory_utilization默认值是0.9,看起来保守,但vLLM会预分配KV cache到上限,加上CUDA context和激活值,24G很容易被吃满。我建议你先把这个值调到0.7左右,swap_space设成0或者1G试试,别让vLLM为了换页预留太多CPU内存。另外max_model_len其实不用动,关键是max_num_batched_tokens和max_num_seqs这两个参数,如果并发不高,把max_num_seqs降到32甚至16,能显著压低峰值显存。AWQ变慢这事我也遇到过,4bit虽然能省显存,但vLLM对某些量化格式的kernel优化不到位,反而会拖慢速度,我后来干脆用FP16配合上述参数调整,反而更稳。还有个小技巧,可以试试把Qwen2.5的attention实现改成flash_attn,如果环境支持的话,比默认的xformers省不少显存。你要是还卡着,可以贴一下vLLM的日志,看下具体是哪个阶段爆的,是模型加载时还是跑第一轮推理时,这两者的解法完全不一样。
说真的,4090跑7B按理说不该这么惨,你这个问题大概率不是显存不够,而是vLLM的预分配机制在作祟。它默认会把gpu_memory_utilization拉到0.9,加上KV cache的预留,24G看着挺大但实际能用的碎片化空间反而容易被撑爆。我建议你先别动max_model_len,把gpu_memory_utilization降到0.75试试,同时把swap_space设成4到8G,让CPU内存分担一部分临时张量,这样启动时显存占用能压到16G以内。另外AWQ变慢很可能是因为你用的是动态量化,但vLLM对4bit的kernel优化在4090上反而不如FP16的FlashAttention快,所以如果想保速度,直接上FP16然后配合chunked prefill,把max_num_seqs调小到256,效果可能比量化更稳。还有个细节,你检查下是不是装了最新版vLLM,老版本对Qwen2.5的MLA支持有内存泄漏,更新到0.6.3以上有时候光靠bug修复就能省出4到5G。最后我怀疑你是不是开了--enforce-eager模式?那个会禁用CUDA graph,对于长序列推理显存开销是翻倍的,关掉它说不定直接解决。
4090跑7B按理说绰绰有余,你这大概率是vLLM默认把KV cache和中间激活全塞显存了。试试gpu_memory_utilization设到0.85,swap_space给个8G,再把max_model_len砍到4096,分页KV cache会自己优化。另外别用AWQ,7B模型用GPTQ或直接FP16,vLLM对FP16的算子优化更成熟,速度反而比4bit快。
同样配置踩过坑,你这显存冲到22G+大概率不是max_model_len的锅,是vLLM默认把KV cache预留得太狠了。gpu_memory_utilization别按0.9去设,建议直接砍到0.75,swap_space设成4或者8,这样能强制它用一部分CPU内存做溢出缓冲,虽然慢点但至少不会一启动就炸。
AWQ变慢这个太真实了,我试过好几个4bit版本,在4090上反而不如FP16快,因为vLLM对量化kernel的优化还没跟上,尤其Qwen2.5的GQA结构,量化的访存开销比计算开销还大。想省显存不如直接上FP8,huggingface上有官方转换好的版本,精度损失比AWQ小,速度也基本持平。
另外你试过把max_model_len降到4096没?7B模型实际推理长度超过2K的话,KV cache膨胀得特别快,如果业务场景不需要那么长上下文,这参数才是显存杀手。我跑Qwen2.5 7B就是4096长度,配合0.8的utilization,稳态也就15G左右,还能开个40并发。
还有个骚操作是开vLLM的--enable-chunked-prefill,配合--max-num-batched-tokens设为2048,能让长prompt分段处理,显存峰值能再压一截。不过你要是追求低延迟的流式输出,这个反而会变慢,得自己权衡。
最后问一句,你CUDA和vLLM版本分别多少?我一开始用0.6.3也是疯狂OOM,升到0.8.2之后同样参数直接降到18G,这框架版本差异比参数还玄学。
4090跑7B按理说绰绰有余,你试试把gpu_memory_utilization设到0.85,swap_space留0,再不行就换fp8看看。
试试关掉prefix caching,然后max_model_len砍到4096,24G带7B全精度应该稳的,量化反而拖后腿。
4090 24G跑7B其实完全够,问题大概率出在KV cache上,max_model_len设8192确实太激进了,试试把gpu_memory_utilization调到0.9,然后swap_space设成4或者8,给CPU留点交换空间。另外AWQ变慢可能是没开vLLM的量化优化选项,检查下是不是用了--quantization awq,而不是只换了模型权重。我之前用Qwen2.5 7B跑过,FP16加上述参数能稳定跑到2048长度,质量也没啥损失,你可以先从这个配置开始调。
4090跑7B没理由OOM,先把gpu_memory_utilization设0.9,swap_space调2G试试,别动max_num_batched_tokens。
这卡跑7B绰绰有余,问题大概率在vLLM版本和CUDA匹配上,换个0.6.3试试,我这么解决的。
4090 24G跑7B按理说完全够用的,你这个问题大概率出在vLLM的显存预分配逻辑上。gpu_memory_utilization默认是0.9,但vLLM会按max_model_len预留KV cache,你设8192对7B来说确实太激进了,我建议先砍到4096试试,同时把gpu_memory_utilization调到0.85,留点余量给CUDA context和碎片。另外swap_space别设太大,默认4G就够,这玩意儿走CPU内存反而拖慢速度。你提到AWQ变慢,其实不奇怪,vLLM对AWQ的kernel优化不如FP16成熟,尤其小batch下开销更明显,如果非要用量化,可以试试GPTQ或者最近新出的FP8,但说实话7B在单卡上FP16完全能跑,没必要折腾量化。还有个坑是max_num_batched_tokens,你调到512反而可能让vLLM频繁做调度,建议设成2048或直接不设,让vLLM自己根据显存动态调整。最后检查下CUDA版本和vLLM版本,老版本对Qwen2.5支持有bug,升级到0.6.3+会好很多。我同配置跑Qwen2.5 7B,max_model_len=4096,单并发延迟大概40ms,显存稳定在20G左右,你可以参考一下。
你这配置跑7B按理说绰绰有余,问题大概率出在vLLM的显存预分配上。试试把gpu_memory_utilization调到0.85以下,swap_space设成2左右,给KV cache留点缓冲,别让它默认吃满。AWQ变慢可能是没开vLLM的量化推理优化,或者batch size太小导致的kernel开销,建议检查下是否加载了对应的量化config。另外max_model_len可以先用4096跑通,再逐步往上加,有时候是prefill阶段峰值显存爆了。如果还不行,换个思路用flash-attention2后端,能省不少显存。
4090跑7B不至于OOM,你八成是没设gpu_memory_utilization,默认0.9还得留显存给CUDA context,改成0.85试试。
看到你说4090 24G跑Qwen2.5 7B直接OOM,我第一反应是你可能被vLLM的默认显存预留坑了。它默认会拿掉90%的显存做KV cache,但7B模型权重本身就要占14G左右,再加上激活值和碎片,24G根本不够这么造。我建议你试试把gpu_memory_utilization调到0.75左右,同时把max_num_seqs降到32,swap_space设成1或者干脆关掉,这组合拳一般能救回来。至于AWQ变慢,大概率是vLLM对4bit kernel的优化没跟上,尤其在4090上反而比FP16慢,别迷信量化,不如试试GPTQ但开--quantization gptq_marlin,速度会好不少。另外max_model_len别一上来就8192,先设4096跑通,再逐步加,观察nvidia-smi里峰值显存的变化。你还可以考虑开--enable-chunked-prefill,对长prompt的显存波动有奇效。最后,如果还不行,别硬扛,直接上GGUF用llama.cpp做API,虽然吞吐低点,但至少不OOM,先跑起来再说。
你这配置跑7B按理说完全没问题,问题大概率出在KV cache预留上。试试把gpu_memory_utilization调到0.9,同时swap_space设成4-8G,让显存和内存做部分交换,别硬扛全量加载。另外max_model_len可以先砍到4096跑通,确认推理正常再逐步加长。AWQ慢可能是vLLM版本对量化kernel支持不好,建议升到最新版,或者直接试下FP8,效果比4bit好不少。