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

  1. Clamp order to 1, 2, or 3 before calling sample
  2. Use order=3 with method='singlestep' for DPM-Solver-3 behavior
  3. 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

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


AI-assisted analysis of lllyasviel/ControlNet@ed85cd1e25 (2026-08-27). Data as JSON: /api/errors/8344a1b1e0b25797. Report an issue: GitHub.