Simthesizer: An Agent-Driven Simulation Framework for LLM Serving Systems
Organizations: KAIST Daejeon, Republic of Korea
Abstract
System-level simulation is an essential tool for exploring the rapidly expanding design space of LLM serving systems, where real deployments remain costly and often infeasible. However, modern LLM serving now evolves faster than human-driven simulator development can track, and emerging workloads and mechanisms, from agentic workflows to disaggregated serving, no longer fit the monolithic simulation pipeline that existing simulators assume. Each new mechanism therefore demands an invasive rewrite, leaving a widening development gap between deployed serving systems and the simulators that model them. To close this gap, we present Simthesizer, a framework that realizes agent-driven simulator development. Simthesizer introduces a composable simulator infrastructure that uniformly expresses the complete serving workflow, including the control decisions that coordinate it, and realizes it as a unified dynamic graph in Simthesizer simulator. Synthesizer agent, a harnessed coding agent, then lowers natural-language feature requests onto this abstraction under simulator-specific guardrails and fidelity validation, evolving one shared simulator instead of building a new one for every feature. Under the same coding agent and harnesses, extensions built on Simthesizer follow a vLLM-based real system with 2.51% average throughput error, versus 6.03% for extensions built on existing simulators. On identical workloads, Simthesizer also simulates up to 284.96x and 23.19x faster than two state-of-the-art simulators, LLMServingSim2.0 and Vidur, respectively.
Figures & tables
| Interface | Description |
|---|---|
| add_logical_node (operation, state) -> node add_logical_node_at (operation, state, at) -> node | Insert a logical node carrying a policy operation and its state. The _at variant seeds an explicit start time, e.g., for request arrival. |
| add_compute_node (layer, batch) -> node | Insert a compute node tagged with a semantic layer descriptor and the scheduled batch state. |
| add_network_node (src, dst, bytes) -> node | Insert a point-to-point transfer between two network devices. Its timing model resolves latency, including multi-hop routing when configured. |
| add_edge (parent, child) | Declare a precedence constraint. A child becomes runnable only after all of its predecessors complete. |
| pop_edges (node) -> list[node] | Detach the current node’s outgoing edges so the caller can splice a new subgraph before the original successor. |
| Behavior | Implementation map |
|---|---|
| Target model verification | Route through the existing request representation to the model runner and compute simulator. |
| Committed request state | Assign to scheduler-managed request and KV state, exposing only the committed prefix to the existing cache interface. |
| Speculation round execution | Reuse the common DAG scheduling and execution path without adding a mechanism-specific event loop. |