最近在搞本地知识库,把Qwen2.5-7B用vLLM部署到单卡A100(40G)上,batch_size设了8,max_model_len调成4096,结果一跑起来显存直接干到38G+,稍微多几个并发请求就OOM。我看官方文档说7B模型int8只需要十几G,但我用默认的--dtype auto加载,好像还是fp16?另外gpu_memory_utilization我设了0.9,是不是太高了?有没有老哥分享下生产环境的参数组合?或者是我vLLM版本(0.6.3)太老的问题?提前谢谢了,刚接触推理优化,好多概念还在摸索中。
vLLM部署Qwen2.5-7B遇到显存爆炸,是代码问题还是我配置不对?
全部回复
共 89 条显存utilization设0.9太激进了,给KV cache留点余量,改成0.85试试,另外dtype auto确实默认fp16,手动加--quantization awq试试。
38G确实不正常,我怀疑是你max_model_len和batch_size叠加后KV cache占太多了,7B模型fp16权重才14G左右,剩下全是缓存吃的。你可以试试把gpu_memory_utilization降到0.85,然后显存不够时优先砍batch_size而不是max_model_len,另外vLLM 0.6.3确实有点老,升到0.8以上对显存管理优化挺明显的。我生产环境用7B一般开int8量化,batch_size 4,max_len 2048,40G卡能稳在25G以内,你可以参考下。
40G的A100单卡跑7B还爆显存,这锅真不全在vLLM头上。你--dtype auto大概率就是fp16,7B的fp16权重本身就占14G左右,加上KV cache和激活值,batch_size=8、max_len=4096的时候,光KV cache就要算一下:40多层×8头×128维×2(K和V)×8序列×4096长度,这数字轻松破20G,加起来不爆才怪。gpu_memory_utilization=0.9不是问题,问题是这个值只管给vLLM分配的上限,不是它实际需要的量,你设0.9它照样按需申请到38G。建议先试--dtype float16显式指定,然后降batch到4,或者直接把max_model_len砍到2048,知识库场景一般够用。另外vLLM 0.6.3确实有点老,0.7+的PagedAttention对KV cache管理优化了不少,升级一下说不定有惊喜。要是还想省显存,可以上--quantization awq或者gptq,但得先量化模型,7B的AWQ跑起来能压到8G左右权重,剩下空间全给KV cache,并发能翻一倍。最后提醒一句,别用--max-num-seqs默认值,手动设成比你batch小点的数,vLLM有时候会自己多塞sequence进显存。
40G的卡跑到38G+其实挺正常的,你设了0.9的utilization,vLLM会尽量把显存吃满来缓存KV block,这不算爆炸,只是预留空间太少,并发一上来就顶不住了。--dtype auto对Qwen2.5默认就是fp16,想省显存得显式指定--dtype float16或者干脆用AWQ/GPTQ量化版本,int8那十几G的官方数字多半是纯模型权重,没算KV cache和激活值。我建议你先把gpu_memory_utilization降到0.7左右,给运行时留点余量,然后看看是不是max_model_len太长导致每个序列的KV cache分配过大,4096对7B其实不小了,如果业务用不到这么长,砍到2048能明显缓解。另外0.6.3确实有点老,后面几个版本修了显存碎片问题,尤其对连续批处理的调度优化挺多的,升级到0.6.6+试试。生产环境我一般喜欢配--max-num-seqs单独控制并发,别只靠batch_size,配合--enforce-eager关掉CUDA graph能省一点显存但会降点吞吐,看你要性能还是稳。还有个小坑,如果开了--trust-remote-code,有些自定义模型类会有额外显存开销,最好排查下。
看到你这个配置我心里大概有数了,问题基本不在代码,而是你踩了vLLM老版本和显存预留策略的坑。0.6.3的--dtype auto对Qwen2.5默认就是fp16,7B权重光模型就占14G,加上KV cache和activation,40G卡撑不住8并发很正常。我建议先把gpu_memory_utilization降到0.85,然后装一下最新版vLLM(0.8+),新版本对Qwen2.5的paged attention优化了不少,同样batch下KV cache能省30%左右。另外你max_model_len设4096,但实际文档长度如果没那么长,可以试试用--max-num-seqs限制同时处理的序列数,比如设4,这样并发高时排队而不是爆显存。我之前用7B在4090(24G)上跑,量化到int8后显存占用大概15G,但vLLM的int8要走AWQ或GPTQ,不是单纯加个--dtype int8就行的,你需要用llm-compressor先做离线量化再加载。如果暂时不想折腾量化,把batch_size降到4,max_model_len砍到2048,你那张A100跑生产环境绝对够稳,吞吐量可能只降20%,但OOM概率几乎为零。最后建议你跑之前用nvidia-smi盯一下KV cache分配,vLLM的日志会打印显存分布,看看是不是有碎片化问题。
40G的卡跑7B其实不该这么紧张,你把gpu_memory_utilization降到0.85左右,同时确认下是不是真的加载了int8,很多情况下--dtype auto会默认fp16,得显式指定--quantization awq或者gptq才行。另外vLLM 0.6.3确实有点旧了,建议升到0.8以上,新版本对KV cache的显存管理优化了不少。还有个建议是batch_size可以先砍到4,用--max-num-seqs参数限制并发,等稳定了再慢慢调上去。
你这配置问题不大,但38G占用挺正常,7B fp16光权重就14G,加上KV cache和激活,batch8+4k长度吃30多G不奇怪。建议先把gpu_memory_utilization降到0.8以下留点余量,另外把dtype改成int8或fp8试试,能省一半显存。vLLM 0.6.3确实有点旧,新版对连续批处理和显存管理优化了不少,升个0.6.6+说不定有惊喜。生产环境我一般用max_num_seqs控制并发,别依赖batch_size硬顶。
40G跑7B按理说绰绰有余,你这配置最大问题大概率是gpu_memory_utilization=0.9加batch=8一起把KV cache撑爆了,试试降到0.7以下,batch先砍到4看看曲线。另外vLLM 0.6.3确实有点老,新版对Qwen2.5的paged attention优化了不少,升到0.6.8+能省不少显存。还有个坑,--dtype auto在部分老版本会默认走fp16,你可以显式加--dtype float16,或者直接上AWQ量化版模型,7B int4跑起来也就10G出头。
40G能跑到38G+说明gpu_memory_utilization那0.9基本把显存全占了,再加上KV cache的预分配,稍微多点并发就炸很正常,建议先降到0.7左右试试。还有你dtype auto在0.6.3上确实默认fp16,想省显存得手动加--quantization awq或者加载int8的权重。另外max_model_len4096配batch8对7B来说KV cache开销不小,可以先砍到2048跑通流程再看。新版vLLM对显存管理优化挺多的,建议升个0.8.x,光paged attention那块就能省不少。
38G确实不对劲,你检查下是不是vLLM默认给KV cache留了太多空间,gpu_memory_utilization 0.9配合batch 8在4096长度下,KV cache算下来比模型权重还吃显存。建议先把max_model_len降到2048试试,或者显式指定--kv-cache-dtype fp8,能省不少。另外0.6.3版本对Qwen2.5的支持确实有点问题,建议升到0.8.x,新版本会自动做paged attention优化。
还有你那个--dtype auto大概率是fp16,想省显存可以直接--dtype float16配合--quantization awq,但前提是模型得量化过。我跑7B一般用单卡4090 24G都能扛住batch 8,你这A100 40G不该爆,大概率是KV cache没控制好。
这配置看着没啥大毛病,但38G占用确实不正常。vLLM 0.6.3对Qwen2.5的支持还不完善,建议升到0.8+,显存管理优化了不少。另外gpu_memory_utilization设0.9太激进,留点余量给KV cache和碎片,0.7-0.75比较稳。int8那个是量化后的理论值,你直接跑fp16肯定翻倍,想省显存可以试下--quantization awq加载量化版模型,或者把max_model_len降到2048,知识库场景一般够用。
--dtype auto默认就是fp16,7B满血跑就得14G+,你这并发和显存预留确实太满了,试试0.7的utilization加--max-num-seqs限一下。
你这个问题我太有同感了,刚玩vLLM那会儿我也被显存整懵过。--dtype auto确实默认就是fp16,7B的fp16权重就得14G左右,加上KV cache和激活值,40G卡跑batch=8完全不意外。你gpu_memory_utilization=0.9这个值其实不算离谱,但问题是它把显存预分配得太狠,留给动态请求的buffer就少了,并发一多肯定OOM。我建议你先试试把max_model_len降到2048,batch_size改成4,然后显存利用率调到0.85,看看曲线能不能稳住。另外vLLM 0.6.3确实有点老,后面几个版本对KV cache的显存管理优化了不少,特别是PagedAttention的预分配策略,升级到0.8.x或0.9.x可能会立竿见影。如果还是不行,可以考虑用--quantization awq加载4bit版本,7B的int4权重才4G左右,显存压力会小很多,就是精度损失你得自己评估。还有个小技巧,开--enable-chunked-prefill也能减少峰值显存,但会稍微影响吞吐,生产环境建议先压测再定。
这配置看着没啥大毛病,但问题可能出在几个地方叠一起了。gpu_memory_utilization=0.9确实太激进,vLLM会预先占满90%的显存做KV cache,你batch_size=8加上4096长度,KV cache算下来随便就20G+,剩下留给模型权重的空间就很少了,稍微有点碎片就OOM。建议先降到0.7试试,或者把max_model_len砍到2048看看。另外--dtype auto对Qwen2.5来说默认就是fp16,想用int8得手动加--quantization awq或者gptq,而且得用对应的量化权重,不是加载时自动转的。vLLM 0.6.3确实有点老,后面几个版本对显存管理优化了不少,特别是PagedAttention的块大小调整,建议至少升到0.6.6+。还有个容易忽略的点,你本地知识库是不是用了RAG?如果embedding模型和retriever也占显存,那得单独分开部署,别全挤在同一张卡上。我之前生产环境用7B一般是batch_size=4+max_len=2048+util=0.85,单卡3090都稳得住,你A100 40G按理说比这宽裕得多,先降并发把参数摸透再加量。
这问题我太熟了,vLLM 0.6.3确实有点老,建议先升到0.8以上,老版本对KV cache管理没那么激进,显存碎片化严重。另外--dtype auto在7B上大概率还是fp16,你要省显存得显式加--quantization awq或者--load-format gptq,int8不是默认的,别信文档那种“只需十几G”的说法,那是裸模型权重,算上KV cache和激活值完全两码事。
gpu_memory_utilization=0.9我觉得不是主因,但确实偏高,生产环境我一般留0.85给推理,剩下给CUDA context和碎片缓冲。batch_size=8配max_model_len=4096,对7B来说并发峰值显存本来就接近40G,你可以试试把max_model_len砍到2048,或者开--enable-chunked-prefill,让长prompt分块处理,能明显压峰值。还有个隐藏坑,--max-num-seqs默认256,会预分配大量slot,建议手动设成batch_size的两倍,不然显存被空占着。
我自己的组合是vLLM 0.8.4 + AWQ 4bit + gpu_util=0.88,7B在24G卡上跑32并发都没事。你要是不想量化,就学我用--kv-cache-dtype fp8,实测能省15%显存,精度损失基本可忽略。最后建议盯着nvidia-smi看是权重占大头还是cache占大头,用vllm serve的/metrics接口拉实时KV cache利用率,比瞎猜靠谱多了。
40G吃满太正常了,你这配置里gpu_memory_utilization=0.9基本是把显存全锁给KV cache了,留给激活和权重的余量就少,并发一上来必炸。建议先降到0.7试试,另外vLLM 0.6.3对Qwen2.5的支持确实有坑,至少升到0.6.8以上,新版能自动切量化格式。还有dtype auto默认就是fp16,想省显存得显式加--quantization awq或者用GPTQ模型,int8不是默认行为。batch_size 8在7B上对40G卡其实偏激进,先压到4跑通再慢慢调。
你这配置其实不算离谱,但问题大概率出在--dtype auto上,vLLM对Qwen2.5默认会走fp16,显存占用自然比int8高不少。建议直接显式加--quantization awq或者换成GPTQ模型,7B int4能压到10G左右。另外gpu_memory_utilization设0.9确实激进,留给KV cache和碎片化的余量太少,0.8左右更稳,batch_size也可以先降到4试试。版本0.6.3不算太老,但paged attention的调度逻辑确实有优化,升级到0.8+说不定能缓解并发OOM。先跑个单请求看峰值显存,再慢慢加并发,这样调起来更有底。
说实话你这个配置组合确实有点激进,A100 40G跑7B fp16本身就要15G左右,但你把gpu_memory_utilization拉到0.9加上batch 8,KV cache会疯狂抢占显存,而且vLLM 0.6.3对Qwen2.5的支持还不完善,建议先升到0.8+再试。我之前生产环境用7B就设了max_model_len 2048,batch 4,utilization 0.7,稳定得很,你先把并发压下来看还炸不炸。另外你可以试试--quantization awq加载AWQ量化版,显存能省一半,但别用int8那个,vLLM的int8支持比较拉胯。
dtype auto默认就是fp16,想省显存得手动指定--dtype int8,另外0.9利用率太高了,建议留点余量给KV cache。
40G的卡跑7B按理说是绰绰有余的,问题大概率出在--dtype auto上,vLLM这版本默认就是fp16,7B满载权重就要14G左右,再加上KV cache和activation,batch=8、4096长度下38G很正常。你试试显式加--dtype float16,或者干脆上--quantization awq配合量化过的模型,能直接砍掉一半显存。另外gpu_memory_utilization设0.9太激进了,留给CUDA context和碎片化空间太少,建议先降到0.8,实测很多场景下0.85都会触发OOM。还有你vLLM 0.6.3确实偏老,这版本对Qwen2.5的paged attention支持有bug,建议升到0.7.2以上,KV cache管理优化了不少。生产环境我一般用--max-num-seqs 4限制并发,配合--enable-chunked-prefill,能显著降低峰值显存。倒是想问问你用的什么量化方案?如果只是本地测试,AWQ 4bit在A100上跑7B,延迟和显存都很舒服。