---
layout: post.njk
source: https://yage.ai/share/vllm-tilert-specialized-inference-paths-20260717.html
speaker: yage.ai
title: |-
  vLLM x
  TileRT：两个目标相反的推理引擎，为什么开始共用一套服务
date: '2026-07-17'
summary: 文章探讨了 vLLM 和 TileRT 这两个目标相反的推理引擎如何通过解耦集成，实现分工协作。核心思想是推理服务正从“单引擎综合最优”转向“专用执行路径的特化与编排”，即保留各自擅长的优化（如高吞吐和低延迟），并通过控制面进行请求的分段和流转，以适应实时交互、长上下文等复杂需求。
area: tech-engineering
category: ai-application
tags:
  - inference-engine
  - vllm
  - tilert
  - model-decoding
  - execution-path
people: []
companies_orgs: []
products_models:
  - vLLM
  - TileRT
media_books: []
draft: true
status: evergreen
---

vLLM 和 TileRT
原本不像会走到一起的两个项目。

vLLM 擅长把多个请求放进同一批计算，尽量提高 GPU
利用率和整体吞吐。Tile-AI 团队开发的 TileRT 走的是另一条路：它专门优化
batch=1 的 decode，愿意少做一些并发，换取单个请求更低的逐 token
延迟。一个想让整套机器多干活，一个想让眼前这个请求更快。

2026 年 7 月 14 日，vLLM 官方博客公布了与 TileRT
的解耦推理集成，这项能力随 TileRT 0.1.5 一同发布。官方技术博客给出的办法是让两者分工：两套引擎不合并代码，而是通过公开连接器接进同一个系统。vLLM
先读取提示词、完成 prefill 并生成首 token，再把后续 decode 交给 TileRT
执行池。

我觉得这次集成最有意思的地方，不是 vLLM
又多了一个后端，而是两个目标相反的引擎开始共用一套服务。过去大家习惯比较哪一个引擎综合表现最好。现在，实时交互、长上下文和语音生成越走越远，同一个运行时越来越难照顾好所有请求。推理服务的竞争，正在从“单引擎综合最优”转向“专用执行路径的特化与编排”。

## 一个推理引擎为什么无法同时把所有指标做到最好

为什么一个引擎不能把两边都做好？问题要从模型生成一段回答的过程说起。

模型还没吐出第一个 token 时，GPU 要先读完整段输入，建立后续生成需要的
KV cache。这一步叫 prefill，通常更依赖计算能力，也直接影响首 token
延迟（TTFT）。第一个 token 出来以后，工作节奏就变了。模型进入
decode，一次只生成一个 token，每一步都要读取模型权重和已有 KV
cache。它的计算强度比 prefill
低，显存带宽往往更早成为限制；用户感受到的逐 token 速度通常用 TPOT
衡量。

麻烦就在这里。高并发服务通常用批处理（batching）把多个请求放在一起执行，这样总体吞吐更高，但请求可能需要等候，也会受到同批工作的影响。如果改用
batch=1，排队和同批干扰少了，TPOT
可以更低，代价则是总体吞吐和硬件利用率通常也会下降。

所以，同一批硬件和同一套调度策略，很难同时做到高批量利用率和低排队、低干扰。文本负载相对单一时，通用引擎还能在两者之间找一个折中点。实时交互、长上下文和语音生成进入同一服务后，这个折中点就不够用了。

推理引擎从单一综合优化转向多条专用执行路径

## vLLM 与 TileRT
选择了分段和分流

vLLM 与 TileRT
的答案是：既然很难折中，那就保留两个各自擅长的解，再通过控制面分段和分流。

vLLM 继续守在服务入口，负责 prefill、前缀缓存和调度。进入 decode
后，请求才开始分流：常规高并发请求留在原生 vLLM
实例池，标记为低延迟的请求则通过 vLLM V1 的公开连接器 MultiConnector
转给 TileRT。两个 decode pool 共用前面的 prefill 服务，整个接入不需要
fork 或 patch vLLM。

这里有个容易忽略的细节：请求必须先被标记，才会进入
TileRT。当前集成解决了两套引擎怎么共享
prefill、怎么交接生成状态，却没有替平台决定哪些请求应该走低延迟池。未标记的流量仍留在原生
pool。服务商还得结合产品等级、请求形态、排队时间和 TileRT
容量，自己制定分流策略。连接器打通了路，至于哪辆车该走哪条路，仍由上层系统决定。

这样一来，TileRT 只需要处理自己擅长的负载。我们在此前对
TileRT 的介绍文章中分析过，它针对 batch=1 场景，把细粒度算子、I/O
读写与卡间通信编排成连续执行流，尽量减少 kernel
之间的空档。目前这项集成已经支持 GLM-5/5.1 和 DeepSeek-V3.2 等模型。

速度的另一面是容量。在 TileRT 0.1.5 中，一个 8×B200 decode
节点同一时间只处理一个 in-flight
request。这个限制解释了它为何能集中优化单请求延迟，也提醒我们：不能拿常规并发服务的容量算法，直接套在这条路径上。

接口看起来统一，功能却还没有完全对齐。根据开源代码，路由脚本
pd_router.py 在首 token 之后，只向 TileRT 传递
temperature、top_p 和 top_k
三个采样参数。其他采样能力目前还没有经过这条交接路径证明语义一致。

跨节点发送数据的 RDMA 操作在后台异步进行，但源节点提取 KV cache
等状态数据仍然同步执行。在生产网络中，搬移状态的开销可能抵消一部分算子优化收益。这次发布给出的数据是
8×B200 上的 generation speed，还没有独立的 connector 端到端测试。vLLM
官方的 disaggregated
prefill
文档也明确说明，这类解耦部署不会自动提高整体吞吐，主要用途是分别配置两个阶段的资源，独立调节
TTFT、TPOT 和尾部延迟。

所以，现有数据能说明 TileRT decode
路径本身很快，却还不能直接回答生产系统每美元能服务多少请求。算这笔账时，prefill、状态提取、网络传输、排队和空闲节点都不能漏掉。只有高价值请求足以填充专用容量时，低延迟才可能同时成为合理的经济选择。

vLLM x TileRT
没有消除延迟与吞吐的冲突。它保留两条各自优化的路径，把选择移到了控制面的路由、容量规划和成本核算中。

## SGLang
Omni：同一个语音请求内部也需要多个引擎逻辑

如果专用路径只是把不同用户分开，事情还不算特别复杂。实时语音模型更进一步：同一个请求内部，就塞着几种节奏完全不同的计算。

一个语音回复通常要经过几个阶段：Thinker 生成低频的文本 token，Talker
生成高频的 codec token，最后由卷积网络 Vocoder
把编码还原成声音波形。Talker 每走一步，还要与多 token 预测模块 MTP
紧密反馈。它们串在同一个回复里，计算特征却并不相同。

Talker 和 MTP 的循环尤其麻烦。每一步计算都很轻，kernel
启动与卡间同步花掉的时间，反而可能超过算子本身。此时继续优化单个矩阵乘法，收益已经不大；真正该减少的是整条执行流里的空档。

如果把这些任务全塞进同一个调度器，某个阶段忙起来，其他阶段就只能跟着等。SGLang Omni
项目因此让 Thinker 和 Talker 使用独立 scheduler，同时把紧耦合的
Talker 与 MTP 留在同一个 forward 中，避免跨 stage 通信，最外层的
Coordinator 只管理 pipeline topology。

独立 scheduler 让每个阶段按自己的节奏组
batch、选择并行方式，不必等待整条语音流水线统一步调。阶段之间通过统一的
inbox、outbox 和 zero-copy shared memory
传递数据。这样既保留了多阶段模型的整体拓扑，也不用强迫所有阶段接受同一种执行策略。

这与 TileRT 指向同一个变化。正如 SGLang
Omni 分析文章所指出的，每步计算较轻时，系统更需要减少 kernel
启动和同步的空档。专用执行路径开始从请求之间深入到一个多模态模型内部。

## TensorRT-LLM：另一种特化是为稳定模型和
NVIDIA 硬件付出编译成本

TileRT 是按延迟目标做特化，TensorRT-LLM
则展示了另一种选择：模型和硬件既然已经确定，不妨接受更多构建成本，把优化做得更深。

如果模型架构已经稳定，部署环境也确定使用 NVIDIA
GPU，这笔交换就可能成立。团队付出模型构建、编译和调优成本，换取针对固定平台的优化。在
TensorRT-LLM 的解耦服务设计中，context，也就是
prefill，和 generation，也就是 decode，可以分配到不同 GPU
资源池，并采用不同的并行策略。

分池能减少两个阶段的资源争用，让团队分别调节 TTFT 和
TPOT。不过官方也指出，跨节点传输 KV cache
的开销不能忽略，收益取决于输入和输出的形态。长输入、中等输出的任务可能获得明显收益，短上下文交互则可能得不偿失。每个
context 或 generation 实例可以暴露 OpenAI-compatible server，再由外层
disaggregated server 通过 REST 接口协调。

这条路线的代价与 TileRT 不同。TileRT 把优化集中在 batch=1
decode，TensorRT-LLM 则让团队用更高的构建和平台绑定成本，换取稳定模型在
NVIDIA
硬件上的深度优化。它们都在放弃一部分通用性，只是选择了不同的边界。

## 下一轮竞争：让切换无感、正确、智能

路径多了以后，麻烦也跟着来了：平台怎么替每个请求选对那一条？

OpenAI-compatible API 可以统一客户端入口，却不保证后端功能一致。NVIDIA
Dynamo 功能矩阵显示，不同后端对请求取消、多模态、LoRA
动态加载、投机采样和 KV cache 管理的支持并不相同。

请求到达网关时，路由器得先检查采样参数、工具调用、中途取消等要求。目标后端只要不支持其中一项，请求就不能送过去。统一
API
解决的是“怎么调用”，能力校验解决的是“换个后端以后，意思会不会变”。

能力匹配之后还要接续状态。一个请求在 vLLM 完成 prefill，再切到 TileRT
或 TensorRT-LLM 运行 decode，目标节点必须拿到继续生成所需的 KV
cache、稀疏索引和 draft 状态。NIXL、Mooncake
等传输层可以负责搬运，但状态提取是否完整、传输需要多久，都会影响切换结果。

未来的推理网关不能只按连接数做负载均衡。它需要综合请求形态、后端队列长度、KV
cache
亲和性和各后端实际支持的能力，估算哪条路径能按时完成请求。特化通道发生故障时，它还要把请求安全地退回通用通道。

出了问题以后，团队还得知道该从哪里查。平台不能只记录请求去了哪个节点，还要留下选路原因、状态搬运耗时、能力降级和回退结果。否则，即使平均性能变好了，一次慢请求究竟卡在排队、传输、执行还是错误选路，仍然很难说清。

统一入口下，路由器根据请求形态、队列、缓存和能力选择推理路径

## 结语

以前聊推理引擎，最自然的问题是“哪个在 benchmark
上跑得最快”。接下来更常问的，可能会变成“这个请求此刻该走哪条执行路径”。

像 TileRT
这样特化的低延迟运行时是否会长期独立存在，目前还无法判断。vLLM、SGLang
或 TensorRT-LLM
也可能逐步吸收这些优化，自己覆盖更多执行路径。即便实现边界变化，工作负载已经分化这一前提不会消失。谁能覆盖更多专用路径，并让请求在这些路径之间正确、低成本地切换，谁就更接近下一代推理平台的核心位置。