diff --git a/nodes.py b/nodes.py index c98ce30..4c530cd 100644 --- a/nodes.py +++ b/nodes.py @@ -1,19 +1,34 @@ import math from copy import deepcopy - +from torch.nn import Upsample +from comfy.model_patcher import set_model_options_patch_replace +from comfy.ldm.modules.attention import attention_basic import comfy.samplers +import comfy.utils import numpy as np import torch import torch.nn.functional as F from colorama import Fore, Style +import json +import os original_sampling_function = None +current_dir = os.path.dirname(os.path.realpath(__file__)) +json_preset_path = os.path.join(current_dir, 'presets') def sampling_function_patched(model, x, timestep, uncond, cond, cond_scale, model_options={}, seed=None, **kwargs): + for fn in model_options.get("sampler_patch_model_pre_cfg_function", []): + args = {"model": model, "sigma": timestep, "model_options": model_options} + model, model_options = fn(args) + + cond_copy = deepcopy(cond) + uncond_copy = deepcopy(uncond) + if "sampler_pre_cfg_function" in model_options: uncond, cond, cond_scale = model_options["sampler_pre_cfg_function"]( sigma=timestep, uncond=uncond, cond=cond, cond_scale=cond_scale ) + if math.isclose(cond_scale, 1.0) and model_options.get("disable_cfg1_optimization", False) == False: uncond_ = None else: @@ -27,13 +42,13 @@ def sampling_function_patched(model, x, timestep, uncond, cond, cond_scale, mode if "sampler_cfg_function" in model_options: args = {"cond": x - cond_pred, "uncond": x - uncond_pred, "cond_scale": cond_scale, "timestep": timestep, "input": x, "sigma": timestep, - "cond_denoised": cond_pred, "uncond_denoised": uncond_pred, "model": model, "model_options": model_options, "cond_pos": cond, "cond_neg": uncond} + "cond_denoised": cond_pred, "uncond_denoised": uncond_pred, "model": model, "model_options": model_options, "cond_pos": cond_copy, "cond_neg": uncond_copy} cfg_result = x - model_options["sampler_cfg_function"](args) else: cfg_result = uncond_pred + (cond_pred - uncond_pred) * cond_scale for fn in model_options.get("sampler_post_cfg_function", []): - args = {"denoised": cfg_result, "cond": cond, "uncond": uncond, "model": model, "uncond_denoised": uncond_pred, "cond_denoised": cond_pred, + args = {"denoised": cfg_result, "cond": cond, "uncond": uncond_copy, "model": model, "uncond_denoised": uncond_pred, "cond_denoised": cond_pred, "sigma": timestep, "model_options": model_options, "input": x} cfg_result = fn(args) @@ -51,10 +66,12 @@ def monkey_patching_comfy_sampling_function(): comfy.samplers.sampling_function = sampling_function_patched comfy.samplers.sampling_function._automatic_cfg_decorated = True # flag to check monkey patch -def make_sampler_pre_cfg_function(minimum_sigma_to_disable_uncond=0, maximum_sigma_to_enable_uncond=1000000): +def make_sampler_pre_cfg_function(minimum_sigma_to_disable_uncond=0, maximum_sigma_to_enable_uncond=1000000, disabled_cond_start=10000,disabled_cond_end=10000): def sampler_pre_cfg_function(sigma, uncond, cond, cond_scale, **kwargs): if sigma[0] < minimum_sigma_to_disable_uncond or sigma[0] > maximum_sigma_to_enable_uncond: uncond = None + if sigma[0] <= disabled_cond_start and sigma[0] > disabled_cond_end: + cond = None return uncond, cond, cond_scale return sampler_pre_cfg_function @@ -88,16 +105,11 @@ def get_denoised_ranges(latent, measure="hard", top_k=0.25): return chans def get_sigmin_sigmax(model): - model_sampling = model.get_model_object("model_sampling") + model_sampling = model.model.model_sampling sigmin = model_sampling.sigma(model_sampling.timestep(model_sampling.sigma_min)) sigmax = model_sampling.sigma(model_sampling.timestep(model_sampling.sigma_max)) return sigmin, sigmax -def get_sigmas_start_end(sigmin, sigmax, start_percentage, end_percentage): - high_sigma_threshold = (sigmax - sigmin) / 100 * start_percentage - low_sigma_threshold = (sigmax - sigmin) / 100 * end_percentage - return high_sigma_threshold, low_sigma_threshold - def gaussian_similarity(x, y, sigma=1.0): diff = (x - y) ** 2 return torch.exp(-diff / (2 * sigma ** 2)) @@ -105,26 +117,150 @@ def gaussian_similarity(x, y, sigma=1.0): def check_skip(sigma, high_sigma_threshold, low_sigma_threshold): return sigma > high_sigma_threshold or sigma < low_sigma_threshold +def max_abs(tensors): + shape = tensors.shape + tensors = tensors.reshape(shape[0], -1) + tensors_abs = torch.abs(tensors) + max_abs_idx = torch.argmax(tensors_abs, dim=0) + result = tensors[max_abs_idx, torch.arange(tensors.shape[1])] + return result.reshape(shape[1:]) + def gaussian_kernel(size, sigma): ax = torch.arange(-size // 2 + 1., size // 2 + 1.) xx, yy = torch.meshgrid(ax, ax, indexing='ij') kernel = torch.exp(-(xx**2 + yy**2) / (2. * sigma**2)) return kernel / kernel.sum() -def blur_tensor(input_tensor, sigma=2, kernel_size=7): +def blur_tensor(input_tensor,kernel_size = 7, sigma = 2.0): device = input_tensor.device - kernel = gaussian_kernel(kernel_size, sigma).unsqueeze(0).unsqueeze(0).to(device).to(input_tensor[0][0].dtype) - padding = kernel_size // 2 - blurred_batch = [] - for batch in input_tensor: # Iterate over each batch - blurred_channels = [] - for channel in batch: # Iterate over each channel - blurred_channel = F.conv2d(channel.unsqueeze(0).unsqueeze(0), kernel, padding=padding) - blurred_channels.append(blurred_channel.squeeze(0).squeeze(0)) # Corrected squeezing step - blurred_batch.append(torch.stack(blurred_channels)) - return torch.stack(blurred_batch).to(device) + x_coord = torch.arange(kernel_size) - (kernel_size - 1) / 2 + xy_grid = torch.square(x_coord.repeat(kernel_size).view(kernel_size, kernel_size)) + torch.square(x_coord.repeat(kernel_size).view(kernel_size, kernel_size).t()) + gaussian_kernel = torch.exp(-xy_grid / (2 * sigma ** 2)) / torch.sum(torch.exp(-xy_grid / (2 * sigma ** 2))) + gaussian_kernel = gaussian_kernel.to(device).to(input_tensor.dtype) + gaussian_kernel = gaussian_kernel.view(1, 1, kernel_size, kernel_size).repeat(1, 1, 1, 1) + return F.conv2d(input_tensor.unsqueeze(0), gaussian_kernel, padding=int(kernel_size/2), groups=1).squeeze(0).to(device).to(input_tensor.dtype) -def square_and_norm(cond_input, method, exp_value, exp_normalize, pcp, psi, sigma, sigmax, args, eval_string = ""): +def smallest_distances(tensors): + if all(torch.equal(tensors[0], tensor) for tensor in tensors[1:]): + return tensors[0] + set_device = tensors.device + min_val = torch.full(tensors[0].shape, float("inf")).to(set_device) + result = torch.zeros_like(tensors[0]) + for idx1, t1 in enumerate(tensors): + temp_diffs = torch.zeros_like(tensors[0]) + for idx2, t2 in enumerate(tensors): + if idx1 != idx2: + temp_diffs += torch.abs(torch.sub(t1, t2)) + min_val = torch.minimum(min_val, temp_diffs) + mask = torch.eq(min_val,temp_diffs) + result[mask] = t1[mask] + return result + +# def rescale(h,downscale_factor=2,downscale_method="bicubic"): +# return comfy.utils.common_upscale(h, round(h.shape[-1] * (1.0 / downscale_factor)), round(h.shape[-2] * (1.0 / downscale_factor)), downscale_method, "disabled") + +def rescale(tensor, multiplier=2): + batch, seq_length, features = tensor.shape + H = W = int(seq_length**0.5) + tensor_reshaped = tensor.view(batch, features, H, W) + new_H = new_W = int(H * multiplier) + resized_tensor = F.interpolate(tensor_reshaped, size=(new_H, new_W), mode='bilinear', align_corners=False) + return resized_tensor.view(batch, new_H * new_W, features) + +# from https://discuss.pytorch.org/t/help-regarding-slerp-function-for-generative-model-sampling/32475 +def slerp(high, low, val): + dims = low.shape + + #flatten to batches + low = low.reshape(dims[0], -1) + high = high.reshape(dims[0], -1) + + low_norm = low/torch.norm(low, dim=1, keepdim=True) + high_norm = high/torch.norm(high, dim=1, keepdim=True) + + # in case we divide by zero + low_norm[low_norm != low_norm] = 0.0 + high_norm[high_norm != high_norm] = 0.0 + + omega = torch.acos((low_norm*high_norm).sum(1)) + so = torch.sin(omega) + res = (torch.sin((1.0-val)*omega)/so).unsqueeze(1)*low + (torch.sin(val*omega)/so).unsqueeze(1) * high + return res.reshape(dims) + +normalize_tensor = lambda x: x / x.norm() + +def random_swap(tensors, proportion=1): + num_tensors = tensors.shape[0] + if num_tensors < 2: return tensors[0],0 + tensor_size = tensors[0].numel() + if tensor_size < 100: return tensors[0],0 + + true_count = int(tensor_size * proportion) + mask = torch.cat((torch.ones(true_count, dtype=torch.bool, device=tensors[0].device), + torch.zeros(tensor_size - true_count, dtype=torch.bool, device=tensors[0].device))) + mask = mask[torch.randperm(tensor_size)].reshape(tensors[0].shape) + if num_tensors == 2 and proportion < 1: + index_tensor = torch.ones_like(tensors[0], dtype=torch.int64, device=tensors[0].device) + else: + index_tensor = torch.randint(1 if proportion < 1 else 0, num_tensors, tensors[0].shape, device=tensors[0].device) + for i, t in enumerate(tensors): + if i == 0: continue + merge_mask = index_tensor == i & mask + tensors[0][merge_mask] = t[merge_mask] + return tensors[0] + +def multi_tensor_check_mix(tensors): + if tensors[0].numel() < 2 or len(tensors) < 2: + return tensors[0] + ref_tensor_shape = tensors[0].shape + sequence_tensor = torch.arange(tensors[0].numel(), device=tensors[0].device) % len(tensors) + reshaped_sequence = sequence_tensor.view(ref_tensor_shape) + for i in range(len(tensors)): + if i == 0: continue + mask = reshaped_sequence == i + tensors[0][mask] = tensors[i][mask] + return tensors[0] + +# I asked GPT-4 for a function to deal with the attention and it made this. It kinda sorta works. +def normal_attention(q, k, v, mask=None): + attention_scores = torch.matmul(q, k.transpose(-2, -1)) + d_k = k.size(-1) + attention_scores = attention_scores / torch.sqrt(torch.tensor(d_k, dtype=torch.float32)) + if mask is not None: + attention_scores = attention_scores.masked_fill(mask == 0, float('-inf')) + attention_weights = F.softmax(attention_scores, dim=-1) + output = torch.matmul(attention_weights, v) + return output + +def sspow(input_tensor, p=2): + return input_tensor.abs().pow(p) * input_tensor.sign() + +def gradient_merge(tensor1, tensor2, start_value=0, dim=0): + if torch.numel(tensor1) <= 1: return tensor1 + if dim >= tensor1.dim(): dim = 0 + size = tensor1.size(dim) + alpha = torch.linspace(start_value, 1-start_value, steps=size, device=tensor1.device).view([-1 if i == dim else 1 for i in range(tensor1.dim())]) + return tensor1 * alpha + tensor2 * (1 - alpha) + +# eval() results share pointers and would therefore apply the same formula to all layers. +class attention_modifier(): + def __init__(self, self_attn_mod_eval, conds = None): + self.self_attn_mod_eval = self_attn_mod_eval + self.conds = conds + def modified_attention(self, q, k, v, extra_options, mask=None): + if "attnbc" in self.self_attn_mod_eval: + attnbc = attention_basic(q, k, v, extra_options['n_heads'], mask) + if "normattn" in self.self_attn_mod_eval: + normattn = normal_attention(q, k, v, mask) + if self.conds is not None: + cond_pos_l = self.conds[0][..., :768].cuda() + cond_neg_l = self.conds[1][..., :768].cuda() + if self.conds[0].shape[-1] > 768: + cond_pos_g = self.conds[0][..., 768:2048].cuda() + cond_neg_g = self.conds[1][..., 768:2048].cuda() + return eval(self.self_attn_mod_eval) + +def experimental_functions(cond_input, method, exp_value, exp_normalize, pcp, psi, sigma, sigmax, attention_modifiers_input, args, model_options_copy, eval_string = ""): """ There may or may not be an actual reasoning behind each of these methods. Some like the sine value have interesting properties. Enabled for both cond and uncond preds it somehow make them stronger. @@ -150,13 +286,15 @@ def square_and_norm(cond_input, method, exp_value, exp_normalize, pcp, psi, sigm The last one becomes the result. Note that it's just an example, I don't see much interest in that one. - Using comfy.samplers.calc_cond_batch(args["model"], [args["cond_pos"], None], args["input"]-cond, args["timestep"], args["model_options"])[0] + Using comfy.samplers.calc_cond_batch(args["model"], [args["cond_pos"], None], args["input"], args["timestep"], args["model_options"])[0] can work too. This whole mess has for initial goal to attempt to find the best way (or have some bruteforcing fun) to replace the uncond pred for as much as possible. + Or simply to try things around :) """ - if method == "normal": + if method == "cond_pred": return cond_input + default_device = cond_input.device # print() # print(get_entropy(cond)) cond = cond_input.clone() @@ -212,12 +350,33 @@ def square_and_norm(cond_input, method, exp_value, exp_normalize, pcp, psi, sigm cond = cond.sign() elif method == "zero": cond = torch.zeros_like(cond) + elif method in ["attention_modifiers_input_using_cond","attention_modifiers_input_using_uncond","subtract_attention_modifiers_input_using_cond","subtract_attention_modifiers_input_using_uncond"]: + cond_to_use = args["cond_pos"] if method in ["attention_modifiers_input_using_cond","subtract_attention_modifiers_input_using_cond"] else args["cond_neg"] + tmp_model_options = deepcopy(model_options_copy) + for atm in attention_modifiers_input: + if sigma <= atm['sigma_start'] and sigma > atm['sigma_end']: + block_layers = {"input": atm['unet_block_id_input'], "middle": atm['unet_block_id_middle'], "output": atm['unet_block_id_output']} + for unet_block in block_layers: + for unet_block_id in block_layers[unet_block].split(","): + if unet_block_id != "": + unet_block_id = int(unet_block_id) + tmp_model_options = set_model_options_patch_replace(tmp_model_options, attention_modifier(atm['self_attn_mod_eval'], [args["cond_pos"][0]["cross_attn"], args["cond_neg"][0]["cross_attn"]]if "cond" in atm['self_attn_mod_eval'] else None).modified_attention, atm['unet_attn'], unet_block, unet_block_id) + + cond = comfy.samplers.calc_cond_batch(args["model"], [cond_to_use], args["input"], args["timestep"], tmp_model_options)[0] + if method in ["subtract_attention_modifiers_input_using_cond","subtract_attention_modifiers_input_using_uncond"]: + cond = cond_input + (cond_input - cond) * exp_value + elif method == "previous_average": if sigma > (sigmax - 1): cond = torch.zeros_like(cond) else: cond = (pcp / psi * sigma + cond) / 2 elif method == "eval": + if "condmix" in eval_string: + def condmix(args, mult=2): + cond_pos_tmp = deepcopy(args["cond_pos"]) + cond_pos_tmp[0]["cross_attn"] += (args["cond_pos"][0]["cross_attn"] - args["cond_neg"][0]["cross_attn"]*-1) * mult + return cond_pos_tmp v = [] evals_strings = eval_string.split(";") if len(evals_strings) > 1: @@ -227,7 +386,7 @@ def square_and_norm(cond_input, method, exp_value, exp_normalize, pcp, psi, sigm if exp_normalize and torch.all(cond != 0): cond = cond * cond_norm / cond.norm() # print(get_entropy(cond)) - return cond + return cond.to(device=default_device) class advancedDynamicCFG: def __init__(self): @@ -242,49 +401,70 @@ class advancedDynamicCFG: "skip_uncond" : ("BOOLEAN", {"default": True}), "fake_uncond_start" : ("BOOLEAN", {"default": False}), - "uncond_sigma_start": ("FLOAT", {"default": 5, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "uncond_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "uncond_sigma_end": ("FLOAT", {"default": 1, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "lerp_uncond" : ("BOOLEAN", {"default": False}), "lerp_uncond_strength": ("FLOAT", {"default": 2, "min": 0.0, "max": 10.0, "step": 0.1, "round": 0.1}), - "lerp_uncond_sigma_start": ("FLOAT", {"default": 15, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "lerp_uncond_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "lerp_uncond_sigma_end": ("FLOAT", {"default": 1, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "subtract_latent_mean" : ("BOOLEAN", {"default": False}), - "subtract_latent_mean_sigma_start": ("FLOAT", {"default": 15, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "subtract_latent_mean_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "subtract_latent_mean_sigma_end": ("FLOAT", {"default": 1, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "latent_intensity_rescale" : ("BOOLEAN", {"default": False}), "latent_intensity_rescale_method" : (["soft","hard","range"], {"default": "hard"},), "latent_intensity_rescale_cfg": ("FLOAT", {"default": 8, "min": 0.0, "max": 100.0, "step": 0.1, "round": 0.1}), - "latent_intensity_rescale_sigma_start": ("FLOAT", {"default": 15, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "latent_intensity_rescale_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "latent_intensity_rescale_sigma_end": ("FLOAT", {"default": 3, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "cond_exp": ("BOOLEAN", {"default": False}), "cond_exp_normalize": ("BOOLEAN", {"default": False}), - "cond_exp_sigma_start": ("FLOAT", {"default": 15, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "cond_exp_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "cond_exp_sigma_end": ("FLOAT", {"default": 1, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), - "cond_exp_method": (["amplify", "root", "power", "erf", "erf_amplify", "exp_erf", "root_erf", "sine", "sine_exp", "sine_exp_diff", "sine_exp_diff_to_sine", "sine_root", "sine_root_diff", "sine_root_diff_to_sine", "theDaRkNeSs", "cosine", "sign", "zero"],), - "cond_exp_value": ("FLOAT", {"default": 2, "min": 1, "max": 100, "step": 0.1, "round": 0.01}), + "cond_exp_method": (["amplify", "root", "power", "erf", "erf_amplify", "exp_erf", "root_erf", "sine", "sine_exp", "sine_exp_diff", "sine_exp_diff_to_sine", "sine_root", "sine_root_diff", "sine_root_diff_to_sine", "theDaRkNeSs", "cosine", "sign", "zero", "previous_average", "eval", + "attention_modifiers_input_using_cond","attention_modifiers_input_using_uncond", + "subtract_attention_modifiers_input_using_cond","subtract_attention_modifiers_input_using_uncond"],), + "cond_exp_value": ("FLOAT", {"default": 2, "min": 0, "max": 100, "step": 0.1, "round": 0.01}), "uncond_exp": ("BOOLEAN", {"default": False}), "uncond_exp_normalize": ("BOOLEAN", {"default": False}), - "uncond_exp_sigma_start": ("FLOAT", {"default": 15, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "uncond_exp_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "uncond_exp_sigma_end": ("FLOAT", {"default": 1, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), - "uncond_exp_method": (["normal", "amplify", "root", "power", "erf", "erf_amplify", "exp_erf", "root_erf", "sine", "sine_exp", "sine_exp_diff", "sine_exp_diff_to_sine", "sine_root", "sine_root_diff", "sine_root_diff_to_sine", "theDaRkNeSs", "cosine", "sign", "zero"],), - "uncond_exp_value": ("FLOAT", {"default": 2, "min": 1, "max": 100, "step": 0.1, "round": 0.01}), + "uncond_exp_method": (["amplify", "root", "power", "erf", "erf_amplify", "exp_erf", "root_erf", "sine", "sine_exp", "sine_exp_diff", "sine_exp_diff_to_sine", "sine_root", "sine_root_diff", "sine_root_diff_to_sine", "theDaRkNeSs", "cosine", "sign", "zero", "previous_average", "eval", + "subtract_attention_modifiers_input_using_cond","subtract_attention_modifiers_input_using_uncond"],), + "uncond_exp_value": ("FLOAT", {"default": 2, "min": 0, "max": 100, "step": 0.1, "round": 0.01}), "fake_uncond_exp": ("BOOLEAN", {"default": False}), "fake_uncond_exp_normalize": ("BOOLEAN", {"default": False}), - "fake_uncond_exp_method" : (["normal", "previous_average", "amplify", "root", "power", "erf", "erf_amplify", "exp_erf", "root_erf", "sine", "sine_exp", "sine_exp_diff", "sine_exp_diff_to_sine", "sine_root", "sine_root_diff", "sine_root_diff_to_sine", "theDaRkNeSs", "cosine", "sign", "zero", "eval"],), - "fake_uncond_exp_value": ("FLOAT", {"default": 2, "min": 1, "max": 1000, "step": 0.1, "round": 0.01}), + "fake_uncond_exp_method" : (["cond_pred", "previous_average", + "amplify", "root", "power", "erf", "erf_amplify", "exp_erf", "root_erf", "sine", "sine_exp", "sine_exp_diff", "sine_exp_diff_to_sine", "sine_root", "sine_root_diff", + "sine_root_diff_to_sine", "theDaRkNeSs", "cosine", "sign", "zero", "eval", + "subtract_attention_modifiers_input_using_cond","subtract_attention_modifiers_input_using_uncond", + "attention_modifiers_input_using_cond","attention_modifiers_input_using_uncond"],), + "fake_uncond_exp_value": ("FLOAT", {"default": 2, "min": 0, "max": 1000, "step": 0.1, "round": 0.01}), "fake_uncond_multiplier": ("INT", {"default": 1, "min": -1, "max": 1, "step": 1}), - "fake_uncond_sigma_start": ("FLOAT", {"default": 15, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), - "fake_uncond_sigma_end": ("FLOAT", {"default": 5.5, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "fake_uncond_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "fake_uncond_sigma_end": ("FLOAT", {"default": 1, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "auto_cfg_topk": ("FLOAT", {"default": 0.25, "min": 0.0, "max": 0.5, "step": 0.05, "round": 0.01}), + "auto_cfg_ref": ("FLOAT", {"default": 8, "min": 0.0, "max": 100, "step": 0.5, "round": 0.01}), + "attention_modifiers_global_enabled": ("BOOLEAN", {"default": False}), + "disable_cond": ("BOOLEAN", {"default": False}), + "disable_cond_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "disable_cond_sigma_end": ("FLOAT", {"default": 0, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "save_as_preset": ("BOOLEAN", {"default": False}), + "preset_name": ("STRING", {"multiline": False}), }, "optional":{ - "eval_string": ("STRING", {"multiline": True}), - "args_filter": ("STRING", {"multiline": True, "forceInput": True}) + "eval_string_cond": ("STRING", {"multiline": True}), + "eval_string_uncond": ("STRING", {"multiline": True}), + "eval_string_fake": ("STRING", {"multiline": True}), + "args_filter": ("STRING", {"multiline": True, "forceInput": True}), + "attention_modifiers_positive": ("ATTNMOD", {"forceInput": True}), + "attention_modifiers_negative": ("ATTNMOD", {"forceInput": True}), + "attention_modifiers_fake_negative": ("ATTNMOD", {"forceInput": True}), + "attention_modifiers_global": ("ATTNMOD", {"forceInput": True}), } } RETURN_TYPES = ("MODEL","STRING",) @@ -293,24 +473,38 @@ class advancedDynamicCFG: CATEGORY = "model_patches/automatic_cfg" def patch(self, model, automatic_cfg = "None", - skip_uncond = False, fake_uncond_start = False, uncond_sigma_start = 15, uncond_sigma_end = 0, - lerp_uncond = False, lerp_uncond_strength = 1, lerp_uncond_sigma_start = 15, lerp_uncond_sigma_end = 1, - subtract_latent_mean = False, subtract_latent_mean_sigma_start = 15, subtract_latent_mean_sigma_end = 1, - latent_intensity_rescale = False, latent_intensity_rescale_sigma_start = 15, latent_intensity_rescale_sigma_end = 1, - cond_exp = False, cond_exp_sigma_start = 15, cond_exp_sigma_end = 14, cond_exp_method = "amplify", cond_exp_value = 2, cond_exp_normalize = False, - uncond_exp = False, uncond_exp_sigma_start = 15, uncond_exp_sigma_end = 14, uncond_exp_method = "amplify", uncond_exp_value = 2, uncond_exp_normalize = False, - fake_uncond_exp = False, fake_uncond_exp_method = "amplify", fake_uncond_exp_value = 2, fake_uncond_exp_normalize = False, fake_uncond_multiplier = 1, fake_uncond_sigma_start = 15, fake_uncond_sigma_end = 5.5, + skip_uncond = False, fake_uncond_start = False, uncond_sigma_start = 1000, uncond_sigma_end = 0, + lerp_uncond = False, lerp_uncond_strength = 1, lerp_uncond_sigma_start = 1000, lerp_uncond_sigma_end = 1, + subtract_latent_mean = False, subtract_latent_mean_sigma_start = 1000, subtract_latent_mean_sigma_end = 1, + latent_intensity_rescale = False, latent_intensity_rescale_sigma_start = 1000, latent_intensity_rescale_sigma_end = 1, + cond_exp = False, cond_exp_sigma_start = 1000, cond_exp_sigma_end = 1000, cond_exp_method = "amplify", cond_exp_value = 2, cond_exp_normalize = False, + uncond_exp = False, uncond_exp_sigma_start = 1000, uncond_exp_sigma_end = 1000, uncond_exp_method = "amplify", uncond_exp_value = 2, uncond_exp_normalize = False, + fake_uncond_exp = False, fake_uncond_exp_method = "amplify", fake_uncond_exp_value = 2, fake_uncond_exp_normalize = False, fake_uncond_multiplier = 1, fake_uncond_sigma_start = 1000, fake_uncond_sigma_end = 1, latent_intensity_rescale_cfg = 8, latent_intensity_rescale_method = "hard", - ignore_pre_cfg_func = False, eval_string = "", args_filter = ""): + ignore_pre_cfg_func = False, args_filter = "", auto_cfg_topk = 0.25, auto_cfg_ref = 8, + eval_string_cond = "", eval_string_uncond = "", eval_string_fake = "", + attention_modifiers_global_enabled = False, + attention_modifiers_positive = [], attention_modifiers_negative = [], attention_modifiers_fake_negative = [], attention_modifiers_global = [], + disable_cond=False, disable_cond_sigma_start=1000,disable_cond_sigma_end=1000, save_as_preset = False, preset_name = "", **kwargs + ): + + model_options_copy = deepcopy(model.model_options) monkey_patching_comfy_sampling_function() - args = locals() if args_filter != "": args_filter = args_filter.split(",") else: args_filter = [k for k, v in locals().items()] - not_in_filter = ['self','model','args','args_filter'] + not_in_filter = ['self','model','args','args_filter','save_as_preset','preset_name','model_options_copy'] if fake_uncond_exp_method != "eval": not_in_filter.append("eval_string") + + if save_as_preset and preset_name != "": + preset_parameters = {key: value for key, value in locals().items() if key not in not_in_filter} + with open(os.path.join(json_preset_path, preset_name+".json"), 'w', encoding='utf-8') as f: + json.dump(preset_parameters, f) + print(f"Preset saved with the name: {Fore.GREEN}{preset_name}{Fore.RESET}") + print(f"{Fore.RED}Don't forget to turn the save toggle OFF to not overwrite!{Fore.RESET}") + args_str = '\n'.join(f'{k}: {v}' for k, v in locals().items() if k not in not_in_filter and k in args_filter) sigmin, sigmax = get_sigmin_sigmax(model) @@ -320,16 +514,17 @@ class advancedDynamicCFG: rescale_start, rescale_end = latent_intensity_rescale_sigma_start, latent_intensity_rescale_sigma_end print(f"Model maximum sigma: {sigmax} / Model minimum sigma: {sigmin}") m = model.clone() - if skip_uncond: + + if skip_uncond or disable_cond: # set model_options sampler_pre_cfg_function - m.model_options["sampler_pre_cfg_function"] = make_sampler_pre_cfg_function(uncond_sigma_end, uncond_sigma_start) + m.model_options["sampler_pre_cfg_function"] = make_sampler_pre_cfg_function(uncond_sigma_end if skip_uncond else 0, uncond_sigma_start if skip_uncond else 100000,\ + disable_cond_sigma_start if disable_cond else 100000, disable_cond_sigma_end if disable_cond else 100000) print(f"Sampling function patched. Uncond enabled from {round(uncond_sigma_start,2)} to {round(uncond_sigma_end,2)}") elif not ignore_pre_cfg_func: m.model_options.pop("sampler_pre_cfg_function", None) uncond_sigma_start, uncond_sigma_end = 1000000, 0 - top_k = 0.25 - reference_cfg = 8 + top_k = auto_cfg_topk previous_cond_pred = None previous_sigma = None def automatic_cfg_function(args): @@ -344,6 +539,8 @@ class advancedDynamicCFG: previous_cond_pred = deepcopy(cond_pred) if previous_sigma is None: previous_sigma = sigma.item() + reference_cfg = auto_cfg_ref if auto_cfg_ref > 0 else cond_scale + def fake_uncond_step(): return fake_uncond_start and skip_uncond and (sigma > uncond_sigma_start or sigma < uncond_sigma_end) and sigma <= fake_uncond_sigma_start and sigma >= fake_uncond_sigma_end @@ -351,11 +548,11 @@ class advancedDynamicCFG: uncond_pred = cond_pred.clone() * fake_uncond_multiplier if cond_exp and sigma <= cond_exp_sigma_start and sigma >= cond_exp_sigma_end: - cond_pred = square_and_norm(cond_pred, cond_exp_method, cond_exp_value, cond_exp_normalize, previous_cond_pred, previous_sigma, sigma.item(), sigmax, args) + cond_pred = experimental_functions(cond_pred, cond_exp_method, cond_exp_value, cond_exp_normalize, previous_cond_pred, previous_sigma, sigma.item(), sigmax, attention_modifiers_positive, args, model_options_copy, eval_string_cond) if uncond_exp and sigma <= uncond_exp_sigma_start and sigma >= uncond_exp_sigma_end and not fake_uncond_step(): - uncond_pred = square_and_norm(uncond_pred, uncond_exp_method, uncond_exp_value, uncond_exp_normalize, previous_cond_pred, previous_sigma, sigma.item(), sigmax, args) + uncond_pred = experimental_functions(uncond_pred, uncond_exp_method, uncond_exp_value, uncond_exp_normalize, previous_cond_pred, previous_sigma, sigma.item(), sigmax, attention_modifiers_negative, args, model_options_copy, eval_string_uncond) if fake_uncond_step() and fake_uncond_exp: - uncond_pred = square_and_norm(uncond_pred, fake_uncond_exp_method, fake_uncond_exp_value, fake_uncond_exp_normalize, previous_cond_pred, previous_sigma, sigma.item(), sigmax, args, eval_string) + uncond_pred = experimental_functions(uncond_pred, fake_uncond_exp_method, fake_uncond_exp_value, fake_uncond_exp_normalize, previous_cond_pred, previous_sigma, sigma.item(), sigmax, attention_modifiers_fake_negative, args, model_options_copy, eval_string_fake) previous_cond_pred = deepcopy(cond_pred) if sigma >= sigmax or cond_scale > 1: @@ -366,7 +563,9 @@ class advancedDynamicCFG: return input_x - cond_pred if lerp_uncond and not check_skip(sigma, lerp_start, lerp_end) and lerp_uncond_strength != 1: + uncond_pred_norm = uncond_pred.norm() uncond_pred = torch.lerp(cond_pred, uncond_pred, lerp_uncond_strength) + uncond_pred = uncond_pred * uncond_pred_norm / uncond_pred.norm() cond = input_x - cond_pred uncond = input_x - uncond_pred @@ -404,6 +603,18 @@ class advancedDynamicCFG: scale_correction = target_intensity / denoised_ranges[c] denoised[b][c] = denoised[b][c] * scale_correction return denoised + + tmp_model_options = deepcopy(m.model_options) + if attention_modifiers_global_enabled: + print(f"{Fore.GREEN}Sigma timings are ignored for global modifiers.{Fore.RESET}") + for atm in attention_modifiers_global: + block_layers = {"input": atm['unet_block_id_input'], "middle": atm['unet_block_id_middle'], "output": atm['unet_block_id_output']} + for unet_block in block_layers: + for unet_block_id in block_layers[unet_block].split(","): + if unet_block_id != "": + unet_block_id = int(unet_block_id) + tmp_model_options = set_model_options_patch_replace(tmp_model_options, attention_modifier(atm['self_attn_mod_eval']).modified_attention, atm['unet_attn'], unet_block, unet_block_id) + m.model_options = tmp_model_options if not ignore_pre_cfg_func: m.set_model_sampler_cfg_function(automatic_cfg_function, disable_cfg1_optimization = False) @@ -413,6 +624,94 @@ class advancedDynamicCFG: m.set_model_sampler_post_cfg_function(rescale_post_cfg) return (m, args_str, ) +class attentionModifierParametersNode: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "sigma_end": ("FLOAT", {"default": 0, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "self_attn_mod_eval": ("STRING", {"multiline": True }, {"default": ""}), + "unet_block_id_input": ("STRING", {"multiline": False}, {"default": ""}), + "unet_block_id_middle": ("STRING", {"multiline": False}, {"default": ""}), + "unet_block_id_output": ("STRING", {"multiline": False}, {"default": ""}), + "unet_attn": (["attn1","attn2"],), + }, + "optional":{ + "join_parameters": ("ATTNMOD", {"forceInput": True}), + }} + + RETURN_TYPES = ("ATTNMOD","STRING",) + RETURN_NAMES = ("Attention modifier", "Parameters as string") + FUNCTION = "exec" + CATEGORY = "model_patches/automatic_cfg/experimental_attention_modifiers" + def exec(self, join_parameters=None, **kwargs): + info_string = "\n".join([f"{k}: {v}" for k,v in kwargs.items() if v != ""]) + return ([kwargs] if join_parameters is None else join_parameters + [kwargs], info_string, ) + +class attentionModifierBruteforceParametersNode: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}), + "sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "sigma_end": ("FLOAT", {"default": 0, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "self_attn_mod_eval": ("STRING", {"multiline": True }, {"default": ""}), + "unet_block_id_input": ("STRING", {"multiline": False}, {"default": "4,5,7,8"}), + "unet_block_id_middle": ("STRING", {"multiline": False}, {"default": "0"}), + "unet_block_id_output": ("STRING", {"multiline": False}, {"default": "0,1,2,3,4,5"}), + "unet_attn": (["attn1","attn2"],), + }, + "optional":{ + "join_parameters": ("ATTNMOD", {"forceInput": True}), + }} + + RETURN_TYPES = ("ATTNMOD","STRING",) + RETURN_NAMES = ("Attention modifier", "Parameters as string") + FUNCTION = "exec" + CATEGORY = "model_patches/automatic_cfg/experimental_attention_modifiers" + + def create_sequence_parameters(self, input_str, middle_str, output_str): + input_values = input_str.split(",") if input_str else [] + middle_values = middle_str.split(",") if middle_str else [] + output_values = output_str.split(",") if output_str else [] + result = [] + result.extend([{"unet_block_id_input": val, "unet_block_id_middle": "", "unet_block_id_output": ""} for val in input_values]) + result.extend([{"unet_block_id_input": "", "unet_block_id_middle": val, "unet_block_id_output": ""} for val in middle_values]) + result.extend([{"unet_block_id_input": "", "unet_block_id_middle": "", "unet_block_id_output": val} for val in output_values]) + return result + + def exec(self, seed, join_parameters=None, **kwargs): + sequence_parameters = self.create_sequence_parameters(kwargs['unet_block_id_input'],kwargs['unet_block_id_middle'],kwargs['unet_block_id_output']) + lenseq = len(sequence_parameters) + current_index = seed % lenseq + current_sequence = sequence_parameters[current_index] + kwargs["unet_block_id_input"] = current_sequence["unet_block_id_input"] + kwargs["unet_block_id_middle"] = current_sequence["unet_block_id_middle"] + kwargs["unet_block_id_output"] = current_sequence["unet_block_id_output"] + if current_sequence["unet_block_id_input"] != "": + current_block_string = f"unet_block_id_input: {current_sequence['unet_block_id_input']}" + elif current_sequence["unet_block_id_middle"] != "": + current_block_string = f"unet_block_id_middle: {current_sequence['unet_block_id_middle']}" + elif current_sequence["unet_block_id_output"] != "": + current_block_string = f"unet_block_id_output: {current_sequence['unet_block_id_output']}" + info_string = f"Progress: {current_index+1}/{lenseq}\n{kwargs['self_attn_mod_eval']}\n{kwargs['unet_attn']} {current_block_string}" + return ([kwargs] if join_parameters is None else join_parameters + [kwargs], info_string, ) + +class attentionModifierConcatNode: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "parameters_1": ("ATTNMOD", {"forceInput": True}), + "parameters_2": ("ATTNMOD", {"forceInput": True}), + }} + + RETURN_TYPES = ("ATTNMOD",) + FUNCTION = "exec" + CATEGORY = "model_patches/automatic_cfg/experimental_attention_modifiers" + def exec(self, parameters_1, parameters_2): + output_parms = parameters_1 + parameters_2 + return (output_parms, ) + class simpleDynamicCFG: @classmethod def INPUT_TYPES(s): @@ -430,11 +729,48 @@ class simpleDynamicCFG: advcfg = advancedDynamicCFG() m = advcfg.patch(model, skip_uncond = boost, - uncond_sigma_start = 15, uncond_sigma_end = 1, + uncond_sigma_start = 1000, uncond_sigma_end = 1, automatic_cfg = "hard" if hard_mode else "soft" )[0] return (m, ) +class presetLoader: + @classmethod + def INPUT_TYPES(s): + presets_files = [pj.replace(".json","") for pj in os.listdir(json_preset_path) if ".json" in pj] + presets_files = sorted(presets_files, key=str.lower) + return {"required": { + "model": ("MODEL",), + "preset" : (presets_files, {"default": "The red riding latent"}), + "uncond_sigma_end": ("FLOAT", {"default": 1, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "use_uncond_sigma_end_from_preset" : ("BOOLEAN", {"default": True}), + }, + "optional":{ + "join_global_parameters": ("ATTNMOD", {"forceInput": True}), + }} + RETURN_TYPES = ("MODEL", "STRING", "STRING",) + RETURN_NAMES = ("Model", "Preset name", "Parameters as string",) + FUNCTION = "patch" + + CATEGORY = "model_patches/automatic_cfg" + + def patch(self, model, preset, uncond_sigma_end, use_uncond_sigma_end_from_preset, join_global_parameters=None): + with open(os.path.join(json_preset_path, preset+".json"), 'r', encoding='utf-8') as f: + preset_args = json.load(f) + if not use_uncond_sigma_end_from_preset: + preset_args["uncond_sigma_end"] = uncond_sigma_end + preset_args["fake_uncond_sigma_end"] = uncond_sigma_end + + if join_global_parameters is not None: + preset_args["attention_modifiers_global"] = preset_args["attention_modifiers_global"] + join_global_parameters + preset_args["attention_modifiers_global_enabled"] = True + + advcfg = advancedDynamicCFG() + m = advcfg.patch(model, **preset_args)[0] + info_string = "\n".join([f"{k}: {v}" for k,v in preset_args.items() if v != ""]) + print(f"Preset {Fore.GREEN}{preset}{Fore.RESET} loaded successfully!") + return (m, preset, info_string,) + class simpleDynamicCFGlerpUncond: @classmethod def INPUT_TYPES(s): @@ -464,18 +800,18 @@ class postCFGrescaleOnly: return {"required": { "model": ("MODEL",), "subtract_latent_mean" : ("BOOLEAN", {"default": True}), - "subtract_latent_mean_sigma_start": ("FLOAT", {"default": 15, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.1}), + "subtract_latent_mean_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.1}), "subtract_latent_mean_sigma_end": ("FLOAT", {"default": 7.5, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.1}), "latent_intensity_rescale" : ("BOOLEAN", {"default": True}), "latent_intensity_rescale_method" : (["soft","hard","range"], {"default": "hard"},), - "latent_intensity_rescale_cfg" : ("FLOAT", {"default": 7.6, "min": 0.0, "max": 100.0, "step": 0.1, "round": 0.1}), - "latent_intensity_rescale_sigma_start": ("FLOAT", {"default": 15, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.1}), - "latent_intensity_rescale_sigma_end": ("FLOAT", {"default": 7.5, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.1}), + "latent_intensity_rescale_cfg" : ("FLOAT", {"default": 8, "min": 0.0, "max": 100.0, "step": 0.1, "round": 0.1}), + "latent_intensity_rescale_sigma_start": ("FLOAT", {"default": 1000, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.1}), + "latent_intensity_rescale_sigma_end": ("FLOAT", {"default": 5, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.1}), }} RETURN_TYPES = ("MODEL",) FUNCTION = "patch" - CATEGORY = "model_patches/automatic_cfg" + CATEGORY = "model_patches/automatic_cfg/utils" def patch(self, model, subtract_latent_mean, subtract_latent_mean_sigma_start, subtract_latent_mean_sigma_end, @@ -516,24 +852,24 @@ class simpleDynamicCFGwarpDrive: "uncond_sigma_start": ("FLOAT", {"default": 5.5, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "uncond_sigma_end": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), "fake_uncond_sigma_end": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), - "less_clutter": ("BOOLEAN", {"default": False}), }} RETURN_TYPES = ("MODEL",) FUNCTION = "patch" CATEGORY = "model_patches/automatic_cfg/presets" - def patch(self, model, uncond_sigma_start, uncond_sigma_end, fake_uncond_sigma_end, less_clutter): + def patch(self, model, uncond_sigma_start, uncond_sigma_end, fake_uncond_sigma_end): advcfg = advancedDynamicCFG() print(f" {Fore.CYAN}WARP DRIVE MODE ENGAGED!{Style.RESET_ALL}\n Settings suggestions:\n" f" {Fore.GREEN}1/1/1: {Fore.YELLOW}Maaaxxxiiimum speeeeeed.{Style.RESET_ALL} {Fore.RED}Uncond disabled.{Style.RESET_ALL} {Fore.MAGENTA}Fasten your seatbelt!{Style.RESET_ALL}\n" f" {Fore.GREEN}3/1/1: {Fore.YELLOW}Risky space-time continuum distortion.{Style.RESET_ALL} {Fore.MAGENTA}Awesome for prompts with a clear subject!{Style.RESET_ALL}\n" f" {Fore.GREEN}5.5/1/1: {Fore.YELLOW}Frameshift Drive Autopilot: {Fore.GREEN}Engaged.{Style.RESET_ALL} {Fore.MAGENTA}Should work with anything but do it better and faster!{Style.RESET_ALL}") + m = advcfg.patch(model=model, automatic_cfg = "hard", skip_uncond = True, uncond_sigma_start = uncond_sigma_start, uncond_sigma_end = uncond_sigma_end, fake_uncond_sigma_end = fake_uncond_sigma_end, fake_uncond_sigma_start = 1000, fake_uncond_start=True, fake_uncond_exp=True,fake_uncond_exp_normalize=True,fake_uncond_exp_method="previous_average", - cond_exp = less_clutter, cond_exp_sigma_start = 9, cond_exp_sigma_end = uncond_sigma_start, cond_exp_method = "erf", cond_exp_normalize = True, + cond_exp = False, cond_exp_sigma_start = 9, cond_exp_sigma_end = uncond_sigma_start, cond_exp_method = "erf", cond_exp_normalize = True, )[0] return (m, ) @@ -546,9 +882,86 @@ class simpleDynamicCFGunpatch: RETURN_TYPES = ("MODEL",) FUNCTION = "unpatch" - CATEGORY = "model_patches/automatic_cfg" + CATEGORY = "model_patches/automatic_cfg/utils" def unpatch(self, model): m = model.clone() m.model_options.pop("sampler_pre_cfg_function", None) return (m, ) + +class simpleDynamicCFGExcellentattentionPatch: + @classmethod + def INPUT_TYPES(s): + return {"required": { + "model": ("MODEL",), + "Auto_CFG": ("BOOLEAN", {"default": True}), + "patch_multiplier": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + "patch_cond": ("BOOLEAN", {"default": True}), + "patch_uncond": ("BOOLEAN", {"default": True}), + "light_patch": ("BOOLEAN", {"default": False}), + "mute_self_input_layer_8_cond": ("BOOLEAN", {"default": False}), + "mute_cross_input_layer_8_cond": ("BOOLEAN", {"default": False}), + "mute_self_input_layer_8_uncond": ("BOOLEAN", {"default": True}), + "mute_cross_input_layer_8_uncond": ("BOOLEAN", {"default": False}), + "uncond_sigma_end": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10000.0, "step": 0.1, "round": 0.01}), + }} + RETURN_TYPES = ("MODEL","STRING",) + RETURN_NAMES = ("Model", "Parameters as string",) + FUNCTION = "patch" + + CATEGORY = "model_patches/automatic_cfg/presets" + + def patch(self, model, Auto_CFG, patch_multiplier, patch_cond, patch_uncond, light_patch, + mute_self_input_layer_8_cond, mute_cross_input_layer_8_cond, + mute_self_input_layer_8_uncond, mute_cross_input_layer_8_uncond, + uncond_sigma_end): + + parameters_as_string = "Excellent attention:\n" + "\n".join([f"{k}: {v}" for k, v in locals().items() if k not in ["self", "model"]]) + + with open(os.path.join(json_preset_path, "Excellent_attention.json"), 'r', encoding='utf-8') as f: + patch_parameters = json.load(f) + + attn_patch = {"sigma_start": 1000, "sigma_end": 0, + "self_attn_mod_eval": f"normalize_tensor(q+(q-attention_basic(attnbc, k, v, extra_options['n_heads'])))*attnbc.norm()*{patch_multiplier}", + "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"} + attn_patch_light = {"sigma_start": 1000, "sigma_end": 0, + "self_attn_mod_eval": f"q*{patch_multiplier}", + "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"} + kill_self_input_8 = { + "sigma_start": 1000, + "sigma_end": 0, + "self_attn_mod_eval": "torch.zeros_like(q)", + "unet_block_id_input": "8", + "unet_block_id_middle": "", + "unet_block_id_output": "", + "unet_attn": "attn1"} + kill_cross_input_8 = { + "sigma_start": 1000, + "sigma_end": 0, + "self_attn_mod_eval": "torch.zeros_like(q)", + "unet_block_id_input": "8", + "unet_block_id_middle": "", + "unet_block_id_output": "", + "unet_attn": "attn2"} + + attention_modifiers_positive = [] + attention_modifiers_fake_negative = [] + + if patch_cond: attention_modifiers_positive.append(attn_patch) if not light_patch else attention_modifiers_positive.append(attn_patch_light) + if mute_self_input_layer_8_cond: attention_modifiers_positive.append(kill_self_input_8) + if mute_cross_input_layer_8_cond: attention_modifiers_positive.append(kill_cross_input_8) + + if patch_uncond: attention_modifiers_fake_negative.append(attn_patch) if not light_patch else attention_modifiers_fake_negative.append(attn_patch_light) + if mute_self_input_layer_8_uncond: attention_modifiers_fake_negative.append(kill_self_input_8) + if mute_cross_input_layer_8_uncond: attention_modifiers_fake_negative.append(kill_cross_input_8) + + patch_parameters['attention_modifiers_positive'] = attention_modifiers_positive + patch_parameters['attention_modifiers_fake_negative'] = attention_modifiers_fake_negative + patch_parameters["uncond_sigma_end"] = uncond_sigma_end + patch_parameters["fake_uncond_sigma_end"] = uncond_sigma_end + patch_parameters["automatic_cfg"] = "hard" if Auto_CFG else "None" + + advcfg = advancedDynamicCFG() + m = advcfg.patch(model, **patch_parameters)[0] + + return (m, parameters_as_string, ) \ No newline at end of file diff --git a/nodes_sag_custom.py b/nodes_sag_custom.py index a794f80..94bf465 100644 --- a/nodes_sag_custom.py +++ b/nodes_sag_custom.py @@ -93,21 +93,33 @@ def gaussian_blur_2d(img, kernel_size, sigma): img = F.conv2d(img, kernel2d, groups=img.shape[-3]) return img +def get_denoised_ranges(latent, measure="hard", top_k=0.25): + chans = [] + for x in range(len(latent)): + max_values = torch.topk(latent[x] - latent[x].mean() if measure == "range" else latent[x], k=int(len(latent[x])*top_k), largest=True).values + min_values = torch.topk(latent[x] - latent[x].mean() if measure == "range" else latent[x], k=int(len(latent[x])*top_k), largest=False).values + max_val = torch.mean(max_values).item() + min_val = torch.mean(torch.abs(min_values)).item() if (measure == "hard" or measure == "range") else abs(torch.mean(min_values).item()) + denoised_range = (max_val + min_val) / 2 + chans.append(denoised_range) + return chans + class SelfAttentionGuidanceCustom: @classmethod def INPUT_TYPES(s): return {"required": { "model": ("MODEL",), - "scale": ("FLOAT", {"default": 0.5, "min": -2.0, "max": 5.0, "step": 0.1}), + "scale": ("FLOAT", {"default": 0.5, "min": -2.0, "max": 100.0, "step": 0.1}), "blur_sigma": ("FLOAT", {"default": 2.0, "min": 0.0, "max": 10.0, "step": 0.1}), "sigma_start": ("FLOAT", {"default": 15.0, "min": 0.0, "max": 1000.0, "step": 0.1, "round": 0.1}), "sigma_end": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1000.0, "step": 0.1, "round": 0.1}), + "auto_scale" : ("BOOLEAN", {"default": False}), }} RETURN_TYPES = ("MODEL",) FUNCTION = "patch" CATEGORY = "model_patches" - def patch(self, model, scale, blur_sigma, sigma_start, sigma_end): + def patch(self, model, scale, blur_sigma, sigma_start, sigma_end, auto_scale): m = model.clone() attn_scores = None @@ -145,7 +157,7 @@ class SelfAttentionGuidanceCustom: sigma = args["sigma"] model_options = args["model_options"] x = args["input"] - if not isinstance(uncond, torch.Tensor): + if uncond_pred is None or uncond is None or uncond_attn is None: return cfg_result if min(cfg_result.shape[2:]) <= 4: #skip when too small to add padding return cfg_result @@ -157,6 +169,15 @@ class SelfAttentionGuidanceCustom: # call into the UNet (sag, _) = comfy.samplers.calc_cond_batch(model, [uncond, None], degraded_noised, sigma, model_options) # comfy.samplers.calc_cond_uncond_batch(model, uncond, None, degraded_noised, sigma, model_options) + + if auto_scale: + denoised_tmp = cfg_result + (degraded - sag) * 8 + for b in range(len(denoised_tmp)): + denoised_ranges = get_denoised_ranges(denoised_tmp[b]) + for c in range(len(denoised_tmp[b])): + fixed_scale = (sag_scale / 10) / denoised_ranges[c] + denoised_tmp[b][c] = cfg_result[b][c] + (degraded[b][c] - sag[b][c]) * fixed_scale + return denoised_tmp return cfg_result + (degraded - sag) * sag_scale @@ -166,4 +187,4 @@ class SelfAttentionGuidanceCustom: # unet.mid_block.attentions[0].transformer_blocks[0].attn1.patch m.set_model_attn1_replace(attn_and_record, "middle", 0, 0) - return (m, ) + return (m, ) \ No newline at end of file diff --git a/presets/A subtle touch.json b/presets/A subtle touch.json new file mode 100644 index 0000000..682379e --- /dev/null +++ b/presets/A subtle touch.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 1000.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 1000.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 1000.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": true, "attention_modifiers_global": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.sin()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "model_options_copy": {"transformer_options": {}}, "attention_modifiers_fake_negative": [], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": false, "cond_exp_method": "attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 1.0, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 1.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": true, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 1.0, "uncond_sigma_start": 15.0} \ No newline at end of file diff --git a/presets/Crossed conds customized 1.json b/presets/Crossed conds customized 1.json new file mode 100644 index 0000000..c278a6f --- /dev/null +++ b/presets/Crossed conds customized 1.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": true, "attention_modifiers_global": [], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7,8", "unet_block_id_middle": "", "unet_block_id_output": "0", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "4", "unet_block_id_middle": "0", "unet_block_id_output": "3", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7,8", "unet_block_id_middle": "", "unet_block_id_output": "0", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "4", "unet_block_id_middle": "0", "unet_block_id_output": "3", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_positive": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7,8", "unet_block_id_middle": "", "unet_block_id_output": "0", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "4", "unet_block_id_middle": "0", "unet_block_id_output": "3", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": true, "cond_exp_method": "subtract_attention_modifiers_input_using_uncond", "cond_exp_normalize": false, "cond_exp_sigma_end": 1.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.3333333333333333, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "cond_pred", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": false, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": true, "uncond_exp_method": "subtract_attention_modifiers_input_using_cond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 1.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 0.3333333333333333, "uncond_sigma_end": 1.0, "uncond_sigma_start": 150.0} \ No newline at end of file diff --git a/presets/Crossed conds customized 2.json b/presets/Crossed conds customized 2.json new file mode 100644 index 0000000..03492d2 --- /dev/null +++ b/presets/Crossed conds customized 2.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": true, "attention_modifiers_global": [], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7,8", "unet_block_id_middle": "", "unet_block_id_output": "0", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "4", "unet_block_id_middle": "0", "unet_block_id_output": "3", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7,8", "unet_block_id_middle": "", "unet_block_id_output": "0", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "4", "unet_block_id_middle": "0", "unet_block_id_output": "3", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_positive": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7,8", "unet_block_id_middle": "", "unet_block_id_output": "0", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "4", "unet_block_id_middle": "0", "unet_block_id_output": "3", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": true, "cond_exp_method": "subtract_attention_modifiers_input_using_uncond", "cond_exp_normalize": false, "cond_exp_sigma_end": 3.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.3333333333333333, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "cond_pred", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": false, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": true, "uncond_exp_method": "subtract_attention_modifiers_input_using_cond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 3.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 0.3333333333333333, "uncond_sigma_end": 1.0, "uncond_sigma_start": 150.0} \ No newline at end of file diff --git a/presets/Crossed conds customized 3.json b/presets/Crossed conds customized 3.json new file mode 100644 index 0000000..cb6df8a --- /dev/null +++ b/presets/Crossed conds customized 3.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": true, "attention_modifiers_global": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn1"}], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_positive": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "k", "unet_block_id_input": "7", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "v", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn1"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": true, "cond_exp_method": "subtract_attention_modifiers_input_using_uncond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 1.0, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "cond_pred", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": false, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": true, "uncond_exp_method": "subtract_attention_modifiers_input_using_cond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 1.0, "uncond_sigma_start": 150.0} \ No newline at end of file diff --git a/presets/Excellent_attention.json b/presets/Excellent_attention.json new file mode 100644 index 0000000..c953aca --- /dev/null +++ b/presets/Excellent_attention.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": false, "attention_modifiers_global": [], "disable_cond": true, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "normalize_tensor(q+(q-attention_basic(attnbc, k, v, extra_options['n_heads'])))*attnbc.norm()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}, {"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn1"}], "attention_modifiers_negative": [], "attention_modifiers_positive": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "normalize_tensor(q+(q-attention_basic(attnbc, k, v, extra_options['n_heads'])))*attnbc.norm()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": true, "cond_exp_method": "attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 1.0, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": true, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1000.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": true, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "amplify", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 0.0, "uncond_sigma_start": 0.0} \ No newline at end of file diff --git a/presets/For magic.json b/presets/For magic.json new file mode 100644 index 0000000..212d64d --- /dev/null +++ b/presets/For magic.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 1000.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 1000.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 1000.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": true, "attention_modifiers_global": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.sin()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "model_options_copy": {"transformer_options": {}}, "attention_modifiers_fake_negative": [], "attention_modifiers_negative": [], "attention_modifiers_positive": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q/2", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": true, "cond_exp_method": "subtract_attention_modifiers_input_using_uncond", "cond_exp_normalize": false, "cond_exp_sigma_end": 1.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.5, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 2.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 1.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": false, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 1.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 1.0, "uncond_sigma_start": 15.0} \ No newline at end of file diff --git a/presets/Kickstart.json b/presets/Kickstart.json new file mode 100644 index 0000000..c9349de --- /dev/null +++ b/presets/Kickstart.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": false, "attention_modifiers_global": [], "disable_cond": true, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [{"sigma_start": 1000, "sigma_end": 7, "self_attn_mod_eval": "attnbc*2", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn1"}, {"sigma_start": 7, "sigma_end": 2, "self_attn_mod_eval": "attnbc*2", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_negative": [], "attention_modifiers_positive": [{"sigma_start": 1000, "sigma_end": 7, "self_attn_mod_eval": "attnbc*2", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn1"}, {"sigma_start": 7, "sigma_end": 2, "self_attn_mod_eval": "attnbc*2", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": true, "cond_exp_method": "attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.3333333333333333, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": true, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1000.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": true, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "amplify", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 0.3333333333333333, "uncond_sigma_end": 0.0, "uncond_sigma_start": 150.0} \ No newline at end of file diff --git a/presets/Mute input layer 8 attn1 and attn2 for uncond.json b/presets/Mute input layer 8 attn1 and attn2 for uncond.json new file mode 100644 index 0000000..dea0994 --- /dev/null +++ b/presets/Mute input layer 8 attn1 and attn2 for uncond.json @@ -0,0 +1,72 @@ +{"lerp_uncond_sigma_start": 15.0, +"lerp_uncond_sigma_end": 1.0, +"subtract_latent_mean": false, +"subtract_latent_mean_sigma_start": 15.0, +"subtract_latent_mean_sigma_end": 1.0, +"latent_intensity_rescale": false, +"latent_intensity_rescale_sigma_start": 15.0, +"latent_intensity_rescale_sigma_end": 3.0, +"ignore_pre_cfg_func": false, +"auto_cfg_topk": 0.25, +"attention_modifiers_global_enabled": false, +"attention_modifiers_global": [], +"disable_cond": false, +"disable_cond_sigma_start": 1000.0, +"disable_cond_sigma_end": 0.0, +"kwargs": {}, +"attention_modifiers_fake_negative": [{"sigma_start": 1000, +"sigma_end": 0, +"self_attn_mod_eval": "torch.zeros_like(q)", +"unet_block_id_input": "8", +"unet_block_id_middle": "", +"unet_block_id_output": "", +"unet_attn": "attn1"}, +{"sigma_start": 1000, +"sigma_end": 0, +"self_attn_mod_eval": "torch.zeros_like(q)", +"unet_block_id_input": "8", +"unet_block_id_middle": "", +"unet_block_id_output": "", +"unet_attn": "attn2"}], +"attention_modifiers_negative": [], +"attention_modifiers_positive": [], +"auto_cfg_ref": 8.0, +"automatic_cfg": "hard", +"cond_exp": false, +"cond_exp_method": "attention_modifiers_input_using_cond", +"cond_exp_normalize": false, +"cond_exp_sigma_end": 0.0, +"cond_exp_sigma_start": 1000.0, +"cond_exp_value": 0.3333333333333333, +"eval_string_cond": "", +"eval_string_fake": "", +"eval_string_uncond": "", +"fake_uncond_exp": true, +"fake_uncond_exp_method": "attention_modifiers_input_using_uncond", +"fake_uncond_exp_normalize": false, +"fake_uncond_exp_value": 1000.0, +"fake_uncond_multiplier": 1, +"fake_uncond_sigma_end": 0.0, +"fake_uncond_sigma_start": 1000.0, +"fake_uncond_start": true, +"latent_intensity_rescale_cfg": 8.0, +"latent_intensity_rescale_method": "hard", +"lerp_uncond": false, +"lerp_uncond_strength": 2.0, +"not_in_filter": ["self", +"model", +"args", +"args_filter", +"save_as_preset", +"preset_name", +"model_options_copy", +"eval_string"], +"skip_uncond": true, +"uncond_exp": false, +"uncond_exp_method": "amplify", +"uncond_exp_normalize": false, +"uncond_exp_sigma_end": 0.0, +"uncond_exp_sigma_start": 1000.0, +"uncond_exp_value": 0.3333333333333333, +"uncond_sigma_end": 0.0, +"uncond_sigma_start": 0.0} \ No newline at end of file diff --git a/presets/Mute input layer 8 attn1 for uncond.json b/presets/Mute input layer 8 attn1 for uncond.json new file mode 100644 index 0000000..1639757 --- /dev/null +++ b/presets/Mute input layer 8 attn1 for uncond.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": false, "attention_modifiers_global": [], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn1"}], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": false, "cond_exp_method": "attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.3333333333333333, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": true, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1000.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": true, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "amplify", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 0.3333333333333333, "uncond_sigma_end": 0.0, "uncond_sigma_start": 0.0} \ No newline at end of file diff --git a/presets/Mute input layer 8 attn2 for uncond.json b/presets/Mute input layer 8 attn2 for uncond.json new file mode 100644 index 0000000..1c4f831 --- /dev/null +++ b/presets/Mute input layer 8 attn2 for uncond.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": false, "attention_modifiers_global": [], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [{"sigma_start": 1000, "sigma_end": 0, "self_attn_mod_eval": "torch.zeros_like(q)", "unet_block_id_input": "8", "unet_block_id_middle": "", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": false, "cond_exp_method": "attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.3333333333333333, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": true, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1000.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": true, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "amplify", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 0.3333333333333333, "uncond_sigma_end": 0.0, "uncond_sigma_start": 0.0} \ No newline at end of file diff --git a/presets/Original automatic CFG (new version).json b/presets/Original automatic CFG (new version).json new file mode 100644 index 0000000..bad049f --- /dev/null +++ b/presets/Original automatic CFG (new version).json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": false, "attention_modifiers_global": [], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": false, "cond_exp_method": "subtract_attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 1.0, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": false, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 0.0, "uncond_sigma_start": 150.0} \ No newline at end of file diff --git a/presets/Original automatic CFG (old version).json b/presets/Original automatic CFG (old version).json new file mode 100644 index 0000000..04f8851 --- /dev/null +++ b/presets/Original automatic CFG (old version).json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": false, "attention_modifiers_global": [], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "soft", "cond_exp": false, "cond_exp_method": "subtract_attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 1.0, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": false, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 0.0, "uncond_sigma_start": 150.0} \ No newline at end of file diff --git a/presets/Potato Attention Guidance.json b/presets/Potato Attention Guidance.json new file mode 100644 index 0000000..e25d4c6 --- /dev/null +++ b/presets/Potato Attention Guidance.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 1000.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 1000.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 1000.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": true, "attention_modifiers_global": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q*k*v", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn1"}], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": false, "cond_exp_method": "subtract_attention_modifiers_input_using_uncond", "cond_exp_normalize": false, "cond_exp_sigma_end": 1.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.5, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 2.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": true, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 1.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 0.0, "uncond_sigma_end": 1.0, "uncond_sigma_start": 15.0} \ No newline at end of file diff --git a/presets/Quack expert.json b/presets/Quack expert.json new file mode 100644 index 0000000..59d00e2 --- /dev/null +++ b/presets/Quack expert.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 1000.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 1000.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 1000.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": true, "attention_modifiers_global": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.abs().exp()*q.sign()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "model_options_copy": {"transformer_options": {}}, "attention_modifiers_fake_negative": [], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": false, "cond_exp_method": "subtract_attention_modifiers_input_using_uncond", "cond_exp_normalize": false, "cond_exp_sigma_end": 1.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.5, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 2.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 1.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": false, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 1.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 1.0, "uncond_sigma_start": 15.0} \ No newline at end of file diff --git a/presets/Quack expertNegative.json b/presets/Quack expertNegative.json new file mode 100644 index 0000000..f7f22f1 --- /dev/null +++ b/presets/Quack expertNegative.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 1000.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 1000.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 1000.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": false, "attention_modifiers_global": [], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "model_options_copy": {"transformer_options": {}}, "attention_modifiers_fake_negative": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.abs().exp()*q.sign()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": false, "cond_exp_method": "subtract_attention_modifiers_input_using_uncond", "cond_exp_normalize": false, "cond_exp_sigma_end": 1.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 0.5, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": true, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 2.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": true, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 1.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 0.0, "uncond_sigma_end": 0.0, "uncond_sigma_start": 0.0} \ No newline at end of file diff --git a/presets/The red riding latent.json b/presets/The red riding latent.json new file mode 100644 index 0000000..55e3802 --- /dev/null +++ b/presets/The red riding latent.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 1000.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 1000.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 1000.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": true, "attention_modifiers_global": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.abs().exp()*q.sign()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}], "disable_cond": true, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "model_options_copy": {"transformer_options": {}}, "attention_modifiers_fake_negative": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.abs().exp()*q.sign()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q", "unet_block_id_input": "", "unet_block_id_middle": "", "unet_block_id_output": "2,7", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.abs().exp()*q.sign()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q/2", "unet_block_id_input": "", "unet_block_id_middle": "", "unet_block_id_output": "8", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "v/2", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn1"}], "attention_modifiers_negative": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "v.abs().exp()*v.sign()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn1"}], "attention_modifiers_positive": [{"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.abs().exp()*q.sign()", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 3, "self_attn_mod_eval": "q.sign()", "unet_block_id_input": "", "unet_block_id_middle": "", "unet_block_id_output": "1", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q", "unet_block_id_input": "5,7", "unet_block_id_middle": "", "unet_block_id_output": "2", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q.abs().exp()*q.sign()", "unet_block_id_input": "", "unet_block_id_middle": "", "unet_block_id_output": "4", "unet_attn": "attn2"}, {"sigma_start": 15, "sigma_end": 0, "self_attn_mod_eval": "q/2", "unet_block_id_input": "", "unet_block_id_middle": "0", "unet_block_id_output": "7", "unet_attn": "attn2"}], "auto_cfg_ref": 8.0, "automatic_cfg": "hard", "cond_exp": true, "cond_exp_method": "attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 1.0, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": true, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 1.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": true, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 0.0, "uncond_sigma_start": 0.0} \ No newline at end of file diff --git a/presets/everything_turned_off.json b/presets/everything_turned_off.json new file mode 100644 index 0000000..309257c --- /dev/null +++ b/presets/everything_turned_off.json @@ -0,0 +1 @@ +{"lerp_uncond_sigma_start": 15.0, "lerp_uncond_sigma_end": 1.0, "subtract_latent_mean": false, "subtract_latent_mean_sigma_start": 15.0, "subtract_latent_mean_sigma_end": 1.0, "latent_intensity_rescale": false, "latent_intensity_rescale_sigma_start": 15.0, "latent_intensity_rescale_sigma_end": 3.0, "ignore_pre_cfg_func": false, "auto_cfg_topk": 0.25, "attention_modifiers_global_enabled": false, "attention_modifiers_global": [], "disable_cond": false, "disable_cond_sigma_start": 1000.0, "disable_cond_sigma_end": 0.0, "kwargs": {}, "attention_modifiers_fake_negative": [], "attention_modifiers_negative": [], "attention_modifiers_positive": [], "auto_cfg_ref": 8.0, "automatic_cfg": "None", "cond_exp": false, "cond_exp_method": "subtract_attention_modifiers_input_using_cond", "cond_exp_normalize": false, "cond_exp_sigma_end": 0.0, "cond_exp_sigma_start": 1000.0, "cond_exp_value": 1.0, "eval_string_cond": "", "eval_string_fake": "", "eval_string_uncond": "", "fake_uncond_exp": false, "fake_uncond_exp_method": "attention_modifiers_input_using_uncond", "fake_uncond_exp_normalize": false, "fake_uncond_exp_value": 1.0, "fake_uncond_multiplier": 1, "fake_uncond_sigma_end": 0.0, "fake_uncond_sigma_start": 1000.0, "fake_uncond_start": false, "latent_intensity_rescale_cfg": 8.0, "latent_intensity_rescale_method": "hard", "lerp_uncond": false, "lerp_uncond_strength": 2.0, "not_in_filter": ["self", "model", "args", "args_filter", "save_as_preset", "preset_name", "model_options_copy", "eval_string"], "skip_uncond": true, "uncond_exp": false, "uncond_exp_method": "subtract_attention_modifiers_input_using_uncond", "uncond_exp_normalize": false, "uncond_exp_sigma_end": 0.0, "uncond_exp_sigma_start": 1000.0, "uncond_exp_value": 1.0, "uncond_sigma_end": 0.0, "uncond_sigma_start": 150.0} \ No newline at end of file