|
|
|
|
|
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): |
|
|
|
|
|
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): |
|
|
|
|
|
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 |
|
|