模型部署与推理

vLLM v0.6.0 复盘:吞吐提升之后,推理服务仍要按 SLO 验收

从 vLLM v0.6.0 的 API 进程拆分、多步调度和异步输出处理出发,解释吞吐、首 token、逐 token 延迟与准入控制为何必须一起进入生产验收。

发布:2024/09/08更新:2024/09/27
推理请求经过准入队列、API 进程、调度器与 GPU 批次,并分别用首 token、逐 token、吞吐和拒绝率验收
图 1:本站依据 vLLM 2024-09-05 发布说明与固定代码版本重绘;图示表达生产 SLO 的约束关系,不代表本站复现了官方 H100 Benchmark。

时间与证据

本文把事件日定为 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 的主要变化不是换了模型,而是重排服务执行路径:

  1. API server 与推理引擎进程拆分。 两个 Python 进程通过 ZeroMQ 通信,减少 GIL 竞争,并让 HTTP 请求处理与引擎执行有机会重叠。
  2. 多步调度。 scheduler 一次准备多个生成 step,让 GPU 连续执行,摊薄每步都回到 CPU 调度的开销。
  3. 异步输出处理。 输出数据结构处理与 GPU 计算重叠,减少计算结束后等待 CPU 的间隙。
  4. 对象复用等局部优化。 减少高频路径中的 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 连续工作比例,却可能让新请求晚一步进入批次。生产系统需要在吞吐与交互延迟之间显式选择,而不是让一个全局参数替全部租户做决定。

可执行的分层方式是:

  1. 入口根据任务类型、最大上下文和优先级分流。
  2. admission controller 计算当前 KV Cache、token budget 与队列年龄。
  3. 交互队列限制单请求最大 prefill,后台队列允许更大 batch。
  4. scheduler 只处理已经通过配额与租户隔离的请求。
  5. 超过队列上限时快速拒绝并返回可重试语义,而不是无限等待。

这与普通 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

来源账本

以下来源用于核对事实、日期与当时可用范围。厂商自报性能不视为本站独立复现。

  1. vLLM v0.6.0: 2.7x Throughput Improvement and 5x Latency Reduction
    vLLM Team官方一手来源同期证据来源发布:2024/09/05本站核验:2024/09/27
  2. vLLM v0.6.0 performance update T+2 snapshot
    vLLM Team (Internet Archive)历史页面存档同期证据来源发布:2024/09/07本站核验:2024/09/27
  3. vLLM v0.6.0 tag target source tree
    vLLM Project官方仓库同期证据来源发布:2024/09/04本站核验:2024/09/27

讨论

正在加载评论...