|
@@ -58,6 +58,8 @@ class CFGDenoiser(torch.nn.Module):
|
|
self.model_wrap = None
|
|
self.model_wrap = None
|
|
self.p = None
|
|
self.p = None
|
|
|
|
|
|
|
|
+ self.last_noise_uncond = None
|
|
|
|
+
|
|
# NOTE: masking before denoising can cause the original latents to be oversmoothed
|
|
# NOTE: masking before denoising can cause the original latents to be oversmoothed
|
|
# as the original latents do not have noise
|
|
# as the original latents do not have noise
|
|
self.mask_before_denoising = False
|
|
self.mask_before_denoising = False
|
|
@@ -160,6 +162,8 @@ class CFGDenoiser(torch.nn.Module):
|
|
# so is_edit_model is set to False to support AND composition.
|
|
# so is_edit_model is set to False to support AND composition.
|
|
is_edit_model = shared.sd_model.cond_stage_key == "edit" and self.image_cfg_scale is not None and self.image_cfg_scale != 1.0
|
|
is_edit_model = shared.sd_model.cond_stage_key == "edit" and self.image_cfg_scale is not None and self.image_cfg_scale != 1.0
|
|
|
|
|
|
|
|
+ is_cfg_pp = 'CFG++' in self.sampler.config.name
|
|
|
|
+
|
|
conds_list, tensor = prompt_parser.reconstruct_multicond_batch(cond, self.step)
|
|
conds_list, tensor = prompt_parser.reconstruct_multicond_batch(cond, self.step)
|
|
uncond = prompt_parser.reconstruct_cond_batch(uncond, self.step)
|
|
uncond = prompt_parser.reconstruct_cond_batch(uncond, self.step)
|
|
|
|
|
|
@@ -273,10 +277,16 @@ class CFGDenoiser(torch.nn.Module):
|
|
denoised_params = CFGDenoisedParams(x_out, state.sampling_step, state.sampling_steps, self.inner_model)
|
|
denoised_params = CFGDenoisedParams(x_out, state.sampling_step, state.sampling_steps, self.inner_model)
|
|
cfg_denoised_callback(denoised_params)
|
|
cfg_denoised_callback(denoised_params)
|
|
|
|
|
|
|
|
+ if is_cfg_pp:
|
|
|
|
+ self.last_noise_uncond = x_out[-uncond.shape[0]:]
|
|
|
|
+ self.last_noise_uncond = torch.clone(self.last_noise_uncond)
|
|
|
|
+
|
|
if is_edit_model:
|
|
if is_edit_model:
|
|
denoised = self.combine_denoised_for_edit_model(x_out, cond_scale)
|
|
denoised = self.combine_denoised_for_edit_model(x_out, cond_scale)
|
|
elif skip_uncond:
|
|
elif skip_uncond:
|
|
denoised = self.combine_denoised(x_out, conds_list, uncond, 1.0)
|
|
denoised = self.combine_denoised(x_out, conds_list, uncond, 1.0)
|
|
|
|
+ elif is_cfg_pp:
|
|
|
|
+ denoised = self.combine_denoised(x_out, conds_list, uncond, cond_scale/12.5) # CFG++ scale of (0, 1) maps to (1.0, 12.5)
|
|
else:
|
|
else:
|
|
denoised = self.combine_denoised(x_out, conds_list, uncond, cond_scale)
|
|
denoised = self.combine_denoised(x_out, conds_list, uncond, cond_scale)
|
|
|
|
|