最近在做一个小项目,把微调过的Qwen2.5-7B接到公司内部知识库问答上。本地测试一切正常,但推到服务器上就出问题了——用的是A10(24G显存),模型加载完占18G左右,按理说还有富余。结果只要并发一上来(大概3-4个请求),直接就CUDA OOM。我用的vLLM,加了--max-model-len 4096,并发数设的8,但日志显示实际批处理好像没生效?另外默认的KV Cache是不是没自动调优?试过把--gpu-memory-utilization调到0.9,还是不行。有没有大佬遇到过类似情况,是量化精度选错了(目前用的AWQ),还是并发控制参数根本就没奏效?求指点,孩子快被线上事故逼疯了。
部署Qwen2.5-7B到生产环境,显存明明够却一直OOM?
全部回复
共 64 条A10 24G 跑 Qwen2.5-7B 的 AWQ 确实挺紧的,你看到加载完占 18G 那只是权重加基础开销,KV Cache 是后面随着请求动态涨的。vLLM 默认会按 gpu-memory-utilization 去抢显存做 KV Cache 池,0.9 的话等于只给系统留 2G 多,稍微有点波动就容易炸。你说的批处理没生效,我猜是 max-num-seqs 设了 8 但实际被 max-model-len 和可用 KV 块卡住了,调度器拿不到足够 block 就只能排队或者直接 OOM。可以先把 max-model-len 降到 2048 试试,如果立马好转那就是 KV 显存不够,跟量化精度关系不大。另外 AWQ 在 vLLM 里对 7B 的显存节省其实有限,真正吃紧的是长上下文下的 KV,不是权重。建议你开一下 enable-prefix-caching,知识库问答场景 system prompt 和检索片段重复度高,命中缓存能省不少。还有 max-num-batched-tokens 别用默认,手动设小一点比如 2048,让调度更平滑。实在不行就上张量并行或者换更小的量化,但先确认是不是 KV 池被撑爆了。
刚入门,这个对我帮助很大。
学到了,感谢分享!
AWQ 权重加载完占 18G 这个数字本身就有问题,7B 的 AWQ 权重也就 5-6G,剩下十几 G 大概率是 vLLM 预分配的 KV Cache 和激活开销,所以你以为的“富余”其实早被划走了。--gpu-memory-utilization 0.9 在 24G 卡上就是给 vLLM 圈 21G 多,权重之外的 KV Cache 是按最大并发和 max-model-len 静态预留的,你设 8 并发、4096 长度,算下来 KV 块需求可能直接顶满。日志里批处理没生效,去确认下有没有开 --enable-chunked-prefill,以及 --max-num-seqs 是不是被默认值盖掉了,vLLM 版本不同参数行为差异挺大。另外 A10 是 Ampere 架构,AWQ 的 kernel 走的是 Marlin 还是 GEMM 也影响显存峰值,可以试试换 GPTQ 或者干脆 fp16 加 --max-model-len 2048 先排除量化因素。建议先把 --gpu-memory-utilization 降到 0.85、--max-num-seqs 压到 2 跑一轮,看稳定后再逐步加,别一上来就按理论值估。