最近在搞一个内部知识库问答的demo,用的Qwen2-7B,用LoRA微调后想部署成API服务给测试组用。单卡A100 40G,用vLLM加载AWQ量化后的模型,跑单轮对话没问题,但一旦并发超过3个请求,或者输入上下文超过2K,就疯狂OOM报错。试过GPTQ和FP16,反而更吃显存。看网上说7B模型4bit量化后只需要8G显存,但我实测光权重就占了11G,KV cache一开再乘个4并发直接爆。想问下是我量化参数没设对(比如group_size、sym这些),还是说7B模型做服务端部署本来就得预留20G以上?另外,有没有办法在vLLM里动态调整KV cache的显存上限?求有实战经验的老哥指点一下,孩子已经被OOM折磨两天了。
部署7B模型微调API总OOM,是量化方案不对还是显存规划有问题?
全部回复
共 50 条说到这个我太有感触了,上周刚踩完一模一样的坑。你那个8G显存的说法是纯理论值,实际部署还得算上CUDA context、激活值和vLLM的预留buffer,7B AWQ在A100上光静态占用12G太正常了。我后来查了NVIDIA的官方文档才发现,vLLM的KV cache默认会吃掉剩余显存的90%,你设个gpu_memory_utilization=0.85然后显式指定max_num_seqs=4,OOM能缓解一大半。另外group_size别用128,改成32试试,虽然量化后精度掉一点,但显存占用确实能压到9G左右,sym开不开对显存影响不大,主要影响推理速度。你如果一定要并发高,建议把max_model_len砍到1536,然后开enable_prefix_caching,这样重复前缀的问答能省不少KV cache。还有个骚操作是给vLLM加--kv-cache-dtype fp8_e5m2,虽然会损失点精度,但显存占用直接再降20%。最后说句实话,7B做服务端就别指望4并发了,我最后妥协到2并发+2K上下文才稳定,要不你直接上Qwen2.5-7B的FP8原生版?那个反而比AWQ省事。
7B量化后权重11G正常,KV cache才是大头,试试--max-num-seqs调小点。
20G打底没错,vLLM里设--kv-cache-dtype fp8能省不少,先看下nvidia-smi分配情况。
实不相瞒,我最近也踩了几乎一模一样的坑,最后发现问题大概率不在量化方案,而在显存规划上。AWQ的4bit权重确实能压到6-7G左右,但你看到的11G可能是vLLM为了推理速度把反量化后的FP16权重也常驻了,或者你加载时没关掉CPU offload导致内存和显存互相拖累。group_size和sym这些参数对显存影响其实很小,主要决定的是精度和推理速度的平衡,别太纠结这个。
真正吃显存的大头是KV cache和中间激活值,7B模型在2K上下文下,每个并发请求的KV cache大约占1.5-2G,你4个并发加输入长度一涨,直接破20G很正常。建议你试试在vLLM启动参数里设--kv-cache-dtype fp8,或者用--max-num-seqs限制并发数,再配合--gpu-memory-utilization卡在0.85左右,这样能给权重和激活留出喘息空间。
另外,如果只是给测试组用,没必要死磕高并发,可以在API层加个队列限流,把并发压到2以内,同时把上下文长度硬性截断到1500 token。我之前用GPTQ做8bit部署,同样的7B模型,配合vLLM的paged attention,实际跑6个并发都没爆,后来才发现是AWQ的kernel在A100上没吃到最优的tensor core优化,换回GPTQ反而更稳。总之你先用nvidia-smi监控一下每次OOM前的显存分布,看看是权重还是KV cache爆的,再对症下药,别一上来就怀疑量化方案。
你这个情况我上周刚踩过坑,7B AWQ光权重11G正常,网上说的8G是纯推理不加并发和长上下文的理想值。vLLM里--max-num-seqs调小到2,--gpu-memory-utilization设0.85,再配个--enable-prefix-caching能救不少。另外group_size别用128,换32能再降两三个G,但精度会掉一点,自己权衡。
看到你说AWQ 4bit后权重还占11G,我怀疑你量化的时候是不是没开exclude_permutation或者group_size设太小了,我这边同样的7B模型用AWQ、group_size=128、sym=True,权重能压到9.5G左右,不过即便这样,并发3个请求加2K上下文,KV cache按每token 80字节算也得预留至少6G,所以总占用20G+是常态。你那个“8G显存”的说法大概率是只算了模型权重,没算推理时的激活和缓存,网上那种数字别太当真。vLLM里有个--kv-cache-dtype和--max-num-seqs参数,但动态调上限目前只能靠设置--gpu-memory-utilization,比如0.85,让它自己按比例切,没法精确到某个请求级别。另外我建议你查一下是不是LoRA融合后模型体积膨胀了,之前我试过不merge adapter直接加载,显存能省不少。你试试把max-model-len调成2048,同时限制并发用--max-num-seqs=3,应该能稳一点,但想完全解决OOM,要么换2张卡做张量并行,要么就接受单卡只服务低并发。
8G那个说法太理想了,基本是单卡单请求、短上下文的实验室数据。你权重11G其实正常,AWQ的group_size调128能稍微压一点,但别指望质变。关键还是vLLM的gpu_memory_utilization参数,默认会预留98%显存给KV cache,建议手动设到0.85左右,再配合--max-num-seqs限制并发数,比纠结量化更有效。另外你的上下文2K就爆,看看是不是max-model-len没设对,vLLM默认会按模型最大长度预留。
vLLM里--max-num-seqs调小点,再开--enable-prefix-caching能救急,但长期看建议直接上双卡。
实测7B AWQ极限也得15G打底,你留40G还爆八成是max-model-len没限住,设个2048试试。
这问题我太有共鸣了,之前用7B模型做并发测试时也踩过一模一样的坑。你光看权重11G其实正常,AWQ的4bit量化省的是模型参数,但KV cache和中间激活值才是并发时的隐形杀手,官方给的8G显存多半是单请求短上下文的理想值。group_size和sym影响的是量化精度,跟显存占用关系不大,倒是max_model_len和gpu_memory_utilization这两个参数更关键,vLLM里可以手动设显存比例,比如留出40%给KV cache,但并发3个以上还得看你的平均序列长度。我后来直接改成动态批处理加限制最大并发数,配合PagedAttention的自动管理才稳住,另外你可以试试把LoRA合并回基座模型再量化,有时能省出额外几G。还有个小技巧,把输入切块预处理,别让单条上下文直接冲2K,也能缓解不少。
别光盯着量化,7B AWQ实际部署显存大头在KV cache和激活值,11G权重算正常,4并发加2K上下文预留20G+是常态,A100 40G其实够用,关键是你得给vLLM设--max-num-seqs和--gpu-memory-utilization,把KV cache上限压到0.85左右试试。另外LoRA微调后的权重合并进base model再用AWQ量化,别直接量化adapter,group_size设128,sym开True能省点显存但效果别指望飞跃。动态调KV cache目前只能靠重启改参数,vLLM不支持热调整,你不如把max-model-len改小点,比如2048,强制走chunked prefill,并发能稳不少。
7B AWQ实测11G很正常,网上说的8G是纯权重没算activation和KV cache,你这场景20G打底真不夸张。vLLM有--kv-cache-dtype和--max-num-seqs参数可以调,但本质是显存换吞吐,建议先看下--gpu-memory-utilization设到0.9没,默认0.8会浪费不少。另外group_size=128对称量化对7B效果比较稳,你试试把并发压到2,然后把max-model-len设成4096,看能不能稳过压力测试。
另外想问下你用的vLLM版本,新版对AWQ的page注意力优化差挺多。
8G显存那个说法太理想了,实际跑服务端还得算上CUDA context和运行时开销,11G权重很正常。你这种情况建议先查一下vLLM的gpu_memory_utilization参数,默认只留一点余量,调成0.9试试,然后KV cache用--max-num-seqs限制并发,别让它自动撑爆。另外group_size=128和sym=True是AWQ常见配置,但你这问题更像显存分配策略不对,不是量化参数的事,7B部署预留20G确实稳妥,A100 40G单卡理论上够,就是得手动把KV cache上限锁死。
这问题我踩过一模一样的坑,AWQ那8G显存是纯权重没算KV cache和激活值,实际跑服务端7B至少得留16G才稳。你试试vLLM里设--kv-cache-dtype fp8,能省不少,或者干脆把--max-num-seqs调低强行限流,比调量化参数管用多了。另外group_size别用128,用64试下,显存能降一点但推理会稍微慢点,看你能不能接受。
权重11G正常,8G是纯权重不算CUDA context和KV cache,留20G以上才稳。试试vLLM的--kv-cache-dtype和gpu_memory_utilization参数调低点。
说到这个我可太有同感了,之前用7B模型部署内部工具时也踩过一模一样的坑,当时还以为是量化包的问题,后来折腾了一圈才发现是vLLM默认给KV cache预留的显存太激进了。你试下启动时加个--kv-cache-dtype fp8或者--max-num-seqs参数,把并发数限制到2,再配合--gpu-memory-utilization设成0.85,能缓解不少,但说实话7B模型服务端部署想稳跑多并发,20G预留真不夸张。另外你提到的group_size和sym,AWQ默认g128和sym对7B来说已经够用了,再调小group_size反而会拖慢推理速度,收益不大。还有个野路子,如果你不介意损失一点速度,可以试试在vLLM里开--enable-prefix-caching,对知识库这种重复前缀多的场景能省不少KV cache空间。最后想确认下,你OOM报错是纯Cuda OOM还是vLLM内部的KV cache分配失败?如果是后者,其实可以直接在请求里传max_tokens上限,强行限制上下文长度,代价就是长文档得切片处理。
网上那些8G显存跑7B的截图基本都是单卡纯推理,没算KV cache和并发,你这个场景20G打底是正常的。vLLM里可以设--kv-cache-dtype和--max-num-seqs,但更建议直接限制max-model-len到2048,并发调低点,或者换Qwen2-1.5B先顶着测试。另外AWQ的group_size用128一般够,sym开不开影响不大,重点是你微调后再量化,校准集得用你domain的数据,不然量化误差会放大。
这问题我踩过一模一样的坑,7B AWQ实际占用比理论值高是正常的,光权重11G不奇怪,问题多半出在你没限制KV cache的预留比例。vLLM里可以设--kv-cache-dtype和--gpu-memory-utilization,把后者调到0.8左右,再配合--max-num-seqs限制并发,OOM能缓解不少。另外group_size=128和sym=True是常规配置,但你这场景更该关注--max-model-len,把上下文上限砍到2048,不然2K以上必爆。实测下来7B服务端想稳跑4并发,20G确实要留,别信8G那种理想数字。
8G跑7B是理论值,实际服务端留20G起步才稳,KV cache上限可以设gpu_memory_utilization试试。
权重11G正常,7B量化后本来就有额外开销,预留20G+是底线,vLLM里设下--gpu-memory-utilization试试。
说实话你这个问题我踩过一模一样的坑,AWQ 4bit标称8G那是纯权重,根本不算KV cache和activation,vLLM里gpu_memory_utilization默认才0.9,但实际分配策略很保守,你并发3个加2K上下文,KV cache直接吃满剩下的显存很正常。我个人试下来7B部署真得留25G往上才稳,量化省的那点空间在长上下文面前就是杯水车薪,尤其LoRA微调过的模型,adapter权重还要额外占内存。关于动态调KV cache,vLLM有个--max-num-seqs和--max-model-len参数可以压并发和长度,但治标不治本,你不如试试把--kv-cache-dtype改成fp8,或者直接开--enable-prefix-caching,能省不少重复计算的缓存。另外group_size和sym确实会影响显存,但一般设128和True就够了,你OOM大概率不是量化参数的问题,是vLLM的PagedAttention在短并发下预分配太死板。最后建议你换个思路,既然只是内部demo,干脆把max-concurrent-requests限到2,然后输入长度限制到1536,比折腾量化省心多了,等真上线再上多卡或者换量化感知训练。
说实话你这个问题我踩过一模一样的坑,A100 40G跑7B AWQ看着余量很大,但vLLM默认的KV cache策略真的会让人崩溃。你光看权重11G其实正常,AWQ的group_size=128、sym=True这种默认参数对显存影响不大,关键还是vLLM的gpu_memory_utilization和max_num_seqs这两个参数没配合好。我建议你先把gpu_memory_utilization设到0.85,然后max_num_seqs手动调到4,别让它自动算,不然并发一上来KV cache直接把显存吃穿。另外输入2K以上就爆,大概率是max_model_len设太高了,vLLM会按最大长度预留KV cache,你实际用不到4K就把它砍到2048,能省出一大块空间。还有个野路子,就是别用AWQ,直接上bitsandbytes的4bit加载,配合disable_quant_hook,虽然慢点但显存占用能压到7G左右,只是推理速度会降一半,看你能不能忍。至于动态调整KV cache,vLLM有个--kv-cache-dtype fp8_e4m3的参数,能省不少,但需要你的卡支持,A100应该没问题。你试试把上面几个参数调完再跑并发,要是还爆,就把LoRA的rank从64降到32,微调时的adapters也会在推理时占显存。反正我后来是直接换成了2张3090跑张量并行,单卡40G做7B服务端确实太憋屈了。