部署 32B 模型开了 128k 上下文,平时短请求正常,一旦有人贴长文档进来请求直接 OOM,服务重启,正在处理的其他请求也一起断。
一开始怀疑是「没有做请求长度准入,谁都能提交超长文本」,查了一圈,方向不对。
排查方向其实有限,先把可能性排一排。KV cache 按最大长度预留,显存被一次性吃满。还有一种是并发与单请求长度没有联动限制。
还有一种情况,OOM 后整个进程退出,影响同实例其他请求。
估算单请求 128k 的 KV 开销
python -c "print(128*1024*2*32*128*2/1024**3)"
随后按显存反推最大长度并写进启动参数
python -m vllm.entrypoints.openai.api_server --model Qwen2.5-32B-Instruct --max-model-len 65536 --max-num-seqs 8
再往下在网关层拒绝超过上限的请求
python gateway.py --max-input-tokens 60000 --reject-code 413
超长请求改走异步批量而不是在线接口
python submit_batch.py --file long_docs.jsonl
改完先别撤,确认这几项。超长请求被网关拦下并返回明确提示,在线实例不再 OOM,长文档走批量任务后仍能出结果。
上下文上限是显存约束不是宣传参数,先按显存算出能承受的长度,再决定对外承诺多少。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
