The Dynamo Planner is an autoscaling controller that adjusts prefill and decode engine replica counts at runtime to meet latency SLAs. It reads traffic signals (Prometheus metrics or load predictor output) and engine performance profiles to decide when to scale up or down.
For a quick overview, see the Planner overview. For architecture internals, see Planner Design.
The planner supports three optimization targets that determine how scaling decisions are made:
throughput (default): Uses static thresholds on queue depth and KV cache utilization. No SLA targets or profiling needed. Works out of the box.latency: Same approach as throughput but with more aggressive thresholds — scales up earlier and tolerates less queuing. Ideal for latency-sensitive workloads.sla: Uses regression-based performance models with specific TTFT/ITL targets. Supports both throughput-based (predictive) and load-based (reactive) scaling modes. For advanced users who need precise SLA control.When to use which:
throughput (the default) — it works immediately with no configuration.latency if your workload has strict latency requirements and you prefer to over-provision rather than queue.sla when you have pre-deployment profiling data and want to target specific TTFT/ITL values.The planner is configured via a PlannerConfig JSON/YAML object. When using the profiler, this is placed under the features.planner section of the DGDR spec:
For SLA-based scaling:
When optimization_target is throughput or latency, load-based scaling is automatically enabled and throughput-based scaling is disabled. The ttft/itl fields are ignored.
At least one scaling mode must be enabled when using optimization_target: sla.
When throughput-based scaling is enabled, the planner needs engine performance data. At startup, it first tries to fetch self-benchmark results from the get_perf_metrics Dynamo endpoint (see PR #7779). If unavailable, it falls back to profiler-generated data (npz or JSON) at profile_results_dir. Both sources are converted to ForwardPassMetrics and fed into the FPM regression model.
The same diagnostic signals surfaced in these reports are also exported as Prometheus metrics under the dynamo_planner_* prefix—for example estimated TTFT/ITL (dynamo_planner_estimated_ttft_ms, dynamo_planner_estimated_itl_ms), per-engine capacity and FPM queue depths, and load/throughput scaling decision enums.
When the profiler runs with planner enabled, it:
PlannerConfig and performance data into separate Kubernetes ConfigMapsThe planner receives its config via --config /path/to/planner_config.json which is mounted from the planner-config-XXXX ConfigMap. Profiling data is mounted from the planner-profile-data-XXXX ConfigMap.
See the Profiler Guide for the full profiling workflow and how to configure pre-deployment sweeping.
If you want one public endpoint for a model but multiple private DGDs optimized for different request classes, use a hierarchical deployment:
Frontend, GlobalRouter, and GlobalPlannerIn the current workflow, run profiling independently for each intended pool, then compose the final control DGD plus pool DGDs manually. See the Global Planner Guide.