vllm-project/vllm · error
connected engine range [{engine_start_index}, {engine_end_in
Error message
connected engine range [{engine_start_index}, {engine_end_index}) exceeds data parallel size {} What it means
Thrown by Config::validate() in Bootstrapped mode when engine_start_index + engine_count exceeds --data-parallel-size. The frontend would be asked to serve engines that do not exist in the data-parallel pool. Both range endpoints and the DP size appear in the message.
Source
Thrown at rust/src/server/src/config.rs:275
);
}
}
TransportMode::Bootstrapped {
engine_start_index,
engine_count,
..
} => {
if *engine_count == 0 {
bail!("engine count must be at least 1");
}
let engine_start_index = usize::try_from(*engine_start_index)
.map_err(|_| anyhow::anyhow!("engine start index does not fit usize"))?;
let engine_end_index =
engine_start_index.checked_add(*engine_count).ok_or_else(|| {
anyhow::anyhow!("engine start index + engine count overflows")
})?;
if engine_end_index > self.data_parallel_size {
bail!(
"connected engine range [{engine_start_index}, {engine_end_index}) exceeds data parallel size {}",
self.data_parallel_size
);
}
}
}
Ok(())
}
/// Return the number of engines implied by the configured transport mode.
pub fn engine_count(&self) -> usize {
match &self.transport_mode {
TransportMode::HandshakeOwner { engine_count, .. }
| TransportMode::Bootstrapped { engine_count, .. } => *engine_count,
}
}
View on GitHub (pinned to c794754062)
Solutions
- Make the assigned slice [start, start+count) fit inside [0, data_parallel_size).
- Recompute frontend assignments after changing --data-parallel-size.
- Cross-check the three numbers in the error message against what your supervisor actually started.
Example fix
# before --data-parallel-size 4 with engine_start_index=4, engine_count=4 # after --data-parallel-size 8 with engine_start_index=4, engine_count=4
Defensive patterns
Strategy: validation
Validate before calling
let end = start + count;
assert!(end <= data_parallel_size,
"slice [{start},{end}) must fit in {data_parallel_size} engines"); Type guard
fn engine_slice_within_pool(start: usize, count: usize, dp: usize) -> bool {
start.checked_add(count).map_or(false, |end| end <= dp)
} Prevention
- Regenerate all frontend assignments whenever DP size changes.
- Compute slices from the actual running engine count, not a planned one.
- Smoke-test the smallest and largest frontend assignment in CI.
When it happens
Trigger: e.g. --data-parallel-size 4 with a bootstrapped frontend assigned engines [4, 8): end index 8 > 4. Happens when the number of engines actually started is smaller than the slice assignment assumes.
Common situations: Scaling down the engine pool without regenerating frontend assignments; a scheduler counting frontends*engines_per_frontend instead of total engines; mismatch between the pool size the supervisor started and the one it advertised when assigning slices.
Related errors
- engine count must be at least 1
- managed frontend engine count ({engine_count}) must equal da
- engine start index does not fit usize
- engine start index + engine count overflows
- data parallel size must be at least 1
AI-assisted analysis of vllm-project/vllm@c794754062 (2026-08-14).
Data as JSON: /api/errors/856b8cb770670eba.
Report an issue: GitHub.