最近在试着把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以下,再关掉KV cache的自动扩展,基本能塞进去。
把gpu_memory_utilization调到0.85左右,再把max_num_seqs压到8,基本能跑起来,我试过类似配置。
gpu_memory_utilization直接调到0.85,再把max_num_seqs砍到8,我这边70B都这么塞进单卡的。
我之前也踩过这个坑,gpu_memory_utilization调到0.85左右基本能解决,别用默认的0.9。另外max_num_seqs设成64甚至32,配合--enable-prefix-caching,对demo场景影响不大但显存能省下一截。你试过把KV cache的dtype改成fp8吗?这个在vLLM里对Qwen2.5支持得不错,能再省一块。还有个小技巧,如果只做内部demo,可以关掉--enforce-eager模式,虽然慢点但启动时不会预分配那么多显存。
这问题我上周刚踩过一遍,A100 80G跑32B AWQ理论上够,但vLLM默认配置确实会坑人。你先把gpu_memory_utilization从0.9往下压到0.7左右试试,这参数直接决定KV cache能占多少余量,我调完这个立刻就不OOM了。另外max_num_seqs默认好像是256,对demo场景来说太激进了,改成32或64能省一大块显存,代价只是并发吞吐低一点,反正你QPS要求不高。还有个小细节,确认一下你用的AWQ版本和vLLM是否完全兼容,之前有人遇到过量化格式不对导致启动时额外分配显存的情况,换对应版本的模型文件能解决。FlashAttention建议开着,但别指望它单独解决OOM,它主要是优化计算效率和显存带宽,不是直接砍占用。动态批处理(continuous batching)是vLLM默认就开的,不用额外配置,关键是别让它同时攒太多请求。最后提一句,如果还是挤不进去,试试--enforce-eager模式,跳过CUDA graph的预分配,虽然推理慢点,但demo跑起来没问题。
我之前也踩过这个坑,A100 80G跑32B AWQ其实完全够,但vLLM默认的gpu_memory_utilization是0.9,留给KV cache的余量太少了。你直接把环境变量设成0.7左右试试,或者指定--kv-cache-dtype fp8,能省不少显存。
另外max_num_seqs不用调太低,设成32就够demo用了,真正吃显存的是max_model_len,你如果输入输出长度不长,比如限制在4096,能腾出一大块空间。FlashAttention在vLLM里是默认开的,不用额外管。
如果还卡在加载阶段,可以检查下是不是AWQ的权重文件本身没下全,有时候模型切片不完整也会导致分配异常。跑通之后记得用--enforce-eager关掉CUDA graph,虽然慢点但能避免不少诡异的内存分配问题。
我之前也遇到过一模一样的情况,A100 80G跑32B AWQ按理说容量是够的,问题大概率出在vLLM默认的显存预留策略上。你可以先试试把gpu_memory_utilization调到0.85甚至0.9,这参数是直接控制KV cache和模型权重总占用上限的,调低点能强制腾出空间,代价是吞吐会降一些,但demo完全够用。另外max_num_seqs别用默认值,我建议直接设成8或者16,这参数会影响KV cache的预分配大小,调小之后启动时显存占用会明显降下来。还有个容易忽略的点,检查下是不是加载了多份模型副本,比如设置了tensor_parallel_size=1但环境变量里CUDA_VISIBLE_DEVICES只留单卡,有时候vLLM会默认分卡导致显存翻倍。如果还不行,可以试试开enable_prefix_caching,虽然这功能本身不是为省显存设计的,但配合低并发有时候能意外减少碎片。最后实在不行,把模型从AWQ换回FP8试试,有些量化格式在vLLM里的显存管理反而不如原生FP8高效。你先调这两个参数跑一下,大概率能起来,QPS要求不高的话没必要上动态批处理,反而增加复杂度。
我之前跑13B也遇到过类似问题,gpu_memory_utilization确实得手动调,默认0.9对32B加量化太激进,你试试压到0.75左右,给KV cache留点余量。另外max_num_seqs降到16甚至8,对demo场景完全够用,能省不少显存。还有个小技巧,vLLM里可以开enable_prefix_caching,内部demo如果请求有重复前缀,能显著减少计算峰值,你可以试试看。
我之前也踩过这个坑,A100 80G跑32B AWQ其实完全够,问题基本出在vLLM默认的KV cache预留上。你可以先试试把gpu_memory_utilization调到0.85以下,给模型权重留出足够余量,同时把max_num_seqs降到16甚至8,QPS不高的话影响不大。另外记得确认下是不是用了最新的vLLM版本,老版本对量化模型的内存估算经常偏大。如果还不行,可以开一下--enable-prefix-caching,虽然对单轮推理帮助有限,但能省点碎片空间。我这边之前跑Qwen2.5 32B AWQ,0.8的利用率加max_num_seqs=4,稳定占用72G左右,你可以参考下。
我之前也踩过这个坑,gpu_memory_utilization确实得手动调,别信默认值,直接设到0.85左右给KV cache留点余量,同时把max_num_seqs压到32甚至16,demo场景完全够用。另外你用的是AWQ的话,记得确认下vLLM版本是不是支持这格式,旧版有时候会偷偷按FP16去预分配权重,那必炸。还有个骚操作是开--enable-prefix-caching,如果公司内部demo请求里重复前缀多,能省不少显存。
我之前也踩过这个坑,A100 80G跑32B量化版理论上够,但vLLM默认会预留给KV cache很大比例。你可以先试试把gpu_memory_utilization调到0.85以下,给模型权重和激活留出余量,同时把max_num_seqs降到16甚至8,QPS不高的话完全够用。另外确认下是不是用了最新版vLLM,老版本对AWQ的支持有内存碎片问题,升级到0.6.x之后会好很多。如果还卡,干脆先关掉KV cache复用(enable_prefix_caching=False),demo阶段性能损失无所谓。
之前调DeepSeek的时候也踩过这坑,gpu_memory_utilization确实值得先试,设到0.85左右能腾不少空间。另外max_num_seqs别舍不得砍,demo场景下32都嫌多,配合上KV cache的复用策略能省出一大块。还有个野路子,vLLM里把preemption模式改成swap,虽然慢点但至少能先跑起来看效果。
A100跑4bit的32B按理说够用,八成是KV cache占满了,设下gpu_memory_utilization到0.9试试。
AWQ 4bit还OOM有点怪,先试试把gpu_memory_utilization降到0.85,再把max_model_len砍到4096,KV cache能省一大截。
试试把gpu_memory_utilization降到0.85,再限制max_model_len,KV cache别按默认拉满,单卡应该能跑起来。
AWQ 4bit还OOM有点奇怪,80G单卡跑32B量化应该够的。你试试把gpu_memory_utilization调到0.85左右,别用默认的0.9,再配合max_model_len设小一点比如4096,KV cache能省不少。另外确认下是不是tokenizer或者dtype哪里没配对,有时候是加载阶段的临时峰值把显存顶爆了。
32B的AWQ权重本身大概就占18-20G,剩下的显存全被KV cache吃了。你把gpu_memory_utilization从默认0.9降到0.85左右,再设max_model_len=4096、max_num_seqs=4试试,QPS不高的话这样基本够跑demo了。另外确认下你用的vLLM版本,新版对量化模型支持好很多,老版本有时候权重加载方式就不对。实在不行加个enforce_eager,虽然慢点但能省不少显存。
AWQ 4bit还OOM的话,先把gpu_memory_utilization从默认0.9降到0.85试试,给KV cache留点余地。KV cache默认按最大长度预分配,你可以把max_model_len调到4096甚至2048,能省一大块。max_num_seqs也压到8或16,QPS不高完全够用。还有个坑是vLLM版本,老版本对AWQ支持不好,升到最新再试。
AWQ 4bit 还OOM有点怪,先把 gpu_memory_utilization 降到0.85试试,KV cache别给太多。