From 8562dbaaa8fa1e595cd3e83c05ff07c9b76393f4 Mon Sep 17 00:00:00 2001 From: Sergey Borisov Date: Wed, 30 Aug 2023 02:18:08 +0300 Subject: [PATCH] Hotfix to make second order schedulers work with mask --- .../backend/stable_diffusion/diffusers_pipeline.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/invokeai/backend/stable_diffusion/diffusers_pipeline.py b/invokeai/backend/stable_diffusion/diffusers_pipeline.py index 2d1894c896..d88313f455 100644 --- a/invokeai/backend/stable_diffusion/diffusers_pipeline.py +++ b/invokeai/backend/stable_diffusion/diffusers_pipeline.py @@ -558,12 +558,22 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): # compute the previous noisy sample x_t -> x_t-1 step_output = self.scheduler.step(noise_pred, timestep, latents, **conditioning_data.scheduler_args) + # TODO: issue to diffusers? + # undo internal counter increment done by scheduler.step, so timestep can be resolved as before call + # this needed to be able call scheduler.add_noise with current timestep + if self.scheduler.order == 2: + self.scheduler._index_counter[timestep.item()] -= 1 + # TODO: this additional_guidance extension point feels redundant with InvokeAIDiffusionComponent. # But the way things are now, scheduler runs _after_ that, so there was # no way to use it to apply an operation that happens after the last scheduler.step. for guidance in additional_guidance: step_output = guidance(step_output, timestep, conditioning_data) + # restore internal counter + if self.scheduler.order == 2: + self.scheduler._index_counter[timestep.item()] += 1 + return step_output def _unet_forward(