lllyasviel/ControlNet · error · ValueError
'order' must be '1' or '2' or '3'.
Error message
'order' must be '1' or '2' or '3'.
What it means
The combined singlestep solver (DPM-Solver-fast) internally assigns per-step orders and only supports overall order 1, 2, or 3. Passing any other order (0, 4, 4.0 float, string) raises this ValueError in get_orders_and_timesteps_for_singlestep_solver.
Source
Thrown at ldm/models/diffusion/dpm_solver/dpm_solver.py:454
K = steps // 3 + 1
if steps % 3 == 0:
orders = [3, ] * (K - 2) + [2, 1]
elif steps % 3 == 1:
orders = [3, ] * (K - 1) + [1]
else:
orders = [3, ] * (K - 1) + [2]
elif order == 2:
if steps % 2 == 0:
K = steps // 2
orders = [2, ] * K
else:
K = steps // 2 + 1
orders = [2, ] * (K - 1) + [1]
elif order == 1:
K = 1
orders = [1, ] * steps
else:
raise ValueError("'order' must be '1' or '2' or '3'.")
if skip_type == 'logSNR':
# To reproduce the results in DPM-Solver paper
timesteps_outer = self.get_time_steps(skip_type, t_T, t_0, K, device)
else:
timesteps_outer = self.get_time_steps(skip_type, t_T, t_0, steps, device)[
torch.cumsum(torch.tensor([0, ] + orders)).to(device)]
return timesteps_outer, orders
def denoise_to_zero_fn(self, x, s):
"""
Denoise at the final step, which is equivalent to solve the ODE from lambda_s to infty by first-order discretization.
"""
return self.data_prediction_fn(x, s)
def dpm_solver_first_update(self, x, s, t, model_s=None, return_intermediate=False):
"""
DPM-Solver-1 (equivalent to DDIM) from time `s` to time `t`.
Args:View on GitHub (pinned to ed85cd1e25)
Solutions
- Clamp order to 1, 2, or 3 before calling sample
- Use order=3 with method='singlestep' for DPM-Solver-3 behavior
- Upgrade to DPM-Solver++ if higher-order multistep is required
Example fix
# before dpm.sample(img, steps=20, t_start=..., order=4, ...) # after dpm.sample(img, steps=20, t_start=..., order=3, ...)
Defensive patterns
Strategy: validation
Validate before calling
assert order in (1, 2, 3), f'order must be 1-3, got {order}' Type guard
def is_valid_order(o) -> bool:
return isinstance(o, int) and o in (1, 2, 3) Prevention
- Clamp UI/API order inputs to 1-3
- Use int(order) before calling the solver
When it happens
Trigger: Calling sample(..., order=4), order=0, or order as a float/string; UI sliders that allow order values outside 1-3.
Common situations: Exposing solver order in a demo without clamping; copying DPM-Solver++ settings expecting order-4 support (which this version lacks).
Related errors
- Solver order must be 1 or 2 or 3, got {}
- 'solver_type' must be either 'dpm_solver' or 'taylor', got {
- Unsupported noise schedule {}. The schedule needs to be 'dis
- Unsupported skip_type {}, need to be 'logSNR' or 'time_unifo
- resize_method {self.__resize_method} not implemented
AI-assisted analysis of lllyasviel/ControlNet@ed85cd1e25 (2026-08-27).
Data as JSON: /api/errors/8344a1b1e0b25797.
Report an issue: GitHub.