最近在搞本地知识库,把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跑7B还设0.9显存,并发上来必炸,--dtype auto默认就是fp16,先降到0.7试试。
显存利用率0.9确实太激进了,留点余量给KV cache,另外升到0.6.6+版本再试下。
40G显存塞7B还设0.9的utilization确实太激进,尤其max_model_len和batch_size一起拉高时KV cache会吃掉大量空间,建议先降到0.7试试。另外vLLM 0.6.3默认确实走fp16,想用int8得显式加--quantization awq或者把dtype改成int8,不然文档里的数字跟你实际跑的不是一回事。生产环境我一般batch_size开4,max_model_len压到2048,配合PagedAttention的自动管理基本能稳住,你那个38G大概率是预分配太多而不是真用满。最后提一句,升到0.8.x版本对显存调度优化挺明显的,值得花十分钟折腾下。
40G塞7B还设0.9利用率,并发一多必然OOM,建议降到0.7试试。另外0.6.3版本太旧,升到0.8.x能省不少显存。
--dtype auto默认就是fp16,40G跑7B加并发本来就很紧,试试把gpu_memory_utilization降到0.85,batch调小点。
老哥这配置没毛病,就是vLLM版本太旧了,0.6.3对Qwen2.5支持不完善,升到0.6.6+能省不少显存。
你这配置大概率是正常的,7B在fp16下光权重就14G,加上KV cache和激活值,40G卡塞batch 8确实紧。建议先把gpu_memory_utilization降到0.85,然后试试--kv-cache-dtype fp8,能省不少显存。另外0.6.3版本确实有点老,升到0.6.6+对Qwen2.5的支持会好很多,特别是连续批处理这块。我自己的经验是max_model_len调成2048,batch size先降到4跑通再逐步加,别一上来就拉满。
试试把gpu_memory_utilization降到0.85,再开个--max-num-seqs限制并发,你这配置明显是给KV cache留的空间太少了。
vLLM 0.6.3确实有点老,建议升到0.6.6+,dtype auto默认fp16没错,想省显存直接--quantization awq加载int4权重能省一半。
这配置单看没太大毛病,但0.6.3确实有点旧了,vLLM后面几个版本对KV Cache和显存管理优化挺多的,建议先升到0.8.x试试。另外gpu_memory_utilization设0.9留给CUDA context和碎片的空间太少了,生产上我一般0.75-0.8,配合--max-num-seqs限制并发数更稳。你batch_size=8但max_model_len=4096,实际显存峰值取决于输入长度和KV cache,如果知识库句子长,8个并发很容易爆。可以先降到4,或者开--enable-chunked-prefill试试,这个对长prompt场景很有效。
40G的卡跑7B按理说很宽裕,但你batch=8加上4096上下文,KV cache那部分开销确实容易被低估。建议先把gpu_memory_utilization降到0.85试试,然后强制用--dtype float16,别依赖auto。另外vLLM 0.6.3确实有点老,后面版本对连续批处理和显存管理优化了不少,升级到0.8+或许能直接解决你的问题。
40G干到38G确实危险,gpu_memory_utilization 0.9基本等于把显存全押上了,建议先降到0.7左右试试,给KV cache和碎片留点余量。另外vLLM 0.6.3确实偏老,新版对连续批处理和分页注意力优化不少,升级到0.8.x可能直接解决并发OOM。还有个坑是max_model_len设4096但实际请求长度波动大,显存是按最大长度预分配的,你试试动态抢占式调度或者调低batch size到4看看。7B int8十几G是纯模型权重,但推理时KV cache和激活值才是大头,别被那个数字误导了。
这问题我太熟了,刚踩完坑出来。你算一下账就明白了:Qwen2.5-7B的fp16权重本身就占14G,加上KV cache和激活值,batch=8、max_len=4096的话,光KV cache就得奔着8-10G去,再加上你设了0.9的utilization,vLLM会尽量把显存吃满,38G真不算离谱,纯属正常开销。我怀疑你那个“int8只要十几G”的认知是拿静态量化或者llama.cpp那套来套vLLM了,vLLM的--dtype auto默认就是fp16,除非你显式传--quantization awq或者gptq,不然权重压根不会压缩。建议你先把gpu_memory_utilization降到0.85以下,留出余量给并发峰值,然后开--enable-prefix-caching,知识库场景能省不少重复计算。另外0.6.3确实有点老,后面版本对continuous batching和显存管理优化挺多的,至少升到0.7或者0.8再试。如果还是爆,就把max_model_len砍到2048,或者batch_size降到4,毕竟A100 40G跑7B做生产推理本来就得精打细算。
这配置问题不大,但38G占用其实挺正常的,7B fp16光权重就14G,加上KV cache和激活,batch 8长上下文真能吃满。gpu_memory_utilization 0.9确实太激进,建议先降到0.7跑通再说,另外vLLM 0.6.3对Qwen2.5支持一般,升到0.8+能省不少显存。想压显存就开--quantization awq配合AWQ量化权重,或者用--max-num-seqs限制并发,比调batch_size更有效。
显存大头在KV cache,7B满血fp16也不止十几G,建议先降到0.7利用率试试,再不行换vLLM 0.8+配量化。
40G显存跑7B还OOM,多半是KV cache和activation占了大头,你这max_model_len拉满4096,batch8并发再上去,显存直接爆不奇怪。建议先把gpu_memory_utilization降到0.8左右,给运行时留点余量,然后试试--quantization awq或者gptq加载int4权重,显存能省一截。另外vLLM 0.6.3确实有点老,新版本对Qwen2.5的显存优化好不少,升级到0.8+可能立竿见影。我生产环境一般用int8+max_model_len 2048,batch动态调整,稳定得很。
40G的卡跑7B还爆显存,大概率不是代码问题,你这配置里gpu_memory_utilization 0.9确实太激进了,给KV cache留的余量不够,并发一上来就崩。建议先降到0.7试试,另外--dtype auto在0.6.3里默认就是fp16,想省显存得显式加--quantization awq或者--dtype float16配合量化权重,我这边用0.8.0的vLLM加AWQ量化,同样7B+4096长度能压到18G左右。版本建议升一下,0.6.x对连续批处理的显存管理优化确实差不少。
你这配置其实问题不大,主要就是--dtype auto在vLLM里默认还是按fp16跑的,int8得手动指定--quantization awq或者gptq配合对应量化模型才有效。另外gpu_memory_utilization设0.9对40G卡来说确实太激进,建议先改到0.7左右,再把max_num_seqs和并发数绑死,不然显存碎片化加上KV cache预留会直接爆。版本的话0.6.3不算太老,但如果有条件升到0.6.6+,显存调度优化了不少。我之前跑7B都是batch_size压到4,max_model_len用2048,然后开--enable-chunked-prefill,基本稳定在25G内。你那个38G更像是KV cache没限制住,试试手动设--max-num-batched-tokens。
把gpu_memory_utilization降到0.7试试,7B fp16光权重就14G,加上KV cache和激活这数正常。
40G还塞不下7B?你gpu_memory_utilization和max_model_len都太激进了,vLLM得留点KV cache余量,试试0.85+2048。
版本0.6.3确实旧了,最新版对连续批处理优化很多,建议升到0.6.6+再调参数。
老哥这配置没问题,问题在--dtype auto默认就是fp16,7B满血版显存至少14G,加上KV cache和激活值,40G根本不够造。
vLLM 0.6.3确实太旧了,换0.8以上版本,再加--quantization awq或者--dtype int8,gpu_memory_utilization降到0.8,batch_size先压到4试试
40G显存跑7B还爆,多半是gpu_memory_utilization设太高加上并发请求时KV cache没控制好。你试试把max_num_seqs调低到4,再加--quantization awq加载int4权重,显存占用能砍一半。另外vLLM 0.6.3确实有点老,至少升到0.6.6,之前修过显存碎片的问题。我自己用8卡4090跑Qwen2.5-7B,int4+max_model_len 8192,单卡占用也就12G左右。