🏗️ 基础设施 · 架构深度

Netflix 详述内部 LLM 服务平台:Triton 与 vLLM 如何分担推理与调度

流媒体巨头首次系统披露将大模型推理纳入内部生产平台的工程经验:Triton 负责模型加载与 GPU 调度,vLLM 执行推理,两者版本必须绑定测试——通用服务接口并未消除底层工程的复杂性。

综合公开信息整理 2025-07 全文约 4 分钟读完
#Netflix #Triton #vLLM #LLM推理 #MSS
2 引擎 Triton(调度)+ vLLM(执行)分工协作
2 路径 CPU 进程内运行 / GPU 远程委托
2 策略 Red-Black 与 Versioned 部署隔离变更

⚡ 30 秒速览

  • 架构核心:复用现有 JVM 服务层做路由与日志,小模型走 CPU 进程内,大模型委托 MSS 由 Triton 统一加载调度。
  • 引擎分工:Triton 管「服务环境」(模型加载、批处理、GPU 调度),vLLM 管「推理执行」并提供自定义扩展点。
  • 版本陷阱:Triton 与 vLLM 版本不匹配会导致部署加载失败,必须成对测试并固定兼容版本
  • 约束解码难题:vLLM 为管理 GPU 资源会暂停请求,恢复后 token 历史可能不同步,Netflix 增加了状态检测与重建逻辑
  • 打包选择:vLLM backend 让模型与前端比 Python backend 更独立地演进——耦合更松,迭代更快。
  • 诚实结论:通用接口给了应用团队稳定集成面,但打包、兼容性、解码、部署隔离的底层工程一样也不能少

01架构全景 从 JVM 服务层到 GPU 推理路径

Netflix 没有另起炉灶,而是将 LLM 推理嵌入已有的 JVM 服务层。路由、特征获取、候选生成、后处理和日志记录——这些外围生产工作流保持不变。变化的只是推理执行的位置。

小模型留在本地,大模型走向远端。

应用层 JVM 服务层:路由 · 特征获取 · 候选生成 · 后处理 · 日志记录 —— 全程不变
CPU 路径 较小模型在 CPU 进程内直接运行,无需跨网络调用
GPU 路径 委托至 MSS(模型服务系统)→ Triton 负责模型加载、批处理、GPU 调度、多框架服务 → vLLM 执行推理

阅读说明:箭头表示请求流向。CPU 与 GPU 为并行路径,由 JVM 服务层根据模型规模自动路由。即便推理在本地与远程硬件之间切换,外围生产工作流始终保持一致。

02Triton vs vLLM 调度与执行的分工边界

在 GPU 路径中,Netflix 选择了 vLLM 以满足运营适配性与可扩展性,但并未让 vLLM 接管一切。Triton 仍然负责模型周边的服务环境,vLLM 专注执行推理并提供扩展点。

Triton 的职责

模型加载 · 批处理调度 · GPU 资源管理 · 多框架服务封装

vLLM 的职责

推理执行 · 自定义架构扩展点 · 解码行为控制 · Hugging Face 兼容层

这种分工的代价是版本耦合。Netflix 报告称,不匹配的 Triton 与 vLLM 版本可能导致部署完全无法加载模型——因此两引擎版本必须成对测试并固定发布

一个引擎升级,另一个可能就要跟着动。

自定义模型带来了额外的集成挑战。vLLM 对 Hugging Face 的兼容性对部分 Netflix 内部模型尚有不足,公司不得不使用 vLLM 的扩展点为自定义架构与解码行为提供支持。

版本绑定测试 扩展点自定义 HuggingFace 兼容缺口 多框架封装 GPU 资源调度

03打包方式 Python backend vs vLLM backend

Netflix 比较了两种 Triton 打包方式,结论很明确:vLLM backend 让模型与前端更独立地演进。这一选择影响的是模型与服务环境的耦合强度,而非决定由哪个引擎执行推理。

Python backend

模型与前端耦合较紧,升级一处可能牵动另一处,迭代节奏受限。

vLLM backend

模型与前端独立演进,各自升级互不阻塞,适合快速迭代场景。

但通用服务接口并未消除底层引擎之间的差异。Triton 同时暴露了兼容 OpenAI 的 API 以及 KServe 的 HTTP 和 gRPC 前端,Netflix 仍在这些集成中遇到了功能处理上的差异

04最难啃的骨头 约束解码的状态同步问题

约束解码允许 Netflix 在每一步过滤模型可生成的 token,强制输出符合合法 JSON 等格式。问题在于:这些规则依赖于已生成的所有内容,解码器必须在整个请求过程中维护状态。

问题:vLLM 暂停后状态失步核心痛点

  • vLLM 为管理 GPU 资源会暂停请求,后续恢复时,约束解码状态可能与 token 历史不同步
  • 若不处理,模型可能在恢复后生成不符合格式约束的 token,导致输出非法 JSON。
Netflix 的解法:增加检测逻辑——在继续生成前比对状态,发现变化则重建约束状态,确保格式一致性不被资源调度打断。

部署隔离:Red-Black 与 Versioned运维策略

  • Versioned 部署:旧版与新版修订并行可用,消费者在适配不兼容的输入输出 schema 后逐步迁移。
  • Red-Black 部署:用于在模型级别处理变更,新旧版本切换之间保证服务连续性。
  • Triton 与 vLLM 版本一起固定,防止后端加载失败。

05不止 Netflix Uber 的应用边界做法

Uber 在应用边界处描述了相关做法。其生成式 AI 网关在外部托管与内部管理的模型之间提供兼容 OpenAI 的接口,同时集中处理认证、缓存、可观测性与路由。

实现路径不同,抽象理念一致。

应用团队稳定集成面模型提供商服务运行时独立演进

Netflix 与 Uber 的共同思路是:将应用集成与后端的模型、运行时和托管环境进行分离。应用团队获得稳定的接口,模型提供商和运行时可以继续演进——但抽象并未消除底层工作。

编辑核心判断

通用接口给了应用团队「稳定的幻觉」,但打包、兼容性、约束解码与部署隔离的工程债,不会因为多加一层抽象而消失。

Netflix 的经验证明:大模型服务化的真正瓶颈不在模型能力,而在系统工程——版本耦合、状态同步、部署隔离,每一层都需要扎实的工程实现。那些指望「接上 API 就能用」的团队,迟早会在约束解码和版本升级时撞上同一堵墙。

延伸阅读

Netflix 技术博客已公开完整架构文章,涵盖 CPU/GPU 路径、Triton 打包对比与约束解码实现细节。

Netflix TechBlog → 搜索「LLM Serving」