最近在把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,心态崩了
全部回复
共 13 条试试把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显存搞到心态炸裂。