Benchmark Planner Decisions with DynoSim
Run the Dynamo Planner inside an offline DynoSim prediction to compare aggregated and disaggregated topologies, service-level objective (SLO) targets, and worker startup delays without a live cluster.
The production Planner scales Kubernetes or Global Planner deployments; it does not autoscale a
local deployment. aisimulate predict --stack dynamo runs locally but evaluates Planner decisions
for the deployment described by its YAML input.
For the general workflow, see Run a DynoSim Simulation. For Planner field types and defaults, see the Planner Configuration reference. For the simulation adapter, see DynoSim Architecture.
Planner Defaults
To enable Planner with its production defaults, add:
The adapter resolves concrete settings through Dynamo’s PlannerConfig. With the default
target: throughput, Planner enables load scaling and disables throughput-based scaling, just
as it does in a live deployment. To use throughput-based scaling, set target: sla and supply
both evaluation.sla.ttft_ms and evaluation.sla.itl_ms, as in the example below.
Omitted adjustment intervals use Planner defaults. An explicit null is also accepted for a
scaling mode that is disabled after target normalization; an active mode requires a concrete
interval. The resolved configuration always contains numeric intervals. The load interval still
controls performance-model updates during throughput-only scaling, so a null load interval uses
the production default rather than disabling those updates. The load interval must be shorter
than the throughput interval only when both scaling modes are enabled.
Prerequisites
Build the Rust runtime bindings and install Dynamo from the repository root:
Use a release build because repeated simulation runs are CPU-bound.
Run the aggregated baseline
Download the FAST’25 tool-agent trace:
Save this configuration as planner-aggregated.yaml:
Run the prediction:
The command prints the summary and writes Planner decisions and metrics to
planner-reports/aggregated/prediction.json.
Run the disaggregated comparison
Copy the baseline, then replace its engine mapping with separate prefill and decode roles:
Also replace the planner mapping with role-specific minimums:
Save the result as planner-disaggregated.yaml, then run it:
Compare request metrics, scaling events, and cumulative GPU time between the two
prediction.json files.