vLLM、TileRTと連携し遅延重視型推論を最適化
vLLM は TileRT 技術との連携により、遅延が重要なサービス向けに特別設計された推論機能を提供し始め、リアルタイム性が求められる AI サービスの性能向上を可能にした。
キーポイント
TileRT と vLLM の連携開始
vLLM が TileRT 技術と連携し、遅延が重要なサービス向けに特別設計された推論機能を提供する体制を整えた。
リアルタイム性への最適化
この連携により、従来の汎用推論よりも低遅延を実現し、リアルタイム性が強く求められる AI サービスの性能向上が期待される。
インフラストラクチャの進化
特定のユースケース(遅延敏感型)に特化したハードウェア・ソフトウェア連携の重要性を示す事例として、業界標準の推論基盤をさらに強化する動きである。
重要な引用
vLLM は TileRT 技術と連携し、遅延が重要なサービス向けに特別に設計された推論機能を提供するようになった
これにより、リアルタイム性が求められる AI サービスの性能向上が期待される
影響分析・編集コメントを表示
影響分析
この連携は、LLM の導入において最も課題となりやすい「応答遅延」の問題を解決する具体的な手段を示しており、チャットボットやリアルタイム分析など、時間制約の厳しいアプリケーションの実用性を高める契機となります。特に TileRT という専用技術との組み合わせは、汎用 GPU だけでなく、特定用途に最適化されたハードウェア活用が推論パフォーマンスを劇的に改善できる可能性を示唆しています。
編集コメント
推論速度のボトルネック解消は、AI サービスの実用化における最大の課題の一つであり、専用技術との連携による解決策は非常に注目すべき進展です。特に「遅延が重要」という明確な要件定義に基づいた最適化は、開発者がシステム設計を行う際の重要な指針となるでしょう。
大規模言語モデルのスケール展開において、計算集約型のプリーフィルフェーズとメモリ帯域幅制約型のデコードフェーズを分離する「非統合型(Disaggregated)サービング」は、もはや標準的なパターンとなっています。vLLM はこのアーキテクチャを、ファーストクラスのコネクタインターフェースを通じてサポートしています。
このアーキテクチャの転換には、見落としがちな大きなメリットがあります。プリーフィルとデコードが分離されれば、デコード側はプラグイン可能になるのです。異なるサービング環境では、それぞれに最適なエンジン設計が求められます。プリーフィルプール、スケジューラ、キャッシュ層、そしてサービング API はその場所を維持したまま、デコードプールのみを意図的に選択して差し替えることが可能になります。
本日、私たちはまさにそのような選択肢を発表します。vLLM プリーフィルと TileRT デコードの組み合わせです。これは vLLM V1 のパブリックコネクタインターフェースを通じて統合され、TileRT 0.1.5 とともに提供されます。レイテンシがクリティカルなワークロードにおいて、この組み合わせはユーザーごとのネイティブなデコード速度を実現する TileRT の真価を発揮します。一方、デプロイの他の部分はすべて標準的な vLLM のままです。
なぜ第 2 のデコードオプションが必要なのか
vLLM のネイティブデコードは、依然として最適なデフォルトです。これは、広範なモデルとハードウェアにわたる高スループットバッチ処理のために設計されているからです。
しかし、アジェンティック・ループや対話型コーディングアシスタント、リアルタイム音声など、集計スループットではなく「個々のユーザーにトークンが到達するまでの速度」が重要となるワークロードのクラスが増えています。これらのワークロードはレイテンシに制約されており、まさにその領域のためにゼロから設計されたデコードエンジンが必要です。ネイティブデコードと TileRT は、同じスループット・レイテンシのフロンティア上の異なる点を指向しており、そのため両者は補完し合います。
TileRT はそのようなエンジンです。ハードウェアの限界までユーザーごとのデコード速度を押し上げるという単一の目標を中心に構築された、新しい推論ランタイムです。私たちは以前、なぜ「速度が新たなスケーリング次元になりつつある」のかについて述べてきました。
しかし、この記事で取り上げているのはエンジンそのものではありません。より実用的な問い、つまり OpenAI 互換 API やスケジューリング、プレフィックスキャッシング、ツール呼び出し、そして vLLM の運用成熟度など、あなたが依存しているエコシステムを手放すことなく、専門的なデコードエンジンを採用できるかどうかについてです。
この統合は、そのトレードオフを可能な限り小さくするために設計されています:
- プリフィル処理は vLLM が担当します。スケジューリング、チャンク化されたプリフィル、プレフィックスキャッシングもそのまま維持されます。
- サービングのインターフェースも vLLM です。同じ API、同じリクエスト形式、そして同じツールチェーンが利用可能です。
- デコード処理の変更は必要最小限に絞り、対象となるトラフィックのみを対象とします。TileRT と連携するスタックは、既存の vLLM 環境の横で並行して動作し、各ワークロードが適切なエンドポイントを選択します。
アーキテクチャ:設計段階での共存
中核となる設計原則は「vLLM への一切の変更を加えない」ことです。フォークもパッチ適用も、内部ワーカーをラップすることもありません。統合機能は vLLM V1 の公開拡張インターフェースの背後に完全に実装されています。具体的には KVConnectorBase_V1 の実装であり、これは MultiConnector として構成され、標準的な kv_connector_module_path メカニズムを通じてロードされます。
このアプローチが重要なのは、単なるエンジニアリング上の美しさのためだけではありません。TileRT デコードプールを追加しても、すでに稼働中の vLLM 環境を不安定化させることはなく、vLLM をアップグレードする際にも、フォークの移植作業が必要になることはありません。
image設計による共存:遅延がクリティカルなトラフィックは TileRT PD ルーターによってマークされ、TileRT コネクターによって引き受けられます。一方、一般的なトラフィックはネイティブの分離パスを流れます。これらはすべて、MultiConnector として構成された単一の標準 vLLM プリフェルプールによって処理されます。
ルーティング。 TileRT プールの前面には軽量なルーターが配置されています。各リクエストに対して max_tokens=1 が設定され(vLLM がプリフェルを実行し、最初のトークンを生成)、ターゲットとなるデコードノードは標準のパススルーフィールドに付与されます。具体的には kv_transfer_params = {"tilert_host": ..., "tilert_ctrl_port": ...} のように指定します。ネイティブプール向けのトラフィックは、変更を加えず通常の分離プロキシを経由して流れます。
Claim filtering. TileRT コネクタは、特定のマークを付与されたリクエストのみを対象とし、それ以外は厳格に何もしない(no-op)動作を行います。このため、2 つのデコードプールは 1 つのプレフィルインスタンス(単一のフォワードバッチでも可)を共有できます。一部のトラフィックで TileRT を採用しても、残りの処理には一切影響しません。
A pure producer. このコネクタは KV プロデューサーとしてのみ機能し、スケジューリングやサンプリングには一切関与しません。プレフィル完了後に状態情報を抽出して転送するだけです。それ以外の点では、プレフィルインスタンスは標準的な vLLM サーバーと変わりません。
How the handoff works
クロスエンジン間のディスアグリゲーションを実用的なものとするためには、3 つの条件が満たされている必要があります。まず転送速度が速いこと、次にプレフィルノードの処理を遅延させないこと、そしてデコードエンジンがプレフィルが中断した位置から正確に引き継ぐことです。
Data plane. プレフィル完了後、リクエストのアテンション状態(圧縮された KV、スパースアテンションインデックスキャッシュ、および少量のメタデータ)は、RDMA のワンサイド書き込みによってプレ登録済みの GPU バッファへ転送されます。転送エンジンには Mooncake または NIXL が使用され、中間シリアライズやホストメモリを経由するステージングは一切行われません。ハンドオフプロトコル自体は基盤となる転送エンジンに依存せず、その役割は単にバイト列を移動させることに限定されています。
プリフェッチと完全に重畳。状態抽出はフォワードウィンドウ内で行われます。リクエストの状態はキャッシュブロックが再利用される前にステージングバッファにコピーされ、バックグラウンドの送信者が実際のネットワーク転送を実行します。TileRT 宛てのリクエストは、次のプリフェッチ反復をブロックしません。同じバッチを共有するネイティブプール要求であっても同様です。
稼働中のエンジンへの注入。到着した状態は TileRT のネイティブレイアウトに変換され、実行中のエンジンに直接注入されます。デコーディングは即座に開始され、最初のステップからマルチトークン推論デコーディングが有効になります。
評価
image8× NVIDIA B200 環境における GLM-5.1-F8 のトークン生成速度(TileRT v0.1.5)。出力長は 1K、入力長は 1K〜192K。棒グラフは、MTP なし、平均受容長が 3.2 の MTP あり、ベストケースの MTP 受容長が 4.0 の場合のピークを比較しています。
デコードプールの選択
ユーザーごとのトークン速度がボトルネックとなる場合は、TileRT デコードへルーティングしてください。具体的には対話型エージェント、リアルタイムアシスタント、遅延時間 SLO を満たす推論などが該当します。また、モデルが TileRT がサポートするものである必要があります。
最大のスループット、高並度バッチ処理、および汎用デコードがカバーする多数のモデルや機能への対応を優先する場合は、ネイティブ vLLM デコードのまま維持してください。
両方のスタックは同じ OpenAI 互換インターフェースを提供するため、ワークロードを切り替える際はルーティングの変更だけで済み、クライアント側の変更は不要です。
現在の制限事項
今回のリリースでは、TileRT のデコードノードは一度に 1 つの進行中のリクエストのみを処理します。ルーターがゲート付きディスパッチとバックプレッシャーを提供しています。モデル対応状況は GLM-5/5.1 と DeepSeek-V3.2 で、今後さらに追加予定です。
はじめに
TileRT 0.1.5 は PyPI(pip install tilert;Python 3.12、CUDA 13 のホイール対応)および TileRT リポジトリ で利用可能です。プリフェルとデコードの両ノードにインストールしてください。プリフェル側ではコネクタープラグインのために TileRT が必要です。
0. 初回設定:Hugging Face チェックポイントを TileRT の重み形式に変換
python -m tilert.models.preprocess.weight_converter \
--model_type glm-5 \
--model_dir /path/to/GLM-5.1 \
--save_dir /path/to/tilert-glm5.1-weights
1. TileRT デコードノードの起動
python -m tilert.pd_vllm.decode_server \
--engine tilert --model glm5 \
--model-weights-dir /path/to/tilert-glm5.1-weights \
--with-mtp --max-seq-len 202752 \
--kv-cache-dtype fp8 \
--ctrl-port 5556 --http-port 5557
2. vLLM プレフィル(標準版 vLLM;コネクタはプラグインとして読み込まれる)
MTP の推測設定が必要です。プレフィル段階で生成されたドラフト層の KV キャッシュを、デコード側の推論が引き継ぎます。
vllm serve /path/to/GLM-5.1 \
--served-model-name glm5.1 \
--port 8000 \
--tensor-parallel-size 8 \
--enforce-eager \
--trust-remote-code \
--return-tokens-as-token-ids \
--gpu-memory-utilization 0.8 \
--kv-cache-dtype fp8_ds_mla \
--speculative-config '{"method": "mtp", "num_speculative_tokens": 1}' \
--kv-transfer-config '{
"kv_connector": "TileRTConnector",
"kv_connector_module_path": "tilert.pd_vllm.prefill_connector",
"kv_role": "kv_producer",
"kv_connector_extra_config":{
"tilert_host":"[TILERT_DECODE_SERVER_IP]",
"tilert_ctrl_port":5556,
"tilert_model":"glm5",
"tilert_max_seq_len":202752
}
}'
3. ルーター:TileRT プールへの OpenAI 互換入り口
python -m tilert.pd_vllm.pd_router \
--vllm-url http://prefill-node:8000 \
--decode decode-node:5556:5557 \
--model-path /path/to/GLM-5.1 \
--port 23333
TileRT プールとネイティブ vLLM デコードプールを、1 つの共有プリフェッチインスタンスの下で実行するには、両方のコネクタを MultiConnector として構成します。検証済みの設定では、NIXL をエンドツーエンドで使用しています(ネイティブプールには vLLM の標準 NixlConnector、TileRT プールには NIXL モードの TileRT コネクタを使用)。これにより、共有プリフェッチは単一の転送ライブラリのみを利用し、変更が必要なのはプリフェッチ側の --kv-transfer-config 設定だけです。
Looking ahead
我々は、 disaggregation(分離)が推論スタックの本質を静かに変えつつあると考えています。それはもはや単一のエンジンではなく、共有のサービング層の背後に複数の専門化されたエンジンが組み合わさったものへと進化しています。vLLM のコネクタインターフェースこそが、この構成を今日可能にする鍵であり、今回の統合はその具体的な事例です。また、これが TileRT のようなエンジンがこれほどまでに深い特化を実現できる理由でもあります。サービング層を共有し、インターフェースを開放することで、ある 1 つの側面への深掘りが、他のすべての部分を再構築することを意味しなくなるからです。
コミュニティからのフィードバックをお待ちしています。統合の仕組みや、このアプローチが特に効果を発揮するワークロード、そして次に対応すべきモデルなどについてのご意見をください。
Acknowledgements
ゼロ変更での統合を可能にした V1 コネクタインターフェースを設計した vLLM コミュニティ、RDMA 転送エンジンを提供した Mooncake および NIXL プロジェクトに感謝します。また、vLLM と TileRT の統合改善に向けた協力体制を構築してくれた Inferact Inc. [https://inferact.ai/] にも謝意を表します。
原文を表示
Disaggregated serving, which separates the compute-bound prefill phase from the memory-bandwidth-bound decode phase, has become an increasingly standard pattern for serving large language models at scale, and vLLM supports it through a first-class connector interface.
That architectural shift carries a benefit that is easy to overlook: once prefill and decode are separated, the decode side becomes pluggable. Different serving regimes reward different engine designs. The prefill pool, the scheduler, the caching layer, and the serving API stay exactly where they are, while the decode pool becomes a deliberate choice.
Today, we are introducing exactly such a choice: vLLM prefill paired with TileRT decode, integrated through vLLM V1's public connector interface and shipping with TileRT 0.1.5. For latency-critical workloads, this pairing delivers TileRT's native per-user decode speed, while everything else about the deployment remains stock vLLM.
Why a second decode option?
vLLM's native decode is, and remains, the right default: it is built for high-throughput batched serving across a huge range of models and hardware. But there is a growing class of workloads, e.g., agentic loops, interactive coding assistants, real-time voice, where the metric that matters is not aggregate throughput but how fast tokens reach each individual user. These workloads are latency-bound, and they call for a decode engine designed from the ground up for exactly that regime. Native decode and TileRT target different points on the same throughput–latency frontier, which is why they compose.
TileRT is such an engine: a new inference runtime built around the single goal of pushing per-user decode speed toward the limits of the hardware. We have written elsewhere about why we believe speed is becoming its own scaling dimension.
This post is not about the engine, though. It is about a more practical question: can you adopt a specialized decode engine without giving up the ecosystem you depend on, e.g., OpenAI-compatible APIs, scheduling, prefix caching, tool calling, and the operational maturity of vLLM?
This integration is designed to make that trade-off as small as possible:
- Prefill is vLLM. Scheduling, chunked prefill, prefix caching — untouched.
- The serving surface is vLLM. Same APIs, same request format, same tooling.
- Only decode changes, and only for the traffic you send there. The TileRT-paired stack runs alongside your existing vLLM deployment; each workload picks its endpoint.
Architecture: coexistence by design
The core design principle is zero changes to vLLM: no fork, no patches, no wrapped internal workers. The integration lives entirely behind vLLM V1's public extensibility surface: a KVConnectorBase_V1 implementation, composed under MultiConnector and loaded through the standard kv_connector_module_path mechanism. This matters beyond engineering aesthetics: adding a TileRT decode pool cannot destabilize a vLLM deployment you already run, and upgrading vLLM does not mean re-porting a fork.

Routing. A lightweight router fronts the TileRT pool. For each request it sets max_tokens=1 (vLLM performs the prefill and emits the first token) and attaches the target decode node in the standard pass-through field: kv_transfer_params = {"tilert_host": ..., "tilert_ctrl_port": ...}. Traffic for the native pool flows through the usual disaggregation proxy, unmodified.
Claim filtering. The TileRT connector claims only requests carrying the mark and is a strict no-op for everything else, so the two decode pools can share one prefill instance (even a single forward batch): adopting TileRT for some traffic changes nothing for the rest.
A pure producer. The connector acts as a kv_producer only, it never touches scheduling or sampling; it extracts and ships state after prefill. In every other respect the prefill instance is a stock vLLM server.
How the handoff works
For cross-engine disaggregation to be practical, three things have to be true: the transfer must be fast, it must not slow the prefill node down, and the decode engine must pick up exactly where prefill left off.
Data plane. After prefill, the request's attention state (compressed KV, the sparse-attention index caches, and a small amount of metadata) moves to the decode node as RDMA one-sided writes into pre-registered GPU buffers, with either Mooncake or NIXL as the transfer engine. No intermediate serialization, no staging through host memory. The handoff protocol itself is independent of the underlying transfer engine, whose job is only to move bytes.
Fully overlapped with prefill. State extraction happens inside the forward window: the request's state is copied to a staging buffer before its cache blocks can be recycled, and a background sender performs the actual network transfer. A request bound for TileRT never blocks the next prefill iteration, including for native-pool requests sharing the same batch.
Injection into a live engine. On arrival, the state is converted to TileRT's native layout and injected directly into a running engine; decoding begins immediately, with multi-token speculative decoding active from the first step.
Evaluation

Choosing your decode pool
Route to TileRT decode when per-user token speed is the binding constraint, e.g., interactive agents, real-time assistants, latency-SLO inference, and the model is one TileRT supports.
Stay on native vLLM decode for maximum aggregate throughput, high-concurrency batching, and the long tail of models and features that general-purpose decode covers.
Both stacks expose the same OpenAI-compatible surface, so moving a workload between them is a routing change, not a client change.
Current limitations. In this release a TileRT decode node serves one in-flight request at a time, with the router providing gated dispatch and back-pressure. Model coverage in this release is GLM-5/5.1 and DeepSeek-V3.2, with more to come.
Getting started
TileRT 0.1.5 is available on PyPI (pip install tilert; Python 3.12, CUDA 13 wheels) and the TileRT repository. Install it on both the prefill and decode nodes; the prefill side needs it for the connector plugin.
To run the TileRT pool and a native vLLM decode pool behind one shared prefill instance, compose both connectors under MultiConnector. The configuration we validated runs NIXL end to end (vLLM's standard NixlConnector for the native pool, the TileRT connector in NIXL mode for the TileRT pool), so the shared prefill uses a single transfer library; only the prefill's --kv-transfer-config changes.
Looking ahead
We think disaggregation is quietly changing what an inference stack is: less a single engine, and more a composition of specialized engines behind a shared serving layer. vLLM's connector interface is what makes that composition possible today, and this integration is one concrete example. It is also why an engine like TileRT can afford to specialize this deeply: with the serving layer shared and the interfaces open, going deep on one dimension no longer means rebuilding everything else.
We would love feedback from the community: on the integration surface, on the workloads where this helps, and on which models to support next.
Acknowledgements
We thank the vLLM community for designing the V1 connector interface that made a zero-modification integration possible, and the Mooncake and NIXL projects for the RDMA transfer engines. We also appreciate Inferact Inc. for the collaboration to improve vLLM-TileRT integration.
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み