Stanford CS25: Serving Transformers - Lessons from the Trenches

Stanford CS25: Serving Transformers - Lessons from the Trenches

Executive Summary

在大规模部署 transformer 模型时,需要从关注模型能力转向优化生产推理的“乏味基础设施”。核心挑战在于 prefill(输入处理)阶段与 decode(令牌生成)阶段之间的差距,decode 阶段通常受内存带宽限制,导致硬件利用率低下。通过定义明确的工作负载(使用服务水平目标 SLO),根据效率与能力的界限选择模型,并采用投机解码、量化等激进优化技术,才能在生产推理中取得成功。

Defining Inference Workloads and SLOs

有效的推理工程始于对工作负载的清晰定义,这决定了硬件和软件架构。工作负载大致分为三类原型:

  • Chatbot Plus: 人机交互系统(如 ChatGPT、Claude),主要指标是交互性,以每位用户每秒输出的 token 数衡量。
  • Background Agents: 在秒或分钟尺度上完成复杂任务的系统(如编码代理),主要指标是最后一个 token 的耗时。
  • Data Processors: 高吞吐、突发性的工作负载(如文档索引),主要指标是整体吞吐量,常以每美元产生的 mega‑token 计。

Key Performance Metrics

为管理这些工作负载,工程师必须跟踪每个副本的特定指标,以决定如何扩展系统:

  • Time to First Token (TTFT): 用户看到首个输出字节前的延迟。
  • Inter-token Latency: 连续 token 之间的间隔时间。
  • Queries Per Second (QPS): 请求量,通常具有强季节性和波动性。
  • Prefix Reuse: 输入 token 重叠的频率,可通过 KV 缓存降低计算成本。

Model Selection: Efficiency vs. Capability Bounds

模型选择取决于任务是受效率限制还是受能力限制:

Efficiency-Bound Workloads

在这些任务中,所需的智能水平相对较低且易于实现,成本成为主要驱动因素。这类工作负载通常使用开源模型(如 Mistral、Gemma),并常在单 GPU 副本上运行,以最大化性价比。

Capability-Bound Workloads

这些任务需要最高可用的智能水平,当前唯一的解决方案是规模化。这类模型(如前沿专有模型)体积庞大,需要每个副本多 GPU,甚至多节点。它们通常在多代理系统中充当协调者,管理更小的、受效率限制的子代理。

The Inference Stack: Engines and Hardware

Inference Engines

推理引擎由 token 化服务器进程、CPU 调度器以及 GPU 执行组成。调度器的主要职责是确保 GPU 永不空闲。当前领先的开源引擎包括:

  • vLLM: 采用开放治理,广受采用。
  • SGLang: 高性能导向,拥有激进的优化。
  • TensorRT-LLM: NVIDIA 提供的 C++ 编译运行时,针对小模型和小批量最优。

Hardware Constraints

生产推理主要使用 NVIDIA 数据中心 GPU(SXM 形态),因为其高带宽内存(HBM)。decode 阶段严重受内存带宽限制;虽然 Tensor Core 每字节可执行数千次运算,decode 阶段却只执行少量运算。因此 HBM 与高速互连(NVLink)对避免计算单元空闲至关重要。

Deployment and Robustness at Scale

部署成千上万的 GPU 会带来显著的可靠性和成本挑战:

  • Hardware Failure: H100 GPU 的平均故障间隔只有几天到几周。系统必须具备冗余设计,确保硬件故障不导致系统整体失效。
  • Cold Start and Scaling: 为了在不浪费空闲 GPU 资源的前提下应对流量波动,系统需要快速启动副本。这通过惰性加载文件系统、多层云缓存以及 checkpoint‑restore 技术(如 CRIU)实现,避免数分钟的 JIT 编译和 CUDA graph 捕获时间。

Performance Optimization Techniques

优化应遵循层级结构:先从高影响的算法改动入手,再到主机端工程,最后是低层内核工作。

Speculative Decoding

投机解码旨在缓解 decode 阶段的内存带宽瓶颈。一个小的“草稿”模型预测接下来的若干 token,随后更大的目标模型在一次前向传播中验证这些预测。此技术可实现 2×‑8× 的加速,尤其在使用特定应用的草稿模型时效果显著。

Quantization

降低精度(例如从 FP8 降至 FP4)在内存受限和计算受限场景下均能提供线性加速,因为它减少了传输的字节数并提升了每秒运算次数。然而,这需要通过“vibe check”与正式评估来谨慎验证,因为量化可能在长序列上因误差累积而导致性能下降。

Host-Side Optimization

在编写自定义 CUDA 内核之前,工程师应使用 py-spy 等工具定位 Python 层的瓶颈。简单的改动,如在字典中缓存指针而不是每次重新创建张量,能够带来显著收益(例如在多模态推理中提升约 10%),且无需修改 GPU 端代码。

Observability and Debugging

可观测性被定义为仅凭日志即可调试系统的能力。关键实践包括:

  • Logging Token IDs: 仅记录字符串不足以调试细微的 tokenizer 与聊天模板错误,必须记录 token ID。
  • Monitoring Power Draw: GPU 功耗和温度是“免费”指标,可指示主机端瓶颈(例如 GPU 实际功耗为 2 kW 而非 3 kW,说明 CPU 未能充分供给工作负载)。
  • Evaluating Tails: P95 与 P99 延迟至关重要,因为它们代表用户的“卡顿”体验,即使中位数(P50)延迟很低。

SUMMARY:

Modal 的 Charles Frye 讨论了在大规模服务 transformer 模型时的工程挑战,重点在于 prefill 与 decode 阶段的关键区别以及硬件利用率的优化。

TITLE:

Stanford CS25: Serving Transformers - Lessons from the Trenches

Sources