最近在搞大模型部署,拿vLLM跑Qwen2.5-7B,单卡A100 80G,按照文档设了max_model_len=4096,gpu_memory_utilization=0.9。但跑几个并发请求就报CUDA out of memory,查日志说显存不足。我看别人同配置能跑32K长度,我这才4K就崩了。是不是我tensor_parallel_size设错了?或者需要调什么swap空间?求大佬指点,现在一头雾水,谢了!
大佬们,vLLM部署Qwen2.5服务老报OOM,是我配置有问题吗?
全部回复
共 164 条建议先看下nvidia-smi里是不是有其他进程占显存,另外试试把gpu_memory_utilization降到0.7。
之前也踩过类似的坑,八成不是tensor_parallel_size的问题,单卡不用设那个。你先看看是不是并发时KV cache撑爆了,vLLM默认会预分配显存,你把gpu_memory_utilization降到0.85试试,或者直接设个--max-num-seqs限制一下同时处理的请求数。另外确认下Qwen2.5的tokenizer是不是把长文本padding得很夸张,有时候实际占用比你想的大得多。swap空间那个基本没用,别指望它救显存。
看你这配置本身没啥毛病,问题大概率出在并发上而不是长度。vLLM默认会按max_num_seqs去预分配显存,你试试把--max-num-seqs调小到256或者128,同时确认下Qwen2.5的attention是不是用的paged_attention,如果没用对的话显存碎片会特别夸张。另外tensor_parallel_size=1就行,单卡不需要设这个,设了反而可能多占一份通信缓冲。swap空间一般用不上,除非你开--enable-swap,但那个主要救CPU内存不是显存。我上次遇到类似情况是忘了设--enforce-eager,导致图编译阶段吃满了显存,你可以顺手关掉看下。
A100 80G跑7B模型4K长度还OOM确实有点反常,先检查下是不是开了多个并发时vLLM的KV cache预留爆了,直接看下nvidia-smi里显存分配情况。你tensor_parallel_size设1就行,7B单卡完全够,大概率不是这个锅。另外gpu_memory_utilization别拉太高,0.85试试,给CUDA context留点余量。再不行就把max_num_seqs调小到16左右,并发请求太多时vLLM会疯狂预分配显存。我之前跑同款模型遇到过类似问题,最后发现是PagedAttention的block大小默认值没适配,手动调了下block_size=16就好了。
八成是并发时KV cache峰值超了,试试把max_num_seqs调小到8或者4。
八成不是tensor_parallel_size的问题,单卡本来就不用设这个。你查下是不是Qwen2.5的默认attn实现没走vLLM的paged attention,老版本vLLM对MLA支持不好会疯狂吃显存,升级到0.6.3+再试试。另外gpu_memory_utilization=0.9有点激进,留点给CUDA context和碎片,先降到0.85看还崩不崩。要是还不行,把max_num_seqs调小点,默认256可能并发一多就爆。
看着不像配置问题,A100 80G跑7B模型4K长度理论上是绰绰有余的。你检查下是不是vLLM版本太旧,或者安装的flash attention没生效,这两个对显存占用影响特别大。另外max_model_len设4096不代表实际跑的序列长度就是4096,如果你输入输出加起来超过这个数,KV cache照样会爆,建议把日志里的实际token数打出来看看。swap空间那个基本不用管,vLLM的CPU offload对性能影响很大,不是常规解法。
你这个配置按理说不该崩,先查下vLLM版本,老版本对Qwen2.5的attention后端支持有bug,升到0.6.3以上试试。另外gpu_memory_utilization别拉太高,0.85留点余量给CUDA context和碎片,尤其并发请求时KV cache会动态分配。tensor_parallel_size单卡设1就行,这个不影响显存占用。还有max_model_len设4096不代表实际占用固定,如果输入prompt很长或者并发数多,KV cache还是会暴涨,建议把--max-num-seqs调低到4-8,或者开--enable-chunked-prefill试试。我之前也踩过这坑,最后发现是没设--block-size,默认16太小导致显存碎片化,改成128就稳了。
说实话我之前也踩过这个坑,A100 80G跑7B按理说很宽裕,但vLLM的显存分配比你想象中激进。你gpu_memory_utilization设0.9其实有点高了,因为CUDA context、KV cache还有碎片化都会额外吃显存,建议先降到0.8试试。另外tensor_parallel_size不是关键,单卡就别设,反而可能触发额外的通信开销。还有个容易忽略的点,你max_model_len设的是4096,但实际并发请求数量乘以每个请求的KV cache才是真实占用,试试把并发数压到个位数或者用--max-num-seqs限制一下。如果还崩,开一下--swap-space(比如设8GB)让CPU内存兜底,虽然慢点但至少不OOM。
八成是并发时KV cache撑爆了,把gpu_memory_utilization降到0.8试试。
八成是并发请求时KV cache峰值超了,试试把max_num_seqs调小到4看看。
八成是gpu_memory_utilization设太高,留给KV cache的余量不够,试试0.85再加个--enable-chunked-prefill。
八成是并发把KVCache撑爆了,试试调低max_num_seqs或者换个调度策略。
我上次也这样,把gpu_memory_utilization降到0.85再配个--enable-chunked-prefill就稳了。
之前也踩过类似的坑,其实问题大概率不在tensor_parallel_size,单卡跑7B根本用不上这个。你试试把gpu_memory_utilization降到0.85,然后留意下是不是max_model_len设小但实际请求里prompt+output超了,vLLM会按最大可能batch预分配显存。另外检查下有没有开--enable-prefix-caching,有时候这个会吃额外显存。我上次是发现有个hidden state缓存没关,调了之后4K并发稳得很。
八成是KV cache吃满了,你试试把gpu_memory_utilization降到0.8,或者把max_num_seqs调小点,别迷信文档默认值。
你这配置按理说完全够跑4K的,先别急着调tensor_parallel_size,单卡没必要设这个。我怀疑是vLLM的KV cache预分配太激进,gpu_memory_utilization=0.9留给激活显存的空间不够,并发一多就容易爆。试着降到0.7或者0.8,然后把max_num_seqs调小点比如64,看还会不会崩。另外确认下是不是真的加载了7B而不是量化版,有时候模型路径指错也会白吃显存。
看着不像tensor_parallel_size的问题,7B单卡本来就用不上这个,重点查下vLLM版本和CUDA版本匹配不,老版本对Qwen2.5支持有坑。另外gpu_memory_utilization开到0.9太激进,留给KV cache和碎片化的余量不够,降到0.7-0.8试试,顺便把max_num_seqs调小点,并发请求一多显存峰值直接爆。我之前也遇到过类似情况,后来发现是pytorch的缓存分配器没释放干净,重启服务前先清一下显存,或者加个PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True的环境变量能缓解不少。
这配置看着没啥毛病,但OOM大概率不是max_model_len的锅,你查过KV cache的实际占用没?vLLM的gpu_memory_utilization是给整个显存池的,包括权重、激活、KV cache,Qwen2.5-7B的权重就占14G左右,你设0.9但A100 80G可用可能不到76G,剩下60多G给KV cache按理说4K并发不该崩。建议你先看下启动日志里KV cache预留了多少,还有是不是没设--max-num-seqs,默认并发可能拉太高了。另外tensor_parallel_size=1就行,这模型单卡完全够,设大了反而多卡通信吃显存。swap空间那个--swap-space是给CPU offload的,不解决显存峰值问题,别指望那个。你要是跑长上下文,试着把gpu_memory_utilization降到0.85,然后显式加--max-num-seqs=4或者8,再不行就开--enable-chunked-prefill,这玩意能显著降低峰值显存。最后查下你是不是用了flash-attn,vLLM默认会编译,但某些版本对Qwen2.5的attention计算有bug,我上次就是这问题,换个vLLM版本直接好了。
八成是显存碎片化的问题,A100虽然80G但KV cache分配很敏感,你试试把gpu_memory_utilization降到0.85再配个--enable-chunked-prefill看看。另外tensor_parallel_size=1就够,7B单卡完全带得动,设大了反而浪费显存做通信。我之前跑Qwen2.5也遇到过类似情况,后来发现是max_num_seqs默认值太高,并发一多就爆,手动限制到32或者64能缓解不少。swap空间别乱开,vLLM的CPU offload对性能影响挺大的,先查下nvidia-smi确认是不是别的进程占了显存。
八成是并发时KV cache炸了,试试把gpu_memory_utilization降到0.7再开个--max-num-seqs限制下。
检查下nvidia-smi看显存是不是被别的进程占了,A100跑7B按理说4K长度不该爆。