From fed8977472e7c946d7707b4f68f34e097e370c6f Mon Sep 17 00:00:00 2001 From: Strawberries Date: Wed, 13 Dec 2023 00:19:20 +0000 Subject: [PATCH 1/3] Add use_karras_sigmas to the EulerDiscreteScheduler Init() As it is, you have to call set_timesteps to initialize the correct karras sigmas noise, which isn't done during training and so can cause incorrectly set noise. --- src/diffusers/schedulers/scheduling_euler_discrete.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/diffusers/schedulers/scheduling_euler_discrete.py b/src/diffusers/schedulers/scheduling_euler_discrete.py index 802ba0f099f9..8c46305de567 100644 --- a/src/diffusers/schedulers/scheduling_euler_discrete.py +++ b/src/diffusers/schedulers/scheduling_euler_discrete.py @@ -219,9 +219,15 @@ def __init__( sigmas = np.array(((1 - self.alphas_cumprod) / self.alphas_cumprod) ** 0.5) timesteps = np.linspace(0, num_train_timesteps - 1, num_train_timesteps, dtype=float)[::-1].copy() - sigmas = torch.from_numpy(sigmas[::-1].copy()).to(dtype=torch.float32) + sigmas = sigmas[::-1].copy() timesteps = torch.from_numpy(timesteps).to(dtype=torch.float32) + if self.use_karras_sigmas: + log_sigmas = np.log(sigmas) + sigmas = self._convert_to_karras(in_sigmas=sigmas, num_inference_steps=num_train_timesteps) + timesteps = [self._sigma_to_t(sigma, log_sigmas) for sigma in sigmas] + + sigmas = torch.from_numpy(sigmas).to(dtype=torch.float32) # setable values self.num_inference_steps = None From e71854f1a160f228070e2fa2b0eadddb56cfd919 Mon Sep 17 00:00:00 2001 From: Strawberries Date: Wed, 13 Dec 2023 00:35:03 +0000 Subject: [PATCH 2/3] quick formatting fix --- src/diffusers/schedulers/scheduling_euler_discrete.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/diffusers/schedulers/scheduling_euler_discrete.py b/src/diffusers/schedulers/scheduling_euler_discrete.py index 8c46305de567..1cd175503575 100644 --- a/src/diffusers/schedulers/scheduling_euler_discrete.py +++ b/src/diffusers/schedulers/scheduling_euler_discrete.py @@ -226,8 +226,8 @@ def __init__( log_sigmas = np.log(sigmas) sigmas = self._convert_to_karras(in_sigmas=sigmas, num_inference_steps=num_train_timesteps) timesteps = [self._sigma_to_t(sigma, log_sigmas) for sigma in sigmas] - - sigmas = torch.from_numpy(sigmas).to(dtype=torch.float32) + + sigmas = torch.from_numpy(sigmas).to(dtype=torch.float32) # setable values self.num_inference_steps = None From 4828dab8119e86a6485b463c9d07ae23aa5d5660 Mon Sep 17 00:00:00 2001 From: Strawberries Date: Wed, 13 Dec 2023 11:50:08 +0000 Subject: [PATCH 3/3] fix karras compatability with non_sdv c_noise --- src/diffusers/schedulers/scheduling_euler_discrete.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/diffusers/schedulers/scheduling_euler_discrete.py b/src/diffusers/schedulers/scheduling_euler_discrete.py index 1cd175503575..8da3434fc347 100644 --- a/src/diffusers/schedulers/scheduling_euler_discrete.py +++ b/src/diffusers/schedulers/scheduling_euler_discrete.py @@ -220,14 +220,14 @@ def __init__( timesteps = np.linspace(0, num_train_timesteps - 1, num_train_timesteps, dtype=float)[::-1].copy() sigmas = sigmas[::-1].copy() - timesteps = torch.from_numpy(timesteps).to(dtype=torch.float32) if self.use_karras_sigmas: log_sigmas = np.log(sigmas) sigmas = self._convert_to_karras(in_sigmas=sigmas, num_inference_steps=num_train_timesteps) - timesteps = [self._sigma_to_t(sigma, log_sigmas) for sigma in sigmas] + timesteps = np.array([self._sigma_to_t(sigma, log_sigmas) for sigma in sigmas]) sigmas = torch.from_numpy(sigmas).to(dtype=torch.float32) + # setable values self.num_inference_steps = None @@ -235,7 +235,7 @@ def __init__( if timestep_type == "continuous" and prediction_type == "v_prediction": self.timesteps = torch.Tensor([0.25 * sigma.log() for sigma in sigmas]) else: - self.timesteps = timesteps + self.timesteps = torch.from_numpy(timesteps.astype(np.float32)) self.sigmas = torch.cat([sigmas, torch.zeros(1, device=sigmas.device)])