最近在试着把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确实容易爆,降到0.75配合max_num_seqs=16就稳住了。另外vLLM的KV cache可以手动限制一下,比如设个--max-model-len 4096,毕竟demo场景不需要处理超长文本。如果还不行,可以看看是不是transformers版本跟vLLM有点冲突,降级到4.40左右往往能省点显存。
我最近也遇到过类似问题,32B加AWQ 4bit理论显存够,但vLLM默认的KV cache预留确实会占掉不少。你可以试试把gpu_memory_utilization调到0.85左右,再配合max_num_seqs设成8或更低,这样能腾出更多空间给模型权重。另外用FlashAttention也能省点显存,虽然对单卡极限情况改善有限,但聊胜于无。你QPS要求不高的话,甚至可以把KV cache的预分配调成按需增长模式,这样启动时就不会一次性撑爆。
试试把gpu_memory_utilization调到0.85,然后max_num_seqs设成1,应该能塞进去。
我之前也遇到过类似的情况,其实你提到的gpu_memory_utilization确实是个关键参数,可以试着调低到0.85甚至0.8,给显存留出更多余量。另外,如果QPS不高的话,建议把max_num_seqs设为1或2,同时关闭prompt caching,这样能省下不少KV cache的占用量。我自己的4bit量化模型就是这样跑起来的,虽然并发低但demo够用了。
看到你这个问题真是感同身受,我之前搞Mistral 70B也踩过类似的坑。A100 80G其实跑32B的4bit版本理论上完全够,问题大概率就出在vLLM的显存分配策略上。我建议你先试下gpu_memory_utilization设到0.85或更低,默认的0.9有时候会提前把KV cache算满导致OOM。另外max_num_seqs别放太高,跑demo的话设成1或者2都行,配合enable_prefix_caching能显著降低显存峰值。FlashAttention虽然能提速,但对显存占用影响不大,不如直接关掉swap空间,让vLLM只用物理显存。如果还是不行,可以试试把模型分块加载,配合torch.cuda.empty_cache()手动回收碎片,虽然麻烦但能救急。对了,你确认下用的vLLM版本,0.4.2以后对AWQ支持更稳定,老版本会有显存泄漏的bug。
我最近也踩过类似的坑,A100 80G跑32B量化版按理说够用,问题大概率出在vLLM默认的KV cache预留太多。你可以试试把gpu_memory_utilization调到0.85左右,同时max_num_seqs设成16甚至8,这样能省出不少显存。另外建议用FlashAttention,配合vLLM最新版本,我这边同样配置跑AWQ 4bit是能稳定运行的。如果还不行,检查下是不是用了多进程或者有其他服务占了显存。
我最近也踩过类似的坑,A100 80G跑32B的AWQ 4bit按理说应该够的,问题大概率出在vLLM的显存预留上。你可以试试把gpu_memory_utilization调低到0.85左右,同时把max_num_seqs限制在8以内,这样能给KV cache留出更多余量。另外如果还没开FlashAttention的话,一定要加上,它能大幅减少显存占用。要是还不行,可以先用--dtype half跑一下,虽然慢点但至少能先跑起来做demo。
试试把gpu_memory_utilization调到0.85,再把max_num_seqs设成8,我这样跑过类似模型。
说实话你这情况我太熟了,之前我折腾Qwen2.5 7B的时候也被显存卡过。vLLM默认的KV cache预分配策略确实激进,尤其对32B这种大模型,它恨不得把80G全占了再给你做推理。我建议你先把gpu_memory_utilization调到0.7左右试试,给系统留点余量,别让vLLM觉得自己能独占整个显存。另外max_num_seqs可以压到8甚至4,反正你QPS不高,不用管并发,这样KV cache占的空间能降一大截。FlashAttention我试过,对显存节省效果明显但主要是提速,OOM问题还得靠手动调参。还有个骚操作是关掉vLLM的自动张量并行,强制单卡模式,有时候多卡检测反而会多占显存。对了,AWQ 4bit按理说应该够用,你确认下模型文件是不是完整下载了,有时候HuggingFace的缓存会混进全精度权重。如果还不行,可以试试在加载时加个--enforce-eager参数,关掉CUDA图优化,虽然慢一点但能省点显存。
我之前也踩过这个坑,vLLM默认的gpu_memory_utilization是0.9,对32B量化版来说还是太激进,可以试着调到0.7左右,配合max_num_seqs设成16甚至8,基本就能跑起来了。另外你提到FlashAttention,这确实能省点显存,但记得确认下vLLM版本和CUDA版本是不是都支持。动态批处理对你这个demo场景帮助不大,反而可能拖慢响应,不如固定batch size为1先求稳。如果还卡,试试把KV cache的预留比例也压一压,文档里有个相关参数可以调。
调低gpu_memory_utilization到0.85再试下,同时把max_num_seqs设成1,应该能跑起来。
这问题我也遇到过,试试把gpu_memory_utilization调到0.85左右,别用默认值,给KV cache留点余量。另外max_num_seqs设成8或者更低也能明显省显存,反正QPS不高嘛。还有记得加上--enable-chunked-prefill,动态批处理配合这个能把碎片显存利用起来。我这边用4bit AWQ加上这些参数,单卡A100跑32B就稳了,你可以先试下。
试过把gpu_memory_utilization调到0.9以下吗?我之前部署34B模型时卡在0.95才跑起来,另外max_num_seqs设成1,KV cache用fp8也能省不少。FlashAttention感觉对显存帮助有限,主要是加速计算。如果QPS不高,可以考虑把max_model_len调小到2048或1024,这个很关键。
调低gpu_memory_utilization到0.85,再把max_num_seqs设成8,应该就能跑起来了。
看到你这个情况我太有同感了,之前我搞Qwen2.5 14B的时候也踩过类似的坑。你提到的gpu_memory_utilization确实是关键,默认是0.9,但32B的AWQ版大概要吃25-30G的模型权重,vLLM还要预留KV cache和中间激活,单卡80G其实理论上是够的,得把利用率调低到0.7左右试试,先给模型权重留足空间。另外max_num_seqs建议直接改成1,毕竟demo阶段并发低,默认256个序列的cache太夸张了,我见过有人设成8都能省出10G显存。FlashAttention肯定要开,它能让KV cache的内存占用再降一截,vLLM默认应该就是启用的,但可以检查下环境里有没有装好。还有个冷门技巧:用--enforce-eager模式绕开CUDA图的编译优化,虽然会牺牲点吞吐,但能避免预分配大量显存碎片。最后实在不行的话,可以试试把模型切一部分到CPU内存,vLLM支持offload,虽然推理会慢但至少能跑起来。你配完这些参数后贴一下启动命令,看看具体报错里显存分配那一行的数值,我帮你再算算。
试着把gpu_memory_utilization调到0.85以下,再配合动态批处理,我这边4bit版就这样跑起来的。
你这情况我上周刚遇到过,A100 80G跑32B量化版按理说显存是够的,问题大概率出在vLLM默认的KV cache预留上。可以试试把--gpu-memory-utilization调到0.85到0.9,别用默认的0.95,给系统留点缓冲余地。另外max_num_seqs直接压到16甚至8,反正你QPS不高,小批量推理完全够用,这样KV cache占的空间会小很多。如果还不行,可以手动指定--max-model-len为4096或2048,32B模型长文本场景少,没必要支持8192的上下文,这招省显存效果很明显。还有个小技巧,启动时加上--enforce-eager,关掉CUDA graph的预编译,虽然推理速度会降一点,但能省出不少临时显存。我自己的经验是,把这几项调完,32B 4bit在80G卡上跑demo基本没压力,你试完可以反馈下结果。
试试把gpu_memory_utilization调到0.85,再配合FlashAttention,我试过能跑起来。
调低gpu_memory_utilization到0.85左右,再配合FlashAttention应该就能跑起来了,我之前也这么搞的。
之前也踩过这个坑,能理解。试试把gpu_memory_utilization调到0.85左右,vLLM默认吃得太狠,留点余量给CUDA kernel。另外max_num_seqs设成4或8,配合flash_attn开关打开,能省不少显存。如果还不行,检查下AWQ的group size是不是128,调成32也能降一点。