readable long-term, such as UNet blocks and Attention processors.  Schedulers Schedulers are responsible to guide the denoising process for inference as well as to define a noise schedule for training. They are designed as individual classes with loadable configuration files and strongly follow the single-file policy. The following design principles are followed: All schedulers are found in src/diffusers/schedulers. Schedulers are not allowed to import from large utils files and shall be kept very self-contained. One scheduler Python file corresponds to one scheduler algorithm (as might be defined in a paper). If schedulers share similar functionalities, we can make use of the #Copied from mechanism. Schedulers all inherit from SchedulerMixin and ConfigMixin. Schedulers can be easily swapped out with the ConfigMixin.from_config method as explained in detail here. Every scheduler has to have a set_num_inference_steps, and a step function. set_num_inference_steps(...) has to be called before every denoising process, i.e. before step(...) is called. Every scheduler exposes the timesteps to be “looped over” via a timesteps attribute, which is an array of timesteps the model will be called upon. The step(...) function takes a predicted model output and the “current” sample (x_t) and returns the “previous”, slightly more denoised sample (x_t-1). Given the complexity of diffusion schedulers, the step function does not expose all the complexity and can be a bit of a “black box”. In almost all cases, novel schedulers shall be implemented in a new scheduling file.