最近在把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 条A10跑7B确实容易踩这个坑,gpu-memory-utilization设0.9其实挺激进的,vLLM是按总显存算比例,但实际KV cache分配还得看你并发时每条序列的真实长度。建议先把max-model-len降到2048试试,或者开enable-prefix-caching,压测时候用--num-lookahead-slots调一下。碎片化严重的话可以试试--swap-space加大点,把部分KV换到CPU内存缓解突发。
A10跑7B确实容易踩这个坑,gpu-memory-utilization=0.9只是上限,vLLM预分配KV cache时还会留一部分给激活值和CUDA context,实际能用的没那么多。你可以试试把max-model-len降到2048先压测看看,或者开enable-prefix-caching减少重复计算。碎片化严重的话加--enforce-eager关掉CUDA graph有时候反而更稳,虽然吞吐会掉一点。另外压测并发数别一上来就拉满,逐步加看看拐点在哪。
A10跑7B确实容易踩这个坑。vLLM默认按显存比例预分配KV cache,但gpu-memory-utilization设0.9只是上限,实际会先扣掉模型权重和激活值,留给KV block的可能比你想的少很多。碎片化问题可以试试加--enable-prefix-caching,或者把block-size从默认16调小一点,减少内部浪费。另外压测时并发一高,调度器排队请求堆积也会让显存曲线突然翘头,建议先限制max-num-seqs观察一下。
刚入门,这个对我帮助很大。
刚入门,这个对我帮助很大。
A10 24G跑7B按理说是够的,但vLLM这玩意儿对显存的计算比我们想象的要"贪"一些。你max-model-len设4096,gpu-memory-utilization 0.9,看起来留了10%余量,但vLLM启动时profile的峰值显存和实际压测时的峰值经常对不上,尤其是KV cache的block分配策略,并发一上来它会按最大并发去预留block,很容易就把那点余量吃穿了。我之前也踩过类似的坑,后来把max-num-seqs显式限死,别让它自己猜,OOM概率降了一大截。另外显存碎片化严重这点很关键,vLLM默认的block size是16,长请求多的时候碎片确实会起来,可以试试调小block size或者开enforce-eager先排除CUDA graph占的那部分显存干扰。还有Qwen2.5-7B的GQA结构KV cache其实不算大,但你要是没开chunked prefill,单条长请求的prefill阶段瞬时占用会很吓人,这个也值得查一下。建议先用nvidia-smi盯着压测时的显存曲线看,是阶梯式涨满还是尖峰式爆掉,两种情况的解法完全不一样。