最近在把Qwen2.5-7B-Instruct部署到内网服务器上给业务用,机器是A10 24G,用vLLM启动,max-model-len设了4096,gpu-memory-utilization也调到0.9,按理说7B模型+4096上下文应该绰绰有余。但实际一压测,并发一上来就报CUDA OOM,有时候甚至单条长请求也会崩。查了日志发现vLLM的KV cache好像没按预期的比例分配,而且显存碎片化严重。
部署7B模型到生产环境,显存明明够却一直OOM,心态崩了
全部回复
共 26 条试试把gpu-memory-utilization降到0.85,再给vLLM加个--swap-space,碎片化问题能缓解不少。
试试把gpu-memory-utilization降到0.85,再给vLLM加--enforce-eager,碎片问题能缓解不少。
遇到同样情况,试试把max-model-len降到2048或者调低gpu-memory-utilization到0.85,给KV cache留点余量。
试试加个--enforce-eager参数,能省不少显存碎片,A10上这个经常是元凶。
会不会是vLLM的KV cache预留策略太保守了,试试把block-size调小点,或者换个量化版本看看?
遇到过类似的坑,vLLM的KV cache预留不是简单按max-model-len算的,它跟num_seqs、block_size还有显存碎片都有关系,A10上24G其实挺紧的。你可以试试把gpu-memory-utilization降到0.85以下,或者手动调一下max-num-seqs限制并发,另外确认下是不是Pytorch缓存没释放。长请求崩的话,检查下是否触发了显存动态扩容,建议直接固定block数试试。
这问题我熟,之前用7B在3090上也翻过车,表面算够但实际跑起来峰值能到20多G,vLLM有时候会莫名多占好几个G做cuda context。你试下把--kv-cache-dtype改成fp8,能省不少,再不行就换transformers配合flash-attn先顶着。碎片化的话,重启服务前记得清一下环境变量,有些情况下ULIMIT设置也会影响显存分配策略。
挺常见的,vLLM对显存利用率报的0.9其实是个上限目标,实际分配时候会预取很多临时buffer,尤其长请求时显存峰值会突然飙高。建议先单发一条4096的请求看下nvidia-smi峰值,再决定要不要把上下文砍到2048。另外检查下是不是被别的进程占了显存,A10有时候驱动预留就能吃掉快
试试把gpu-memory-utilization降到0.85,再给vLLM加个--swap-space,碎片化能缓解不少。
我之前也踩过类似的坑,A10的24G其实挺尴尬的,7B模型权重加激活就吃掉不少,vLLM默认的KV cache策略在长上下文下特别容易激进分配。你可以试试把gpu-memory-utilization降到0.85,同时给max-num-seqs设个上限,比如16,别让它无限开并发。另外检查下是不是pytorch版本和CUDA driver不兼容,有时候这会导致显存碎片化更严重,换个2.0以上的vLLM版本可能就有改善。
max-model-len设4096但实际峰值可能超了,试试把gpu-memory-utilization降到0.85留点余量。
vLLM对碎片敏感,换一下--block-size或者开--enable-chunked-prefill试试,能缓解不少。
是不是pytorch版本和vLLM的显存管理冲突了?之前我遇到过类似问题,换cuda12的镜像就好了。
这问题太典型了,我也踩过同样的坑。你试试把gpu-memory-utilization降到0.85以下,给CUDA context和pytorch留点余量,vLLM对碎片化很敏感。另外max-model-len设4096但实际请求如果带长system prompt,KV cache计算会翻倍,可以开--enable-chunked-prefill缓解一下。
这问题我之前也踩过,vLLM的KV cache预留和实际碎片化经常对不上,尤其A10这种卡,显存带宽和分配策略都容易卡脖子。建议你把gpu-memory-utilization先降到0.8试试,再开一下vLLM的--enable-chunked-prefill,长请求的显存峰值能平滑不少。另外单条长请求崩的话,检查下是不是prompt里有什么特殊trick导致prefill阶段爆了,我之前就是被一个超长system prompt坑的。
我怀疑是不是你max-model-len设4096但实际压测的请求长度远超过这个,vLLM会直接拒掉还是硬塞导致OOM?另外显存碎片化严重的话,试试换一下vLLM的allocator,用--disable-sliding-window或者调整block大小,有时候block设256比默认的16能明显减少碎片。要是还不行,干脆给容器加个--shm-size,有些场景是缓存页的问题不是显存本身。
分页KV cache看着美,但实际跑起来分配粒度太细了,A10上反而容易炸。你可以试试用--kv-cache-dtype fp16,再手动设个--max-num-seqs,把并发数限制在8以内,我这边7B模型这么调完稳得很。还有,记得看下是不是其他进程占了显存
试试把gpu-memory-utilization降到0.85,给CUDA context留点余量,并发前先warmup一下。
可能是max-model-len设太高了,KV cache预分配超了,砍到2048再压测看看。
这问题我也踩过坑,vLLM的KV cache预留逻辑有时候很迷,尤其并发上来后显存碎片会突然暴涨。你试试把gpu-memory-utilization降到0.85,然后强制开enable_chunked_prefill,长请求崩的情况会好很多。另外检查下是不是有旧的推理进程没杀干净,我之前就是被残留进程占了几G显存搞到心态炸裂。
试试把gpu-memory-utilization降到0.85,再开enforce-eager,碎片化会好很多。
A10跑7B确实容易踩这个坑,24G看着挺大,实际上vLLM启动时先吃一波权重,然后KV cache是按你给的utilization做静态预分配的,0.9这数字在A10上很容易把剩余空间榨干。你日志里看到KV cache没按预期分,大概率是启动时还有别的进程或者CUDA context占了显存,gpu-memory-utilization是相对总显存算的,不是相对空闲显存,所以实际留给KV block的比你想的少一截。并发上来OOM基本就是block不够用了,长请求又容易触发抢占,一抢占再重算就直接爆。碎片化这块可以试试开enforce-eager,图模式虽然快但显存池管理有时候确实不友好。另外max-model-len 4096配合7B,单条请求的prefill和decode峰值其实比想象中高,尤其Qwen2.5的GQA配置下KV头数少但序列长照样吃。建议先把utilization降到0.85左右,再开swap-space给个几G兜底,同时limit一下max-num-seqs,别让调度器一次塞太多。真要压测的话用benchmark脚本按真实流量打,别用默认并发,不然数字很虚。
A10 24G跑7B确实有点紧,gpu-memory-utilization 0.9在压测时容易被vLLM的预分配策略坑,它默认会按你给的上限去抢KV cache block,并发一高碎片就炸了。可以试试把max-num-seqs压到32以下,再开enable-prefix-caching,长请求的重复前缀能省不少显存。另外确认下有没有别的进程偷偷占卡,nvidia-smi里看着够不代表实际能连续分配到大块。实在不行换AWQ量化版,7B在24G上跑4096会舒服很多。
A10 24G跑7B确实够,但vLLM启动时KV cache是按gpu-memory-utilization先切一大块预留的,你把0.9调这么高,留给激活值和CUDA context的空间就很小了,并发一上来直接爆。我之前也踩过这个坑,试过降到0.85然后显式加 enforce-eager 或者限制max-num-seqs,会稳很多。碎片化严重的话看看是不是开了enable-prefix-caching但请求前缀差异太大,那个也会让block管理变碎。另外压测崩的时候可以nvidia-smi盯着看,确认下到底是权重占多了还是KV真没按比例分。
vLLM这个显存分配确实挺迷的,gpu-memory-utilization=0.9只是告诉它最多能用多少,但实际KV cache能占多少还得看它启动时算出来的可用显存块。A10 24G跑7B,模型权重FP16大概15G左右,留给KV cache的其实没想象中宽裕,尤其你要是没开enable-prefix-caching或者block-size没调好,碎片一多就容易崩。我之前在类似配置上遇到过一样的问题,后来把max-model-len降到2048先保稳定,再慢慢往上加。另外你可以试试加--swap-space给CPU offload留点余地,虽然会慢但至少不OOM。还有个坑是并发高的时候调度器会预分配一大块KV cache,实际请求还没进来显存就已经被占住了,看起来就像“明明够却炸了”。建议用nvidia-smi盯一下启动后空载时的显存占用,如果已经快满了那基本就是KV cache预留策略的问题。实在不行换TGI或者用AWQ量化一下权重,7B在24G上跑生产还是别太极限。
A10跑7B其实挺吃紧的,gpu-memory-utilization设0.9反而容易碎片,降到0.85试试。
vLLM的gpu-memory-utilization设0.9其实挺激进的,它启动时会先按这个比例预分配一大块显存给KV cache pool,但如果你模型权重加载后剩余显存不够0.9这个目标,它内部的profiling可能会算错,导致实际KV block数比预期少很多。A10 24G跑7B的bf16权重差不多要15G左右,加上激活和CUDA context,留给KV cache的本来就不算特别宽裕,4096上下文并发一高确实容易顶到天花板。你可以先试试把max-model-len降到2048看压测还崩不崩,如果明显好转那就是KV cache不够而不是碎片问题。碎片化严重的话建议开enforce-eager模式跑一下对比,CUDA graph捕获本身也吃显存,有时候反而是OOM的隐形推手。另外检查下是不是有别的进程占着卡,nvidia-smi看的总量和vLLM自己报的占用经常对不上。实在不行就上tensor parallel或者换量化版本,7B在24G上想跑高并发本来就有点勉强。