最近在试着把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 条试过把gpu_memory_utilization调到0.85或0.9没?我上次部署33B模型也是卡在显存,调低这个参数后立马能跑起来。另外max_num_seqs先设成8或者16试试,别默认的256,KV cache占大头就是这玩意儿。FlashAttention确实能省点显存,但主要还得靠限流和调低max_model_len,毕竟demo对长度要求不高。动态批处理不用动,QPS低的话单请求逐个推理反而更稳。
我最近也踩过这个坑,A100 80G跑32B AWQ确实得抠一抠显存。你可以先把gpu_memory_utilization调到0.85甚至0.8,给模型预留点余地,同时把max_num_seqs设成8或16,别让KV cache占太多。另外FlashAttention基本是必开的,能省不少显存,vLLM新版默认就带这个选项。如果还不行,试试把max_model_len砍到4096,demo场景下影响不大,但能直接省出一大块空间。
同款坑,我之前部署Qwen2.5-32B时也卡在这,后来发现关键是gpu_memory_utilization要压到0.85以下,默认0.9在A100上容易爆。KV cache手动限制一下,比如设个max_num_batched_tokens=2048,然后把max_model_len调低到4096或者2048,demo场景够用了。另外你用的AWQ版本,检查下vLLM版本是不是0.6.0以上,旧版对量化支持有显存泄漏bug。
试试把gpu_memory_utilization调到0.85以下,同时把max_num_seqs设成8或更小,应该就能跑起来了。
我之前也遇到过类似问题,A100 80G跑32B量化版按理说够用,大概率是vLLM默认的KV cache预留太多了。你可以试试把gpu_memory_utilization调到0.85甚至更低,同时把max_num_seqs设成16或者8,这样能省出一大块显存。另外如果QPS要求不高,还可以把max_model_len设小一点,比如4096,这样KV cache占用会直接降下来。你可以先调这两项试试,应该能跑起来。
我之前也遇到过类似的情况,A100 80G跑32B AWQ其实空间是够的,但vLLM默认会把KV cache预分配得很激进。你可以试试把gpu_memory_utilization调到0.85左右,同时把max_num_seqs降到16或者8,这样能省出不少显存给模型权重。另外如果你用的是旧版vLLM,建议升到0.6以上的版本,它对量化模型的内存管理优化了不少。我这边之前用同样的配置跑过,把这两个参数调完基本就能稳住了,你可以先试下这个组合。
gpu_memory_utilization调到0.85再配--max-model-len砍到4096,基本就能塞进去,我这几天刚这么跑通。
试试把max_num_seqs降到16,同时开--enable-prefix-caching,显存能省不少,demo够用了。
我之前也踩过这个坑,A100 80G跑32B AWQ其实完全够,问题基本出在KV cache上。你可以先把gpu_memory_utilization调到0.85左右,然后max_num_seqs改小到16或8,这俩参数最影响显存占用。另外开一下--enable-prefix-caching,对内部demo这种重复请求多的场景能省不少显存。还有个小技巧,用--kv-cache-dtype fp8_e5m2,能把KV cache减半,效果挺明显的。你试试这几个组合,应该能跑起来。
我之前也遇到过类似情况,AWQ 4bit加载时OOM大概率不是权重本身的问题,而是KV cache的默认预留空间太大了。你可以试试把gpu_memory_utilization调到0.85以下,同时把max_num_seqs降到16甚至8,这样能省出不少显存给模型权重。另外如果QPS要求不高,可以开vLLM的--enable-prefix-caching,配合动态批处理能明显降低峰值占用。还有个取巧的办法,把模型输入长度限制在2048以内,KV cache会小很多,内部demo完全够用。
你这情况我之前也踩过,A100 80G跑32B AWQ其实有戏,问题多半出在vLLM默认把KV cache预留太多了。可以先把gpu_memory_utilization调到0.85左右,再配上--max-model-len砍到4096或2048,内部demo够用了。另外max_num_seqs调成32甚至16能明显降峰值显存,FlashAttention最好开着,如果还不行就试试--enable-chunked-prefill,把prefill和decode拆开跑,我这边就是这么塞进单卡的。
把gpu_memory_utilization调到0.85,再配合--max-model-len砍到4096,基本就能塞进去了。
我之前也踩过这个坑,A100 80G跑32B AWQ按理说空间是够的,问题多半出在vLLM默认把KV cache预分配得太狠了。你可以先把gpu_memory_utilization调到0.7左右试试,给模型权重和激活留出余量,这个参数比max_num_seqs影响更直接。另外,如果你用AWQ版本,确认一下是不是真的加载了量化权重,有时候代码里忘了传quantization参数,vLLM会默默按BF16跑,那必然爆显存。FlashAttention在vLLM新版里基本是默认开的,不用特别折腾,但可以检查一下你的CUDA版本和vLLM版本是否匹配,老版本对量化支持有问题。还有一个偏方:关掉连续批处理里的prefix caching,虽然会稍微降低吞吐,但省下的显存可能刚好让你跑起来。动态批处理本身不省显存,它只是提高利用率,但如果你QPS要求低,反而可以把max_num_seqs设成64甚至32,再配合--max-model-len调短一点,比如4096,对demo来说够用了。我上次跑类似模型就是靠这几个参数组合塞进去的,你试完可以回来反馈下具体报错信息,如果还卡在分配那一步,可能得看看是不是有其他进程占了显存。
我之前也遇到过类似情况,当时是把gpu_memory_utilization直接压到0.75,同时把max_num_seqs调成64,总算能跑起来。你那个AWQ版本如果还OOM,可以试试把KV cache的复用开关关掉,vLLM有个--kv-transfer-config参数能省一点。另外如果demo场景并发很低,可以考虑把--max-model-len调小,比如4096,显存能吐出来不少。动态批处理其实对显存峰值影响不大,主要还是看KV cache怎么分配。
我之前也踩过这个坑,A100 80G跑32B AWQ按理说是够的,问题大概率出在vLLM默认把KV cache预分配得太狠了。你可以先把gpu_memory_utilization调到0.85左右试试,别让它一次性把显存全占了,留点余量给模型权重和激活值。另外max_num_seqs确实影响很大,默认值偏高,你QPS要求不高的话直接砍到16甚至8,KV cache压力会小很多。还有个思路是开--enable-prefix-caching,虽然不直接减显存,但对demo场景的重复请求能省不少计算。如果还是卡,检查下是不是加载时又把tokenizer和模型副本同时塞进去了,有时候是代码里重复初始化了。最后实在不行就试试FP8动态量化,有些卡支持这种格式,比AWQ的显存占用再低一截,但得确认你的vLLM版本兼容。先调这几个参数,大概率能跑起来。
我之前也遇到过类似问题,A100 80G跑32B AWQ按理说应该够的,你试试把gpu_memory_utilization调到0.85左右,给KV cache留点余量但别全占满。另外max_num_seqs调小到64甚至32,对demo场景影响不大,但显存压力会小很多。还有个小技巧,开--enable-prefix-caching能省一些重复计算的内存,你可以顺手开了看看。
我上次部署Qwen2.5 32B时也卡在这,后来发现是tokenizer的预分配太激进,你把--max-model-len从默认的32768砍到16384,显存直接少掉一块,效果立竿见影。vLLM里还有个--quantization参数,确保你加载AWQ时明确指定了是awq,别让它自动探测,有时候会误判导致额外开销。你QPS不高的话,甚至可以把--max-num-batched-tokens设成4096,彻底牺牲吞吐换稳定启动。
楼上说的都对,我再补一个坑,你检查下是不是用了--enforce-eager模式,vLLM默认是CUDA graph捕获,这玩意儿在A100上会提前占不少显存,关了它启动时能省好几G。另外你的AWQ文件如果是自己转的,注意下group_size是不是128,有些转换工具默认192会跟vLL
把gpu_memory_utilization调到0.85左右,再配合--max-model-len砍到4096,我这么跑过70B都能塞进单卡。
试试把--max-num-seqs降到8,再开下--enable-prefix-caching,我之前这么搞就把32B的KV cache压下来了。
把gpu_memory_utilization调到0.85,再把max_num_seqs压到64,基本就能塞进去了,AWQ4bit肯定够用。
我之前也踩过这个坑,A100 80G跑32B AWQ按理说容量是够的,问题大概率出在vLLM默认把KV cache预留得太狠了。你可以试试把gpu_memory_utilization调低到0.7甚至0.6,给模型权重和激活留出喘息空间,我那次调到0.65就顺利加载了。另外max_num_seqs别用默认值,这玩意儿直接决定KV cache的上限,你QPS不高的话直接压到16或者8,内存占用能肉眼可见地降下来。还有个小技巧,启动时加--enable-chunked-prefill,虽然会稍微牺牲点吞吐,但能避免长prompt瞬间把显存打满,对demo场景特别实用。如果你用的是最新版vLLM,记得检查下是否开了FP8 KV cache,用--kv-cache-dtype fp8_e5m2能再省一截显存,不过注意得看显卡是否支持。最后实在不行,可以试试--max-model-len砍到4096,很多内部demo根本用不到那么长的上下文,这招往往是压死骆驼的最后一根稻草。我这边曾经用类似配置跑过Qwen2.5 32B AWQ,单卡稳定运行,就是偶尔生成长文本时速度会掉,但内部演示完全够了。
把gpu_memory_utilization调到0.85,再把max_num_seqs压到16,KV cache预留小点基本能跑起来。
A100 80G跑32B AWQ其实理论上是够的,问题大概率出在vLLM默认的显存预留策略上。你先把gpu_memory_utilization调到0.85左右试试,别让它自动算,有时候自动检测会保守得离谱。另外KV cache确实是个大坑,你可以直接设max_num_seqs=8或者更小,配合--kv-cache-dtype fp8,这俩组合能省出不少空间。我上次跑类似模型甚至把--max-model-len砍到4096,demo场景根本用不到那么长上下文。FlashAttention在vLLM新版里基本是默认开的,不用额外操心,倒是--enable-prefix-caching可以关掉,省一点碎片。还有个小技巧,启动前先看下nvidia-smi里有没有别的进程占显存,我遇到过Zombie进程吃了几G导致OOM。如果还不行,试试把模型丢到/dev/shm里做预加载,但那个是内存换显存的路子,不推荐。最后问下你用的是vLLM哪个版本?0.6.x和0.7.x的显存管理策略差挺多的,升到最新版有时反而能解决老版本的内存泄漏。