Commit 1d11e896 authored by AUTOMATIC's avatar AUTOMATIC
Browse files

rework Negative Guidance minimum sigma to work with AND, add infotext and...

rework Negative Guidance minimum sigma to work with AND, add infotext and copypaste parameters support
parent 3591eefe
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -111,7 +111,8 @@ titles = {
    "Resize height to": "Resizes image to this height. If 0, height is inferred from either of two nearby sliders.",
    "Multiplier for extra networks": "When adding extra network such as Hypernetwork or Lora to prompt, use this multiplier for it.",
    "Discard weights with matching name": "Regular expression; if weights's name matches it, the weights is not written to the resulting checkpoint. Use ^model_ema to discard EMA weights.",
    "Extra networks tab order": "Comma-separated list of tab names; tabs listed here will appear in the extra networks UI first and in order lsited."
    "Extra networks tab order": "Comma-separated list of tab names; tabs listed here will appear in the extra networks UI first and in order lsited.",
    "Negative Guidance minimum sigma": "Skip negative prompt for steps where image is already mostly denoised; the higher this value, the more skips there will be; provides increased performance in exchange for minor quality reduction."
}


+1 −0
Original line number Diff line number Diff line
@@ -309,6 +309,7 @@ infotext_to_setting_name_mapping = [
    ('UniPC order', 'uni_pc_order'),
    ('UniPC lower order final', 'uni_pc_lower_order_final'),
    ('RNG', 'randn_source'),
    ('NGMS', 's_min_uncond'),
]


+2 −1
Original line number Diff line number Diff line
@@ -480,7 +480,8 @@ def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments=None, iter
        "Clip skip": None if clip_skip <= 1 else clip_skip,
        "ENSD": None if opts.eta_noise_seed_delta == 0 else opts.eta_noise_seed_delta,
        "Init image hash": getattr(p, 'init_img_hash', None),
        "RNG": (opts.randn_source if opts.randn_source != "GPU" else None)
        "RNG": opts.randn_source if opts.randn_source != "GPU" else None,
        "NGMS": None if p.s_min_uncond == 0 else p.s_min_uncond,
    }

    generation_params.update(p.extra_generation_params)
+25 −18
Original line number Diff line number Diff line
@@ -115,20 +115,21 @@ class CFGDenoiser(torch.nn.Module):
        sigma_in = denoiser_params.sigma
        tensor = denoiser_params.text_cond
        uncond = denoiser_params.text_uncond
        skip_uncond = False

        if self.step % 2 and s_min_uncond > 0 and not is_edit_model:
        # alternating uncond allows for higher thresholds without the quality loss normally expected from raising it
            sigma_threshold = s_min_uncond
            if(torch.dot(sigma,sigma) < sigma.shape[0] * (sigma_threshold*sigma_threshold) ):
                uncond = torch.zeros([0,0,uncond.shape[2]])
                x_in=x_in[:x_in.shape[0]//2]
                sigma_in=sigma_in[:sigma_in.shape[0]//2]
        if self.step % 2 and s_min_uncond > 0 and sigma[0] < s_min_uncond and not is_edit_model:
            skip_uncond = True
            x_in = x_in[:-batch_size]
            sigma_in = sigma_in[:-batch_size]

        if tensor.shape[1] == uncond.shape[1]:
            if not is_edit_model:
                cond_in = torch.cat([tensor, uncond])
            else:
        if tensor.shape[1] == uncond.shape[1] or skip_uncond:
            if is_edit_model:
                cond_in = torch.cat([tensor, uncond, uncond])
            elif skip_uncond:
                cond_in = tensor
            else:
                cond_in = torch.cat([tensor, uncond])

            if shared.batch_cond_uncond:
                x_out = self.inner_model(x_in, sigma_in, cond=make_condition_dict([cond_in], image_cond_in))
@@ -152,9 +153,15 @@ class CFGDenoiser(torch.nn.Module):

                x_out[a:b] = self.inner_model(x_in[a:b], sigma_in[a:b], cond=make_condition_dict(c_crossattn, image_cond_in[a:b]))

            if uncond.shape[0]:
            if not skip_uncond:
                x_out[-uncond.shape[0]:] = self.inner_model(x_in[-uncond.shape[0]:], sigma_in[-uncond.shape[0]:], cond=make_condition_dict([uncond], image_cond_in[-uncond.shape[0]:]))

        if skip_uncond:
            #x_out = torch.cat([x_out, x_out[0:batch_size]])  # we skipped uncond denoising, so we put cond-denoised image to where the uncond-denoised image should be
            denoised_image_indexes = [x[0][0] for x in conds_list]
            fake_uncond = torch.cat([x_out[i:i+1] for i in denoised_image_indexes])
            x_out = torch.cat([x_out, fake_uncond])

        denoised_params = CFGDenoisedParams(x_out, state.sampling_step, state.sampling_steps)
        cfg_denoised_callback(denoised_params)

@@ -165,13 +172,12 @@ class CFGDenoiser(torch.nn.Module):
        elif opts.live_preview_content == "Negative prompt":
            sd_samplers_common.store_latent(x_out[-uncond.shape[0]:])

        if not is_edit_model:
            if uncond.shape[0]:
                denoised = self.combine_denoised(x_out, conds_list, uncond, cond_scale)
            else:
                denoised = x_out
        else:
        if is_edit_model:
            denoised = self.combine_denoised_for_edit_model(x_out, cond_scale)
        elif skip_uncond:
            denoised = self.combine_denoised(x_out, conds_list, uncond, 1.0)
        else:
            denoised = self.combine_denoised(x_out, conds_list, uncond, cond_scale)

        if self.mask is not None:
            denoised = self.init_latent * self.mask + self.nmask * denoised
@@ -221,6 +227,7 @@ class KDiffusionSampler:
        self.eta = None
        self.config = None
        self.last_latent = None
        self.s_min_uncond = None

        self.conditioning_key = sd_model.model.conditioning_key