最近在搞本地知识库,把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 条40G能吃到38G+,你这gpu_memory_utilization设0.9基本等于把显存全押上了,kv cache稍微波动一点就炸,建议先降到0.7试试。另外--dtype auto在0.6.3里确实大概率还是fp16,想省显存得显式指定--quantization awq或者直接用--dtype float16配--max-model-len调小到2k,7B的int8部署没那么玄乎。我生产环境一般用2张A100做张量并行,单卡跑7B并发上5个就极限了,batch_size 8对vLLM来说不是瓶颈,是KV cache上限卡死的。你试试把--max-num-seqs设4,再开--enable-prefix-caching,显存占用能降不少。版本0.6.3确实有点旧,0.6.6之后对qwen2.5的支持优化了不少,优先升级看看。
40G吃满真不怪你,这配置默认fp16跑7B本来就紧,试试把gpu_memory_utilization降到0.85再加--max-num-seqs 4。
vLLM 0.6.3对Qwen2.5支持一般,升到0.8+能省不少显存,顺便看看--kv-cache-dtype fp8。
40G跑7B还设0.9显存,并发一多肯定爆,降到0.7试试,另外--dtype auto默认就是fp16。
试试把gpu_memory_utilization降到0.85,再显式加--dtype float16,这版本对kv cache管理确实糙了点。
40G能跑成这样,gpu_memory_utilization调0.85,batch降到4试试,别全赖vLLM版本。
40G吃满正常,7B fp16光权重就14G,加上KV cache和激活,你batch8还开4096不爆才怪。降点并发或者换AWQ量化试试。
40G显存跑7B还OOM,这肯定不是正常现象,我怀疑问题出在max_model_len和KV cache的交互上。你设了4096长度,但vLLM会按这个值预分配KV cache,7B模型即使fp16,单序列的KV cache也要算一下,8个并发就是8倍,再加上gpu_memory_utilization=0.9,等于把可用显存全塞满了,稍微有点碎片就爆。建议先把utilization降到0.7左右,然后显存不够时vLLM会自动做swap,虽然慢点但至少不OOM。
另外--dtype auto确实会默认加载fp16,你想用int8得显式加--quantization awq或者--load-format gptq,但Qwen2.5官方权重没直接给int8版,得自己量化,这点容易踩坑。0.6.3版本有点老,新版对KV cache管理优化了不少,尤其是有个--enable-chunked-prefill选项,能显著降低峰值显存,建议升级到0.7.x再试。
我自己的经验是,生产环境宁可牺牲一点吞吐也别把显存利用率顶到90%,给PyTorch和CUDA context留点余量,否则并发一上来必炸。你试试batch_size=4,max_len降到2048,先跑通再慢慢调,别一步到位。最后问下,你用的是vLLM的--max-num-seqs参数吗?这个控制并发序列数,默认好像是256,不调的话batch_size设了8可能实际排队更多。
这配置看着没啥大毛病,问题大概率出在--dtype auto上,vLLM这版本对auto的默认处理就是fp16,7B全精度光权重就14G,加上KV cache和激活值,40G卡确实吃紧。建议直接显式指定--dtype float16再配合--quantization awq或者干脆用GPTQ量化版模型,能省将近一半显存。另外gpu_memory_utilization设0.9在单卡场景下偏激进,建议先降到0.8试试,给CUDA context和碎片留点余量。还有你这batch_size=8配max_model_len=4096,KV cache峰值估算下来差不多要16-20G,如果并发多的话可以试试把max_num_seqs调小点,vLLM会动态调度,不一定非要8。
另外0.6.3确实有点老,后面版本对PagedAttention和内存池做了不少优化,建议升到0.8.x再对比下。我之前用类似配置跑过,int8量化后实测稳定占用在22G左右,你可以参考下。
你这配置一看就是gpu_memory_utilization和dtype的锅,0.9太高了,留给KV cache和碎片的空间太少,建议先降到0.7试试。另外--dtype auto在0.6.3上确实大概率还是fp16,你直接加--quantization awq或者手动指定--dtype float16再测下显存曲线。7B int8十几G那是量化后的理想值,得配合--load-format和模型权重本身是量化版才行,不然光靠参数不生效。我这边生产环境一般用vLLM 0.7+,A100跑7B开4并发设0.85,峰值也就24G左右,你先把版本升了吧,旧版显存管理确实有泄漏问题。
40G跑7B还爆,估计是并发时KV cache没控住,试试把gpu_memory_utilization降到0.85再看看。
38G确实不正常,但你这配置也有点矛盾,max_model_len才4096的话KV cache根本吃不下这么多显存,怀疑是vLLM版本太老对Qwen2.5的attention优化没跟上。建议先把gpu_memory_utilization降到0.85,然后--dtype改成bfloat16试试,A100对bf16支持更好。另外生产环境我一般不开auto,直接指定--quantization awq配合量化权重,7B能压到8G左右,你这40G卡跑起来余量很足。版本升到0.8.x吧,0.6.3的paged attention调度确实有已知泄漏问题。
显存38G其实挺正常的,7B fp16权重就占14G左右,加上KV cache和激活值,batch 8加4096长度很容易吃满。你设0.9的utilization太激进了,建议先降到0.7试试,另外--dtype auto默认确实走fp16,想省显存得显式加--quantization awq或者换GPTQ模型。vLLM 0.6.3不算太老,但可以升到0.6.6+,有些显存碎片优化。生产环境我一般用batch 4加max_model_len 2048,再配合--max-num-seqs限制并发,稳很多。
试试把gpu_memory_utilization降到0.85,然后加--kv-cache-dtype fp8,你这配置主要是KV cache吃显存,跟版本关系不大。
这配置看着像是vLLM默认把KV cache预留得太激进了,gpu_memory_utilization=0.9意味着它几乎把所有显存都拿来当缓存,你并发一上来自然就爆。建议先降到0.7左右试试,另外dtype auto确实可能默认fp16,可以显式加--quantization awq或者--dtype half。我这边用0.6.3跑7B一般是max_model_len=2048,batch_size=4,显存控制在20G上下。如果你非要长上下文,可以试试换FlashAttention或者把--enforce-eager打开,能省不少缓存占用。
40G跑7B还OOM肯定不正常,先查下是不是paged attention没生效,试试把gpu_memory_utilization降到0.85。
显存38G确实不正常,但大概率不是版本问题。--dtype auto在vLLM里默认就是fp16,想用int8得手动加--quantization awq或者gptq,前提是你模型本身是量化过的,否则光靠参数降不下来。gpu_memory_utilization 0.9确实太激进,建议先降到0.7试跑,同时batch_size减到4,max_model_len砍到2048,看峰值能压到多少。另外0.6.3确实偏老,0.8以后对KV cache管理优化了不少,升级一下可能直接改善。我之前用同卡跑7B,fp16下batch 8配2048长度也就25G左右,你那个38G更像是显存碎片或者预分配策略的问题。
同款配置踩过坑,vLLM 0.6.3确实老了些,0.8以后对显存管理优化了不少,尤其paged attention那块。不过你最大的问题可能不在版本,--dtype auto默认就是fp16,7B大概14G权重,但KV cache才是大户,你把max_model_len拉到4096,batch_size又设8,单条序列的KV cache峰值能算到接近10G,加一起当然爆。建议先把gpu_memory_utilization降到0.75,给运行时留点冗余,不然并发一上来直接OOM。
另外生产环境我一般不开--max-model-len到4096,除非你知识库文档真的长,实际用2560或者2048就够,配合--enable-chunked-prefill能省很多碎片显存。至于量化,int8权重用--quantization awq或gptq,别指望auto帮你切,vLLM里auto只是选dtype,不自动量化。你可以试试把batch_size降到4,加上--max-num-seqs限制并发数,应该能稳住。还有个小技巧,--swap-space设个16,OOM时能换到CPU内存,虽然慢点但不会直接崩。
最后说下,A100 40G其实跑7B很宽裕,就是配置组合得调,我之前用类似参数,显存峰值压在28G左右,你可以参考下。
40G显存跑7B还OOM,大概率是gpu_memory_utilization=0.9加上vLLM预分配机制导致的,这个参数设太高会让KV cache把显存吃满,并发一上来就爆。建议先降到0.7左右试试,另外dtype auto确实默认fp16,想省显存得手动加--quantization awq或者用GPTQ的量化模型。0.6.3版本对Qwen2.5的支持确实不完善,建议升级到0.8.x,新版本对连续批处理和分页KV cache优化明显。我之前同样配置下fp16跑7B,batch=8最多也就占20G出头,你检查下是不是tokenizer或模型没走对分支。
40G能跑到38G+真不奇怪,你这配置里最扎眼的就是gpu_memory_utilization=0.9,vLLM会按这个比例把显存全预留下来做KV cache,再加上激活和临时buffer,7B fp16光权重就14G,4096长度下KV cache单条请求也要占不少,8个batch叠一起直接爆很正常。建议先把utilization降到0.7左右,然后确认下--dtype传的是不是fp16,如果你没显式指定,0.6.3版本确实默认按fp16跑,int8要自己加--quantization awq或者gptq,但前提是你的模型权重本身就是量化过的,直接拿原版模型配int8参数是没用的。另外你试试把max_model_len降到2048,batch_size先压到4,看显存曲线能不能回落,我猜OOM主要是KV cache和并发请求的预分配冲突,不是代码bug。版本的话0.6.3有点旧了,后面几个版本对连续批处理和分页KV cache优化明显,建议升到0.7.x再测,但别直接上最新版,有些API改动会坑人。最后问下你用的量化权重是社区微调过的还是官方原版?这个对显存影响特别大,如果是原版就别指望int8能省多少。
40G跑7B其实挺吃紧的,你这配置主要问题在gpu_memory_utilization=0.9太高,留的KV cache余量太少,并发一上来肯定炸。建议降到0.7左右,然后把max_model_len砍到2048试试,或者干脆用--quantization awq加载4bit版本,显存直接砍半。另外0.6.3确实有点老,0.7+版本对Qwen2.5的显存管理优化了不少,升级下说不定有惊喜。