Skip to content

feat(tilert): add decode backend and native router - #29

Open
cquil11 wants to merge 2 commits into
feat/role-enginesfrom
feat/tilert-backend
Open

cquil11 wants to merge 2 commits into
feat/role-enginesfrom
feat/tilert-backend

Conversation

@cquil11

@cquil11 cquil11 commented Sep 23, 2026 •

Copy link
Copy Markdown

Adds the TileRT decode backend and native P/D router on top of #33.

The supported pairing is vLLM prefill + TileRT decode + TileRT router. TileRTRouterFrontend.validate enforces the engine pairing and topology during configuration loading, before Slurm submission. Other routers reject TileRT workers through their engine requirements; per-role engines with Dynamo are rejected in #33.

  • Explicit role engines and images; no top-level engine.
  • Allocated worker addresses and ports, with worker health checked before router startup.
  • B200/NIXL and MI355X/Mooncake recipes and launch-contract regression tests.

The vLLM image must contain TileRTConnector. Validation does not inspect installed connector versions or prove KV-layout compatibility. Supporting another prefill engine requires a compatible TileRT protocol integration and extending this frontend validation; the shared role dispatch remains engine-neutral.

Stack 2/2. Shared role orchestration is in #33.

Validation through the InferenceX ports:

  • B200 / NIXL — 1k1k and 8k1k passed, 16/16 requests each; 8k1k power validated across both nodes.
  • MI355X / Mooncake — full 3,600-second AgentX profile passed, 271 successful requests and zero errors; required prefill metrics validated.

Ports: shared integration #3551, MI355X #3552, B200 #3553.


Note

Medium Risk
Introduces a new mixed-engine launch path (vLLM + TileRT) with KV transport coupling that validation does not fully prove; benchmark metrics/env behavior changed for custom AIPerf jobs on logical workers.

Overview
Adds TileRT as a first-class decode engine and tilert-router as a static P/D frontend for disaggregated recipes where vLLM prefill hands off KV via TileRTConnector and TileRT decode runs tilert.pd_vllm.decode_server. srtctl owns HTTP/control ports and router wiring (--vllm-url, combined --decode specs); config validation enforces one prefill, ≥1 single-node decode workers, no multi-frontend nginx, and rejects incompatible engine/router pairings at load time.

Documentation, schema docs, and B200/NIXL and MI355X/Mooncake example recipes ship with the integration. Custom-benchmark AIPerf metrics discovery now asks the frontend for worker_metrics_port per process (TileRT exposes prefill only), while SRT_*_ENDPOINTS still lists all routable workers; vLLM-router multi-node DP metrics behavior is covered by a regression test.

Reviewed by Cursor Bugbot for commit b421420. Bugbot is set up for automated code reviews on this repo. Configure here.

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale Bugbot comment from a previous run.

Comment thread configs/tilert_setup.sh Outdated
@cquil11
cquil11 removed the request for review from ishandhanani September 23, 2026 23:14
@cquil11
cquil11 force-pushed the feat/tilert-backend branch 2 times, most recently from 4264d0e to fef33f3 Compare September 28, 2026 17:20
@cquil11 cquil11 changed the title feat(tilert): add TileRT backend and TileRT P/D router feat(tilert): add decode runtime with independent role engines Sep 28, 2026
@cquil11
cquil11 force-pushed the feat/tilert-backend branch 5 times, most recently from f30dce0 to 64b5f0b Compare September 28, 2026 18:00
@cquil11 cquil11 changed the title feat(tilert): add decode runtime with independent role engines feat(tilert): add decode backend and native router Sep 28, 2026
@cquil11
cquil11 changed the base branch from main to feat/role-engines September 28, 2026 18:01
@cquil11
cquil11 added this pull request to stack #34 September 28, 2026 18:01
@cquil11
cquil11 force-pushed the feat/tilert-backend branch 2 times, most recently from 41adb53 to 875042a Compare September 28, 2026 19:16

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit f2b1e91. Configure here.

"""Apply recipe setup in the router's separate container too."""
if not config.setup_script:
return None
return f"bash {shlex.quote(str(Path('/configs') / config.setup_script))}"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Router setup misses patches fallback

Medium Severity

build_bash_preamble runs only /configs/<setup_script> and treats a missing file as a hard router-start failure. Workers, Dynamo, and the vLLM router also try /configs/patches/<setup_script> and continue with a warning when the script is absent. A recipe whose setup lives in the patches mount, or exists only in worker images, will launch workers and then fail when tilert-router starts.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit f2b1e91. Configure here.

raise ValueError("tilert-router requires a TileRT decode engine")
resources = config.resources
if resources.num_agg or resources.num_prefill != 1 or resources.num_decode < 1:
raise ValueError("TileRT router requires exactly one prefill worker and at least one decode worker")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DP prefill evades router validation

Low Severity

validate only checks resources.num_prefill == 1, but build_router_command rejects any collected worker list that is not exactly one prefill HTTP URL. vLLM per_node data parallel exposes one API per node-local pool (http_port &gt; 0), so a single logical prefill worker on multiple nodes passes configuration loading and then fails when the router is built.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit f2b1e91. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant