最近在搞本地知识库,把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遇到显存爆炸,是代码问题还是我配置不对?
全部回复
共 104 条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确实有点旧,新版对连续请求的显存复用优化了不少。
试试把gpu_memory_utilization降到0.85,再加--max-num-seqs 4,你这配置OOM大概率是预留给KV cache的余量不够。
这配置看着问题不大,但38G明显不对劲,7B fp16权重也就14G左右,你这剩下的全被KV cache和激活吃掉了。vLLM 0.6.3确实有点老,建议先升到0.8+,另外gpu_memory_utilization别一上来就0.9,试试0.7-0.75,留点余量给CUDA context和碎片。还有max_model_len你设4096但实际输入可能没那么长,如果知识库分段做得好,砍到2048能省不少显存。我生产环境用7B一般batch 4-8、max_len 2048、int8量化,40G卡能稳定跑几十路并发。
40G都爆的话大概率是显存碎片化,把gpu_memory_utilization降到0.8试试,顺便升个版。
你这配置问题不大,主要是dtype auto在vLLM 0.6.3里默认还是fp16,7B满载权重就14G左右,加上KV cache和激活值,40G卡算下来确实紧。建议试试--quantization awq加载int4权重,显存能压到10G以内,gpu_memory_utilization降到0.85,同时batch_size先砍到4看下曲线。另外0.6.3确实有点老,升到0.8+对显存管理优化很明显,尤其paged attention那块。
你算一下就知道,7B fp16光权重就14G,KV cache在batch=8和4K长度下轻松吃10G+,加上激活和碎片,38G很正常。int8只是权重减半,KV cache和激活还是原样,别指望省太多。
gpu_memory_utilization设0.9基本是贴着上限跑,建议降到0.7-0.75,配合--max-num-seqs限制并发数,别让vLLM自己把batch撑满。另外--dtype auto对Qwen2.5默认就是fp16,想省显存得显式加--quantization awq配合量化版模型。
vLLM 0.6.3确实有点老,后面版本对KV cache的PagedAttention优化挺明显,建议升到0.8+试试。我生产环境7B一般配--max-model-len 8192 --gpu-memory-utilization 0.8 --max-num-seqs 4,40G卡跑得很稳。
建议把gpu_memory_utilization降到0.85以下,再试试--max-num-seqs限制并发,0.6.3版本确实有显存管理bug。
40G的A100跑7B还爆显存,多半不是代码问题,是几个配置叠一起踩坑了。--dtype auto在vLLM里确实会优先按模型原精度走,Qwen2.5默认就是fp16,你如果不显式加--dtype float16或者--quantization awq之类,它根本不会自己降到int8,所以显存大是正常的。gpu_memory_utilization=0.9这个值本身不算离谱,但配合max_model_len=4096和batch_size=8,KV cache的预留会非常激进,尤其长上下文场景下,实际占用可能比你预估的翻倍。建议先试试把max_model_len砍到2048,gpu_memory_utilization降到0.85,然后开--enable-chunked-prefill,这能显著缓解并发时的峰值压力。另外0.6.3确实有点老,后面版本修了不少显存碎片和调度问题,至少升到0.6.6以上再试。真要省显存,直接上AWQ 4bit量化,7B能压到10G左右,A100上跑起来还更快,推理质量损失对知识库场景基本无感。
显存利用率0.9太高了,预留点给KV cache和碎片,试试0.7再加--max-num-seqs限制下并发。
把--dtype auto换成--dtype half,再把gpu_memory_utilization降到0.8试试,40G跑7B不至于这么紧。
感觉你0.6.3版本太老,建议升到0.8+,新版本对连续批处理和显存管理优化挺明显的。
40G卡跑7B还爆显存大概率不是卡的问题,你这配置组合确实有点激进。gpu_memory_utilization设0.9基本把显存全锁给vLLM了,加上batch_size8和4096长度,KV cache直接吃满,建议先降到0.7试试。另外vLLM 0.6.3确实有点老,换0.8+版本对Qwen2.5的优化明显更好,能自动切分张量。int8不是默认开的,得显式加--quantization awq或者gptq,不然就是fp16硬跑。生产环境我一般batch_size=4,max_model_len=2048,加上--enforce-eager能省不少显存。
40G跑7B其实挺富裕的,问题基本出在默认fp16加载上,--dtype auto不会自动帮你量化,int8得显式加--quantization或者用AWQ/GPTQ的权重。max_model_len 4096加上batch 8,KV cache占的量不小,gpu_memory_utilization 0.9留的余量也偏少,可以降到0.85试试。建议先换量化权重,再把max_num_seqs调小观察显存曲线,版本0.6.3倒不是主因。