From 9bfddfe65d9c69bfca55595646adfcea8e00b3b0 Mon Sep 17 00:00:00 2001 From: YiYi Xu Date: Tue, 29 Apr 2025 18:43:46 -1000 Subject: [PATCH] Apply suggestions from code review --- src/diffusers/schedulers/scheduling_ddim.py | 8 ---- .../schedulers/scheduling_euler_discrete.py | 39 ------------------- 2 files changed, 47 deletions(-) diff --git a/src/diffusers/schedulers/scheduling_ddim.py b/src/diffusers/schedulers/scheduling_ddim.py index 2e74c9bbfc..5c3cc6ed7a 100644 --- a/src/diffusers/schedulers/scheduling_ddim.py +++ b/src/diffusers/schedulers/scheduling_ddim.py @@ -349,8 +349,6 @@ class DDIMScheduler(SchedulerMixin, ConfigMixin): generator=None, variance_noise: Optional[torch.Tensor] = None, return_dict: bool = True, - _model_output_uncond: Optional[torch.Tensor] = None, - _use_cfgpp: bool = True, ) -> Union[DDIMSchedulerOutput, Tuple]: """ Predict the sample from the previous timestep by reversing the SDE. This function propagates the diffusion @@ -388,11 +386,6 @@ class DDIMScheduler(SchedulerMixin, ConfigMixin): raise ValueError( "Number of inference steps is 'None', you need to run 'set_timesteps' after creating the scheduler" ) - - if _use_cfgpp and self.config.prediction_type != "epsilon": - raise ValueError( - f"CFG++ is only supported for prediction type `epsilon`, but got {self.config.prediction_type}." - ) # See formulas (12) and (16) of DDIM paper https://arxiv.org/pdf/2010.02502.pdf # Ideally, read DDIM paper in-detail understanding @@ -418,7 +411,6 @@ class DDIMScheduler(SchedulerMixin, ConfigMixin): # "predicted x_0" of formula (12) from https://arxiv.org/pdf/2010.02502.pdf if self.config.prediction_type == "epsilon": pred_original_sample = (sample - beta_prod_t ** (0.5) * model_output) / alpha_prod_t ** (0.5) - pred_epsilon = model_output if not _use_cfgpp else _model_output_uncond elif self.config.prediction_type == "sample": pred_original_sample = model_output pred_epsilon = (sample - alpha_prod_t ** (0.5) * pred_original_sample) / beta_prod_t ** (0.5) diff --git a/src/diffusers/schedulers/scheduling_euler_discrete.py b/src/diffusers/schedulers/scheduling_euler_discrete.py index 4c82ca7e38..f4a4701541 100644 --- a/src/diffusers/schedulers/scheduling_euler_discrete.py +++ b/src/diffusers/schedulers/scheduling_euler_discrete.py @@ -584,8 +584,6 @@ class EulerDiscreteScheduler(SchedulerMixin, ConfigMixin): s_noise: float = 1.0, generator: Optional[torch.Generator] = None, return_dict: bool = True, - _model_output_uncond: Optional[torch.Tensor] = None, - _use_cfgpp: bool = False, ) -> Union[EulerDiscreteSchedulerOutput, Tuple]: """ Predict the sample from the previous timestep by reversing the SDE. This function propagates the diffusion @@ -629,11 +627,6 @@ class EulerDiscreteScheduler(SchedulerMixin, ConfigMixin): "The `scale_model_input` function should be called before `step` to ensure correct denoising. " "See `StableDiffusionPipeline` for a usage example." ) - - if _use_cfgpp and self.config.prediction_type != "epsilon": - raise ValueError( - f"CFG++ is only supported for prediction type `epsilon`, but got {self.config.prediction_type}." - ) if self.step_index is None: self._init_step_index(timestep) @@ -675,38 +668,6 @@ class EulerDiscreteScheduler(SchedulerMixin, ConfigMixin): dt = self.sigmas[self.step_index + 1] - sigma_hat prev_sample = sample + derivative * dt - if _use_cfgpp: - prev_sample = prev_sample + (_model_output_uncond - model_output) * self.sigmas[self.step_index + 1] - - # denoised = sample - model_output * sigmas[i] - # d = (sample - denoised) / sigmas[i] - # new_sample = denoised + d * sigmas[i + 1] - - # new_sample = denoised + (sample - denoised) * sigmas[i + 1] / sigmas[i] - # new_sample = sample - model_output * sigmas[i] + model_output * sigmas[i + 1] - # new_sample = sample + model_output * (sigmas[i + 1] - sigmas[i]) - # new_sample = sample - model_output * sigmas[i] + model_output * sigmas[i + 1] --- (1) - - # CFG++ ===== - # denoised = sample - model_output * sigmas[i] - # uncond_denoised = sample - model_output_uncond * sigmas[i] - # d = (sample - uncond_denoised) / sigmas[i] - # new_sample = denoised + d * sigmas[i + 1] - - # new_sample = denoised + (sample - uncond_denoised) * sigmas[i + 1] / sigmas[i] - # new_sample = sample - model_output * sigmas[i] + model_output_uncond * sigmas[i + 1] --- (2) - - # To go from (1) to (2): - # new_sample_2 = new_sample_1 - model_output * sigmas[i + 1] + model_output_uncond * sigmas[i + 1] - # new_sample_2 = new_sample_1 + (model_output_uncond - model_output) * sigmas[i + 1] - # new_sample_2 = new_sample_1 + diff * sigmas[i + 1] - - # diff = model_output_uncond - model_output - # diff = model_output_uncond - (model_output_uncond + g * (model_output_cond - model_output_uncond)) - # diff = model_output_uncond - (g * model_output_cond + (1 - g) * model_output_uncond) - # diff = model_output_uncond - g * model_output_cond + (g - 1) * model_output_uncond - # diff = g * (model_output_uncond - model_output_cond) - # Cast sample back to model compatible dtype prev_sample = prev_sample.to(model_output.dtype)