Spaces:
Paused
Paused
| # Consistent with Kohya to reduce differences between model training and inference. | |
| import torch | |
| import math | |
| import einops | |
| import numpy as np | |
| import ldm_patched.ldm.modules.diffusionmodules.openaimodel | |
| import ldm_patched.modules.model_sampling | |
| import ldm_patched.modules.sd1_clip | |
| from ldm_patched.ldm.modules.diffusionmodules.util import make_beta_schedule | |
| def patched_timestep_embedding(timesteps, dim, max_period=10000, repeat_only=False): | |
| # Consistent with Kohya to reduce differences between model training and inference. | |
| if not repeat_only: | |
| half = dim // 2 | |
| freqs = torch.exp( | |
| -math.log(max_period) * torch.arange(start=0, end=half, dtype=torch.float32) / half | |
| ).to(device=timesteps.device) | |
| args = timesteps[:, None].float() * freqs[None] | |
| embedding = torch.cat([torch.cos(args), torch.sin(args)], dim=-1) | |
| if dim % 2: | |
| embedding = torch.cat([embedding, torch.zeros_like(embedding[:, :1])], dim=-1) | |
| else: | |
| embedding = einops.repeat(timesteps, 'b -> b d', d=dim) | |
| return embedding | |
| def patched_register_schedule(self, given_betas=None, beta_schedule="linear", timesteps=1000, | |
| linear_start=1e-4, linear_end=2e-2, cosine_s=8e-3): | |
| # Consistent with Kohya to reduce differences between model training and inference. | |
| if given_betas is not None: | |
| betas = given_betas | |
| else: | |
| betas = make_beta_schedule( | |
| beta_schedule, | |
| timesteps, | |
| linear_start=linear_start, | |
| linear_end=linear_end, | |
| cosine_s=cosine_s) | |
| alphas = 1. - betas | |
| alphas_cumprod = np.cumprod(alphas, axis=0) | |
| timesteps, = betas.shape | |
| self.num_timesteps = int(timesteps) | |
| self.linear_start = linear_start | |
| self.linear_end = linear_end | |
| sigmas = torch.tensor(((1 - alphas_cumprod) / alphas_cumprod) ** 0.5, dtype=torch.float32) | |
| self.set_sigmas(sigmas) | |
| return | |
| def patch_all_precision(): | |
| ldm_patched.ldm.modules.diffusionmodules.openaimodel.timestep_embedding = patched_timestep_embedding | |
| ldm_patched.modules.model_sampling.ModelSamplingDiscrete._register_schedule = patched_register_schedule | |
| return | |