Planner decides how many engines to run. Grove decides what one engine instance is and where it lands.
Capacity is ready before the demand arrives.
Estimated per engine from forward‑pass metrics.
Short dips don't remove forecast capacity.
Result is written to the DGD replica count.
Engines: prefill TP2 (2 GPUs), decode TP4 (4 GPUs). Curves are illustrative; real ones come from self‑benchmark, AI Configurator or profiling.
Shown for prefill/TTFT. Decode uses scheduled + queued KV tokens → ITL (÷ accept length). ±1 per tick; no scale‑up while replicas are starting; never below the throughput floor.
replicas = complete instances · nodeCount = pods per instance · each instance = one PodGang
Example service: 2 prefill + 1 decode instances, each instance = a leader pod + a worker pod.
Whole instance or nothing
Never prefill without decode
Roles start in declared order
Set via topologyConstraint
Capacity count stays honest
Prefill + decode roll together
Try Burst: the load loop steps +1 before the floor rises. Budget 40 → clamping. Budget 80 + peak 70 + TP16 → the extra decode PodGang stays Pending, never half‑placed. 1 tick = 5 s; throughput loop every 60 s here. Numbers are illustrative.
Otherwise ticks just hold. Multinode gangs are slowest.
Bimodal ISL? Split into pools under GlobalPlanner.
HPA on Frontend + Planner on workers. Never both on decode.
Zero workers = model leaves /v1/models, no signal to return.
Planner caps the ask; KAI decides what fits. Misfits stay Pending.
KAI ≥ v0.17.0 · Grove ≥ v0.1.0‑alpha.13 when installed externally.
Interactive slides are teaching models: documented control logic, made‑up capacities and latency curves.