模型部署与推理
vLLM v0.6.0 复盘:吞吐提升之后,推理服务仍要按 SLO 验收
从 vLLM v0.6.0 的 API 进程拆分、多步调度和异步输出处理出发,解释吞吐、首 token、逐 token 延迟与准入控制为何必须一起进入生产验收。
时间与证据
本文把事件日定为 2024 年 9 月 5 日。vLLM 团队当天发布性能更新,明确写出“Today, we released vLLM v0.6.0”,并给出测试工作负载、硬件、对比版本、TTFT、TPOT 与吞吐口径。信息截止到 9 月 7 日;同一页面在 T+2 内已有固定快照。快照保留的是站点启用 HTTPS 前的 http 原始目标,当前可直接重放,页面身份仍由相同 host 与 path 配对。版本证据不是可移动 tag 页面,而是 tag 当时指向的完整代码树 32e7db25365415841ebc7c4215851743fbb1bad1。
这三类证据各自回答不同问题:
| 证据 | 能证明什么 | 不能证明什么 |
|---|---|---|
| 发布说明 | 团队如何定义性能问题、测试条件和已知限制 | 本站在相同硬件上得到同样数值 |
| T+2 快照 | 截止期内页面实际包含哪些表述 | 后续版本仍保持相同行为 |
| 固定代码树 | v0.6.0 对应哪一份源码 |
任意模型、GPU 和流量下的生产容量 |
因此证据等级是 sourced。本文没有 H100 集群,也没有运行 vLLM v0.6.0,不会把官方报告的“2.7 倍吞吐”或“5 倍 TPOT 改善”改写成本站实测。数字只用于理解官方测试中的变化方向;生产判断必须回到自己的模型、请求长度和 SLO。
当时发生了什么
发布说明把瓶颈定位在一个容易被模型参数量掩盖的问题:GPU 不一定在等显存或算子,也可能在等 Python 与 CPU 调度。API server 解析请求、scheduler 选择序列、准备输入、处理输出和流式回传都消耗 CPU。当较小模型在高性能 GPU 上很快完成一次 forward pass 时,这些串行工作会暴露为 GPU idle gap。
v0.6.0 的主要变化不是换了模型,而是重排服务执行路径:
- API server 与推理引擎进程拆分。 两个 Python 进程通过 ZeroMQ 通信,减少 GIL 竞争,并让 HTTP 请求处理与引擎执行有机会重叠。
- 多步调度。 scheduler 一次准备多个生成 step,让 GPU 连续执行,摊薄每步都回到 CPU 调度的开销。
- 异步输出处理。 输出数据结构处理与 GPU 计算重叠,减少计算结束后等待 CPU 的间隙。
- 对象复用等局部优化。 减少高频路径中的 Python 对象创建和回收。
官方测试使用 Llama 3 8B/70B、H100、ShareGPT 与若干不同输入输出形态,并与 v0.5.3 及其他推理引擎比较。重要的是,发布说明同时公开了反例:多步调度会让用户收到成批 token,造成不平滑的 inter-token latency;在低请求率下,新请求必须等当前多个 step 完成,较大的 --num-scheduler-steps 可能抬高 TTFT;prefill-heavy 工作负载也没有在所有对比中领先。
这说明发布信号不是“vLLM 已经自动更快”,而是“推理服务的 CPU 控制路径已经成为一等性能对象”。优化改变了不同指标之间的交换关系。
任务判断
真实任务不是“把模型跑起来”,而是为一个多租户 AI 应用提供可承诺的生成接口。假设服务同时承载三类流量:
- 对话请求:短输入、中等输出,用户对 TTFT 和逐 token 平滑度敏感。
- RAG 请求:长 prompt、短答案,prefill 比例高,容易占用 token budget。
- 后台摘要:长输入、长输出,可排队但关注总吞吐与单位成本。
交付合同至少应写清:
| 对象 | 验收指标 | 为什么不能只看吞吐 |
|---|---|---|
| 用户等待 | TTFT P50/P95/P99 | 队列和多步调度可能让首 token 变慢 |
| 流式体验 | TPOT 与最大 token gap | 平均 TPOT 会掩盖成批返回造成的停顿 |
| 容量 | accepted tokens/s、requests/s | 短请求和长请求的 request/s 不可直接比较 |
| 过载 | queue time、429/503、取消率 | 无限排队会把高吞吐伪装成高延迟 |
| 正确性 | 输出合同、终止原因、工具参数 | 更快地产生错误结果没有业务价值 |
| 成本 | 每个合格请求的 GPU 秒与总成本 | 失败、超时和人工复核也消耗容量 |
验收标准应是“在固定工作负载混合、并发和时间窗口内,合格请求满足 SLO 且过载行为可预测”,而不是在离线洪峰中取得最高 tokens/s。官方 QPS inf 吞吐测试回答的是饱和容量,不回答真实到达过程中的排队尾延迟。
工程影响
先分解延迟,再决定优化位置
一次请求可以粗略拆为:
总完成时间
= 网关与鉴权
+ 队列等待
+ tokenization / multimodal preprocessing
+ prefill
+ decode
+ detokenization / streaming
+ 下游校验
v0.6.0 主要减少其中一部分 CPU 串行与 GPU 空等。它不会自动消除网关限流、队列拥塞、长 prompt prefill、网络慢客户端或输出校验。监控只记录一个 duration 会让完全不同的退化看起来相同。
生产 trace 至少要带 request_class、输入/输出 token bucket、模型 revision、量化方式、并行配置、队列时间、TTFT、TPOT、终止原因和实例 ID。高基数字段不能直接作为无界 metrics label;request ID 留在 trace,指标只使用受控枚举和 bucket。
调度器是资源政策,不只是性能代码
多步调度提高 GPU 连续工作比例,却可能让新请求晚一步进入批次。生产系统需要在吞吐与交互延迟之间显式选择,而不是让一个全局参数替全部租户做决定。
可执行的分层方式是:
- 入口根据任务类型、最大上下文和优先级分流。
- admission controller 计算当前 KV Cache、token budget 与队列年龄。
- 交互队列限制单请求最大 prefill,后台队列允许更大 batch。
- scheduler 只处理已经通过配额与租户隔离的请求。
- 超过队列上限时快速拒绝并返回可重试语义,而不是无限等待。
这与普通 Web 后端的线程池和数据库连接池经验相通:排队位置、超时归属、取消传播和重试预算决定系统在压力下是否可控。差别在于推理请求还携带可变 token 长度与 KV Cache 生命周期,同一个“请求数”可能代表完全不同的资源占用。
必须把慢客户端和取消纳入容量
流式响应不是生成完成后一次返回。客户端断开、移动网络阻塞、用户取消与反向代理缓冲都会改变资源释放时刻。服务若只停止 HTTP 写入、没有把 cancellation 传到 scheduler,GPU 仍会继续生成无人消费的 token。
验收应构造三类故障:首 token 前取消、生成中取消、客户端读取变慢。检查请求是否从队列移除、KV block 是否释放、计费与审计是否保持一致,以及取消风暴会不会反过来压垮控制路径。
Benchmark 必须按工作负载分层
本文建议的实验设计不是复刻一张总榜,而是固定四个矩阵维度:
- 输入长度:短、中、长,单独保留 prefill-heavy 集合。
- 输出长度:短答案、对话、长生成。
- 到达模式:恒定 QPS、突发、
QPS inf饱和。 - 并发主体:单租户、多个租户、带优先级抢占。
每次只改变一个变量,至少记录 warm-up、持续时间、失败数、取消数、TTFT/TPOT 分位数、GPU 利用率、CPU 利用率、KV Cache 使用和实际接受吞吐。比较版本时固定模型文件 hash、容器 digest、驱动、CUDA、GPU 时钟策略和启动参数。否则“升级后更快”可能只是请求长度或缓存命中改变。
回滚单位应包含运行时与参数
推理服务版本不只是 Python package。镜像、模型 revision、tokenizer、量化工件、kernel、并行拓扑、scheduler 参数与网关路由共同决定行为。升级清单需要一个可重放 manifest,并让旧 manifest 仍能启动。
推荐先影子回放固定流量,再给少量无副作用请求 canary。触发回滚的条件应同时覆盖错误率、输出合同、TTFT、TPOT、队列年龄和显存异常。只在平均吞吐下降时回滚,会错过交互尾延迟与正确性回归。
商业价值
会为这类能力付费的不是“喜欢高 Benchmark 的团队”,而是已经承担 GPU 账单或推理 API 毛利的产品方:模型托管平台、企业私有部署团队、实时助手和批量内容处理服务。它增强的是现有模型服务层,让相同硬件在满足 SLO 的前提下接收更多合格工作。
收益可写成一个可证伪的口径:
单位合格请求成本
= GPU 租用 + CPU/内存 + 网络 + 运维 + 失败重试 + 人工复核
-----------------------------------------------------------
通过质量与 SLO 的请求数
吞吐优化只有在分母增加、失败与尾延迟没有同步恶化时才形成商业价值。若为了追求饱和吞吐把交互请求 TTFT 推高,用户退出和重试会反向增加成本。若工作负载本来低 QPS,额外的复杂调度、专用镜像和运维人力也可能比节省的 GPU 时间更贵。
适合采用的条件包括:流量稳定到足以形成 batching、模型与硬件已经固定、团队能维护观测和容量测试、数据或成本要求支持自托管。不适合的场景包括:请求量很小、模型频繁更换、团队没有 GPU 运维能力,或托管 API 的折扣与弹性已经优于自建总成本。
预测窗口应绑定流量:未来一个季度若 P95 队列时间、GPU 小时和合格请求成本在同一工作负载下持续改善,优化成立;若只在一次离线洪峰提升、线上尾延迟或事故率上升,就应撤销“更省”的结论。
局限与风险
第一,本文没有复现官方硬件结果。官方数值来自其指定模型、H100、数据集、版本与参数,且多步调度在测试中显式开启,不能外推到消费级 GPU、其他模型或默认配置。
第二,v0.6.0 是历史版本。本文冻结它是为了理解当时 CPU 控制路径成为瓶颈的信号,不建议在 2026 年按本文版本直接部署。后续 vLLM 架构、默认引擎和功能支持已经变化,应重新固定当前版本再测试。
第三,性能与正确性可能耦合。取消、chunked prefill、prefix caching、speculative decoding 和并行执行都会增加状态组合。任何优化都要覆盖超时、重复请求、输出终止、工具调用与租户隔离,而不只是 happy path。
第四,观测本身有成本。逐 token 记录日志会造成高基数和 I/O 压力;Prompt 与输出还可能含个人数据和商业秘密。生产只保存必要统计,原文采样需要授权、脱敏、保留期和删除流程。
第五,GPU 利用率不是最终目标。持续 100% 利用率可能意味着没有突发余量,故障切换时无法接管。容量计划要保留升级、实例丢失和流量峰值的安全边际。
面试表达
30 秒结论: vLLM v0.6.0 的关键信号不是某个倍数,而是推理服务在快速 GPU 上可能受 CPU 调度和串行输出处理限制。进程拆分、多步调度和异步输出能提高饱和吞吐,但会改变 TTFT 与逐 token 平滑度,所以我会用固定工作负载同时验收 TTFT、TPOT、队列、拒绝、取消和单位合格请求成本。
3 分钟架构说明: 请求先经过租户鉴权和 token 配额,再进入按任务类型分层的 admission queue;API 进程负责协议和流式连接,引擎进程负责 scheduler 与 GPU executor。trace 分别记录 queue、prefill、decode 和 stream 时间。交互与后台任务使用不同的队列上限和调度参数;过载时快速拒绝。升级固定镜像、模型和参数 manifest,通过影子回放、canary 和可执行回滚验证。
追问:为什么不直接看 tokens/s? 因为 QPS inf 下的饱和吞吐不会暴露真实到达时的队列尾延迟,多步调度还可能提升吞吐却恶化低 QPS TTFT。业务购买的是在 SLO 内完成的正确请求,而不是无条件生成的 token。
追问:如何定位升级后变慢? 先按 queue、tokenization、prefill、decode、stream 分段,再按请求长度、缓存命中、模型 revision 和实例比较。CPU 高而 GPU 出现空隙时查 scheduler/API 路径;KV Cache 饱和时查准入和长度分布;只有客户端慢时查取消传播与代理缓冲。
复盘
站在后续看,T+2 内最值得保留的判断是:推理吞吐已是完整服务系统问题,而不是只换更快 kernel。发布说明主动公开低 QPS TTFT、成批 token 和 prefill-heavy 的边界,比一个总倍数更有工程价值。
当时容易高估的是把厂商 Benchmark 直接换算成 GPU 节省。真实容量还受模型结构、token 长度、缓存、并发、正确性门禁、失败与流量形态影响。下一次看到“吞吐提升 N 倍”,应先寻找四项证据:对比版本是否固定、工作负载是否公开、失败和尾延迟是否计入、优化是否默认启用。
这篇文章应进入 Workbench 的推理服务模块:新增请求分类、准入、取消传播、SLO trace 与版本 manifest,而不是再做一个只显示 tokens/s 的演示页面。
方法披露
本文由 AI 辅助整理结构与检查术语,事实边界由作者逐项对照发布页 T+2 快照和 v0.6.0 完整 commit。没有运行 vLLM、没有 H100,也没有产生新的性能数据;所有生产指标、故障注入和回滚步骤均为待执行的实验设计。官方性能表述在正文中始终标为官方报告。
修订记录
2024-09-08:初版发布,记录 v0.6.0 的同期事实、调度权衡与生产验收设计。2024-09-27:复核固定代码树、快照目标、Benchmark 限制与商业判断,未加入截止日后的能力作为同期事实。
Source ledger
来源账本
以下来源用于核对事实、日期与当时可用范围。厂商自报性能不视为本站独立复现。
讨论