| import torch | |
| from tqdm import trange | |
| import comfy.model_patcher | |
| from comfy.k_diffusion.sampling import BrownianTreeNoiseSampler, default_noise_sampler, get_ancestral_step, to_d | |
| CFGPP_SAMPLER_NAMES_KD_ETA: list = [ | |
| "dpmpp_2m_sde_cfg_pp", | |
| "dpmpp_2m_sde_gpu_cfg_pp", | |
| "dpmpp_3m_sde_cfg_pp", | |
| "dpmpp_3m_sde_gpu_cfg_pp", | |
| "dpmpp_2s_ancestral_cfg_pp", | |
| ] | |
| CFGPP_SAMPLER_NAMES_KD: list = [ | |
| *CFGPP_SAMPLER_NAMES_KD_ETA, | |
| ] | |
| def sample_dpmpp_2m_sde_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None, solver_type='midpoint'): | |
| """DPM-Solver++(2M) SDE.""" | |
| if len(sigmas) <= 1: | |
| return x | |
| if solver_type not in {'heun', 'midpoint'}: | |
| raise ValueError('solver_type must be \'heun\' or \'midpoint\'') | |
| seed = extra_args.get("seed", None) | |
| sigma_min, sigma_max = sigmas[sigmas > 0].min(), sigmas.max() | |
| noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max, seed=seed, cpu=True) if noise_sampler is None else noise_sampler | |
| extra_args = {} if extra_args is None else extra_args | |
| s_in = x.new_ones([x.shape[0]]) | |
| sigma_fn = lambda t: t.neg().exp() | |
| t_fn = lambda sigma: sigma.log().neg() | |
| old_denoised = None | |
| uncond_denoised = None | |
| h_last = None | |
| def post_cfg_function(args): | |
| nonlocal uncond_denoised | |
| uncond_denoised = args["uncond_denoised"] | |
| return args["denoised"] | |
| model_options = extra_args.get("model_options", {}).copy() | |
| extra_args["model_options"] = comfy.model_patcher.set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=True) | |
| for i in trange(len(sigmas) - 1, disable=disable): | |
| denoised = model(x, sigmas[i] * s_in, **extra_args) | |
| if callback is not None: | |
| callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) | |
| if sigmas[i + 1] == 0: | |
| # Denoising step | |
| x = denoised | |
| else: | |
| t, s = t_fn(sigmas[i]), t_fn(sigmas[i + 1]) | |
| h = s - t | |
| eta_h = eta * h | |
| b = (-h - eta_h).expm1().neg() | |
| x = sigmas[i + 1] / sigmas[i] * sigma_fn(eta_h) * x + b * uncond_denoised | |
| if old_denoised is not None: | |
| r = h_last / h | |
| x = x + b * (denoised - old_denoised) / (2 * r) | |
| if eta: | |
| x = x + noise_sampler(sigmas[i], sigmas[i + 1]) * sigmas[i + 1] * (-2 * eta_h).expm1().neg().sqrt() * s_noise | |
| h_last = h | |
| old_denoised = uncond_denoised | |
| return x | |
| def sample_dpmpp_3m_sde_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): | |
| """DPM-Solver++(3M) SDE.""" | |
| if len(sigmas) <= 1: | |
| return x | |
| seed = extra_args.get("seed", None) | |
| sigma_min, sigma_max = sigmas[sigmas > 0].min(), sigmas.max() | |
| noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max, seed=seed, cpu=True) if noise_sampler is None else noise_sampler | |
| extra_args = {} if extra_args is None else extra_args | |
| s_in = x.new_ones([x.shape[0]]) | |
| denoised_1, denoised_2 = None, None | |
| uncond_denoised = None | |
| h, h_1, h_2 = None, None, None | |
| def post_cfg_function(args): | |
| nonlocal uncond_denoised | |
| uncond_denoised = args["uncond_denoised"] | |
| return args["denoised"] | |
| model_options = extra_args.get("model_options", {}).copy() | |
| extra_args["model_options"] = comfy.model_patcher.set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=True) | |
| for i in trange(len(sigmas) - 1, disable=disable): | |
| denoised = model(x, sigmas[i] * s_in, **extra_args) | |
| if callback is not None: | |
| callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) | |
| if sigmas[i + 1] == 0: | |
| # Denoising step | |
| x = denoised | |
| else: | |
| t, s = -sigmas[i].log(), -sigmas[i + 1].log() | |
| h = s - t | |
| h_eta = h * (eta + 1) | |
| x = torch.exp(-h_eta) * (x + (denoised - uncond_denoised)) + (-h_eta).expm1().neg() * denoised | |
| if h_2 is not None: | |
| r0 = h_1 / h | |
| r1 = h_2 / h | |
| d1_0 = (denoised - denoised_1) / r0 | |
| d1_1 = (denoised_1 - denoised_2) / r1 | |
| d1 = d1_0 + (d1_0 - d1_1) * r0 / (r0 + r1) | |
| d2 = (d1_0 - d1_1) / (r0 + r1) | |
| phi_2 = h_eta.neg().expm1() / h_eta + 1 | |
| phi_3 = phi_2 / h_eta - 0.5 | |
| x = x + phi_2 * d1 - phi_3 * d2 | |
| elif h_1 is not None: | |
| r = h_1 / h | |
| d = (denoised - denoised_1) / r | |
| phi_2 = h_eta.neg().expm1() / h_eta + 1 | |
| x = x + phi_2 * d | |
| if eta: | |
| x = x + noise_sampler(sigmas[i], sigmas[i + 1]) * sigmas[i + 1] * (-2 * h * eta).expm1().neg().sqrt() * s_noise | |
| denoised_1, denoised_2 = denoised, denoised_1 | |
| h_1, h_2 = h, h_1 | |
| return x | |
| def sample_dpmpp_3m_sde_gpu_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): | |
| if len(sigmas) <= 1: | |
| return x | |
| sigma_min, sigma_max = sigmas[sigmas > 0].min(), sigmas.max() | |
| noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max, seed=extra_args.get("seed", None), cpu=False) if noise_sampler is None else noise_sampler | |
| return sample_dpmpp_3m_sde_cfg_pp(model, x, sigmas, extra_args=extra_args, callback=callback, disable=disable, eta=eta, s_noise=s_noise, noise_sampler=noise_sampler) | |
| def sample_dpmpp_2m_sde_gpu_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None, solver_type='midpoint'): | |
| if len(sigmas) <= 1: | |
| return x | |
| sigma_min, sigma_max = sigmas[sigmas > 0].min(), sigmas.max() | |
| noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max, seed=extra_args.get("seed", None), cpu=False) if noise_sampler is None else noise_sampler | |
| return sample_dpmpp_2m_sde_cfg_pp(model, x, sigmas, extra_args=extra_args, callback=callback, disable=disable, eta=eta, s_noise=s_noise, noise_sampler=noise_sampler, solver_type=solver_type) | |
| def sample_dpmpp_2s_ancestral_cfg_pp(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None): | |
| """Ancestral sampling with DPM-Solver++(2S) second-order steps.""" | |
| extra_args = {} if extra_args is None else extra_args | |
| noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler | |
| s_in = x.new_ones([x.shape[0]]) | |
| sigma_fn = lambda t: t.neg().exp() | |
| t_fn = lambda sigma: sigma.log().neg() | |
| uncond_denoised = None | |
| def post_cfg_function(args): | |
| nonlocal uncond_denoised | |
| uncond_denoised = args["uncond_denoised"] | |
| return args["denoised"] | |
| model_options = extra_args.get("model_options", {}).copy() | |
| extra_args["model_options"] = comfy.model_patcher.set_model_options_post_cfg_function(model_options, post_cfg_function, disable_cfg1_optimization=True) | |
| for i in trange(len(sigmas) - 1, disable=disable): | |
| denoised = model(x, sigmas[i] * s_in, **extra_args) | |
| sigma_down, sigma_up = get_ancestral_step(sigmas[i], sigmas[i + 1], eta=eta) | |
| if callback is not None: | |
| callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised}) | |
| if sigma_down == 0: | |
| # Euler method | |
| d = to_d(x, sigmas[i], uncond_denoised) | |
| x = denoised + d * sigma_down | |
| else: | |
| # DPM-Solver++(2S) | |
| t, t_next = t_fn(sigmas[i]), t_fn(sigma_down) | |
| r = 1 / 2 | |
| h = t_next - t | |
| s = t + r * h | |
| x_2 = (sigma_fn(s) / sigma_fn(t)) * (x + (denoised - uncond_denoised)) - (-h * r).expm1() * denoised | |
| denoised_2 = model(x_2, sigma_fn(s) * s_in, **extra_args) | |
| x = (sigma_fn(t_next) / sigma_fn(t)) * (x + (denoised - uncond_denoised)) - (-h).expm1() * denoised_2 | |
| # Noise addition | |
| if sigmas[i + 1] > 0: | |
| x = x + noise_sampler(sigmas[i], sigmas[i + 1]) * s_noise * sigma_up | |
| return x | |
Xet Storage Details
- Size:
- 8.58 kB
- Xet hash:
- 9b8b96e3a27c4ceb53409b82d96a31a92048a90b0f49156310d081b94e3b6e75
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.