vLLM 参数级配置与调优
一句话定义
vLLM 的部署质量由十余个参数共同决定,核心是三件事:把显存账(gpu-memory-utilization × 卡容量 = 权重 + KV 池)算对、把并发上限(max-num-seqs)与 TPOT SLO 对齐、把前缀缓存与量化等开关按负载画像打开。
为什么重要
同一模型同一硬件,默认参数与调优参数的吞吐差距常达 2–3 倍;而 OOM 与"吞吐上不去"两类事故几乎都能定位到 2–3 个参数。这是从"会启动引擎"到"能对生产负责"之间最实用的一课。
前置知识
核心概念:核心参数与启动示例
vllm serve Qwen/Qwen2.5-7B-Instruct-AWQ \
--served-model-name qwen7b-awq \
--gpu-memory-utilization 0.90 \
--max-model-len 8192 \
--max-num-seqs 64 \
--tensor-parallel-size 1 \
--enable-prefix-caching \
--block-size 16 \
--quantization awq_marlin
gpu-memory-utilization(默认 0.9):给引擎的显存比例;扣掉权重后余量即 KV 池。KV 池 = util × 卡容量 − 权重 − 开销,这是排错时的第一算式(kp-004)。
max-model-len:单请求最大上下文;按业务真实需要设,不要默认放最大——KV 池被"最坏情况"挤占。
max-num-seqs:并发上限;与 KV 池、TPOT SLO 三者互相约束,不是越大越好。
tensor-parallel-size:张量并行卡数;多卡时权重与 KV 池按卡切分。
enable-prefix-caching:开启前缀块复用,多轮对话/共享 system prompt 必开。
enforce-eager(未写即默认 CUDA Graph):图捕获省 launch 开销但占额外显存;显存极限时可打开换稳定。
--quantization:通常从模型 config 自动推断,显式写可避免误判。
原理与机制
vLLM 的参数之间是约束链而非独立旋钮:gpu-memory-utilization 决定 KV 池总量,max-model-len 决定单请求的最坏 KV 占用,两者相除给出理论并发上限;max-num-seqs 是在这个上限之内、由 TPOT SLO 截出的实际值。理解这条链后,调参顺序自然是从显存 → 并发 → SLO——倒过来调必然返工,因为下游参数的合法区间由上游决定。
实践步骤(可执行操作)
- 按 kp-004 账本算清:权重(AWQ 后 3.5–4.5GB)+ 目标 KV 池 + 约 10% 开销,反推 util 与 max-model-len。
- 压测定 max-num-seqs:从 32 起步,观察 P99 TPOT 触线(如 50ms)即停——这条线就是你的并发容量(kp-002 方法)。
- 打开 prefix caching,用真实多轮对话流量复测 TTFT 改善与 KV 命中率(vLLM /metrics 暴露 num_requests_*、cache 指标)。
- 长输入场景评估 chunked prefill(分块预填充,让长 prefill 与 decode 交错)以压 TTFT 长尾。
- 固化配置到部署清单,与压测数字一起归档(kp-009 的留痕纪律)。
实例或案例
一台 A100-80G 部署 AWQ 7B 的完整推演:util=0.90 → 约 72GB 归引擎,扣权重约 4GB 与开销后 KV 池约 65GB;max-model-len=8192 时单请求 KV 峰值约 1GB(GQA),理论并发上限约 60;压测发现并发 48 处 TPOT P99 越过 50ms 红线,最终 max-num-seqs=48。三个数字全部可由账本与压测复算——"配置可审计"就是本知识点要训练的能力。
排错清单(症状 → 核查 → 处置)
- 启动即 OOM:重算 util×容量−权重 是否为负 → 降 util 或 max-model-len → 仍不够则 tensor-parallel-size+1。
- 运行中抢占频繁/OOM:max-num-seqs 超 KV 池承载力 → 降并发或缩上下文(对照 kp-027)。
- 吞吐不达预期:看 /metrics 的 running/waiting——waiting 长期高说明容量不足;running 低说明压测并发不够。
- TTFT 长尾:多为长 prefill 阻塞 decode → 开 chunked prefill / 加大 max-num-batched-tokens。
- 多卡后吞吐没线性涨:先查是否卡在 prefill 或调度,再看通信开销;TP 不是线性扩展,2 卡常见 1.6–1.8 倍。
常见误区
- "util 拉满 0.98 更好":不留余量会在显存碎片与 CUDA Graph 上翻车,0.90 是稳妥起点。
- "max-num-seqs 默认 256 就该用满":TPOT 与 KV 池会先爆,容量必须由 SLO 压测得出。
- "prefix caching 万能":前缀不重复的负载(如长尾独立文档)命中率趋零,白占管理开销——先看流量画像。
自测题
- 80GB 卡、AWQ 7B(权重约 4GB)、util=0.9,KV 池大约多少?
要点:72 − 4 − 约 5 开销 ≈ 60GB 量级(精确值以引擎日志为准)。
- 为什么 max-model-len 要按业务设而非越大越好?
要点:调度与 KV 预留按最坏情况计,过大挤占 KV 池、降低可接纳并发。
- running 高且 waiting 高,说明什么?
要点:容量不足,已饱和——加副本/降并发/缩上下文,而不是调 kernel。
与其他知识点的关系
参数语义全部落在 kp-004/kp-014/kp-021 上;压测方法来自 kp-002;跨副本后的路由与扩缩容见 kp-023;系统级排错见 kp-027。
延伸阅读
vLLM 官方文档的 "Optimizing vLLM" 与 metrics 页面(与本页参数一一对应,按需查阅最新参数名)。