最近在搞本地知识库,把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 条38G确实不太正常,但你这配置组合本身就有点吃紧,7B模型fp16权重就得14G左右,加上KV cache和激活值,batch 8 + 4096长度很容易冲高。我建议先把gpu_memory_utilization降到0.85以下,给运行时留点缓冲,然后试试--max-num-seqs 4,或者干脆用--quantization awq加载4bit版本,显存能压到一半。另外vLLM 0.6.3确实有点老,后面版本对KV cache管理优化了不少,建议升级到0.8+再对比下,单看dtype auto它默认就是fp16,想省显存得显式指定量化参数。
大概率是gpu_memory_utilization设太高了,留点余量给CUDA context,改成0.85试试。
38G占用其实挺正常的,你这batch size和max_len加起来,fp16的KV cache本来就很吃显存,不是代码问题。要不先试试把gpu_memory_utilization降到0.7,顺便升个vLLM到0.8版本,新版本对内存池优化明显。另外int8别用auto,显式加--dtype float16再配个--quantization awq可能更靠谱,虽然7B没那么吃紧。
40G显存跑到38G+其实挺正常的,你设了0.9的utilization就相当于给KV cache留了10%余量,但batch=8加上4096长度,光激活显存就够吃满。建议先试下把gpu_memory_utilization降到0.85,同时开--enable-prefix-caching,对知识库场景帮助很大。另外0.6.3确实有点老,0.7+对连续批处理和显存管理优化了不少,升级后同样参数能省下2-3G。还有就是你那个int8的预期,得显式加--quantization awq或gptq配合对应量化权重,直接--dtype auto不会自动转int8的。
显存38G+其实正常,7B的fp16权重就要14G,加上KV cache和激活值,batch 8撑4096长度很容易飙上去。你试试把gpu_memory_utilization降到0.85,同时开--enable-prefix-caching看看能不能缓解OOM。另外vLLM 0.6.3确实有点老,新版对连续批处理和KV cache的优化明显更好,建议升到0.8+。int8只有显式--dtype int8才会加载,auto默认就是fp16,想省显存可以试--quantization awq。
说实话你这个显存占用挺正常的,7B在fp16下光权重就要14G,加上KV cache和激活值,batch 8加4096长度确实得奔着30多G去,38G真不奇怪。vLLM 0.6.3也不算太老,但--dtype auto对Qwen2.5默认就是fp16,除非你明确指定--dtype int8或--quantization awq,不然别指望官方文档那个十几G的数字。gpu_memory_utilization=0.9确实偏高,尤其你还想留点余量给并发,我一般生产环境设0.85左右,然后配合--max-num-seqs限制并发数,比单纯靠batch_size控制更稳。另外你可以试试把--max-model-len降到2048,如果业务不依赖超长上下文,这能直接砍掉一半KV cache开销。还有个小坑,vLLM的prefill阶段显存峰值会比decode高不少,你并发请求多的时候OOM很可能就是prefill撞上了,可以开--enable-chunked-prefill试试,能显著降低峰值。最后建议升级到0.8.x,新版本对Qwen2.5的attention优化明显,同样配置下能省个5%-10%显存,我之前就是从0.6.3升上来的,体感挺强。
40G干到38G确实离谱,先试试把gpu_memory_utilization降到0.85,dtype指定float16再跑一轮。
0.6.3版本对Qwen2.5支持不太行,建议升到0.8.x,顺便max_model_len砍到2048看看。
40G显存跑7B还爆,这配置肯定有问题,但八成不是vLLM的锅。你--dtype auto默认就是fp16,7B满血权重大概14G,加上KV cache和激活值,batch_size=8、max_len=4096的情况下,显存占用轻松飙到30G+,38G不算离谱。gpu_memory_utilization=0.9确实太激进了,留给CUDA context和碎片化的余量太少,建议先降到0.75试试,把batch_size砍到4,跑通了再慢慢往上加。另外你vLLM 0.6.3确实偏老,新版本对PagedAttention的显存管理优化了不少,特别是KV cache的预分配策略,升级到0.8.x或0.9.x可能直接解决。还有个坑是max_model_len,4096对于知识库场景其实够用,但如果你实际输入长度远小于这个值,vLLM还是会按4096预分配KV cache,很浪费,可以按实际请求的最大长度动态调整。最后,别迷信int8,除非你用bitsandbytes或GPTQ量化加载,否则光靠--dtype改不了精度,想省显存就上AWQ或GPTQ,7B压到10G以内不是问题。
38G这个数其实挺正常的,你7B fp16权重就要14G左右,KV cache再按4096长度和batch 8算算,加上激活值,0.9的利用率基本就是贴着上限跑。建议先把gpu_memory_utilization降到0.85,然后显式加--dtype float16别用auto,另外0.6.3确实有点旧,新版对连续请求的显存复用优化了不少。