最近在试着把Qwen2.5 32B部署到公司的一台A100(80G)上做推理服务。按照官方文档配了vLLM,结果一加载模型就报OOM,看了下日志说是显存不够分配。我理解32B全精度肯定不行,所以试了AWQ 4bit量化版,但启动时还是卡在显存分配上。有人说是vLLM的KV cache默认开太大了,也有人建议用FlashAttention或者调低max_num_seqs。我这边服务QPS要求不高,主要是想把它先跑起来做内部demo。想问问大家,除了换小模型或者多卡,还有没有其他配置方法能把这个模型塞进单卡?比如调整vLLM的gpu_memory_utilization或者改用动态批处理?先谢谢了!
用vLLM部署Qwen2.5 32B时显存爆炸,求大佬指点优化方向
全部回复
共 139 条我之前也踩过这个坑,A100 80G跑32B AWQ其实够用,问题多半出在vLLM默认把gpu_memory_utilization设成了0.9,KV cache预留太多。你直接把它调到0.7左右,再把max_num_seqs降到16或者8,基本就能塞进去。另外确认下是不是加载时把tokenizer和模型权重同时放显存了,可以试试先加载权重再初始化引擎。如果还不行,把--enable-prefix-caching关掉,有时候这个也会多占不少显存。
gpu_memory_utilization调到0.85,再把max_num_seqs砍到16,AWQ版跑demo应该稳了。
把KV cache手动限一下,比如设max_model_len到4096,基本能塞进去,试过有效。
我之前也踩过这个坑,A100 80G跑32B AWQ其实完全够用,问题大概率出在vLLM的默认配置上。你先把gpu_memory_utilization调到0.85左右,然后max_num_seqs改小到16试试,这两个参数对显存占用影响特别大。另外记得把KV cache的预留比例调低,vLLM默认会吃掉大量显存做缓存,实际推理用不了那么多。如果还不行,可以看看是不是prompt长度设太高了,内部demo的话把max_model_len限制到4096或8192能省不少。
我之前也踩过这个坑,A100 80G跑32B AWQ按理说是够的,问题大概率出在vLLM默认的KV cache预留上。你可以试试把gpu_memory_utilization调到0.7或者更低,给模型权重和激活留出更多余量,我这边调到0.65才稳定跑起来。另外max_num_seqs别用默认值,改成32甚至16,虽然吞吐会降,但demo阶段完全够用。还有个容易被忽略的点,检查下是不是用了--enable-prefix-caching,这个在某些版本下会额外吃显存。FlashAttention确实能省不少显存占用,但vLLM现在对Qwen2.5的FA支持还不算太完美,如果你用的是最新版本,可以试试手动开一下,如果报错就回退到旧版。动态批处理其实不会直接降显存,它只是提高利用率,但你QPS不高的话,不如直接固定batch size=1,配合--max-model-len调低到4096或8192,能省一大块KV cache。最后建议你启动时加--swap-space 0,禁用CPU offload,有时候这个默认值反而会跟显存分配打架。如果还是OOM,把量化版本换成GPTQ的4bit,AWQ在极端低bit下偶尔有兼容性问题。跑通之后可以把实际显存占用发出来,大家再帮你细调。
我之前也遇到过同样的情况,AWQ 4bit按理说应该能塞进80G,但vLLM默认会预留很大比例的KV cache,你直接把gpu_memory_utilization调到0.85以下试试,我这边0.8就稳了。另外max_num_seqs调小到64或者32,对低QPS的demo影响不大,但显存占用能降不少。如果还不行,可以看看是不是context length设太长了,改成4096或2048会省很多。你跑起来后可以留意下nvidia-smi,有时候是碎片化问题,重启下容器可能就解决了。
我之前也踩过这个坑,gpu_memory_utilization确实得手动调,默认值太激进了,我直接设成0.85才跑起来。另外你可以把max_num_seqs降到16甚至8,这玩意儿对显存占用影响比想象中大,QPS要求不高的话完全够用。对了,AWQ版记得确认下vLLM版本对Qwen2.5的量化格式支持到位没,我之前用旧版就莫名其妙报错,升到最新版就好了。
之前踩过类似的坑,A100跑32B AWQ其实完全够用,问题大概率出在默认配置上。建议先把gpu_memory_utilization调到0.85左右,给KV cache留点余量,同时把max_num_seqs降到16甚至8,QPS不高的话影响不大。另外确认下是不是加载了多份模型权重,有时候是HuggingFace缓存和vLLM的tokenizer重复占显存。实在不行可以先不加载AWQ,用FP16加--enforce-eager模式试试,能跑起来再逐步优化。
我之前也踩过这个坑,A100 80G跑32B AWQ按理说是够的,问题多半出在vLLM默认把KV cache预留得太激进。你可以试试把gpu_memory_utilization调到0.85以下,给模型权重和中间激活留出余地,我这边调到0.75才稳定跑起来。另外max_num_seqs别用默认值,改成16或者8,动态批处理对显存峰值影响很大,QPS要求不高的话完全够用。还有个小细节,确认一下你用的AWQ版本是不是和vLLM当前版本兼容,有时候量化格式不匹配会导致vLLM偷偷回退到fp16加载,那肯定爆。FlashAttention建议开着,但需要注意它和某些量化kernel的配合,我在0.6.x版本上就遇到过冲突,升级到最新版才解决。你可以先试着用--kv-cache-dtype fp8这个参数,能省不少显存,虽然精度略有损失但demo完全没问题。如果还卡在分配阶段,干脆先不加--max-model-len,默认的8192都嫌长,改成4096试试,很多场景根本用不到那么长的上下文。最后实在不行就干脆分两卡,tensor-parallel-size 2,但既然你坚持单卡,上面的参数组合应该能搞定。
我之前也踩过这个坑,A100 80G跑32B AWQ按理说余量挺大的,问题多半出在vLLM默认把KV cache预留得太贪了。你可以先试试把gpu_memory_utilization调到0.7左右,给模型权重和中间激活留出安全空间,这个参数对显存占用影响非常直接。另外max_num_seqs不用调太低,但max_model_len如果设置得比实际需求大很多,KV cache也会按最大长度预分配,建议砍到2048或者4096试试,demo场景完全够用。FlashAttention在vLLM里默认应该已经启用了,反而不用太纠结,倒是可以看一眼是不是paged attention的block大小设置不合适。如果还卡在加载阶段,检查一下是不是量化格式和vLLM版本不匹配,AWQ的group size不同会导致内存布局差异,有时候换一个vLLM的小版本反而能解决。还有个野路子,你可以先关掉continuous batching,虽然吞吐会降,但启动时显存占用会小一截,跑通流程再慢慢优化。
把gpu_memory_utilization调到0.85,再配上--max-model-len砍到4096,大概率就能塞进去了。
我之前也碰到过类似问题,A100 80G跑32B AWQ按理说是够的,但vLLM默认会预留大量显存给KV cache,你可以试试把gpu_memory_utilization调到0.85左右,再配合--max-model-len限制一下序列长度,能省出不少空间。另外max_num_seqs别设太高,8或16就够demo用了,FlashAttention对显存占用也有帮助,但记得要装对CUDA版本。如果还卡,检查下是不是量化版本加载时用的是float16而不是int4,有些时候模型文件没对也会导致OOM。
把gpu_memory_utilization调到0.85试下,同时把max_num_seqs降到8,AWQ 4bit按理说80G够跑。
我之前也遇到过一模一样的坑,A100 80G跑32B AWQ按理说应该够,但vLLM默认会预留很大比例的显存给KV cache,你试试把gpu_memory_utilization调到0.7左右,给模型权重和激活留足空间。另外max_num_seqs和max_num_batched_tokens同时调小一点,比如32和2048,能显著降低峰值显存。如果还不行,可以开一下FlashAttention,vLLM里直接设--flash-attn,有时候能省出不少。你QPS不高的话,甚至可以把KV cache策略改成lru或者干脆禁用,demo阶段完全够用。
gpu_memory_utilization调到0.85,再把max_num_seqs砍到32,基本就能跑起来了,我这么干过。
试试--max-model-len砍到4096,KV cache直接少一半,80G带AWQ应该稳。
遇到过一样的坑,A100 80G跑32B AWQ按理说够的,问题大概率出在KV cache预留上。你可以试试把gpu_memory_utilization调到0.85左右,然后max_num_seqs设成16甚至8,这俩参数对显存占用影响特别直接。另外开flash-attn也能省不少,vLLM里直接enable_flash_attention就行。如果还卡,干脆先不用AWQ,直接用FP8或者GPTQ的4bit版本,有时候量化格式不同显存占用差异也挺明显的。
gpu_memory_utilization调到0.85试试,再把max_num_seqs砍到16,AWQ版应该能跑起来。
我之前也遇到过,把KV cache的预留调小点就好,你这QPS要求不高完全够用。
我之前也踩过这个坑,A100 80G跑32B AWQ其实理论上是够的,问题多半出在vLLM默认把KV cache预留太多了。你可以试试把gpu_memory_utilization调到0.85左右,然后max_num_seqs改成8或者更小,这样能给模型权重腾出不少空间。另外FlashAttention记得开起来,官方现在默认支持,能省不少显存。如果还不行,检查下是不是用了--dtype=float16,AWQ量化版应该配--quantization awq让它自己读配置,别手动指定精度。我这边之前就是这么调通的,QPS低的话完全够用。
把gpu_memory_utilization调到0.7,再配合--max-model-len砍到4096,大概率能跑起来。
我上次跑13B也遇到过类似问题,后来发现gpu_memory_utilization默认0.9在80G上其实挺危险的,尤其你还有量化模型,建议直接压到0.7以下试试。另外max_num_seqs调成32或者更低,配合--enable-prefix-caching能省不少显存。如果还不行,可以看看是不是tokenizer或者权重加载时峰值太高,用--swap-space和--max-model-len一起控制一下。
把gpu_memory_utilization调到0.85,再配合--max-model-len砍到4096,基本能塞进去,我这么干过。
试试把max_num_seqs调到32,同时开enable_prefix_caching,显存占用能降一截,demo够用了。