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 Original line 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.",
    "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.",
    "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.",
    "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 Original line Diff line number Diff line
@@ -309,6 +309,7 @@ infotext_to_setting_name_mapping = [
    ('UniPC order', 'uni_pc_order'),
    ('UniPC order', 'uni_pc_order'),
    ('UniPC lower order final', 'uni_pc_lower_order_final'),
    ('UniPC lower order final', 'uni_pc_lower_order_final'),
    ('RNG', 'randn_source'),
    ('RNG', 'randn_source'),
    ('NGMS', 's_min_uncond'),
]
]




+2 −1
Original line number Original line 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,
        "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,
        "ENSD": None if opts.eta_noise_seed_delta == 0 else opts.eta_noise_seed_delta,
        "Init image hash": getattr(p, 'init_img_hash', None),
        "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)
    generation_params.update(p.extra_generation_params)
+25 −18
Original line number Original line Diff line number Diff line
@@ -115,20 +115,21 @@ class CFGDenoiser(torch.nn.Module):
        sigma_in = denoiser_params.sigma
        sigma_in = denoiser_params.sigma
        tensor = denoiser_params.text_cond
        tensor = denoiser_params.text_cond
        uncond = denoiser_params.text_uncond
        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
        # alternating uncond allows for higher thresholds without the quality loss normally expected from raising it
            sigma_threshold = s_min_uncond
        if self.step % 2 and s_min_uncond > 0 and sigma[0] < s_min_uncond and not is_edit_model:
            if(torch.dot(sigma,sigma) < sigma.shape[0] * (sigma_threshold*sigma_threshold) ):
            skip_uncond = True
                uncond = torch.zeros([0,0,uncond.shape[2]])
            x_in = x_in[:-batch_size]
                x_in=x_in[:x_in.shape[0]//2]
            sigma_in = sigma_in[:-batch_size]
                sigma_in=sigma_in[:sigma_in.shape[0]//2]


        if tensor.shape[1] == uncond.shape[1]:
        if tensor.shape[1] == uncond.shape[1] or skip_uncond:
            if not is_edit_model:
            if is_edit_model:
                cond_in = torch.cat([tensor, uncond])
            else:
                cond_in = torch.cat([tensor, uncond, uncond])
                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:
            if shared.batch_cond_uncond:
                x_out = self.inner_model(x_in, sigma_in, cond=make_condition_dict([cond_in], image_cond_in))
                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]))
                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]:]))
                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)
        denoised_params = CFGDenoisedParams(x_out, state.sampling_step, state.sampling_steps)
        cfg_denoised_callback(denoised_params)
        cfg_denoised_callback(denoised_params)


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


        if not is_edit_model:
        if is_edit_model:
            if uncond.shape[0]:
                denoised = self.combine_denoised(x_out, conds_list, uncond, cond_scale)
            else:
                denoised = x_out
        else:
            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:
            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:
        if self.mask is not None:
            denoised = self.init_latent * self.mask + self.nmask * denoised
            denoised = self.init_latent * self.mask + self.nmask * denoised
@@ -221,6 +227,7 @@ class KDiffusionSampler:
        self.eta = None
        self.eta = None
        self.config = None
        self.config = None
        self.last_latent = None
        self.last_latent = None
        self.s_min_uncond = None


        self.conditioning_key = sd_model.model.conditioning_key
        self.conditioning_key = sd_model.model.conditioning_key