From 07a3df6001a261df6d573aeef99e4ee00970f8c6 Mon Sep 17 00:00:00 2001 From: Ben Alkov Date: Sat, 15 Oct 2022 17:09:47 -0400 Subject: [PATCH 001/124] DRAFT: Cross-Attention Control Signed-off-by: Ben Alkov --- c_a_c.py | 177 ++++++++++++++++++++++++++++++++++++++ cross_attention_loop.py | 185 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 362 insertions(+) create mode 100644 c_a_c.py create mode 100644 cross_attention_loop.py diff --git a/c_a_c.py b/c_a_c.py new file mode 100644 index 0000000000..33243edaf7 --- /dev/null +++ b/c_a_c.py @@ -0,0 +1,177 @@ +# Functions supporting Cross-Attention Control +# Copied from https://github.com/bloc97/CrossAttentionControl + +from difflib import SequenceMatcher + +import torch + + +def prompt_token(prompt, index, clip_tokenizer): + tokens = clip_tokenizer(prompt, + padding='max_length', + max_length=clip_tokenizer.model_max_length, + truncation=True, + return_tensors='pt', + return_overflowing_tokens=True + ).input_ids[0] + return clip_tokenizer.decode(tokens[index:index+1]) + + +def init_attention_weights(weight_tuples, clip_tokenizer, unet, device): + tokens_length = clip_tokenizer.model_max_length + weights = torch.ones(tokens_length) + + for i, w in weight_tuples: + if i < tokens_length and i >= 0: + weights[i] = w + + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn2' in name: + module.last_attn_slice_weights = weights.to(device) + if module_name == 'CrossAttention' and 'attn1' in name: + module.last_attn_slice_weights = None + + +def init_attention_edit(tokens, tokens_edit, clip_tokenizer, unet, device): + tokens_length = clip_tokenizer.model_max_length + mask = torch.zeros(tokens_length) + indices_target = torch.arange(tokens_length, dtype=torch.long) + indices = torch.zeros(tokens_length, dtype=torch.long) + + tokens = tokens.input_ids.numpy()[0] + tokens_edit = tokens_edit.input_ids.numpy()[0] + + for name, a0, a1, b0, b1 in SequenceMatcher(None, tokens, tokens_edit).get_opcodes(): + if b0 < tokens_length: + if name == 'equal' or (name == 'replace' and a1-a0 == b1-b0): + mask[b0:b1] = 1 + indices[b0:b1] = indices_target[a0:a1] + + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn2' in name: + module.last_attn_slice_mask = mask.to(device) + module.last_attn_slice_indices = indices.to(device) + if module_name == 'CrossAttention' and 'attn1' in name: + module.last_attn_slice_mask = None + module.last_attn_slice_indices = None + + +def init_attention_func(unet): + # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 + def new_attention(self, query, key, value): + # TODO: use baddbmm for better performance + attention_scores = torch.matmul(query, key.transpose(-1, -2)) * self.scale + attn_slice = attention_scores.softmax(dim=-1) + # compute attention output + + if self.use_last_attn_slice: + if self.last_attn_slice_mask is not None: + new_attn_slice = (torch.index_select(self.last_attn_slice, -1, + self.last_attn_slice_indices)) + attn_slice = (attn_slice * (1 - self.last_attn_slice_mask) + + new_attn_slice * self.last_attn_slice_mask) + else: + attn_slice = self.last_attn_slice + + self.use_last_attn_slice = False + + if self.save_last_attn_slice: + self.last_attn_slice = attn_slice + self.save_last_attn_slice = False + + if self.use_last_attn_weights and self.last_attn_slice_weights is not None: + attn_slice = attn_slice * self.last_attn_slice_weights + self.use_last_attn_weights = False + + hidden_states = torch.matmul(attn_slice, value) + # reshape hidden_states + return self.reshape_batch_dim_to_heads(hidden_states) + + def new_sliced_attention(self, query, key, value, sequence_length, dim): + + batch_size_attention = query.shape[0] + hidden_states = torch.zeros( + (batch_size_attention, sequence_length, dim // self.heads), + device=query.device, dtype=query.dtype + ) + slice_size = self._slice_size if self._slice_size is not None else hidden_states.shape[0] + for i in range(hidden_states.shape[0] // slice_size): + start_idx = i * slice_size + end_idx = (i + 1) * slice_size + attn_slice = ( + torch.matmul(query[start_idx:end_idx], + key[start_idx:end_idx].transpose(1, 2)) * self.scale + ) # TODO: use baddbmm for better performance + attn_slice = attn_slice.softmax(dim=-1) + + if self.use_last_attn_slice: + if self.last_attn_slice_mask is not None: + new_attn_slice = (torch.index_select(self.last_attn_slice, + -1, self.last_attn_slice_indices)) + attn_slice = (attn_slice * (1 - self.last_attn_slice_mask) + + new_attn_slice * self.last_attn_slice_mask) + else: + attn_slice = self.last_attn_slice + + self.use_last_attn_slice = False + + if self.save_last_attn_slice: + self.last_attn_slice = attn_slice + self.save_last_attn_slice = False + + if self.use_last_attn_weights and self.last_attn_slice_weights is not None: + attn_slice = attn_slice * self.last_attn_slice_weights + self.use_last_attn_weights = False + + attn_slice = torch.matmul(attn_slice, value[start_idx:end_idx]) + + hidden_states[start_idx:end_idx] = attn_slice + + return self.reshape_batch_dim_to_heads(hidden_states) # reshape hidden_states + + for _, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention': + module.last_attn_slice = None + module.use_last_attn_slice = False + module.use_last_attn_weights = False + module.save_last_attn_slice = False + module._sliced_attention = new_sliced_attention.__get__(module, type(module)) + module._attention = new_attention.__get__(module, type(module)) + + +def use_last_tokens_attention(unet, use=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn2' in name: + module.use_last_attn_slice = use + + +def use_last_tokens_attention_weights(unet, use=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn2' in name: + module.use_last_attn_weights = use + + +def use_last_self_attention(unet, use=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn1' in name: + module.use_last_attn_slice = use + + +def save_last_tokens_attention(unet, save=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn2' in name: + module.save_last_attn_slice = save + + +def save_last_self_attention(unet, save=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn1' in name: + module.save_last_attn_slice = save diff --git a/cross_attention_loop.py b/cross_attention_loop.py new file mode 100644 index 0000000000..e2d6eb6201 --- /dev/null +++ b/cross_attention_loop.py @@ -0,0 +1,185 @@ +import random + +import numpy as np +import torch + +from diffusers import (LMSDiscreteScheduler) +from PIL import Image +from torch import autocast +from tqdm.auto import tqdm + +import c_a_c + + +@torch.no_grad() +def stablediffusion( + clip, + clip_tokenizer, + device, + vae, + unet, + prompt='', + prompt_edit=None, + prompt_edit_token_weights=None, + prompt_edit_tokens_start=0.0, + prompt_edit_tokens_end=1.0, + prompt_edit_spatial_start=0.0, + prompt_edit_spatial_end=1.0, + guidance_scale=7.5, + steps=50, + seed=None, + width=512, + height=512, + init_image=None, + init_image_strength=0.5, + ): + if prompt_edit_token_weights is None: + prompt_edit_token_weights = [] + # Change size to multiple of 64 to prevent size mismatches inside model + width = width - width % 64 + height = height - height % 64 + + # If seed is None, randomly select seed from 0 to 2^32-1 + if seed is None: seed = random.randrange(2**32 - 1) + generator = torch.cuda.manual_seed(seed) + + # Set inference timesteps to scheduler + scheduler = LMSDiscreteScheduler(beta_start=0.00085, + beta_end=0.012, + beta_schedule='scaled_linear', + num_train_timesteps=1000, + ) + scheduler.set_timesteps(steps) + + # Preprocess image if it exists (img2img) + if init_image is not None: + # Resize and transpose for numpy b h w c -> torch b c h w + init_image = init_image.resize((width, height), resample=Image.Resampling.LANCZOS) + init_image = np.array(init_image).astype(np.float32) / 255.0 * 2.0 - 1.0 + init_image = torch.from_numpy(init_image[np.newaxis, ...].transpose(0, 3, 1, 2)) + + # If there is alpha channel, composite alpha for white, as the diffusion + # model does not support alpha channel + if init_image.shape[1] > 3: + init_image = init_image[:, :3] * init_image[:, 3:] + (1 - init_image[:, 3:]) + + # Move image to GPU + init_image = init_image.to(device) + + # Encode image + with autocast(device): + init_latent = (vae.encode(init_image) + .latent_dist + .sample(generator=generator) + * 0.18215) + + t_start = steps - int(steps * init_image_strength) + + else: + init_latent = torch.zeros((1, unet.in_channels, height // 8, width // 8), + device=device) + t_start = 0 + + # Generate random normal noise + noise = torch.randn(init_latent.shape, generator=generator, device=device) + latent = scheduler.add_noise(init_latent, + noise, + torch.tensor([scheduler.timesteps[t_start]], device=device) + ).to(device) + + # Process clip + with autocast(device): + tokens_uncond = clip_tokenizer('', padding='max_length', + max_length=clip_tokenizer.model_max_length, + truncation=True, return_tensors='pt', + return_overflowing_tokens=True + ) + embedding_uncond = clip(tokens_uncond.input_ids.to(device)).last_hidden_state + + tokens_cond = clip_tokenizer(prompt, padding='max_length', + max_length=clip_tokenizer.model_max_length, + truncation=True, return_tensors='pt', + return_overflowing_tokens=True + ) + embedding_cond = clip(tokens_cond.input_ids.to(device)).last_hidden_state + + # Process prompt editing + if prompt_edit is not None: + tokens_cond_edit = clip_tokenizer(prompt_edit, padding='max_length', + max_length=clip_tokenizer.model_max_length, + truncation=True, return_tensors='pt', + return_overflowing_tokens=True + ) + embedding_cond_edit = clip(tokens_cond_edit.input_ids.to(device)).last_hidden_state + + c_a_c.init_attention_edit(tokens_cond, tokens_cond_edit) + + c_a_c.init_attention_func() + c_a_c.init_attention_weights(prompt_edit_token_weights) + + timesteps = scheduler.timesteps[t_start:] + + for idx, timestep in tqdm(enumerate(timesteps), total=len(timesteps)): + t_index = t_start + idx + + latent_model_input = latent + latent_model_input = scheduler.scale_model_input(latent_model_input, timestep) + + # Predict the unconditional noise residual + noise_pred_uncond = unet(latent_model_input, + timestep, + encoder_hidden_states=embedding_uncond + ).sample + + # Prepare the Cross-Attention layers + if prompt_edit is not None: + c_a_c.save_last_tokens_attention() + c_a_c.save_last_self_attention() + else: + # Use weights on non-edited prompt when edit is None + c_a_c.use_last_tokens_attention_weights() + + # Predict the conditional noise residual and save the + # cross-attention layer activations + noise_pred_cond = unet(latent_model_input, + timestep, + encoder_hidden_states=embedding_cond + ).sample + + # Edit the Cross-Attention layer activations + if prompt_edit is not None: + t_scale = timestep / scheduler.num_train_timesteps + if (t_scale >= prompt_edit_tokens_start + and t_scale <= prompt_edit_tokens_end): + c_a_c.use_last_tokens_attention() + if (t_scale >= prompt_edit_spatial_start + and t_scale <= prompt_edit_spatial_end): + c_a_c.use_last_self_attention() + + # Use weights on edited prompt + c_a_c.use_last_tokens_attention_weights() + + # Predict the edited conditional noise residual using the + # cross-attention masks + noise_pred_cond = unet(latent_model_input, + timestep, + encoder_hidden_states=embedding_cond_edit + ).sample + + # Perform guidance + noise_pred = (noise_pred_uncond + guidance_scale + * (noise_pred_cond - noise_pred_uncond)) + + latent = scheduler.step(noise_pred, + t_index, + latent + ).prev_sample + + # scale and decode the image latents with vae + latent = latent / 0.18215 + image = vae.decode(latent.to(vae.dtype)).sample + + image = (image / 2 + 0.5).clamp(0, 1) + image = image.cpu().permute(0, 2, 3, 1).numpy() + image = (image[0] * 255).round().astype('uint8') + return Image.fromarray(image) From b0b19939183c58e2a502aafad4bceddcc33575fe Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Wed, 12 Oct 2022 23:29:48 +0200 Subject: [PATCH 002/124] initial experiments --- ldm/models/diffusion/ksampler.py | 16 ++++++++++++++++ ldm/models/diffusion/sampler.py | 5 +++++ 2 files changed, 21 insertions(+) diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index ac0615b30c..55800d0a5c 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -1,4 +1,6 @@ """wrapper around part of Katherine Crowson's k-diffusion library, making it call compatible with other Samplers""" +from enum import Enum + import k_diffusion as K import torch import torch.nn as nn @@ -25,6 +27,9 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): minval = max(min(-1, scale*minval), -threshold) return torch.clamp(result, min=minval, max=maxval) +class AttentionLayer(Enum): + SELF = 1 + TOKENS = 2 class CFGDenoiser(nn.Module): def __init__(self, model, threshold = 0, warmup = 0): @@ -34,11 +39,22 @@ class CFGDenoiser(nn.Module): self.warmup_max = warmup self.warmup = max(warmup / 10, 1) + + def get_attention_module(self, which: AttentionLayer): + which_attn = "attn1" if which is AttentionLayer.SELF else "attn2" + module = next(module for name,module in self.inner_model.named_modules() if + type(module).__name__ == "CrossAttention" and which_attn in name) + return module + + def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) cond_in = torch.cat([uncond, cond]) uncond, cond = self.inner_model(x_in, sigma_in, cond=cond_in).chunk(2) + + module = self.get_attention_module(AttentionLayer.TOKENS) + if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) self.warmup += 1 diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index ff705513f8..eb7caebba0 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -4,6 +4,8 @@ ldm.models.diffusion.sampler Base class for ldm.models.diffusion.ddim, ldm.models.diffusion.ksampler, etc ''' +from enum import Enum + import torch import numpy as np from tqdm import tqdm @@ -411,3 +413,6 @@ class Sampler(object): return self.model.inner_model.q_sample(x0,ts) ''' return self.model.q_sample(x0,ts) + + + From 33d6603fef4839f7627eb817181c1cb59bb3b838 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 16 Oct 2022 16:57:48 +0200 Subject: [PATCH 003/124] cleanup initial experiments --- ldm/models/diffusion/cross_attention.py | 19 +++++++++++++++++++ ldm/models/diffusion/ksampler.py | 10 ---------- 2 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 ldm/models/diffusion/cross_attention.py diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/cross_attention.py new file mode 100644 index 0000000000..c39d8d5959 --- /dev/null +++ b/ldm/models/diffusion/cross_attention.py @@ -0,0 +1,19 @@ +from enum import Enum + + +class CrossAttention: + + class AttentionType(Enum): + SELF = 1 + TOKENS = 2 + + @classmethod + def get_attention_module(cls, model, which: AttentionType): + which_attn = "attn1" if which is cls.AttentionType.SELF else "attn2" + module = next(module for name, module in model.named_modules() if + type(module).__name__ == "CrossAttention" and which_attn in name) + return module + + @classmethod + def inject_attention_mask_capture(cls, model, callback): + pass \ No newline at end of file diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 55800d0a5c..8010b44d1d 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -27,9 +27,6 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): minval = max(min(-1, scale*minval), -threshold) return torch.clamp(result, min=minval, max=maxval) -class AttentionLayer(Enum): - SELF = 1 - TOKENS = 2 class CFGDenoiser(nn.Module): def __init__(self, model, threshold = 0, warmup = 0): @@ -40,13 +37,6 @@ class CFGDenoiser(nn.Module): self.warmup = max(warmup / 10, 1) - def get_attention_module(self, which: AttentionLayer): - which_attn = "attn1" if which is AttentionLayer.SELF else "attn2" - module = next(module for name,module in self.inner_model.named_modules() if - type(module).__name__ == "CrossAttention" and which_attn in name) - return module - - def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) From 8ff507b03b9c958ff7c68bc48a5f0e03b5a47706 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 16 Oct 2022 20:39:47 +0200 Subject: [PATCH 004/124] runs but doesn't work properly - see below for test prompt test prompt: "a cat sitting on a car {a dog sitting on a car}" -W 384 -H 256 -s 10 -S 12346 -A k_euler note that substition of dog for cat is currently hard-coded (ksampler.py line 43-44) --- c_a_c.py | 177 ------------------------ cross_attention_loop.py | 5 +- ldm/generate.py | 12 +- ldm/invoke/conditioning.py | 16 ++- ldm/invoke/generator/txt2img.py | 3 +- ldm/models/diffusion/cross_attention.py | 149 +++++++++++++++++++- ldm/models/diffusion/ksampler.py | 33 ++++- ldm/modules/attention.py | 11 +- 8 files changed, 207 insertions(+), 199 deletions(-) delete mode 100644 c_a_c.py diff --git a/c_a_c.py b/c_a_c.py deleted file mode 100644 index 33243edaf7..0000000000 --- a/c_a_c.py +++ /dev/null @@ -1,177 +0,0 @@ -# Functions supporting Cross-Attention Control -# Copied from https://github.com/bloc97/CrossAttentionControl - -from difflib import SequenceMatcher - -import torch - - -def prompt_token(prompt, index, clip_tokenizer): - tokens = clip_tokenizer(prompt, - padding='max_length', - max_length=clip_tokenizer.model_max_length, - truncation=True, - return_tensors='pt', - return_overflowing_tokens=True - ).input_ids[0] - return clip_tokenizer.decode(tokens[index:index+1]) - - -def init_attention_weights(weight_tuples, clip_tokenizer, unet, device): - tokens_length = clip_tokenizer.model_max_length - weights = torch.ones(tokens_length) - - for i, w in weight_tuples: - if i < tokens_length and i >= 0: - weights[i] = w - - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn2' in name: - module.last_attn_slice_weights = weights.to(device) - if module_name == 'CrossAttention' and 'attn1' in name: - module.last_attn_slice_weights = None - - -def init_attention_edit(tokens, tokens_edit, clip_tokenizer, unet, device): - tokens_length = clip_tokenizer.model_max_length - mask = torch.zeros(tokens_length) - indices_target = torch.arange(tokens_length, dtype=torch.long) - indices = torch.zeros(tokens_length, dtype=torch.long) - - tokens = tokens.input_ids.numpy()[0] - tokens_edit = tokens_edit.input_ids.numpy()[0] - - for name, a0, a1, b0, b1 in SequenceMatcher(None, tokens, tokens_edit).get_opcodes(): - if b0 < tokens_length: - if name == 'equal' or (name == 'replace' and a1-a0 == b1-b0): - mask[b0:b1] = 1 - indices[b0:b1] = indices_target[a0:a1] - - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn2' in name: - module.last_attn_slice_mask = mask.to(device) - module.last_attn_slice_indices = indices.to(device) - if module_name == 'CrossAttention' and 'attn1' in name: - module.last_attn_slice_mask = None - module.last_attn_slice_indices = None - - -def init_attention_func(unet): - # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 - def new_attention(self, query, key, value): - # TODO: use baddbmm for better performance - attention_scores = torch.matmul(query, key.transpose(-1, -2)) * self.scale - attn_slice = attention_scores.softmax(dim=-1) - # compute attention output - - if self.use_last_attn_slice: - if self.last_attn_slice_mask is not None: - new_attn_slice = (torch.index_select(self.last_attn_slice, -1, - self.last_attn_slice_indices)) - attn_slice = (attn_slice * (1 - self.last_attn_slice_mask) - + new_attn_slice * self.last_attn_slice_mask) - else: - attn_slice = self.last_attn_slice - - self.use_last_attn_slice = False - - if self.save_last_attn_slice: - self.last_attn_slice = attn_slice - self.save_last_attn_slice = False - - if self.use_last_attn_weights and self.last_attn_slice_weights is not None: - attn_slice = attn_slice * self.last_attn_slice_weights - self.use_last_attn_weights = False - - hidden_states = torch.matmul(attn_slice, value) - # reshape hidden_states - return self.reshape_batch_dim_to_heads(hidden_states) - - def new_sliced_attention(self, query, key, value, sequence_length, dim): - - batch_size_attention = query.shape[0] - hidden_states = torch.zeros( - (batch_size_attention, sequence_length, dim // self.heads), - device=query.device, dtype=query.dtype - ) - slice_size = self._slice_size if self._slice_size is not None else hidden_states.shape[0] - for i in range(hidden_states.shape[0] // slice_size): - start_idx = i * slice_size - end_idx = (i + 1) * slice_size - attn_slice = ( - torch.matmul(query[start_idx:end_idx], - key[start_idx:end_idx].transpose(1, 2)) * self.scale - ) # TODO: use baddbmm for better performance - attn_slice = attn_slice.softmax(dim=-1) - - if self.use_last_attn_slice: - if self.last_attn_slice_mask is not None: - new_attn_slice = (torch.index_select(self.last_attn_slice, - -1, self.last_attn_slice_indices)) - attn_slice = (attn_slice * (1 - self.last_attn_slice_mask) - + new_attn_slice * self.last_attn_slice_mask) - else: - attn_slice = self.last_attn_slice - - self.use_last_attn_slice = False - - if self.save_last_attn_slice: - self.last_attn_slice = attn_slice - self.save_last_attn_slice = False - - if self.use_last_attn_weights and self.last_attn_slice_weights is not None: - attn_slice = attn_slice * self.last_attn_slice_weights - self.use_last_attn_weights = False - - attn_slice = torch.matmul(attn_slice, value[start_idx:end_idx]) - - hidden_states[start_idx:end_idx] = attn_slice - - return self.reshape_batch_dim_to_heads(hidden_states) # reshape hidden_states - - for _, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention': - module.last_attn_slice = None - module.use_last_attn_slice = False - module.use_last_attn_weights = False - module.save_last_attn_slice = False - module._sliced_attention = new_sliced_attention.__get__(module, type(module)) - module._attention = new_attention.__get__(module, type(module)) - - -def use_last_tokens_attention(unet, use=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn2' in name: - module.use_last_attn_slice = use - - -def use_last_tokens_attention_weights(unet, use=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn2' in name: - module.use_last_attn_weights = use - - -def use_last_self_attention(unet, use=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn1' in name: - module.use_last_attn_slice = use - - -def save_last_tokens_attention(unet, save=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn2' in name: - module.save_last_attn_slice = save - - -def save_last_self_attention(unet, save=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn1' in name: - module.save_last_attn_slice = save diff --git a/cross_attention_loop.py b/cross_attention_loop.py index e2d6eb6201..ed3e3b0462 100644 --- a/cross_attention_loop.py +++ b/cross_attention_loop.py @@ -1,4 +1,5 @@ import random +import traceback import numpy as np import torch @@ -8,7 +9,7 @@ from PIL import Image from torch import autocast from tqdm.auto import tqdm -import c_a_c +import .ldm.models.diffusion.cross_attention @torch.no_grad() @@ -41,7 +42,7 @@ def stablediffusion( # If seed is None, randomly select seed from 0 to 2^32-1 if seed is None: seed = random.randrange(2**32 - 1) - generator = torch.cuda.manual_seed(seed) + generator = torch.manual_seed(seed) # Set inference timesteps to scheduler scheduler = LMSDiscreteScheduler(beta_start=0.00085, diff --git a/ldm/generate.py b/ldm/generate.py index 7fb68dec0a..b8945342b0 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -32,7 +32,7 @@ from ldm.invoke.pngwriter import PngWriter from ldm.invoke.args import metadata_from_png from ldm.invoke.image_util import InitImageResizer from ldm.invoke.devices import choose_torch_device, choose_precision -from ldm.invoke.conditioning import get_uc_and_c +from ldm.invoke.conditioning import get_uc_and_c_and_ec from ldm.invoke.model_cache import ModelCache from ldm.invoke.seamless import configure_model_padding from ldm.invoke.txt2mask import Txt2Mask, SegmentedGrayscale @@ -400,7 +400,7 @@ class Generate: mask_image = None try: - uc, c = get_uc_and_c( + uc, c, ec = get_uc_and_c_and_ec( prompt, model =self.model, skip_normalize=skip_normalize, log_tokens =self.log_tokenization @@ -438,7 +438,7 @@ class Generate: sampler=self.sampler, steps=steps, cfg_scale=cfg_scale, - conditioning=(uc, c), + conditioning=(uc, c, ec), ddim_eta=ddim_eta, image_callback=image_callback, # called after the final image is generated step_callback=step_callback, # called after each intermediate image is generated @@ -469,14 +469,14 @@ class Generate: save_original = save_original, image_callback = image_callback) - except RuntimeError as e: - print(traceback.format_exc(), file=sys.stderr) - print('>> Could not generate image.') except KeyboardInterrupt: if catch_interrupts: print('**Interrupted** Partial results will be returned.') else: raise KeyboardInterrupt + except (RuntimeError, Exception) as e: + print(traceback.format_exc(), file=sys.stderr) + print('>> Could not generate image.') toc = time.time() print('>> Usage stats:') diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index fedd965a2c..1453d9ce8c 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -12,7 +12,7 @@ log_tokenization() print out colour-coded tokens and warn if trunca import re import torch -def get_uc_and_c(prompt, model, log_tokens=False, skip_normalize=False): +def get_uc_and_c_and_ec(prompt, model, log_tokens=False, skip_normalize=False): # Extract Unconditioned Words From Prompt unconditioned_words = '' unconditional_regex = r'\[(.*?)\]' @@ -26,7 +26,19 @@ def get_uc_and_c(prompt, model, log_tokens=False, skip_normalize=False): clean_prompt = unconditional_regex_compile.sub(' ', prompt) prompt = re.sub(' +', ' ', clean_prompt) + edited_words = None + edited_regex = r'\{(.*?)\}' + edited = re.findall(edited_regex, prompt) + if len(edited) > 0: + edited_words = ' '.join(edited) + edited_regex_compile = re.compile(edited_regex) + clean_prompt = edited_regex_compile.sub(' ', prompt) + prompt = re.sub(' +', ' ', clean_prompt) + uc = model.get_learned_conditioning([unconditioned_words]) + ec = None + if edited_words is not None: + ec = model.get_learned_conditioning([edited_words]) # get weighted sub-prompts weighted_subprompts = split_weighted_subprompts( @@ -48,7 +60,7 @@ def get_uc_and_c(prompt, model, log_tokens=False, skip_normalize=False): log_tokenization(prompt, model, log_tokens, 1) c = model.get_learned_conditioning([prompt]) uc = model.get_learned_conditioning([unconditioned_words]) - return (uc, c) + return (uc, c, ec) def split_weighted_subprompts(text, skip_normalize=False)->list: """ diff --git a/ldm/invoke/generator/txt2img.py b/ldm/invoke/generator/txt2img.py index edd12c948c..23f03f22db 100644 --- a/ldm/invoke/generator/txt2img.py +++ b/ldm/invoke/generator/txt2img.py @@ -19,7 +19,7 @@ class Txt2Img(Generator): kwargs are 'width' and 'height' """ self.perlin = perlin - uc, c = conditioning + uc, c, ec = conditioning @torch.no_grad() def make_image(x_T): @@ -43,6 +43,7 @@ class Txt2Img(Generator): verbose = False, unconditional_guidance_scale = cfg_scale, unconditional_conditioning = uc, + edited_conditioning = ec, eta = ddim_eta, img_callback = step_callback, threshold = threshold, diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/cross_attention.py index c39d8d5959..a440eb3e6a 100644 --- a/ldm/models/diffusion/cross_attention.py +++ b/ldm/models/diffusion/cross_attention.py @@ -1,8 +1,8 @@ from enum import Enum +import torch -class CrossAttention: - +class CrossAttentionControl: class AttentionType(Enum): SELF = 1 TOKENS = 2 @@ -15,5 +15,146 @@ class CrossAttention: return module @classmethod - def inject_attention_mask_capture(cls, model, callback): - pass \ No newline at end of file + def setup_attention_editing(cls, model, original_tokens_length: int, + substitute_conditioning: torch.Tensor = None, + token_indices_to_edit: list = None): + + # adapted from init_attention_edit + self_attention_module = cls.get_attention_module(model, cls.AttentionType.SELF) + tokens_attention_module = cls.get_attention_module(model, cls.AttentionType.TOKENS) + + if substitute_conditioning is not None: + + device = substitute_conditioning.device + + # this is not very torch-y + mask = torch.zeros(original_tokens_length) + for i in token_indices_to_edit: + mask[i] = 1 + + self_attention_module.last_attn_slice_mask = None + self_attention_module.last_attn_slice_indices = None + tokens_attention_module.last_attn_slice_mask = mask.to(device) + tokens_attention_module.last_attn_slice_indices = torch.tensor(token_indices_to_edit, device=device) + + cls.inject_attention_functions(model) + + @classmethod + def request_save_attention_maps(cls, model): + self_attention_module = cls.get_attention_module(model, cls.AttentionType.SELF) + tokens_attention_module = cls.get_attention_module(model, cls.AttentionType.TOKENS) + self_attention_module.save_last_attn_slice = True + tokens_attention_module.save_last_attn_slice = True + + @classmethod + def request_apply_saved_attention_maps(cls, model): + self_attention_module = cls.get_attention_module(model, cls.AttentionType.SELF) + tokens_attention_module = cls.get_attention_module(model, cls.AttentionType.TOKENS) + self_attention_module.use_last_attn_slice = True + tokens_attention_module.use_last_attn_slice = True + + @classmethod + def inject_attention_functions(cls, unet): + # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 + def new_attention(self, query, key, value): + # TODO: use baddbmm for better performance + print(f"entered new_attention") + attention_scores = torch.matmul(query, key.transpose(-1, -2)) * self.scale + attn_slice = attention_scores.softmax(dim=-1) + # compute attention output + + if self.use_last_attn_slice: + if self.last_attn_slice_mask is not None: + print('using masked last_attn_slice') + + new_attn_slice = (torch.index_select(self.last_attn_slice, -1, + self.last_attn_slice_indices)) + attn_slice = (attn_slice * (1 - self.last_attn_slice_mask) + + new_attn_slice * self.last_attn_slice_mask) + else: + print('using unmasked last_attn_slice') + attn_slice = self.last_attn_slice + + self.use_last_attn_slice = False + else: + print('not using last_attn_slice') + + if self.save_last_attn_slice: + print('saving last_attn_slice') + self.last_attn_slice = attn_slice + self.save_last_attn_slice = False + else: + print('not saving last_attn_slice') + + if self.use_last_attn_weights and self.last_attn_slice_weights is not None: + attn_slice = attn_slice * self.last_attn_slice_weights + self.use_last_attn_weights = False + + hidden_states = torch.matmul(attn_slice, value) + # reshape hidden_states + return hidden_states + + for _, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention': + module.last_attn_slice = None + module.use_last_attn_slice = False + module.use_last_attn_weights = False + module.save_last_attn_slice = False + module.cross_attention_callback = new_attention.__get__(module, type(module)) + + +# original code below + +# Functions supporting Cross-Attention Control +# Copied from https://github.com/bloc97/CrossAttentionControl + +from difflib import SequenceMatcher + +import torch + + +def prompt_token(prompt, index, clip_tokenizer): + tokens = clip_tokenizer(prompt, + padding='max_length', + max_length=clip_tokenizer.model_max_length, + truncation=True, + return_tensors='pt', + return_overflowing_tokens=True + ).input_ids[0] + return clip_tokenizer.decode(tokens[index:index + 1]) + + +def use_last_tokens_attention(unet, use=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn2' in name: + module.use_last_attn_slice = use + + +def use_last_tokens_attention_weights(unet, use=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn2' in name: + module.use_last_attn_weights = use + + +def use_last_self_attention(unet, use=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn1' in name: + module.use_last_attn_slice = use + + +def save_last_tokens_attention(unet, save=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn2' in name: + module.save_last_attn_slice = save + + +def save_last_self_attention(unet, save=True): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == 'CrossAttention' and 'attn1' in name: + module.save_last_attn_slice = save diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 8010b44d1d..29949aff8d 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -13,6 +13,7 @@ from ldm.modules.diffusionmodules.util import ( noise_like, extract_into_tensor, ) +from ldm.models.diffusion.cross_attention import CrossAttentionControl def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): if threshold <= 0.0: @@ -29,21 +30,41 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): class CFGDenoiser(nn.Module): - def __init__(self, model, threshold = 0, warmup = 0): + def __init__(self, model, threshold = 0, warmup = 0, edited_conditioning = None): super().__init__() self.inner_model = model self.threshold = threshold self.warmup_max = warmup self.warmup = max(warmup / 10, 1) + self.edited_conditioning = edited_conditioning + + if self.edited_conditioning is not None: + initial_tokens_count = 77 # ' a cat sitting on a car ' + token_indices_to_edit = [2] # 'cat' + CrossAttentionControl.setup_attention_editing(self.inner_model, initial_tokens_count, edited_conditioning, token_indices_to_edit) def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) cond_in = torch.cat([uncond, cond]) - uncond, cond = self.inner_model(x_in, sigma_in, cond=cond_in).chunk(2) - module = self.get_attention_module(AttentionLayer.TOKENS) + print('generating new unconditioned latents') + unconditioned_latents = self.inner_model(x, sigma, cond=uncond) + + # process x using the original prompt, saving the attention maps if required + if self.edited_conditioning is not None: + # this is automatically toggled off after the model forward() + CrossAttentionControl.request_save_attention_maps(self.inner_model) + print('generating new conditioned latents') + conditioned_latents = self.inner_model(x, sigma, cond=cond) + + if self.edited_conditioning is not None: + # process x again, using the saved attention maps but the new conditioning + # this is automatically toggled off after the model forward() + CrossAttentionControl.request_apply_saved_attention_maps(self.inner_model) + print('generating edited conditioned latents') + conditioned_latents = self.inner_model(x, sigma, cond=self.edited_conditioning) if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) @@ -52,7 +73,8 @@ class CFGDenoiser(nn.Module): thresh = self.threshold if thresh > self.threshold: thresh = self.threshold - return cfg_apply_threshold(uncond + (cond - uncond) * cond_scale, thresh) + delta = (conditioned_latents - unconditioned_latents) + return cfg_apply_threshold(unconditioned_latents + delta * cond_scale, thresh) class KSampler(Sampler): @@ -169,6 +191,7 @@ class KSampler(Sampler): log_every_t=100, unconditional_guidance_scale=1.0, unconditional_conditioning=None, + edited_conditioning=None, threshold = 0, perlin = 0, # this has to come in the same format as the conditioning, # e.g. as encoded tokens, ... @@ -200,7 +223,7 @@ class KSampler(Sampler): else: x = torch.randn([batch_size, *shape], device=self.device) * sigmas[0] - model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10)) + model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10), edited_conditioning=edited_conditioning) extra_args = { 'cond': conditioning, 'uncond': unconditional_conditioning, diff --git a/ldm/modules/attention.py b/ldm/modules/attention.py index ef9c2d3e65..a9805e6c67 100644 --- a/ldm/modules/attention.py +++ b/ldm/modules/attention.py @@ -170,6 +170,8 @@ class CrossAttention(nn.Module): self.mem_total_gb = psutil.virtual_memory().total // (1 << 30) + self.cross_attention_callback = None + def einsum_op_compvis(self, q, k, v): s = einsum('b i d, b j d -> b i j', q, k) s = s.softmax(dim=-1, dtype=s.dtype) @@ -244,8 +246,13 @@ class CrossAttention(nn.Module): del context, x q, k, v = map(lambda t: rearrange(t, 'b n (h d) -> (b h) n d', h=h), (q, k, v)) - r = self.einsum_op(q, k, v) - return self.to_out(rearrange(r, '(b h) n d -> b n (h d)', h=h)) + + if self.cross_attention_callback is not None: + r = self.cross_attention_callback(q, k, v) + else: + r = self.einsum_op(q, k, v) + hidden_states = rearrange(r, '(b h) n d -> b n (h d)', h=h) + return self.to_out(hidden_states) class BasicTransformerBlock(nn.Module): From 1fc1f8bf05c01af0c07714df38f10745dd984103 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 17 Oct 2022 21:15:03 +0200 Subject: [PATCH 005/124] cross-attention working with placeholder {} syntax --- ldm/generate.py | 4 +- ldm/invoke/conditioning.py | 34 +- ldm/invoke/generator/txt2img.py | 3 +- ldm/models/diffusion/cross_attention.py | 141 ++++-- ldm/models/diffusion/ksampler.py | 23 +- ldm/modules/attention.py | 554 +++++++++++++++++------- ldm/modules/diffusionmodules/model.py | 10 +- ldm/modules/encoders/modules.py | 2 +- 8 files changed, 534 insertions(+), 237 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index b8945342b0..37df973291 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -400,7 +400,7 @@ class Generate: mask_image = None try: - uc, c, ec = get_uc_and_c_and_ec( + uc, c, ec, ec_index_map = get_uc_and_c_and_ec( prompt, model =self.model, skip_normalize=skip_normalize, log_tokens =self.log_tokenization @@ -438,7 +438,7 @@ class Generate: sampler=self.sampler, steps=steps, cfg_scale=cfg_scale, - conditioning=(uc, c, ec), + conditioning=(uc, c, ec, ec_index_map), ddim_eta=ddim_eta, image_callback=image_callback, # called after the final image is generated step_callback=step_callback, # called after each intermediate image is generated diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 1453d9ce8c..8c8f5eeb01 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -10,6 +10,8 @@ log_tokenization() print out colour-coded tokens and warn if trunca ''' import re +from difflib import SequenceMatcher + import torch def get_uc_and_c_and_ec(prompt, model, log_tokens=False, skip_normalize=False): @@ -35,32 +37,46 @@ def get_uc_and_c_and_ec(prompt, model, log_tokens=False, skip_normalize=False): clean_prompt = edited_regex_compile.sub(' ', prompt) prompt = re.sub(' +', ' ', clean_prompt) - uc = model.get_learned_conditioning([unconditioned_words]) - ec = None - if edited_words is not None: - ec = model.get_learned_conditioning([edited_words]) - # get weighted sub-prompts weighted_subprompts = split_weighted_subprompts( prompt, skip_normalize ) + ec = None + edit_opcodes = None + + uc, _ = model.get_learned_conditioning([unconditioned_words]) + if len(weighted_subprompts) > 1: # i dont know if this is correct.. but it works c = torch.zeros_like(uc) # normalize each "sub prompt" and add it for subprompt, weight in weighted_subprompts: log_tokenization(subprompt, model, log_tokens, weight) + subprompt_embeddings, _ = model.get_learned_conditioning([subprompt]) c = torch.add( c, - model.get_learned_conditioning([subprompt]), + subprompt_embeddings, alpha=weight, ) + if edited_words is not None: + print("can't do cross-attention control with blends just yet, ignoring edits") else: # just standard 1 prompt log_tokenization(prompt, model, log_tokens, 1) - c = model.get_learned_conditioning([prompt]) - uc = model.get_learned_conditioning([unconditioned_words]) - return (uc, c, ec) + c, c_tokens = model.get_learned_conditioning([prompt]) + if edited_words is not None: + ec, ec_tokens = model.get_learned_conditioning([edited_words]) + edit_opcodes = build_token_edit_opcodes(c_tokens, ec_tokens) + + return (uc, c, ec, edit_opcodes) + +def build_token_edit_opcodes(c_tokens, ec_tokens): + tokens = c_tokens.cpu().numpy()[0] + tokens_edit = ec_tokens.cpu().numpy()[0] + + opcodes = SequenceMatcher(None, tokens, tokens_edit).get_opcodes() + return opcodes + def split_weighted_subprompts(text, skip_normalize=False)->list: """ diff --git a/ldm/invoke/generator/txt2img.py b/ldm/invoke/generator/txt2img.py index 23f03f22db..9f066745f7 100644 --- a/ldm/invoke/generator/txt2img.py +++ b/ldm/invoke/generator/txt2img.py @@ -19,7 +19,7 @@ class Txt2Img(Generator): kwargs are 'width' and 'height' """ self.perlin = perlin - uc, c, ec = conditioning + uc, c, ec, edit_index_map = conditioning @torch.no_grad() def make_image(x_T): @@ -44,6 +44,7 @@ class Txt2Img(Generator): unconditional_guidance_scale = cfg_scale, unconditional_conditioning = uc, edited_conditioning = ec, + edit_token_index_map = edit_index_map, eta = ddim_eta, img_callback = step_callback, threshold = threshold, diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/cross_attention.py index a440eb3e6a..d829162f35 100644 --- a/ldm/models/diffusion/cross_attention.py +++ b/ldm/models/diffusion/cross_attention.py @@ -2,89 +2,99 @@ from enum import Enum import torch +# adapted from bloc97's CrossAttentionControl colab +# https://github.com/bloc97/CrossAttentionControl + class CrossAttentionControl: class AttentionType(Enum): SELF = 1 TOKENS = 2 @classmethod - def get_attention_module(cls, model, which: AttentionType): - which_attn = "attn1" if which is cls.AttentionType.SELF else "attn2" - module = next(module for name, module in model.named_modules() if - type(module).__name__ == "CrossAttention" and which_attn in name) - return module - - @classmethod - def setup_attention_editing(cls, model, original_tokens_length: int, + def setup_attention_editing(cls, model, substitute_conditioning: torch.Tensor = None, - token_indices_to_edit: list = None): + edit_opcodes: list = None): + """ + :param model: The unet model to inject into. + :param substitute_conditioning: The "edited" conditioning vector, [Bx77x768] + :param edit_opcodes: Opcodes from difflib.SequenceMatcher describing how the base + conditionings map to the "edited" conditionings. + :return: + """ # adapted from init_attention_edit - self_attention_module = cls.get_attention_module(model, cls.AttentionType.SELF) - tokens_attention_module = cls.get_attention_module(model, cls.AttentionType.TOKENS) - if substitute_conditioning is not None: device = substitute_conditioning.device - # this is not very torch-y - mask = torch.zeros(original_tokens_length) - for i in token_indices_to_edit: - mask[i] = 1 + max_length = model.inner_model.cond_stage_model.max_length + # mask=1 means use base prompt attention, mask=0 means use edited prompt attention + mask = torch.zeros(max_length) + indices_target = torch.arange(max_length, dtype=torch.long) + indices = torch.zeros(max_length, dtype=torch.long) + for name, a0, a1, b0, b1 in edit_opcodes: + if b0 < max_length: + if name == "equal":# or (name == "replace" and a1 - a0 == b1 - b0): + # these tokens have not been edited + indices[b0:b1] = indices_target[a0:a1] + mask[b0:b1] = 1 - self_attention_module.last_attn_slice_mask = None - self_attention_module.last_attn_slice_indices = None - tokens_attention_module.last_attn_slice_mask = mask.to(device) - tokens_attention_module.last_attn_slice_indices = torch.tensor(token_indices_to_edit, device=device) + for m in cls.get_attention_modules(model, cls.AttentionType.SELF): + m.last_attn_slice_mask = None + m.last_attn_slice_indices = None + + for m in cls.get_attention_modules(model, cls.AttentionType.TOKENS): + m.last_attn_slice_mask = mask.to(device) + m.last_attn_slice_indices = indices.to(device) cls.inject_attention_functions(model) + + @classmethod + def get_attention_modules(cls, model, which: AttentionType): + which_attn = "attn1" if which is cls.AttentionType.SELF else "attn2" + return [module for name, module in model.named_modules() if + type(module).__name__ == "CrossAttention" and which_attn in name] + + @classmethod def request_save_attention_maps(cls, model): - self_attention_module = cls.get_attention_module(model, cls.AttentionType.SELF) - tokens_attention_module = cls.get_attention_module(model, cls.AttentionType.TOKENS) - self_attention_module.save_last_attn_slice = True - tokens_attention_module.save_last_attn_slice = True + self_attention_modules = cls.get_attention_modules(model, cls.AttentionType.SELF) + tokens_attention_modules = cls.get_attention_modules(model, cls.AttentionType.TOKENS) + for m in self_attention_modules+tokens_attention_modules: + m.save_last_attn_slice = True @classmethod def request_apply_saved_attention_maps(cls, model): - self_attention_module = cls.get_attention_module(model, cls.AttentionType.SELF) - tokens_attention_module = cls.get_attention_module(model, cls.AttentionType.TOKENS) - self_attention_module.use_last_attn_slice = True - tokens_attention_module.use_last_attn_slice = True + self_attention_modules = cls.get_attention_modules(model, cls.AttentionType.SELF) + tokens_attention_modules = cls.get_attention_modules(model, cls.AttentionType.TOKENS) + for m in self_attention_modules+tokens_attention_modules: + m.use_last_attn_slice = True + @classmethod def inject_attention_functions(cls, unet): # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 def new_attention(self, query, key, value): # TODO: use baddbmm for better performance - print(f"entered new_attention") attention_scores = torch.matmul(query, key.transpose(-1, -2)) * self.scale attn_slice = attention_scores.softmax(dim=-1) # compute attention output if self.use_last_attn_slice: if self.last_attn_slice_mask is not None: - print('using masked last_attn_slice') - - new_attn_slice = (torch.index_select(self.last_attn_slice, -1, - self.last_attn_slice_indices)) - attn_slice = (attn_slice * (1 - self.last_attn_slice_mask) - + new_attn_slice * self.last_attn_slice_mask) + base_attn_slice = torch.index_select(self.last_attn_slice, -1, self.last_attn_slice_indices) + base_attn_slice_mask = self.last_attn_slice_mask + this_attn_slice_mask = 1 - self.last_attn_slice_mask + attn_slice = attn_slice * this_attn_slice_mask + base_attn_slice * base_attn_slice_mask else: - print('using unmasked last_attn_slice') attn_slice = self.last_attn_slice self.use_last_attn_slice = False - else: - print('not using last_attn_slice') if self.save_last_attn_slice: - print('saving last_attn_slice') self.last_attn_slice = attn_slice self.save_last_attn_slice = False - else: - print('not saving last_attn_slice') if self.use_last_attn_weights and self.last_attn_slice_weights is not None: attn_slice = attn_slice * self.last_attn_slice_weights @@ -92,16 +102,59 @@ class CrossAttentionControl: hidden_states = torch.matmul(attn_slice, value) # reshape hidden_states + hidden_states = self.reshape_batch_dim_to_heads(hidden_states) return hidden_states - for _, module in unet.named_modules(): + def new_sliced_attention(self, query, key, value, sequence_length, dim): + + batch_size_attention = query.shape[0] + hidden_states = torch.zeros( + (batch_size_attention, sequence_length, dim // self.heads), device=query.device, dtype=query.dtype + ) + slice_size = self._slice_size if self._slice_size is not None else hidden_states.shape[0] + for i in range(hidden_states.shape[0] // slice_size): + start_idx = i * slice_size + end_idx = (i + 1) * slice_size + attn_slice = ( + torch.matmul(query[start_idx:end_idx], key[start_idx:end_idx].transpose(1, 2)) * self.scale + ) # TODO: use baddbmm for better performance + attn_slice = attn_slice.softmax(dim=-1) + + if self.use_last_attn_slice: + if self.last_attn_slice_mask is not None: + new_attn_slice = torch.index_select(self.last_attn_slice, -1, self.last_attn_slice_indices) + attn_slice = attn_slice * ( + 1 - self.last_attn_slice_mask) + new_attn_slice * self.last_attn_slice_mask + else: + attn_slice = self.last_attn_slice + + self.use_last_attn_slice = False + + if self.save_last_attn_slice: + self.last_attn_slice = attn_slice + self.save_last_attn_slice = False + + if self.use_last_attn_weights and self.last_attn_slice_weights is not None: + attn_slice = attn_slice * self.last_attn_slice_weights + self.use_last_attn_weights = False + + attn_slice = torch.matmul(attn_slice, value[start_idx:end_idx]) + + hidden_states[start_idx:end_idx] = attn_slice + + # reshape hidden_states + hidden_states = self.reshape_batch_dim_to_heads(hidden_states) + return hidden_states + + for name, module in unet.named_modules(): module_name = type(module).__name__ - if module_name == 'CrossAttention': + if module_name == "CrossAttention": module.last_attn_slice = None module.use_last_attn_slice = False module.use_last_attn_weights = False module.save_last_attn_slice = False - module.cross_attention_callback = new_attention.__get__(module, type(module)) + module._sliced_attention = new_sliced_attention.__get__(module, type(module)) + module._attention = new_attention.__get__(module, type(module)) # original code below diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 29949aff8d..e5d521f33f 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -30,7 +30,7 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): class CFGDenoiser(nn.Module): - def __init__(self, model, threshold = 0, warmup = 0, edited_conditioning = None): + def __init__(self, model, threshold = 0, warmup = 0, edited_conditioning = None, edit_opcodes = None): super().__init__() self.inner_model = model self.threshold = threshold @@ -39,24 +39,23 @@ class CFGDenoiser(nn.Module): self.edited_conditioning = edited_conditioning - if self.edited_conditioning is not None: - initial_tokens_count = 77 # ' a cat sitting on a car ' - token_indices_to_edit = [2] # 'cat' - CrossAttentionControl.setup_attention_editing(self.inner_model, initial_tokens_count, edited_conditioning, token_indices_to_edit) + if edited_conditioning is not None: + # a cat sitting on a car + CrossAttentionControl.setup_attention_editing(self.inner_model, edited_conditioning, edit_opcodes) + else: + # pass through the attention func but don't act on it + CrossAttentionControl.setup_attention_editing(self.inner_model) def forward(self, x, sigma, uncond, cond, cond_scale): - x_in = torch.cat([x] * 2) - sigma_in = torch.cat([sigma] * 2) - cond_in = torch.cat([uncond, cond]) - print('generating new unconditioned latents') + print('generating unconditioned latents') unconditioned_latents = self.inner_model(x, sigma, cond=uncond) # process x using the original prompt, saving the attention maps if required if self.edited_conditioning is not None: # this is automatically toggled off after the model forward() CrossAttentionControl.request_save_attention_maps(self.inner_model) - print('generating new conditioned latents') + print('generating conditioned latents') conditioned_latents = self.inner_model(x, sigma, cond=cond) if self.edited_conditioning is not None: @@ -192,6 +191,7 @@ class KSampler(Sampler): unconditional_guidance_scale=1.0, unconditional_conditioning=None, edited_conditioning=None, + edit_token_index_map=None, threshold = 0, perlin = 0, # this has to come in the same format as the conditioning, # e.g. as encoded tokens, ... @@ -223,7 +223,8 @@ class KSampler(Sampler): else: x = torch.randn([batch_size, *shape], device=self.device) * sigmas[0] - model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10), edited_conditioning=edited_conditioning) + model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10), + edited_conditioning=edited_conditioning, edit_opcodes=edit_token_index_map) extra_args = { 'cond': conditioning, 'uncond': unconditional_conditioning, diff --git a/ldm/modules/attention.py b/ldm/modules/attention.py index a9805e6c67..d00b95b1af 100644 --- a/ldm/modules/attention.py +++ b/ldm/modules/attention.py @@ -1,155 +1,367 @@ -from inspect import isfunction +# Copyright 2022 The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. import math +from typing import Optional + import torch import torch.nn.functional as F -from torch import nn, einsum -from einops import rearrange, repeat - -from ldm.modules.diffusionmodules.util import checkpoint - -import psutil - -def exists(val): - return val is not None +from torch import nn -def uniq(arr): - return{el: True for el in arr}.keys() +class AttentionBlock(nn.Module): + """ + An attention block that allows spatial positions to attend to each other. Originally ported from here, but adapted + to the N-d case. + https://github.com/hojonathanho/diffusion/blob/1e0dceb3b3495bbe19116a5e1b3596cd0706c543/diffusion_tf/models/unet.py#L66. + Uses three q, k, v linear layers to compute attention. + + Parameters: + channels (:obj:`int`): The number of channels in the input and output. + num_head_channels (:obj:`int`, *optional*): + The number of channels in each head. If None, then `num_heads` = 1. + num_groups (:obj:`int`, *optional*, defaults to 32): The number of groups to use for group norm. + rescale_output_factor (:obj:`float`, *optional*, defaults to 1.0): The factor to rescale the output by. + eps (:obj:`float`, *optional*, defaults to 1e-5): The epsilon value to use for group norm. + """ + + def __init__( + self, + channels: int, + num_head_channels: Optional[int] = None, + num_groups: int = 32, + rescale_output_factor: float = 1.0, + eps: float = 1e-5, + ): + super().__init__() + self.channels = channels + + self.num_heads = channels // num_head_channels if num_head_channels is not None else 1 + self.num_head_size = num_head_channels + self.group_norm = nn.GroupNorm(num_channels=channels, num_groups=num_groups, eps=eps, affine=True) + + # define q,k,v as linear layers + self.query = nn.Linear(channels, channels) + self.key = nn.Linear(channels, channels) + self.value = nn.Linear(channels, channels) + + self.rescale_output_factor = rescale_output_factor + self.proj_attn = nn.Linear(channels, channels, 1) + + def transpose_for_scores(self, projection: torch.Tensor) -> torch.Tensor: + new_projection_shape = projection.size()[:-1] + (self.num_heads, -1) + # move heads to 2nd position (B, T, H * D) -> (B, T, H, D) -> (B, H, T, D) + new_projection = projection.view(new_projection_shape).permute(0, 2, 1, 3) + return new_projection + + def forward(self, hidden_states): + residual = hidden_states + batch, channel, height, width = hidden_states.shape + + # norm + hidden_states = self.group_norm(hidden_states) + + hidden_states = hidden_states.view(batch, channel, height * width).transpose(1, 2) + + # proj to q, k, v + query_proj = self.query(hidden_states) + key_proj = self.key(hidden_states) + value_proj = self.value(hidden_states) + + # transpose + query_states = self.transpose_for_scores(query_proj) + key_states = self.transpose_for_scores(key_proj) + value_states = self.transpose_for_scores(value_proj) + + # get scores + scale = 1 / math.sqrt(math.sqrt(self.channels / self.num_heads)) + attention_scores = torch.matmul(query_states * scale, key_states.transpose(-1, -2) * scale) # TODO: use baddmm + attention_probs = torch.softmax(attention_scores.float(), dim=-1).type(attention_scores.dtype) + + # compute attention output + hidden_states = torch.matmul(attention_probs, value_states) + + hidden_states = hidden_states.permute(0, 2, 1, 3).contiguous() + new_hidden_states_shape = hidden_states.size()[:-2] + (self.channels,) + hidden_states = hidden_states.view(new_hidden_states_shape) + + # compute next hidden_states + hidden_states = self.proj_attn(hidden_states) + hidden_states = hidden_states.transpose(-1, -2).reshape(batch, channel, height, width) + + # res connect and rescale + hidden_states = (hidden_states + residual) / self.rescale_output_factor + return hidden_states -def default(val, d): - if exists(val): - return val - return d() if isfunction(d) else d +class SpatialTransformer(nn.Module): + """ + Transformer block for image-like data. First, project the input (aka embedding) and reshape to b, t, d. Then apply + standard transformer action. Finally, reshape to image. + + Parameters: + in_channels (:obj:`int`): The number of channels in the input and output. + n_heads (:obj:`int`): The number of heads to use for multi-head attention. + d_head (:obj:`int`): The number of channels in each head. + depth (:obj:`int`, *optional*, defaults to 1): The number of layers of Transformer blocks to use. + dropout (:obj:`float`, *optional*, defaults to 0.1): The dropout probability to use. + context_dim (:obj:`int`, *optional*): The number of context dimensions to use. + """ + + def __init__( + self, + in_channels: int, + n_heads: int, + d_head: int, + depth: int = 1, + dropout: float = 0.0, + num_groups: int = 32, + context_dim: Optional[int] = None, + ): + super().__init__() + self.n_heads = n_heads + self.d_head = d_head + self.in_channels = in_channels + inner_dim = n_heads * d_head + self.norm = torch.nn.GroupNorm(num_groups=num_groups, num_channels=in_channels, eps=1e-6, affine=True) + + self.proj_in = nn.Conv2d(in_channels, inner_dim, kernel_size=1, stride=1, padding=0) + + self.transformer_blocks = nn.ModuleList( + [ + BasicTransformerBlock(inner_dim, n_heads, d_head, dropout=dropout, context_dim=context_dim) + for d in range(depth) + ] + ) + + self.proj_out = nn.Conv2d(inner_dim, in_channels, kernel_size=1, stride=1, padding=0) + + def _set_attention_slice(self, slice_size): + for block in self.transformer_blocks: + block._set_attention_slice(slice_size) + + def forward(self, hidden_states, context=None): + # note: if no context is given, cross-attention defaults to self-attention + batch, channel, height, weight = hidden_states.shape + residual = hidden_states + hidden_states = self.norm(hidden_states) + hidden_states = self.proj_in(hidden_states) + inner_dim = hidden_states.shape[1] + hidden_states = hidden_states.permute(0, 2, 3, 1).reshape(batch, height * weight, inner_dim) + for block in self.transformer_blocks: + hidden_states = block(hidden_states, context=context) + hidden_states = hidden_states.reshape(batch, height, weight, inner_dim).permute(0, 3, 1, 2) + hidden_states = self.proj_out(hidden_states) + return hidden_states + residual -def max_neg_value(t): - return -torch.finfo(t.dtype).max +class BasicTransformerBlock(nn.Module): + r""" + A basic Transformer block. + + Parameters: + dim (:obj:`int`): The number of channels in the input and output. + n_heads (:obj:`int`): The number of heads to use for multi-head attention. + d_head (:obj:`int`): The number of channels in each head. + dropout (:obj:`float`, *optional*, defaults to 0.0): The dropout probability to use. + context_dim (:obj:`int`, *optional*): The size of the context vector for cross attention. + gated_ff (:obj:`bool`, *optional*, defaults to :obj:`False`): Whether to use a gated feed-forward network. + checkpoint (:obj:`bool`, *optional*, defaults to :obj:`False`): Whether to use checkpointing. + """ + + def __init__( + self, + dim: int, + n_heads: int, + d_head: int, + dropout=0.0, + context_dim: Optional[int] = None, + gated_ff: bool = True, + checkpoint: bool = True, + ): + super().__init__() + self.attn1 = CrossAttention( + query_dim=dim, heads=n_heads, dim_head=d_head, dropout=dropout + ) # is a self-attention + self.ff = FeedForward(dim, dropout=dropout, glu=gated_ff) + self.attn2 = CrossAttention( + query_dim=dim, context_dim=context_dim, heads=n_heads, dim_head=d_head, dropout=dropout + ) # is self-attn if context is none + self.norm1 = nn.LayerNorm(dim) + self.norm2 = nn.LayerNorm(dim) + self.norm3 = nn.LayerNorm(dim) + self.checkpoint = checkpoint + + def _set_attention_slice(self, slice_size): + self.attn1._slice_size = slice_size + self.attn2._slice_size = slice_size + + def forward(self, hidden_states, context=None): + hidden_states = hidden_states.contiguous() if hidden_states.device.type == "mps" else hidden_states + hidden_states = self.attn1(self.norm1(hidden_states)) + hidden_states + hidden_states = self.attn2(self.norm2(hidden_states), context=context) + hidden_states + hidden_states = self.ff(self.norm3(hidden_states)) + hidden_states + return hidden_states -def init_(tensor): - dim = tensor.shape[-1] - std = 1 / math.sqrt(dim) - tensor.uniform_(-std, std) - return tensor +class CrossAttention(nn.Module): + r""" + A cross attention layer. + + Parameters: + query_dim (:obj:`int`): The number of channels in the query. + context_dim (:obj:`int`, *optional*): + The number of channels in the context. If not given, defaults to `query_dim`. + heads (:obj:`int`, *optional*, defaults to 8): The number of heads to use for multi-head attention. + dim_head (:obj:`int`, *optional*, defaults to 64): The number of channels in each head. + dropout (:obj:`float`, *optional*, defaults to 0.0): The dropout probability to use. + """ + + def __init__( + self, query_dim: int, context_dim: Optional[int] = None, heads: int = 8, dim_head: int = 64, dropout: int = 0.0 + ): + super().__init__() + inner_dim = dim_head * heads + context_dim = context_dim if context_dim is not None else query_dim + + self.scale = dim_head**-0.5 + self.heads = heads + # for slice_size > 0 the attention score computation + # is split across the batch axis to save memory + # You can set slice_size with `set_attention_slice` + self._slice_size = None + + self.to_q = nn.Linear(query_dim, inner_dim, bias=False) + self.to_k = nn.Linear(context_dim, inner_dim, bias=False) + self.to_v = nn.Linear(context_dim, inner_dim, bias=False) + + self.to_out = nn.Sequential(nn.Linear(inner_dim, query_dim), nn.Dropout(dropout)) + + def reshape_heads_to_batch_dim(self, tensor): + batch_size, seq_len, dim = tensor.shape + head_size = self.heads + tensor = tensor.reshape(batch_size, seq_len, head_size, dim // head_size) + tensor = tensor.permute(0, 2, 1, 3).reshape(batch_size * head_size, seq_len, dim // head_size) + return tensor + + def reshape_batch_dim_to_heads(self, tensor): + batch_size, seq_len, dim = tensor.shape + head_size = self.heads + tensor = tensor.reshape(batch_size // head_size, head_size, seq_len, dim) + tensor = tensor.permute(0, 2, 1, 3).reshape(batch_size // head_size, seq_len, dim * head_size) + return tensor + + def forward(self, hidden_states, context=None, mask=None): + batch_size, sequence_length, _ = hidden_states.shape + + query = self.to_q(hidden_states) + context = context if context is not None else hidden_states + key = self.to_k(context) + value = self.to_v(context) + + dim = query.shape[-1] + + query = self.reshape_heads_to_batch_dim(query) + key = self.reshape_heads_to_batch_dim(key) + value = self.reshape_heads_to_batch_dim(value) + + # TODO(PVP) - mask is currently never used. Remember to re-implement when used + + # attention, what we cannot get enough of + + if self._slice_size is None or query.shape[0] // self._slice_size == 1: + hidden_states = self._attention(query, key, value) + else: + hidden_states = self._sliced_attention(query, key, value, sequence_length, dim) + + return self.to_out(hidden_states) + + def _attention(self, query, key, value): + # TODO: use baddbmm for better performance + attention_scores = torch.matmul(query, key.transpose(-1, -2)) * self.scale + attention_probs = attention_scores.softmax(dim=-1) + # compute attention output + hidden_states = torch.matmul(attention_probs, value) + # reshape hidden_states + hidden_states = self.reshape_batch_dim_to_heads(hidden_states) + return hidden_states + + def _sliced_attention(self, query, key, value, sequence_length, dim): + batch_size_attention = query.shape[0] + hidden_states = torch.zeros( + (batch_size_attention, sequence_length, dim // self.heads), device=query.device, dtype=query.dtype + ) + slice_size = self._slice_size if self._slice_size is not None else hidden_states.shape[0] + for i in range(hidden_states.shape[0] // slice_size): + start_idx = i * slice_size + end_idx = (i + 1) * slice_size + attn_slice = ( + torch.matmul(query[start_idx:end_idx], key[start_idx:end_idx].transpose(1, 2)) * self.scale + ) # TODO: use baddbmm for better performance + attn_slice = attn_slice.softmax(dim=-1) + attn_slice = torch.matmul(attn_slice, value[start_idx:end_idx]) + + hidden_states[start_idx:end_idx] = attn_slice + + # reshape hidden_states + hidden_states = self.reshape_batch_dim_to_heads(hidden_states) + return hidden_states + + +class FeedForward(nn.Module): + r""" + A feed-forward layer. + + Parameters: + dim (:obj:`int`): The number of channels in the input. + dim_out (:obj:`int`, *optional*): The number of channels in the output. If not given, defaults to `dim`. + mult (:obj:`int`, *optional*, defaults to 4): The multiplier to use for the hidden dimension. + glu (:obj:`bool`, *optional*, defaults to :obj:`False`): Whether to use GLU activation. + dropout (:obj:`float`, *optional*, defaults to 0.0): The dropout probability to use. + """ + + def __init__( + self, dim: int, dim_out: Optional[int] = None, mult: int = 4, glu: bool = False, dropout: float = 0.0 + ): + super().__init__() + inner_dim = int(dim * mult) + dim_out = dim_out if dim_out is not None else dim + project_in = GEGLU(dim, inner_dim) + + self.net = nn.Sequential(project_in, nn.Dropout(dropout), nn.Linear(inner_dim, dim_out)) + + def forward(self, hidden_states): + return self.net(hidden_states) # feedforward class GEGLU(nn.Module): - def __init__(self, dim_in, dim_out): + r""" + A variant of the gated linear unit activation function from https://arxiv.org/abs/2002.05202. + + Parameters: + dim_in (:obj:`int`): The number of channels in the input. + dim_out (:obj:`int`): The number of channels in the output. + """ + + def __init__(self, dim_in: int, dim_out: int): super().__init__() self.proj = nn.Linear(dim_in, dim_out * 2) - def forward(self, x): - x, gate = self.proj(x).chunk(2, dim=-1) - return x * F.gelu(gate) - - -class FeedForward(nn.Module): - def __init__(self, dim, dim_out=None, mult=4, glu=False, dropout=0.): - super().__init__() - inner_dim = int(dim * mult) - dim_out = default(dim_out, dim) - project_in = nn.Sequential( - nn.Linear(dim, inner_dim), - nn.GELU() - ) if not glu else GEGLU(dim, inner_dim) - - self.net = nn.Sequential( - project_in, - nn.Dropout(dropout), - nn.Linear(inner_dim, dim_out) - ) - - def forward(self, x): - return self.net(x) - - -def zero_module(module): - """ - Zero out the parameters of a module and return it. - """ - for p in module.parameters(): - p.detach().zero_() - return module - - -def Normalize(in_channels): - return torch.nn.GroupNorm(num_groups=32, num_channels=in_channels, eps=1e-6, affine=True) - - -class LinearAttention(nn.Module): - def __init__(self, dim, heads=4, dim_head=32): - super().__init__() - self.heads = heads - hidden_dim = dim_head * heads - self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False) - self.to_out = nn.Conv2d(hidden_dim, dim, 1) - - def forward(self, x): - b, c, h, w = x.shape - qkv = self.to_qkv(x) - q, k, v = rearrange(qkv, 'b (qkv heads c) h w -> qkv b heads c (h w)', heads = self.heads, qkv=3) - k = k.softmax(dim=-1) - context = torch.einsum('bhdn,bhen->bhde', k, v) - out = torch.einsum('bhde,bhdn->bhen', context, q) - out = rearrange(out, 'b heads c (h w) -> b (heads c) h w', heads=self.heads, h=h, w=w) - return self.to_out(out) - - -class SpatialSelfAttention(nn.Module): - def __init__(self, in_channels): - super().__init__() - self.in_channels = in_channels - - self.norm = Normalize(in_channels) - self.q = torch.nn.Conv2d(in_channels, - in_channels, - kernel_size=1, - stride=1, - padding=0) - self.k = torch.nn.Conv2d(in_channels, - in_channels, - kernel_size=1, - stride=1, - padding=0) - self.v = torch.nn.Conv2d(in_channels, - in_channels, - kernel_size=1, - stride=1, - padding=0) - self.proj_out = torch.nn.Conv2d(in_channels, - in_channels, - kernel_size=1, - stride=1, - padding=0) - - def forward(self, x): - h_ = x - h_ = self.norm(h_) - q = self.q(h_) - k = self.k(h_) - v = self.v(h_) - - # compute attention - b,c,h,w = q.shape - q = rearrange(q, 'b c h w -> b (h w) c') - k = rearrange(k, 'b c h w -> b c (h w)') - w_ = torch.einsum('bij,bjk->bik', q, k) - - w_ = w_ * (int(c)**(-0.5)) - w_ = torch.nn.functional.softmax(w_, dim=2) - - # attend to values - v = rearrange(v, 'b c h w -> b c (h w)') - w_ = rearrange(w_, 'b i j -> b j i') - h_ = torch.einsum('bij,bjk->bik', v, w_) - h_ = rearrange(h_, 'b c (h w) -> b c h w', h=h) - h_ = self.proj_out(h_) - - return x+h_ - - + def forward(self, hidden_states): + hidden_states, gate = self.proj(hidden_states).chunk(2, dim=-1) + return hidden_states * F.gelu(gate) +''' class CrossAttention(nn.Module): def __init__(self, query_dim, context_dim=None, heads=8, dim_head=64, dropout=0.): super().__init__() @@ -172,48 +384,45 @@ class CrossAttention(nn.Module): self.cross_attention_callback = None - def einsum_op_compvis(self, q, k, v): - s = einsum('b i d, b j d -> b i j', q, k) - s = s.softmax(dim=-1, dtype=s.dtype) - return einsum('b i j, b j d -> b i d', s, v) - - def einsum_op_slice_0(self, q, k, v, slice_size): + def einsum_op_slice_dim0(self, q, k, v, slice_size, callback): r = torch.zeros(q.shape[0], q.shape[1], v.shape[2], device=q.device, dtype=q.dtype) for i in range(0, q.shape[0], slice_size): end = i + slice_size - r[i:end] = self.einsum_op_compvis(q[i:end], k[i:end], v[i:end]) + r[i:end] = callback(q[i:end], k[i:end], v[i:end], offset=i) return r - def einsum_op_slice_1(self, q, k, v, slice_size): + def einsum_op_slice_dim1(self, q, k, v, slice_size, callback): r = torch.zeros(q.shape[0], q.shape[1], v.shape[2], device=q.device, dtype=q.dtype) for i in range(0, q.shape[1], slice_size): end = i + slice_size - r[:, i:end] = self.einsum_op_compvis(q[:, i:end], k, v) + r[:, i:end] = callback(q[:, i:end], k, v, offset=i) return r - def einsum_op_mps_v1(self, q, k, v): + def einsum_op_mps_v1(self, q, k, v, callback): if q.shape[1] <= 4096: # (512x512) max q.shape[1]: 4096 - return self.einsum_op_compvis(q, k, v) + return callback(q, k, v) else: slice_size = math.floor(2**30 / (q.shape[0] * q.shape[1])) - return self.einsum_op_slice_1(q, k, v, slice_size) + return self.einsum_op_slice_dim1(q, k, v, slice_size, callback) - def einsum_op_mps_v2(self, q, k, v): + def einsum_op_mps_v2(self, q, k, v, callback): if self.mem_total_gb > 8 and q.shape[1] <= 4096: - return self.einsum_op_compvis(q, k, v) + return callback(q, k, v, offset=0) else: - return self.einsum_op_slice_0(q, k, v, 1) + return self.einsum_op_slice_dim0(q, k, v, 1, callback) - def einsum_op_tensor_mem(self, q, k, v, max_tensor_mb): + def einsum_op_tensor_mem(self, q, k, v, max_tensor_mb, callback): size_mb = q.shape[0] * q.shape[1] * k.shape[1] * q.element_size() // (1 << 20) if size_mb <= max_tensor_mb: - return self.einsum_op_compvis(q, k, v) + return callback(q, k, v, offset=0) div = 1 << int((size_mb - 1) / max_tensor_mb).bit_length() if div <= q.shape[0]: - return self.einsum_op_slice_0(q, k, v, q.shape[0] // div) - return self.einsum_op_slice_1(q, k, v, max(q.shape[1] // div, 1)) + print("warning: untested call to einsum_op_slice_dim0") + return self.einsum_op_slice_dim0(q, k, v, q.shape[0] // div, callback) + print("warning: untested call to einsum_op_slice_dim1") + return self.einsum_op_slice_dim1(q, k, v, max(q.shape[1] // div, 1), callback) - def einsum_op_cuda(self, q, k, v): + def einsum_op_cuda(self, q, k, v, callback): stats = torch.cuda.memory_stats(q.device) mem_active = stats['active_bytes.all.current'] mem_reserved = stats['reserved_bytes.all.current'] @@ -221,20 +430,26 @@ class CrossAttention(nn.Module): mem_free_torch = mem_reserved - mem_active mem_free_total = mem_free_cuda + mem_free_torch # Divide factor of safety as there's copying and fragmentation - return self.einsum_op_tensor_mem(q, k, v, mem_free_total / 3.3 / (1 << 20)) + return self.einsum_op_tensor_mem(q, k, v, mem_free_total / 3.3 / (1 << 20), callback) + + def get_attention_mem_efficient(self, q, k, v, callback): + """ + Calculate attention by slicing q, k, and v for memory efficiency then calling + callback(q, k, v, offset=offset) + multiple times if necessary. The offset argument is something + """ - def einsum_op(self, q, k, v): if q.device.type == 'cuda': - return self.einsum_op_cuda(q, k, v) + return self.einsum_op_cuda(q, k, v, callback) if q.device.type == 'mps': if self.mem_total_gb >= 32: - return self.einsum_op_mps_v1(q, k, v) - return self.einsum_op_mps_v2(q, k, v) + return self.einsum_op_mps_v1(q, k, v, callback) + return self.einsum_op_mps_v2(q, k, v, callback) # Smaller slices are faster due to L2/L3/SLC caches. # Tested on i7 with 8MB L3 cache. - return self.einsum_op_tensor_mem(q, k, v, 32) + return self.einsum_op_tensor_mem(q, k, v, 32, callback) def forward(self, x, context=None, mask=None): h = self.heads @@ -247,14 +462,24 @@ class CrossAttention(nn.Module): q, k, v = map(lambda t: rearrange(t, 'b n (h d) -> (b h) n d', h=h), (q, k, v)) - if self.cross_attention_callback is not None: - r = self.cross_attention_callback(q, k, v) - else: - r = self.einsum_op(q, k, v) + def default_attention_calculator(q, k, v, **kwargs): + # calculate attention scores + attention_scores = einsum('b i d, b j d -> b i j', q, k) + # calculate attenion slice by taking the best scores for each latent pixel + attention_slice = attention_scores.softmax(dim=-1, dtype=attention_scores.dtype) + return einsum('b i j, b j d -> b i d', attention_slice, v) + + attention_calculator = \ + self.custom_attention_calculator if self.custom_attention_calculator is not None \ + else default_attention_calculator + + r = self.get_attention_mem_efficient(q, k, v, attention_calculator) + hidden_states = rearrange(r, '(b h) n d -> b n (h d)', h=h) return self.to_out(hidden_states) + class BasicTransformerBlock(nn.Module): def __init__(self, dim, n_heads, d_head, dropout=0., context_dim=None, gated_ff=True, checkpoint=True): super().__init__() @@ -322,3 +547,4 @@ class SpatialTransformer(nn.Module): x = rearrange(x, 'b (h w) c -> b c h w', h=h, w=w) x = self.proj_out(x) return x + x_in +''' \ No newline at end of file diff --git a/ldm/modules/diffusionmodules/model.py b/ldm/modules/diffusionmodules/model.py index 739710d006..73218d36f8 100644 --- a/ldm/modules/diffusionmodules/model.py +++ b/ldm/modules/diffusionmodules/model.py @@ -8,7 +8,7 @@ import numpy as np from einops import rearrange from ldm.util import instantiate_from_config -from ldm.modules.attention import LinearAttention +#from ldm.modules.attention import LinearAttention import psutil @@ -151,10 +151,10 @@ class ResnetBlock(nn.Module): return x + h -class LinAttnBlock(LinearAttention): - """to match AttnBlock usage""" - def __init__(self, in_channels): - super().__init__(dim=in_channels, heads=1, dim_head=in_channels) +#class LinAttnBlock(LinearAttention): +# """to match AttnBlock usage""" +# def __init__(self, in_channels): +# super().__init__(dim=in_channels, heads=1, dim_head=in_channels) class AttnBlock(nn.Module): diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 426fccced3..12ef737134 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -449,7 +449,7 @@ class FrozenCLIPEmbedder(AbstractEncoder): tokens = batch_encoding['input_ids'].to(self.device) z = self.transformer(input_ids=tokens, **kwargs) - return z + return z, tokens def encode(self, text, **kwargs): return self(text, **kwargs) From 37a204324b85b85debdada6216a21ce9735e673f Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 01:54:30 +0200 Subject: [PATCH 006/124] go back to using InvokeAI attention --- ldm/models/diffusion/cross_attention.py | 25 +- ldm/models/diffusion/ksampler.py | 6 +- ldm/modules/attention.py | 513 +++++++----------------- 3 files changed, 172 insertions(+), 372 deletions(-) diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/cross_attention.py index d829162f35..bcc6c8cc94 100644 --- a/ldm/models/diffusion/cross_attention.py +++ b/ldm/models/diffusion/cross_attention.py @@ -75,11 +75,12 @@ class CrossAttentionControl: @classmethod def inject_attention_functions(cls, unet): # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 + def new_attention(self, query, key, value): - # TODO: use baddbmm for better performance - attention_scores = torch.matmul(query, key.transpose(-1, -2)) * self.scale - attn_slice = attention_scores.softmax(dim=-1) - # compute attention output + + attention_scores = torch.functional.einsum('b i d, b j d -> b i j', query, key) + # calculate attention slice by taking the best scores for each latent pixel + attn_slice = attention_scores.softmax(dim=-1, dtype=attention_scores.dtype) if self.use_last_attn_slice: if self.last_attn_slice_mask is not None: @@ -100,13 +101,12 @@ class CrossAttentionControl: attn_slice = attn_slice * self.last_attn_slice_weights self.use_last_attn_weights = False - hidden_states = torch.matmul(attn_slice, value) - # reshape hidden_states - hidden_states = self.reshape_batch_dim_to_heads(hidden_states) - return hidden_states + return torch.functional.einsum('b i j, b j d -> b i d', attn_slice, value) def new_sliced_attention(self, query, key, value, sequence_length, dim): + raise NotImplementedError("not tested yet") + batch_size_attention = query.shape[0] hidden_states = torch.zeros( (batch_size_attention, sequence_length, dim // self.heads), device=query.device, dtype=query.dtype @@ -146,6 +146,12 @@ class CrossAttentionControl: hidden_states = self.reshape_batch_dim_to_heads(hidden_states) return hidden_states + def select_attention_func(module, q, k, v, dim, offset, slice_size): + if dim == 0 or dim == 1: + return new_sliced_attention(module, q, k, v, sequence_length=slice_size, dim=dim) + else: + return new_attention(module, q, k, v) + for name, module in unet.named_modules(): module_name = type(module).__name__ if module_name == "CrossAttention": @@ -153,8 +159,7 @@ class CrossAttentionControl: module.use_last_attn_slice = False module.use_last_attn_weights = False module.save_last_attn_slice = False - module._sliced_attention = new_sliced_attention.__get__(module, type(module)) - module._attention = new_attention.__get__(module, type(module)) + module.set_custom_attention_calculator(select_attention_func) # original code below diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index e5d521f33f..f5af25fc04 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -48,21 +48,21 @@ class CFGDenoiser(nn.Module): def forward(self, x, sigma, uncond, cond, cond_scale): - print('generating unconditioned latents') + #rint('generating unconditioned latents') unconditioned_latents = self.inner_model(x, sigma, cond=uncond) # process x using the original prompt, saving the attention maps if required if self.edited_conditioning is not None: # this is automatically toggled off after the model forward() CrossAttentionControl.request_save_attention_maps(self.inner_model) - print('generating conditioned latents') + #print('generating conditioned latents') conditioned_latents = self.inner_model(x, sigma, cond=cond) if self.edited_conditioning is not None: # process x again, using the saved attention maps but the new conditioning # this is automatically toggled off after the model forward() CrossAttentionControl.request_apply_saved_attention_maps(self.inner_model) - print('generating edited conditioned latents') + #print('generating edited conditioned latents') conditioned_latents = self.inner_model(x, sigma, cond=self.edited_conditioning) if self.warmup < self.warmup_max: diff --git a/ldm/modules/attention.py b/ldm/modules/attention.py index d00b95b1af..1ee0795fdd 100644 --- a/ldm/modules/attention.py +++ b/ldm/modules/attention.py @@ -1,367 +1,158 @@ -# Copyright 2022 The HuggingFace Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +from inspect import isfunction import math -from typing import Optional +from typing import Callable import torch import torch.nn.functional as F -from torch import nn +from torch import nn, einsum +from einops import rearrange, repeat + +from ldm.modules.diffusionmodules.util import checkpoint + +import psutil + +def exists(val): + return val is not None -class AttentionBlock(nn.Module): - """ - An attention block that allows spatial positions to attend to each other. Originally ported from here, but adapted - to the N-d case. - https://github.com/hojonathanho/diffusion/blob/1e0dceb3b3495bbe19116a5e1b3596cd0706c543/diffusion_tf/models/unet.py#L66. - Uses three q, k, v linear layers to compute attention. - - Parameters: - channels (:obj:`int`): The number of channels in the input and output. - num_head_channels (:obj:`int`, *optional*): - The number of channels in each head. If None, then `num_heads` = 1. - num_groups (:obj:`int`, *optional*, defaults to 32): The number of groups to use for group norm. - rescale_output_factor (:obj:`float`, *optional*, defaults to 1.0): The factor to rescale the output by. - eps (:obj:`float`, *optional*, defaults to 1e-5): The epsilon value to use for group norm. - """ - - def __init__( - self, - channels: int, - num_head_channels: Optional[int] = None, - num_groups: int = 32, - rescale_output_factor: float = 1.0, - eps: float = 1e-5, - ): - super().__init__() - self.channels = channels - - self.num_heads = channels // num_head_channels if num_head_channels is not None else 1 - self.num_head_size = num_head_channels - self.group_norm = nn.GroupNorm(num_channels=channels, num_groups=num_groups, eps=eps, affine=True) - - # define q,k,v as linear layers - self.query = nn.Linear(channels, channels) - self.key = nn.Linear(channels, channels) - self.value = nn.Linear(channels, channels) - - self.rescale_output_factor = rescale_output_factor - self.proj_attn = nn.Linear(channels, channels, 1) - - def transpose_for_scores(self, projection: torch.Tensor) -> torch.Tensor: - new_projection_shape = projection.size()[:-1] + (self.num_heads, -1) - # move heads to 2nd position (B, T, H * D) -> (B, T, H, D) -> (B, H, T, D) - new_projection = projection.view(new_projection_shape).permute(0, 2, 1, 3) - return new_projection - - def forward(self, hidden_states): - residual = hidden_states - batch, channel, height, width = hidden_states.shape - - # norm - hidden_states = self.group_norm(hidden_states) - - hidden_states = hidden_states.view(batch, channel, height * width).transpose(1, 2) - - # proj to q, k, v - query_proj = self.query(hidden_states) - key_proj = self.key(hidden_states) - value_proj = self.value(hidden_states) - - # transpose - query_states = self.transpose_for_scores(query_proj) - key_states = self.transpose_for_scores(key_proj) - value_states = self.transpose_for_scores(value_proj) - - # get scores - scale = 1 / math.sqrt(math.sqrt(self.channels / self.num_heads)) - attention_scores = torch.matmul(query_states * scale, key_states.transpose(-1, -2) * scale) # TODO: use baddmm - attention_probs = torch.softmax(attention_scores.float(), dim=-1).type(attention_scores.dtype) - - # compute attention output - hidden_states = torch.matmul(attention_probs, value_states) - - hidden_states = hidden_states.permute(0, 2, 1, 3).contiguous() - new_hidden_states_shape = hidden_states.size()[:-2] + (self.channels,) - hidden_states = hidden_states.view(new_hidden_states_shape) - - # compute next hidden_states - hidden_states = self.proj_attn(hidden_states) - hidden_states = hidden_states.transpose(-1, -2).reshape(batch, channel, height, width) - - # res connect and rescale - hidden_states = (hidden_states + residual) / self.rescale_output_factor - return hidden_states +def uniq(arr): + return{el: True for el in arr}.keys() -class SpatialTransformer(nn.Module): - """ - Transformer block for image-like data. First, project the input (aka embedding) and reshape to b, t, d. Then apply - standard transformer action. Finally, reshape to image. - - Parameters: - in_channels (:obj:`int`): The number of channels in the input and output. - n_heads (:obj:`int`): The number of heads to use for multi-head attention. - d_head (:obj:`int`): The number of channels in each head. - depth (:obj:`int`, *optional*, defaults to 1): The number of layers of Transformer blocks to use. - dropout (:obj:`float`, *optional*, defaults to 0.1): The dropout probability to use. - context_dim (:obj:`int`, *optional*): The number of context dimensions to use. - """ - - def __init__( - self, - in_channels: int, - n_heads: int, - d_head: int, - depth: int = 1, - dropout: float = 0.0, - num_groups: int = 32, - context_dim: Optional[int] = None, - ): - super().__init__() - self.n_heads = n_heads - self.d_head = d_head - self.in_channels = in_channels - inner_dim = n_heads * d_head - self.norm = torch.nn.GroupNorm(num_groups=num_groups, num_channels=in_channels, eps=1e-6, affine=True) - - self.proj_in = nn.Conv2d(in_channels, inner_dim, kernel_size=1, stride=1, padding=0) - - self.transformer_blocks = nn.ModuleList( - [ - BasicTransformerBlock(inner_dim, n_heads, d_head, dropout=dropout, context_dim=context_dim) - for d in range(depth) - ] - ) - - self.proj_out = nn.Conv2d(inner_dim, in_channels, kernel_size=1, stride=1, padding=0) - - def _set_attention_slice(self, slice_size): - for block in self.transformer_blocks: - block._set_attention_slice(slice_size) - - def forward(self, hidden_states, context=None): - # note: if no context is given, cross-attention defaults to self-attention - batch, channel, height, weight = hidden_states.shape - residual = hidden_states - hidden_states = self.norm(hidden_states) - hidden_states = self.proj_in(hidden_states) - inner_dim = hidden_states.shape[1] - hidden_states = hidden_states.permute(0, 2, 3, 1).reshape(batch, height * weight, inner_dim) - for block in self.transformer_blocks: - hidden_states = block(hidden_states, context=context) - hidden_states = hidden_states.reshape(batch, height, weight, inner_dim).permute(0, 3, 1, 2) - hidden_states = self.proj_out(hidden_states) - return hidden_states + residual +def default(val, d): + if exists(val): + return val + return d() if isfunction(d) else d -class BasicTransformerBlock(nn.Module): - r""" - A basic Transformer block. - - Parameters: - dim (:obj:`int`): The number of channels in the input and output. - n_heads (:obj:`int`): The number of heads to use for multi-head attention. - d_head (:obj:`int`): The number of channels in each head. - dropout (:obj:`float`, *optional*, defaults to 0.0): The dropout probability to use. - context_dim (:obj:`int`, *optional*): The size of the context vector for cross attention. - gated_ff (:obj:`bool`, *optional*, defaults to :obj:`False`): Whether to use a gated feed-forward network. - checkpoint (:obj:`bool`, *optional*, defaults to :obj:`False`): Whether to use checkpointing. - """ - - def __init__( - self, - dim: int, - n_heads: int, - d_head: int, - dropout=0.0, - context_dim: Optional[int] = None, - gated_ff: bool = True, - checkpoint: bool = True, - ): - super().__init__() - self.attn1 = CrossAttention( - query_dim=dim, heads=n_heads, dim_head=d_head, dropout=dropout - ) # is a self-attention - self.ff = FeedForward(dim, dropout=dropout, glu=gated_ff) - self.attn2 = CrossAttention( - query_dim=dim, context_dim=context_dim, heads=n_heads, dim_head=d_head, dropout=dropout - ) # is self-attn if context is none - self.norm1 = nn.LayerNorm(dim) - self.norm2 = nn.LayerNorm(dim) - self.norm3 = nn.LayerNorm(dim) - self.checkpoint = checkpoint - - def _set_attention_slice(self, slice_size): - self.attn1._slice_size = slice_size - self.attn2._slice_size = slice_size - - def forward(self, hidden_states, context=None): - hidden_states = hidden_states.contiguous() if hidden_states.device.type == "mps" else hidden_states - hidden_states = self.attn1(self.norm1(hidden_states)) + hidden_states - hidden_states = self.attn2(self.norm2(hidden_states), context=context) + hidden_states - hidden_states = self.ff(self.norm3(hidden_states)) + hidden_states - return hidden_states +def max_neg_value(t): + return -torch.finfo(t.dtype).max -class CrossAttention(nn.Module): - r""" - A cross attention layer. - - Parameters: - query_dim (:obj:`int`): The number of channels in the query. - context_dim (:obj:`int`, *optional*): - The number of channels in the context. If not given, defaults to `query_dim`. - heads (:obj:`int`, *optional*, defaults to 8): The number of heads to use for multi-head attention. - dim_head (:obj:`int`, *optional*, defaults to 64): The number of channels in each head. - dropout (:obj:`float`, *optional*, defaults to 0.0): The dropout probability to use. - """ - - def __init__( - self, query_dim: int, context_dim: Optional[int] = None, heads: int = 8, dim_head: int = 64, dropout: int = 0.0 - ): - super().__init__() - inner_dim = dim_head * heads - context_dim = context_dim if context_dim is not None else query_dim - - self.scale = dim_head**-0.5 - self.heads = heads - # for slice_size > 0 the attention score computation - # is split across the batch axis to save memory - # You can set slice_size with `set_attention_slice` - self._slice_size = None - - self.to_q = nn.Linear(query_dim, inner_dim, bias=False) - self.to_k = nn.Linear(context_dim, inner_dim, bias=False) - self.to_v = nn.Linear(context_dim, inner_dim, bias=False) - - self.to_out = nn.Sequential(nn.Linear(inner_dim, query_dim), nn.Dropout(dropout)) - - def reshape_heads_to_batch_dim(self, tensor): - batch_size, seq_len, dim = tensor.shape - head_size = self.heads - tensor = tensor.reshape(batch_size, seq_len, head_size, dim // head_size) - tensor = tensor.permute(0, 2, 1, 3).reshape(batch_size * head_size, seq_len, dim // head_size) - return tensor - - def reshape_batch_dim_to_heads(self, tensor): - batch_size, seq_len, dim = tensor.shape - head_size = self.heads - tensor = tensor.reshape(batch_size // head_size, head_size, seq_len, dim) - tensor = tensor.permute(0, 2, 1, 3).reshape(batch_size // head_size, seq_len, dim * head_size) - return tensor - - def forward(self, hidden_states, context=None, mask=None): - batch_size, sequence_length, _ = hidden_states.shape - - query = self.to_q(hidden_states) - context = context if context is not None else hidden_states - key = self.to_k(context) - value = self.to_v(context) - - dim = query.shape[-1] - - query = self.reshape_heads_to_batch_dim(query) - key = self.reshape_heads_to_batch_dim(key) - value = self.reshape_heads_to_batch_dim(value) - - # TODO(PVP) - mask is currently never used. Remember to re-implement when used - - # attention, what we cannot get enough of - - if self._slice_size is None or query.shape[0] // self._slice_size == 1: - hidden_states = self._attention(query, key, value) - else: - hidden_states = self._sliced_attention(query, key, value, sequence_length, dim) - - return self.to_out(hidden_states) - - def _attention(self, query, key, value): - # TODO: use baddbmm for better performance - attention_scores = torch.matmul(query, key.transpose(-1, -2)) * self.scale - attention_probs = attention_scores.softmax(dim=-1) - # compute attention output - hidden_states = torch.matmul(attention_probs, value) - # reshape hidden_states - hidden_states = self.reshape_batch_dim_to_heads(hidden_states) - return hidden_states - - def _sliced_attention(self, query, key, value, sequence_length, dim): - batch_size_attention = query.shape[0] - hidden_states = torch.zeros( - (batch_size_attention, sequence_length, dim // self.heads), device=query.device, dtype=query.dtype - ) - slice_size = self._slice_size if self._slice_size is not None else hidden_states.shape[0] - for i in range(hidden_states.shape[0] // slice_size): - start_idx = i * slice_size - end_idx = (i + 1) * slice_size - attn_slice = ( - torch.matmul(query[start_idx:end_idx], key[start_idx:end_idx].transpose(1, 2)) * self.scale - ) # TODO: use baddbmm for better performance - attn_slice = attn_slice.softmax(dim=-1) - attn_slice = torch.matmul(attn_slice, value[start_idx:end_idx]) - - hidden_states[start_idx:end_idx] = attn_slice - - # reshape hidden_states - hidden_states = self.reshape_batch_dim_to_heads(hidden_states) - return hidden_states - - -class FeedForward(nn.Module): - r""" - A feed-forward layer. - - Parameters: - dim (:obj:`int`): The number of channels in the input. - dim_out (:obj:`int`, *optional*): The number of channels in the output. If not given, defaults to `dim`. - mult (:obj:`int`, *optional*, defaults to 4): The multiplier to use for the hidden dimension. - glu (:obj:`bool`, *optional*, defaults to :obj:`False`): Whether to use GLU activation. - dropout (:obj:`float`, *optional*, defaults to 0.0): The dropout probability to use. - """ - - def __init__( - self, dim: int, dim_out: Optional[int] = None, mult: int = 4, glu: bool = False, dropout: float = 0.0 - ): - super().__init__() - inner_dim = int(dim * mult) - dim_out = dim_out if dim_out is not None else dim - project_in = GEGLU(dim, inner_dim) - - self.net = nn.Sequential(project_in, nn.Dropout(dropout), nn.Linear(inner_dim, dim_out)) - - def forward(self, hidden_states): - return self.net(hidden_states) +def init_(tensor): + dim = tensor.shape[-1] + std = 1 / math.sqrt(dim) + tensor.uniform_(-std, std) + return tensor # feedforward class GEGLU(nn.Module): - r""" - A variant of the gated linear unit activation function from https://arxiv.org/abs/2002.05202. - - Parameters: - dim_in (:obj:`int`): The number of channels in the input. - dim_out (:obj:`int`): The number of channels in the output. - """ - - def __init__(self, dim_in: int, dim_out: int): + def __init__(self, dim_in, dim_out): super().__init__() self.proj = nn.Linear(dim_in, dim_out * 2) - def forward(self, hidden_states): - hidden_states, gate = self.proj(hidden_states).chunk(2, dim=-1) - return hidden_states * F.gelu(gate) -''' + def forward(self, x): + x, gate = self.proj(x).chunk(2, dim=-1) + return x * F.gelu(gate) + + +class FeedForward(nn.Module): + def __init__(self, dim, dim_out=None, mult=4, glu=False, dropout=0.): + super().__init__() + inner_dim = int(dim * mult) + dim_out = default(dim_out, dim) + project_in = nn.Sequential( + nn.Linear(dim, inner_dim), + nn.GELU() + ) if not glu else GEGLU(dim, inner_dim) + + self.net = nn.Sequential( + project_in, + nn.Dropout(dropout), + nn.Linear(inner_dim, dim_out) + ) + + def forward(self, x): + return self.net(x) + + +def zero_module(module): + """ + Zero out the parameters of a module and return it. + """ + for p in module.parameters(): + p.detach().zero_() + return module + + +def Normalize(in_channels): + return torch.nn.GroupNorm(num_groups=32, num_channels=in_channels, eps=1e-6, affine=True) + + +class LinearAttention(nn.Module): + def __init__(self, dim, heads=4, dim_head=32): + super().__init__() + self.heads = heads + hidden_dim = dim_head * heads + self.to_qkv = nn.Conv2d(dim, hidden_dim * 3, 1, bias = False) + self.to_out = nn.Conv2d(hidden_dim, dim, 1) + + def forward(self, x): + b, c, h, w = x.shape + qkv = self.to_qkv(x) + q, k, v = rearrange(qkv, 'b (qkv heads c) h w -> qkv b heads c (h w)', heads = self.heads, qkv=3) + k = k.softmax(dim=-1) + context = torch.einsum('bhdn,bhen->bhde', k, v) + out = torch.einsum('bhde,bhdn->bhen', context, q) + out = rearrange(out, 'b heads c (h w) -> b (heads c) h w', heads=self.heads, h=h, w=w) + return self.to_out(out) + + +class SpatialSelfAttention(nn.Module): + def __init__(self, in_channels): + super().__init__() + self.in_channels = in_channels + + self.norm = Normalize(in_channels) + self.q = torch.nn.Conv2d(in_channels, + in_channels, + kernel_size=1, + stride=1, + padding=0) + self.k = torch.nn.Conv2d(in_channels, + in_channels, + kernel_size=1, + stride=1, + padding=0) + self.v = torch.nn.Conv2d(in_channels, + in_channels, + kernel_size=1, + stride=1, + padding=0) + self.proj_out = torch.nn.Conv2d(in_channels, + in_channels, + kernel_size=1, + stride=1, + padding=0) + + def forward(self, x): + h_ = x + h_ = self.norm(h_) + q = self.q(h_) + k = self.k(h_) + v = self.v(h_) + + # compute attention + b,c,h,w = q.shape + q = rearrange(q, 'b c h w -> b (h w) c') + k = rearrange(k, 'b c h w -> b c (h w)') + w_ = torch.einsum('bij,bjk->bik', q, k) + + w_ = w_ * (int(c)**(-0.5)) + w_ = torch.nn.functional.softmax(w_, dim=2) + + # attend to values + v = rearrange(v, 'b c h w -> b c (h w)') + w_ = rearrange(w_, 'b i j -> b j i') + h_ = torch.einsum('bij,bjk->bik', v, w_) + h_ = rearrange(h_, 'b c (h w) -> b c h w', h=h) + h_ = self.proj_out(h_) + + return x+h_ + + + class CrossAttention(nn.Module): def __init__(self, query_dim, context_dim=None, heads=8, dim_head=64, dropout=0.): super().__init__() @@ -382,39 +173,51 @@ class CrossAttention(nn.Module): self.mem_total_gb = psutil.virtual_memory().total // (1 << 30) - self.cross_attention_callback = None + self.custom_attention_calculator = None + + def set_custom_attention_calculator(self, callback:Callable[[torch.Tensor, torch.Tensor, torch.Tensor, int, int, int], torch.Tensor]): + ''' + Set custom attention calculator to be called when attention is calculated + :param callback: Callback, with args q, k, v, dim, offset, slice_size, which returns attention info. + q, k, v are as regular attention calculator. + dim is -1 if the call is non-sliced, or 0 or 1 for dimension-0 or dimension-1 slicing. + If dim is >= 0, offset and slice_size specify the slice start and length. + Pass None to use the default attention calculation. + :return: + ''' + self.custom_attention_calculator = callback def einsum_op_slice_dim0(self, q, k, v, slice_size, callback): r = torch.zeros(q.shape[0], q.shape[1], v.shape[2], device=q.device, dtype=q.dtype) for i in range(0, q.shape[0], slice_size): end = i + slice_size - r[i:end] = callback(q[i:end], k[i:end], v[i:end], offset=i) + r[i:end] = callback(q[i:end], k[i:end], v[i:end], dim=0, offset=i, slice_size=slice_size) return r def einsum_op_slice_dim1(self, q, k, v, slice_size, callback): r = torch.zeros(q.shape[0], q.shape[1], v.shape[2], device=q.device, dtype=q.dtype) for i in range(0, q.shape[1], slice_size): end = i + slice_size - r[:, i:end] = callback(q[:, i:end], k, v, offset=i) + r[:, i:end] = callback(self, q[:, i:end], k, v, dim=1, offset=i, slice_size=slice_size) return r def einsum_op_mps_v1(self, q, k, v, callback): if q.shape[1] <= 4096: # (512x512) max q.shape[1]: 4096 - return callback(q, k, v) + return callback(self, q, k, v, -1, 0, 0) else: slice_size = math.floor(2**30 / (q.shape[0] * q.shape[1])) return self.einsum_op_slice_dim1(q, k, v, slice_size, callback) def einsum_op_mps_v2(self, q, k, v, callback): if self.mem_total_gb > 8 and q.shape[1] <= 4096: - return callback(q, k, v, offset=0) + return callback(self, q, k, v, -1, 0, 0) else: return self.einsum_op_slice_dim0(q, k, v, 1, callback) def einsum_op_tensor_mem(self, q, k, v, max_tensor_mb, callback): size_mb = q.shape[0] * q.shape[1] * k.shape[1] * q.element_size() // (1 << 20) if size_mb <= max_tensor_mb: - return callback(q, k, v, offset=0) + return callback(self, q, k, v, offset=0) div = 1 << int((size_mb - 1) / max_tensor_mb).bit_length() if div <= q.shape[0]: print("warning: untested call to einsum_op_slice_dim0") @@ -433,12 +236,6 @@ class CrossAttention(nn.Module): return self.einsum_op_tensor_mem(q, k, v, mem_free_total / 3.3 / (1 << 20), callback) def get_attention_mem_efficient(self, q, k, v, callback): - """ - Calculate attention by slicing q, k, and v for memory efficiency then calling - callback(q, k, v, offset=offset) - multiple times if necessary. The offset argument is something - """ - if q.device.type == 'cuda': return self.einsum_op_cuda(q, k, v, callback) @@ -479,7 +276,6 @@ class CrossAttention(nn.Module): return self.to_out(hidden_states) - class BasicTransformerBlock(nn.Module): def __init__(self, dim, n_heads, d_head, dropout=0., context_dim=None, gated_ff=True, checkpoint=True): super().__init__() @@ -547,4 +343,3 @@ class SpatialTransformer(nn.Module): x = rearrange(x, 'b (h w) c -> b c h w', h=h, w=w) x = self.proj_out(x) return x + x_in -''' \ No newline at end of file From 056cb0d8a8588c1f0af620df2aa50ad3efc93ec3 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 11:48:33 +0200 Subject: [PATCH 007/124] sliced cross-attention wrangler works --- ldm/models/diffusion/cross_attention.py | 140 +++++++++++++----------- ldm/models/diffusion/ksampler.py | 3 + ldm/modules/attention.py | 83 +++++++------- 3 files changed, 123 insertions(+), 103 deletions(-) diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/cross_attention.py index bcc6c8cc94..d2c9d0fb02 100644 --- a/ldm/models/diffusion/cross_attention.py +++ b/ldm/models/diffusion/cross_attention.py @@ -56,6 +56,13 @@ class CrossAttentionControl: return [module for name, module in model.named_modules() if type(module).__name__ == "CrossAttention" and which_attn in name] + @classmethod + def clear_requests(cls, model): + self_attention_modules = cls.get_attention_modules(model, cls.AttentionType.SELF) + tokens_attention_modules = cls.get_attention_modules(model, cls.AttentionType.TOKENS) + for m in self_attention_modules+tokens_attention_modules: + m.save_last_attn_slice = False + m.use_last_attn_slice = False @classmethod def request_save_attention_maps(cls, model): @@ -76,81 +83,84 @@ class CrossAttentionControl: def inject_attention_functions(cls, unet): # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 - def new_attention(self, query, key, value): + def attention_slice_wrangler(self, attention_scores, suggested_attention_slice, dim, offset, slice_size): + + attn_slice = suggested_attention_slice + if dim is not None: + start = offset + end = start+slice_size + #print(f"in wrangler, sliced dim {dim} {start}-{end}, use_last_attn_slice is {self.use_last_attn_slice}, save_last_attn_slice is {self.save_last_attn_slice}") + #else: + # print(f"in wrangler, whole, use_last_attn_slice is {self.use_last_attn_slice}, save_last_attn_slice is {self.save_last_attn_slice}") - attention_scores = torch.functional.einsum('b i d, b j d -> b i j', query, key) - # calculate attention slice by taking the best scores for each latent pixel - attn_slice = attention_scores.softmax(dim=-1, dtype=attention_scores.dtype) if self.use_last_attn_slice: + this_attn_slice = attn_slice if self.last_attn_slice_mask is not None: - base_attn_slice = torch.index_select(self.last_attn_slice, -1, self.last_attn_slice_indices) + # indices and mask operate on dim=2, no need to slice + base_attn_slice_full = torch.index_select(self.last_attn_slice, -1, self.last_attn_slice_indices) base_attn_slice_mask = self.last_attn_slice_mask - this_attn_slice_mask = 1 - self.last_attn_slice_mask - attn_slice = attn_slice * this_attn_slice_mask + base_attn_slice * base_attn_slice_mask - else: - attn_slice = self.last_attn_slice + if dim is None: + base_attn_slice = base_attn_slice_full + #print("using whole base slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) + elif dim == 0: + base_attn_slice = base_attn_slice_full[start:end] + #print("using base dim 0 slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) + elif dim == 1: + base_attn_slice = base_attn_slice_full[:, start:end] + #print("using base dim 1 slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) - self.use_last_attn_slice = False + attn_slice = this_attn_slice * (1 - base_attn_slice_mask) + \ + base_attn_slice * base_attn_slice_mask + else: + if dim is None: + attn_slice = self.last_attn_slice + #print("took whole slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) + elif dim == 0: + attn_slice = self.last_attn_slice[start:end] + #print("took dim 0 slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) + elif dim == 1: + attn_slice = self.last_attn_slice[:, start:end] + #print("took dim 1 slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) if self.save_last_attn_slice: - self.last_attn_slice = attn_slice - self.save_last_attn_slice = False + if dim is None: + self.last_attn_slice = attn_slice + elif dim == 0: + # dynamically grow last_attn_slice if needed + if self.last_attn_slice is None: + self.last_attn_slice = attn_slice + #print("no last_attn_slice: shape now", self.last_attn_slice.shape) + elif self.last_attn_slice.shape[0] == start: + self.last_attn_slice = torch.cat([self.last_attn_slice, attn_slice], dim=0) + assert(self.last_attn_slice.shape[0] == end) + #print("last_attn_slice too small, appended dim 0 shape", attn_slice.shape, ", shape now", self.last_attn_slice.shape) + else: + # no need to grow + self.last_attn_slice[start:end] = attn_slice + #print("last_attn_slice shape is fine, setting dim 0 shape", attn_slice.shape, ", shape now", self.last_attn_slice.shape) + + elif dim == 1: + # dynamically grow last_attn_slice if needed + if self.last_attn_slice is None: + self.last_attn_slice = attn_slice + elif self.last_attn_slice.shape[1] == start: + self.last_attn_slice = torch.cat([self.last_attn_slice, attn_slice], dim=1) + assert(self.last_attn_slice.shape[1] == end) + else: + # no need to grow + self.last_attn_slice[:, start:end] = attn_slice if self.use_last_attn_weights and self.last_attn_slice_weights is not None: - attn_slice = attn_slice * self.last_attn_slice_weights - self.use_last_attn_weights = False + if dim is None: + weights = self.last_attn_slice_weights + elif dim == 0: + weights = self.last_attn_slice_weights[start:end] + elif dim == 1: + weights = self.last_attn_slice_weights[:, start:end] + attn_slice = attn_slice * weights - return torch.functional.einsum('b i j, b j d -> b i d', attn_slice, value) - - def new_sliced_attention(self, query, key, value, sequence_length, dim): - - raise NotImplementedError("not tested yet") - - batch_size_attention = query.shape[0] - hidden_states = torch.zeros( - (batch_size_attention, sequence_length, dim // self.heads), device=query.device, dtype=query.dtype - ) - slice_size = self._slice_size if self._slice_size is not None else hidden_states.shape[0] - for i in range(hidden_states.shape[0] // slice_size): - start_idx = i * slice_size - end_idx = (i + 1) * slice_size - attn_slice = ( - torch.matmul(query[start_idx:end_idx], key[start_idx:end_idx].transpose(1, 2)) * self.scale - ) # TODO: use baddbmm for better performance - attn_slice = attn_slice.softmax(dim=-1) - - if self.use_last_attn_slice: - if self.last_attn_slice_mask is not None: - new_attn_slice = torch.index_select(self.last_attn_slice, -1, self.last_attn_slice_indices) - attn_slice = attn_slice * ( - 1 - self.last_attn_slice_mask) + new_attn_slice * self.last_attn_slice_mask - else: - attn_slice = self.last_attn_slice - - self.use_last_attn_slice = False - - if self.save_last_attn_slice: - self.last_attn_slice = attn_slice - self.save_last_attn_slice = False - - if self.use_last_attn_weights and self.last_attn_slice_weights is not None: - attn_slice = attn_slice * self.last_attn_slice_weights - self.use_last_attn_weights = False - - attn_slice = torch.matmul(attn_slice, value[start_idx:end_idx]) - - hidden_states[start_idx:end_idx] = attn_slice - - # reshape hidden_states - hidden_states = self.reshape_batch_dim_to_heads(hidden_states) - return hidden_states - - def select_attention_func(module, q, k, v, dim, offset, slice_size): - if dim == 0 or dim == 1: - return new_sliced_attention(module, q, k, v, sequence_length=slice_size, dim=dim) - else: - return new_attention(module, q, k, v) + return attn_slice for name, module in unet.named_modules(): module_name = type(module).__name__ @@ -159,7 +169,7 @@ class CrossAttentionControl: module.use_last_attn_slice = False module.use_last_attn_weights = False module.save_last_attn_slice = False - module.set_custom_attention_calculator(select_attention_func) + module.set_attention_slice_wrangler(attention_slice_wrangler) # original code below diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index f5af25fc04..3b5a59a981 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -48,6 +48,8 @@ class CFGDenoiser(nn.Module): def forward(self, x, sigma, uncond, cond, cond_scale): + CrossAttentionControl.clear_requests(self.inner_model) + #rint('generating unconditioned latents') unconditioned_latents = self.inner_model(x, sigma, cond=uncond) @@ -61,6 +63,7 @@ class CFGDenoiser(nn.Module): if self.edited_conditioning is not None: # process x again, using the saved attention maps but the new conditioning # this is automatically toggled off after the model forward() + CrossAttentionControl.clear_requests(self.inner_model) CrossAttentionControl.request_apply_saved_attention_maps(self.inner_model) #print('generating edited conditioned latents') conditioned_latents = self.inner_model(x, sigma, cond=self.edited_conditioning) diff --git a/ldm/modules/attention.py b/ldm/modules/attention.py index 1ee0795fdd..8d160f004b 100644 --- a/ldm/modules/attention.py +++ b/ldm/modules/attention.py @@ -173,59 +173,75 @@ class CrossAttention(nn.Module): self.mem_total_gb = psutil.virtual_memory().total // (1 << 30) - self.custom_attention_calculator = None + self.attention_slice_wrangler = None - def set_custom_attention_calculator(self, callback:Callable[[torch.Tensor, torch.Tensor, torch.Tensor, int, int, int], torch.Tensor]): + def set_attention_slice_wrangler(self, wrangler:Callable[[nn.Module, torch.Tensor, torch.Tensor, int, int, int], torch.Tensor]): ''' Set custom attention calculator to be called when attention is calculated - :param callback: Callback, with args q, k, v, dim, offset, slice_size, which returns attention info. - q, k, v are as regular attention calculator. + :param wrangler: Callback, with args (self, attention_scores, suggested_attention_slice, dim, offset, slice_size), + which returns either the suggested_attention_slice or an adjusted equivalent. + self is the current CrossAttention module for which the callback is being invoked. + attention_scores are the scores for attention + suggested_attention_slice is a softmax(dim=-1) over attention_scores dim is -1 if the call is non-sliced, or 0 or 1 for dimension-0 or dimension-1 slicing. If dim is >= 0, offset and slice_size specify the slice start and length. + Pass None to use the default attention calculation. :return: ''' - self.custom_attention_calculator = callback + self.attention_slice_wrangler = wrangler - def einsum_op_slice_dim0(self, q, k, v, slice_size, callback): + def einsum_lowest_level(self, q, k, v, dim, offset, slice_size): + # calculate attention scores + attention_scores = einsum('b i d, b j d -> b i j', q, k) + # calculate attenion slice by taking the best scores for each latent pixel + default_attention_slice = attention_scores.softmax(dim=-1, dtype=attention_scores.dtype) + if self.attention_slice_wrangler is not None: + attention_slice = self.attention_slice_wrangler(self, attention_scores, default_attention_slice, dim, offset, slice_size) + else: + attention_slice = default_attention_slice + + return einsum('b i j, b j d -> b i d', attention_slice, v) + + def einsum_op_slice_dim0(self, q, k, v, slice_size): r = torch.zeros(q.shape[0], q.shape[1], v.shape[2], device=q.device, dtype=q.dtype) for i in range(0, q.shape[0], slice_size): end = i + slice_size - r[i:end] = callback(q[i:end], k[i:end], v[i:end], dim=0, offset=i, slice_size=slice_size) + r[i:end] = self.einsum_lowest_level(q[i:end], k[i:end], v[i:end], dim=0, offset=i, slice_size=slice_size) return r - def einsum_op_slice_dim1(self, q, k, v, slice_size, callback): + def einsum_op_slice_dim1(self, q, k, v, slice_size): r = torch.zeros(q.shape[0], q.shape[1], v.shape[2], device=q.device, dtype=q.dtype) for i in range(0, q.shape[1], slice_size): end = i + slice_size - r[:, i:end] = callback(self, q[:, i:end], k, v, dim=1, offset=i, slice_size=slice_size) + r[:, i:end] = self.einsum_lowest_level(q[:, i:end], k, v, dim=1, offset=i, slice_size=slice_size) return r - def einsum_op_mps_v1(self, q, k, v, callback): + def einsum_op_mps_v1(self, q, k, v): if q.shape[1] <= 4096: # (512x512) max q.shape[1]: 4096 - return callback(self, q, k, v, -1, 0, 0) + return self.einsum_lowest_level(q, k, v, None, None, None) else: slice_size = math.floor(2**30 / (q.shape[0] * q.shape[1])) - return self.einsum_op_slice_dim1(q, k, v, slice_size, callback) + return self.einsum_op_slice_dim1(q, k, v, slice_size) - def einsum_op_mps_v2(self, q, k, v, callback): + def einsum_op_mps_v2(self, q, k, v): if self.mem_total_gb > 8 and q.shape[1] <= 4096: - return callback(self, q, k, v, -1, 0, 0) + return self.einsum_lowest_level(q, k, v, None, None, None) else: - return self.einsum_op_slice_dim0(q, k, v, 1, callback) + return self.einsum_op_slice_dim0(q, k, v, 1) - def einsum_op_tensor_mem(self, q, k, v, max_tensor_mb, callback): + def einsum_op_tensor_mem(self, q, k, v, max_tensor_mb): size_mb = q.shape[0] * q.shape[1] * k.shape[1] * q.element_size() // (1 << 20) if size_mb <= max_tensor_mb: - return callback(self, q, k, v, offset=0) + return self.einsum_lowest_level(q, k, v, None, None, None) div = 1 << int((size_mb - 1) / max_tensor_mb).bit_length() if div <= q.shape[0]: print("warning: untested call to einsum_op_slice_dim0") - return self.einsum_op_slice_dim0(q, k, v, q.shape[0] // div, callback) + return self.einsum_op_slice_dim0(q, k, v, q.shape[0] // div) print("warning: untested call to einsum_op_slice_dim1") - return self.einsum_op_slice_dim1(q, k, v, max(q.shape[1] // div, 1), callback) + return self.einsum_op_slice_dim1(q, k, v, max(q.shape[1] // div, 1)) - def einsum_op_cuda(self, q, k, v, callback): + def einsum_op_cuda(self, q, k, v): stats = torch.cuda.memory_stats(q.device) mem_active = stats['active_bytes.all.current'] mem_reserved = stats['reserved_bytes.all.current'] @@ -233,20 +249,20 @@ class CrossAttention(nn.Module): mem_free_torch = mem_reserved - mem_active mem_free_total = mem_free_cuda + mem_free_torch # Divide factor of safety as there's copying and fragmentation - return self.einsum_op_tensor_mem(q, k, v, mem_free_total / 3.3 / (1 << 20), callback) + return self.einsum_op_tensor_mem(q, k, v, mem_free_total / 3.3 / (1 << 20)) - def get_attention_mem_efficient(self, q, k, v, callback): + def get_attention_mem_efficient(self, q, k, v): if q.device.type == 'cuda': - return self.einsum_op_cuda(q, k, v, callback) + return self.einsum_op_cuda(q, k, v) if q.device.type == 'mps': if self.mem_total_gb >= 32: - return self.einsum_op_mps_v1(q, k, v, callback) - return self.einsum_op_mps_v2(q, k, v, callback) + return self.einsum_op_mps_v1(q, k, v) + return self.einsum_op_mps_v2(q, k, v) # Smaller slices are faster due to L2/L3/SLC caches. # Tested on i7 with 8MB L3 cache. - return self.einsum_op_tensor_mem(q, k, v, 32, callback) + return self.einsum_op_tensor_mem(q, k, v, 32) def forward(self, x, context=None, mask=None): h = self.heads @@ -259,23 +275,14 @@ class CrossAttention(nn.Module): q, k, v = map(lambda t: rearrange(t, 'b n (h d) -> (b h) n d', h=h), (q, k, v)) - def default_attention_calculator(q, k, v, **kwargs): - # calculate attention scores - attention_scores = einsum('b i d, b j d -> b i j', q, k) - # calculate attenion slice by taking the best scores for each latent pixel - attention_slice = attention_scores.softmax(dim=-1, dtype=attention_scores.dtype) - return einsum('b i j, b j d -> b i d', attention_slice, v) - - attention_calculator = \ - self.custom_attention_calculator if self.custom_attention_calculator is not None \ - else default_attention_calculator - - r = self.get_attention_mem_efficient(q, k, v, attention_calculator) + r = self.get_attention_mem_efficient(q, k, v) hidden_states = rearrange(r, '(b h) n d -> b n (h d)', h=h) return self.to_out(hidden_states) + + class BasicTransformerBlock(nn.Module): def __init__(self, dim, n_heads, d_head, dropout=0., context_dim=None, gated_ff=True, checkpoint=True): super().__init__() From 711ffd238f3ed1a241f0df20b21ebab6ca8a7308 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 13:52:40 +0200 Subject: [PATCH 008/124] cleanup --- ldm/models/diffusion/cross_attention.py | 69 +++++++++++++++---------- ldm/models/diffusion/ksampler.py | 2 +- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/cross_attention.py index d2c9d0fb02..d5c3eaadf0 100644 --- a/ldm/models/diffusion/cross_attention.py +++ b/ldm/models/diffusion/cross_attention.py @@ -6,14 +6,16 @@ import torch # https://github.com/bloc97/CrossAttentionControl class CrossAttentionControl: - class AttentionType(Enum): - SELF = 1 - TOKENS = 2 + + + @classmethod + def clear_attention_editing(cls, model): + cls.remove_attention_function(model) @classmethod def setup_attention_editing(cls, model, - substitute_conditioning: torch.Tensor = None, - edit_opcodes: list = None): + substitute_conditioning: torch.Tensor, + edit_opcodes: list): """ :param model: The unet model to inject into. :param substitute_conditioning: The "edited" conditioning vector, [Bx77x768] @@ -23,31 +25,34 @@ class CrossAttentionControl: """ # adapted from init_attention_edit - if substitute_conditioning is not None: + device = substitute_conditioning.device - device = substitute_conditioning.device + max_length = model.inner_model.cond_stage_model.max_length + # mask=1 means use base prompt attention, mask=0 means use edited prompt attention + mask = torch.zeros(max_length) + indices_target = torch.arange(max_length, dtype=torch.long) + indices = torch.zeros(max_length, dtype=torch.long) + for name, a0, a1, b0, b1 in edit_opcodes: + if b0 < max_length: + if name == "equal":# or (name == "replace" and a1 - a0 == b1 - b0): + # these tokens have not been edited + indices[b0:b1] = indices_target[a0:a1] + mask[b0:b1] = 1 - max_length = model.inner_model.cond_stage_model.max_length - # mask=1 means use base prompt attention, mask=0 means use edited prompt attention - mask = torch.zeros(max_length) - indices_target = torch.arange(max_length, dtype=torch.long) - indices = torch.zeros(max_length, dtype=torch.long) - for name, a0, a1, b0, b1 in edit_opcodes: - if b0 < max_length: - if name == "equal":# or (name == "replace" and a1 - a0 == b1 - b0): - # these tokens have not been edited - indices[b0:b1] = indices_target[a0:a1] - mask[b0:b1] = 1 + for m in cls.get_attention_modules(model, cls.AttentionType.SELF): + m.last_attn_slice_mask = None + m.last_attn_slice_indices = None - for m in cls.get_attention_modules(model, cls.AttentionType.SELF): - m.last_attn_slice_mask = None - m.last_attn_slice_indices = None + for m in cls.get_attention_modules(model, cls.AttentionType.TOKENS): + m.last_attn_slice_mask = mask.to(device) + m.last_attn_slice_indices = indices.to(device) - for m in cls.get_attention_modules(model, cls.AttentionType.TOKENS): - m.last_attn_slice_mask = mask.to(device) - m.last_attn_slice_indices = indices.to(device) + cls.inject_attention_function(model) - cls.inject_attention_functions(model) + + class AttentionType(Enum): + SELF = 1 + TOKENS = 2 @classmethod @@ -79,8 +84,9 @@ class CrossAttentionControl: m.use_last_attn_slice = True + @classmethod - def inject_attention_functions(cls, unet): + def inject_attention_function(cls, unet): # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 def attention_slice_wrangler(self, attention_scores, suggested_attention_slice, dim, offset, slice_size): @@ -166,11 +172,20 @@ class CrossAttentionControl: module_name = type(module).__name__ if module_name == "CrossAttention": module.last_attn_slice = None - module.use_last_attn_slice = False + module.last_attn_slice_indices = None + module.last_attn_slice_mask = None module.use_last_attn_weights = False + module.use_last_attn_slice = False module.save_last_attn_slice = False module.set_attention_slice_wrangler(attention_slice_wrangler) + @classmethod + def remove_attention_function(cls, unet): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == "CrossAttention": + module.set_attention_slice_wrangler(None) + # original code below diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 3b5a59a981..c8b4823111 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -44,7 +44,7 @@ class CFGDenoiser(nn.Module): CrossAttentionControl.setup_attention_editing(self.inner_model, edited_conditioning, edit_opcodes) else: # pass through the attention func but don't act on it - CrossAttentionControl.setup_attention_editing(self.inner_model) + CrossAttentionControl.clear_attention_editing(self.inner_model) def forward(self, x, sigma, uncond, cond, cond_scale): From 09f62032ec1cfad3e47074856a0da5718251570f Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 19:49:25 +0200 Subject: [PATCH 009/124] cleanup and clarify comments --- ldm/models/diffusion/cross_attention.py | 4 +++ ldm/models/diffusion/ksampler.py | 40 +++++++++++++++---------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/cross_attention.py index d5c3eaadf0..71d5995b4a 100644 --- a/ldm/models/diffusion/cross_attention.py +++ b/ldm/models/diffusion/cross_attention.py @@ -74,6 +74,8 @@ class CrossAttentionControl: self_attention_modules = cls.get_attention_modules(model, cls.AttentionType.SELF) tokens_attention_modules = cls.get_attention_modules(model, cls.AttentionType.TOKENS) for m in self_attention_modules+tokens_attention_modules: + # clear out the saved slice in case the outermost dim changes + m.last_attn_slice = None m.save_last_attn_slice = True @classmethod @@ -91,6 +93,8 @@ class CrossAttentionControl: def attention_slice_wrangler(self, attention_scores, suggested_attention_slice, dim, offset, slice_size): + #print("in wrangler with suggested_attention_slice shape", suggested_attention_slice.shape, "dim", dim) + attn_slice = suggested_attention_slice if dim is not None: start = offset diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index c8b4823111..7459e2e7cc 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -50,23 +50,32 @@ class CFGDenoiser(nn.Module): CrossAttentionControl.clear_requests(self.inner_model) - #rint('generating unconditioned latents') - unconditioned_latents = self.inner_model(x, sigma, cond=uncond) + if self.edited_conditioning is None: + # faster batch path + x_twice = torch.cat([x]*2) + sigma_twice = torch.cat([sigma]*2) + both_conditionings = torch.cat([uncond, cond]) + unconditioned_next_x, conditioned_next_x = self.inner_model(x_twice, sigma_twice, cond=both_conditionings).chunk(2) + else: + # slower non-batched path (20% slower on mac MPS) + # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of + # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. + # This messes app their application later, due to mismatched shape of dim 0 (16 vs. 8) + # (For the batched invocation the `wrangler` function gets attention tensor with shape[0]=16, + # representing batched uncond + cond, but then when it comes to applying the saved attention, the + # wrangler gets an attention tensor which only has shape[0]=8, representing just self.edited_conditionings.) + # todo: give CrossAttentionControl's `wrangler` function more info so it can work with a batched call as well. + unconditioned_next_x = self.inner_model(x, sigma, cond=uncond) - # process x using the original prompt, saving the attention maps if required - if self.edited_conditioning is not None: - # this is automatically toggled off after the model forward() + # process x using the original prompt, saving the attention maps CrossAttentionControl.request_save_attention_maps(self.inner_model) - #print('generating conditioned latents') - conditioned_latents = self.inner_model(x, sigma, cond=cond) - - if self.edited_conditioning is not None: - # process x again, using the saved attention maps but the new conditioning - # this is automatically toggled off after the model forward() + _ = self.inner_model(x, sigma, cond=cond) CrossAttentionControl.clear_requests(self.inner_model) + + # process x again, using the saved attention maps to control where self.edited_conditioning will be applied CrossAttentionControl.request_apply_saved_attention_maps(self.inner_model) - #print('generating edited conditioned latents') - conditioned_latents = self.inner_model(x, sigma, cond=self.edited_conditioning) + conditioned_next_x = self.inner_model(x, sigma, cond=self.edited_conditioning) + CrossAttentionControl.clear_requests(self.inner_model) if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) @@ -75,8 +84,9 @@ class CFGDenoiser(nn.Module): thresh = self.threshold if thresh > self.threshold: thresh = self.threshold - delta = (conditioned_latents - unconditioned_latents) - return cfg_apply_threshold(unconditioned_latents + delta * cond_scale, thresh) + # to scale how much effect conditioning has, calculate the changes it does and then scale that + scaled_delta = (conditioned_next_x - unconditioned_next_x) * cond_scale + return cfg_apply_threshold(unconditioned_next_x + scaled_delta, thresh) class KSampler(Sampler): From 54e6a68acbf314ddbcbda450bb0c5d39b39af4a3 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 22:09:06 +0200 Subject: [PATCH 010/124] wip bringing cross-attention to PLMS and DDIM --- ldm/invoke/generator/txt2img.py | 4 +- ldm/models/diffusion/cross_attention.py | 52 ++++++++++++++++++++- ldm/models/diffusion/ddim.py | 21 +++++++-- ldm/models/diffusion/ksampler.py | 62 +++++++------------------ ldm/models/diffusion/plms.py | 28 ++++++++--- ldm/models/diffusion/sampler.py | 8 ++-- 6 files changed, 112 insertions(+), 63 deletions(-) diff --git a/ldm/invoke/generator/txt2img.py b/ldm/invoke/generator/txt2img.py index 9f066745f7..669f3d81ff 100644 --- a/ldm/invoke/generator/txt2img.py +++ b/ldm/invoke/generator/txt2img.py @@ -19,7 +19,7 @@ class Txt2Img(Generator): kwargs are 'width' and 'height' """ self.perlin = perlin - uc, c, ec, edit_index_map = conditioning + uc, c, ec, edit_opcodes = conditioning @torch.no_grad() def make_image(x_T): @@ -44,7 +44,7 @@ class Txt2Img(Generator): unconditional_guidance_scale = cfg_scale, unconditional_conditioning = uc, edited_conditioning = ec, - edit_token_index_map = edit_index_map, + conditioning_edit_opcodes = edit_opcodes, eta = ddim_eta, img_callback = step_callback, threshold = threshold, diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/cross_attention.py index 71d5995b4a..c0760fff47 100644 --- a/ldm/models/diffusion/cross_attention.py +++ b/ldm/models/diffusion/cross_attention.py @@ -2,6 +2,55 @@ from enum import Enum import torch + +class CrossAttentionControllableDiffusionMixin: + + def setup_cross_attention_control_if_appropriate(self, model, edited_conditioning, edit_opcodes): + self.edited_conditioning = edited_conditioning + + if edited_conditioning is not None: + # a cat sitting on a car + CrossAttentionControl.setup_attention_editing(model, edited_conditioning, edit_opcodes) + else: + # pass through the attention func but don't act on it + CrossAttentionControl.clear_attention_editing(model) + + def cleanup_cross_attention_control(self, model): + CrossAttentionControl.clear_attention_editing(model) + + def do_cross_attention_controllable_diffusion_step(self, x, sigma, unconditioning, conditioning, model, model_forward_callback): + + CrossAttentionControl.clear_requests(model) + + if self.edited_conditioning is None: + # faster batched path + x_twice = torch.cat([x]*2) + sigma_twice = torch.cat([sigma]*2) + both_conditionings = torch.cat([unconditioning, conditioning]) + unconditioned_next_x, conditioned_next_x = model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) + else: + # slower non-batched path (20% slower on mac MPS) + # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of + # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. + # This messes app their application later, due to mismatched shape of dim 0 (seems to be 16 for batched vs. 8) + # (For the batched invocation the `wrangler` function gets attention tensor with shape[0]=16, + # representing batched uncond + cond, but then when it comes to applying the saved attention, the + # wrangler gets an attention tensor which only has shape[0]=8, representing just self.edited_conditionings.) + # todo: give CrossAttentionControl's `wrangler` function more info so it can work with a batched call as well. + unconditioned_next_x = model_forward_callback(x, sigma, unconditioning) + + # process x using the original prompt, saving the attention maps + CrossAttentionControl.request_save_attention_maps(model) + _ = model_forward_callback(x, sigma, cond=conditioning) + CrossAttentionControl.clear_requests(model) + + # process x again, using the saved attention maps to control where self.edited_conditioning will be applied + CrossAttentionControl.request_apply_saved_attention_maps(model) + conditioned_next_x = model_forward_callback(x, sigma, self.edited_conditioning) + CrossAttentionControl.clear_requests(model) + + return unconditioned_next_x, conditioned_next_x + # adapted from bloc97's CrossAttentionControl colab # https://github.com/bloc97/CrossAttentionControl @@ -27,7 +76,8 @@ class CrossAttentionControl: # adapted from init_attention_edit device = substitute_conditioning.device - max_length = model.inner_model.cond_stage_model.max_length + # urgh. should this be hardcoded? + max_length = 77 # mask=1 means use base prompt attention, mask=0 means use edited prompt attention mask = torch.zeros(max_length) indices_target = torch.arange(max_length, dtype=torch.long) diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index f5dada8627..4980b03c42 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -5,13 +5,23 @@ import numpy as np from tqdm import tqdm from functools import partial from ldm.invoke.devices import choose_torch_device +from ldm.models.diffusion.cross_attention import CrossAttentionControllableDiffusionMixin from ldm.models.diffusion.sampler import Sampler from ldm.modules.diffusionmodules.util import noise_like -class DDIMSampler(Sampler): +class DDIMSampler(Sampler, CrossAttentionControllableDiffusionMixin): def __init__(self, model, schedule='linear', device=None, **kwargs): super().__init__(model,schedule,model.num_timesteps,device) + def prepare_to_sample(self, t_enc, **kwargs): + super().prepare_to_sample(t_enc, **kwargs) + + edited_conditioning = kwargs.get('edited_conditioning', None) + edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) + + self.setup_cross_attention_control_if_appropriate(self.model, edited_conditioning, edit_opcodes) + + # This is the central routine @torch.no_grad() def p_sample( @@ -37,12 +47,13 @@ class DDIMSampler(Sampler): unconditional_conditioning is None or unconditional_guidance_scale == 1.0 ): + # damian0815 does not think this code path is ever used e_t = self.model.apply_model(x, t, c) else: - x_in = torch.cat([x] * 2) - t_in = torch.cat([t] * 2) - c_in = torch.cat([unconditional_conditioning, c]) - e_t_uncond, e_t = self.model.apply_model(x_in, t_in, c_in).chunk(2) + + e_t_uncond, e_t = self.do_cross_attention_controllable_diffusion_step(x, t, unconditional_conditioning, c, self.model, + model_forward_callback=lambda x, sigma, cond: self.model.apply_model(x, sigma, cond)) + e_t = e_t_uncond + unconditional_guidance_scale * ( e_t - e_t_uncond ) diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 7459e2e7cc..78d5978efe 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -13,7 +13,8 @@ from ldm.modules.diffusionmodules.util import ( noise_like, extract_into_tensor, ) -from ldm.models.diffusion.cross_attention import CrossAttentionControl +from ldm.models.diffusion.cross_attention import CrossAttentionControl, CrossAttentionControllableDiffusionMixin + def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): if threshold <= 0.0: @@ -29,53 +30,26 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): return torch.clamp(result, min=minval, max=maxval) -class CFGDenoiser(nn.Module): - def __init__(self, model, threshold = 0, warmup = 0, edited_conditioning = None, edit_opcodes = None): +class CFGDenoiser(nn.Module, CrossAttentionControllableDiffusionMixin): + def __init__(self, model, threshold = 0, warmup = 0): super().__init__() self.inner_model = model self.threshold = threshold self.warmup_max = warmup self.warmup = max(warmup / 10, 1) - self.edited_conditioning = edited_conditioning + def prepare_to_sample(self, t_enc, **kwargs): + + edited_conditioning = kwargs.get('edited_conditioning', None) + conditioning_edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) + + self.setup_cross_attention_control_if_appropriate(self.model, edited_conditioning, conditioning_edit_opcodes) - if edited_conditioning is not None: - # a cat sitting on a car - CrossAttentionControl.setup_attention_editing(self.inner_model, edited_conditioning, edit_opcodes) - else: - # pass through the attention func but don't act on it - CrossAttentionControl.clear_attention_editing(self.inner_model) def forward(self, x, sigma, uncond, cond, cond_scale): - CrossAttentionControl.clear_requests(self.inner_model) - - if self.edited_conditioning is None: - # faster batch path - x_twice = torch.cat([x]*2) - sigma_twice = torch.cat([sigma]*2) - both_conditionings = torch.cat([uncond, cond]) - unconditioned_next_x, conditioned_next_x = self.inner_model(x_twice, sigma_twice, cond=both_conditionings).chunk(2) - else: - # slower non-batched path (20% slower on mac MPS) - # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of - # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. - # This messes app their application later, due to mismatched shape of dim 0 (16 vs. 8) - # (For the batched invocation the `wrangler` function gets attention tensor with shape[0]=16, - # representing batched uncond + cond, but then when it comes to applying the saved attention, the - # wrangler gets an attention tensor which only has shape[0]=8, representing just self.edited_conditionings.) - # todo: give CrossAttentionControl's `wrangler` function more info so it can work with a batched call as well. - unconditioned_next_x = self.inner_model(x, sigma, cond=uncond) - - # process x using the original prompt, saving the attention maps - CrossAttentionControl.request_save_attention_maps(self.inner_model) - _ = self.inner_model(x, sigma, cond=cond) - CrossAttentionControl.clear_requests(self.inner_model) - - # process x again, using the saved attention maps to control where self.edited_conditioning will be applied - CrossAttentionControl.request_apply_saved_attention_maps(self.inner_model) - conditioned_next_x = self.inner_model(x, sigma, cond=self.edited_conditioning) - CrossAttentionControl.clear_requests(self.inner_model) + unconditioned_next_x, conditioned_next_x = self.do_cross_attention_controllable_diffusion_step(x, sigma, uncond, cond, self.inner_model, + model_forward_callback=lambda x, sigma, cond: self.inner_model(x, sigma, cond=cond)) if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) @@ -204,7 +178,7 @@ class KSampler(Sampler): unconditional_guidance_scale=1.0, unconditional_conditioning=None, edited_conditioning=None, - edit_token_index_map=None, + conditioning_edit_opcodes=None, threshold = 0, perlin = 0, # this has to come in the same format as the conditioning, # e.g. as encoded tokens, ... @@ -236,21 +210,22 @@ class KSampler(Sampler): else: x = torch.randn([batch_size, *shape], device=self.device) * sigmas[0] - model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10), - edited_conditioning=edited_conditioning, edit_opcodes=edit_token_index_map) + model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10)) + model_wrap_cfg.prepare_to_sample(S, edited_conditioning=edited_conditioning, conditioning_edit_opcodes=conditioning_edit_opcodes) extra_args = { 'cond': conditioning, 'uncond': unconditional_conditioning, 'cond_scale': unconditional_guidance_scale, } print(f'>> Sampling with k_{self.schedule} starting at step {len(self.sigmas)-S-1} of {len(self.sigmas)-1} ({S} new sampling steps)') - return ( + sampling_result = ( K.sampling.__dict__[f'sample_{self.schedule}']( model_wrap_cfg, x, sigmas, extra_args=extra_args, callback=route_callback ), None, ) + return sampling_result # this code will support inpainting if and when ksampler API modified or # a workaround is found. @@ -312,7 +287,7 @@ class KSampler(Sampler): else: return x - def prepare_to_sample(self,t_enc): + def prepare_to_sample(self,t_enc,**kwargs): self.t_enc = t_enc self.model_wrap = None self.ds = None @@ -323,4 +298,3 @@ class KSampler(Sampler): Overrides parent method to return the q_sample of the inner model. ''' return self.model.inner_model.q_sample(x0,ts) - diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index 9e722eb932..eb778813a0 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -5,14 +5,24 @@ import numpy as np from tqdm import tqdm from functools import partial from ldm.invoke.devices import choose_torch_device +from ldm.models.diffusion.cross_attention import CrossAttentionControllableDiffusionMixin from ldm.models.diffusion.sampler import Sampler from ldm.modules.diffusionmodules.util import noise_like -class PLMSSampler(Sampler): +class PLMSSampler(Sampler, CrossAttentionControllableDiffusionMixin): def __init__(self, model, schedule='linear', device=None, **kwargs): super().__init__(model,schedule,model.num_timesteps, device) + def prepare_to_sample(self, t_enc, **kwargs): + super().prepare_to_sample(t_enc, **kwargs) + + edited_conditioning = kwargs.get('edited_conditioning', None) + edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) + + self.setup_cross_attention_control_if_appropriate(self.model, edited_conditioning, edit_opcodes) + + # this is the essential routine @torch.no_grad() def p_sample( @@ -41,14 +51,18 @@ class PLMSSampler(Sampler): unconditional_conditioning is None or unconditional_guidance_scale == 1.0 ): + # damian0815 does not think this code path is ever used e_t = self.model.apply_model(x, t, c) else: - x_in = torch.cat([x] * 2) - t_in = torch.cat([t] * 2) - c_in = torch.cat([unconditional_conditioning, c]) - e_t_uncond, e_t = self.model.apply_model( - x_in, t_in, c_in - ).chunk(2) + #x_in = torch.cat([x] * 2) + #t_in = torch.cat([t] * 2) + #c_in = torch.cat([unconditional_conditioning, c]) + #e_t_uncond, e_t = self.model.apply_model( + # x_in, t_in, c_in + #).chunk(2) + e_t_uncond, e_t = self.do_cross_attention_controllable_diffusion_step(x, t, unconditional_conditioning, c, self.model, + model_forward_callback=lambda x, sigma, cond: self.model.apply_model(x, sigma, cond)) + e_t = e_t_uncond + unconditional_guidance_scale * ( e_t - e_t_uncond ) diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index eb7caebba0..b8377ebb39 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -192,6 +192,7 @@ class Sampler(object): unconditional_guidance_scale=unconditional_guidance_scale, unconditional_conditioning=unconditional_conditioning, steps=S, + **kwargs ) return samples, intermediates @@ -216,6 +217,7 @@ class Sampler(object): unconditional_guidance_scale=1.0, unconditional_conditioning=None, steps=None, + **kwargs ): b = shape[0] time_range = ( @@ -233,7 +235,7 @@ class Sampler(object): dynamic_ncols=True, ) old_eps = [] - self.prepare_to_sample(t_enc=total_steps) + self.prepare_to_sample(t_enc=total_steps,**kwargs) img = self.get_initial_image(x_T,shape,total_steps) # probably don't need this at all @@ -323,7 +325,7 @@ class Sampler(object): iterator = tqdm(time_range, desc='Decoding image', total=total_steps) x_dec = x_latent x0 = init_latent - self.prepare_to_sample(t_enc=total_steps) + self.prepare_to_sample(t_enc=total_steps,**kwargs) for i, step in enumerate(iterator): index = total_steps - i - 1 @@ -414,5 +416,3 @@ class Sampler(object): ''' return self.model.q_sample(x0,ts) - - From d572af2acf66a4c150dc87122379378987be5486 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 22:22:47 +0200 Subject: [PATCH 011/124] fix cross-attention on k* samplers --- ldm/models/diffusion/ksampler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 78d5978efe..417458f18f 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -43,7 +43,7 @@ class CFGDenoiser(nn.Module, CrossAttentionControllableDiffusionMixin): edited_conditioning = kwargs.get('edited_conditioning', None) conditioning_edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) - self.setup_cross_attention_control_if_appropriate(self.model, edited_conditioning, conditioning_edit_opcodes) + self.setup_cross_attention_control_if_appropriate(self.inner_model, edited_conditioning, conditioning_edit_opcodes) def forward(self, x, sigma, uncond, cond, cond_scale): From 2b79a716aac7968550382d991a2e5f85bf8ed34e Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 22:54:51 +0200 Subject: [PATCH 012/124] wip hi-res fix --- ldm/invoke/generator/txt2img2img.py | 8 ++++++-- ldm/models/diffusion/sampler.py | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ldm/invoke/generator/txt2img2img.py b/ldm/invoke/generator/txt2img2img.py index 945ebadd90..afe680ac6e 100644 --- a/ldm/invoke/generator/txt2img2img.py +++ b/ldm/invoke/generator/txt2img2img.py @@ -22,7 +22,7 @@ class Txt2Img2Img(Generator): Return value depends on the seed at the time you call it kwargs are 'width' and 'height' """ - uc, c = conditioning + uc, c, ec, edit_opcodes = conditioning @torch.no_grad() def make_image(x_T): @@ -60,7 +60,9 @@ class Txt2Img2Img(Generator): unconditional_guidance_scale = cfg_scale, unconditional_conditioning = uc, eta = ddim_eta, - img_callback = step_callback + img_callback = step_callback, + edited_conditioning = ec, + conditioning_edit_opcodes = edit_opcodes ) print( @@ -94,6 +96,8 @@ class Txt2Img2Img(Generator): img_callback = step_callback, unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, + edited_conditioning = ec, + conditioning_edit_opcodes = edit_opcodes ) if self.free_gpu_mem: diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index b8377ebb39..cd8940fa6e 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -309,6 +309,9 @@ class Sampler(object): use_original_steps=False, init_latent = None, mask = None, + edited_conditioning = None, + conditioning_edit_opcodes = None, + **kwargs ): timesteps = ( From 582880b314f6467c13d47a740d912966e51f259c Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 23:23:38 +0200 Subject: [PATCH 013/124] add cross-attention support to im2img; prevent inpainting from crashing --- ldm/generate.py | 3 ++- ldm/invoke/generator/img2img.py | 7 +++++-- ldm/invoke/generator/inpaint.py | 3 ++- ldm/models/diffusion/ksampler.py | 7 ++++++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index 37df973291..45ed2e73d1 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -541,7 +541,8 @@ class Generate: image = Image.open(image_path) # used by multiple postfixers - uc, c = get_uc_and_c( + # todo: cross-attention + uc, c, _, _ = get_uc_and_c_and_ec( prompt, model =self.model, skip_normalize=opt.skip_normalize, log_tokens =opt.log_tokenization diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 7fde1a94cf..7852591048 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -32,7 +32,7 @@ class Img2Img(Generator): ) # move to latent space t_enc = int(strength * steps) - uc, c = conditioning + uc, c, ec, edit_opcodes = conditioning def make_image(x_T): # encode (scaled latent) @@ -49,7 +49,10 @@ class Img2Img(Generator): img_callback = step_callback, unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, - init_latent = self.init_latent, # changes how noising is performed in ksampler + init_latent = self.init_latent, + edited_conditioning = ec, + conditioning_edit_opcodes = edit_opcodes + # changes how noising is performed in ksampler ) return self.sample_to_image(samples) diff --git a/ldm/invoke/generator/inpaint.py b/ldm/invoke/generator/inpaint.py index bc4b6133b3..8f01b4ad2d 100644 --- a/ldm/invoke/generator/inpaint.py +++ b/ldm/invoke/generator/inpaint.py @@ -45,7 +45,8 @@ class Inpaint(Img2Img): ) # move to latent space t_enc = int(strength * steps) - uc, c = conditioning + # todo: support cross-attention control + uc, c, _, _ = conditioning print(f">> target t_enc is {t_enc} steps") diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 417458f18f..a7be70c9ce 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -132,6 +132,7 @@ class KSampler(Sampler): use_original_steps=False, init_latent = None, mask = None, + **kwargs ): samples,_ = self.sample( batch_size = 1, @@ -143,7 +144,8 @@ class KSampler(Sampler): unconditional_conditioning = unconditional_conditioning, img_callback = img_callback, x0 = init_latent, - mask = mask + mask = mask, + **kwargs ) return samples @@ -238,6 +240,8 @@ class KSampler(Sampler): index, unconditional_guidance_scale=1.0, unconditional_conditioning=None, + edited_conditioning=None, + conditioning_edit_opcodes=None, **kwargs, ): if self.model_wrap is None: @@ -263,6 +267,7 @@ class KSampler(Sampler): # so the actual formula for indexing into sigmas: # sigma_index = (steps-index) s_index = t_enc - index - 1 + self.model_wrap.prepare_to_sample(s_index, edited_conditioning=edited_conditioning, conditioning_edit_opcodes=conditioning_edit_opcodes) img = K.sampling.__dict__[f'_{self.schedule}']( self.model_wrap, img, From 824cb201b10cf14d18604d132b730a1b0d6796d5 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Tue, 18 Oct 2022 23:42:59 +0200 Subject: [PATCH 014/124] pass img2img ddim/plms edited conditioning through kwargs --- ldm/models/diffusion/sampler.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index cd8940fa6e..879b85495a 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -309,8 +309,6 @@ class Sampler(object): use_original_steps=False, init_latent = None, mask = None, - edited_conditioning = None, - conditioning_edit_opcodes = None, **kwargs ): From 147d39cb7c8ad4025e70eb16e607a930c9579157 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Wed, 19 Oct 2022 18:19:55 +0200 Subject: [PATCH 015/124] wip refactoring shared InvokeAI diffuser mixin to component --- ldm/models/diffusion/ddim.py | 24 +++--- ldm/models/diffusion/ksampler.py | 47 ++++------- ldm/models/diffusion/plms.py | 28 +++---- ...ention.py => shared_invokeai_diffusion.py} | 82 ++++++++++++++----- 4 files changed, 104 insertions(+), 77 deletions(-) rename ldm/models/diffusion/{cross_attention.py => shared_invokeai_diffusion.py} (77%) diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index 4980b03c42..a1f76c18e2 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -1,25 +1,32 @@ """SAMPLING ONLY.""" +from typing import Union import torch import numpy as np from tqdm import tqdm from functools import partial from ldm.invoke.devices import choose_torch_device -from ldm.models.diffusion.cross_attention import CrossAttentionControllableDiffusionMixin +from ldm.models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent from ldm.models.diffusion.sampler import Sampler from ldm.modules.diffusionmodules.util import noise_like -class DDIMSampler(Sampler, CrossAttentionControllableDiffusionMixin): +class DDIMSampler(Sampler): def __init__(self, model, schedule='linear', device=None, **kwargs): super().__init__(model,schedule,model.num_timesteps,device) + self.invokeai_diffuser = InvokeAIDiffuserComponent(self.model, + model_forward_callback = lambda x, sigma, cond: self.model.apply_model(x, sigma, cond)) + def prepare_to_sample(self, t_enc, **kwargs): super().prepare_to_sample(t_enc, **kwargs) edited_conditioning = kwargs.get('edited_conditioning', None) - edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) - self.setup_cross_attention_control_if_appropriate(self.model, edited_conditioning, edit_opcodes) + if edited_conditioning is not None: + edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) + self.invokeai_diffuser.setup_cross_attention_control(edited_conditioning, edit_opcodes) + else: + self.invokeai_diffuser.cleanup_cross_attention_control() # This is the central routine @@ -27,7 +34,7 @@ class DDIMSampler(Sampler, CrossAttentionControllableDiffusionMixin): def p_sample( self, x, - c, + c: Union[torch.Tensor, list], t, index, repeat_noise=False, @@ -51,12 +58,7 @@ class DDIMSampler(Sampler, CrossAttentionControllableDiffusionMixin): e_t = self.model.apply_model(x, t, c) else: - e_t_uncond, e_t = self.do_cross_attention_controllable_diffusion_step(x, t, unconditional_conditioning, c, self.model, - model_forward_callback=lambda x, sigma, cond: self.model.apply_model(x, sigma, cond)) - - e_t = e_t_uncond + unconditional_guidance_scale * ( - e_t - e_t_uncond - ) + e_t = self.invokeai_diffuser.do_diffusion_step(x, t, unconditional_conditioning, c, unconditional_guidance_scale) if score_corrector is not None: assert self.model.parameterization == 'eps' diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index a7be70c9ce..ea28b0e40b 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -1,19 +1,11 @@ """wrapper around part of Katherine Crowson's k-diffusion library, making it call compatible with other Samplers""" -from enum import Enum import k_diffusion as K import torch -import torch.nn as nn -from ldm.invoke.devices import choose_torch_device -from ldm.models.diffusion.sampler import Sampler -from ldm.util import rand_perlin_2d -from ldm.modules.diffusionmodules.util import ( - make_ddim_sampling_parameters, - make_ddim_timesteps, - noise_like, - extract_into_tensor, -) -from ldm.models.diffusion.cross_attention import CrossAttentionControl, CrossAttentionControllableDiffusionMixin +from torch import nn + +from .sampler import Sampler +from .shared_invokeai_diffusion import InvokeAIDiffuserComponent def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): @@ -30,27 +22,32 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): return torch.clamp(result, min=minval, max=maxval) -class CFGDenoiser(nn.Module, CrossAttentionControllableDiffusionMixin): +class CFGDenoiser(nn.Module): def __init__(self, model, threshold = 0, warmup = 0): super().__init__() self.inner_model = model self.threshold = threshold self.warmup_max = warmup self.warmup = max(warmup / 10, 1) + self.invokeai_diffuser = InvokeAIDiffuserComponent(model, + model_forward_callback=lambda x, sigma, cond: self.inner_model(x, sigma, cond=cond)) def prepare_to_sample(self, t_enc, **kwargs): edited_conditioning = kwargs.get('edited_conditioning', None) - conditioning_edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) - self.setup_cross_attention_control_if_appropriate(self.inner_model, edited_conditioning, conditioning_edit_opcodes) + if edited_conditioning is not None: + conditioning_edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) + self.invokeai_diffuser.setup_cross_attention_control(edited_conditioning, conditioning_edit_opcodes) + else: + self.invokeai_diffuser.cleanup_cross_attention_control() def forward(self, x, sigma, uncond, cond, cond_scale): - unconditioned_next_x, conditioned_next_x = self.do_cross_attention_controllable_diffusion_step(x, sigma, uncond, cond, self.inner_model, - model_forward_callback=lambda x, sigma, cond: self.inner_model(x, sigma, cond=cond)) + final_next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale) + # apply threshold if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) self.warmup += 1 @@ -58,9 +55,8 @@ class CFGDenoiser(nn.Module, CrossAttentionControllableDiffusionMixin): thresh = self.threshold if thresh > self.threshold: thresh = self.threshold - # to scale how much effect conditioning has, calculate the changes it does and then scale that - scaled_delta = (conditioned_next_x - unconditioned_next_x) * cond_scale - return cfg_apply_threshold(unconditioned_next_x + scaled_delta, thresh) + return cfg_apply_threshold(final_next_x, thresh) + class KSampler(Sampler): @@ -75,16 +71,6 @@ class KSampler(Sampler): self.ds = None self.s_in = None - def forward(self, x, sigma, uncond, cond, cond_scale): - x_in = torch.cat([x] * 2) - sigma_in = torch.cat([sigma] * 2) - cond_in = torch.cat([uncond, cond]) - uncond, cond = self.inner_model( - x_in, sigma_in, cond=cond_in - ).chunk(2) - return uncond + (cond - uncond) * cond_scale - - def make_schedule( self, ddim_num_steps, @@ -303,3 +289,4 @@ class KSampler(Sampler): Overrides parent method to return the q_sample of the inner model. ''' return self.model.inner_model.q_sample(x0,ts) + diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index eb778813a0..d5c227b9f1 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -5,22 +5,28 @@ import numpy as np from tqdm import tqdm from functools import partial from ldm.invoke.devices import choose_torch_device -from ldm.models.diffusion.cross_attention import CrossAttentionControllableDiffusionMixin +from ldm.models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent from ldm.models.diffusion.sampler import Sampler from ldm.modules.diffusionmodules.util import noise_like -class PLMSSampler(Sampler, CrossAttentionControllableDiffusionMixin): +class PLMSSampler(Sampler): def __init__(self, model, schedule='linear', device=None, **kwargs): super().__init__(model,schedule,model.num_timesteps, device) + self.invokeai_diffuser = InvokeAIDiffuserComponent(self.model, + model_forward_callback = lambda x, sigma, cond: self.model.apply_model(x, sigma, cond)) + def prepare_to_sample(self, t_enc, **kwargs): super().prepare_to_sample(t_enc, **kwargs) edited_conditioning = kwargs.get('edited_conditioning', None) - edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) - self.setup_cross_attention_control_if_appropriate(self.model, edited_conditioning, edit_opcodes) + if edited_conditioning is not None: + edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) + self.invokeai_diffuser.setup_cross_attention_control(edited_conditioning, edit_opcodes) + else: + self.invokeai_diffuser.cleanup_cross_attention_control() # this is the essential routine @@ -51,21 +57,11 @@ class PLMSSampler(Sampler, CrossAttentionControllableDiffusionMixin): unconditional_conditioning is None or unconditional_guidance_scale == 1.0 ): - # damian0815 does not think this code path is ever used + # damian0815 does not know if this code path is ever used e_t = self.model.apply_model(x, t, c) else: - #x_in = torch.cat([x] * 2) - #t_in = torch.cat([t] * 2) - #c_in = torch.cat([unconditional_conditioning, c]) - #e_t_uncond, e_t = self.model.apply_model( - # x_in, t_in, c_in - #).chunk(2) - e_t_uncond, e_t = self.do_cross_attention_controllable_diffusion_step(x, t, unconditional_conditioning, c, self.model, - model_forward_callback=lambda x, sigma, cond: self.model.apply_model(x, sigma, cond)) - e_t = e_t_uncond + unconditional_guidance_scale * ( - e_t - e_t_uncond - ) + e_t = self.invokeai_diffuser.do_diffusion_step(x, t, unconditional_conditioning, c, unconditional_guidance_scale) if score_corrector is not None: assert self.model.parameterization == 'eps' diff --git a/ldm/models/diffusion/cross_attention.py b/ldm/models/diffusion/shared_invokeai_diffusion.py similarity index 77% rename from ldm/models/diffusion/cross_attention.py rename to ldm/models/diffusion/shared_invokeai_diffusion.py index c0760fff47..e2d6ba5fb6 100644 --- a/ldm/models/diffusion/cross_attention.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -1,33 +1,70 @@ from enum import Enum +from typing import Callable + import torch +class InvokeAIDiffuserComponent: -class CrossAttentionControllableDiffusionMixin: + class Conditioning: + def __init__(self, edited_conditioning: torch.Tensor = None, edit_opcodes: list[tuple] = None): + """ + :param edited_conditioning: if doing cross-attention control, the edited conditioning (1 x 77 x 768) + :param edit_opcodes: if doing cross-attention control, opcodes from a SequenceMatcher describing how to map original conditioning tokens to edited conditioning tokens + """ + #self.conditioning = conditioning + #self.unconditioning = unconditioning + self.edited_conditioning = edited_conditioning + self.edit_opcodes = edit_opcodes - def setup_cross_attention_control_if_appropriate(self, model, edited_conditioning, edit_opcodes): + ''' + The aim of this component is to provide a single place for code that can be applied identically to + all InvokeAI diffusion procedures. + + At the moment it includes the following features: + * Cross Attention Control ("prompt2prompt") + ''' + + def __init__(self, model, model_forward_callback: Callable[[torch.Tensor, torch.Tensor, torch.Tensor], torch.Tensor]): + """ + :param model: the unet model to pass through to cross attention control + :param model_forward_callback: a lambda with arguments (x, sigma, conditioning_to_apply). will be called repeatedly. most likely, this should simply call model.forward(x, sigma, conditioning) + """ + self.model = model + self.model_forward_callback = model_forward_callback + + + def setup_cross_attention_control(self, edited_conditioning, edit_opcodes): self.edited_conditioning = edited_conditioning + CrossAttentionControl.setup_attention_editing(self.model, edited_conditioning, edit_opcodes) - if edited_conditioning is not None: - # a cat sitting on a car - CrossAttentionControl.setup_attention_editing(model, edited_conditioning, edit_opcodes) - else: - # pass through the attention func but don't act on it - CrossAttentionControl.clear_attention_editing(model) + def cleanup_cross_attention_control(self): + self.edited_conditioning = None + CrossAttentionControl.clear_attention_editing(self.model) - def cleanup_cross_attention_control(self, model): - CrossAttentionControl.clear_attention_editing(model) - def do_cross_attention_controllable_diffusion_step(self, x, sigma, unconditioning, conditioning, model, model_forward_callback): + def do_diffusion_step(self, x: torch.Tensor, sigma: torch.Tensor, + unconditioning: torch.Tensor, conditioning: torch.Tensor, + unconditional_guidance_scale: float): + """ + :param x: Current latents + :param sigma: aka t, passed to the internal model to control how much denoising will occur + :param unconditioning: [B x 77 x 768] embeddings for unconditioned output + :param conditioning: [B x 77 x 768] embeddings for conditioned output + :param unconditional_guidance_scale: aka CFG scale, controls how much effect the conditioning tensor has + :param model: the unet model to pass through to cross attention control + :param model_forward_callback: a lambda with arguments (x, sigma, conditioning_to_apply). will be called repeatedly. most likely, this should simply call model.forward(x, sigma, conditioning) + :return: the new latents after applying the model to x using unconditioning and CFG-scaled conditioning. + """ - CrossAttentionControl.clear_requests(model) + CrossAttentionControl.clear_requests(self.model) if self.edited_conditioning is None: # faster batched path x_twice = torch.cat([x]*2) sigma_twice = torch.cat([sigma]*2) both_conditionings = torch.cat([unconditioning, conditioning]) - unconditioned_next_x, conditioned_next_x = model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) + unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) else: # slower non-batched path (20% slower on mac MPS) # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of @@ -37,19 +74,24 @@ class CrossAttentionControllableDiffusionMixin: # representing batched uncond + cond, but then when it comes to applying the saved attention, the # wrangler gets an attention tensor which only has shape[0]=8, representing just self.edited_conditionings.) # todo: give CrossAttentionControl's `wrangler` function more info so it can work with a batched call as well. - unconditioned_next_x = model_forward_callback(x, sigma, unconditioning) + unconditioned_next_x = self.model_forward_callback(x, sigma, unconditioning) # process x using the original prompt, saving the attention maps - CrossAttentionControl.request_save_attention_maps(model) - _ = model_forward_callback(x, sigma, cond=conditioning) - CrossAttentionControl.clear_requests(model) + CrossAttentionControl.request_save_attention_maps(self.model) + _ = self.model_forward_callback(x, sigma, cond=conditioning) + CrossAttentionControl.clear_requests(self.model) # process x again, using the saved attention maps to control where self.edited_conditioning will be applied - CrossAttentionControl.request_apply_saved_attention_maps(model) - conditioned_next_x = model_forward_callback(x, sigma, self.edited_conditioning) + CrossAttentionControl.request_apply_saved_attention_maps(self.model) + conditioned_next_x = self.model_forward_callback(x, sigma, self.edited_conditioning) CrossAttentionControl.clear_requests(model) - return unconditioned_next_x, conditioned_next_x + + # to scale how much effect conditioning has, calculate the changes it does and then scale that + scaled_delta = (conditioned_next_x - unconditioned_next_x) * unconditional_guidance_scale + combined_next_x = unconditioned_next_x + scaled_delta + + return combined_next_x # adapted from bloc97's CrossAttentionControl colab # https://github.com/bloc97/CrossAttentionControl From 1ffd4a9e06728089d14c1fafd332fe8e5759ae30 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Wed, 19 Oct 2022 19:57:20 +0200 Subject: [PATCH 016/124] refactored single diffusion path seems to be working for all samplers --- ldm/invoke/generator/img2img.py | 5 ++- ldm/invoke/generator/txt2img.py | 6 ++- ldm/invoke/generator/txt2img2img.py | 8 ++-- ldm/models/diffusion/ddim.py | 16 +++----- ldm/models/diffusion/ksampler.py | 23 +++++------ ldm/models/diffusion/plms.py | 12 +++--- .../diffusion/shared_invokeai_diffusion.py | 39 ++++++++++++------- 7 files changed, 57 insertions(+), 52 deletions(-) diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 7852591048..0a12bd90e5 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -7,6 +7,7 @@ import numpy as np from ldm.invoke.devices import choose_autocast from ldm.invoke.generator.base import Generator from ldm.models.diffusion.ddim import DDIMSampler +from ldm.models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent class Img2Img(Generator): def __init__(self, model, precision): @@ -33,6 +34,7 @@ class Img2Img(Generator): t_enc = int(strength * steps) uc, c, ec, edit_opcodes = conditioning + structured_conditioning = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) def make_image(x_T): # encode (scaled latent) @@ -50,8 +52,7 @@ class Img2Img(Generator): unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, init_latent = self.init_latent, - edited_conditioning = ec, - conditioning_edit_opcodes = edit_opcodes + structured_conditioning = structured_conditioning # changes how noising is performed in ksampler ) diff --git a/ldm/invoke/generator/txt2img.py b/ldm/invoke/generator/txt2img.py index 669f3d81ff..6e158562c5 100644 --- a/ldm/invoke/generator/txt2img.py +++ b/ldm/invoke/generator/txt2img.py @@ -5,6 +5,8 @@ ldm.invoke.generator.txt2img inherits from ldm.invoke.generator import torch import numpy as np from ldm.invoke.generator.base import Generator +from ldm.models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent + class Txt2Img(Generator): def __init__(self, model, precision): @@ -20,6 +22,7 @@ class Txt2Img(Generator): """ self.perlin = perlin uc, c, ec, edit_opcodes = conditioning + structured_conditioning = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) @torch.no_grad() def make_image(x_T): @@ -43,8 +46,7 @@ class Txt2Img(Generator): verbose = False, unconditional_guidance_scale = cfg_scale, unconditional_conditioning = uc, - edited_conditioning = ec, - conditioning_edit_opcodes = edit_opcodes, + structured_conditioning = structured_conditioning, eta = ddim_eta, img_callback = step_callback, threshold = threshold, diff --git a/ldm/invoke/generator/txt2img2img.py b/ldm/invoke/generator/txt2img2img.py index afe680ac6e..52a14aae74 100644 --- a/ldm/invoke/generator/txt2img2img.py +++ b/ldm/invoke/generator/txt2img2img.py @@ -7,6 +7,7 @@ import numpy as np import math from ldm.invoke.generator.base import Generator from ldm.models.diffusion.ddim import DDIMSampler +from ldm.models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent class Txt2Img2Img(Generator): @@ -23,6 +24,7 @@ class Txt2Img2Img(Generator): kwargs are 'width' and 'height' """ uc, c, ec, edit_opcodes = conditioning + structured_conditioning = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) @torch.no_grad() def make_image(x_T): @@ -61,8 +63,7 @@ class Txt2Img2Img(Generator): unconditional_conditioning = uc, eta = ddim_eta, img_callback = step_callback, - edited_conditioning = ec, - conditioning_edit_opcodes = edit_opcodes + structured_conditioning = structured_conditioning ) print( @@ -96,8 +97,7 @@ class Txt2Img2Img(Generator): img_callback = step_callback, unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, - edited_conditioning = ec, - conditioning_edit_opcodes = edit_opcodes + structured_conditioning = structured_conditioning ) if self.free_gpu_mem: diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index a1f76c18e2..0ab6911247 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -2,10 +2,6 @@ from typing import Union import torch -import numpy as np -from tqdm import tqdm -from functools import partial -from ldm.invoke.devices import choose_torch_device from ldm.models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent from ldm.models.diffusion.sampler import Sampler from ldm.modules.diffusionmodules.util import noise_like @@ -20,13 +16,12 @@ class DDIMSampler(Sampler): def prepare_to_sample(self, t_enc, **kwargs): super().prepare_to_sample(t_enc, **kwargs) - edited_conditioning = kwargs.get('edited_conditioning', None) + structured_conditioning = kwargs.get('structured_conditioning', None) - if edited_conditioning is not None: - edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) - self.invokeai_diffuser.setup_cross_attention_control(edited_conditioning, edit_opcodes) + if structured_conditioning is not None and structured_conditioning.wants_cross_attention_control: + self.invokeai_diffuser.setup_cross_attention_control(structured_conditioning) else: - self.invokeai_diffuser.cleanup_cross_attention_control() + self.invokeai_diffuser.remove_cross_attention_control() # This is the central routine @@ -54,10 +49,9 @@ class DDIMSampler(Sampler): unconditional_conditioning is None or unconditional_guidance_scale == 1.0 ): - # damian0815 does not think this code path is ever used + # damian0815 would like to know when/if this code path is used e_t = self.model.apply_model(x, t, c) else: - e_t = self.invokeai_diffuser.do_diffusion_step(x, t, unconditional_conditioning, c, unconditional_guidance_scale) if score_corrector is not None: diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index ea28b0e40b..a8291e32c1 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -34,18 +34,17 @@ class CFGDenoiser(nn.Module): def prepare_to_sample(self, t_enc, **kwargs): - edited_conditioning = kwargs.get('edited_conditioning', None) + structured_conditioning = kwargs.get('structured_conditioning', None) - if edited_conditioning is not None: - conditioning_edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) - self.invokeai_diffuser.setup_cross_attention_control(edited_conditioning, conditioning_edit_opcodes) + if structured_conditioning is not None and structured_conditioning.wants_cross_attention_control: + self.invokeai_diffuser.setup_cross_attention_control(structured_conditioning) else: - self.invokeai_diffuser.cleanup_cross_attention_control() + self.invokeai_diffuser.remove_cross_attention_control() def forward(self, x, sigma, uncond, cond, cond_scale): - final_next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale) + next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale) # apply threshold if self.warmup < self.warmup_max: @@ -55,7 +54,7 @@ class CFGDenoiser(nn.Module): thresh = self.threshold if thresh > self.threshold: thresh = self.threshold - return cfg_apply_threshold(final_next_x, thresh) + return cfg_apply_threshold(next_x, thresh) @@ -165,8 +164,7 @@ class KSampler(Sampler): log_every_t=100, unconditional_guidance_scale=1.0, unconditional_conditioning=None, - edited_conditioning=None, - conditioning_edit_opcodes=None, + structured_conditioning=None, threshold = 0, perlin = 0, # this has to come in the same format as the conditioning, # e.g. as encoded tokens, ... @@ -199,7 +197,7 @@ class KSampler(Sampler): x = torch.randn([batch_size, *shape], device=self.device) * sigmas[0] model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10)) - model_wrap_cfg.prepare_to_sample(S, edited_conditioning=edited_conditioning, conditioning_edit_opcodes=conditioning_edit_opcodes) + model_wrap_cfg.prepare_to_sample(S, structured_conditioning=structured_conditioning) extra_args = { 'cond': conditioning, 'uncond': unconditional_conditioning, @@ -226,8 +224,7 @@ class KSampler(Sampler): index, unconditional_guidance_scale=1.0, unconditional_conditioning=None, - edited_conditioning=None, - conditioning_edit_opcodes=None, + structured_conditioning=None, **kwargs, ): if self.model_wrap is None: @@ -253,7 +250,7 @@ class KSampler(Sampler): # so the actual formula for indexing into sigmas: # sigma_index = (steps-index) s_index = t_enc - index - 1 - self.model_wrap.prepare_to_sample(s_index, edited_conditioning=edited_conditioning, conditioning_edit_opcodes=conditioning_edit_opcodes) + self.model_wrap.prepare_to_sample(s_index, structured_conditioning=structured_conditioning) img = K.sampling.__dict__[f'_{self.schedule}']( self.model_wrap, img, diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index d5c227b9f1..98975525ed 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -20,13 +20,12 @@ class PLMSSampler(Sampler): def prepare_to_sample(self, t_enc, **kwargs): super().prepare_to_sample(t_enc, **kwargs) - edited_conditioning = kwargs.get('edited_conditioning', None) + structured_conditioning = kwargs.get('structured_conditioning', None) - if edited_conditioning is not None: - edit_opcodes = kwargs.get('conditioning_edit_opcodes', None) - self.invokeai_diffuser.setup_cross_attention_control(edited_conditioning, edit_opcodes) + if structured_conditioning is not None and structured_conditioning.wants_cross_attention_control: + self.invokeai_diffuser.setup_cross_attention_control(structured_conditioning) else: - self.invokeai_diffuser.cleanup_cross_attention_control() + self.invokeai_diffuser.remove_cross_attention_control() # this is the essential routine @@ -57,10 +56,9 @@ class PLMSSampler(Sampler): unconditional_conditioning is None or unconditional_guidance_scale == 1.0 ): - # damian0815 does not know if this code path is ever used + # damian0815 would like to know when/if this code path is used e_t = self.model.apply_model(x, t, c) else: - e_t = self.invokeai_diffuser.do_diffusion_step(x, t, unconditional_conditioning, c, unconditional_guidance_scale) if score_corrector is not None: diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index e2d6ba5fb6..d4f059de09 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -6,17 +6,22 @@ import torch class InvokeAIDiffuserComponent: - class Conditioning: + class StructuredConditioning: def __init__(self, edited_conditioning: torch.Tensor = None, edit_opcodes: list[tuple] = None): """ :param edited_conditioning: if doing cross-attention control, the edited conditioning (1 x 77 x 768) :param edit_opcodes: if doing cross-attention control, opcodes from a SequenceMatcher describing how to map original conditioning tokens to edited conditioning tokens """ + # TODO migrate conditioning and unconditioning here, too #self.conditioning = conditioning #self.unconditioning = unconditioning self.edited_conditioning = edited_conditioning self.edit_opcodes = edit_opcodes + @property + def wants_cross_attention_control(self): + return self.edited_conditioning is not None + ''' The aim of this component is to provide a single place for code that can be applied identically to all InvokeAI diffusion procedures. @@ -34,14 +39,20 @@ class InvokeAIDiffuserComponent: self.model_forward_callback = model_forward_callback - def setup_cross_attention_control(self, edited_conditioning, edit_opcodes): - self.edited_conditioning = edited_conditioning - CrossAttentionControl.setup_attention_editing(self.model, edited_conditioning, edit_opcodes) + def setup_cross_attention_control(self, conditioning: StructuredConditioning): + self.conditioning = conditioning + CrossAttentionControl.setup_cross_attention_control(self.model, conditioning.edited_conditioning, conditioning.edit_opcodes) - def cleanup_cross_attention_control(self): - self.edited_conditioning = None - CrossAttentionControl.clear_attention_editing(self.model) + def remove_cross_attention_control(self): + self.conditioning = None + CrossAttentionControl.remove_cross_attention_control(self.model) + @property + def edited_conditioning(self): + if self.conditioning is None: + return None + else: + return self.conditioning.edited_conditioning def do_diffusion_step(self, x: torch.Tensor, sigma: torch.Tensor, unconditioning: torch.Tensor, conditioning: torch.Tensor, @@ -78,13 +89,13 @@ class InvokeAIDiffuserComponent: # process x using the original prompt, saving the attention maps CrossAttentionControl.request_save_attention_maps(self.model) - _ = self.model_forward_callback(x, sigma, cond=conditioning) + _ = self.model_forward_callback(x, sigma, conditioning) CrossAttentionControl.clear_requests(self.model) # process x again, using the saved attention maps to control where self.edited_conditioning will be applied CrossAttentionControl.request_apply_saved_attention_maps(self.model) conditioned_next_x = self.model_forward_callback(x, sigma, self.edited_conditioning) - CrossAttentionControl.clear_requests(model) + CrossAttentionControl.clear_requests(self.model) # to scale how much effect conditioning has, calculate the changes it does and then scale that @@ -100,14 +111,16 @@ class CrossAttentionControl: @classmethod - def clear_attention_editing(cls, model): + def remove_cross_attention_control(cls, model): cls.remove_attention_function(model) @classmethod - def setup_attention_editing(cls, model, - substitute_conditioning: torch.Tensor, - edit_opcodes: list): + def setup_cross_attention_control(cls, model, + substitute_conditioning: torch.Tensor, + edit_opcodes: list): """ + Inject attention parameters and functions into the passed in model to enable cross attention editing. + :param model: The unet model to inject into. :param substitute_conditioning: The "edited" conditioning vector, [Bx77x768] :param edit_opcodes: Opcodes from difflib.SequenceMatcher describing how the base From c3b992db968984fc3bfa4f1311461dc0177eb8af Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sat, 15 Oct 2022 23:44:54 +0200 Subject: [PATCH 017/124] Squashed commit of the following: commit 9bb0b5d0036c4dffbb72ce11e097fae4ab63defd Author: Damian at mba Date: Sat Oct 15 23:43:41 2022 +0200 undo local_files_only stuff commit eed93f5d30c34cfccaf7497618ae9af17a5ecfbb Author: Damian at mba Date: Sat Oct 15 23:40:37 2022 +0200 Revert "Merge branch 'development-invoke' into fix-prompts" This reverts commit 7c40892a9f184f7e216f14d14feb0411c5a90e24, reversing changes made to e3f2dd62b0548ca6988818ef058093a4f5b022f2. commit f06d6024e345c69e6d5a91ab5423925a68ee95a7 Author: Damian at mba Date: Thu Oct 13 23:30:16 2022 +0200 more efficiently handle multiple conditioning commit 5efdfcbcd980ce6202ab74e7f90e7415ce7260da Merge: b9c0dc5 ac08bb6 Author: Damian at mba Date: Thu Oct 13 14:51:01 2022 +0200 Merge branch 'optional-disable-karras-schedule' into fix-prompts commit ac08bb6fd25e19a9d35cf6c199e66500fb604af1 Author: Damian at mba Date: Thu Oct 13 14:50:43 2022 +0200 append '*use_model_sigmas*' to prompt string to use model sigmas commit 70d8c05a3ff329409f76204f4af94e55d468ab8b Author: Damian at mba Date: Thu Oct 13 12:12:17 2022 +0200 make karras scheduling switchable commit d60df54f69968e2fb22809c55e23b3c02f37ad63 replaced the model's own scheduling with karras scheduling. this has changed image generation (seems worse now?) this commit wraps the change in a bool. commit b9c0dc5f1a658a0e6c3936000e9ae559e1c7a1db Author: Damian at mba Date: Wed Oct 12 20:16:00 2022 +0200 add test of more complex conjunction commit 9ac0c15cc0d7b5f6df3289d3ad474260972a17be Author: Damian at mba Date: Wed Oct 12 17:18:25 2022 +0200 improve comments commit ad33bce60590b87b2a93e90f16dc9d3e935d04a5 Author: Damian at mba Date: Wed Oct 12 17:04:46 2022 +0200 put back thresholding stuff commit 4852c698a325049834ba0d4b358f07210bc7171a Author: Damian at mba Date: Wed Oct 12 14:25:02 2022 +0200 notes on improving conjunction efficiency commit a53bb1e5b68025d09642b935ae6a9a015cfaf2d6 Author: Damian at mba Date: Wed Oct 12 14:14:33 2022 +0200 optional weights support for Conjunction commit fec79ab15e4f0c84dd61cb1b45a5e6a72ae4aaeb Author: Damian at mba Date: Wed Oct 12 12:07:27 2022 +0200 fix blend error and log parsing output commit 1f751c2a039f9c97af57b18e0f019512631d5a25 Author: Damian at mba Date: Wed Oct 12 10:33:33 2022 +0200 fix broken euler sampler commit 02f8148d17efe4b6bde8d29b827092a0626363ee Author: Damian at mba Date: Wed Oct 12 10:24:20 2022 +0200 cleanup prompt parser commit 8028d49ae6c16c0d6ec9c9de9c12d56c32201421 Author: Damian at mba Date: Wed Oct 12 10:14:18 2022 +0200 explicit conjunction, improve flattening logic commit 8a1710892185f07eb77483f7edae0fc4d6bbb250 Author: Damian at mba Date: Tue Oct 11 22:59:30 2022 +0200 adapt multi-conditioning to also work with ddim commit 53802a839850d0d1ff017c6bafe457c4bed750b0 Author: Damian at mba Date: Tue Oct 11 22:31:42 2022 +0200 unconditioning is also fancy-prompt-syntaxable commit 7c40892a9f184f7e216f14d14feb0411c5a90e24 Merge: e3f2dd6 dbe0da4 Author: Damian at mba Date: Tue Oct 11 21:39:54 2022 +0200 Merge branch 'development-invoke' into fix-prompts commit e3f2dd62b0548ca6988818ef058093a4f5b022f2 Merge: eef0e48 06f542e Author: Damian at mba Date: Tue Oct 11 21:38:09 2022 +0200 Merge remote-tracking branch 'upstream/development' into fix-prompts commit eef0e484c2eaa1bd4e0e0b1d3f8d7bba38478144 Author: Damian at mba Date: Tue Oct 11 21:26:25 2022 +0200 fix run-on paren-less attention, add some comments commit fd29afdf0e9f5e0cdc60239e22480c36ca0aaeca Author: Damian at mba Date: Tue Oct 11 21:03:02 2022 +0200 python 3.9 compatibility commit 26f7646eef7f39bc8f7ce805e747df0f723464da Author: Damian at mba Date: Tue Oct 11 20:58:42 2022 +0200 first pass connecting PromptParser to conditioning commit ae53dff3796d7b9a5e7ed30fa1edb0374af6cd8d Author: Damian at mba Date: Tue Oct 11 20:51:15 2022 +0200 update frontend dist commit 9be4a59a2d76f49e635474b5984bfca826a5dab4 Author: Damian at mba Date: Tue Oct 11 19:01:39 2022 +0200 fix issues with correctness checking FlattenedPrompt commit 3be212323eab68e72a363a654124edd9809e4cf0 Author: Damian at mba Date: Tue Oct 11 18:43:16 2022 +0200 parsing nested seems to work pretty ok commit acd73eb08cf67c27cac8a22934754321256f56a9 Author: Damian at mba Date: Tue Oct 11 18:26:17 2022 +0200 wip introducing FlattenedPrompt class commit 71698d5c7c2ac855b690d8ef67e8830148c59eda Author: Damian at mba Date: Tue Oct 11 15:59:42 2022 +0200 recursive attention weighting seems to actually work commit a4e1ec6b20deb7cc0cd12737bdbd266e56144709 Author: Damian at mba Date: Tue Oct 11 15:06:24 2022 +0200 now apparently almost supported nested attention commit da76fd1ddf22a3888cdc08fd4fed38d8b178e524 Author: Damian at mba Date: Tue Oct 11 13:23:37 2022 +0200 wip prompt parsing commit dbe0da4572c2ac22f26a7afd722349a5680a9e47 Author: Kyle Schouviller Date: Mon Oct 10 22:32:35 2022 -0700 Adding node-based invocation apps commit 8f2a2ffc083366de74d7dae471b50b6f98a7c5f8 Author: Damian at mba Date: Mon Oct 10 19:03:18 2022 +0200 fix merge issues commit 73118dee2a8f4891700756e014caf1c9ca629267 Merge: fd00844 12413b0 Author: Damian at mba Date: Mon Oct 10 12:42:48 2022 +0200 Merge remote-tracking branch 'upstream/development' into fix-prompts commit fd0084413541013c2cf71e006af0392719bef53d Author: Damian at mba Date: Mon Oct 10 12:39:38 2022 +0200 wip prompt parsing commit 0be9363db9307859d2b65cffc6af01f57d7873a4 Author: Damian at mba Date: Mon Oct 10 03:20:06 2022 +0200 better +/- attention parsing commit 5383f691874a58ab01cda1e4fac6cf330146526a Author: Damian at mba Date: Mon Oct 10 02:27:47 2022 +0200 prompt parser seems to work commit 591d098a33ce35462428d8c169501d8ed73615ab Author: Damian at mba Date: Sun Oct 9 20:25:37 2022 +0200 supports weighting unconditioning, cross-attention with | commit 7a7220563aa05a2980235b5b908362f66b728309 Author: Damian at mba Date: Sun Oct 9 18:15:56 2022 +0200 i think cross attention might be working? commit 951ed391e7126bff228c18b2db304ad28d59644a Author: Damian at mba Date: Sun Oct 9 16:04:54 2022 +0200 weighted CFG denoiser working with a single item commit ee532a0c2827368c9e45a6a5f3975666402873da Author: Damian at mba Date: Sun Oct 9 06:33:40 2022 +0200 wip probably doesn't work or compile commit 14654bcbd207b9ca28a6cbd37dbd967d699b062d Author: Damian at mba Date: Fri Oct 7 18:11:48 2022 +0200 use tan() to calculate embedding weight for <1 attentions commit 1a8e76b31aa5abf5150419ebf3b29d4658d07f2b Author: Damian at mba Date: Fri Oct 7 16:14:54 2022 +0200 fix bad math.max reference commit f697ff896875876ccaa1e5527405bdaa7ed27cde Author: Damian at mba Date: Fri Oct 7 15:55:57 2022 +0200 respect http[s]x protocol when making socket.io middleware commit 41d3dd4eeae8d4efb05dfb44fc6d8aac5dc468ab Author: Damian at mba Date: Fri Oct 7 13:29:54 2022 +0200 fractional weighting works, by blending with prompts excluding the word commit 087fb6dfb3e8f5e84de8c911f75faa3e3fa3553c Author: Damian at mba Date: Fri Oct 7 10:52:03 2022 +0200 wip doing weights <1 by averaging with conditioning absent the lower-weighted fragment commit 3c49e3f3ec7c18dc60f3e18ed2f7f0d97aad3a47 Author: Damian at mba Date: Fri Oct 7 10:36:15 2022 +0200 notate CFGDenoiser, perhaps commit d2bcf1bb522026ebf209ad0103f6b370383e5070 Author: Damian at mba Date: Thu Oct 6 05:04:47 2022 +0200 hack blending syntax to test attention weighting more extensively commit 94904ef2cf917f74ec23ef7a570e12ff8255b048 Author: Damian at mba Date: Thu Oct 6 04:56:37 2022 +0200 conditioning works, apparently commit 7c6663ddd70f665fd1308b6dd74f92ca393a8df5 Author: Damian at mba Date: Thu Oct 6 02:20:24 2022 +0200 attention weighting, definitely works in positive direction commit 5856d453a9b020bc1a28ff643ae1f58c12c9be73 Author: Damian at mba Date: Tue Oct 4 19:02:14 2022 +0200 wip bubbling weights down commit a2ed14fd9b7d3cb36b6c5348018b364c76d1e892 Author: Damian at mba Date: Tue Oct 4 17:35:39 2022 +0200 bring in changes from PC --- backend/server.py | 2 +- configs/stable-diffusion/v1-inference.yaml | 2 +- ldm/generate.py | 6 +- ldm/invoke/conditioning.py | 82 +++-- ldm/invoke/prompt_parser.py | 331 +++++++++++++++++++++ ldm/models/diffusion/ddim.py | 18 +- ldm/models/diffusion/ddpm.py | 4 +- ldm/models/diffusion/ksampler.py | 29 +- ldm/models/diffusion/sampler.py | 53 ++++ ldm/modules/encoders/modules.py | 203 +++++++++++++ tests/test_prompt_parser.py | 136 +++++++++ 11 files changed, 823 insertions(+), 43 deletions(-) create mode 100644 ldm/invoke/prompt_parser.py create mode 100644 tests/test_prompt_parser.py diff --git a/backend/server.py b/backend/server.py index 7b8a8a5a69..f14c141e12 100644 --- a/backend/server.py +++ b/backend/server.py @@ -527,7 +527,7 @@ def parameters_to_generated_image_metadata(parameters): rfc_dict["sampler"] = parameters["sampler_name"] # display weighted subprompts (liable to change) - subprompts = split_weighted_subprompts(parameters["prompt"]) + subprompts = split_weighted_subprompts(parameters["prompt"], skip_normalize=True) subprompts = [{"prompt": x[0], "weight": x[1]} for x in subprompts] rfc_dict["prompt"] = subprompts diff --git a/configs/stable-diffusion/v1-inference.yaml b/configs/stable-diffusion/v1-inference.yaml index 9c773077b6..baf91f6e26 100644 --- a/configs/stable-diffusion/v1-inference.yaml +++ b/configs/stable-diffusion/v1-inference.yaml @@ -76,4 +76,4 @@ model: target: torch.nn.Identity cond_stage_config: - target: ldm.modules.encoders.modules.FrozenCLIPEmbedder + target: ldm.modules.encoders.modules.WeightedFrozenCLIPEmbedder diff --git a/ldm/generate.py b/ldm/generate.py index 7fb68dec0a..965d37a240 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -438,7 +438,7 @@ class Generate: sampler=self.sampler, steps=steps, cfg_scale=cfg_scale, - conditioning=(uc, c), + conditioning=(uc, c), # here change to arrays ddim_eta=ddim_eta, image_callback=image_callback, # called after the final image is generated step_callback=step_callback, # called after each intermediate image is generated @@ -477,6 +477,10 @@ class Generate: print('**Interrupted** Partial results will be returned.') else: raise KeyboardInterrupt + # brute-force fallback + except Exception as e: + print(traceback.format_exc(), file=sys.stderr) + print('>> Could not generate image.') toc = time.time() print('>> Usage stats:') diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index fedd965a2c..9b67d5040d 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -12,42 +12,76 @@ log_tokenization() print out colour-coded tokens and warn if trunca import re import torch -def get_uc_and_c(prompt, model, log_tokens=False, skip_normalize=False): +from .prompt_parser import PromptParser, Fragment, Attention, Blend, Conjunction, FlattenedPrompt +from ..modules.encoders.modules import WeightedFrozenCLIPEmbedder + + +def get_uc_and_c(prompt_string_uncleaned, model, log_tokens=False, skip_normalize=False): + # Extract Unconditioned Words From Prompt unconditioned_words = '' unconditional_regex = r'\[(.*?)\]' - unconditionals = re.findall(unconditional_regex, prompt) + unconditionals = re.findall(unconditional_regex, prompt_string_uncleaned) if len(unconditionals) > 0: unconditioned_words = ' '.join(unconditionals) # Remove Unconditioned Words From Prompt unconditional_regex_compile = re.compile(unconditional_regex) - clean_prompt = unconditional_regex_compile.sub(' ', prompt) - prompt = re.sub(' +', ' ', clean_prompt) + clean_prompt = unconditional_regex_compile.sub(' ', prompt_string_uncleaned) + prompt_string_cleaned = re.sub(' +', ' ', clean_prompt) + else: + prompt_string_cleaned = prompt_string_uncleaned - uc = model.get_learned_conditioning([unconditioned_words]) + pp = PromptParser() - # get weighted sub-prompts - weighted_subprompts = split_weighted_subprompts( - prompt, skip_normalize - ) + def build_conditioning_list(prompt_string:str): + parsed_conjunction: Conjunction = pp.parse(prompt_string) + print(f"parsed '{prompt_string}' to {parsed_conjunction}") + assert (type(parsed_conjunction) is Conjunction) + + conditioning_list = [] + def make_embeddings_for_flattened_prompt(flattened_prompt: FlattenedPrompt): + if type(flattened_prompt) is not FlattenedPrompt: + raise f"embeddings can only be made from FlattenedPrompts, got {type(flattened_prompt)} instead" + fragments = [x[0] for x in flattened_prompt.children] + attention_weights = [x[1] for x in flattened_prompt.children] + print(fragments, attention_weights) + return model.get_learned_conditioning([fragments], attention_weights=[attention_weights]) + + for part,weight in zip(parsed_conjunction.prompts, parsed_conjunction.weights): + if type(part) is Blend: + blend:Blend = part + embeddings_to_blend = None + for flattened_prompt in blend.prompts: + this_embedding = make_embeddings_for_flattened_prompt(flattened_prompt) + embeddings_to_blend = this_embedding if embeddings_to_blend is None else torch.cat((embeddings_to_blend, this_embedding)) + blended_embeddings = WeightedFrozenCLIPEmbedder.apply_embedding_weights(embeddings_to_blend.unsqueeze(0), blend.weights, normalize=blend.normalize_weights) + conditioning_list.append((blended_embeddings, weight)) + else: + flattened_prompt: FlattenedPrompt = part + embeddings = make_embeddings_for_flattened_prompt(flattened_prompt) + conditioning_list.append((embeddings, weight)) + + return conditioning_list + + positive_conditioning_list = build_conditioning_list(prompt_string_cleaned) + negative_conditioning_list = build_conditioning_list(unconditioned_words) + + if len(negative_conditioning_list) == 0: + negative_conditioning = model.get_learned_conditioning([['']], attention_weights=[[1]]) + else: + if len(negative_conditioning_list)>1: + print("cannot do conjunctions on unconditioning for now") + negative_conditioning = negative_conditioning_list[0][0] + + #positive_conditioning_list.append((get_blend_prompts_and_weights(prompt), this_weight)) + #print("got empty_conditionining with shape", empty_conditioning.shape, "c[0][0] with shape", positive_conditioning[0][0].shape) + + # "unconditioned" means "the conditioning tensor is empty" + uc = negative_conditioning + c = positive_conditioning_list - if len(weighted_subprompts) > 1: - # i dont know if this is correct.. but it works - c = torch.zeros_like(uc) - # normalize each "sub prompt" and add it - for subprompt, weight in weighted_subprompts: - log_tokenization(subprompt, model, log_tokens, weight) - c = torch.add( - c, - model.get_learned_conditioning([subprompt]), - alpha=weight, - ) - else: # just standard 1 prompt - log_tokenization(prompt, model, log_tokens, 1) - c = model.get_learned_conditioning([prompt]) - uc = model.get_learned_conditioning([unconditioned_words]) return (uc, c) def split_weighted_subprompts(text, skip_normalize=False)->list: diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py new file mode 100644 index 0000000000..c976918291 --- /dev/null +++ b/ldm/invoke/prompt_parser.py @@ -0,0 +1,331 @@ +import pyparsing +import pyparsing as pp +from pyparsing import original_text_for + + +class Prompt(): + + def __init__(self, parts: list): + for c in parts: + allowed_types = [Fragment, Attention, CFGScale] + if type(c) not in allowed_types: + raise PromptParser.ParsingException(f"Prompt cannot contain {type(c)}, only {allowed_types} are allowed") + self.children = parts + def __repr__(self): + return f"Prompt:{self.children}" + def __eq__(self, other): + return type(other) is Prompt and other.children == self.children + +class FlattenedPrompt(): + def __init__(self, parts: list): + # verify type correctness + for c in parts: + if type(c) is not tuple: + raise PromptParser.ParsingException( + f"FlattenedPrompt cannot contain {type(c)}, only ('text', weight) tuples are allowed") + text = c[0] + weight = c[1] + if type(text) is not str: + raise PromptParser.ParsingException(f"FlattenedPrompt cannot contain {type(c)}, only ('text', weight) tuples are allowed") + if type(weight) is not float and type(weight) is not int: + raise PromptParser.ParsingException( + f"FlattenedPrompt cannot contain {type(c)}, only ('text', weight) tuples are allowed") + # all looks good + self.children = parts + + def __repr__(self): + return f"FlattenedPrompt:{self.children}" + def __eq__(self, other): + return type(other) is FlattenedPrompt and other.children == self.children + + +class Attention(): + + def __init__(self, weight: float, children: list): + self.weight = weight + self.children = children + #print(f"A: requested attention '{children}' to {weight}") + + def __repr__(self): + return f"Attention:'{self.children}' @ {self.weight}" + def __eq__(self, other): + return type(other) is Attention and other.weight == self.weight and other.fragment == self.fragment + + +class CFGScale(): + def __init__(self, scale_factor: float, fragment: str): + self.fragment = fragment + self.scale_factor = scale_factor + #print(f"S: requested CFGScale '{fragment}' x {scale_factor}") + + def __repr__(self): + return f"CFGScale:'{self.fragment}' x {self.scale_factor}" + def __eq__(self, other): + return type(other) is CFGScale and other.scale_factor == self.scale_factor and other.fragment == self.fragment + + + +class Fragment(): + def __init__(self, text: str): + assert(type(text) is str) + self.text = text + + def __repr__(self): + return "Fragment:'"+self.text+"'" + def __eq__(self, other): + return type(other) is Fragment and other.text == self.text + +class Conjunction(): + def __init__(self, prompts: list, weights: list = None): + # force everything to be a Prompt + #print("making conjunction with", parts) + self.prompts = [x if (type(x) is Prompt or type(x) is Blend or type(x) is FlattenedPrompt) + else Prompt(x) for x in prompts] + self.weights = [1.0]*len(self.prompts) if weights is None else list(weights) + if len(self.weights) != len(self.prompts): + raise PromptParser.ParsingException(f"while parsing Conjunction: mismatched parts/weights counts {prompts}, {weights}") + self.type = 'AND' + + def __repr__(self): + return f"Conjunction:{self.prompts} | weights {self.weights}" + def __eq__(self, other): + return type(other) is Conjunction \ + and other.prompts == self.prompts \ + and other.weights == self.weights + + +class Blend(): + def __init__(self, prompts: list, weights: list[float], normalize_weights: bool=True): + #print("making Blend with prompts", prompts, "and weights", weights) + if len(prompts) != len(weights): + raise PromptParser.ParsingException(f"while parsing Blend: mismatched prompts/weights counts {prompts}, {weights}") + for c in prompts: + if type(c) is not Prompt and type(c) is not FlattenedPrompt: + raise(PromptParser.ParsingException(f"{type(c)} cannot be added to a Blend, only Prompts or FlattenedPrompts")) + # upcast all lists to Prompt objects + self.prompts = [x if (type(x) is Prompt or type(x) is FlattenedPrompt) + else Prompt(x) for x in prompts] + self.prompts = prompts + self.weights = weights + self.normalize_weights = normalize_weights + + def __repr__(self): + return f"Blend:{self.prompts} | weights {self.weights}" + def __eq__(self, other): + return other.__repr__() == self.__repr__() + + +class PromptParser(): + + class ParsingException(Exception): + pass + + def __init__(self, attention_plus_base=1.1, attention_minus_base=0.9): + + self.attention_plus_base = attention_plus_base + self.attention_minus_base = attention_minus_base + + self.root = self.build_parser_logic() + + + def parse(self, prompt: str) -> [list]: + ''' + :param prompt: The prompt string to parse + :return: a tuple + ''' + #print(f"!!parsing '{prompt}'") + + if len(prompt.strip()) == 0: + return Conjunction(prompts=[FlattenedPrompt([('', 1.0)])], weights=[1.0]) + + root = self.root.parse_string(prompt) + #print(f"'{prompt}' parsed to root", root) + #fused = fuse_fragments(parts) + #print("fused to", fused) + + return self.flatten(root[0]) + + def flatten(self, root: Conjunction): + + def fuse_fragments(items): + # print("fusing fragments in ", items) + result = [] + for x in items: + last_weight = result[-1][1] if len(result) > 0 else None + this_text = x[0] + this_weight = x[1] + if last_weight is not None and last_weight == this_weight: + last_text = result[-1][0] + result[-1] = (last_text + ' ' + this_text, last_weight) + else: + result.append(x) + return result + + def flatten_internal(node, weight_scale, results, prefix): + #print(prefix + "flattening", node, "...") + if type(node) is pp.ParseResults: + for x in node: + results = flatten_internal(x, weight_scale, results, prefix+'pr') + #print(prefix, " ParseResults expanded, results is now", results) + elif type(node) is Fragment: + results.append((node.text, float(weight_scale))) + elif type(node) is Attention: + #if node.weight < 1: + # todo: inject a blend when flattening attention with weight <1" + for c in node.children: + results = flatten_internal(c, weight_scale*node.weight, results, prefix+' ') + elif type(node) is Blend: + flattened_subprompts = [] + #print(" flattening blend with prompts", node.prompts, "weights", node.weights) + for prompt in node.prompts: + # prompt is a list + flattened_subprompts = flatten_internal(prompt, weight_scale, flattened_subprompts, prefix+'B ') + results += [Blend(prompts=flattened_subprompts, weights=node.weights)] + elif type(node) is Prompt: + #print(prefix + "about to flatten Prompt with children", node.children) + flattened_prompt = [] + for child in node.children: + flattened_prompt = flatten_internal(child, weight_scale, flattened_prompt, prefix+'P ') + results += [FlattenedPrompt(parts=fuse_fragments(flattened_prompt))] + #print(prefix + "after flattening Prompt, results is", results) + else: + raise PromptParser.ParsingException(f"unhandled node type {type(node)} when flattening {node}") + #print(prefix + "-> after flattening", type(node), "results is", results) + return results + + #print("flattening", root) + + flattened_parts = [] + for part in root.prompts: + flattened_parts += flatten_internal(part, 1.0, [], ' C| ') + weights = root.weights + return Conjunction(flattened_parts, weights) + + + + def build_parser_logic(self): + + lparen = pp.Literal("(").suppress() + rparen = pp.Literal(")").suppress() + # accepts int or float notation, always maps to float + number = pyparsing.pyparsing_common.real | pp.Word(pp.nums).set_parse_action(pp.token_map(float)) + SPACE_CHARS = ' \t\n' + + prompt_part = pp.Forward() + word = pp.Forward() + + def make_fragment(x): + #print("### making fragment for", x) + if type(x) is str: + return Fragment(x) + elif type(x) is pp.ParseResults or type(x) is list: + return Fragment(' '.join([s for s in x])) + else: + raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) + + # attention control of the form +(phrase) / -(phrase) / (phrase) + # phrase can be multiple words, can have multiple +/- signs to increase the effect or type a floating point or integer weight + attention = pp.Forward() + attention_head = (number | pp.Word('+') | pp.Word('-'))\ + .set_name("attention_head")\ + .set_debug(False) + fragment_inside_attention = pp.CharsNotIn(SPACE_CHARS+'()')\ + .set_parse_action(make_fragment)\ + .set_name("fragment_inside_attention")\ + .set_debug(False) + attention_with_parens = pp.Forward() + attention_with_parens_body = pp.nested_expr(content=pp.delimited_list((attention_with_parens | fragment_inside_attention), delim=SPACE_CHARS)) + attention_with_parens << (attention_head + attention_with_parens_body) + + def make_attention(x): + # print("making Attention from parsing with args", x0, x1) + weight = 1 + # number(str) + if type(x[0]) is float or type(x[0]) is int: + weight = float(x[0]) + # +(str) or -(str) or +str or -str + elif type(x[0]) is str: + base = self.attention_plus_base if x[0][0] == '+' else self.attention_minus_base + weight = pow(base, len(x[0])) + # print("Making attention with children of type", [str(type(x)) for x in x1]) + return Attention(weight=weight, children=x[1]) + + attention_with_parens.set_parse_action(make_attention)\ + .set_name("attention_with_parens")\ + .set_debug(False) + + # attention control of the form ++word --word (no parens) + attention_without_parens = ( + (pp.Word('+') | pp.Word('-')) + + pp.CharsNotIn(SPACE_CHARS+'()').set_parse_action(lambda x: [[make_fragment(x)]]) + )\ + .set_name("attention_without_parens")\ + .set_debug(False) + attention_without_parens.set_parse_action(make_attention) + + attention << (attention_with_parens | attention_without_parens)\ + .set_name("attention")\ + .set_debug(False) + + # fragments of text with no attention control + word << pp.Word(pp.printables).set_parse_action(lambda x: Fragment(' '.join([s for s in x]))) + word.set_name("word") + word.set_debug(False) + prompt_part << (attention | word) + prompt_part.set_debug(False) + prompt_part.set_name("prompt_part") + + # root prompt definition + prompt = pp.Group(pp.OneOrMore(prompt_part))\ + .set_parse_action(lambda x: Prompt(x[0])) + + # weighted blend of prompts + # ("promptA", "promptB").blend(a, b) where "promptA" and "promptB" are valid prompts and a and b are float or + # int weights. + # can specify more terms eg ("promptA", "promptB", "promptC").blend(a,b,c) + + def make_prompt_from_quoted_string(x): + #print(' got quoted prompt', x) + + x_unquoted = x[0][1:-1] + if len(x_unquoted.strip()) == 0: + # print(' b : just an empty string') + return Prompt([Fragment('')]) + # print(' b parsing ', c_unquoted) + x_parsed = prompt.parse_string(x_unquoted) + #print(" quoted prompt was parsed to", type(x_parsed),":", x_parsed) + return x_parsed[0] + + quoted_prompt = pp.dbl_quoted_string.set_parse_action(make_prompt_from_quoted_string) + quoted_prompt.set_name('quoted_prompt') + + blend_terms = pp.delimited_list(quoted_prompt).set_name('blend_terms') + blend_weights = pp.delimited_list(number).set_name('blend_weights') + blend = pp.Group(lparen + pp.Group(blend_terms) + rparen + + pp.Literal(".blend").suppress() + + lparen + pp.Group(blend_weights) + rparen).set_name('blend') + blend.set_debug(False) + + + blend.set_parse_action(lambda x: Blend(prompts=x[0][0], weights=x[0][1])) + + conjunction_terms = blend_terms.copy().set_name('conjunction_terms') + conjunction_weights = blend_weights.copy().set_name('conjunction_weights') + conjunction_with_parens_and_quotes = pp.Group(lparen + pp.Group(conjunction_terms) + rparen + + pp.Literal(".and").suppress() + + lparen + pp.Optional(pp.Group(conjunction_weights)) + rparen).set_name('conjunction') + def make_conjunction(x): + parts_raw = x[0][0] + weights = x[0][1] if len(x[0])>1 else [1.0]*len(parts_raw) + parts = [part for part in parts_raw] + return Conjunction(parts, weights) + conjunction_with_parens_and_quotes.set_parse_action(make_conjunction) + + implicit_conjunction = pp.OneOrMore(blend | prompt) + implicit_conjunction.set_parse_action(lambda x: Conjunction(x)) + + conjunction = conjunction_with_parens_and_quotes | implicit_conjunction + conjunction.set_debug(False) + + # top-level is a conjunction of one or more blends or prompts + return conjunction diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index f5dada8627..5120d92c48 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -34,23 +34,21 @@ class DDIMSampler(Sampler): b, *_, device = *x.shape, x.device if ( - unconditional_conditioning is None - or unconditional_guidance_scale == 1.0 + (unconditional_conditioning is None + or unconditional_guidance_scale == 1.0) + and c is not list ): e_t = self.model.apply_model(x, t, c) else: - x_in = torch.cat([x] * 2) - t_in = torch.cat([t] * 2) - c_in = torch.cat([unconditional_conditioning, c]) - e_t_uncond, e_t = self.model.apply_model(x_in, t_in, c_in).chunk(2) - e_t = e_t_uncond + unconditional_guidance_scale * ( - e_t - e_t_uncond - ) + e_t = self.apply_weighted_conditioning_list(x, t, self.model.apply_model, unconditional_conditioning, c, unconditional_guidance_scale) if score_corrector is not None: assert self.model.parameterization == 'eps' + if c is list and len(c)>1: + print("warning: ddim score modifier currently ignores all but the first part of the prompt conjunction, this is probably wrong") + corrector_c = [c[0][0] if c is list else c] e_t = score_corrector.modify_score( - self.model, e_t, x, t, c, **corrector_kwargs + self.model, e_t, x, t, corrector_c, **corrector_kwargs ) alphas = ( diff --git a/ldm/models/diffusion/ddpm.py b/ldm/models/diffusion/ddpm.py index 4b62b5e393..0f55786323 100644 --- a/ldm/models/diffusion/ddpm.py +++ b/ldm/models/diffusion/ddpm.py @@ -820,13 +820,13 @@ class LatentDiffusion(DDPM): ) return self.scale_factor * z - def get_learned_conditioning(self, c): + def get_learned_conditioning(self, c, attention_weights=None): if self.cond_stage_forward is None: if hasattr(self.cond_stage_model, 'encode') and callable( self.cond_stage_model.encode ): c = self.cond_stage_model.encode( - c, embedding_manager=self.embedding_manager + c, embedding_manager=self.embedding_manager, attention_weights=attention_weights ) if isinstance(c, DiagonalGaussianDistribution): c = c.mode() diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index ac0615b30c..4d37c8cf9b 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -38,7 +38,8 @@ class CFGDenoiser(nn.Module): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) cond_in = torch.cat([uncond, cond]) - uncond, cond = self.inner_model(x_in, sigma_in, cond=cond_in).chunk(2) + unconditioned_x, conditioned_x = self.inner_model(x_in, sigma_in, cond=cond_in).chunk(2) + if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) self.warmup += 1 @@ -46,7 +47,28 @@ class CFGDenoiser(nn.Module): thresh = self.threshold if thresh > self.threshold: thresh = self.threshold - return cfg_apply_threshold(uncond + (cond - uncond) * cond_scale, thresh) + + # damian0815 thinking out loud notes: + # b + (a - b)*scale + # starting at the output that emerges applying the negative prompt (by default ''), + # (-> this is why the unconditioning feels like hammer) + # move toward the positive prompt by an amount controlled by cond_scale. + return cfg_apply_threshold(unconditioned_x + (conditioned_x - unconditioned_x) * cond_scale, thresh) + + +class ProgrammableCFGDenoiser(CFGDenoiser): + def forward(self, x, sigma, uncond, cond, cond_scale): + forward_lambda = lambda x, t, c: self.inner_model(x, t, cond=c) + x_new = Sampler.apply_weighted_conditioning_list(x, sigma, forward_lambda, uncond, cond, cond_scale) + + if self.warmup < self.warmup_max: + thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) + self.warmup += 1 + else: + thresh = self.threshold + if thresh > self.threshold: + thresh = self.threshold + return cfg_apply_threshold(x_new, threshold=thresh) class KSampler(Sampler): @@ -181,7 +203,6 @@ class KSampler(Sampler): ) # sigmas are set up in make_schedule - we take the last steps items - total_steps = len(self.sigmas) sigmas = self.sigmas[-S-1:] # x_T is variation noise. When an init image is provided (in x0) we need to add @@ -194,7 +215,7 @@ class KSampler(Sampler): else: x = torch.randn([batch_size, *shape], device=self.device) * sigmas[0] - model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10)) + model_wrap_cfg = ProgrammableCFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10)) extra_args = { 'cond': conditioning, 'uncond': unconditional_conditioning, diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index ff705513f8..42704f1175 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -4,6 +4,8 @@ ldm.models.diffusion.sampler Base class for ldm.models.diffusion.ddim, ldm.models.diffusion.ksampler, etc ''' +from math import ceil + import torch import numpy as np from tqdm import tqdm @@ -411,3 +413,54 @@ class Sampler(object): return self.model.inner_model.q_sample(x0,ts) ''' return self.model.q_sample(x0,ts) + + + @classmethod + def apply_weighted_conditioning_list(cls, x, t, forward_func, uc, c_or_weighted_c_list, global_guidance_scale): + x_in = torch.cat([x] * 2) + t_in = torch.cat([t] * 2) # aka sigmas + + deltas = None + uncond_latents = None + weighted_cond_list = c_or_weighted_c_list if type(c_or_weighted_c_list) is list else [(c_or_weighted_c_list, 1)] + + # below is fugly omg + num_actual_conditionings = len(c_or_weighted_c_list) + conditionings = [uc] + [c for c,weight in weighted_cond_list] + weights = [1] + [weight for c,weight in weighted_cond_list] + chunk_count = ceil(len(conditionings)/2) + assert(len(conditionings)>=2, "need at least one uncond and one cond") + deltas = None + for chunk_index in range(chunk_count): + offset = chunk_index*2 + chunk_size = min(2, len(conditionings)-offset) + + if chunk_size == 1: + c_in = conditionings[offset] + latents_a = forward_func(x_in[:-1], t_in[:-1], c_in) + latents_b = None + else: + c_in = torch.cat(conditionings[offset:offset+2]) + latents_a, latents_b = forward_func(x_in, t_in, c_in).chunk(2) + + # first chunk is guaranteed to be 2 entries: uncond_latents + first conditioining + if chunk_index == 0: + uncond_latents = latents_a + deltas = latents_b - uncond_latents + else: + deltas = torch.cat((deltas, latents_a - uncond_latents)) + if latents_b is not None: + deltas = torch.cat((deltas, latents_b - uncond_latents)) + + # merge the weighted deltas together into a single merged delta + per_delta_weights = torch.tensor(weights[1:], dtype=deltas.dtype, device=deltas.device) + normalize = False + if normalize: + per_delta_weights /= torch.sum(per_delta_weights) + reshaped_weights = per_delta_weights.reshape(per_delta_weights.shape + (1, 1, 1)) + deltas_merged = torch.sum(deltas * reshaped_weights, dim=0, keepdim=True) + + # old_return_value = super().forward(x, sigma, uncond, cond, cond_scale) + # assert(0 == len(torch.nonzero(old_return_value - (uncond_latents + deltas_merged * cond_scale)))) + + return uncond_latents + deltas_merged * global_guidance_scale diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 426fccced3..857a8a8e3e 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -1,3 +1,5 @@ +import math + import torch import torch.nn as nn from functools import partial @@ -454,6 +456,207 @@ class FrozenCLIPEmbedder(AbstractEncoder): def encode(self, text, **kwargs): return self(text, **kwargs) +class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): + + attention_weights_key = "attention_weights" + + def build_token_list_fragment(self, fragment: str, weight: float) -> (torch.Tensor, torch.Tensor): + batch_encoding = self.tokenizer( + fragment, + truncation=True, + max_length=self.max_length, + return_length=True, + return_overflowing_tokens=False, + padding='none', + return_tensors='pt', + ) + return batch_encoding, torch.ones_like(batch_encoding) * weight + + + def forward(self, text: list, **kwargs): + ''' + + :param text: A batch of prompt strings, or, a batch of lists of fragments of prompt strings to which different + weights shall be applied. + :param kwargs: If the keyword arg "attention_weights" is passed, it shall contain a batch of lists of weights + for the prompt fragments. In this case text must contain batches of lists of prompt fragments. + :return: A tensor of shape (B, 77, 768) containing weighted embeddings + ''' + if self.attention_weights_key not in kwargs: + # fallback to base class implementation + return super().forward(text, **kwargs) + + attention_weights = kwargs[self.attention_weights_key] + # self.transformer doesn't like receiving "attention_weights" as an argument + kwargs.pop(self.attention_weights_key) + + batch_z = None + for fragments, weights in zip(text, attention_weights): + + # First, weight tokens in individual fragments by scaling the feature vectors as requested (effectively + # applying a multiplier to the CFG scale on a per-token basis). + # For tokens weighted<1, intuitively we want SD to become not merely *less* interested in the concept + # captured by the fragment but actually *dis*interested in it (a 0.01 interest in "red" is still an active + # interest, however small, in redness; what the user probably intends when they attach the number 0.01 to + # "red" is to tell SD that it should almost completely *ignore* redness). + # To do this, the embedding is lerped away from base_embedding in the direction of an embedding for a prompt + # string from which the low-weighted fragment has been simply removed. The closer the weight is to zero, the + # closer the resulting embedding is to an embedding for a prompt that simply lacks this fragment. + + # handle weights >=1 + tokens, per_token_weights = self.get_tokens_and_weights(fragments, weights) + base_embedding = self.build_weighted_embedding_tensor(tokens, per_token_weights, **kwargs) + + # this is our starting point + embeddings = base_embedding.unsqueeze(0) + per_embedding_weights = [1.0] + + # now handle weights <1 + # Do this by building extra embeddings tensors that lack the words being <1 weighted. These will be lerped + # with the embeddings tensors that have the words, such that if the weight of a word is 0.5, the resulting + # embedding will be exactly half-way between the unweighted prompt and the prompt with the <1 weighted words + # removed. + # eg for "mountain:1 man:0.5", intuitively the "man" should be "half-gone". therefore, append an embedding + # for "mountain" (i.e. without "man") to the already-produced embedding for "mountain man", and weight it + # such that the resulting lerped embedding is exactly half-way between "mountain man" and "mountain". + for index, fragment_weight in enumerate(weights): + if fragment_weight < 1: + fragments_without_this = fragments[:index] + fragments[index+1:] + weights_without_this = weights[:index] + weights[index+1:] + tokens, per_token_weights = self.get_tokens_and_weights(fragments_without_this, weights_without_this) + embedding_without_this = self.build_weighted_embedding_tensor(tokens, per_token_weights, **kwargs) + + embeddings = torch.cat((embeddings, embedding_without_this.unsqueeze(0)), dim=1) + # weight of the embedding *without* this fragment gets *stronger* as its weight approaches 0 + # if fragment_weight = 0, basically we want embedding_without_this to completely overwhelm base_embedding + # therefore: + # fragment_weight = 1: we are at base_z => lerp weight 0 + # fragment_weight = 0.5: we are halfway between base_z and here => lerp weight 1 + # fragment_weight = 0: we're now entirely overriding base_z ==> lerp weight inf + # so let's use tan(), because: + # tan is 0.0 at 0, + # 1.0 at PI/4, and + # inf at PI/2 + # -> tan((1-weight)*PI/2) should give us ideal lerp weights + epsilon = 1e-9 + fragment_weight = max(epsilon, fragment_weight) # inf is bad + embedding_lerp_weight = math.tan((1.0 - fragment_weight) * math.pi / 2) + # todo handle negative weight? + + per_embedding_weights.append(embedding_lerp_weight) + + lerped_embeddings = self.apply_embedding_weights(embeddings, per_embedding_weights, normalize=True).squeeze(0) + + print(f"assembled tokens for '{fragments}' into tensor of shape {lerped_embeddings.shape}") + + # append to batch + batch_z = lerped_embeddings.unsqueeze(0) if batch_z is None else torch.cat((batch_z, lerped_embeddings.unsqueeze(0)), dim=1) + + # should have shape (B, 77, 768) + print(f"assembled all tokens into tensor of shape {batch_z.shape}") + + return batch_z + + @classmethod + def apply_embedding_weights(self, embeddings: torch.Tensor, per_embedding_weights: list[float], normalize:bool) -> torch.Tensor: + per_embedding_weights = torch.tensor(per_embedding_weights, dtype=embeddings.dtype, device=embeddings.device) + if normalize: + per_embedding_weights = per_embedding_weights / torch.sum(per_embedding_weights) + reshaped_weights = per_embedding_weights.reshape(per_embedding_weights.shape + (1, 1,)) + #reshaped_weights = per_embedding_weights.reshape(per_embedding_weights.shape + (1,1,)).expand(embeddings.shape) + return torch.sum(embeddings * reshaped_weights, dim=1) + # lerped embeddings has shape (77, 768) + + + def get_tokens_and_weights(self, fragments: list[str], weights: list[float]) -> (torch.Tensor, torch.Tensor): + ''' + + :param fragments: + :param weights: Per-fragment weights (CFG scaling). No need for these to be normalized. They will not be normalized here and that's fine. + :return: + ''' + # empty is meaningful + if len(fragments) == 0 and len(weights) == 0: + fragments = [''] + weights = [1] + item_encodings = self.tokenizer( + fragments, + truncation=True, + max_length=self.max_length, + return_overflowing_tokens=False, + padding='do_not_pad', + return_tensors=None, # just give me a list of ints + )['input_ids'] + all_tokens = [] + per_token_weights = [] + print("all fragments:", fragments, weights) + for index, fragment in enumerate(item_encodings): + weight = weights[index] + print("processing fragment", fragment, weight) + fragment_tokens = item_encodings[index] + print("fragment", fragment, "processed to", fragment_tokens) + # trim bos and eos markers before appending + all_tokens.extend(fragment_tokens[1:-1]) + per_token_weights.extend([weight] * (len(fragment_tokens) - 2)) + + if len(all_tokens) > self.max_length - 2: + print("prompt is too long and has been truncated") + all_tokens = all_tokens[:self.max_length - 2] + + # pad out to a 77-entry array: [eos_token, , eos_token, ..., eos_token] + # (77 = self.max_length) + pad_length = self.max_length - 1 - len(all_tokens) + all_tokens.insert(0, self.tokenizer.bos_token_id) + all_tokens.extend([self.tokenizer.eos_token_id] * pad_length) + per_token_weights.insert(0, 1) + per_token_weights.extend([1] * pad_length) + + all_tokens_tensor = torch.tensor(all_tokens, dtype=torch.long).to(self.device) + per_token_weights_tensor = torch.tensor(per_token_weights, dtype=torch.float32).to(self.device) + print(f"assembled all_tokens_tensor with shape {all_tokens_tensor.shape}") + return all_tokens_tensor, per_token_weights_tensor + + def build_weighted_embedding_tensor(self, tokens: torch.Tensor, per_token_weights: torch.Tensor, weight_delta_from_empty=True, **kwargs) -> torch.Tensor: + ''' + Build a tensor representing the passed-in tokens, each of which has a weight. + :param tokens: A tensor of shape (77) containing token ids (integers) + :param per_token_weights: A tensor of shape (77) containing weights (floats) + :param method: Whether to multiply the whole feature vector for each token or just its distance from an "empty" feature vector + :param kwargs: passed on to self.transformer() + :return: A tensor of shape (1, 77, 768) representing the requested weighted embeddings. + ''' + #print(f"building weighted embedding tensor for {tokens} with weights {per_token_weights}") + z = self.transformer(input_ids=tokens.unsqueeze(0), **kwargs) + batch_weights_expanded = per_token_weights.reshape(per_token_weights.shape + (1,)).expand(z.shape) + + if weight_delta_from_empty: + empty_tokens = self.tokenizer([''] * z.shape[0], + truncation=True, + max_length=self.max_length, + padding='max_length', + return_tensors='pt' + )['input_ids'].to(self.device) + empty_z = self.transformer(input_ids=empty_tokens, **kwargs) + z_delta_from_empty = z - empty_z + weighted_z = empty_z + (z_delta_from_empty * batch_weights_expanded) + + weighted_z_delta_from_empty = (weighted_z-empty_z) + print("weighted z has delta from empty with sum", weighted_z_delta_from_empty.sum().item(), "mean", weighted_z_delta_from_empty.mean().item() ) + + #print("using empty-delta method, first 5 rows:") + #print(weighted_z[:5]) + + return weighted_z + + else: + original_mean = z.mean() + z *= batch_weights_expanded + after_weighting_mean = z.mean() + # correct the mean. not sure if this is right but it's what the automatic1111 fork of SD does + mean_correction_factor = original_mean/after_weighting_mean + z *= mean_correction_factor + return z + class FrozenCLIPTextEmbedder(nn.Module): """ diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py new file mode 100644 index 0000000000..207475d02e --- /dev/null +++ b/tests/test_prompt_parser.py @@ -0,0 +1,136 @@ +import unittest + +from ldm.invoke.prompt_parser import PromptParser, Blend, Conjunction, FlattenedPrompt + +def parse_prompt(prompt_string): + pp = PromptParser() + #print(f"parsing '{prompt_string}'") + parse_result = pp.parse(prompt_string) + #print(f"-> parsed '{prompt_string}' to {parse_result}") + return parse_result + +class PromptParserTestCase(unittest.TestCase): + + def test_empty(self): + self.assertEqual(Conjunction([FlattenedPrompt([('', 1)])]), parse_prompt('')) + + def test_basic(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire (flames)', 1)])]), parse_prompt("fire (flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([("fire flames", 1)])]), parse_prompt("fire flames")) + self.assertEqual(Conjunction([FlattenedPrompt([("fire, flames", 1)])]), parse_prompt("fire, flames")) + self.assertEqual(Conjunction([FlattenedPrompt([("fire, flames , fire", 1)])]), parse_prompt("fire, flames , fire")) + + def test_attention(self): + self.assertEqual(Conjunction([FlattenedPrompt([('flames', 0.5)])]), parse_prompt("0.5(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('fire flames', 0.5)])]), parse_prompt("0.5(fire flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flames', 1.1)])]), parse_prompt("+(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flames', 0.9)])]), parse_prompt("-(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1), ('flames', 0.5)])]), parse_prompt("fire 0.5(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flames', pow(1.1, 2))])]), parse_prompt("++(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flames', pow(0.9, 2))])]), parse_prompt("--(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))])]), parse_prompt("---(flowers) +++flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))])]), parse_prompt("---(flowers) +++flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames+', pow(1.1, 3))])]), + parse_prompt("---(flowers) +++flames+")) + self.assertEqual(Conjunction([FlattenedPrompt([('pretty flowers', 1.1)])]), + parse_prompt("+(pretty flowers)")) + self.assertEqual(Conjunction([FlattenedPrompt([('pretty flowers', 1.1), (', the flames are too hot', 1)])]), + parse_prompt("+(pretty flowers), the flames are too hot")) + + def test_no_parens_attention_runon(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire', pow(1.1, 2)), ('flames', 1.0)])]), parse_prompt("++fire flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', pow(0.9, 2)), ('flames', 1.0)])]), parse_prompt("--fire flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', 1.0), ('fire', pow(1.1, 2)), ('flames', 1.0)])]), parse_prompt("flowers ++fire flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', 1.0), ('fire', pow(0.9, 2)), ('flames', 1.0)])]), parse_prompt("flowers --fire flames")) + + + def test_explicit_conjunction(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])]), parse_prompt('("fire", "flames").and(1,1)')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])]), parse_prompt('("fire", "flames").and()')) + self.assertEqual( + Conjunction([FlattenedPrompt([('fire flames', 1.0)]), FlattenedPrompt([('mountain man', 1.0)])]), parse_prompt('("fire flames", "mountain man").and()')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 2.0)]), FlattenedPrompt([('flames', 0.9)])]), parse_prompt('("2.0(fire)", "-flames").and()')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)]), + FlattenedPrompt([('mountain man', 1.0)])]), parse_prompt('("fire", "flames", "mountain man").and()')) + + def test_conjunction_weights(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])], weights=[2.0,1.0]), parse_prompt('("fire", "flames").and(2,1)')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])], weights=[1.0,2.0]), parse_prompt('("fire", "flames").and(1,2)')) + + with self.assertRaises(PromptParser.ParsingException): + parse_prompt('("fire", "flames").and(2)') + parse_prompt('("fire", "flames").and(2,1,2)') + + def test_complex_conjunction(self): + self.assertEqual(Conjunction([FlattenedPrompt([("mountain man", 1.0)]), FlattenedPrompt([("a person with a hat", 1.0), ("riding a bicycle", pow(1.1,2))])], weights=[0.5, 0.5]), + parse_prompt("(\"mountain man\", \"a person with a hat ++(riding a bicycle)\").and(0.5, 0.5)")) + + def test_badly_formed(self): + def make_untouched_prompt(prompt): + return Conjunction([FlattenedPrompt([(prompt, 1.0)])]) + + def assert_if_prompt_string_not_untouched(prompt): + self.assertEqual(make_untouched_prompt(prompt), parse_prompt(prompt)) + + assert_if_prompt_string_not_untouched('a test prompt') + assert_if_prompt_string_not_untouched('a badly (formed test prompt') + assert_if_prompt_string_not_untouched('a badly formed test+ prompt') + assert_if_prompt_string_not_untouched('a badly (formed test+ prompt') + assert_if_prompt_string_not_untouched('a badly (formed test+ )prompt') + assert_if_prompt_string_not_untouched('a badly (formed test+ )prompt') + assert_if_prompt_string_not_untouched('(((a badly (formed test+ )prompt') + assert_if_prompt_string_not_untouched('(a (ba)dly (f)ormed test+ prompt') + self.assertEqual(Conjunction([FlattenedPrompt([('(a (ba)dly (f)ormed test+', 1.0), ('prompt', 1.1)])]), + parse_prompt('(a (ba)dly (f)ormed test+ +prompt')) + self.assertEqual(Conjunction([Blend([FlattenedPrompt([('((a badly (formed test+', 1.0)])], weights=[1.0])]), + parse_prompt('("((a badly (formed test+ ").blend(1.0)')) + + def test_blend(self): + self.assertEqual(Conjunction( + [Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('fire flames', 1.0)])], [0.7, 0.3])]), + parse_prompt("(\"fire\", \"fire flames\").blend(0.7, 0.3)") + ) + self.assertEqual(Conjunction([Blend( + [FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('fire flames', 1.0)]), FlattenedPrompt([('hi', 1.0)])], + [0.7, 0.3, 1.0])]), + parse_prompt("(\"fire\", \"fire flames\", \"hi\").blend(0.7, 0.3, 1.0)") + ) + self.assertEqual(Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), + FlattenedPrompt([('fire flames', 1.0), ('hot', pow(1.1, 2))]), + FlattenedPrompt([('hi', 1.0)])], + weights=[0.7, 0.3, 1.0])]), + parse_prompt("(\"fire\", \"fire flames ++(hot)\", \"hi\").blend(0.7, 0.3, 1.0)") + ) + # blend a single entry is not a failure + self.assertEqual(Conjunction([Blend([FlattenedPrompt([('fire', 1.0)])], [0.7])]), + parse_prompt("(\"fire\").blend(0.7)") + ) + # blend with empty + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('', 1.0)])], [0.7, 1.0])]), + parse_prompt("(\"fire\", \"\").blend(0.7, 1)") + ) + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('', 1.0)])], [0.7, 1.0])]), + parse_prompt("(\"fire\", \" \").blend(0.7, 1)") + ) + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('', 1.0)])], [0.7, 1.0])]), + parse_prompt("(\"fire\", \" \").blend(0.7, 1)") + ) + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([(',', 1.0)])], [0.7, 1.0])]), + parse_prompt("(\"fire\", \" , \").blend(0.7, 1)") + ) + + + def test_nested(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0), ('flames', 2.0), ('trees', 3.0)])]), + parse_prompt('fire 2.0(flames 1.5(trees))')) + self.assertEqual(Conjunction([Blend(prompts=[FlattenedPrompt([('fire', 1.0), ('flames', 1.2100000000000002)]), + FlattenedPrompt([('mountain', 1.0), ('man', 2.0)])], + weights=[1.0, 1.0])]), + parse_prompt('("fire ++(flames)", "mountain 2(man)").blend(1,1)')) + +if __name__ == '__main__': + unittest.main() From 11d7e6b92f2deab1ad4998aad835920593a1e6d3 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sat, 15 Oct 2022 23:58:13 +0200 Subject: [PATCH 018/124] undo unwanted changes --- ldm/generate.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index 965d37a240..7fb68dec0a 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -438,7 +438,7 @@ class Generate: sampler=self.sampler, steps=steps, cfg_scale=cfg_scale, - conditioning=(uc, c), # here change to arrays + conditioning=(uc, c), ddim_eta=ddim_eta, image_callback=image_callback, # called after the final image is generated step_callback=step_callback, # called after each intermediate image is generated @@ -477,10 +477,6 @@ class Generate: print('**Interrupted** Partial results will be returned.') else: raise KeyboardInterrupt - # brute-force fallback - except Exception as e: - print(traceback.format_exc(), file=sys.stderr) - print('>> Could not generate image.') toc = time.time() print('>> Usage stats:') From c6ae9f117634bbfa5d385e98319a36a7701f6ecb Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 16 Oct 2022 00:45:38 +0200 Subject: [PATCH 019/124] remove unnecessary assertion --- ldm/models/diffusion/sampler.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index 42704f1175..417d1d4491 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -429,7 +429,6 @@ class Sampler(object): conditionings = [uc] + [c for c,weight in weighted_cond_list] weights = [1] + [weight for c,weight in weighted_cond_list] chunk_count = ceil(len(conditionings)/2) - assert(len(conditionings)>=2, "need at least one uncond and one cond") deltas = None for chunk_index in range(chunk_count): offset = chunk_index*2 From 61357e4e6eecc43b9d52859eb63b4db4e5ffafc1 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 16 Oct 2022 01:53:44 +0200 Subject: [PATCH 020/124] be less verbose when assembling prompt --- ldm/invoke/conditioning.py | 13 +++++++------ ldm/modules/encoders/modules.py | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 9b67d5040d..e3190f6ed6 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -35,9 +35,10 @@ def get_uc_and_c(prompt_string_uncleaned, model, log_tokens=False, skip_normaliz pp = PromptParser() - def build_conditioning_list(prompt_string:str): + def build_conditioning_list(prompt_string:str, verbose:bool = False): parsed_conjunction: Conjunction = pp.parse(prompt_string) - print(f"parsed '{prompt_string}' to {parsed_conjunction}") + if verbose: + print(f"parsed '{prompt_string}' to {parsed_conjunction}") assert (type(parsed_conjunction) is Conjunction) conditioning_list = [] @@ -46,7 +47,7 @@ def get_uc_and_c(prompt_string_uncleaned, model, log_tokens=False, skip_normaliz raise f"embeddings can only be made from FlattenedPrompts, got {type(flattened_prompt)} instead" fragments = [x[0] for x in flattened_prompt.children] attention_weights = [x[1] for x in flattened_prompt.children] - print(fragments, attention_weights) + #print(fragments, attention_weights) return model.get_learned_conditioning([fragments], attention_weights=[attention_weights]) for part,weight in zip(parsed_conjunction.prompts, parsed_conjunction.weights): @@ -65,14 +66,14 @@ def get_uc_and_c(prompt_string_uncleaned, model, log_tokens=False, skip_normaliz return conditioning_list - positive_conditioning_list = build_conditioning_list(prompt_string_cleaned) - negative_conditioning_list = build_conditioning_list(unconditioned_words) + positive_conditioning_list = build_conditioning_list(prompt_string_cleaned, verbose=True) + negative_conditioning_list = build_conditioning_list(unconditioned_words, verbose=(len(unconditioned_words)>0) ) if len(negative_conditioning_list) == 0: negative_conditioning = model.get_learned_conditioning([['']], attention_weights=[[1]]) else: if len(negative_conditioning_list)>1: - print("cannot do conjunctions on unconditioning for now") + print("cannot do conjunctions on unconditioning for now, everything except the first prompt will be ignored") negative_conditioning = negative_conditioning_list[0][0] #positive_conditioning_list.append((get_blend_prompts_and_weights(prompt), this_weight)) diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 857a8a8e3e..fcd0363e80 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -547,13 +547,13 @@ class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): lerped_embeddings = self.apply_embedding_weights(embeddings, per_embedding_weights, normalize=True).squeeze(0) - print(f"assembled tokens for '{fragments}' into tensor of shape {lerped_embeddings.shape}") + #print(f"assembled tokens for '{fragments}' into tensor of shape {lerped_embeddings.shape}") # append to batch batch_z = lerped_embeddings.unsqueeze(0) if batch_z is None else torch.cat((batch_z, lerped_embeddings.unsqueeze(0)), dim=1) # should have shape (B, 77, 768) - print(f"assembled all tokens into tensor of shape {batch_z.shape}") + #print(f"assembled all tokens into tensor of shape {batch_z.shape}") return batch_z @@ -589,18 +589,19 @@ class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): )['input_ids'] all_tokens = [] per_token_weights = [] - print("all fragments:", fragments, weights) + #print("all fragments:", fragments, weights) for index, fragment in enumerate(item_encodings): weight = weights[index] - print("processing fragment", fragment, weight) + #print("processing fragment", fragment, weight) fragment_tokens = item_encodings[index] - print("fragment", fragment, "processed to", fragment_tokens) + #print("fragment", fragment, "processed to", fragment_tokens) # trim bos and eos markers before appending all_tokens.extend(fragment_tokens[1:-1]) per_token_weights.extend([weight] * (len(fragment_tokens) - 2)) - if len(all_tokens) > self.max_length - 2: - print("prompt is too long and has been truncated") + if (len(all_tokens) + 2) > self.max_length: + excess_token_count = (len(all_tokens) + 2) - self.max_length + print(f"prompt is {excess_token_count} token(s) too long and has been truncated") all_tokens = all_tokens[:self.max_length - 2] # pad out to a 77-entry array: [eos_token, , eos_token, ..., eos_token] @@ -613,7 +614,7 @@ class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): all_tokens_tensor = torch.tensor(all_tokens, dtype=torch.long).to(self.device) per_token_weights_tensor = torch.tensor(per_token_weights, dtype=torch.float32).to(self.device) - print(f"assembled all_tokens_tensor with shape {all_tokens_tensor.shape}") + #print(f"assembled all_tokens_tensor with shape {all_tokens_tensor.shape}") return all_tokens_tensor, per_token_weights_tensor def build_weighted_embedding_tensor(self, tokens: torch.Tensor, per_token_weights: torch.Tensor, weight_delta_from_empty=True, **kwargs) -> torch.Tensor: @@ -641,7 +642,7 @@ class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): weighted_z = empty_z + (z_delta_from_empty * batch_weights_expanded) weighted_z_delta_from_empty = (weighted_z-empty_z) - print("weighted z has delta from empty with sum", weighted_z_delta_from_empty.sum().item(), "mean", weighted_z_delta_from_empty.mean().item() ) + #print("weighted z has delta from empty with sum", weighted_z_delta_from_empty.sum().item(), "mean", weighted_z_delta_from_empty.mean().item() ) #print("using empty-delta method, first 5 rows:") #print(weighted_z[:5]) From 42883545f9d9fb308f7eb160a52028e21b6ae4b9 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 20 Oct 2022 01:42:04 +0200 Subject: [PATCH 021/124] add prompt language support for cross-attention .swap --- ldm/generate.py | 2 +- ldm/invoke/conditioning.py | 110 ++++++----- ldm/invoke/prompt_parser.py | 326 ++++++++++++++++++++++++++++++++ ldm/models/diffusion/ddpm.py | 8 +- ldm/modules/encoders/modules.py | 16 +- tests/test_prompt_parser.py | 173 +++++++++++++++++ 6 files changed, 585 insertions(+), 50 deletions(-) create mode 100644 ldm/invoke/prompt_parser.py create mode 100644 tests/test_prompt_parser.py diff --git a/ldm/generate.py b/ldm/generate.py index 45ed2e73d1..39bcc28162 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -35,7 +35,7 @@ from ldm.invoke.devices import choose_torch_device, choose_precision from ldm.invoke.conditioning import get_uc_and_c_and_ec from ldm.invoke.model_cache import ModelCache from ldm.invoke.seamless import configure_model_padding -from ldm.invoke.txt2mask import Txt2Mask, SegmentedGrayscale +#from ldm.invoke.txt2mask import Txt2Mask, SegmentedGrayscale def fix_func(orig): if hasattr(torch.backends, 'mps') and torch.backends.mps.is_available(): diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 8c8f5eeb01..b7c8e55e66 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -11,71 +11,93 @@ log_tokenization() print out colour-coded tokens and warn if trunca ''' import re from difflib import SequenceMatcher +from typing import Union import torch -def get_uc_and_c_and_ec(prompt, model, log_tokens=False, skip_normalize=False): +from .prompt_parser import PromptParser, Blend, FlattenedPrompt, \ + CrossAttentionControlledFragment, CrossAttentionControlSubstitute, CrossAttentionControlAppend +from ..modules.encoders.modules import WeightedFrozenCLIPEmbedder + + +def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_normalize=False): + # Extract Unconditioned Words From Prompt unconditioned_words = '' unconditional_regex = r'\[(.*?)\]' - unconditionals = re.findall(unconditional_regex, prompt) + unconditionals = re.findall(unconditional_regex, prompt_string_uncleaned) if len(unconditionals) > 0: unconditioned_words = ' '.join(unconditionals) # Remove Unconditioned Words From Prompt unconditional_regex_compile = re.compile(unconditional_regex) - clean_prompt = unconditional_regex_compile.sub(' ', prompt) - prompt = re.sub(' +', ' ', clean_prompt) + clean_prompt = unconditional_regex_compile.sub(' ', prompt_string_uncleaned) + prompt_string_cleaned = re.sub(' +', ' ', clean_prompt) + else: + prompt_string_cleaned = prompt_string_uncleaned - edited_words = None - edited_regex = r'\{(.*?)\}' - edited = re.findall(edited_regex, prompt) - if len(edited) > 0: - edited_words = ' '.join(edited) - edited_regex_compile = re.compile(edited_regex) - clean_prompt = edited_regex_compile.sub(' ', prompt) - prompt = re.sub(' +', ' ', clean_prompt) + pp = PromptParser() - # get weighted sub-prompts - weighted_subprompts = split_weighted_subprompts( - prompt, skip_normalize - ) + parsed_prompt: Union[FlattenedPrompt, Blend] = pp.parse(prompt_string_cleaned) + parsed_negative_prompt: FlattenedPrompt = pp.parse(unconditioned_words) - ec = None + conditioning = None + edited_conditioning = None edit_opcodes = None - uc, _ = model.get_learned_conditioning([unconditioned_words]) + if parsed_prompt is Blend: + blend: Blend = parsed_prompt + embeddings_to_blend = None + for flattened_prompt in blend.prompts: + this_embedding = make_embeddings_for_flattened_prompt(model, flattened_prompt) + embeddings_to_blend = this_embedding if embeddings_to_blend is None else torch.cat( + (embeddings_to_blend, this_embedding)) + conditioning, _ = WeightedFrozenCLIPEmbedder.apply_embedding_weights(embeddings_to_blend.unsqueeze(0), + blend.weights, + normalize=blend.normalize_weights) + else: + flattened_prompt: FlattenedPrompt = parsed_prompt + wants_cross_attention_control = any([issubclass(type(x), CrossAttentionControlledFragment) for x in flattened_prompt.children]) + if wants_cross_attention_control: + original_prompt = FlattenedPrompt() + edited_prompt = FlattenedPrompt() + for fragment in flattened_prompt.children: + if type(fragment) is CrossAttentionControlSubstitute: + original_prompt.append(fragment.original_fragment) + edited_prompt.append(fragment.edited_fragment) + elif type(fragment) is CrossAttentionControlAppend: + edited_prompt.append(fragment.fragment) + else: + # regular fragment + original_prompt.append(fragment) + edited_prompt.append(fragment) + original_embeddings, original_tokens = make_embeddings_for_flattened_prompt(model, original_prompt) + edited_embeddings, edited_tokens = make_embeddings_for_flattened_prompt(model, edited_prompt) - if len(weighted_subprompts) > 1: - # i dont know if this is correct.. but it works - c = torch.zeros_like(uc) - # normalize each "sub prompt" and add it - for subprompt, weight in weighted_subprompts: - log_tokenization(subprompt, model, log_tokens, weight) - subprompt_embeddings, _ = model.get_learned_conditioning([subprompt]) - c = torch.add( - c, - subprompt_embeddings, - alpha=weight, - ) - if edited_words is not None: - print("can't do cross-attention control with blends just yet, ignoring edits") - else: # just standard 1 prompt - log_tokenization(prompt, model, log_tokens, 1) - c, c_tokens = model.get_learned_conditioning([prompt]) - if edited_words is not None: - ec, ec_tokens = model.get_learned_conditioning([edited_words]) - edit_opcodes = build_token_edit_opcodes(c_tokens, ec_tokens) + conditioning = original_embeddings + edited_conditioning = edited_embeddings + edit_opcodes = build_token_edit_opcodes(original_tokens, edited_tokens) + else: + conditioning, _ = make_embeddings_for_flattened_prompt(model, flattened_prompt) - return (uc, c, ec, edit_opcodes) + unconditioning = make_embeddings_for_flattened_prompt(parsed_negative_prompt) + return (unconditioning, conditioning, edited_conditioning, edit_opcodes) -def build_token_edit_opcodes(c_tokens, ec_tokens): - tokens = c_tokens.cpu().numpy()[0] - tokens_edit = ec_tokens.cpu().numpy()[0] - opcodes = SequenceMatcher(None, tokens, tokens_edit).get_opcodes() - return opcodes +def build_token_edit_opcodes(original_tokens, edited_tokens): + original_tokens = original_tokens.cpu().numpy()[0] + edited_tokens = edited_tokens.cpu().numpy()[0] + + return SequenceMatcher(None, original_tokens, edited_tokens).get_opcodes() + +def make_embeddings_for_flattened_prompt(model, flattened_prompt: FlattenedPrompt): + if type(flattened_prompt) is not FlattenedPrompt: + raise f"embeddings can only be made from FlattenedPrompts, got {type(flattened_prompt)} instead" + fragments = [x[0] for x in flattened_prompt.children] + embeddings, tokens = model.get_learned_conditioning([fragments], return_tokens=True) + return embeddings, tokens + def split_weighted_subprompts(text, skip_normalize=False)->list: diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py new file mode 100644 index 0000000000..9dd0f80ade --- /dev/null +++ b/ldm/invoke/prompt_parser.py @@ -0,0 +1,326 @@ +import pyparsing +import pyparsing as pp +from pyparsing import original_text_for + + +class Prompt(): + + def __init__(self, parts: list): + for c in parts: + if not issubclass(type(c), BaseFragment): + raise PromptParser.ParsingException(f"Prompt cannot contain {type(c)}, only {BaseFragment.__subclasses__()} are allowed") + self.children = parts + def __repr__(self): + return f"Prompt:{self.children}" + def __eq__(self, other): + return type(other) is Prompt and other.children == self.children + +class FlattenedPrompt(): + def __init__(self, parts: list): + # verify type correctness + parts_converted = [] + for part in parts: + if issubclass(type(part), BaseFragment): + parts_converted.append(part) + elif type(part) is tuple: + # upgrade tuples to Fragments + if type(part[0]) is not str or (type(part[1]) is not float and type(part[1]) is not int): + raise PromptParser.ParsingException( + f"FlattenedPrompt cannot contain {part}, only Fragments or (str, float) tuples are allowed") + parts_converted.append(Fragment(part[0], part[1])) + else: + raise PromptParser.ParsingException( + f"FlattenedPrompt cannot contain {part}, only Fragments or (str, float) tuples are allowed") + # all looks good + self.children = parts_converted + + def __repr__(self): + return f"FlattenedPrompt:{self.children}" + def __eq__(self, other): + return type(other) is FlattenedPrompt and other.children == self.children + +# abstract base class for Fragments +class BaseFragment: + pass + +class Fragment(BaseFragment): + def __init__(self, text: str, weight: float=1): + assert(type(text) is str) + self.text = text + self.weight = float(weight) + + def __repr__(self): + return "Fragment:'"+self.text+"'@"+str(self.weight) + def __eq__(self, other): + return type(other) is Fragment \ + and other.text == self.text \ + and other.weight == self.weight + +class CrossAttentionControlledFragment(BaseFragment): + pass + +class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): + def __init__(self, original: Fragment, edited: Fragment): + self.original = original + self.edited = edited + + def __repr__(self): + return f"CrossAttentionControlSubstitute:('{self.original}'->'{self.edited}')" + def __eq__(self, other): + return type(other) is CrossAttentionControlSubstitute \ + and other.original == self.original \ + and other.edited == self.edited + +class CrossAttentionControlAppend(CrossAttentionControlledFragment): + def __init__(self, fragment: Fragment): + self.fragment = fragment + def __repr__(self): + return "CrossAttentionControlAppend:",self.fragment + def __eq__(self, other): + return type(other) is CrossAttentionControlAppend \ + and other.fragment == self.fragment + + + +class Conjunction(): + def __init__(self, prompts: list, weights: list = None): + # force everything to be a Prompt + #print("making conjunction with", parts) + self.prompts = [x if (type(x) is Prompt + or type(x) is Blend + or type(x) is FlattenedPrompt) + else Prompt(x) for x in prompts] + self.weights = [1.0]*len(self.prompts) if weights is None else list(weights) + if len(self.weights) != len(self.prompts): + raise PromptParser.ParsingException(f"while parsing Conjunction: mismatched parts/weights counts {prompts}, {weights}") + self.type = 'AND' + + def __repr__(self): + return f"Conjunction:{self.prompts} | weights {self.weights}" + def __eq__(self, other): + return type(other) is Conjunction \ + and other.prompts == self.prompts \ + and other.weights == self.weights + + +class Blend(): + def __init__(self, prompts: list, weights: list[float], normalize_weights: bool=True): + #print("making Blend with prompts", prompts, "and weights", weights) + if len(prompts) != len(weights): + raise PromptParser.ParsingException(f"while parsing Blend: mismatched prompts/weights counts {prompts}, {weights}") + for c in prompts: + if type(c) is not Prompt and type(c) is not FlattenedPrompt: + raise(PromptParser.ParsingException(f"{type(c)} cannot be added to a Blend, only Prompts or FlattenedPrompts")) + # upcast all lists to Prompt objects + self.prompts = [x if (type(x) is Prompt or type(x) is FlattenedPrompt) + else Prompt(x) for x in prompts] + self.prompts = prompts + self.weights = weights + self.normalize_weights = normalize_weights + + def __repr__(self): + return f"Blend:{self.prompts} | weights {self.weights}" + def __eq__(self, other): + return other.__repr__() == self.__repr__() + + +class PromptParser(): + + class ParsingException(Exception): + pass + + def __init__(self, attention_plus_base=1.1, attention_minus_base=0.9): + + self.attention_plus_base = attention_plus_base + self.attention_minus_base = attention_minus_base + + self.root = self.build_parser_logic() + + + def parse(self, prompt: str) -> [list]: + ''' + :param prompt: The prompt string to parse + :return: a tuple + ''' + #print(f"!!parsing '{prompt}'") + + if len(prompt.strip()) == 0: + return Conjunction(prompts=[FlattenedPrompt([('', 1.0)])], weights=[1.0]) + + root = self.root.parse_string(prompt) + #print(f"'{prompt}' parsed to root", root) + #fused = fuse_fragments(parts) + #print("fused to", fused) + + return self.flatten(root[0]) + + def flatten(self, root: Conjunction): + + def fuse_fragments(items): + # print("fusing fragments in ", items) + result = [] + for x in items: + if issubclass(type(x), CrossAttentionControlledFragment): + result.append(x) + else: + last_weight = result[-1].weight \ + if (len(result) > 0 and not issubclass(type(result[-1]), CrossAttentionControlledFragment)) \ + else None + this_text = x.text + this_weight = x.weight + if last_weight is not None and last_weight == this_weight: + last_text = result[-1].text + result[-1] = Fragment(last_text + ' ' + this_text, last_weight) + else: + result.append(x) + return result + + def flatten_internal(node, weight_scale, results, prefix): + #print(prefix + "flattening", node, "...") + if type(node) is pp.ParseResults: + for x in node: + results = flatten_internal(x, weight_scale, results, prefix+'pr') + #print(prefix, " ParseResults expanded, results is now", results) + elif issubclass(type(node), BaseFragment): + results.append(node) + #elif type(node) is Attention: + # #if node.weight < 1: + # # todo: inject a blend when flattening attention with weight <1" + # for c in node.children: + # results = flatten_internal(c, weight_scale*node.weight, results, prefix+' ') + elif type(node) is Blend: + flattened_subprompts = [] + #print(" flattening blend with prompts", node.prompts, "weights", node.weights) + for prompt in node.prompts: + # prompt is a list + flattened_subprompts = flatten_internal(prompt, weight_scale, flattened_subprompts, prefix+'B ') + results += [Blend(prompts=flattened_subprompts, weights=node.weights)] + elif type(node) is Prompt: + #print(prefix + "about to flatten Prompt with children", node.children) + flattened_prompt = [] + for child in node.children: + flattened_prompt = flatten_internal(child, weight_scale, flattened_prompt, prefix+'P ') + results += [FlattenedPrompt(parts=fuse_fragments(flattened_prompt))] + #print(prefix + "after flattening Prompt, results is", results) + else: + raise PromptParser.ParsingException(f"unhandled node type {type(node)} when flattening {node}") + #print(prefix + "-> after flattening", type(node), "results is", results) + return results + + #print("flattening", root) + + flattened_parts = [] + for part in root.prompts: + flattened_parts += flatten_internal(part, 1.0, [], ' C| ') + weights = root.weights + return Conjunction(flattened_parts, weights) + + + + def build_parser_logic(self): + + lparen = pp.Literal("(").suppress() + rparen = pp.Literal(")").suppress() + # accepts int or float notation, always maps to float + number = pyparsing.pyparsing_common.real | pp.Word(pp.nums).set_parse_action(pp.token_map(float)) + SPACE_CHARS = ' \t\n' + + prompt_part = pp.Forward() + word = pp.Word(pp.printables).set_parse_action(lambda x: Fragment(' '.join([s for s in x]))) + word.set_name("word") + word.set_debug(False) + + def make_fragment(x): + #print("### making fragment for", x) + if type(x) is str: + return Fragment(x) + elif type(x) is pp.ParseResults or type(x) is list: + return Fragment(' '.join([s for s in x])) + else: + raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) + + + original_words = ( + (lparen + pp.Literal('"').suppress() + pp.CharsNotIn('"') + pp.Literal('"').suppress() + rparen).set_name('term1').set_debug(False) | + (pp.Literal('"').suppress() + pp.CharsNotIn('"') + pp.Literal('"').suppress()).set_name('term2').set_debug(False) | + (lparen + pp.CharsNotIn(')') + rparen).set_name('term3').set_debug(False) + ).set_name('original_words') + edited_words = ( + (pp.Literal('"').suppress() + pp.CharsNotIn('"') + pp.Literal('"').suppress()).set_name('termA').set_debug(False) | + pp.CharsNotIn(')').set_name('termB').set_debug(False) + ).set_name('edited_words') + cross_attention_substitute = original_words + \ + pp.Literal(".swap").suppress() + \ + lparen + edited_words + rparen + cross_attention_substitute.set_name('cross_attention_substitute') + + def make_cross_attention_substitute(x): + #print("making cacs for", x) + return CrossAttentionControlSubstitute(x[0], x[1]) + #print("made", cacs) + #return cacs + + cross_attention_substitute.set_parse_action(make_cross_attention_substitute) + + # simple fragments of text + prompt_part << (cross_attention_substitute + #| attention + | word + ) + prompt_part.set_debug(False) + prompt_part.set_name("prompt_part") + + # root prompt definition + prompt = pp.Group(pp.OneOrMore(prompt_part))\ + .set_parse_action(lambda x: Prompt(x[0])) + + # weighted blend of prompts + # ("promptA", "promptB").blend(a, b) where "promptA" and "promptB" are valid prompts and a and b are float or + # int weights. + # can specify more terms eg ("promptA", "promptB", "promptC").blend(a,b,c) + + def make_prompt_from_quoted_string(x): + #print(' got quoted prompt', x) + + x_unquoted = x[0][1:-1] + if len(x_unquoted.strip()) == 0: + # print(' b : just an empty string') + return Prompt([Fragment('')]) + # print(' b parsing ', c_unquoted) + x_parsed = prompt.parse_string(x_unquoted) + #print(" quoted prompt was parsed to", type(x_parsed),":", x_parsed) + return x_parsed[0] + + quoted_prompt = pp.dbl_quoted_string.set_parse_action(make_prompt_from_quoted_string) + quoted_prompt.set_name('quoted_prompt') + + blend_terms = pp.delimited_list(quoted_prompt).set_name('blend_terms') + blend_weights = pp.delimited_list(number).set_name('blend_weights') + blend = pp.Group(lparen + pp.Group(blend_terms) + rparen + + pp.Literal(".blend").suppress() + + lparen + pp.Group(blend_weights) + rparen).set_name('blend') + blend.set_debug(False) + + + blend.set_parse_action(lambda x: Blend(prompts=x[0][0], weights=x[0][1])) + + conjunction_terms = blend_terms.copy().set_name('conjunction_terms') + conjunction_weights = blend_weights.copy().set_name('conjunction_weights') + conjunction_with_parens_and_quotes = pp.Group(lparen + pp.Group(conjunction_terms) + rparen + + pp.Literal(".and").suppress() + + lparen + pp.Optional(pp.Group(conjunction_weights)) + rparen).set_name('conjunction') + def make_conjunction(x): + parts_raw = x[0][0] + weights = x[0][1] if len(x[0])>1 else [1.0]*len(parts_raw) + parts = [part for part in parts_raw] + return Conjunction(parts, weights) + conjunction_with_parens_and_quotes.set_parse_action(make_conjunction) + + implicit_conjunction = pp.OneOrMore(blend | prompt) + implicit_conjunction.set_parse_action(lambda x: Conjunction(x)) + + conjunction = conjunction_with_parens_and_quotes | implicit_conjunction + conjunction.set_debug(False) + + # top-level is a conjunction of one or more blends or prompts + return conjunction diff --git a/ldm/models/diffusion/ddpm.py b/ldm/models/diffusion/ddpm.py index 4b62b5e393..57027b224c 100644 --- a/ldm/models/diffusion/ddpm.py +++ b/ldm/models/diffusion/ddpm.py @@ -820,21 +820,21 @@ class LatentDiffusion(DDPM): ) return self.scale_factor * z - def get_learned_conditioning(self, c): + def get_learned_conditioning(self, c, **kwargs): if self.cond_stage_forward is None: if hasattr(self.cond_stage_model, 'encode') and callable( self.cond_stage_model.encode ): c = self.cond_stage_model.encode( - c, embedding_manager=self.embedding_manager + c, embedding_manager=self.embedding_manager, **kwargs ) if isinstance(c, DiagonalGaussianDistribution): c = c.mode() else: - c = self.cond_stage_model(c) + c = self.cond_stage_model(c, **kwargs) else: assert hasattr(self.cond_stage_model, self.cond_stage_forward) - c = getattr(self.cond_stage_model, self.cond_stage_forward)(c) + c = getattr(self.cond_stage_model, self.cond_stage_forward)(c, **kwargs) return c def meshgrid(self, h, w): diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 12ef737134..8f4ad26119 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -1,3 +1,5 @@ +import math + import torch import torch.nn as nn from functools import partial @@ -449,11 +451,23 @@ class FrozenCLIPEmbedder(AbstractEncoder): tokens = batch_encoding['input_ids'].to(self.device) z = self.transformer(input_ids=tokens, **kwargs) - return z, tokens + if kwargs.get('return_tokens', False): + return z, tokens + else: + return z def encode(self, text, **kwargs): return self(text, **kwargs) +class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): + @classmethod + def apply_embedding_weights(self, embeddings: torch.Tensor, per_embedding_weights: list[float], normalize:bool) -> torch.Tensor: + per_embedding_weights = torch.tensor(per_embedding_weights, dtype=embeddings.dtype, device=embeddings.device) + if normalize: + per_embedding_weights = per_embedding_weights / torch.sum(per_embedding_weights) + reshaped_weights = per_embedding_weights.reshape(per_embedding_weights.shape + (1, 1,)) + return torch.sum(embeddings * reshaped_weights, dim=1) + class FrozenCLIPTextEmbedder(nn.Module): """ diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py new file mode 100644 index 0000000000..2ef56c47ae --- /dev/null +++ b/tests/test_prompt_parser.py @@ -0,0 +1,173 @@ +import unittest + +from ldm.invoke.prompt_parser import PromptParser, Blend, Conjunction, FlattenedPrompt, CrossAttentionControlSubstitute + + +def parse_prompt(prompt_string): + pp = PromptParser() + #print(f"parsing '{prompt_string}'") + parse_result = pp.parse(prompt_string) + #print(f"-> parsed '{prompt_string}' to {parse_result}") + return parse_result + +class PromptParserTestCase(unittest.TestCase): + + def test_empty(self): + self.assertEqual(Conjunction([FlattenedPrompt([('', 1)])]), parse_prompt('')) + + def test_basic(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire (flames)', 1)])]), parse_prompt("fire (flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([("fire flames", 1)])]), parse_prompt("fire flames")) + self.assertEqual(Conjunction([FlattenedPrompt([("fire, flames", 1)])]), parse_prompt("fire, flames")) + self.assertEqual(Conjunction([FlattenedPrompt([("fire, flames , fire", 1)])]), parse_prompt("fire, flames , fire")) + + def test_attention(self): + self.assertEqual(Conjunction([FlattenedPrompt([('flames', 0.5)])]), parse_prompt("0.5(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('fire flames', 0.5)])]), parse_prompt("0.5(fire flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flames', 1.1)])]), parse_prompt("+(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flames', 0.9)])]), parse_prompt("-(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1), ('flames', 0.5)])]), parse_prompt("fire 0.5(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flames', pow(1.1, 2))])]), parse_prompt("++(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flames', pow(0.9, 2))])]), parse_prompt("--(flames)")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))])]), parse_prompt("---(flowers) +++flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))])]), parse_prompt("---(flowers) +++flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames+', pow(1.1, 3))])]), + parse_prompt("---(flowers) +++flames+")) + self.assertEqual(Conjunction([FlattenedPrompt([('pretty flowers', 1.1)])]), + parse_prompt("+(pretty flowers)")) + self.assertEqual(Conjunction([FlattenedPrompt([('pretty flowers', 1.1), (', the flames are too hot', 1)])]), + parse_prompt("+(pretty flowers), the flames are too hot")) + + def test_no_parens_attention_runon(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire', pow(1.1, 2)), ('flames', 1.0)])]), parse_prompt("++fire flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', pow(0.9, 2)), ('flames', 1.0)])]), parse_prompt("--fire flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', 1.0), ('fire', pow(1.1, 2)), ('flames', 1.0)])]), parse_prompt("flowers ++fire flames")) + self.assertEqual(Conjunction([FlattenedPrompt([('flowers', 1.0), ('fire', pow(0.9, 2)), ('flames', 1.0)])]), parse_prompt("flowers --fire flames")) + + + def test_explicit_conjunction(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])]), parse_prompt('("fire", "flames").and(1,1)')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])]), parse_prompt('("fire", "flames").and()')) + self.assertEqual( + Conjunction([FlattenedPrompt([('fire flames', 1.0)]), FlattenedPrompt([('mountain man', 1.0)])]), parse_prompt('("fire flames", "mountain man").and()')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 2.0)]), FlattenedPrompt([('flames', 0.9)])]), parse_prompt('("2.0(fire)", "-flames").and()')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)]), + FlattenedPrompt([('mountain man', 1.0)])]), parse_prompt('("fire", "flames", "mountain man").and()')) + + def test_conjunction_weights(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])], weights=[2.0,1.0]), parse_prompt('("fire", "flames").and(2,1)')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])], weights=[1.0,2.0]), parse_prompt('("fire", "flames").and(1,2)')) + + with self.assertRaises(PromptParser.ParsingException): + parse_prompt('("fire", "flames").and(2)') + parse_prompt('("fire", "flames").and(2,1,2)') + + def test_complex_conjunction(self): + self.assertEqual(Conjunction([FlattenedPrompt([("mountain man", 1.0)]), FlattenedPrompt([("a person with a hat", 1.0), ("riding a bicycle", pow(1.1,2))])], weights=[0.5, 0.5]), + parse_prompt("(\"mountain man\", \"a person with a hat ++(riding a bicycle)\").and(0.5, 0.5)")) + + def test_badly_formed(self): + def make_untouched_prompt(prompt): + return Conjunction([FlattenedPrompt([(prompt, 1.0)])]) + + def assert_if_prompt_string_not_untouched(prompt): + self.assertEqual(make_untouched_prompt(prompt), parse_prompt(prompt)) + + assert_if_prompt_string_not_untouched('a test prompt') + assert_if_prompt_string_not_untouched('a badly (formed test prompt') + assert_if_prompt_string_not_untouched('a badly formed test+ prompt') + assert_if_prompt_string_not_untouched('a badly (formed test+ prompt') + assert_if_prompt_string_not_untouched('a badly (formed test+ )prompt') + assert_if_prompt_string_not_untouched('a badly (formed test+ )prompt') + assert_if_prompt_string_not_untouched('(((a badly (formed test+ )prompt') + assert_if_prompt_string_not_untouched('(a (ba)dly (f)ormed test+ prompt') + self.assertEqual(Conjunction([FlattenedPrompt([('(a (ba)dly (f)ormed test+', 1.0), ('prompt', 1.1)])]), + parse_prompt('(a (ba)dly (f)ormed test+ +prompt')) + self.assertEqual(Conjunction([Blend([FlattenedPrompt([('((a badly (formed test+', 1.0)])], weights=[1.0])]), + parse_prompt('("((a badly (formed test+ ").blend(1.0)')) + + def test_blend(self): + self.assertEqual(Conjunction( + [Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('fire flames', 1.0)])], [0.7, 0.3])]), + parse_prompt("(\"fire\", \"fire flames\").blend(0.7, 0.3)") + ) + self.assertEqual(Conjunction([Blend( + [FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('fire flames', 1.0)]), FlattenedPrompt([('hi', 1.0)])], + [0.7, 0.3, 1.0])]), + parse_prompt("(\"fire\", \"fire flames\", \"hi\").blend(0.7, 0.3, 1.0)") + ) + self.assertEqual(Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), + FlattenedPrompt([('fire flames', 1.0), ('hot', pow(1.1, 2))]), + FlattenedPrompt([('hi', 1.0)])], + weights=[0.7, 0.3, 1.0])]), + parse_prompt("(\"fire\", \"fire flames ++(hot)\", \"hi\").blend(0.7, 0.3, 1.0)") + ) + # blend a single entry is not a failure + self.assertEqual(Conjunction([Blend([FlattenedPrompt([('fire', 1.0)])], [0.7])]), + parse_prompt("(\"fire\").blend(0.7)") + ) + # blend with empty + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('', 1.0)])], [0.7, 1.0])]), + parse_prompt("(\"fire\", \"\").blend(0.7, 1)") + ) + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('', 1.0)])], [0.7, 1.0])]), + parse_prompt("(\"fire\", \" \").blend(0.7, 1)") + ) + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('', 1.0)])], [0.7, 1.0])]), + parse_prompt("(\"fire\", \" \").blend(0.7, 1)") + ) + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([(',', 1.0)])], [0.7, 1.0])]), + parse_prompt("(\"fire\", \" , \").blend(0.7, 1)") + ) + + + def test_nested(self): + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0), ('flames', 2.0), ('trees', 3.0)])]), + parse_prompt('fire 2.0(flames 1.5(trees))')) + self.assertEqual(Conjunction([Blend(prompts=[FlattenedPrompt([('fire', 1.0), ('flames', 1.2100000000000002)]), + FlattenedPrompt([('mountain', 1.0), ('man', 2.0)])], + weights=[1.0, 1.0])]), + parse_prompt('("fire ++(flames)", "mountain 2(man)").blend(1,1)')) + + def test_cross_attention_control(self): + fire_flames_to_trees = Conjunction([FlattenedPrompt([('fire', 1.0), \ + CrossAttentionControlSubstitute('flames', 'trees')])]) + self.assertEqual(fire_flames_to_trees, parse_prompt('fire "flames".swap(trees)')) + self.assertEqual(fire_flames_to_trees, parse_prompt('fire (flames).swap(trees)')) + self.assertEqual(fire_flames_to_trees, parse_prompt('fire ("flames").swap(trees)')) + self.assertEqual(fire_flames_to_trees, parse_prompt('fire "flames".swap("trees")')) + self.assertEqual(fire_flames_to_trees, parse_prompt('fire (flames).swap("trees")')) + self.assertEqual(fire_flames_to_trees, parse_prompt('fire ("flames").swap("trees")')) + + fire_flames_to_trees_and_houses = Conjunction([FlattenedPrompt([('fire', 1.0), \ + CrossAttentionControlSubstitute('flames', 'trees and houses')])]) + self.assertEqual(fire_flames_to_trees_and_houses, parse_prompt('fire ("flames").swap("trees and houses")')) + self.assertEqual(fire_flames_to_trees_and_houses, parse_prompt('fire (flames).swap("trees and houses")')) + self.assertEqual(fire_flames_to_trees_and_houses, parse_prompt('fire "flames".swap("trees and houses")')) + + trees_and_houses_to_flames = Conjunction([FlattenedPrompt([('fire', 1.0), \ + CrossAttentionControlSubstitute('trees and houses', 'flames')])]) + self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire ("trees and houses").swap("flames")')) + self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire (trees and houses).swap("flames")')) + self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire "trees and houses".swap("flames")')) + self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire ("trees and houses").swap(flames)')) + self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire (trees and houses).swap(flames)')) + self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire "trees and houses".swap(flames)')) + + flames_to_trees_fire = Conjunction([FlattenedPrompt([ + CrossAttentionControlSubstitute('flames', 'trees'), + (', fire', 1.0)])]) + self.assertEqual(flames_to_trees_fire, parse_prompt('"flames".swap(trees), fire')) + self.assertEqual(flames_to_trees_fire, parse_prompt('(flames).swap(trees), fire ')) + self.assertEqual(flames_to_trees_fire, parse_prompt('("flames").swap(trees), fire ')) + self.assertEqual(flames_to_trees_fire, parse_prompt('"flames".swap("trees"), fire')) + self.assertEqual(flames_to_trees_fire, parse_prompt('(flames).swap("trees"), fire')) + self.assertEqual(flames_to_trees_fire, parse_prompt('("flames").swap("trees"), fire')) + + +if __name__ == '__main__': + unittest.main() From c9d27634b4b557b2bfd012f857ea2bb2f3a40e51 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 20 Oct 2022 12:01:48 +0200 Subject: [PATCH 022/124] bring in prompt parser from fix-prompts branch attention is parsed but ignored, blends old syntax doesn't work, conjunctions are parsed but ignored, the only part that's used here is the new .blend() syntax and cross-attention control using .swap() --- ldm/invoke/conditioning.py | 24 ++++--- ldm/invoke/generator/img2img.py | 4 +- ldm/invoke/generator/txt2img.py | 4 +- ldm/invoke/generator/txt2img2img.py | 6 +- ldm/invoke/prompt_parser.py | 108 ++++++++++++++++++++++------ ldm/models/diffusion/ddim.py | 6 +- ldm/models/diffusion/ksampler.py | 14 ++-- ldm/models/diffusion/plms.py | 6 +- ldm/modules/encoders/modules.py | 9 ++- tests/test_prompt_parser.py | 49 ++++++++++--- 10 files changed, 169 insertions(+), 61 deletions(-) diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index b7c8e55e66..fb6d8d443e 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -4,7 +4,7 @@ weighted subprompts. Useful function exports: -get_uc_and_c() get the conditioned and unconditioned latent +get_uc_and_c_and_ec() get the conditioned and unconditioned latent, and edited conditioning if we're doing cross-attention control split_weighted_subpromopts() split subprompts, normalize and weight them log_tokenization() print out colour-coded tokens and warn if truncated @@ -39,8 +39,10 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n pp = PromptParser() - parsed_prompt: Union[FlattenedPrompt, Blend] = pp.parse(prompt_string_cleaned) - parsed_negative_prompt: FlattenedPrompt = pp.parse(unconditioned_words) + # we don't support conjunctions for now + parsed_prompt: Union[FlattenedPrompt, Blend] = pp.parse(prompt_string_cleaned).prompts[0] + parsed_negative_prompt: FlattenedPrompt = pp.parse(unconditioned_words).prompts[0] + print("parsed prompt to", parsed_prompt) conditioning = None edited_conditioning = None @@ -50,7 +52,7 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n blend: Blend = parsed_prompt embeddings_to_blend = None for flattened_prompt in blend.prompts: - this_embedding = make_embeddings_for_flattened_prompt(model, flattened_prompt) + this_embedding = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt) embeddings_to_blend = this_embedding if embeddings_to_blend is None else torch.cat( (embeddings_to_blend, this_embedding)) conditioning, _ = WeightedFrozenCLIPEmbedder.apply_embedding_weights(embeddings_to_blend.unsqueeze(0), @@ -72,16 +74,16 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n # regular fragment original_prompt.append(fragment) edited_prompt.append(fragment) - original_embeddings, original_tokens = make_embeddings_for_flattened_prompt(model, original_prompt) - edited_embeddings, edited_tokens = make_embeddings_for_flattened_prompt(model, edited_prompt) + original_embeddings, original_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, original_prompt) + edited_embeddings, edited_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, edited_prompt) conditioning = original_embeddings edited_conditioning = edited_embeddings edit_opcodes = build_token_edit_opcodes(original_tokens, edited_tokens) else: - conditioning, _ = make_embeddings_for_flattened_prompt(model, flattened_prompt) + conditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt) - unconditioning = make_embeddings_for_flattened_prompt(parsed_negative_prompt) + unconditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, parsed_negative_prompt) return (unconditioning, conditioning, edited_conditioning, edit_opcodes) @@ -91,11 +93,11 @@ def build_token_edit_opcodes(original_tokens, edited_tokens): return SequenceMatcher(None, original_tokens, edited_tokens).get_opcodes() -def make_embeddings_for_flattened_prompt(model, flattened_prompt: FlattenedPrompt): +def build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt: FlattenedPrompt): if type(flattened_prompt) is not FlattenedPrompt: raise f"embeddings can only be made from FlattenedPrompts, got {type(flattened_prompt)} instead" - fragments = [x[0] for x in flattened_prompt.children] - embeddings, tokens = model.get_learned_conditioning([fragments], return_tokens=True) + fragments = [x.text for x in flattened_prompt.children] + embeddings, tokens = model.get_learned_conditioning([' '.join(fragments)], return_tokens=True) return embeddings, tokens diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 0a12bd90e5..6fa0d0c6dd 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -34,7 +34,7 @@ class Img2Img(Generator): t_enc = int(strength * steps) uc, c, ec, edit_opcodes = conditioning - structured_conditioning = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) + extra_conditioning_info = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) def make_image(x_T): # encode (scaled latent) @@ -52,7 +52,7 @@ class Img2Img(Generator): unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, init_latent = self.init_latent, - structured_conditioning = structured_conditioning + extra_conditioning_info = extra_conditioning_info # changes how noising is performed in ksampler ) diff --git a/ldm/invoke/generator/txt2img.py b/ldm/invoke/generator/txt2img.py index 6e158562c5..657cccc592 100644 --- a/ldm/invoke/generator/txt2img.py +++ b/ldm/invoke/generator/txt2img.py @@ -22,7 +22,7 @@ class Txt2Img(Generator): """ self.perlin = perlin uc, c, ec, edit_opcodes = conditioning - structured_conditioning = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) + extra_conditioning_info = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) @torch.no_grad() def make_image(x_T): @@ -46,7 +46,7 @@ class Txt2Img(Generator): verbose = False, unconditional_guidance_scale = cfg_scale, unconditional_conditioning = uc, - structured_conditioning = structured_conditioning, + extra_conditioning_info = extra_conditioning_info, eta = ddim_eta, img_callback = step_callback, threshold = threshold, diff --git a/ldm/invoke/generator/txt2img2img.py b/ldm/invoke/generator/txt2img2img.py index 52a14aae74..64d0468418 100644 --- a/ldm/invoke/generator/txt2img2img.py +++ b/ldm/invoke/generator/txt2img2img.py @@ -24,7 +24,7 @@ class Txt2Img2Img(Generator): kwargs are 'width' and 'height' """ uc, c, ec, edit_opcodes = conditioning - structured_conditioning = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) + extra_conditioning_info = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) @torch.no_grad() def make_image(x_T): @@ -63,7 +63,7 @@ class Txt2Img2Img(Generator): unconditional_conditioning = uc, eta = ddim_eta, img_callback = step_callback, - structured_conditioning = structured_conditioning + extra_conditioning_info = extra_conditioning_info ) print( @@ -97,7 +97,7 @@ class Txt2Img2Img(Generator): img_callback = step_callback, unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, - structured_conditioning = structured_conditioning + extra_conditioning_info = extra_conditioning_info ) if self.free_gpu_mem: diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 9dd0f80ade..c13175a488 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -7,7 +7,7 @@ class Prompt(): def __init__(self, parts: list): for c in parts: - if not issubclass(type(c), BaseFragment): + if type(c) is not Attention and not issubclass(type(c), BaseFragment): raise PromptParser.ParsingException(f"Prompt cannot contain {type(c)}, only {BaseFragment.__subclasses__()} are allowed") self.children = parts def __repr__(self): @@ -56,6 +56,17 @@ class Fragment(BaseFragment): and other.text == self.text \ and other.weight == self.weight +class Attention(): + def __init__(self, weight: float, children: list): + self.weight = weight + self.children = children + #print(f"A: requested attention '{children}' to {weight}") + + def __repr__(self): + return f"Attention:'{self.children}' @ {self.weight}" + def __eq__(self, other): + return type(other) is Attention and other.weight == self.weight and other.fragment == self.fragment + class CrossAttentionControlledFragment(BaseFragment): pass @@ -65,7 +76,7 @@ class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): self.edited = edited def __repr__(self): - return f"CrossAttentionControlSubstitute:('{self.original}'->'{self.edited}')" + return f"CrossAttentionControlSubstitute:({self.original}->{self.edited})" def __eq__(self, other): return type(other) is CrossAttentionControlSubstitute \ and other.original == self.original \ @@ -137,7 +148,7 @@ class PromptParser(): self.root = self.build_parser_logic() - def parse(self, prompt: str) -> [list]: + def parse(self, prompt: str) -> Conjunction: ''' :param prompt: The prompt string to parse :return: a tuple @@ -181,13 +192,17 @@ class PromptParser(): for x in node: results = flatten_internal(x, weight_scale, results, prefix+'pr') #print(prefix, " ParseResults expanded, results is now", results) - elif issubclass(type(node), BaseFragment): - results.append(node) - #elif type(node) is Attention: - # #if node.weight < 1: - # # todo: inject a blend when flattening attention with weight <1" - # for c in node.children: - # results = flatten_internal(c, weight_scale*node.weight, results, prefix+' ') + elif type(node) is Attention: + # if node.weight < 1: + # todo: inject a blend when flattening attention with weight <1" + for c in node.children: + results = flatten_internal(c, weight_scale * node.weight, results, prefix + ' ') + elif type(node) is Fragment: + results += [Fragment(node.text, node.weight*weight_scale)] + elif type(node) is CrossAttentionControlSubstitute: + original = flatten_internal(node.original, weight_scale, [], ' CAo ') + edited = flatten_internal(node.edited, weight_scale, [], ' CAe ') + results += [CrossAttentionControlSubstitute(original, edited)] elif type(node) is Blend: flattened_subprompts = [] #print(" flattening blend with prompts", node.prompts, "weights", node.weights) @@ -204,7 +219,7 @@ class PromptParser(): #print(prefix + "after flattening Prompt, results is", results) else: raise PromptParser.ParsingException(f"unhandled node type {type(node)} when flattening {node}") - #print(prefix + "-> after flattening", type(node), "results is", results) + print(prefix + "-> after flattening", type(node), "results is", results) return results #print("flattening", root) @@ -239,32 +254,83 @@ class PromptParser(): else: raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) + # attention control of the form +(phrase) / -(phrase) / (phrase) + # phrase can be multiple words, can have multiple +/- signs to increase the effect or type a floating point or integer weight + attention = pp.Forward() + attention_head = (number | pp.Word('+') | pp.Word('-'))\ + .set_name("attention_head")\ + .set_debug(False) + fragment_inside_attention = pp.CharsNotIn(SPACE_CHARS+'()')\ + .set_parse_action(make_fragment)\ + .set_name("fragment_inside_attention")\ + .set_debug(False) + attention_with_parens = pp.Forward() + attention_with_parens_body = pp.nested_expr(content=pp.delimited_list((attention_with_parens | fragment_inside_attention), delim=SPACE_CHARS)) + attention_with_parens << (attention_head + attention_with_parens_body) + + def make_attention(x): + # print("making Attention from parsing with args", x0, x1) + weight = 1 + # number(str) + if type(x[0]) is float or type(x[0]) is int: + weight = float(x[0]) + # +(str) or -(str) or +str or -str + elif type(x[0]) is str: + base = self.attention_plus_base if x[0][0] == '+' else self.attention_minus_base + weight = pow(base, len(x[0])) + # print("Making attention with children of type", [str(type(x)) for x in x1]) + return Attention(weight=weight, children=x[1]) + + attention_with_parens.set_parse_action(make_attention)\ + .set_name("attention_with_parens")\ + .set_debug(False) + + # attention control of the form ++word --word (no parens) + attention_without_parens = ( + (pp.Word('+') | pp.Word('-')) + + pp.CharsNotIn(SPACE_CHARS+'()').set_parse_action(lambda x: [[make_fragment(x)]]) + )\ + .set_name("attention_without_parens")\ + .set_debug(False) + attention_without_parens.set_parse_action(make_attention) + + attention << (attention_with_parens | attention_without_parens)\ + .set_name("attention")\ + .set_debug(False) + + # cross-attention control + empty_string = ((lparen + rparen) | + pp.Literal('""').suppress() | + (lparen + pp.Literal('""').suppress() + rparen) + ).set_parse_action(lambda x: Fragment("")) original_words = ( - (lparen + pp.Literal('"').suppress() + pp.CharsNotIn('"') + pp.Literal('"').suppress() + rparen).set_name('term1').set_debug(False) | - (pp.Literal('"').suppress() + pp.CharsNotIn('"') + pp.Literal('"').suppress()).set_name('term2').set_debug(False) | - (lparen + pp.CharsNotIn(')') + rparen).set_name('term3').set_debug(False) + (lparen + pp.Literal('"').suppress() + (pp.OneOrMore(attention) | pp.CharsNotIn('"').set_parse_action(make_fragment)) + pp.Literal('"').suppress() + rparen).set_name('term1').set_debug(False) | + (pp.Literal('"').suppress() + (pp.OneOrMore(attention) | pp.CharsNotIn('"').set_parse_action(make_fragment)) + pp.Literal('"').suppress()).set_name('term2').set_debug(False) | + (lparen + (pp.OneOrMore(attention) | pp.CharsNotIn(')').set_parse_action(make_fragment)) + rparen).set_name('term3').set_debug(False) ).set_name('original_words') edited_words = ( - (pp.Literal('"').suppress() + pp.CharsNotIn('"') + pp.Literal('"').suppress()).set_name('termA').set_debug(False) | - pp.CharsNotIn(')').set_name('termB').set_debug(False) + (pp.Literal('"').suppress() + (pp.OneOrMore(attention) | pp.CharsNotIn('"').set_parse_action(make_fragment)) + pp.Literal('"').suppress()).set_name('termA').set_debug(False) | + pp.Literal('""').suppress().set_parse_action(lambda x: Fragment("")) | + (pp.OneOrMore(attention) | pp.CharsNotIn(')').set_parse_action(make_fragment)).set_name('termB').set_debug(True) ).set_name('edited_words') - cross_attention_substitute = original_words + \ + cross_attention_substitute = (empty_string | original_words) + \ pp.Literal(".swap").suppress() + \ - lparen + edited_words + rparen + (empty_string | (lparen + edited_words + rparen) + ) cross_attention_substitute.set_name('cross_attention_substitute') def make_cross_attention_substitute(x): #print("making cacs for", x) - return CrossAttentionControlSubstitute(x[0], x[1]) + cacs = CrossAttentionControlSubstitute(x[0], x[1]) #print("made", cacs) - #return cacs + return cacs cross_attention_substitute.set_parse_action(make_cross_attention_substitute) # simple fragments of text prompt_part << (cross_attention_substitute - #| attention + | attention | word ) prompt_part.set_debug(False) diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index 0ab6911247..98219fb62e 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -16,10 +16,10 @@ class DDIMSampler(Sampler): def prepare_to_sample(self, t_enc, **kwargs): super().prepare_to_sample(t_enc, **kwargs) - structured_conditioning = kwargs.get('structured_conditioning', None) + extra_conditioning_info = kwargs.get('extra_conditioning_info', None) - if structured_conditioning is not None and structured_conditioning.wants_cross_attention_control: - self.invokeai_diffuser.setup_cross_attention_control(structured_conditioning) + if extra_conditioning_info is not None and extra_conditioning_info.wants_cross_attention_control: + self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info) else: self.invokeai_diffuser.remove_cross_attention_control() diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index a8291e32c1..8c858757eb 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -34,10 +34,10 @@ class CFGDenoiser(nn.Module): def prepare_to_sample(self, t_enc, **kwargs): - structured_conditioning = kwargs.get('structured_conditioning', None) + extra_conditioning_info = kwargs.get('extra_conditioning_info', None) - if structured_conditioning is not None and structured_conditioning.wants_cross_attention_control: - self.invokeai_diffuser.setup_cross_attention_control(structured_conditioning) + if extra_conditioning_info is not None and extra_conditioning_info.wants_cross_attention_control: + self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info) else: self.invokeai_diffuser.remove_cross_attention_control() @@ -164,7 +164,7 @@ class KSampler(Sampler): log_every_t=100, unconditional_guidance_scale=1.0, unconditional_conditioning=None, - structured_conditioning=None, + extra_conditioning_info=None, threshold = 0, perlin = 0, # this has to come in the same format as the conditioning, # e.g. as encoded tokens, ... @@ -197,7 +197,7 @@ class KSampler(Sampler): x = torch.randn([batch_size, *shape], device=self.device) * sigmas[0] model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10)) - model_wrap_cfg.prepare_to_sample(S, structured_conditioning=structured_conditioning) + model_wrap_cfg.prepare_to_sample(S, extra_conditioning_info=extra_conditioning_info) extra_args = { 'cond': conditioning, 'uncond': unconditional_conditioning, @@ -224,7 +224,7 @@ class KSampler(Sampler): index, unconditional_guidance_scale=1.0, unconditional_conditioning=None, - structured_conditioning=None, + extra_conditioning_info=None, **kwargs, ): if self.model_wrap is None: @@ -250,7 +250,7 @@ class KSampler(Sampler): # so the actual formula for indexing into sigmas: # sigma_index = (steps-index) s_index = t_enc - index - 1 - self.model_wrap.prepare_to_sample(s_index, structured_conditioning=structured_conditioning) + self.model_wrap.prepare_to_sample(s_index, extra_conditioning_info=extra_conditioning_info) img = K.sampling.__dict__[f'_{self.schedule}']( self.model_wrap, img, diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index 98975525ed..f58e2c3220 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -20,10 +20,10 @@ class PLMSSampler(Sampler): def prepare_to_sample(self, t_enc, **kwargs): super().prepare_to_sample(t_enc, **kwargs) - structured_conditioning = kwargs.get('structured_conditioning', None) + extra_conditioning_info = kwargs.get('extra_conditioning_info', None) - if structured_conditioning is not None and structured_conditioning.wants_cross_attention_control: - self.invokeai_diffuser.setup_cross_attention_control(structured_conditioning) + if extra_conditioning_info is not None and extra_conditioning_info.wants_cross_attention_control: + self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info) else: self.invokeai_diffuser.remove_cross_attention_control() diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 8f4ad26119..18878af443 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -439,6 +439,13 @@ class FrozenCLIPEmbedder(AbstractEncoder): param.requires_grad = False def forward(self, text, **kwargs): + + should_return_tokens = False + if 'return_tokens' in kwargs: + should_return_tokens = kwargs.get('return_tokens', False) + # self.transformer doesn't like having extra kwargs + kwargs.pop('return_tokens') + batch_encoding = self.tokenizer( text, truncation=True, @@ -451,7 +458,7 @@ class FrozenCLIPEmbedder(AbstractEncoder): tokens = batch_encoding['input_ids'].to(self.device) z = self.transformer(input_ids=tokens, **kwargs) - if kwargs.get('return_tokens', False): + if should_return_tokens: return z, tokens else: return z diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 2ef56c47ae..99f4db33a1 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -1,6 +1,7 @@ import unittest -from ldm.invoke.prompt_parser import PromptParser, Blend, Conjunction, FlattenedPrompt, CrossAttentionControlSubstitute +from ldm.invoke.prompt_parser import PromptParser, Blend, Conjunction, FlattenedPrompt, CrossAttentionControlSubstitute, \ + Fragment def parse_prompt(prompt_string): @@ -135,7 +136,7 @@ class PromptParserTestCase(unittest.TestCase): def test_cross_attention_control(self): fire_flames_to_trees = Conjunction([FlattenedPrompt([('fire', 1.0), \ - CrossAttentionControlSubstitute('flames', 'trees')])]) + CrossAttentionControlSubstitute([Fragment('flames', 1)], [Fragment('trees', 1)])])]) self.assertEqual(fire_flames_to_trees, parse_prompt('fire "flames".swap(trees)')) self.assertEqual(fire_flames_to_trees, parse_prompt('fire (flames).swap(trees)')) self.assertEqual(fire_flames_to_trees, parse_prompt('fire ("flames").swap(trees)')) @@ -144,13 +145,13 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(fire_flames_to_trees, parse_prompt('fire ("flames").swap("trees")')) fire_flames_to_trees_and_houses = Conjunction([FlattenedPrompt([('fire', 1.0), \ - CrossAttentionControlSubstitute('flames', 'trees and houses')])]) + CrossAttentionControlSubstitute([Fragment('flames', 1)], [Fragment('trees and houses', 1)])])]) self.assertEqual(fire_flames_to_trees_and_houses, parse_prompt('fire ("flames").swap("trees and houses")')) self.assertEqual(fire_flames_to_trees_and_houses, parse_prompt('fire (flames).swap("trees and houses")')) self.assertEqual(fire_flames_to_trees_and_houses, parse_prompt('fire "flames".swap("trees and houses")')) trees_and_houses_to_flames = Conjunction([FlattenedPrompt([('fire', 1.0), \ - CrossAttentionControlSubstitute('trees and houses', 'flames')])]) + CrossAttentionControlSubstitute([Fragment('trees and houses', 1)], [Fragment('flames',1)])])]) self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire ("trees and houses").swap("flames")')) self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire (trees and houses).swap("flames")')) self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire "trees and houses".swap("flames")')) @@ -159,14 +160,46 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire "trees and houses".swap(flames)')) flames_to_trees_fire = Conjunction([FlattenedPrompt([ - CrossAttentionControlSubstitute('flames', 'trees'), + CrossAttentionControlSubstitute([Fragment('flames',1)], [Fragment('trees',1)]), (', fire', 1.0)])]) - self.assertEqual(flames_to_trees_fire, parse_prompt('"flames".swap(trees), fire')) - self.assertEqual(flames_to_trees_fire, parse_prompt('(flames).swap(trees), fire ')) - self.assertEqual(flames_to_trees_fire, parse_prompt('("flames").swap(trees), fire ')) self.assertEqual(flames_to_trees_fire, parse_prompt('"flames".swap("trees"), fire')) self.assertEqual(flames_to_trees_fire, parse_prompt('(flames).swap("trees"), fire')) self.assertEqual(flames_to_trees_fire, parse_prompt('("flames").swap("trees"), fire')) + self.assertEqual(flames_to_trees_fire, parse_prompt('"flames".swap(trees), fire')) + self.assertEqual(flames_to_trees_fire, parse_prompt('(flames).swap(trees), fire ')) + self.assertEqual(flames_to_trees_fire, parse_prompt('("flames").swap(trees), fire ')) + + + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), + CrossAttentionControlSubstitute([Fragment('',1)], [Fragment('in winter',1)])])]), + parse_prompt('a forest landscape "".swap("in winter")')) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), + CrossAttentionControlSubstitute([Fragment(' ',1)], [Fragment('in winter',1)])])]), + parse_prompt('a forest landscape " ".swap("in winter")')) + + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), + CrossAttentionControlSubstitute([Fragment('in winter',1)], [Fragment('',1)])])]), + parse_prompt('a forest landscape "in winter".swap("")')) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), + CrossAttentionControlSubstitute([Fragment('in winter',1)], [Fragment('',1)])])]), + parse_prompt('a forest landscape "in winter".swap()')) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), + CrossAttentionControlSubstitute([Fragment('in winter',1)], [Fragment(' ',1)])])]), + parse_prompt('a forest landscape "in winter".swap(" ")')) + + def test_cross_attention_control_with_attention(self): + flames_to_trees_fire = Conjunction([FlattenedPrompt([ + CrossAttentionControlSubstitute([Fragment('flames',0.5)], [Fragment('trees',0.7)]), + Fragment(',', 1), Fragment('fire', 2.0)])]) + self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(flames)".swap("0.7(trees)"), 2.0(fire)')) + flames_to_trees_fire = Conjunction([FlattenedPrompt([ + CrossAttentionControlSubstitute([Fragment('fire',0.5), Fragment('flames',0.25)], [Fragment('trees',0.7)]), + Fragment(',', 1), Fragment('fire', 2.0)])]) + self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(fire 0.5(flames))".swap("0.7(trees)"), 2.0(fire)')) + flames_to_trees_fire = Conjunction([FlattenedPrompt([ + CrossAttentionControlSubstitute([Fragment('fire',0.5), Fragment('flames',0.25)], [Fragment('trees',0.7), Fragment('houses', 1)]), + Fragment(',', 1), Fragment('fire', 2.0)])]) + self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(fire 0.5(flames))".swap("0.7(trees) houses"), 2.0(fire)')) if __name__ == '__main__': From da223dfe819efe96b3be99c158c08c96c619337a Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 20 Oct 2022 15:56:46 +0200 Subject: [PATCH 023/124] wip re-writing parts of prompt parser --- ldm/invoke/prompt_parser.py | 80 +++++++++++++++++++++++-------------- tests/test_prompt_parser.py | 3 ++ 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index c13175a488..abd9ce726c 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -1,3 +1,5 @@ +import string + import pyparsing import pyparsing as pp from pyparsing import original_text_for @@ -200,8 +202,8 @@ class PromptParser(): elif type(node) is Fragment: results += [Fragment(node.text, node.weight*weight_scale)] elif type(node) is CrossAttentionControlSubstitute: - original = flatten_internal(node.original, weight_scale, [], ' CAo ') - edited = flatten_internal(node.edited, weight_scale, [], ' CAe ') + original = flatten_internal(node.original, weight_scale, [], prefix + ' CAo ') + edited = flatten_internal(node.edited, weight_scale, [], prefix + ' CAe ') results += [CrossAttentionControlSubstitute(original, edited)] elif type(node) is Blend: flattened_subprompts = [] @@ -236,24 +238,46 @@ class PromptParser(): lparen = pp.Literal("(").suppress() rparen = pp.Literal(")").suppress() + quotes = pp.Literal('"').suppress() + # accepts int or float notation, always maps to float number = pyparsing.pyparsing_common.real | pp.Word(pp.nums).set_parse_action(pp.token_map(float)) - SPACE_CHARS = ' \t\n' - - prompt_part = pp.Forward() - word = pp.Word(pp.printables).set_parse_action(lambda x: Fragment(' '.join([s for s in x]))) - word.set_name("word") - word.set_debug(False) + SPACE_CHARS = string.whitespace def make_fragment(x): #print("### making fragment for", x) if type(x) is str: return Fragment(x) elif type(x) is pp.ParseResults or type(x) is list: + #print(f'converting {x} to Fragment') return Fragment(' '.join([s for s in x])) else: raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) + def parse_fragment_str(x): + return make_fragment(x) + + quoted_fragment = pp.QuotedString(quote_char='"', esc_char='\\') + quoted_fragment.set_parse_action(parse_fragment_str).set_name('quoted_fragment') + + unquoted_fragment = pp.Combine(pp.OneOrMore( + pp.Literal('\\"').set_debug(False) | + pp.Literal('\\').set_debug(False) | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"') + )) + unquoted_fragment.set_parse_action(parse_fragment_str).set_name('unquoted_fragment') + + parenthesized_fragment = \ + (lparen + quoted_fragment.set_debug(True) + rparen).set_name('quoted_paren_internal') | \ + (lparen + rparen).set_parse_action(lambda x: make_fragment('')) | \ + (lparen + pp.Combine(pp.OneOrMore( + pp.Literal('\\)').set_debug(False) | + pp.Literal('\\').set_debug(False) | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\)') | + pp.Word(string.whitespace) + )) + rparen).set_parse_action(parse_fragment_str).set_name('unquoted_paren_internal').set_debug(True) + parenthesized_fragment.set_name('parenthesized_fragment').set_debug(True) + # attention control of the form +(phrase) / -(phrase) / (phrase) # phrase can be multiple words, can have multiple +/- signs to increase the effect or type a floating point or integer weight attention = pp.Forward() @@ -303,41 +327,35 @@ class PromptParser(): pp.Literal('""').suppress() | (lparen + pp.Literal('""').suppress() + rparen) ).set_parse_action(lambda x: Fragment("")) + empty_string.set_name('empty_string') - original_words = ( - (lparen + pp.Literal('"').suppress() + (pp.OneOrMore(attention) | pp.CharsNotIn('"').set_parse_action(make_fragment)) + pp.Literal('"').suppress() + rparen).set_name('term1').set_debug(False) | - (pp.Literal('"').suppress() + (pp.OneOrMore(attention) | pp.CharsNotIn('"').set_parse_action(make_fragment)) + pp.Literal('"').suppress()).set_name('term2').set_debug(False) | - (lparen + (pp.OneOrMore(attention) | pp.CharsNotIn(')').set_parse_action(make_fragment)) + rparen).set_name('term3').set_debug(False) - ).set_name('original_words') - edited_words = ( - (pp.Literal('"').suppress() + (pp.OneOrMore(attention) | pp.CharsNotIn('"').set_parse_action(make_fragment)) + pp.Literal('"').suppress()).set_name('termA').set_debug(False) | - pp.Literal('""').suppress().set_parse_action(lambda x: Fragment("")) | - (pp.OneOrMore(attention) | pp.CharsNotIn(')').set_parse_action(make_fragment)).set_name('termB').set_debug(True) - ).set_name('edited_words') - cross_attention_substitute = (empty_string | original_words) + \ - pp.Literal(".swap").suppress() + \ - (empty_string | (lparen + edited_words + rparen) - ) - cross_attention_substitute.set_name('cross_attention_substitute') + original_fragment = empty_string | quoted_fragment | parenthesized_fragment | unquoted_fragment + edited_fragment = parenthesized_fragment + cross_attention_substitute = original_fragment + pp.Literal(".swap").suppress() + edited_fragment + + cross_attention_substitute.set_name('cross_attention_substitute').set_debug(True) def make_cross_attention_substitute(x): - #print("making cacs for", x) + print("making cacs for", x) cacs = CrossAttentionControlSubstitute(x[0], x[1]) - #print("made", cacs) + print("made", cacs) return cacs - cross_attention_substitute.set_parse_action(make_cross_attention_substitute) # simple fragments of text - prompt_part << (cross_attention_substitute - | attention - | word - ) + prompt_part = ( + cross_attention_substitute + | attention + | quoted_fragment + | unquoted_fragment + ) prompt_part.set_debug(False) prompt_part.set_name("prompt_part") + empty = ((lparen + rparen) | (quotes + quotes)).suppress() + # root prompt definition - prompt = pp.Group(pp.OneOrMore(prompt_part))\ + prompt = (pp.Group(pp.OneOrMore(prompt_part) | empty) + pp.StringEnd()) \ .set_parse_action(lambda x: Prompt(x[0])) # weighted blend of prompts diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 99f4db33a1..0aa0cfd6ae 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -201,6 +201,9 @@ class PromptParserTestCase(unittest.TestCase): Fragment(',', 1), Fragment('fire', 2.0)])]) self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(fire 0.5(flames))".swap("0.7(trees) houses"), 2.0(fire)')) + def test_single(self): + print(parse_prompt('fire (trees and houses).swap("flames")')) + if __name__ == '__main__': unittest.main() From 79b4afeae7f0e2e4f922de26e6d9a458fea5c46b Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 20 Oct 2022 16:56:34 +0200 Subject: [PATCH 024/124] parser working with basic escapes --- ldm/invoke/prompt_parser.py | 48 +++++++++++++++++++++++++------------ tests/test_prompt_parser.py | 21 ++++++++++++---- 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index abd9ce726c..398a596c7e 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -169,12 +169,16 @@ class PromptParser(): def flatten(self, root: Conjunction): + print("flattening", root) + def fuse_fragments(items): # print("fusing fragments in ", items) result = [] for x in items: - if issubclass(type(x), CrossAttentionControlledFragment): - result.append(x) + if type(x) is CrossAttentionControlSubstitute: + original_fused = fuse_fragments(x.original) + edited_fused = fuse_fragments(x.edited) + result.append(CrossAttentionControlSubstitute(original_fused, edited_fused)) else: last_weight = result[-1].weight \ if (len(result) > 0 and not issubclass(type(result[-1]), CrossAttentionControlledFragment)) \ @@ -221,10 +225,9 @@ class PromptParser(): #print(prefix + "after flattening Prompt, results is", results) else: raise PromptParser.ParsingException(f"unhandled node type {type(node)} when flattening {node}") - print(prefix + "-> after flattening", type(node), "results is", results) + print(prefix + "-> after flattening", type(node).__name__, "results is", results) return results - #print("flattening", root) flattened_parts = [] for part in root.prompts: @@ -244,6 +247,8 @@ class PromptParser(): number = pyparsing.pyparsing_common.real | pp.Word(pp.nums).set_parse_action(pp.token_map(float)) SPACE_CHARS = string.whitespace + attention = pp.Forward() + def make_fragment(x): #print("### making fragment for", x) if type(x) is str: @@ -254,33 +259,44 @@ class PromptParser(): else: raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) + unquoted_fragment = pp.Forward() + quoted_fragment = pp.Forward() + parenthesized_fragment = pp.Forward() + def parse_fragment_str(x): - return make_fragment(x) + print("parsing", x) + if len(x[0].strip()) == 0: + return Fragment('') + fragment_parser = pp.Group(pp.OneOrMore(attention | pp.Word(pp.printables, exclude_chars=string.whitespace).set_parse_action(make_fragment))) + fragment_parser.set_name('word_or_attention') + result = fragment_parser.parse_string(x[0]) + #result = (pp.OneOrMore(attention | unquoted_fragment) + pp.StringEnd()).parse_string(x[0]) + print("parsed to", result) + return result - quoted_fragment = pp.QuotedString(quote_char='"', esc_char='\\') - quoted_fragment.set_parse_action(parse_fragment_str).set_name('quoted_fragment') + quoted_fragment << pp.QuotedString(quote_char='"', esc_char='\\') + quoted_fragment.set_parse_action(make_fragment).set_name('quoted_fragment') - unquoted_fragment = pp.Combine(pp.OneOrMore( + unquoted_fragment << pp.Combine(pp.OneOrMore( pp.Literal('\\"').set_debug(False) | pp.Literal('\\').set_debug(False) | pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"') )) - unquoted_fragment.set_parse_action(parse_fragment_str).set_name('unquoted_fragment') + unquoted_fragment.set_parse_action(make_fragment).set_name('unquoted_fragment') - parenthesized_fragment = \ - (lparen + quoted_fragment.set_debug(True) + rparen).set_name('quoted_paren_internal') | \ - (lparen + rparen).set_parse_action(lambda x: make_fragment('')) | \ + parenthesized_fragment << pp.Or([ + (lparen + quoted_fragment.set_parse_action(parse_fragment_str).set_debug(True) + rparen).set_name('-quoted_paren_internal').set_debug(True), + (lparen + rparen).set_parse_action(lambda x: make_fragment('')).set_name('-()').set_debug(True), (lparen + pp.Combine(pp.OneOrMore( pp.Literal('\\)').set_debug(False) | pp.Literal('\\').set_debug(False) | pp.Word(pp.printables, exclude_chars=string.whitespace + '\\)') | pp.Word(string.whitespace) - )) + rparen).set_parse_action(parse_fragment_str).set_name('unquoted_paren_internal').set_debug(True) + )).set_name('--combined').set_parse_action(parse_fragment_str).set_debug(True) + rparen)]).set_name('-unquoted_paren_internal').set_debug(True) parenthesized_fragment.set_name('parenthesized_fragment').set_debug(True) # attention control of the form +(phrase) / -(phrase) / (phrase) # phrase can be multiple words, can have multiple +/- signs to increase the effect or type a floating point or integer weight - attention = pp.Forward() attention_head = (number | pp.Word('+') | pp.Word('-'))\ .set_name("attention_head")\ .set_debug(False) @@ -352,7 +368,9 @@ class PromptParser(): prompt_part.set_debug(False) prompt_part.set_name("prompt_part") - empty = ((lparen + rparen) | (quotes + quotes)).suppress() + empty = ( + (lparen + pp.ZeroOrMore(pp.Word(string.whitespace)) + rparen) | + (quotes + pp.ZeroOrMore(pp.Word(string.whitespace)) + quotes)).set_debug(False).set_name('empty') # root prompt definition prompt = (pp.Group(pp.OneOrMore(prompt_part) | empty) + pp.StringEnd()) \ diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 0aa0cfd6ae..38a24ca529 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -174,7 +174,7 @@ class PromptParserTestCase(unittest.TestCase): CrossAttentionControlSubstitute([Fragment('',1)], [Fragment('in winter',1)])])]), parse_prompt('a forest landscape "".swap("in winter")')) self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), - CrossAttentionControlSubstitute([Fragment(' ',1)], [Fragment('in winter',1)])])]), + CrossAttentionControlSubstitute([Fragment('',1)], [Fragment('in winter',1)])])]), parse_prompt('a forest landscape " ".swap("in winter")')) self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), @@ -184,7 +184,7 @@ class PromptParserTestCase(unittest.TestCase): CrossAttentionControlSubstitute([Fragment('in winter',1)], [Fragment('',1)])])]), parse_prompt('a forest landscape "in winter".swap()')) self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), - CrossAttentionControlSubstitute([Fragment('in winter',1)], [Fragment(' ',1)])])]), + CrossAttentionControlSubstitute([Fragment('in winter',1)], [Fragment('',1)])])]), parse_prompt('a forest landscape "in winter".swap(" ")')) def test_cross_attention_control_with_attention(self): @@ -201,8 +201,21 @@ class PromptParserTestCase(unittest.TestCase): Fragment(',', 1), Fragment('fire', 2.0)])]) self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(fire 0.5(flames))".swap("0.7(trees) houses"), 2.0(fire)')) - def test_single(self): - print(parse_prompt('fire (trees and houses).swap("flames")')) + + def make_basic_conjunction(self, strings: list[str]): + fragments = [Fragment(x) for x in strings] + return Conjunction([FlattenedPrompt(fragments)]) + + def make_weighted_conjunction(self, weighted_strings: list[tuple[str,float]]): + fragments = [Fragment(x, w) for x,w in weighted_strings] + return Conjunction([FlattenedPrompt(fragments)]) + + + def test_escaping(self): + self.assertEqual(self.make_basic_conjunction(['mountain \(man\)']),parse_prompt('mountain \(man\)')) + self.assertEqual(self.make_basic_conjunction(['mountain (\(man)\)']),parse_prompt('mountain (\(man)\)')) + self.assertEqual(self.make_basic_conjunction(['mountain (\(man\))']),parse_prompt('mountain (\(man\))')) + #self.assertEqual(self.make_weighted_conjunction([('mountain', 1), ('\(man\)', 1.1)]),parse_prompt('mountain +(\(man\))')) if __name__ == '__main__': From 3f13dd3ae8bbdf06067adf891e5caa925fde394a Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 20 Oct 2022 21:05:36 +0200 Subject: [PATCH 025/124] prompt parsing is now much more robust --- ldm/invoke/prompt_parser.py | 151 ++++++++++++++++++------------- tests/test_prompt_parser.py | 173 +++++++++++++++++++++++++++--------- 2 files changed, 220 insertions(+), 104 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 398a596c7e..d576d069aa 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -9,8 +9,8 @@ class Prompt(): def __init__(self, parts: list): for c in parts: - if type(c) is not Attention and not issubclass(type(c), BaseFragment): - raise PromptParser.ParsingException(f"Prompt cannot contain {type(c)}, only {BaseFragment.__subclasses__()} are allowed") + if type(c) is not Attention and not issubclass(type(c), BaseFragment) and type(c) is not pp.ParseResults: + raise PromptParser.ParsingException(f"Prompt cannot contain {type(c).__name__} {c}, only {BaseFragment.__subclasses__()} are allowed") self.children = parts def __repr__(self): return f"Prompt:{self.children}" @@ -48,6 +48,9 @@ class BaseFragment: class Fragment(BaseFragment): def __init__(self, text: str, weight: float=1): assert(type(text) is str) + if '\\"' in text or '\\(' in text or '\\)' in text: + #print("Fragment converting escaped \( \) \\\" into ( ) \"") + text = text.replace('\\(', '(').replace('\\)', ')').replace('\\"', '"') self.text = text self.weight = float(weight) @@ -152,8 +155,10 @@ class PromptParser(): def parse(self, prompt: str) -> Conjunction: ''' + This parser is *very* forgiving. If it cannot parse syntax, it will return strings as-is to be passed on to the + diffusion. :param prompt: The prompt string to parse - :return: a tuple + :return: a Conjunction representing the parsed results. ''' #print(f"!!parsing '{prompt}'") @@ -169,7 +174,7 @@ class PromptParser(): def flatten(self, root: Conjunction): - print("flattening", root) + #print("flattening", root) def fuse_fragments(items): # print("fusing fragments in ", items) @@ -196,13 +201,13 @@ class PromptParser(): #print(prefix + "flattening", node, "...") if type(node) is pp.ParseResults: for x in node: - results = flatten_internal(x, weight_scale, results, prefix+'pr') + results = flatten_internal(x, weight_scale, results, prefix+' pr ') #print(prefix, " ParseResults expanded, results is now", results) elif type(node) is Attention: # if node.weight < 1: # todo: inject a blend when flattening attention with weight <1" - for c in node.children: - results = flatten_internal(c, weight_scale * node.weight, results, prefix + ' ') + for index,c in enumerate(node.children): + results = flatten_internal(c, weight_scale * node.weight, results, prefix + f" att{index} ") elif type(node) is Fragment: results += [Fragment(node.text, node.weight*weight_scale)] elif type(node) is CrossAttentionControlSubstitute: @@ -225,7 +230,7 @@ class PromptParser(): #print(prefix + "after flattening Prompt, results is", results) else: raise PromptParser.ParsingException(f"unhandled node type {type(node)} when flattening {node}") - print(prefix + "-> after flattening", type(node).__name__, "results is", results) + #print(prefix + "-> after flattening", type(node).__name__, "results is", results) return results @@ -246,6 +251,7 @@ class PromptParser(): # accepts int or float notation, always maps to float number = pyparsing.pyparsing_common.real | pp.Word(pp.nums).set_parse_action(pp.token_map(float)) SPACE_CHARS = string.whitespace + greedy_word = pp.Word(pp.printables, exclude_chars=string.whitespace).set_name('greedy_word') attention = pp.Forward() @@ -254,7 +260,7 @@ class PromptParser(): if type(x) is str: return Fragment(x) elif type(x) is pp.ParseResults or type(x) is list: - #print(f'converting {x} to Fragment') + #print(f'converting {type(x).__name__} to Fragment') return Fragment(' '.join([s for s in x])) else: raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) @@ -264,52 +270,72 @@ class PromptParser(): parenthesized_fragment = pp.Forward() def parse_fragment_str(x): - print("parsing", x) + #print("parsing fragment string", x) if len(x[0].strip()) == 0: return Fragment('') - fragment_parser = pp.Group(pp.OneOrMore(attention | pp.Word(pp.printables, exclude_chars=string.whitespace).set_parse_action(make_fragment))) + fragment_parser = pp.Group(pp.OneOrMore(attention | (greedy_word.set_parse_action(make_fragment)))) fragment_parser.set_name('word_or_attention') result = fragment_parser.parse_string(x[0]) #result = (pp.OneOrMore(attention | unquoted_fragment) + pp.StringEnd()).parse_string(x[0]) - print("parsed to", result) + #print("parsed to", result) return result quoted_fragment << pp.QuotedString(quote_char='"', esc_char='\\') - quoted_fragment.set_parse_action(make_fragment).set_name('quoted_fragment') + quoted_fragment.set_parse_action(parse_fragment_str).set_name('quoted_fragment') + + self_unescaping_escaped_quote = pp.Literal('\\"').set_parse_action(lambda x: '"') + self_unescaping_escaped_lparen = pp.Literal('\\(').set_parse_action(lambda x: '(') + self_unescaping_escaped_rparen = pp.Literal('\\)').set_parse_action(lambda x: ')') unquoted_fragment << pp.Combine(pp.OneOrMore( - pp.Literal('\\"').set_debug(False) | - pp.Literal('\\').set_debug(False) | - pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"') + self_unescaping_escaped_rparen | self_unescaping_escaped_lparen | self_unescaping_escaped_quote | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()') )) unquoted_fragment.set_parse_action(make_fragment).set_name('unquoted_fragment') - parenthesized_fragment << pp.Or([ - (lparen + quoted_fragment.set_parse_action(parse_fragment_str).set_debug(True) + rparen).set_name('-quoted_paren_internal').set_debug(True), - (lparen + rparen).set_parse_action(lambda x: make_fragment('')).set_name('-()').set_debug(True), + parenthesized_fragment << pp.MatchFirst([ + (lparen + quoted_fragment.copy().set_parse_action(parse_fragment_str).set_debug(False) + rparen).set_name('-quoted_paren_internal').set_debug(False), + (lparen + rparen).set_parse_action(lambda x: make_fragment('')).set_name('-()').set_debug(False), (lparen + pp.Combine(pp.OneOrMore( - pp.Literal('\\)').set_debug(False) | - pp.Literal('\\').set_debug(False) | - pp.Word(pp.printables, exclude_chars=string.whitespace + '\\)') | + pp.Literal('\\"').set_debug(False).set_parse_action(lambda x: '"') | + pp.Literal('\\(').set_debug(False).set_parse_action(lambda x: '(') | + pp.Literal('\\)').set_debug(False).set_parse_action(lambda x: ')') | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()') | pp.Word(string.whitespace) - )).set_name('--combined').set_parse_action(parse_fragment_str).set_debug(True) + rparen)]).set_name('-unquoted_paren_internal').set_debug(True) - parenthesized_fragment.set_name('parenthesized_fragment').set_debug(True) + )).set_name('--combined').set_parse_action(parse_fragment_str).set_debug(False) + rparen)]).set_name('-unquoted_paren_internal').set_debug(False) + parenthesized_fragment.set_name('parenthesized_fragment').set_debug(False) + debug_attention = False # attention control of the form +(phrase) / -(phrase) / (phrase) # phrase can be multiple words, can have multiple +/- signs to increase the effect or type a floating point or integer weight attention_head = (number | pp.Word('+') | pp.Word('-'))\ .set_name("attention_head")\ .set_debug(False) - fragment_inside_attention = pp.CharsNotIn(SPACE_CHARS+'()')\ - .set_parse_action(make_fragment)\ - .set_name("fragment_inside_attention")\ - .set_debug(False) + word_inside_attention = pp.Combine(pp.OneOrMore( + pp.Literal('\\)') | pp.Literal('\\(') | pp.Literal('\\"') | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\()"') + )).set_name('word_inside_attention') attention_with_parens = pp.Forward() - attention_with_parens_body = pp.nested_expr(content=pp.delimited_list((attention_with_parens | fragment_inside_attention), delim=SPACE_CHARS)) + attention_with_parens_delimited_list = pp.delimited_list(pp.Or([ + quoted_fragment.copy().set_debug(debug_attention), + attention.copy().set_debug(debug_attention), + word_inside_attention.set_debug(debug_attention)]).set_name('delim_inner').set_debug(debug_attention), + delim=string.whitespace) + # have to disable ignore_expr here to prevent pyparsing from stripping off quote marks + attention_with_parens_body = pp.nested_expr(content=attention_with_parens_delimited_list, + ignore_expr=None#((pp.Literal("\\(") | pp.Literal('\\)'))) + ) + attention_with_parens_body.set_debug(debug_attention) attention_with_parens << (attention_head + attention_with_parens_body) + attention_with_parens.set_name('attention_with_parens').set_debug(debug_attention) + + attention_without_parens = (pp.Word('+') | pp.Word('-')) + (quoted_fragment | word_inside_attention) + attention_without_parens.set_name('attention_without_parens').set_debug(debug_attention) + + attention << (attention_with_parens | attention_without_parens) def make_attention(x): - # print("making Attention from parsing with args", x0, x1) + #print("making Attention from", x) weight = 1 # number(str) if type(x[0]) is float or type(x[0]) is int: @@ -318,26 +344,17 @@ class PromptParser(): elif type(x[0]) is str: base = self.attention_plus_base if x[0][0] == '+' else self.attention_minus_base weight = pow(base, len(x[0])) - # print("Making attention with children of type", [str(type(x)) for x in x1]) - return Attention(weight=weight, children=x[1]) + if type(x[1]) is list or type(x[1]) is pp.ParseResults: + return Attention(weight=weight, children=[(Fragment(x) if type(x) is str else x) for x in x[1]]) + elif type(x[1]) is str: + return Attention(weight=weight, children=[Fragment(x[1])]) + elif type(x[1]) is Fragment: + return Attention(weight=weight, children=[x[1]]) + raise PromptParser.ParsingException(f"Don't know how to make attention with children {x[1]}") - attention_with_parens.set_parse_action(make_attention)\ - .set_name("attention_with_parens")\ - .set_debug(False) - - # attention control of the form ++word --word (no parens) - attention_without_parens = ( - (pp.Word('+') | pp.Word('-')) + - pp.CharsNotIn(SPACE_CHARS+'()').set_parse_action(lambda x: [[make_fragment(x)]]) - )\ - .set_name("attention_without_parens")\ - .set_debug(False) + attention_with_parens.set_parse_action(make_attention) attention_without_parens.set_parse_action(make_attention) - attention << (attention_with_parens | attention_without_parens)\ - .set_name("attention")\ - .set_debug(False) - # cross-attention control empty_string = ((lparen + rparen) | pp.Literal('""').suppress() | @@ -345,26 +362,38 @@ class PromptParser(): ).set_parse_action(lambda x: Fragment("")) empty_string.set_name('empty_string') - original_fragment = empty_string | quoted_fragment | parenthesized_fragment | unquoted_fragment + + # cross attention control + debug_cross_attention_control = False + original_fragment = pp.Or([empty_string.set_debug(debug_cross_attention_control), + quoted_fragment.set_debug(debug_cross_attention_control), + parenthesized_fragment.set_debug(debug_cross_attention_control), + unquoted_fragment.set_debug(debug_cross_attention_control)]) edited_fragment = parenthesized_fragment cross_attention_substitute = original_fragment + pp.Literal(".swap").suppress() + edited_fragment - cross_attention_substitute.set_name('cross_attention_substitute').set_debug(True) + original_fragment.set_name('original_fragment').set_debug(debug_cross_attention_control) + edited_fragment.set_name('edited_fragment').set_debug(debug_cross_attention_control) + cross_attention_substitute.set_name('cross_attention_substitute').set_debug(debug_cross_attention_control) def make_cross_attention_substitute(x): - print("making cacs for", x) + #print("making cacs for", x) cacs = CrossAttentionControlSubstitute(x[0], x[1]) - print("made", cacs) + #print("made", cacs) return cacs cross_attention_substitute.set_parse_action(make_cross_attention_substitute) + + # simple fragments of text - prompt_part = ( - cross_attention_substitute - | attention - | quoted_fragment - | unquoted_fragment - ) + # use Or to match the longest + prompt_part = pp.Or([ + cross_attention_substitute, + attention, + quoted_fragment, + unquoted_fragment, + lparen + unquoted_fragment + rparen # matches case where user has +(term) and just deletes the + + ]) prompt_part.set_debug(False) prompt_part.set_name("prompt_part") @@ -373,8 +402,10 @@ class PromptParser(): (quotes + pp.ZeroOrMore(pp.Word(string.whitespace)) + quotes)).set_debug(False).set_name('empty') # root prompt definition - prompt = (pp.Group(pp.OneOrMore(prompt_part) | empty) + pp.StringEnd()) \ - .set_parse_action(lambda x: Prompt(x[0])) + prompt = ((pp.OneOrMore(prompt_part) | empty) + pp.StringEnd()) \ + .set_parse_action(lambda x: Prompt(x)) + + # weighted blend of prompts # ("promptA", "promptB").blend(a, b) where "promptA" and "promptB" are valid prompts and a and b are float or @@ -418,7 +449,7 @@ class PromptParser(): return Conjunction(parts, weights) conjunction_with_parens_and_quotes.set_parse_action(make_conjunction) - implicit_conjunction = pp.OneOrMore(blend | prompt) + implicit_conjunction = pp.OneOrMore(blend | prompt).set_name('implicit_conjunction') implicit_conjunction.set_parse_action(lambda x: Conjunction(x)) conjunction = conjunction_with_parens_and_quotes | implicit_conjunction diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 38a24ca529..d053253eb6 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -1,5 +1,7 @@ import unittest +import pyparsing + from ldm.invoke.prompt_parser import PromptParser, Blend, Conjunction, FlattenedPrompt, CrossAttentionControlSubstitute, \ Fragment @@ -11,39 +13,48 @@ def parse_prompt(prompt_string): #print(f"-> parsed '{prompt_string}' to {parse_result}") return parse_result +def make_basic_conjunction(strings: list[str]): + fragments = [Fragment(x) for x in strings] + return Conjunction([FlattenedPrompt(fragments)]) + +def make_weighted_conjunction(weighted_strings: list[tuple[str,float]]): + fragments = [Fragment(x, w) for x,w in weighted_strings] + return Conjunction([FlattenedPrompt(fragments)]) + + class PromptParserTestCase(unittest.TestCase): def test_empty(self): - self.assertEqual(Conjunction([FlattenedPrompt([('', 1)])]), parse_prompt('')) + self.assertEqual(make_weighted_conjunction([('', 1)]), parse_prompt('')) def test_basic(self): - self.assertEqual(Conjunction([FlattenedPrompt([('fire (flames)', 1)])]), parse_prompt("fire (flames)")) - self.assertEqual(Conjunction([FlattenedPrompt([("fire flames", 1)])]), parse_prompt("fire flames")) - self.assertEqual(Conjunction([FlattenedPrompt([("fire, flames", 1)])]), parse_prompt("fire, flames")) - self.assertEqual(Conjunction([FlattenedPrompt([("fire, flames , fire", 1)])]), parse_prompt("fire, flames , fire")) + self.assertEqual(make_weighted_conjunction([('fire flames', 1)]), parse_prompt("fire (flames)")) + self.assertEqual(make_weighted_conjunction([("fire flames", 1)]), parse_prompt("fire flames")) + self.assertEqual(make_weighted_conjunction([("fire, flames", 1)]), parse_prompt("fire, flames")) + self.assertEqual(make_weighted_conjunction([("fire, flames , fire", 1)]), parse_prompt("fire, flames , fire")) def test_attention(self): - self.assertEqual(Conjunction([FlattenedPrompt([('flames', 0.5)])]), parse_prompt("0.5(flames)")) - self.assertEqual(Conjunction([FlattenedPrompt([('fire flames', 0.5)])]), parse_prompt("0.5(fire flames)")) - self.assertEqual(Conjunction([FlattenedPrompt([('flames', 1.1)])]), parse_prompt("+(flames)")) - self.assertEqual(Conjunction([FlattenedPrompt([('flames', 0.9)])]), parse_prompt("-(flames)")) - self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1), ('flames', 0.5)])]), parse_prompt("fire 0.5(flames)")) - self.assertEqual(Conjunction([FlattenedPrompt([('flames', pow(1.1, 2))])]), parse_prompt("++(flames)")) - self.assertEqual(Conjunction([FlattenedPrompt([('flames', pow(0.9, 2))])]), parse_prompt("--(flames)")) - self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))])]), parse_prompt("---(flowers) +++flames")) - self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))])]), parse_prompt("---(flowers) +++flames")) - self.assertEqual(Conjunction([FlattenedPrompt([('flowers', pow(0.9, 3)), ('flames+', pow(1.1, 3))])]), + self.assertEqual(make_weighted_conjunction([('flames', 0.5)]), parse_prompt("0.5(flames)")) + self.assertEqual(make_weighted_conjunction([('fire flames', 0.5)]), parse_prompt("0.5(fire flames)")) + self.assertEqual(make_weighted_conjunction([('flames', 1.1)]), parse_prompt("+(flames)")) + self.assertEqual(make_weighted_conjunction([('flames', 0.9)]), parse_prompt("-(flames)")) + self.assertEqual(make_weighted_conjunction([('fire', 1), ('flames', 0.5)]), parse_prompt("fire 0.5(flames)")) + self.assertEqual(make_weighted_conjunction([('flames', pow(1.1, 2))]), parse_prompt("++(flames)")) + self.assertEqual(make_weighted_conjunction([('flames', pow(0.9, 2))]), parse_prompt("--(flames)")) + self.assertEqual(make_weighted_conjunction([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))]), parse_prompt("---(flowers) +++flames")) + self.assertEqual(make_weighted_conjunction([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))]), parse_prompt("---(flowers) +++flames")) + self.assertEqual(make_weighted_conjunction([('flowers', pow(0.9, 3)), ('flames+', pow(1.1, 3))]), parse_prompt("---(flowers) +++flames+")) - self.assertEqual(Conjunction([FlattenedPrompt([('pretty flowers', 1.1)])]), + self.assertEqual(make_weighted_conjunction([('pretty flowers', 1.1)]), parse_prompt("+(pretty flowers)")) - self.assertEqual(Conjunction([FlattenedPrompt([('pretty flowers', 1.1), (', the flames are too hot', 1)])]), + self.assertEqual(make_weighted_conjunction([('pretty flowers', 1.1), (', the flames are too hot', 1)]), parse_prompt("+(pretty flowers), the flames are too hot")) def test_no_parens_attention_runon(self): - self.assertEqual(Conjunction([FlattenedPrompt([('fire', pow(1.1, 2)), ('flames', 1.0)])]), parse_prompt("++fire flames")) - self.assertEqual(Conjunction([FlattenedPrompt([('fire', pow(0.9, 2)), ('flames', 1.0)])]), parse_prompt("--fire flames")) - self.assertEqual(Conjunction([FlattenedPrompt([('flowers', 1.0), ('fire', pow(1.1, 2)), ('flames', 1.0)])]), parse_prompt("flowers ++fire flames")) - self.assertEqual(Conjunction([FlattenedPrompt([('flowers', 1.0), ('fire', pow(0.9, 2)), ('flames', 1.0)])]), parse_prompt("flowers --fire flames")) + self.assertEqual(make_weighted_conjunction([('fire', pow(1.1, 2)), ('flames', 1.0)]), parse_prompt("++fire flames")) + self.assertEqual(make_weighted_conjunction([('fire', pow(0.9, 2)), ('flames', 1.0)]), parse_prompt("--fire flames")) + self.assertEqual(make_weighted_conjunction([('flowers', 1.0), ('fire', pow(1.1, 2)), ('flames', 1.0)]), parse_prompt("flowers ++fire flames")) + self.assertEqual(make_weighted_conjunction([('flowers', 1.0), ('fire', pow(0.9, 2)), ('flames', 1.0)]), parse_prompt("flowers --fire flames")) def test_explicit_conjunction(self): @@ -75,17 +86,27 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(make_untouched_prompt(prompt), parse_prompt(prompt)) assert_if_prompt_string_not_untouched('a test prompt') - assert_if_prompt_string_not_untouched('a badly (formed test prompt') assert_if_prompt_string_not_untouched('a badly formed test+ prompt') - assert_if_prompt_string_not_untouched('a badly (formed test+ prompt') - assert_if_prompt_string_not_untouched('a badly (formed test+ )prompt') - assert_if_prompt_string_not_untouched('a badly (formed test+ )prompt') - assert_if_prompt_string_not_untouched('(((a badly (formed test+ )prompt') - assert_if_prompt_string_not_untouched('(a (ba)dly (f)ormed test+ prompt') - self.assertEqual(Conjunction([FlattenedPrompt([('(a (ba)dly (f)ormed test+', 1.0), ('prompt', 1.1)])]), - parse_prompt('(a (ba)dly (f)ormed test+ +prompt')) - self.assertEqual(Conjunction([Blend([FlattenedPrompt([('((a badly (formed test+', 1.0)])], weights=[1.0])]), - parse_prompt('("((a badly (formed test+ ").blend(1.0)')) + with self.assertRaises(pyparsing.ParseException): + parse_prompt('a badly (formed test prompt') + #with self.assertRaises(pyparsing.ParseException): + with self.assertRaises(pyparsing.ParseException): + parse_prompt('a badly (formed test+ prompt') + with self.assertRaises(pyparsing.ParseException): + parse_prompt('a badly (formed test+ )prompt') + with self.assertRaises(pyparsing.ParseException): + parse_prompt('a badly (formed test+ )prompt') + with self.assertRaises(pyparsing.ParseException): + parse_prompt('(((a badly (formed test+ )prompt') + with self.assertRaises(pyparsing.ParseException): + parse_prompt('(a (ba)dly (f)ormed test+ prompt') + with self.assertRaises(pyparsing.ParseException): + parse_prompt('(a (ba)dly (f)ormed test+ +prompt') + with self.assertRaises(pyparsing.ParseException): + parse_prompt('("((a badly (formed test+ ").blend(1.0)') + with self.assertRaises(pyparsing.ParseException): + parse_prompt('mountain (\\"man").swap("monkey")') + def test_blend(self): self.assertEqual(Conjunction( @@ -127,7 +148,7 @@ class PromptParserTestCase(unittest.TestCase): def test_nested(self): - self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0), ('flames', 2.0), ('trees', 3.0)])]), + self.assertEqual(make_weighted_conjunction([('fire', 1.0), ('flames', 2.0), ('trees', 3.0)]), parse_prompt('fire 2.0(flames 1.5(trees))')) self.assertEqual(Conjunction([Blend(prompts=[FlattenedPrompt([('fire', 1.0), ('flames', 1.2100000000000002)]), FlattenedPrompt([('mountain', 1.0), ('man', 2.0)])], @@ -202,20 +223,84 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(fire 0.5(flames))".swap("0.7(trees) houses"), 2.0(fire)')) - def make_basic_conjunction(self, strings: list[str]): - fragments = [Fragment(x) for x in strings] - return Conjunction([FlattenedPrompt(fragments)]) - - def make_weighted_conjunction(self, weighted_strings: list[tuple[str,float]]): - fragments = [Fragment(x, w) for x,w in weighted_strings] - return Conjunction([FlattenedPrompt(fragments)]) - def test_escaping(self): - self.assertEqual(self.make_basic_conjunction(['mountain \(man\)']),parse_prompt('mountain \(man\)')) - self.assertEqual(self.make_basic_conjunction(['mountain (\(man)\)']),parse_prompt('mountain (\(man)\)')) - self.assertEqual(self.make_basic_conjunction(['mountain (\(man\))']),parse_prompt('mountain (\(man\))')) - #self.assertEqual(self.make_weighted_conjunction([('mountain', 1), ('\(man\)', 1.1)]),parse_prompt('mountain +(\(man\))')) + + # make sure ", ( and ) can be escaped + + self.assertEqual(make_basic_conjunction(['mountain (man)']),parse_prompt('mountain \(man\)')) + self.assertEqual(make_basic_conjunction(['mountain (man )']),parse_prompt('mountain (\(man)\)')) + self.assertEqual(make_basic_conjunction(['mountain (man)']),parse_prompt('mountain (\(man\))')) + self.assertEqual(make_weighted_conjunction([('mountain', 1), ('(man)', 1.1)]), parse_prompt('mountain +(\(man\))')) + self.assertEqual(make_weighted_conjunction([('mountain', 1), ('(man)', 1.1)]), parse_prompt('"mountain" +(\(man\))')) + self.assertEqual(make_weighted_conjunction([('"mountain"', 1), ('(man)', 1.1)]), parse_prompt('\\"mountain\\" +(\(man\))')) + # same weights for each are combined into one + self.assertEqual(make_weighted_conjunction([('"mountain" (man)', 1.1)]), parse_prompt('+(\\"mountain\\") +(\(man\))')) + self.assertEqual(make_weighted_conjunction([('"mountain"', 1.1), ('(man)', 0.9)]), parse_prompt('+(\\"mountain\\") -(\(man\))')) + + self.assertEqual(make_weighted_conjunction([('mountain', 1), ('\(man\)', 1.1)]),parse_prompt('mountain 1.1(\(man\))')) + self.assertEqual(make_weighted_conjunction([('mountain', 1), ('\(man\)', 1.1)]),parse_prompt('"mountain" 1.1(\(man\))')) + self.assertEqual(make_weighted_conjunction([('"mountain"', 1), ('\(man\)', 1.1)]),parse_prompt('\\"mountain\\" 1.1(\(man\))')) + # same weights for each are combined into one + self.assertEqual(make_weighted_conjunction([('\\"mountain\\" \(man\)', 1.1)]),parse_prompt('+(\\"mountain\\") 1.1(\(man\))')) + self.assertEqual(make_weighted_conjunction([('\\"mountain\\"', 1.1), ('\(man\)', 0.9)]),parse_prompt('1.1(\\"mountain\\") 0.9(\(man\))')) + + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain', 1.1), ('\(man\)', 1.1*1.1)]),parse_prompt('hairy +(mountain +(\(man\)))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('\(man\)', 1.1*1.1), ('mountain', 1.1)]),parse_prompt('hairy +(1.1(\(man\)) "mountain")')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain', 1.1), ('\(man\)', 1.1*1.1)]),parse_prompt('hairy +("mountain" 1.1(\(man\)) )')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man', 1.1)]),parse_prompt('hairy +("mountain, man")')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man with a', 1.1), ('beard', 1.1*1.1)]), parse_prompt('hairy +("mountain, man" with a +beard)')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, man" with a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man\" with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\"man\\"" with a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, m\"an\" with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, m\\"an\\"" with a 2.0(beard))')) + + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man (with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" \(with a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man w(ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" w\(ith a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man with( a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" with\( a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man )with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" \)with a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" w\)ith a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man with) a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" with\) a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mou)ntain, \"man (wit(h a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mou\)ntain, \\\"man\" \(wit\(h a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hai(ry', 1), ('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hai\(ry +("mountain, \\\"man\" w\)ith a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy((', 1), ('mountain, \"man with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy\(\( +("mountain, \\\"man\" with a 2.0(beard))')) + + self.assertEqual(make_weighted_conjunction([('mountain, \"man (with a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" \(with a 2.0(beard)) hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man w(ith a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" w\(ith a 2.0(beard))hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man with( a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" with\( a 2.0(beard)) hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man )with a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" \)with a 2.0(beard)) hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" w\)ith a 2.0(beard)) hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man with) a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt(' +("mountain, \\\"man\" with\) a 2.0(beard)) hairy')) + self.assertEqual(make_weighted_conjunction([('mou)ntain, \"man (wit(h a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mou\)ntain, \\\"man\" \(wit\(h a 2.0(beard)) hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0), ('hai(ry', 1)]), parse_prompt('+("mountain, \\\"man\" w\)ith a 2.0(beard)) hai\(ry ')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man with a', 1.1), ('beard', 1.1*2.0), ('hairy((', 1)]), parse_prompt('+("mountain, \\\"man\" with a 2.0(beard)) hairy\(\( ')) + + def test_cross_attention_escaping(self): + + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('man', 1)], [Fragment('monkey', 1)])])]), + parse_prompt('mountain (man).swap(monkey)')) + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('man', 1)], [Fragment('m(onkey', 1)])])]), + parse_prompt('mountain (man).swap(m\(onkey)')) + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('m(an', 1)], [Fragment('m(onkey', 1)])])]), + parse_prompt('mountain (m\(an).swap(m\(onkey)')) + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('(((', 1)], [Fragment('m(on))key', 1)])])]), + parse_prompt('mountain (\(\(\().swap(m\(on\)\)key)')) + + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('man', 1)], [Fragment('monkey', 1)])])]), + parse_prompt('mountain ("man").swap(monkey)')) + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('man', 1)], [Fragment('monkey', 1)])])]), + parse_prompt('mountain ("man").swap("monkey")')) + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('"man', 1)], [Fragment('monkey', 1)])])]), + parse_prompt('mountain (\\"man).swap("monkey")')) + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('man', 1)], [Fragment('m(onkey', 1)])])]), + parse_prompt('mountain (man).swap(m\(onkey)')) + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('m(an', 1)], [Fragment('m(onkey', 1)])])]), + parse_prompt('mountain (m\(an).swap(m\(onkey)')) + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('(((', 1)], [Fragment('m(on))key', 1)])])]), + parse_prompt('mountain (\(\(\().swap(m\(on\)\)key)')) + + def test_single(self): + self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('"man', 1)], [Fragment('monkey', 1)])])]), + parse_prompt('mountain (\\"man).swap("monkey")')) if __name__ == '__main__': From da88097abac211e9769ce51c4dd8f79d6ed64e9f Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 20 Oct 2022 21:41:32 +0200 Subject: [PATCH 026/124] fix prompt handling in conditioning.py --- ldm/invoke/conditioning.py | 8 ++++---- ldm/invoke/prompt_parser.py | 39 +++++++++++++++++++++---------------- tests/test_prompt_parser.py | 12 ++++++++++++ 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index fb6d8d443e..e3685db615 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -66,10 +66,10 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n edited_prompt = FlattenedPrompt() for fragment in flattened_prompt.children: if type(fragment) is CrossAttentionControlSubstitute: - original_prompt.append(fragment.original_fragment) - edited_prompt.append(fragment.edited_fragment) - elif type(fragment) is CrossAttentionControlAppend: - edited_prompt.append(fragment.fragment) + original_prompt.append(fragment.original) + edited_prompt.append(fragment.edited) + #elif type(fragment) is CrossAttentionControlAppend: + # edited_prompt.append(fragment.fragment) else: # regular fragment original_prompt.append(fragment) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index d576d069aa..68cc102584 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -1,4 +1,5 @@ import string +from typing import Union import pyparsing import pyparsing as pp @@ -17,24 +18,31 @@ class Prompt(): def __eq__(self, other): return type(other) is Prompt and other.children == self.children +class BaseFragment: + pass + class FlattenedPrompt(): - def __init__(self, parts: list): + def __init__(self, parts: list=[]): # verify type correctness - parts_converted = [] + self.children = [] for part in parts: - if issubclass(type(part), BaseFragment): - parts_converted.append(part) - elif type(part) is tuple: - # upgrade tuples to Fragments - if type(part[0]) is not str or (type(part[1]) is not float and type(part[1]) is not int): - raise PromptParser.ParsingException( - f"FlattenedPrompt cannot contain {part}, only Fragments or (str, float) tuples are allowed") - parts_converted.append(Fragment(part[0], part[1])) - else: + self.append(part) + + def append(self, fragment: Union[list, BaseFragment, tuple]): + if type(fragment) is list: + for x in fragment: + self.append(x) + elif issubclass(type(fragment), BaseFragment): + self.children.append(fragment) + elif type(fragment) is tuple: + # upgrade tuples to Fragments + if type(fragment[0]) is not str or (type(fragment[1]) is not float and type(fragment[1]) is not int): raise PromptParser.ParsingException( - f"FlattenedPrompt cannot contain {part}, only Fragments or (str, float) tuples are allowed") - # all looks good - self.children = parts_converted + f"FlattenedPrompt cannot contain {fragment}, only Fragments or (str, float) tuples are allowed") + self.children.append(Fragment(fragment[0], fragment[1])) + else: + raise PromptParser.ParsingException( + f"FlattenedPrompt cannot contain {fragment}, only Fragments or (str, float) tuples are allowed") def __repr__(self): return f"FlattenedPrompt:{self.children}" @@ -42,9 +50,6 @@ class FlattenedPrompt(): return type(other) is FlattenedPrompt and other.children == self.children # abstract base class for Fragments -class BaseFragment: - pass - class Fragment(BaseFragment): def __init__(self, text: str, weight: float=1): assert(type(text) is str) diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index d053253eb6..2bfae0cb48 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -156,6 +156,18 @@ class PromptParserTestCase(unittest.TestCase): parse_prompt('("fire ++(flames)", "mountain 2(man)").blend(1,1)')) def test_cross_attention_control(self): + + self.assertEqual(Conjunction([ + FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat', 1)], [Fragment('dog', 1)]), + Fragment('eating a hotdog', 1)])]), parse_prompt("a \"cat\".swap(dog) eating a hotdog")) + + self.assertEqual(Conjunction([ + FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat', 1)], [Fragment('dog', 1)]), + Fragment('eating a hotdog', 1)])]), parse_prompt("a cat.swap(dog) eating a hotdog")) + + fire_flames_to_trees = Conjunction([FlattenedPrompt([('fire', 1.0), \ CrossAttentionControlSubstitute([Fragment('flames', 1)], [Fragment('trees', 1)])])]) self.assertEqual(fire_flames_to_trees, parse_prompt('fire "flames".swap(trees)')) From da75876639cb94be33c3427b059737879a87636f Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 00:08:28 +0200 Subject: [PATCH 027/124] better support for word.swap(otherWord) without parantheses or quotes --- ldm/invoke/prompt_parser.py | 21 ++++++++++++--------- tests/test_prompt_parser.py | 2 -- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 68cc102584..2110b8ba34 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -270,7 +270,6 @@ class PromptParser(): else: raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) - unquoted_fragment = pp.Forward() quoted_fragment = pp.Forward() parenthesized_fragment = pp.Forward() @@ -281,7 +280,7 @@ class PromptParser(): fragment_parser = pp.Group(pp.OneOrMore(attention | (greedy_word.set_parse_action(make_fragment)))) fragment_parser.set_name('word_or_attention') result = fragment_parser.parse_string(x[0]) - #result = (pp.OneOrMore(attention | unquoted_fragment) + pp.StringEnd()).parse_string(x[0]) + #result = (pp.OneOrMore(attention | unquoted_word) + pp.StringEnd()).parse_string(x[0]) #print("parsed to", result) return result @@ -292,11 +291,15 @@ class PromptParser(): self_unescaping_escaped_lparen = pp.Literal('\\(').set_parse_action(lambda x: '(') self_unescaping_escaped_rparen = pp.Literal('\\)').set_parse_action(lambda x: ')') - unquoted_fragment << pp.Combine(pp.OneOrMore( - self_unescaping_escaped_rparen | self_unescaping_escaped_lparen | self_unescaping_escaped_quote | - pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()') - )) - unquoted_fragment.set_parse_action(make_fragment).set_name('unquoted_fragment') + def not_ends_with_swap(x): + #print("trying to match:", x) + return not x[0].endswith('.swap') + + unquoted_fragment = pp.Combine(pp.OneOrMore( + self_unescaping_escaped_rparen | self_unescaping_escaped_lparen | self_unescaping_escaped_quote | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()'))) + unquoted_fragment.set_parse_action(make_fragment).set_name('unquoted_fragment').set_debug(True) + #print(unquoted_fragment.parse_string("cat.swap(dog)")) parenthesized_fragment << pp.MatchFirst([ (lparen + quoted_fragment.copy().set_parse_action(parse_fragment_str).set_debug(False) + rparen).set_name('-quoted_paren_internal').set_debug(False), @@ -367,13 +370,13 @@ class PromptParser(): ).set_parse_action(lambda x: Fragment("")) empty_string.set_name('empty_string') - # cross attention control debug_cross_attention_control = False original_fragment = pp.Or([empty_string.set_debug(debug_cross_attention_control), quoted_fragment.set_debug(debug_cross_attention_control), parenthesized_fragment.set_debug(debug_cross_attention_control), - unquoted_fragment.set_debug(debug_cross_attention_control)]) + pp.Word(pp.printables, exclude_chars=string.whitespace + '.').set_parse_action(make_fragment) + pp.FollowedBy(".swap") + ]) edited_fragment = parenthesized_fragment cross_attention_substitute = original_fragment + pp.Literal(".swap").suppress() + edited_fragment diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 2bfae0cb48..902f4b925c 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -104,8 +104,6 @@ class PromptParserTestCase(unittest.TestCase): parse_prompt('(a (ba)dly (f)ormed test+ +prompt') with self.assertRaises(pyparsing.ParseException): parse_prompt('("((a badly (formed test+ ").blend(1.0)') - with self.assertRaises(pyparsing.ParseException): - parse_prompt('mountain (\\"man").swap("monkey")') def test_blend(self): From 2e0b1c4c8b306f5b76a3049889e1f1c0d76301b0 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 03:29:50 +0200 Subject: [PATCH 028/124] ok now we're cooking --- ldm/invoke/prompt_parser.py | 463 ++++++++++++++++++++---------------- tests/test_prompt_parser.py | 12 +- 2 files changed, 273 insertions(+), 202 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 2110b8ba34..ef6a72a49b 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -1,13 +1,17 @@ import string from typing import Union -import pyparsing import pyparsing as pp -from pyparsing import original_text_for - class Prompt(): + """ + Mid-level structure for storing the tree-like result of parsing a prompt. A Prompt may not represent the whole of + the singular user-defined "prompt string" (although it can) - for example, if the user specifies a Blend, the objects + that are to be blended together are stored individuall as Prompt objects. + Nesting makes this object not suitable for directly tokenizing; instead call flatten() on the containing Conjunction + to produce a FlattenedPrompt. + """ def __init__(self, parts: list): for c in parts: if type(c) is not Attention and not issubclass(type(c), BaseFragment) and type(c) is not pp.ParseResults: @@ -22,13 +26,16 @@ class BaseFragment: pass class FlattenedPrompt(): + """ + A Prompt that has been passed through flatten(). Its children can be readily tokenized. + """ def __init__(self, parts: list=[]): - # verify type correctness self.children = [] for part in parts: self.append(part) def append(self, fragment: Union[list, BaseFragment, tuple]): + # verify type correctness if type(fragment) is list: for x in fragment: self.append(x) @@ -49,8 +56,11 @@ class FlattenedPrompt(): def __eq__(self, other): return type(other) is FlattenedPrompt and other.children == self.children -# abstract base class for Fragments + class Fragment(BaseFragment): + """ + A Fragment is a chunk of plain text and an optional weight. The text should be passed as-is to the CLIP tokenizer. + """ def __init__(self, text: str, weight: float=1): assert(type(text) is str) if '\\"' in text or '\\(' in text or '\\)' in text: @@ -67,6 +77,12 @@ class Fragment(BaseFragment): and other.weight == self.weight class Attention(): + """ + Nestable weight control for fragments. Each object in the children array may in turn be an Attention object; + weights should be considered to accumulate as the tree is traversed to deeper levels of nesting. + + Do not traverse directly; instead obtain a FlattenedPrompt by calling Flatten() on a top-level Conjunction object. + """ def __init__(self, weight: float, children: list): self.weight = weight self.children = children @@ -81,7 +97,28 @@ class CrossAttentionControlledFragment(BaseFragment): pass class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): - def __init__(self, original: Fragment, edited: Fragment): + """ + A Cross-Attention Controlled ('prompt2prompt') fragment, for use inside a Prompt, Attention, or FlattenedPrompt. + Representing an "original" word sequence that supplies feature vectors for an initial diffusion operation, and an + "edited" word sequence, to which the attention maps produced by the "original" word sequence are applied. Intuitively, + the result should be an "edited" image that looks like the "original" image with concepts swapped. + + eg "a cat sitting on a car" (original) -> "a smiling dog sitting on a car" (edited): the edited image should look + almost exactly the same as the original, but with a smiling dog rendered in place of the cat. The + CrossAttentionControlSubstitute object representing this swap may be confined to the tokens being swapped: + CrossAttentionControlSubstitute(original=[Fragment('cat')], edited=[Fragment('dog')]) + or it may represent a larger portion of the token sequence: + CrossAttentionControlSubstitute(original=[Fragment('a cat sitting on a car')], + edited=[Fragment('a smiling dog sitting on a car')]) + + In either case expect it to be embedded in a Prompt or FlattenedPrompt: + FlattenedPrompt([ + Fragment('a'), + CrossAttentionControlSubstitute(original=[Fragment('cat')], edited=[Fragment('dog')]), + Fragment('sitting on a car') + ]) + """ + def __init__(self, original: Union[Fragment, list], edited: Union[Fragment, list]): self.original = original self.edited = edited @@ -92,6 +129,7 @@ class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): and other.original == self.original \ and other.edited == self.edited + class CrossAttentionControlAppend(CrossAttentionControlledFragment): def __init__(self, fragment: Fragment): self.fragment = fragment @@ -104,6 +142,10 @@ class CrossAttentionControlAppend(CrossAttentionControlledFragment): class Conjunction(): + """ + Storage for one or more Prompts or Blends, each of which is to be separately diffused and then the results merged + by weighted sum in latent space. + """ def __init__(self, prompts: list, weights: list = None): # force everything to be a Prompt #print("making conjunction with", parts) @@ -125,6 +167,11 @@ class Conjunction(): class Blend(): + """ + Stores a Blend of multiple Prompts. To apply, build feature vectors for each of the child Prompts and then perform a + weighted blend of the feature vectors to produce a single feature vector that is effectively a lerp between the + Prompts. + """ def __init__(self, prompts: list, weights: list[float], normalize_weights: bool=True): #print("making Blend with prompts", prompts, "and weights", weights) if len(prompts) != len(weights): @@ -152,16 +199,11 @@ class PromptParser(): def __init__(self, attention_plus_base=1.1, attention_minus_base=0.9): - self.attention_plus_base = attention_plus_base - self.attention_minus_base = attention_minus_base - - self.root = self.build_parser_logic() + self.root = build_parser_syntax(attention_plus_base, attention_minus_base) def parse(self, prompt: str) -> Conjunction: ''' - This parser is *very* forgiving. If it cannot parse syntax, it will return strings as-is to be passed on to the - diffusion. :param prompt: The prompt string to parse :return: a Conjunction representing the parsed results. ''' @@ -177,7 +219,16 @@ class PromptParser(): return self.flatten(root[0]) - def flatten(self, root: Conjunction): + + def flatten(self, root: Conjunction) -> Conjunction: + """ + Flattening a Conjunction traverses all of the nested tree-like structures in each of its Prompts or Blends, + producing from each of these walks a linear sequence of Fragment or CrossAttentionControlSubstitute objects + that can be readily tokenized without the need to walk a complex tree structure. + + :param root: The Conjunction to flatten. + :return: A Conjunction containing the result of flattening each of the prompts in the passed-in root. + """ #print("flattening", root) @@ -242,226 +293,238 @@ class PromptParser(): flattened_parts = [] for part in root.prompts: flattened_parts += flatten_internal(part, 1.0, [], ' C| ') + + #print("flattened to", flattened_parts) + weights = root.weights return Conjunction(flattened_parts, weights) - def build_parser_logic(self): +def build_parser_syntax(attention_plus_base: float, attention_minus_base: float): - lparen = pp.Literal("(").suppress() - rparen = pp.Literal(")").suppress() - quotes = pp.Literal('"').suppress() + lparen = pp.Literal("(").suppress() + rparen = pp.Literal(")").suppress() + quotes = pp.Literal('"').suppress() - # accepts int or float notation, always maps to float - number = pyparsing.pyparsing_common.real | pp.Word(pp.nums).set_parse_action(pp.token_map(float)) - SPACE_CHARS = string.whitespace - greedy_word = pp.Word(pp.printables, exclude_chars=string.whitespace).set_name('greedy_word') + # accepts int or float notation, always maps to float + number = pp.pyparsing_common.real | pp.Word(pp.nums).set_parse_action(pp.token_map(float)) + greedy_word = pp.Word(pp.printables, exclude_chars=string.whitespace).set_name('greedy_word') - attention = pp.Forward() + attention = pp.Forward() + quoted_fragment = pp.Forward() + parenthesized_fragment = pp.Forward() + cross_attention_substitute = pp.Forward() + prompt_part = pp.Forward() - def make_fragment(x): - #print("### making fragment for", x) - if type(x) is str: - return Fragment(x) - elif type(x) is pp.ParseResults or type(x) is list: - #print(f'converting {type(x).__name__} to Fragment') - return Fragment(' '.join([s for s in x])) - else: - raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) + def make_text_fragment(x): + #print("### making fragment for", x) + if type(x) is str: + return Fragment(x) + elif type(x) is pp.ParseResults or type(x) is list: + #print(f'converting {type(x).__name__} to Fragment') + return Fragment(' '.join([s for s in x])) + else: + raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) - quoted_fragment = pp.Forward() - parenthesized_fragment = pp.Forward() + def parse_fragment_str(x, in_quotes: bool=False, in_parens: bool=False): + fragment_string = x[0] + print(f"parsing fragment string \"{fragment_string}\"") + if len(fragment_string.strip()) == 0: + return Fragment('') - def parse_fragment_str(x): - #print("parsing fragment string", x) - if len(x[0].strip()) == 0: - return Fragment('') - fragment_parser = pp.Group(pp.OneOrMore(attention | (greedy_word.set_parse_action(make_fragment)))) - fragment_parser.set_name('word_or_attention') - result = fragment_parser.parse_string(x[0]) - #result = (pp.OneOrMore(attention | unquoted_word) + pp.StringEnd()).parse_string(x[0]) - #print("parsed to", result) - return result + if in_quotes: + # escape unescaped quotes + fragment_string = fragment_string.replace('"', '\\"') - quoted_fragment << pp.QuotedString(quote_char='"', esc_char='\\') - quoted_fragment.set_parse_action(parse_fragment_str).set_name('quoted_fragment') + #fragment_parser = pp.Group(pp.OneOrMore(attention | cross_attention_substitute | (greedy_word.set_parse_action(make_text_fragment)))) + result = pp.Group(pp.MatchFirst([ + pp.OneOrMore(prompt_part | quoted_fragment), + pp.Empty().set_parse_action(make_text_fragment) + pp.StringEnd() + ])).set_name('rr').set_debug(False).parse_string(fragment_string) + #result = (pp.OneOrMore(attention | unquoted_word) + pp.StringEnd()).parse_string(x[0]) + #print("parsed to", result) + return result - self_unescaping_escaped_quote = pp.Literal('\\"').set_parse_action(lambda x: '"') - self_unescaping_escaped_lparen = pp.Literal('\\(').set_parse_action(lambda x: '(') - self_unescaping_escaped_rparen = pp.Literal('\\)').set_parse_action(lambda x: ')') + quoted_fragment << pp.QuotedString(quote_char='"', esc_char=None, esc_quote='\\"') + quoted_fragment.set_parse_action(lambda x: parse_fragment_str(x, in_quotes=True)).set_name('quoted_fragment') - def not_ends_with_swap(x): - #print("trying to match:", x) - return not x[0].endswith('.swap') + escaped_quote = pp.Literal('\\"')#.set_parse_action(lambda x: '"') + escaped_lparen = pp.Literal('\\(')#.set_parse_action(lambda x: '(') + escaped_rparen = pp.Literal('\\)')#.set_parse_action(lambda x: ')') + escaped_backslash = pp.Literal('\\\\')#.set_parse_action(lambda x: '"') - unquoted_fragment = pp.Combine(pp.OneOrMore( - self_unescaping_escaped_rparen | self_unescaping_escaped_lparen | self_unescaping_escaped_quote | - pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()'))) - unquoted_fragment.set_parse_action(make_fragment).set_name('unquoted_fragment').set_debug(True) - #print(unquoted_fragment.parse_string("cat.swap(dog)")) + def not_ends_with_swap(x): + #print("trying to match:", x) + return not x[0].endswith('.swap') - parenthesized_fragment << pp.MatchFirst([ - (lparen + quoted_fragment.copy().set_parse_action(parse_fragment_str).set_debug(False) + rparen).set_name('-quoted_paren_internal').set_debug(False), - (lparen + rparen).set_parse_action(lambda x: make_fragment('')).set_name('-()').set_debug(False), - (lparen + pp.Combine(pp.OneOrMore( - pp.Literal('\\"').set_debug(False).set_parse_action(lambda x: '"') | - pp.Literal('\\(').set_debug(False).set_parse_action(lambda x: '(') | - pp.Literal('\\)').set_debug(False).set_parse_action(lambda x: ')') | - pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()') | - pp.Word(string.whitespace) - )).set_name('--combined').set_parse_action(parse_fragment_str).set_debug(False) + rparen)]).set_name('-unquoted_paren_internal').set_debug(False) - parenthesized_fragment.set_name('parenthesized_fragment').set_debug(False) + unquoted_fragment = pp.Combine(pp.OneOrMore( + escaped_rparen | escaped_lparen | escaped_quote | escaped_backslash | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()'))) + unquoted_fragment.set_parse_action(make_text_fragment).set_name('unquoted_fragment').set_debug(False) + #print(unquoted_fragment.parse_string("cat.swap(dog)")) - debug_attention = False - # attention control of the form +(phrase) / -(phrase) / (phrase) - # phrase can be multiple words, can have multiple +/- signs to increase the effect or type a floating point or integer weight - attention_head = (number | pp.Word('+') | pp.Word('-'))\ - .set_name("attention_head")\ - .set_debug(False) - word_inside_attention = pp.Combine(pp.OneOrMore( - pp.Literal('\\)') | pp.Literal('\\(') | pp.Literal('\\"') | - pp.Word(pp.printables, exclude_chars=string.whitespace + '\\()"') - )).set_name('word_inside_attention') - attention_with_parens = pp.Forward() - attention_with_parens_delimited_list = pp.delimited_list(pp.Or([ - quoted_fragment.copy().set_debug(debug_attention), - attention.copy().set_debug(debug_attention), - word_inside_attention.set_debug(debug_attention)]).set_name('delim_inner').set_debug(debug_attention), - delim=string.whitespace) - # have to disable ignore_expr here to prevent pyparsing from stripping off quote marks - attention_with_parens_body = pp.nested_expr(content=attention_with_parens_delimited_list, - ignore_expr=None#((pp.Literal("\\(") | pp.Literal('\\)'))) - ) - attention_with_parens_body.set_debug(debug_attention) - attention_with_parens << (attention_head + attention_with_parens_body) - attention_with_parens.set_name('attention_with_parens').set_debug(debug_attention) + parenthesized_fragment << pp.Or([ + (lparen + quoted_fragment.copy().set_parse_action(lambda x: parse_fragment_str(x, in_quotes=True)).set_debug(False) + rparen).set_name('-quoted_paren_internal').set_debug(False), + (lparen + rparen).set_parse_action(lambda x: make_text_fragment('')).set_name('-()').set_debug(False), + (lparen + pp.Combine(pp.OneOrMore( + escaped_quote | escaped_lparen | escaped_rparen | escaped_backslash | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()') | + pp.Word(string.whitespace) + )).set_name('--combined').set_parse_action(lambda x: parse_fragment_str(x, in_parens=True)).set_debug(False) + rparen)]).set_name('-unquoted_paren_internal').set_debug(False) + parenthesized_fragment.set_name('parenthesized_fragment').set_debug(False) - attention_without_parens = (pp.Word('+') | pp.Word('-')) + (quoted_fragment | word_inside_attention) - attention_without_parens.set_name('attention_without_parens').set_debug(debug_attention) + debug_attention = False + # attention control of the form +(phrase) / -(phrase) / (phrase) + # phrase can be multiple words, can have multiple +/- signs to increase the effect or type a floating point or integer weight + attention_head = (number | pp.Word('+') | pp.Word('-'))\ + .set_name("attention_head")\ + .set_debug(False) + word_inside_attention = pp.Combine(pp.OneOrMore( + pp.Literal('\\)') | pp.Literal('\\(') | pp.Literal('\\"') | + pp.Word(pp.printables, exclude_chars=string.whitespace + '\\()"') + )).set_name('word_inside_attention') + attention_with_parens = pp.Forward() - attention << (attention_with_parens | attention_without_parens) + attention_with_parens_delimited_list = pp.OneOrMore(pp.Or([ + quoted_fragment.copy().set_debug(debug_attention), + attention.copy().set_debug(debug_attention), + cross_attention_substitute, + word_inside_attention.set_debug(debug_attention) + #pp.White() + ]).set_name('delim_inner').set_debug(debug_attention)) + # have to disable ignore_expr here to prevent pyparsing from stripping off quote marks + attention_with_parens_body = pp.nested_expr(content=attention_with_parens_delimited_list, + ignore_expr=None#((pp.Literal("\\(") | pp.Literal('\\)'))) + ) + attention_with_parens_body.set_debug(debug_attention) + attention_with_parens << (attention_head + attention_with_parens_body) + attention_with_parens.set_name('attention_with_parens').set_debug(debug_attention) - def make_attention(x): - #print("making Attention from", x) - weight = 1 - # number(str) - if type(x[0]) is float or type(x[0]) is int: - weight = float(x[0]) - # +(str) or -(str) or +str or -str - elif type(x[0]) is str: - base = self.attention_plus_base if x[0][0] == '+' else self.attention_minus_base - weight = pow(base, len(x[0])) - if type(x[1]) is list or type(x[1]) is pp.ParseResults: - return Attention(weight=weight, children=[(Fragment(x) if type(x) is str else x) for x in x[1]]) - elif type(x[1]) is str: - return Attention(weight=weight, children=[Fragment(x[1])]) - elif type(x[1]) is Fragment: - return Attention(weight=weight, children=[x[1]]) - raise PromptParser.ParsingException(f"Don't know how to make attention with children {x[1]}") + attention_without_parens = (pp.Word('+') | pp.Word('-')) + (quoted_fragment | word_inside_attention) + attention_without_parens.set_name('attention_without_parens').set_debug(debug_attention) - attention_with_parens.set_parse_action(make_attention) - attention_without_parens.set_parse_action(make_attention) + attention << (attention_with_parens | attention_without_parens) + attention.set_name('attention') - # cross-attention control - empty_string = ((lparen + rparen) | - pp.Literal('""').suppress() | - (lparen + pp.Literal('""').suppress() + rparen) - ).set_parse_action(lambda x: Fragment("")) - empty_string.set_name('empty_string') + def make_attention(x): + #print("making Attention from", x) + weight = 1 + # number(str) + if type(x[0]) is float or type(x[0]) is int: + weight = float(x[0]) + # +(str) or -(str) or +str or -str + elif type(x[0]) is str: + base = attention_plus_base if x[0][0] == '+' else attention_minus_base + weight = pow(base, len(x[0])) + if type(x[1]) is list or type(x[1]) is pp.ParseResults: + return Attention(weight=weight, children=[(Fragment(x) if type(x) is str else x) for x in x[1]]) + elif type(x[1]) is str: + return Attention(weight=weight, children=[Fragment(x[1])]) + elif type(x[1]) is Fragment: + return Attention(weight=weight, children=[x[1]]) + raise PromptParser.ParsingException(f"Don't know how to make attention with children {x[1]}") - # cross attention control - debug_cross_attention_control = False - original_fragment = pp.Or([empty_string.set_debug(debug_cross_attention_control), - quoted_fragment.set_debug(debug_cross_attention_control), - parenthesized_fragment.set_debug(debug_cross_attention_control), - pp.Word(pp.printables, exclude_chars=string.whitespace + '.').set_parse_action(make_fragment) + pp.FollowedBy(".swap") - ]) - edited_fragment = parenthesized_fragment - cross_attention_substitute = original_fragment + pp.Literal(".swap").suppress() + edited_fragment + attention_with_parens.set_parse_action(make_attention) + attention_without_parens.set_parse_action(make_attention) - original_fragment.set_name('original_fragment').set_debug(debug_cross_attention_control) - edited_fragment.set_name('edited_fragment').set_debug(debug_cross_attention_control) - cross_attention_substitute.set_name('cross_attention_substitute').set_debug(debug_cross_attention_control) + # cross-attention control + empty_string = ((lparen + rparen) | + pp.Literal('""').suppress() | + (lparen + pp.Literal('""').suppress() + rparen) + ).set_parse_action(lambda x: Fragment("")) + empty_string.set_name('empty_string') - def make_cross_attention_substitute(x): - #print("making cacs for", x) - cacs = CrossAttentionControlSubstitute(x[0], x[1]) - #print("made", cacs) - return cacs - cross_attention_substitute.set_parse_action(make_cross_attention_substitute) + # cross attention control + debug_cross_attention_control = False + original_fragment = pp.Or([empty_string.set_debug(debug_cross_attention_control), + quoted_fragment.set_debug(debug_cross_attention_control), + parenthesized_fragment.set_debug(debug_cross_attention_control), + pp.Word(pp.printables, exclude_chars=string.whitespace + '.').set_parse_action(make_text_fragment) + pp.FollowedBy(".swap") + ]) + edited_fragment = parenthesized_fragment + cross_attention_substitute << original_fragment + pp.Literal(".swap").suppress() + edited_fragment + + original_fragment.set_name('original_fragment').set_debug(debug_cross_attention_control) + edited_fragment.set_name('edited_fragment').set_debug(debug_cross_attention_control) + cross_attention_substitute.set_name('cross_attention_substitute').set_debug(debug_cross_attention_control) + + def make_cross_attention_substitute(x): + #print("making cacs for", x) + cacs = CrossAttentionControlSubstitute(x[0], x[1]) + #print("made", cacs) + return cacs + cross_attention_substitute.set_parse_action(make_cross_attention_substitute) + + + # simple fragments of text + # use Or to match the longest + prompt_part << pp.MatchFirst([ + cross_attention_substitute, + attention, + unquoted_fragment, + lparen + unquoted_fragment + rparen # matches case where user has +(term) and just deletes the + + ]) + prompt_part.set_debug(False) + prompt_part.set_name("prompt_part") + + empty = ( + (lparen + pp.ZeroOrMore(pp.Word(string.whitespace)) + rparen) | + (quotes + pp.ZeroOrMore(pp.Word(string.whitespace)) + quotes)).set_debug(False).set_name('empty') + + # root prompt definition + prompt = ((pp.OneOrMore(prompt_part | quoted_fragment) | empty) + pp.StringEnd()) \ + .set_parse_action(lambda x: Prompt(x)) - # simple fragments of text - # use Or to match the longest - prompt_part = pp.Or([ - cross_attention_substitute, - attention, - quoted_fragment, - unquoted_fragment, - lparen + unquoted_fragment + rparen # matches case where user has +(term) and just deletes the + - ]) - prompt_part.set_debug(False) - prompt_part.set_name("prompt_part") + # weighted blend of prompts + # ("promptA", "promptB").blend(a, b) where "promptA" and "promptB" are valid prompts and a and b are float or + # int weights. + # can specify more terms eg ("promptA", "promptB", "promptC").blend(a,b,c) - empty = ( - (lparen + pp.ZeroOrMore(pp.Word(string.whitespace)) + rparen) | - (quotes + pp.ZeroOrMore(pp.Word(string.whitespace)) + quotes)).set_debug(False).set_name('empty') + def make_prompt_from_quoted_string(x): + #print(' got quoted prompt', x) - # root prompt definition - prompt = ((pp.OneOrMore(prompt_part) | empty) + pp.StringEnd()) \ - .set_parse_action(lambda x: Prompt(x)) + x_unquoted = x[0][1:-1] + if len(x_unquoted.strip()) == 0: + # print(' b : just an empty string') + return Prompt([Fragment('')]) + # print(' b parsing ', c_unquoted) + x_parsed = prompt.parse_string(x_unquoted) + #print(" quoted prompt was parsed to", type(x_parsed),":", x_parsed) + return x_parsed[0] + + quoted_prompt = pp.dbl_quoted_string.set_parse_action(make_prompt_from_quoted_string) + quoted_prompt.set_name('quoted_prompt') + + blend_terms = pp.delimited_list(quoted_prompt).set_name('blend_terms') + blend_weights = pp.delimited_list(number).set_name('blend_weights') + blend = pp.Group(lparen + pp.Group(blend_terms) + rparen + + pp.Literal(".blend").suppress() + + lparen + pp.Group(blend_weights) + rparen).set_name('blend') + blend.set_debug(False) + blend.set_parse_action(lambda x: Blend(prompts=x[0][0], weights=x[0][1])) - # weighted blend of prompts - # ("promptA", "promptB").blend(a, b) where "promptA" and "promptB" are valid prompts and a and b are float or - # int weights. - # can specify more terms eg ("promptA", "promptB", "promptC").blend(a,b,c) + conjunction_terms = blend_terms.copy().set_name('conjunction_terms') + conjunction_weights = blend_weights.copy().set_name('conjunction_weights') + conjunction_with_parens_and_quotes = pp.Group(lparen + pp.Group(conjunction_terms) + rparen + + pp.Literal(".and").suppress() + + lparen + pp.Optional(pp.Group(conjunction_weights)) + rparen).set_name('conjunction') + def make_conjunction(x): + parts_raw = x[0][0] + weights = x[0][1] if len(x[0])>1 else [1.0]*len(parts_raw) + parts = [part for part in parts_raw] + return Conjunction(parts, weights) + conjunction_with_parens_and_quotes.set_parse_action(make_conjunction) - def make_prompt_from_quoted_string(x): - #print(' got quoted prompt', x) + implicit_conjunction = pp.OneOrMore(blend | prompt).set_name('implicit_conjunction') + implicit_conjunction.set_parse_action(lambda x: Conjunction(x)) - x_unquoted = x[0][1:-1] - if len(x_unquoted.strip()) == 0: - # print(' b : just an empty string') - return Prompt([Fragment('')]) - # print(' b parsing ', c_unquoted) - x_parsed = prompt.parse_string(x_unquoted) - #print(" quoted prompt was parsed to", type(x_parsed),":", x_parsed) - return x_parsed[0] + conjunction = conjunction_with_parens_and_quotes | implicit_conjunction + conjunction.set_debug(False) - quoted_prompt = pp.dbl_quoted_string.set_parse_action(make_prompt_from_quoted_string) - quoted_prompt.set_name('quoted_prompt') - - blend_terms = pp.delimited_list(quoted_prompt).set_name('blend_terms') - blend_weights = pp.delimited_list(number).set_name('blend_weights') - blend = pp.Group(lparen + pp.Group(blend_terms) + rparen - + pp.Literal(".blend").suppress() - + lparen + pp.Group(blend_weights) + rparen).set_name('blend') - blend.set_debug(False) - - - blend.set_parse_action(lambda x: Blend(prompts=x[0][0], weights=x[0][1])) - - conjunction_terms = blend_terms.copy().set_name('conjunction_terms') - conjunction_weights = blend_weights.copy().set_name('conjunction_weights') - conjunction_with_parens_and_quotes = pp.Group(lparen + pp.Group(conjunction_terms) + rparen - + pp.Literal(".and").suppress() - + lparen + pp.Optional(pp.Group(conjunction_weights)) + rparen).set_name('conjunction') - def make_conjunction(x): - parts_raw = x[0][0] - weights = x[0][1] if len(x[0])>1 else [1.0]*len(parts_raw) - parts = [part for part in parts_raw] - return Conjunction(parts, weights) - conjunction_with_parens_and_quotes.set_parse_action(make_conjunction) - - implicit_conjunction = pp.OneOrMore(blend | prompt).set_name('implicit_conjunction') - implicit_conjunction.set_parse_action(lambda x: Conjunction(x)) - - conjunction = conjunction_with_parens_and_quotes | implicit_conjunction - conjunction.set_debug(False) - - # top-level is a conjunction of one or more blends or prompts - return conjunction + # top-level is a conjunction of one or more blends or prompts + return conjunction diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 902f4b925c..9f12283333 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -77,6 +77,15 @@ class PromptParserTestCase(unittest.TestCase): def test_complex_conjunction(self): self.assertEqual(Conjunction([FlattenedPrompt([("mountain man", 1.0)]), FlattenedPrompt([("a person with a hat", 1.0), ("riding a bicycle", pow(1.1,2))])], weights=[0.5, 0.5]), parse_prompt("(\"mountain man\", \"a person with a hat ++(riding a bicycle)\").and(0.5, 0.5)")) + self.assertEqual(Conjunction([FlattenedPrompt([("mountain man", 1.0)]), + FlattenedPrompt([("a person with a hat", 1.0), + ("riding a", 1.1*1.1), + CrossAttentionControlSubstitute( + [Fragment("bicycle", pow(1.1,2))], + [Fragment("skateboard", pow(1.1,2))]) + ]) + ], weights=[0.5, 0.5]), + parse_prompt("(\"mountain man\", \"a person with a hat ++(riding a bicycle.swap(skateboard))\").and(0.5, 0.5)")) def test_badly_formed(self): def make_untouched_prompt(prompt): @@ -309,8 +318,7 @@ class PromptParserTestCase(unittest.TestCase): parse_prompt('mountain (\(\(\().swap(m\(on\)\)key)')) def test_single(self): - self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('"man', 1)], [Fragment('monkey', 1)])])]), - parse_prompt('mountain (\\"man).swap("monkey")')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mou)ntain, \"man (wit(h a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mou\)ntain, \\\"man\" \(wit\(h a 2.0(beard))')) if __name__ == '__main__': From 404d59b1b8704ad53dd7bf70b9ef00d1a0528f6f Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 04:15:10 +0200 Subject: [PATCH 029/124] fix blend --- ldm/invoke/conditioning.py | 7 ++++--- ldm/invoke/prompt_parser.py | 10 ++++++---- tests/test_prompt_parser.py | 6 ++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 189af10c24..dd41869311 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -48,7 +48,7 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n edited_conditioning = None edit_opcodes = None - if parsed_prompt is Blend: + if type(parsed_prompt) is Blend: blend: Blend = parsed_prompt embeddings_to_blend = None for flattened_prompt in blend.prompts: @@ -60,7 +60,8 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n normalize=blend.normalize_weights) else: flattened_prompt: FlattenedPrompt = parsed_prompt - wants_cross_attention_control = any([issubclass(type(x), CrossAttentionControlledFragment) for x in flattened_prompt.children]) + wants_cross_attention_control = type(flattened_prompt) is not Blend \ + and any([issubclass(type(x), CrossAttentionControlledFragment) for x in flattened_prompt.children]) if wants_cross_attention_control: original_prompt = FlattenedPrompt() edited_prompt = FlattenedPrompt() @@ -95,7 +96,7 @@ def build_token_edit_opcodes(original_tokens, edited_tokens): def build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt: FlattenedPrompt): if type(flattened_prompt) is not FlattenedPrompt: - raise f"embeddings can only be made from FlattenedPrompts, got {type(flattened_prompt)} instead" + raise Exception(f"embeddings can only be made from FlattenedPrompts, got {type(flattened_prompt)} instead") fragments = [x.text for x in flattened_prompt.children] weights = [x.weight for x in flattened_prompt.children] embeddings, tokens = model.get_learned_conditioning([fragments], return_tokens=True, fragment_weights=[weights]) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 1d5fb3c04a..9a7206bf42 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -308,7 +308,8 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) quotes = pp.Literal('"').suppress() # accepts int or float notation, always maps to float - number = pp.pyparsing_common.real | pp.Word(pp.nums).set_parse_action(pp.token_map(float)) + number = pp.pyparsing_common.real | \ + pp.Combine(pp.Optional("-")+pp.Word(pp.nums)).set_parse_action(pp.token_map(float)) greedy_word = pp.Word(pp.printables, exclude_chars=string.whitespace).set_name('greedy_word') attention = pp.Forward() @@ -498,12 +499,13 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) quoted_prompt = pp.dbl_quoted_string.set_parse_action(make_prompt_from_quoted_string) quoted_prompt.set_name('quoted_prompt') - blend_terms = pp.delimited_list(quoted_prompt).set_name('blend_terms') - blend_weights = pp.delimited_list(number).set_name('blend_weights') + debug_blend=True + blend_terms = pp.delimited_list(quoted_prompt).set_name('blend_terms').set_debug(debug_blend) + blend_weights = pp.delimited_list(number).set_name('blend_weights').set_debug(debug_blend) blend = pp.Group(lparen + pp.Group(blend_terms) + rparen + pp.Literal(".blend").suppress() + lparen + pp.Group(blend_weights) + rparen).set_name('blend') - blend.set_debug(False) + blend.set_debug(debug_blend) blend.set_parse_action(lambda x: Blend(prompts=x[0][0], weights=x[0][1])) diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 9f12283333..84971fcc52 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -153,6 +153,12 @@ class PromptParserTestCase(unittest.TestCase): parse_prompt("(\"fire\", \" , \").blend(0.7, 1)") ) + self.assertEqual( + Conjunction([Blend([FlattenedPrompt([('mountain, man, hairy', 1)]), + FlattenedPrompt([('face, teeth,', 1), ('eyes', 0.9*0.9)])], weights=[1.0,-1.0])]), + parse_prompt('("mountain, man, hairy", "face, teeth, --eyes").blend(1,-1)') + ) + def test_nested(self): self.assertEqual(make_weighted_conjunction([('fire', 1.0), ('flames', 2.0), ('trees', 3.0)]), From d9655401039630fa7ebee83c0a5b2efb95065a0b Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 04:23:19 +0200 Subject: [PATCH 030/124] more blend fixes --- ldm/invoke/conditioning.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index dd41869311..6a44986f8d 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -52,10 +52,10 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n blend: Blend = parsed_prompt embeddings_to_blend = None for flattened_prompt in blend.prompts: - this_embedding = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt) + this_embedding, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt) embeddings_to_blend = this_embedding if embeddings_to_blend is None else torch.cat( (embeddings_to_blend, this_embedding)) - conditioning, _ = WeightedFrozenCLIPEmbedder.apply_embedding_weights(embeddings_to_blend.unsqueeze(0), + conditioning = WeightedFrozenCLIPEmbedder.apply_embedding_weights(embeddings_to_blend.unsqueeze(0), blend.weights, normalize=blend.normalize_weights) else: From b385fdd7dec0f9207e1d7a2e2dcd94cc32bcd67b Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 04:34:53 +0200 Subject: [PATCH 031/124] non-normalized blend --- ldm/invoke/prompt_parser.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 9a7206bf42..39138e5364 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -187,7 +187,7 @@ class Blend(): self.normalize_weights = normalize_weights def __repr__(self): - return f"Blend:{self.prompts} | weights {self.weights}" + return f"Blend:{self.prompts} | weights {' ' if self.normalize_weights else '(non-normalized) '}{self.weights}" def __eq__(self, other): return other.__repr__() == self.__repr__() @@ -276,7 +276,7 @@ class PromptParser(): for prompt in node.prompts: # prompt is a list flattened_subprompts = flatten_internal(prompt, weight_scale, flattened_subprompts, prefix+'B ') - results += [Blend(prompts=flattened_subprompts, weights=node.weights)] + results += [Blend(prompts=flattened_subprompts, weights=node.weights, normalize_weights=node.normalize_weights)] elif type(node) is Prompt: #print(prefix + "about to flatten Prompt with children", node.children) flattened_prompt = [] @@ -501,14 +501,22 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) debug_blend=True blend_terms = pp.delimited_list(quoted_prompt).set_name('blend_terms').set_debug(debug_blend) - blend_weights = pp.delimited_list(number).set_name('blend_weights').set_debug(debug_blend) + blend_weights = (pp.delimited_list(number) + pp.Optional(pp.Char(",").suppress() + "no_normalize")).set_name('blend_weights').set_debug(debug_blend) blend = pp.Group(lparen + pp.Group(blend_terms) + rparen + pp.Literal(".blend").suppress() + lparen + pp.Group(blend_weights) + rparen).set_name('blend') blend.set_debug(debug_blend) + def make_blend(x): + prompts = x[0][0] + weights = x[0][1] + normalize = True + if weights[-1] == 'no_normalize': + normalize = False + weights = weights[:-1] + return Blend(prompts=prompts, weights=weights, normalize_weights=normalize) - blend.set_parse_action(lambda x: Blend(prompts=x[0][0], weights=x[0][1])) + blend.set_parse_action(make_blend) conjunction_terms = blend_terms.copy().set_name('conjunction_terms') conjunction_weights = blend_weights.copy().set_name('conjunction_weights') From dc2f30a34ed45df886bb73e29b24a819d34b6de2 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 11:59:42 +0200 Subject: [PATCH 032/124] put back txt2mask import --- ldm/generate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldm/generate.py b/ldm/generate.py index 39bcc28162..45ed2e73d1 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -35,7 +35,7 @@ from ldm.invoke.devices import choose_torch_device, choose_precision from ldm.invoke.conditioning import get_uc_and_c_and_ec from ldm.invoke.model_cache import ModelCache from ldm.invoke.seamless import configure_model_padding -#from ldm.invoke.txt2mask import Txt2Mask, SegmentedGrayscale +from ldm.invoke.txt2mask import Txt2Mask, SegmentedGrayscale def fix_func(orig): if hasattr(torch.backends, 'mps') and torch.backends.mps.is_available(): From 2bf9f1f0d80308a927ae717fc72f20733bc0c7a0 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 12:18:40 +0200 Subject: [PATCH 033/124] rename StrcuturedConditioning to ExtraConditioningInfo --- ldm/invoke/generator/img2img.py | 2 +- ldm/invoke/generator/txt2img.py | 2 +- ldm/invoke/generator/txt2img2img.py | 2 +- .../diffusion/shared_invokeai_diffusion.py | 33 +++++++++---------- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 6fa0d0c6dd..cfe3ff99bc 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -34,7 +34,7 @@ class Img2Img(Generator): t_enc = int(strength * steps) uc, c, ec, edit_opcodes = conditioning - extra_conditioning_info = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) + extra_conditioning_info = InvokeAIDiffuserComponent.ExtraConditioningInfo(edited_conditioning=ec, edit_opcodes=edit_opcodes) def make_image(x_T): # encode (scaled latent) diff --git a/ldm/invoke/generator/txt2img.py b/ldm/invoke/generator/txt2img.py index 657cccc592..7e739860c3 100644 --- a/ldm/invoke/generator/txt2img.py +++ b/ldm/invoke/generator/txt2img.py @@ -22,7 +22,7 @@ class Txt2Img(Generator): """ self.perlin = perlin uc, c, ec, edit_opcodes = conditioning - extra_conditioning_info = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) + extra_conditioning_info = InvokeAIDiffuserComponent.ExtraConditioningInfo(edited_conditioning=ec, edit_opcodes=edit_opcodes) @torch.no_grad() def make_image(x_T): diff --git a/ldm/invoke/generator/txt2img2img.py b/ldm/invoke/generator/txt2img2img.py index 64d0468418..2d67a44346 100644 --- a/ldm/invoke/generator/txt2img2img.py +++ b/ldm/invoke/generator/txt2img2img.py @@ -24,7 +24,7 @@ class Txt2Img2Img(Generator): kwargs are 'width' and 'height' """ uc, c, ec, edit_opcodes = conditioning - extra_conditioning_info = InvokeAIDiffuserComponent.StructuredConditioning(edited_conditioning=ec, edit_opcodes=edit_opcodes) + extra_conditioning_info = InvokeAIDiffuserComponent.ExtraConditioningInfo(edited_conditioning=ec, edit_opcodes=edit_opcodes) @torch.no_grad() def make_image(x_T): diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index 0a613091d5..290925fc8c 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -6,23 +6,6 @@ import torch class InvokeAIDiffuserComponent: - - class StructuredConditioning: - def __init__(self, edited_conditioning: torch.Tensor = None, edit_opcodes: list[tuple] = None): - """ - :param edited_conditioning: if doing cross-attention control, the edited conditioning (1 x 77 x 768) - :param edit_opcodes: if doing cross-attention control, opcodes from a SequenceMatcher describing how to map original conditioning tokens to edited conditioning tokens - """ - # TODO migrate conditioning and unconditioning here, too - #self.conditioning = conditioning - #self.unconditioning = unconditioning - self.edited_conditioning = edited_conditioning - self.edit_opcodes = edit_opcodes - - @property - def wants_cross_attention_control(self): - return self.edited_conditioning is not None - ''' The aim of this component is to provide a single place for code that can be applied identically to all InvokeAI diffusion procedures. @@ -31,6 +14,20 @@ class InvokeAIDiffuserComponent: * Cross Attention Control ("prompt2prompt") ''' + + class ExtraConditioningInfo: + def __init__(self, edited_conditioning: torch.Tensor = None, edit_opcodes: list[tuple] = None): + """ + :param edited_conditioning: if doing cross-attention control, the edited conditioning (1 x 77 x 768) + :param edit_opcodes: if doing cross-attention control, opcodes from a SequenceMatcher describing how to map original conditioning tokens to edited conditioning tokens + """ + self.edited_conditioning = edited_conditioning + self.edit_opcodes = edit_opcodes + + @property + def wants_cross_attention_control(self): + return self.edited_conditioning is not None + def __init__(self, model, model_forward_callback: Callable[[torch.Tensor, torch.Tensor, torch.Tensor], torch.Tensor]): """ :param model: the unet model to pass through to cross attention control @@ -40,7 +37,7 @@ class InvokeAIDiffuserComponent: self.model_forward_callback = model_forward_callback - def setup_cross_attention_control(self, conditioning: StructuredConditioning): + def setup_cross_attention_control(self, conditioning: ExtraConditioningInfo): self.conditioning = conditioning CrossAttentionControl.setup_cross_attention_control(self.model, conditioning.edited_conditioning, conditioning.edit_opcodes) From e574a1574f999ceb97b98f945346a6d63260035a Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 12:42:07 +0200 Subject: [PATCH 034/124] txt2mask.py now tracking development again --- ldm/invoke/txt2mask.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/ldm/invoke/txt2mask.py b/ldm/invoke/txt2mask.py index bc8251abde..01d93546e3 100644 --- a/ldm/invoke/txt2mask.py +++ b/ldm/invoke/txt2mask.py @@ -29,9 +29,9 @@ work fine. import torch import numpy as np -from clipseg_models.clipseg import CLIPDensePredT +from models.clipseg import CLIPDensePredT from einops import rearrange, repeat -from PIL import Image, ImageOps +from PIL import Image from torchvision import transforms CLIP_VERSION = 'ViT-B/16' @@ -50,14 +50,9 @@ class SegmentedGrayscale(object): discrete_heatmap = self.heatmap.lt(threshold).int() return self._rescale(Image.fromarray(np.uint8(discrete_heatmap*255),mode='L')) - def to_transparent(self,invert:bool=False)->Image: + def to_transparent(self)->Image: transparent_image = self.image.copy() - gs = self.to_grayscale() - # The following line looks like a bug, but isn't. - # For img2img, we want the selected regions to be transparent, - # but to_grayscale() returns the opposite. - gs = ImageOps.invert(gs) if not invert else gs - transparent_image.putalpha(gs) + transparent_image.putalpha(self.to_grayscale()) return transparent_image # unscales and uncrops the 352x352 heatmap so that it matches the image again @@ -84,7 +79,7 @@ class Txt2Mask(object): self.model.load_state_dict(torch.load(CLIPSEG_WEIGHTS, map_location=torch.device('cpu')), strict=False) @torch.no_grad() - def segment(self, image, prompt:str) -> SegmentedGrayscale: + def segment(self, image:Image, prompt:str) -> SegmentedGrayscale: ''' Given a prompt string such as "a bagel", tries to identify the object in the provided image and returns a SegmentedGrayscale object in which the brighter @@ -99,10 +94,6 @@ class Txt2Mask(object): transforms.Resize((CLIPSEG_SIZE, CLIPSEG_SIZE)), # must be multiple of 64... ]) - if type(image) is str: - image = Image.open(image).convert('RGB') - - image = ImageOps.exif_transpose(image) img = self._scale_and_crop(image) img = transform(img).unsqueeze(0) From 64051d081c320e964571fa7dd0ac63557d2cd5db Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Fri, 21 Oct 2022 15:07:11 +0200 Subject: [PATCH 035/124] cleanup --- backend/server.py | 2 +- cross_attention_loop.py | 186 -------------------------- ldm/invoke/generator/img2img.py | 3 +- ldm/invoke/txt2mask.py | 19 ++- ldm/models/diffusion/ddim.py | 3 +- ldm/modules/diffusionmodules/model.py | 10 +- 6 files changed, 22 insertions(+), 201 deletions(-) delete mode 100644 cross_attention_loop.py diff --git a/backend/server.py b/backend/server.py index f14c141e12..7b8a8a5a69 100644 --- a/backend/server.py +++ b/backend/server.py @@ -527,7 +527,7 @@ def parameters_to_generated_image_metadata(parameters): rfc_dict["sampler"] = parameters["sampler_name"] # display weighted subprompts (liable to change) - subprompts = split_weighted_subprompts(parameters["prompt"], skip_normalize=True) + subprompts = split_weighted_subprompts(parameters["prompt"]) subprompts = [{"prompt": x[0], "weight": x[1]} for x in subprompts] rfc_dict["prompt"] = subprompts diff --git a/cross_attention_loop.py b/cross_attention_loop.py deleted file mode 100644 index ed3e3b0462..0000000000 --- a/cross_attention_loop.py +++ /dev/null @@ -1,186 +0,0 @@ -import random -import traceback - -import numpy as np -import torch - -from diffusers import (LMSDiscreteScheduler) -from PIL import Image -from torch import autocast -from tqdm.auto import tqdm - -import .ldm.models.diffusion.cross_attention - - -@torch.no_grad() -def stablediffusion( - clip, - clip_tokenizer, - device, - vae, - unet, - prompt='', - prompt_edit=None, - prompt_edit_token_weights=None, - prompt_edit_tokens_start=0.0, - prompt_edit_tokens_end=1.0, - prompt_edit_spatial_start=0.0, - prompt_edit_spatial_end=1.0, - guidance_scale=7.5, - steps=50, - seed=None, - width=512, - height=512, - init_image=None, - init_image_strength=0.5, - ): - if prompt_edit_token_weights is None: - prompt_edit_token_weights = [] - # Change size to multiple of 64 to prevent size mismatches inside model - width = width - width % 64 - height = height - height % 64 - - # If seed is None, randomly select seed from 0 to 2^32-1 - if seed is None: seed = random.randrange(2**32 - 1) - generator = torch.manual_seed(seed) - - # Set inference timesteps to scheduler - scheduler = LMSDiscreteScheduler(beta_start=0.00085, - beta_end=0.012, - beta_schedule='scaled_linear', - num_train_timesteps=1000, - ) - scheduler.set_timesteps(steps) - - # Preprocess image if it exists (img2img) - if init_image is not None: - # Resize and transpose for numpy b h w c -> torch b c h w - init_image = init_image.resize((width, height), resample=Image.Resampling.LANCZOS) - init_image = np.array(init_image).astype(np.float32) / 255.0 * 2.0 - 1.0 - init_image = torch.from_numpy(init_image[np.newaxis, ...].transpose(0, 3, 1, 2)) - - # If there is alpha channel, composite alpha for white, as the diffusion - # model does not support alpha channel - if init_image.shape[1] > 3: - init_image = init_image[:, :3] * init_image[:, 3:] + (1 - init_image[:, 3:]) - - # Move image to GPU - init_image = init_image.to(device) - - # Encode image - with autocast(device): - init_latent = (vae.encode(init_image) - .latent_dist - .sample(generator=generator) - * 0.18215) - - t_start = steps - int(steps * init_image_strength) - - else: - init_latent = torch.zeros((1, unet.in_channels, height // 8, width // 8), - device=device) - t_start = 0 - - # Generate random normal noise - noise = torch.randn(init_latent.shape, generator=generator, device=device) - latent = scheduler.add_noise(init_latent, - noise, - torch.tensor([scheduler.timesteps[t_start]], device=device) - ).to(device) - - # Process clip - with autocast(device): - tokens_uncond = clip_tokenizer('', padding='max_length', - max_length=clip_tokenizer.model_max_length, - truncation=True, return_tensors='pt', - return_overflowing_tokens=True - ) - embedding_uncond = clip(tokens_uncond.input_ids.to(device)).last_hidden_state - - tokens_cond = clip_tokenizer(prompt, padding='max_length', - max_length=clip_tokenizer.model_max_length, - truncation=True, return_tensors='pt', - return_overflowing_tokens=True - ) - embedding_cond = clip(tokens_cond.input_ids.to(device)).last_hidden_state - - # Process prompt editing - if prompt_edit is not None: - tokens_cond_edit = clip_tokenizer(prompt_edit, padding='max_length', - max_length=clip_tokenizer.model_max_length, - truncation=True, return_tensors='pt', - return_overflowing_tokens=True - ) - embedding_cond_edit = clip(tokens_cond_edit.input_ids.to(device)).last_hidden_state - - c_a_c.init_attention_edit(tokens_cond, tokens_cond_edit) - - c_a_c.init_attention_func() - c_a_c.init_attention_weights(prompt_edit_token_weights) - - timesteps = scheduler.timesteps[t_start:] - - for idx, timestep in tqdm(enumerate(timesteps), total=len(timesteps)): - t_index = t_start + idx - - latent_model_input = latent - latent_model_input = scheduler.scale_model_input(latent_model_input, timestep) - - # Predict the unconditional noise residual - noise_pred_uncond = unet(latent_model_input, - timestep, - encoder_hidden_states=embedding_uncond - ).sample - - # Prepare the Cross-Attention layers - if prompt_edit is not None: - c_a_c.save_last_tokens_attention() - c_a_c.save_last_self_attention() - else: - # Use weights on non-edited prompt when edit is None - c_a_c.use_last_tokens_attention_weights() - - # Predict the conditional noise residual and save the - # cross-attention layer activations - noise_pred_cond = unet(latent_model_input, - timestep, - encoder_hidden_states=embedding_cond - ).sample - - # Edit the Cross-Attention layer activations - if prompt_edit is not None: - t_scale = timestep / scheduler.num_train_timesteps - if (t_scale >= prompt_edit_tokens_start - and t_scale <= prompt_edit_tokens_end): - c_a_c.use_last_tokens_attention() - if (t_scale >= prompt_edit_spatial_start - and t_scale <= prompt_edit_spatial_end): - c_a_c.use_last_self_attention() - - # Use weights on edited prompt - c_a_c.use_last_tokens_attention_weights() - - # Predict the edited conditional noise residual using the - # cross-attention masks - noise_pred_cond = unet(latent_model_input, - timestep, - encoder_hidden_states=embedding_cond_edit - ).sample - - # Perform guidance - noise_pred = (noise_pred_uncond + guidance_scale - * (noise_pred_cond - noise_pred_uncond)) - - latent = scheduler.step(noise_pred, - t_index, - latent - ).prev_sample - - # scale and decode the image latents with vae - latent = latent / 0.18215 - image = vae.decode(latent.to(vae.dtype)).sample - - image = (image / 2 + 0.5).clamp(0, 1) - image = image.cpu().permute(0, 2, 3, 1).numpy() - image = (image[0] * 255).round().astype('uint8') - return Image.fromarray(image) diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index cfe3ff99bc..2f5e6e61d0 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -51,9 +51,8 @@ class Img2Img(Generator): img_callback = step_callback, unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, - init_latent = self.init_latent, + init_latent = self.init_latent, # changes how noising is performed in ksampler extra_conditioning_info = extra_conditioning_info - # changes how noising is performed in ksampler ) return self.sample_to_image(samples) diff --git a/ldm/invoke/txt2mask.py b/ldm/invoke/txt2mask.py index 01d93546e3..bc8251abde 100644 --- a/ldm/invoke/txt2mask.py +++ b/ldm/invoke/txt2mask.py @@ -29,9 +29,9 @@ work fine. import torch import numpy as np -from models.clipseg import CLIPDensePredT +from clipseg_models.clipseg import CLIPDensePredT from einops import rearrange, repeat -from PIL import Image +from PIL import Image, ImageOps from torchvision import transforms CLIP_VERSION = 'ViT-B/16' @@ -50,9 +50,14 @@ class SegmentedGrayscale(object): discrete_heatmap = self.heatmap.lt(threshold).int() return self._rescale(Image.fromarray(np.uint8(discrete_heatmap*255),mode='L')) - def to_transparent(self)->Image: + def to_transparent(self,invert:bool=False)->Image: transparent_image = self.image.copy() - transparent_image.putalpha(self.to_grayscale()) + gs = self.to_grayscale() + # The following line looks like a bug, but isn't. + # For img2img, we want the selected regions to be transparent, + # but to_grayscale() returns the opposite. + gs = ImageOps.invert(gs) if not invert else gs + transparent_image.putalpha(gs) return transparent_image # unscales and uncrops the 352x352 heatmap so that it matches the image again @@ -79,7 +84,7 @@ class Txt2Mask(object): self.model.load_state_dict(torch.load(CLIPSEG_WEIGHTS, map_location=torch.device('cpu')), strict=False) @torch.no_grad() - def segment(self, image:Image, prompt:str) -> SegmentedGrayscale: + def segment(self, image, prompt:str) -> SegmentedGrayscale: ''' Given a prompt string such as "a bagel", tries to identify the object in the provided image and returns a SegmentedGrayscale object in which the brighter @@ -94,6 +99,10 @@ class Txt2Mask(object): transforms.Resize((CLIPSEG_SIZE, CLIPSEG_SIZE)), # must be multiple of 64... ]) + if type(image) is str: + image = Image.open(image).convert('RGB') + + image = ImageOps.exif_transpose(image) img = self._scale_and_crop(image) img = transform(img).unsqueeze(0) diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index 98219fb62e..71944a9b7e 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -1,5 +1,4 @@ """SAMPLING ONLY.""" -from typing import Union import torch from ldm.models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent @@ -29,7 +28,7 @@ class DDIMSampler(Sampler): def p_sample( self, x, - c: Union[torch.Tensor, list], + c, t, index, repeat_noise=False, diff --git a/ldm/modules/diffusionmodules/model.py b/ldm/modules/diffusionmodules/model.py index 73218d36f8..739710d006 100644 --- a/ldm/modules/diffusionmodules/model.py +++ b/ldm/modules/diffusionmodules/model.py @@ -8,7 +8,7 @@ import numpy as np from einops import rearrange from ldm.util import instantiate_from_config -#from ldm.modules.attention import LinearAttention +from ldm.modules.attention import LinearAttention import psutil @@ -151,10 +151,10 @@ class ResnetBlock(nn.Module): return x + h -#class LinAttnBlock(LinearAttention): -# """to match AttnBlock usage""" -# def __init__(self, in_channels): -# super().__init__(dim=in_channels, heads=1, dim_head=in_channels) +class LinAttnBlock(LinearAttention): + """to match AttnBlock usage""" + def __init__(self, in_channels): + super().__init__(dim=in_channels, heads=1, dim_head=in_channels) class AttnBlock(nn.Module): From ee7d4d712a9ab52a08dc5d1ce62c6b5a69f379e5 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sat, 22 Oct 2022 11:27:56 +0200 Subject: [PATCH 036/124] parsing CrossAttentionControlSubstitute options works --- ldm/invoke/prompt_parser.py | 42 +++++++++++++++++++++++++++++-------- tests/test_prompt_parser.py | 17 ++++++++++++++- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 39138e5364..f5b369bc48 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -118,16 +118,27 @@ class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): Fragment('sitting on a car') ]) """ - def __init__(self, original: Union[Fragment, list], edited: Union[Fragment, list]): + def __init__(self, original: Union[Fragment, list], edited: Union[Fragment, list], options: dict=None): self.original = original self.edited = edited + default_options = { + 's_start': 0.0, + 's_end': 1.0, + 't_start': 0.0, + 't_end': 1.0 + } + merged_options = default_options + if options is not None: + merged_options.update(options) + self.options = merged_options def __repr__(self): - return f"CrossAttentionControlSubstitute:({self.original}->{self.edited})" + return f"CrossAttentionControlSubstitute:({self.original}->{self.edited} ({self.options})" def __eq__(self, other): return type(other) is CrossAttentionControlSubstitute \ and other.original == self.original \ - and other.edited == self.edited + and other.edited == self.edited \ + and other.options == self.options class CrossAttentionControlAppend(CrossAttentionControlledFragment): @@ -239,7 +250,7 @@ class PromptParser(): if type(x) is CrossAttentionControlSubstitute: original_fused = fuse_fragments(x.original) edited_fused = fuse_fragments(x.edited) - result.append(CrossAttentionControlSubstitute(original_fused, edited_fused)) + result.append(CrossAttentionControlSubstitute(original_fused, edited_fused, options=x.options)) else: last_weight = result[-1].weight \ if (len(result) > 0 and not issubclass(type(result[-1]), CrossAttentionControlledFragment)) \ @@ -269,7 +280,7 @@ class PromptParser(): elif type(node) is CrossAttentionControlSubstitute: original = flatten_internal(node.original, weight_scale, [], prefix + ' CAo ') edited = flatten_internal(node.edited, weight_scale, [], prefix + ' CAe ') - results += [CrossAttentionControlSubstitute(original, edited)] + results += [CrossAttentionControlSubstitute(original, edited, options=node.options)] elif type(node) is Blend: flattened_subprompts = [] #print(" flattening blend with prompts", node.prompts, "weights", node.weights) @@ -306,6 +317,7 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) lparen = pp.Literal("(").suppress() rparen = pp.Literal(")").suppress() quotes = pp.Literal('"').suppress() + comma = pp.Literal(",").suppress() # accepts int or float notation, always maps to float number = pp.pyparsing_common.real | \ @@ -443,7 +455,18 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) parenthesized_fragment.set_debug(debug_cross_attention_control), pp.Word(pp.printables, exclude_chars=string.whitespace + '.').set_parse_action(make_text_fragment) + pp.FollowedBy(".swap") ]) - edited_fragment = parenthesized_fragment + # support keyword=number arguments + cross_attention_option_keyword = pp.Or([pp.Keyword("s_start"), pp.Keyword("s_end"), pp.Keyword("t_start"), pp.Keyword("t_end")]) + cross_attention_option = pp.Group(cross_attention_option_keyword + pp.Literal("=").suppress() + number) + edited_fragment = pp.MatchFirst([ + lparen + + (quoted_fragment | + pp.Group(pp.Word(pp.printables, exclude_chars=string.whitespace + ',').set_parse_action(make_text_fragment)) + ) + + pp.Dict(pp.OneOrMore(comma + cross_attention_option)) + + rparen, + parenthesized_fragment + ]) cross_attention_substitute << original_fragment + pp.Literal(".swap").suppress() + edited_fragment original_fragment.set_name('original_fragment').set_debug(debug_cross_attention_control) @@ -451,9 +474,10 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) cross_attention_substitute.set_name('cross_attention_substitute').set_debug(debug_cross_attention_control) def make_cross_attention_substitute(x): - #print("making cacs for", x) - cacs = CrossAttentionControlSubstitute(x[0], x[1]) - #print("made", cacs) + print("making cacs for", x[0], "->", x[1], "with options", x.as_dict()) + #if len(x>2): + cacs = CrossAttentionControlSubstitute(x[0], x[1], options=x.as_dict()) + print("made", cacs) return cacs cross_attention_substitute.set_parse_action(make_cross_attention_substitute) diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 84971fcc52..02644012d8 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -247,7 +247,22 @@ class PromptParserTestCase(unittest.TestCase): Fragment(',', 1), Fragment('fire', 2.0)])]) self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(fire 0.5(flames))".swap("0.7(trees) houses"), 2.0(fire)')) - + def test_cross_attention_control_options(self): + self.assertEqual(Conjunction([ + FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat', 1)], [Fragment('dog', 1)], options={'s_start':0.1}), + Fragment('eating a hotdog', 1)])]), + parse_prompt("a \"cat\".swap(dog, s_start=0.1) eating a hotdog")) + self.assertEqual(Conjunction([ + FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat', 1)], [Fragment('dog', 1)], options={'t_start':0.1}), + Fragment('eating a hotdog', 1)])]), + parse_prompt("a \"cat\".swap(dog, t_start=0.1) eating a hotdog")) + self.assertEqual(Conjunction([ + FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat', 1)], [Fragment('dog', 1)], options={'s_start': 20.0, 't_start':0.1}), + Fragment('eating a hotdog', 1)])]), + parse_prompt("a \"cat\".swap(dog, t_start=0.1, s_start=20) eating a hotdog")) def test_escaping(self): From 8273c04575dfb62653888e42125df447bbec93e6 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sat, 22 Oct 2022 12:15:34 +0200 Subject: [PATCH 037/124] wip implementing options in diffuse step --- ldm/invoke/conditioning.py | 38 ++++++++++++++++++++++++++++++--- ldm/modules/encoders/modules.py | 15 +++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 6a44986f8d..924ea39c77 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -16,7 +16,8 @@ from typing import Union import torch from .prompt_parser import PromptParser, Blend, FlattenedPrompt, \ - CrossAttentionControlledFragment, CrossAttentionControlSubstitute, CrossAttentionControlAppend + CrossAttentionControlledFragment, CrossAttentionControlSubstitute, CrossAttentionControlAppend, Fragment +from ..models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent from ..modules.encoders.modules import WeightedFrozenCLIPEmbedder @@ -65,27 +66,54 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n if wants_cross_attention_control: original_prompt = FlattenedPrompt() edited_prompt = FlattenedPrompt() + # for name, a0, a1, b0, b1 in edit_opcodes: only name == 'equal' is currently parsed + original_token_count = 0 + edited_token_count = 0 + edit_opcodes = [] + edit_options = [] for fragment in flattened_prompt.children: if type(fragment) is CrossAttentionControlSubstitute: original_prompt.append(fragment.original) edited_prompt.append(fragment.edited) + + to_replace_token_count = get_tokens_length(model, fragment.original) + replacement_token_count = get_tokens_length(model, fragment.edited) + edit_opcodes.append(('replace', + original_token_count, original_token_count + to_replace_token_count, + edited_token_count, edited_token_count + replacement_token_count + )) + original_token_count += to_replace_token_count + edited_token_count += replacement_token_count + edit_options.append(fragment.options) #elif type(fragment) is CrossAttentionControlAppend: # edited_prompt.append(fragment.fragment) else: # regular fragment original_prompt.append(fragment) edited_prompt.append(fragment) + + count = get_tokens_length(model, [fragment]) + edit_opcodes.append(('equal', original_token_count, original_token_count+count, edited_token_count, edited_token_count+count)) + edit_options.append(None) + original_token_count += count + edited_token_count += count original_embeddings, original_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, original_prompt) edited_embeddings, edited_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, edited_prompt) conditioning = original_embeddings edited_conditioning = edited_embeddings - edit_opcodes = build_token_edit_opcodes(original_tokens, edited_tokens) + print('got edit_opcodes', edit_opcodes, 'options', edit_options) else: conditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt) + unconditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, parsed_negative_prompt) - return (unconditioning, conditioning, edited_conditioning, edit_opcodes) + return ( + unconditioning, conditioning, edited_conditioning, edit_opcodes + #InvokeAIDiffuserComponent.ExtraConditioningInfo(edited_conditioning=edited_conditioning, + # edit_opcodes=edit_opcodes, + # edit_options=edit_options) + ) def build_token_edit_opcodes(original_tokens, edited_tokens): @@ -102,6 +130,10 @@ def build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt: Fl embeddings, tokens = model.get_learned_conditioning([fragments], return_tokens=True, fragment_weights=[weights]) return embeddings, tokens +def get_tokens_length(model, fragments: list[Fragment]): + fragment_texts = [x.text for x in fragments] + tokens = model.cond_stage_model.get_tokens(fragment_texts, include_start_and_end_markers=False) + return sum([len(x) for x in tokens]) def split_weighted_subprompts(text, skip_normalize=False)->list: diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 2883f24d1a..8917a27a40 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -557,6 +557,21 @@ class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): else: return batch_z + def get_tokens(self, fragments: list[str], include_start_and_end_markers: bool = True) -> list[list[int]]: + tokens = self.tokenizer( + fragments, + truncation=True, + max_length=self.max_length, + return_overflowing_tokens=False, + padding='do_not_pad', + return_tensors=None, # just give me a list of ints + )['input_ids'] + if include_start_and_end_markers: + return tokens + else: + return [x[1:-1] for x in tokens] + + @classmethod def apply_embedding_weights(self, embeddings: torch.Tensor, per_embedding_weights: list[float], normalize:bool) -> torch.Tensor: per_embedding_weights = torch.tensor(per_embedding_weights, dtype=embeddings.dtype, device=embeddings.device) From 3e48b9ff85fc9cce5010fa733969a70341a7cf66 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Sat, 22 Oct 2022 23:02:50 -0400 Subject: [PATCH 038/124] cut over from karras to model noise schedule for higher steps The k_samplers come with a "karras" noise schedule which performs very well at low step counts but becomes noisy at higher ones. This commit introduces a threshold (currently 30 steps) at which the k samplers will switch over from using karras to the older model noise schedule. --- ldm/models/diffusion/ksampler.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index ac0615b30c..677e051be7 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -12,6 +12,10 @@ from ldm.modules.diffusionmodules.util import ( extract_into_tensor, ) +# at this threshold, the scheduler will stop using the Karras +# noise schedule and start using the model's schedule +STEP_THRESHOLD = 30 + def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): if threshold <= 0.0: return result @@ -98,8 +102,13 @@ class KSampler(Sampler): rho=7., device=self.device, ) - self.sigmas = self.model_sigmas - #self.sigmas = self.karras_sigmas + + if ddim_num_steps >= STEP_THRESHOLD: + print(f'>> number of steps ({ddim_num_steps}) >= {STEP_THRESHOLD}: using model sigmas') + self.sigmas = self.model_sigmas + else: + print(f'>> number of steps ({ddim_num_steps}) < {STEP_THRESHOLD}: using karras sigmas') + self.sigmas = self.karras_sigmas # ALERT: We are completely overriding the sample() method in the base class, which # means that inpainting will not work. To get this to work we need to be able to From 7d677a63b834dcff98d7db25ef6a9c0e293cd953 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 23 Oct 2022 14:58:25 +0200 Subject: [PATCH 039/124] cross attention control options --- ldm/generate.py | 8 +- ldm/invoke/conditioning.py | 22 +- ldm/invoke/generator/img2img.py | 3 +- ldm/invoke/generator/inpaint.py | 2 +- ldm/invoke/generator/txt2img.py | 3 +- ldm/invoke/generator/txt2img2img.py | 3 +- .../diffusion/cross_attention_control.py | 236 +++++++++++++ ldm/models/diffusion/ddim.py | 9 +- ldm/models/diffusion/ksampler.py | 6 +- ldm/models/diffusion/plms.py | 11 +- ldm/models/diffusion/sampler.py | 1 + .../diffusion/shared_invokeai_diffusion.py | 313 +++--------------- 12 files changed, 318 insertions(+), 299 deletions(-) create mode 100644 ldm/models/diffusion/cross_attention_control.py diff --git a/ldm/generate.py b/ldm/generate.py index f83a732816..39f0b06759 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -400,7 +400,7 @@ class Generate: mask_image = None try: - uc, c, ec, ec_index_map = get_uc_and_c_and_ec( + uc, c, extra_conditioning_info = get_uc_and_c_and_ec( prompt, model =self.model, skip_normalize=skip_normalize, log_tokens =self.log_tokenization @@ -438,7 +438,7 @@ class Generate: sampler=self.sampler, steps=steps, cfg_scale=cfg_scale, - conditioning=(uc, c, ec, ec_index_map), + conditioning=(uc, c, extra_conditioning_info), ddim_eta=ddim_eta, image_callback=image_callback, # called after the final image is generated step_callback=step_callback, # called after each intermediate image is generated @@ -541,8 +541,8 @@ class Generate: image = Image.open(image_path) # used by multiple postfixers - # todo: cross-attention - uc, c, _, _ = get_uc_and_c_and_ec( + # todo: cross-attention control + uc, c, _ = get_uc_and_c_and_ec( prompt, model =self.model, skip_normalize=opt.skip_normalize, log_tokens =opt.log_tokenization diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 924ea39c77..52d40312ac 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -17,6 +17,7 @@ import torch from .prompt_parser import PromptParser, Blend, FlattenedPrompt, \ CrossAttentionControlledFragment, CrossAttentionControlSubstitute, CrossAttentionControlAppend, Fragment +from ..models.diffusion.cross_attention_control import CrossAttentionControl from ..models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent from ..modules.encoders.modules import WeightedFrozenCLIPEmbedder @@ -46,8 +47,7 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n print("parsed prompt to", parsed_prompt) conditioning = None - edited_conditioning = None - edit_opcodes = None + cac_args:CrossAttentionControl.Arguments = None if type(parsed_prompt) is Blend: blend: Blend = parsed_prompt @@ -98,21 +98,31 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n original_token_count += count edited_token_count += count original_embeddings, original_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, original_prompt) + # naïvely building a single edited_embeddings like this disregards the effects of changing the absolute location of + # subsequent tokens when there is >1 edit and earlier edits change the total token count. + # eg "a cat.swap(smiling dog, s_start=0.5) eating a hotdog.swap(pizza)" - when the 'pizza' edit is active but the + # 'cat' edit is not, the 'pizza' feature vector will nevertheless be affected by the introduction of the extra + # token 'smiling' in the inactive 'cat' edit. + # todo: build multiple edited_embeddings, one for each edit, and pass just the edited fragments through to the CrossAttentionControl functions edited_embeddings, edited_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, edited_prompt) conditioning = original_embeddings edited_conditioning = edited_embeddings print('got edit_opcodes', edit_opcodes, 'options', edit_options) + cac_args = CrossAttentionControl.Arguments( + edited_conditioning = edited_conditioning, + edit_opcodes = edit_opcodes, + edit_options = edit_options + ) else: conditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt) unconditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, parsed_negative_prompt) return ( - unconditioning, conditioning, edited_conditioning, edit_opcodes - #InvokeAIDiffuserComponent.ExtraConditioningInfo(edited_conditioning=edited_conditioning, - # edit_opcodes=edit_opcodes, - # edit_options=edit_options) + unconditioning, conditioning, InvokeAIDiffuserComponent.ExtraConditioningInfo( + cross_attention_control_args=cac_args + ) ) diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 2f5e6e61d0..4942bcc0c3 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -33,8 +33,7 @@ class Img2Img(Generator): ) # move to latent space t_enc = int(strength * steps) - uc, c, ec, edit_opcodes = conditioning - extra_conditioning_info = InvokeAIDiffuserComponent.ExtraConditioningInfo(edited_conditioning=ec, edit_opcodes=edit_opcodes) + uc, c, extra_conditioning_info = conditioning def make_image(x_T): # encode (scaled latent) diff --git a/ldm/invoke/generator/inpaint.py b/ldm/invoke/generator/inpaint.py index 8f01b4ad2d..25bbc7e017 100644 --- a/ldm/invoke/generator/inpaint.py +++ b/ldm/invoke/generator/inpaint.py @@ -46,7 +46,7 @@ class Inpaint(Img2Img): t_enc = int(strength * steps) # todo: support cross-attention control - uc, c, _, _ = conditioning + uc, c, _ = conditioning print(f">> target t_enc is {t_enc} steps") diff --git a/ldm/invoke/generator/txt2img.py b/ldm/invoke/generator/txt2img.py index 7e739860c3..696cc06f78 100644 --- a/ldm/invoke/generator/txt2img.py +++ b/ldm/invoke/generator/txt2img.py @@ -21,8 +21,7 @@ class Txt2Img(Generator): kwargs are 'width' and 'height' """ self.perlin = perlin - uc, c, ec, edit_opcodes = conditioning - extra_conditioning_info = InvokeAIDiffuserComponent.ExtraConditioningInfo(edited_conditioning=ec, edit_opcodes=edit_opcodes) + uc, c, extra_conditioning_info = conditioning @torch.no_grad() def make_image(x_T): diff --git a/ldm/invoke/generator/txt2img2img.py b/ldm/invoke/generator/txt2img2img.py index 2d67a44346..5808f7bdb2 100644 --- a/ldm/invoke/generator/txt2img2img.py +++ b/ldm/invoke/generator/txt2img2img.py @@ -23,8 +23,7 @@ class Txt2Img2Img(Generator): Return value depends on the seed at the time you call it kwargs are 'width' and 'height' """ - uc, c, ec, edit_opcodes = conditioning - extra_conditioning_info = InvokeAIDiffuserComponent.ExtraConditioningInfo(edited_conditioning=ec, edit_opcodes=edit_opcodes) + uc, c, extra_conditioing_info = conditioning @torch.no_grad() def make_image(x_T): diff --git a/ldm/models/diffusion/cross_attention_control.py b/ldm/models/diffusion/cross_attention_control.py new file mode 100644 index 0000000000..905803ccfa --- /dev/null +++ b/ldm/models/diffusion/cross_attention_control.py @@ -0,0 +1,236 @@ +from enum import Enum + +import torch + +# adapted from bloc97's CrossAttentionControl colab +# https://github.com/bloc97/CrossAttentionControl + +class CrossAttentionControl: + + class Arguments: + def __init__(self, edited_conditioning: torch.Tensor, edit_opcodes: list[tuple], edit_options: dict): + """ + :param edited_conditioning: if doing cross-attention control, the edited conditioning [1 x 77 x 768] + :param edit_opcodes: if doing cross-attention control, a list of difflib.SequenceMatcher-like opcodes describing how to map original conditioning tokens to edited conditioning tokens (only the 'equal' opcode is required) + :param edit_options: if doing cross-attention control, per-edit options. there should be 1 item in edit_options for each item in edit_opcodes. + """ + # todo: rewrite this to take embedding fragments rather than a single edited_conditioning vector + self.edited_conditioning = edited_conditioning + self.edit_opcodes = edit_opcodes + + if edited_conditioning is not None: + assert len(edit_opcodes) == len(edit_options), \ + "there must be 1 edit_options dict for each edit_opcodes tuple" + non_none_edit_options = [x for x in edit_options if x is not None] + assert len(non_none_edit_options)>0, "missing edit_options" + if len(non_none_edit_options)>1: + print('warning: cross-attention control options are not working properly for >1 edit') + self.edit_options = non_none_edit_options[0] + + class Context: + def __init__(self, arguments: 'CrossAttentionControl.Arguments', step_count: int): + self.arguments = arguments + self.step_count = step_count + + @classmethod + def remove_cross_attention_control(cls, model): + cls.remove_attention_function(model) + + @classmethod + def setup_cross_attention_control(cls, model, + cross_attention_control_args: Arguments + ): + """ + Inject attention parameters and functions into the passed in model to enable cross attention editing. + + :param model: The unet model to inject into. + :param cross_attention_control_args: Arugments passeed to the CrossAttentionControl implementations + :return: None + """ + + # adapted from init_attention_edit + device = cross_attention_control_args.edited_conditioning.device + + # urgh. should this be hardcoded? + max_length = 77 + # mask=1 means use base prompt attention, mask=0 means use edited prompt attention + mask = torch.zeros(max_length) + indices_target = torch.arange(max_length, dtype=torch.long) + indices = torch.zeros(max_length, dtype=torch.long) + for name, a0, a1, b0, b1 in cross_attention_control_args.edit_opcodes: + if b0 < max_length: + if name == "equal":# or (name == "replace" and a1 - a0 == b1 - b0): + # these tokens have not been edited + indices[b0:b1] = indices_target[a0:a1] + mask[b0:b1] = 1 + + for m in cls.get_attention_modules(model, cls.CrossAttentionType.SELF): + m.last_attn_slice_mask = None + m.last_attn_slice_indices = None + + for m in cls.get_attention_modules(model, cls.CrossAttentionType.TOKENS): + m.last_attn_slice_mask = mask.to(device) + m.last_attn_slice_indices = indices.to(device) + + cls.inject_attention_function(model) + + + class CrossAttentionType(Enum): + SELF = 1 + TOKENS = 2 + + @classmethod + def get_active_cross_attention_control_types_for_step(cls, context: 'CrossAttentionControl.Context', step_index:int=None)\ + -> list['CrossAttentionControl.CrossAttentionType']: + """ + Should cross-attention control be applied on the given step? + :param step_index: The step index (counts upwards from 0), or None if unknown. + :return: A list of attention types that cross-attention control should be performed for on the given step. May be []. + """ + if step_index is None: + return [cls.CrossAttentionType.SELF, cls.CrossAttentionType.TOKENS] + + opts = context.arguments.edit_options + # percent_through will never reach 1.0 (but this is intended) + percent_through = float(step_index)/float(context.step_count) + to_control = [] + if opts['s_start'] <= percent_through and percent_through < opts['s_end']: + to_control.append(cls.CrossAttentionType.SELF) + if opts['t_start'] <= percent_through and percent_through < opts['t_end']: + to_control.append(cls.CrossAttentionType.TOKENS) + return to_control + + + @classmethod + def get_attention_modules(cls, model, which: CrossAttentionType): + which_attn = "attn1" if which is cls.CrossAttentionType.SELF else "attn2" + return [module for name, module in model.named_modules() if + type(module).__name__ == "CrossAttention" and which_attn in name] + + @classmethod + def clear_requests(cls, model): + self_attention_modules = cls.get_attention_modules(model, cls.CrossAttentionType.SELF) + tokens_attention_modules = cls.get_attention_modules(model, cls.CrossAttentionType.TOKENS) + for m in self_attention_modules+tokens_attention_modules: + m.save_last_attn_slice = False + m.use_last_attn_slice = False + + @classmethod + def request_save_attention_maps(cls, model, cross_attention_type: CrossAttentionType): + modules = cls.get_attention_modules(model, cross_attention_type) + for m in modules: + # clear out the saved slice in case the outermost dim changes + m.last_attn_slice = None + m.save_last_attn_slice = True + + @classmethod + def request_apply_saved_attention_maps(cls, model, cross_attention_type: CrossAttentionType): + modules = cls.get_attention_modules(model, cross_attention_type) + for m in modules: + m.use_last_attn_slice = True + + + + @classmethod + def inject_attention_function(cls, unet): + # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 + + def attention_slice_wrangler(self, attention_scores, suggested_attention_slice, dim, offset, slice_size): + + #print("in wrangler with suggested_attention_slice shape", suggested_attention_slice.shape, "dim", dim) + + attn_slice = suggested_attention_slice + if dim is not None: + start = offset + end = start+slice_size + #print(f"in wrangler, sliced dim {dim} {start}-{end}, use_last_attn_slice is {self.use_last_attn_slice}, save_last_attn_slice is {self.save_last_attn_slice}") + #else: + # print(f"in wrangler, whole, use_last_attn_slice is {self.use_last_attn_slice}, save_last_attn_slice is {self.save_last_attn_slice}") + + + if self.use_last_attn_slice: + this_attn_slice = attn_slice + if self.last_attn_slice_mask is not None: + # indices and mask operate on dim=2, no need to slice + base_attn_slice_full = torch.index_select(self.last_attn_slice, -1, self.last_attn_slice_indices) + base_attn_slice_mask = self.last_attn_slice_mask + if dim is None: + base_attn_slice = base_attn_slice_full + #print("using whole base slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) + elif dim == 0: + base_attn_slice = base_attn_slice_full[start:end] + #print("using base dim 0 slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) + elif dim == 1: + base_attn_slice = base_attn_slice_full[:, start:end] + #print("using base dim 1 slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) + + attn_slice = this_attn_slice * (1 - base_attn_slice_mask) + \ + base_attn_slice * base_attn_slice_mask + else: + if dim is None: + attn_slice = self.last_attn_slice + #print("took whole slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) + elif dim == 0: + attn_slice = self.last_attn_slice[start:end] + #print("took dim 0 slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) + elif dim == 1: + attn_slice = self.last_attn_slice[:, start:end] + #print("took dim 1 slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) + + if self.save_last_attn_slice: + if dim is None: + self.last_attn_slice = attn_slice + elif dim == 0: + # dynamically grow last_attn_slice if needed + if self.last_attn_slice is None: + self.last_attn_slice = attn_slice + #print("no last_attn_slice: shape now", self.last_attn_slice.shape) + elif self.last_attn_slice.shape[0] == start: + self.last_attn_slice = torch.cat([self.last_attn_slice, attn_slice], dim=0) + assert(self.last_attn_slice.shape[0] == end) + #print("last_attn_slice too small, appended dim 0 shape", attn_slice.shape, ", shape now", self.last_attn_slice.shape) + else: + # no need to grow + self.last_attn_slice[start:end] = attn_slice + #print("last_attn_slice shape is fine, setting dim 0 shape", attn_slice.shape, ", shape now", self.last_attn_slice.shape) + + elif dim == 1: + # dynamically grow last_attn_slice if needed + if self.last_attn_slice is None: + self.last_attn_slice = attn_slice + elif self.last_attn_slice.shape[1] == start: + self.last_attn_slice = torch.cat([self.last_attn_slice, attn_slice], dim=1) + assert(self.last_attn_slice.shape[1] == end) + else: + # no need to grow + self.last_attn_slice[:, start:end] = attn_slice + + if self.use_last_attn_weights and self.last_attn_slice_weights is not None: + if dim is None: + weights = self.last_attn_slice_weights + elif dim == 0: + weights = self.last_attn_slice_weights[start:end] + elif dim == 1: + weights = self.last_attn_slice_weights[:, start:end] + attn_slice = attn_slice * weights + + return attn_slice + + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == "CrossAttention": + module.last_attn_slice = None + module.last_attn_slice_indices = None + module.last_attn_slice_mask = None + module.use_last_attn_weights = False + module.use_last_attn_slice = False + module.save_last_attn_slice = False + module.set_attention_slice_wrangler(attention_slice_wrangler) + + @classmethod + def remove_attention_function(cls, unet): + for name, module in unet.named_modules(): + module_name = type(module).__name__ + if module_name == "CrossAttention": + module.set_attention_slice_wrangler(None) + diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index 71944a9b7e..5b5dfaf4af 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -18,7 +18,7 @@ class DDIMSampler(Sampler): extra_conditioning_info = kwargs.get('extra_conditioning_info', None) if extra_conditioning_info is not None and extra_conditioning_info.wants_cross_attention_control: - self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info) + self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info, step_count = t_enc) else: self.invokeai_diffuser.remove_cross_attention_control() @@ -40,6 +40,7 @@ class DDIMSampler(Sampler): corrector_kwargs=None, unconditional_guidance_scale=1.0, unconditional_conditioning=None, + step_count:int=1000, # total number of steps **kwargs, ): b, *_, device = *x.shape, x.device @@ -51,7 +52,11 @@ class DDIMSampler(Sampler): # damian0815 would like to know when/if this code path is used e_t = self.model.apply_model(x, t, c) else: - e_t = self.invokeai_diffuser.do_diffusion_step(x, t, unconditional_conditioning, c, unconditional_guidance_scale) + step_index = step_count-(index+1) + e_t = self.invokeai_diffuser.do_diffusion_step(x, t, + unconditional_conditioning, c, + unconditional_guidance_scale, + step_index=step_index) if score_corrector is not None: assert self.model.parameterization == 'eps' diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 44e418acb1..7bf48c62e8 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -37,14 +37,14 @@ class CFGDenoiser(nn.Module): extra_conditioning_info = kwargs.get('extra_conditioning_info', None) if extra_conditioning_info is not None and extra_conditioning_info.wants_cross_attention_control: - self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info) + self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info, step_count = t_enc) else: self.invokeai_diffuser.remove_cross_attention_control() - def forward(self, x, sigma, uncond, cond, cond_scale): + def forward(self, x, sigma, uncond, cond, cond_scale, step_index): - next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale) + next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale, step_index) # apply threshold if self.warmup < self.warmup_max: diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index f58e2c3220..5b4674f28d 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -23,7 +23,7 @@ class PLMSSampler(Sampler): extra_conditioning_info = kwargs.get('extra_conditioning_info', None) if extra_conditioning_info is not None and extra_conditioning_info.wants_cross_attention_control: - self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info) + self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info, step_count = t_enc) else: self.invokeai_diffuser.remove_cross_attention_control() @@ -47,6 +47,7 @@ class PLMSSampler(Sampler): unconditional_conditioning=None, old_eps=[], t_next=None, + step_count:int=1000, # total number of steps **kwargs, ): b, *_, device = *x.shape, x.device @@ -59,7 +60,13 @@ class PLMSSampler(Sampler): # damian0815 would like to know when/if this code path is used e_t = self.model.apply_model(x, t, c) else: - e_t = self.invokeai_diffuser.do_diffusion_step(x, t, unconditional_conditioning, c, unconditional_guidance_scale) + # step_index is expected to count up while index counts down + step_index = step_count-(index+1) + # note that step_index == 0 is evaluated twice with different x + e_t = self.invokeai_diffuser.do_diffusion_step(x, t, + unconditional_conditioning, c, + unconditional_guidance_scale, + step_index=step_index) if score_corrector is not None: assert self.model.parameterization == 'eps' diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index e33d57fe31..8099997bb3 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -278,6 +278,7 @@ class Sampler(object): unconditional_conditioning=unconditional_conditioning, old_eps=old_eps, t_next=ts_next, + step_count=steps ) img, pred_x0, e_t = outs diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index 290925fc8c..507feacaa9 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -1,9 +1,11 @@ from enum import Enum from math import ceil -from typing import Callable +from typing import Callable, Optional import torch +from ldm.models.diffusion.cross_attention_control import CrossAttentionControl + class InvokeAIDiffuserComponent: ''' @@ -16,19 +18,16 @@ class InvokeAIDiffuserComponent: class ExtraConditioningInfo: - def __init__(self, edited_conditioning: torch.Tensor = None, edit_opcodes: list[tuple] = None): - """ - :param edited_conditioning: if doing cross-attention control, the edited conditioning (1 x 77 x 768) - :param edit_opcodes: if doing cross-attention control, opcodes from a SequenceMatcher describing how to map original conditioning tokens to edited conditioning tokens - """ - self.edited_conditioning = edited_conditioning - self.edit_opcodes = edit_opcodes + def __init__(self, cross_attention_control_args: Optional[CrossAttentionControl.Arguments]): + self.cross_attention_control_args = cross_attention_control_args @property def wants_cross_attention_control(self): - return self.edited_conditioning is not None + return self.cross_attention_control_args is not None - def __init__(self, model, model_forward_callback: Callable[[torch.Tensor, torch.Tensor, torch.Tensor], torch.Tensor]): + def __init__(self, model, model_forward_callback: + Callable[[torch.Tensor, torch.Tensor, torch.Tensor], torch.Tensor] + ): """ :param model: the unet model to pass through to cross attention control :param model_forward_callback: a lambda with arguments (x, sigma, conditioning_to_apply). will be called repeatedly. most likely, this should simply call model.forward(x, sigma, conditioning) @@ -37,44 +36,53 @@ class InvokeAIDiffuserComponent: self.model_forward_callback = model_forward_callback - def setup_cross_attention_control(self, conditioning: ExtraConditioningInfo): + def setup_cross_attention_control(self, conditioning: ExtraConditioningInfo, step_count: int): self.conditioning = conditioning - CrossAttentionControl.setup_cross_attention_control(self.model, conditioning.edited_conditioning, conditioning.edit_opcodes) + self.cross_attention_control_context = CrossAttentionControl.Context( + arguments=self.conditioning.cross_attention_control_args, + step_count=step_count + ) + CrossAttentionControl.setup_cross_attention_control(self.model, + cross_attention_control_args=self.conditioning.cross_attention_control_args + ) + #todo: refactor edited_conditioning, edit_opcodes, edit_options into a struct + #todo: apply edit_options using step_count + def remove_cross_attention_control(self): self.conditioning = None + self.cross_attention_control_context = None CrossAttentionControl.remove_cross_attention_control(self.model) - @property - def edited_conditioning(self): - if self.conditioning is None: - return None - else: - return self.conditioning.edited_conditioning - def do_diffusion_step(self, x: torch.Tensor, sigma: torch.Tensor, unconditioning: torch.Tensor, conditioning: torch.Tensor, - unconditional_guidance_scale: float): + unconditional_guidance_scale: float, + step_index: int=None): """ :param x: Current latents :param sigma: aka t, passed to the internal model to control how much denoising will occur :param unconditioning: [B x 77 x 768] embeddings for unconditioned output :param conditioning: [B x 77 x 768] embeddings for conditioned output :param unconditional_guidance_scale: aka CFG scale, controls how much effect the conditioning tensor has - :param model: the unet model to pass through to cross attention control - :param model_forward_callback: a lambda with arguments (x, sigma, conditioning_to_apply). will be called repeatedly. most likely, this should simply call model.forward(x, sigma, conditioning) - :return: the new latents after applying the model to x using unconditioning and CFG-scaled conditioning. + :param step_index: Counts upwards from 0 to (step_count-1) (as passed to setup_cross_attention_control, if using). May be called multiple times for a single step, therefore do not assume that its value will monotically increase. + :return: the new latents after applying the model to x using unscaled unconditioning and CFG-scaled conditioning. """ CrossAttentionControl.clear_requests(self.model) + cross_attention_control_types_to_do = [] - if self.edited_conditioning is None: + if self.cross_attention_control_context is not None: + cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, step_index) + + if len(cross_attention_control_types_to_do)==0: + print('step', step_index, ': not doing cross attention control') # faster batched path x_twice = torch.cat([x]*2) sigma_twice = torch.cat([sigma]*2) both_conditionings = torch.cat([unconditioning, conditioning]) unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) else: + print('step', step_index, ': doing cross attention control on', cross_attention_control_types_to_do) # slower non-batched path (20% slower on mac MPS) # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. @@ -86,13 +94,16 @@ class InvokeAIDiffuserComponent: unconditioned_next_x = self.model_forward_callback(x, sigma, unconditioning) # process x using the original prompt, saving the attention maps - CrossAttentionControl.request_save_attention_maps(self.model) + for type in cross_attention_control_types_to_do: + CrossAttentionControl.request_save_attention_maps(self.model, type) _ = self.model_forward_callback(x, sigma, conditioning) CrossAttentionControl.clear_requests(self.model) # process x again, using the saved attention maps to control where self.edited_conditioning will be applied - CrossAttentionControl.request_apply_saved_attention_maps(self.model) - conditioned_next_x = self.model_forward_callback(x, sigma, self.edited_conditioning) + for type in cross_attention_control_types_to_do: + CrossAttentionControl.request_apply_saved_attention_maps(self.model, type) + edited_conditioning = self.conditioning.cross_attention_control_args.edited_conditioning + conditioned_next_x = self.model_forward_callback(x, sigma, edited_conditioning) CrossAttentionControl.clear_requests(self.model) @@ -102,7 +113,6 @@ class InvokeAIDiffuserComponent: return combined_next_x - # todo: make this work @classmethod def apply_conjunction(cls, x, t, forward_func, uc, c_or_weighted_c_list, global_guidance_scale): @@ -153,250 +163,3 @@ class InvokeAIDiffuserComponent: return uncond_latents + deltas_merged * global_guidance_scale - -# adapted from bloc97's CrossAttentionControl colab -# https://github.com/bloc97/CrossAttentionControl - -class CrossAttentionControl: - - - @classmethod - def remove_cross_attention_control(cls, model): - cls.remove_attention_function(model) - - @classmethod - def setup_cross_attention_control(cls, model, - substitute_conditioning: torch.Tensor, - edit_opcodes: list): - """ - Inject attention parameters and functions into the passed in model to enable cross attention editing. - - :param model: The unet model to inject into. - :param substitute_conditioning: The "edited" conditioning vector, [Bx77x768] - :param edit_opcodes: Opcodes from difflib.SequenceMatcher describing how the base - conditionings map to the "edited" conditionings. - :return: - """ - - # adapted from init_attention_edit - device = substitute_conditioning.device - - # urgh. should this be hardcoded? - max_length = 77 - # mask=1 means use base prompt attention, mask=0 means use edited prompt attention - mask = torch.zeros(max_length) - indices_target = torch.arange(max_length, dtype=torch.long) - indices = torch.zeros(max_length, dtype=torch.long) - for name, a0, a1, b0, b1 in edit_opcodes: - if b0 < max_length: - if name == "equal":# or (name == "replace" and a1 - a0 == b1 - b0): - # these tokens have not been edited - indices[b0:b1] = indices_target[a0:a1] - mask[b0:b1] = 1 - - for m in cls.get_attention_modules(model, cls.AttentionType.SELF): - m.last_attn_slice_mask = None - m.last_attn_slice_indices = None - - for m in cls.get_attention_modules(model, cls.AttentionType.TOKENS): - m.last_attn_slice_mask = mask.to(device) - m.last_attn_slice_indices = indices.to(device) - - cls.inject_attention_function(model) - - - class AttentionType(Enum): - SELF = 1 - TOKENS = 2 - - - @classmethod - def get_attention_modules(cls, model, which: AttentionType): - which_attn = "attn1" if which is cls.AttentionType.SELF else "attn2" - return [module for name, module in model.named_modules() if - type(module).__name__ == "CrossAttention" and which_attn in name] - - @classmethod - def clear_requests(cls, model): - self_attention_modules = cls.get_attention_modules(model, cls.AttentionType.SELF) - tokens_attention_modules = cls.get_attention_modules(model, cls.AttentionType.TOKENS) - for m in self_attention_modules+tokens_attention_modules: - m.save_last_attn_slice = False - m.use_last_attn_slice = False - - @classmethod - def request_save_attention_maps(cls, model): - self_attention_modules = cls.get_attention_modules(model, cls.AttentionType.SELF) - tokens_attention_modules = cls.get_attention_modules(model, cls.AttentionType.TOKENS) - for m in self_attention_modules+tokens_attention_modules: - # clear out the saved slice in case the outermost dim changes - m.last_attn_slice = None - m.save_last_attn_slice = True - - @classmethod - def request_apply_saved_attention_maps(cls, model): - self_attention_modules = cls.get_attention_modules(model, cls.AttentionType.SELF) - tokens_attention_modules = cls.get_attention_modules(model, cls.AttentionType.TOKENS) - for m in self_attention_modules+tokens_attention_modules: - m.use_last_attn_slice = True - - - - @classmethod - def inject_attention_function(cls, unet): - # ORIGINAL SOURCE CODE: https://github.com/huggingface/diffusers/blob/91ddd2a25b848df0fa1262d4f1cd98c7ccb87750/src/diffusers/models/attention.py#L276 - - def attention_slice_wrangler(self, attention_scores, suggested_attention_slice, dim, offset, slice_size): - - #print("in wrangler with suggested_attention_slice shape", suggested_attention_slice.shape, "dim", dim) - - attn_slice = suggested_attention_slice - if dim is not None: - start = offset - end = start+slice_size - #print(f"in wrangler, sliced dim {dim} {start}-{end}, use_last_attn_slice is {self.use_last_attn_slice}, save_last_attn_slice is {self.save_last_attn_slice}") - #else: - # print(f"in wrangler, whole, use_last_attn_slice is {self.use_last_attn_slice}, save_last_attn_slice is {self.save_last_attn_slice}") - - - if self.use_last_attn_slice: - this_attn_slice = attn_slice - if self.last_attn_slice_mask is not None: - # indices and mask operate on dim=2, no need to slice - base_attn_slice_full = torch.index_select(self.last_attn_slice, -1, self.last_attn_slice_indices) - base_attn_slice_mask = self.last_attn_slice_mask - if dim is None: - base_attn_slice = base_attn_slice_full - #print("using whole base slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) - elif dim == 0: - base_attn_slice = base_attn_slice_full[start:end] - #print("using base dim 0 slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) - elif dim == 1: - base_attn_slice = base_attn_slice_full[:, start:end] - #print("using base dim 1 slice of shape", base_attn_slice.shape, "from complete shape", base_attn_slice_full.shape) - - attn_slice = this_attn_slice * (1 - base_attn_slice_mask) + \ - base_attn_slice * base_attn_slice_mask - else: - if dim is None: - attn_slice = self.last_attn_slice - #print("took whole slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) - elif dim == 0: - attn_slice = self.last_attn_slice[start:end] - #print("took dim 0 slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) - elif dim == 1: - attn_slice = self.last_attn_slice[:, start:end] - #print("took dim 1 slice of shape", attn_slice.shape, "from complete shape", self.last_attn_slice.shape) - - if self.save_last_attn_slice: - if dim is None: - self.last_attn_slice = attn_slice - elif dim == 0: - # dynamically grow last_attn_slice if needed - if self.last_attn_slice is None: - self.last_attn_slice = attn_slice - #print("no last_attn_slice: shape now", self.last_attn_slice.shape) - elif self.last_attn_slice.shape[0] == start: - self.last_attn_slice = torch.cat([self.last_attn_slice, attn_slice], dim=0) - assert(self.last_attn_slice.shape[0] == end) - #print("last_attn_slice too small, appended dim 0 shape", attn_slice.shape, ", shape now", self.last_attn_slice.shape) - else: - # no need to grow - self.last_attn_slice[start:end] = attn_slice - #print("last_attn_slice shape is fine, setting dim 0 shape", attn_slice.shape, ", shape now", self.last_attn_slice.shape) - - elif dim == 1: - # dynamically grow last_attn_slice if needed - if self.last_attn_slice is None: - self.last_attn_slice = attn_slice - elif self.last_attn_slice.shape[1] == start: - self.last_attn_slice = torch.cat([self.last_attn_slice, attn_slice], dim=1) - assert(self.last_attn_slice.shape[1] == end) - else: - # no need to grow - self.last_attn_slice[:, start:end] = attn_slice - - if self.use_last_attn_weights and self.last_attn_slice_weights is not None: - if dim is None: - weights = self.last_attn_slice_weights - elif dim == 0: - weights = self.last_attn_slice_weights[start:end] - elif dim == 1: - weights = self.last_attn_slice_weights[:, start:end] - attn_slice = attn_slice * weights - - return attn_slice - - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == "CrossAttention": - module.last_attn_slice = None - module.last_attn_slice_indices = None - module.last_attn_slice_mask = None - module.use_last_attn_weights = False - module.use_last_attn_slice = False - module.save_last_attn_slice = False - module.set_attention_slice_wrangler(attention_slice_wrangler) - - @classmethod - def remove_attention_function(cls, unet): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == "CrossAttention": - module.set_attention_slice_wrangler(None) - - -# original code below - -# Functions supporting Cross-Attention Control -# Copied from https://github.com/bloc97/CrossAttentionControl - -from difflib import SequenceMatcher - -import torch - - -def prompt_token(prompt, index, clip_tokenizer): - tokens = clip_tokenizer(prompt, - padding='max_length', - max_length=clip_tokenizer.model_max_length, - truncation=True, - return_tensors='pt', - return_overflowing_tokens=True - ).input_ids[0] - return clip_tokenizer.decode(tokens[index:index + 1]) - - -def use_last_tokens_attention(unet, use=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn2' in name: - module.use_last_attn_slice = use - - -def use_last_tokens_attention_weights(unet, use=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn2' in name: - module.use_last_attn_weights = use - - -def use_last_self_attention(unet, use=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn1' in name: - module.use_last_attn_slice = use - - -def save_last_tokens_attention(unet, save=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn2' in name: - module.save_last_attn_slice = save - - -def save_last_self_attention(unet, save=True): - for name, module in unet.named_modules(): - module_name = type(module).__name__ - if module_name == 'CrossAttention' and 'attn1' in name: - module.save_last_attn_slice = save From 04d93f044514096274911fa2878a5b0467823ac3 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 23 Oct 2022 16:26:50 +0200 Subject: [PATCH 040/124] for k* samplers, estimate step_index from sigma --- ldm/models/diffusion/cross_attention_control.py | 8 +++----- ldm/models/diffusion/ksampler.py | 4 ++-- ldm/models/diffusion/plms.py | 3 +-- ldm/models/diffusion/shared_invokeai_diffusion.py | 15 +++++++++++++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/ldm/models/diffusion/cross_attention_control.py b/ldm/models/diffusion/cross_attention_control.py index 905803ccfa..6e873f1c6d 100644 --- a/ldm/models/diffusion/cross_attention_control.py +++ b/ldm/models/diffusion/cross_attention_control.py @@ -80,19 +80,17 @@ class CrossAttentionControl: TOKENS = 2 @classmethod - def get_active_cross_attention_control_types_for_step(cls, context: 'CrossAttentionControl.Context', step_index:int=None)\ + def get_active_cross_attention_control_types_for_step(cls, context: 'CrossAttentionControl.Context', percent_through:float=None)\ -> list['CrossAttentionControl.CrossAttentionType']: """ Should cross-attention control be applied on the given step? - :param step_index: The step index (counts upwards from 0), or None if unknown. + :param percent_through: How far through the step sequence are we (0.0=pure noise, 1.0=completely denoised image). Expected range 0.0..<1.0. :return: A list of attention types that cross-attention control should be performed for on the given step. May be []. """ - if step_index is None: + if percent_through is None: return [cls.CrossAttentionType.SELF, cls.CrossAttentionType.TOKENS] opts = context.arguments.edit_options - # percent_through will never reach 1.0 (but this is intended) - percent_through = float(step_index)/float(context.step_count) to_control = [] if opts['s_start'] <= percent_through and percent_through < opts['s_end']: to_control.append(cls.CrossAttentionType.SELF) diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 7bf48c62e8..2f5bf53850 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -42,9 +42,9 @@ class CFGDenoiser(nn.Module): self.invokeai_diffuser.remove_cross_attention_control() - def forward(self, x, sigma, uncond, cond, cond_scale, step_index): + def forward(self, x, sigma, uncond, cond, cond_scale): - next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale, step_index) + next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale) # apply threshold if self.warmup < self.warmup_max: diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index 5b4674f28d..40c2631bcd 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -60,9 +60,8 @@ class PLMSSampler(Sampler): # damian0815 would like to know when/if this code path is used e_t = self.model.apply_model(x, t, c) else: - # step_index is expected to count up while index counts down + # step_index counts in the opposite direction to index step_index = step_count-(index+1) - # note that step_index == 0 is evaluated twice with different x e_t = self.invokeai_diffuser.do_diffusion_step(x, t, unconditional_conditioning, c, unconditional_guidance_scale, diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index 507feacaa9..56550094a8 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -57,7 +57,8 @@ class InvokeAIDiffuserComponent: def do_diffusion_step(self, x: torch.Tensor, sigma: torch.Tensor, unconditioning: torch.Tensor, conditioning: torch.Tensor, unconditional_guidance_scale: float, - step_index: int=None): + step_index: int=None + ): """ :param x: Current latents :param sigma: aka t, passed to the internal model to control how much denoising will occur @@ -72,7 +73,17 @@ class InvokeAIDiffuserComponent: cross_attention_control_types_to_do = [] if self.cross_attention_control_context is not None: - cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, step_index) + if step_index is not None: + # percent_through will never reach 1.0 (but this is intended) + percent_through = float(step_index) / float(self.cross_attention_control_context.step_count) + else: + # find the current sigma in the sigma sequence + sigma_index = torch.nonzero(self.model.sigmas <= sigma)[-1] + # flip because sigmas[0] is for the fully denoised image + # percent_through must be <1 + percent_through = 1.0 - float(sigma_index.item() + 1) / float(self.model.sigmas.shape[0]) + print('estimated percent_through', percent_through, 'from sigma', sigma) + cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, percent_through) if len(cross_attention_control_types_to_do)==0: print('step', step_index, ': not doing cross attention control') From 8f35819ddf86543916d48f3d68a4dab2fb92d23b Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 23 Oct 2022 19:38:31 +0200 Subject: [PATCH 041/124] add shape_freedom arg to .swap() --- ldm/invoke/prompt_parser.py | 16 +++++++++++++++- .../diffusion/shared_invokeai_diffusion.py | 5 +++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index f5b369bc48..e8d43b8afd 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -1,3 +1,4 @@ +import math import string from typing import Union @@ -121,15 +122,28 @@ class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): def __init__(self, original: Union[Fragment, list], edited: Union[Fragment, list], options: dict=None): self.original = original self.edited = edited + default_options = { 's_start': 0.0, - 's_end': 1.0, + 's_end': 0.3, # gives best results 't_start': 0.0, 't_end': 1.0 } merged_options = default_options if options is not None: + shape_freedom = options.pop('shape_freedom', None) + if shape_freedom is not None: + # high shape freedom = SD can do what it wants with the shape of the object + # high shape freedom => s_end = 0 + # low shape freedom => s_end = 1 + # shape freedom is in a "linear" space, while noticeable changes to s_end are typically closer around 0, + # and there is very little perceptible difference as s_end increases above 0.5 + # so for shape_freedom = 0.5 we probably want s_end to be 0.2 + # -> cube root and subtract from 1.0 + merged_options.s_end = 1.0 - math.cbrt(shape_freedom) + print('converted shape_freedom argument to', merged_options) merged_options.update(options) + self.options = merged_options def __repr__(self): diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index 56550094a8..85b594b8f7 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -78,6 +78,7 @@ class InvokeAIDiffuserComponent: percent_through = float(step_index) / float(self.cross_attention_control_context.step_count) else: # find the current sigma in the sigma sequence + # todo: this doesn't work with k_dpm_2 because the sigma used jumps around in the sequence sigma_index = torch.nonzero(self.model.sigmas <= sigma)[-1] # flip because sigmas[0] is for the fully denoised image # percent_through must be <1 @@ -86,14 +87,14 @@ class InvokeAIDiffuserComponent: cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, percent_through) if len(cross_attention_control_types_to_do)==0: - print('step', step_index, ': not doing cross attention control') + #print('step', step_index, ': not doing cross attention control') # faster batched path x_twice = torch.cat([x]*2) sigma_twice = torch.cat([sigma]*2) both_conditionings = torch.cat([unconditioning, conditioning]) unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) else: - print('step', step_index, ': doing cross attention control on', cross_attention_control_types_to_do) + #print('step', step_index, ': doing cross attention control on', cross_attention_control_types_to_do) # slower non-batched path (20% slower on mac MPS) # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. From 9210bf7d3af0f6d7657cb00a476cad0ef1cb9422 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 23 Oct 2022 19:40:00 +0200 Subject: [PATCH 042/124] also parse shape_freedom keyword --- ldm/invoke/prompt_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index e8d43b8afd..7cf638dfa5 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -470,7 +470,7 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) pp.Word(pp.printables, exclude_chars=string.whitespace + '.').set_parse_action(make_text_fragment) + pp.FollowedBy(".swap") ]) # support keyword=number arguments - cross_attention_option_keyword = pp.Or([pp.Keyword("s_start"), pp.Keyword("s_end"), pp.Keyword("t_start"), pp.Keyword("t_end")]) + cross_attention_option_keyword = pp.Or([pp.Keyword("s_start"), pp.Keyword("s_end"), pp.Keyword("t_start"), pp.Keyword("t_end"), pp.Keyword("shape_freedom")]) cross_attention_option = pp.Group(cross_attention_option_keyword + pp.Literal("=").suppress() + number) edited_fragment = pp.MatchFirst([ lparen + From 8e7d744c6053617d7c0ab1a3ed30cfe48af24d02 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 23 Oct 2022 19:43:35 +0200 Subject: [PATCH 043/124] fix bad math --- ldm/invoke/prompt_parser.py | 3 +-- ldm/models/diffusion/shared_invokeai_diffusion.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 7cf638dfa5..56b6bc7c42 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -1,4 +1,3 @@ -import math import string from typing import Union @@ -140,7 +139,7 @@ class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): # and there is very little perceptible difference as s_end increases above 0.5 # so for shape_freedom = 0.5 we probably want s_end to be 0.2 # -> cube root and subtract from 1.0 - merged_options.s_end = 1.0 - math.cbrt(shape_freedom) + merged_options['s_end'] = 1.0 - shape_freedom ** (1. / 3.) print('converted shape_freedom argument to', merged_options) merged_options.update(options) diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index 85b594b8f7..c14e71be8d 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -1,4 +1,3 @@ -from enum import Enum from math import ceil from typing import Callable, Optional @@ -83,7 +82,7 @@ class InvokeAIDiffuserComponent: # flip because sigmas[0] is for the fully denoised image # percent_through must be <1 percent_through = 1.0 - float(sigma_index.item() + 1) / float(self.model.sigmas.shape[0]) - print('estimated percent_through', percent_through, 'from sigma', sigma) + print('estimated percent_through', percent_through, 'from sigma', sigma.item()) cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, percent_through) if len(cross_attention_control_types_to_do)==0: From f7cd98c2386c770d3ef0422be2b258caebfc5573 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 23 Oct 2022 20:38:28 +0200 Subject: [PATCH 044/124] tweak default cross-attention values --- ldm/invoke/prompt_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 56b6bc7c42..d5ebd18dfc 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -124,7 +124,7 @@ class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): default_options = { 's_start': 0.0, - 's_end': 0.3, # gives best results + 's_end': 0.206, # ~= shape_freedom=0.5 't_start': 0.0, 't_end': 1.0 } From b0eb864a259149cca1667dc6ddc0c136062d251f Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Sun, 23 Oct 2022 23:01:53 +0200 Subject: [PATCH 045/124] move attention weighting operations to postfix --- ldm/invoke/prompt_parser.py | 112 +++++++++++++++----------- tests/test_prompt_parser.py | 152 +++++++++++++++++++----------------- 2 files changed, 147 insertions(+), 117 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index d5ebd18dfc..48d08a7908 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -353,9 +353,34 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) else: raise PromptParser.ParsingException("Cannot make fragment from " + str(x)) + def build_escaped_word_parser(escaped_chars_to_ignore: str): + terms = [] + for c in escaped_chars_to_ignore: + terms.append(pp.Literal('\\'+c)) + terms.append( + #pp.CharsNotIn(string.whitespace + escaped_chars_to_ignore, exact=1) + pp.Word(pp.printables, exclude_chars=string.whitespace + escaped_chars_to_ignore) + ) + return pp.Combine(pp.OneOrMore( + pp.MatchFirst(terms) + )) + + def build_escaped_word_parser_charbychar(escaped_chars_to_ignore: str): + escapes = [] + for c in escaped_chars_to_ignore: + escapes.append(pp.Literal('\\'+c)) + return pp.Combine(pp.OneOrMore( + pp.MatchFirst(escapes + [pp.CharsNotIn( + string.whitespace + escaped_chars_to_ignore, + exact=1 + )]) + )) + + + def parse_fragment_str(x, in_quotes: bool=False, in_parens: bool=False): + #print(f"parsing fragment string \"{x}\"") fragment_string = x[0] - #print(f"parsing fragment string \"{fragment_string}\"") if len(fragment_string.strip()) == 0: return Fragment('') @@ -401,59 +426,55 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) parenthesized_fragment.set_name('parenthesized_fragment').set_debug(False) debug_attention = False - # attention control of the form +(phrase) / -(phrase) / (phrase) + # attention control of the form (phrase)+ / (phrase)+ / (phrase) # phrase can be multiple words, can have multiple +/- signs to increase the effect or type a floating point or integer weight - attention_head = (number | pp.Word('+') | pp.Word('-'))\ - .set_name("attention_head")\ - .set_debug(False) - word_inside_attention = pp.Combine(pp.OneOrMore( - pp.Literal('\\)') | pp.Literal('\\(') | pp.Literal('\\"') | - pp.Word(pp.printables, exclude_chars=string.whitespace + '\\()"') - )).set_name('word_inside_attention') attention_with_parens = pp.Forward() + attention_without_parens = pp.Forward() - attention_with_parens_delimited_list = pp.OneOrMore(pp.Or([ - quoted_fragment.copy().set_debug(debug_attention), - attention.copy().set_debug(debug_attention), - cross_attention_substitute, - word_inside_attention.set_debug(debug_attention) - #pp.White() - ]).set_name('delim_inner').set_debug(debug_attention)) - # have to disable ignore_expr here to prevent pyparsing from stripping off quote marks - attention_with_parens_body = pp.nested_expr(content=attention_with_parens_delimited_list, - ignore_expr=None#((pp.Literal("\\(") | pp.Literal('\\)'))) - ) - attention_with_parens_body.set_debug(debug_attention) - attention_with_parens << (attention_head + attention_with_parens_body) + attention_with_parens_foot = (number | pp.Word('+') | pp.Word('-'))\ + .set_name("attention_foot")\ + .set_debug(False) + attention_with_parens <<= pp.Group( + lparen + + pp.ZeroOrMore(quoted_fragment | attention_with_parens | parenthesized_fragment | cross_attention_substitute | attention_without_parens | + (pp.Empty() + build_escaped_word_parser_charbychar('()')).set_name('undecorated_word').set_debug(debug_attention)#.set_parse_action(lambda t: t[0]) + ) + + rparen + attention_with_parens_foot) attention_with_parens.set_name('attention_with_parens').set_debug(debug_attention) - attention_without_parens = (pp.Word('+') | pp.Word('-')) + (quoted_fragment | word_inside_attention) + attention_without_parens_foot = pp.Or(pp.Word('+') | pp.Word('-')).set_name('attention_without_parens_foots') + attention_without_parens <<= pp.Group( + (quoted_fragment.copy().set_name('attention_quoted_fragment_without_parens').set_debug(debug_attention) + attention_without_parens_foot) | + pp.Combine(build_escaped_word_parser_charbychar('()+-')).set_name('attention_word_without_parens').set_debug(debug_attention)#.set_parse_action(lambda x: print('escapéd', x)) + + attention_without_parens_foot)#.leave_whitespace() attention_without_parens.set_name('attention_without_parens').set_debug(debug_attention) - attention << (attention_with_parens | attention_without_parens) + + attention << pp.MatchFirst([attention_with_parens, + attention_without_parens + ]) attention.set_name('attention') def make_attention(x): - #print("making Attention from", x) - weight = 1 - # number(str) - if type(x[0]) is float or type(x[0]) is int: - weight = float(x[0]) - # +(str) or -(str) or +str or -str - elif type(x[0]) is str: - base = attention_plus_base if x[0][0] == '+' else attention_minus_base - weight = pow(base, len(x[0])) - if type(x[1]) is list or type(x[1]) is pp.ParseResults: - return Attention(weight=weight, children=[(Fragment(x) if type(x) is str else x) for x in x[1]]) - elif type(x[1]) is str: - return Attention(weight=weight, children=[Fragment(x[1])]) - elif type(x[1]) is Fragment: - return Attention(weight=weight, children=[x[1]]) - raise PromptParser.ParsingException(f"Don't know how to make attention with children {x[1]}") + #print("entered make_attention with", x) + children = x[0][:-1] + weight_raw = x[0][-1] + weight = 1.0 + if type(weight_raw) is float or type(weight_raw) is int: + weight = weight_raw + elif type(weight_raw) is str: + base = attention_plus_base if weight_raw[0] == '+' else attention_minus_base + weight = pow(base, len(weight_raw)) + + #print("making Attention from", children, "with weight", weight) + + return Attention(weight=weight, children=[(Fragment(x) if type(x) is str else x) for x in children]) attention_with_parens.set_parse_action(make_attention) attention_without_parens.set_parse_action(make_attention) + #print("parsing test:", attention_with_parens.parse_string("mountain (man)1.1")) + # cross-attention control empty_string = ((lparen + rparen) | pp.Literal('""').suppress() | @@ -487,10 +508,10 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) cross_attention_substitute.set_name('cross_attention_substitute').set_debug(debug_cross_attention_control) def make_cross_attention_substitute(x): - print("making cacs for", x[0], "->", x[1], "with options", x.as_dict()) + #print("making cacs for", x[0], "->", x[1], "with options", x.as_dict()) #if len(x>2): cacs = CrossAttentionControlSubstitute(x[0], x[1], options=x.as_dict()) - print("made", cacs) + #print("made", cacs) return cacs cross_attention_substitute.set_parse_action(make_cross_attention_substitute) @@ -511,10 +532,11 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) (quotes + pp.ZeroOrMore(pp.Word(string.whitespace)) + quotes)).set_debug(False).set_name('empty') # root prompt definition - prompt = ((pp.OneOrMore(prompt_part | quoted_fragment) | empty) + pp.StringEnd()) \ + prompt = (pp.OneOrMore(pp.Or([prompt_part, quoted_fragment, empty])) + pp.StringEnd()) \ .set_parse_action(lambda x: Prompt(x)) - + #print("parsing test:", prompt.parse_string("spaced eyes--")) + #print("parsing test:", prompt.parse_string("eyes--")) # weighted blend of prompts # ("promptA", "promptB").blend(a, b) where "promptA" and "promptB" are valid prompts and a and b are float or @@ -536,7 +558,7 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) quoted_prompt = pp.dbl_quoted_string.set_parse_action(make_prompt_from_quoted_string) quoted_prompt.set_name('quoted_prompt') - debug_blend=True + debug_blend=False blend_terms = pp.delimited_list(quoted_prompt).set_name('blend_terms').set_debug(debug_blend) blend_weights = (pp.delimited_list(number) + pp.Optional(pp.Char(",").suppress() + "no_normalize")).set_name('blend_weights').set_debug(debug_blend) blend = pp.Group(lparen + pp.Group(blend_terms) + rparen diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 02644012d8..203b95ddf0 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -34,27 +34,28 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(make_weighted_conjunction([("fire, flames , fire", 1)]), parse_prompt("fire, flames , fire")) def test_attention(self): - self.assertEqual(make_weighted_conjunction([('flames', 0.5)]), parse_prompt("0.5(flames)")) - self.assertEqual(make_weighted_conjunction([('fire flames', 0.5)]), parse_prompt("0.5(fire flames)")) - self.assertEqual(make_weighted_conjunction([('flames', 1.1)]), parse_prompt("+(flames)")) - self.assertEqual(make_weighted_conjunction([('flames', 0.9)]), parse_prompt("-(flames)")) - self.assertEqual(make_weighted_conjunction([('fire', 1), ('flames', 0.5)]), parse_prompt("fire 0.5(flames)")) - self.assertEqual(make_weighted_conjunction([('flames', pow(1.1, 2))]), parse_prompt("++(flames)")) - self.assertEqual(make_weighted_conjunction([('flames', pow(0.9, 2))]), parse_prompt("--(flames)")) - self.assertEqual(make_weighted_conjunction([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))]), parse_prompt("---(flowers) +++flames")) - self.assertEqual(make_weighted_conjunction([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))]), parse_prompt("---(flowers) +++flames")) - self.assertEqual(make_weighted_conjunction([('flowers', pow(0.9, 3)), ('flames+', pow(1.1, 3))]), - parse_prompt("---(flowers) +++flames+")) + self.assertEqual(make_weighted_conjunction([('flames', 0.5)]), parse_prompt("(flames)0.5")) + self.assertEqual(make_weighted_conjunction([('fire flames', 0.5)]), parse_prompt("(fire flames)0.5")) + self.assertEqual(make_weighted_conjunction([('flames', 1.1)]), parse_prompt("(flames)+")) + self.assertEqual(make_weighted_conjunction([('flames', 1.1)]), parse_prompt("flames+")) + self.assertEqual(make_weighted_conjunction([('flames', 1.1)]), parse_prompt("\"flames\"+")) + self.assertEqual(make_weighted_conjunction([('flames', 0.9)]), parse_prompt("(flames)-")) + self.assertEqual(make_weighted_conjunction([('flames', 0.9)]), parse_prompt("flames-")) + self.assertEqual(make_weighted_conjunction([('flames', 0.9)]), parse_prompt("\"flames\"-")) + self.assertEqual(make_weighted_conjunction([('fire', 1), ('flames', 0.5)]), parse_prompt("fire (flames)0.5")) + self.assertEqual(make_weighted_conjunction([('flames', pow(1.1, 2))]), parse_prompt("(flames)++")) + self.assertEqual(make_weighted_conjunction([('flames', pow(0.9, 2))]), parse_prompt("(flames)--")) + self.assertEqual(make_weighted_conjunction([('flowers', pow(0.9, 3)), ('flames', pow(1.1, 3))]), parse_prompt("(flowers)--- flames+++")) self.assertEqual(make_weighted_conjunction([('pretty flowers', 1.1)]), - parse_prompt("+(pretty flowers)")) + parse_prompt("(pretty flowers)+")) self.assertEqual(make_weighted_conjunction([('pretty flowers', 1.1), (', the flames are too hot', 1)]), - parse_prompt("+(pretty flowers), the flames are too hot")) + parse_prompt("(pretty flowers)+, the flames are too hot")) def test_no_parens_attention_runon(self): - self.assertEqual(make_weighted_conjunction([('fire', pow(1.1, 2)), ('flames', 1.0)]), parse_prompt("++fire flames")) - self.assertEqual(make_weighted_conjunction([('fire', pow(0.9, 2)), ('flames', 1.0)]), parse_prompt("--fire flames")) - self.assertEqual(make_weighted_conjunction([('flowers', 1.0), ('fire', pow(1.1, 2)), ('flames', 1.0)]), parse_prompt("flowers ++fire flames")) - self.assertEqual(make_weighted_conjunction([('flowers', 1.0), ('fire', pow(0.9, 2)), ('flames', 1.0)]), parse_prompt("flowers --fire flames")) + self.assertEqual(make_weighted_conjunction([('fire', 1.0), ('flames', pow(1.1, 2))]), parse_prompt("fire flames++")) + self.assertEqual(make_weighted_conjunction([('fire', 1.0), ('flames', pow(0.9, 2))]), parse_prompt("fire flames--")) + self.assertEqual(make_weighted_conjunction([('flowers', 1.0), ('fire', pow(1.1, 2)), ('flames', 1.0)]), parse_prompt("flowers fire++ flames")) + self.assertEqual(make_weighted_conjunction([('flowers', 1.0), ('fire', pow(0.9, 2)), ('flames', 1.0)]), parse_prompt("flowers fire-- flames")) def test_explicit_conjunction(self): @@ -62,7 +63,7 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)])]), parse_prompt('("fire", "flames").and()')) self.assertEqual( Conjunction([FlattenedPrompt([('fire flames', 1.0)]), FlattenedPrompt([('mountain man', 1.0)])]), parse_prompt('("fire flames", "mountain man").and()')) - self.assertEqual(Conjunction([FlattenedPrompt([('fire', 2.0)]), FlattenedPrompt([('flames', 0.9)])]), parse_prompt('("2.0(fire)", "-flames").and()')) + self.assertEqual(Conjunction([FlattenedPrompt([('fire', 2.0)]), FlattenedPrompt([('flames', 0.9)])]), parse_prompt('("(fire)2.0", "flames-").and()')) self.assertEqual(Conjunction([FlattenedPrompt([('fire', 1.0)]), FlattenedPrompt([('flames', 1.0)]), FlattenedPrompt([('mountain man', 1.0)])]), parse_prompt('("fire", "flames", "mountain man").and()')) @@ -75,8 +76,11 @@ class PromptParserTestCase(unittest.TestCase): parse_prompt('("fire", "flames").and(2,1,2)') def test_complex_conjunction(self): + + #print(parse_prompt("a person with a hat (riding a bicycle.swap(skateboard))++")) + self.assertEqual(Conjunction([FlattenedPrompt([("mountain man", 1.0)]), FlattenedPrompt([("a person with a hat", 1.0), ("riding a bicycle", pow(1.1,2))])], weights=[0.5, 0.5]), - parse_prompt("(\"mountain man\", \"a person with a hat ++(riding a bicycle)\").and(0.5, 0.5)")) + parse_prompt("(\"mountain man\", \"a person with a hat (riding a bicycle)++\").and(0.5, 0.5)")) self.assertEqual(Conjunction([FlattenedPrompt([("mountain man", 1.0)]), FlattenedPrompt([("a person with a hat", 1.0), ("riding a", 1.1*1.1), @@ -85,7 +89,7 @@ class PromptParserTestCase(unittest.TestCase): [Fragment("skateboard", pow(1.1,2))]) ]) ], weights=[0.5, 0.5]), - parse_prompt("(\"mountain man\", \"a person with a hat ++(riding a bicycle.swap(skateboard))\").and(0.5, 0.5)")) + parse_prompt("(\"mountain man\", \"a person with a hat (riding a bicycle.swap(skateboard))++\").and(0.5, 0.5)")) def test_badly_formed(self): def make_untouched_prompt(prompt): @@ -95,24 +99,25 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(make_untouched_prompt(prompt), parse_prompt(prompt)) assert_if_prompt_string_not_untouched('a test prompt') - assert_if_prompt_string_not_untouched('a badly formed test+ prompt') + # todo handle this + #assert_if_prompt_string_not_untouched('a badly formed +test prompt') with self.assertRaises(pyparsing.ParseException): parse_prompt('a badly (formed test prompt') #with self.assertRaises(pyparsing.ParseException): with self.assertRaises(pyparsing.ParseException): - parse_prompt('a badly (formed test+ prompt') + parse_prompt('a badly (formed +test prompt') with self.assertRaises(pyparsing.ParseException): - parse_prompt('a badly (formed test+ )prompt') + parse_prompt('a badly (formed +test )prompt') with self.assertRaises(pyparsing.ParseException): - parse_prompt('a badly (formed test+ )prompt') + parse_prompt('a badly (formed +test )prompt') with self.assertRaises(pyparsing.ParseException): - parse_prompt('(((a badly (formed test+ )prompt') + parse_prompt('(((a badly (formed +test )prompt') with self.assertRaises(pyparsing.ParseException): - parse_prompt('(a (ba)dly (f)ormed test+ prompt') + parse_prompt('(a (ba)dly (f)ormed +test prompt') with self.assertRaises(pyparsing.ParseException): - parse_prompt('(a (ba)dly (f)ormed test+ +prompt') + parse_prompt('(a (ba)dly (f)ormed +test +prompt') with self.assertRaises(pyparsing.ParseException): - parse_prompt('("((a badly (formed test+ ").blend(1.0)') + parse_prompt('("((a badly (formed +test ").blend(1.0)') def test_blend(self): @@ -129,7 +134,7 @@ class PromptParserTestCase(unittest.TestCase): FlattenedPrompt([('fire flames', 1.0), ('hot', pow(1.1, 2))]), FlattenedPrompt([('hi', 1.0)])], weights=[0.7, 0.3, 1.0])]), - parse_prompt("(\"fire\", \"fire flames ++(hot)\", \"hi\").blend(0.7, 0.3, 1.0)") + parse_prompt("(\"fire\", \"fire flames (hot)++\", \"hi\").blend(0.7, 0.3, 1.0)") ) # blend a single entry is not a failure self.assertEqual(Conjunction([Blend([FlattenedPrompt([('fire', 1.0)])], [0.7])]), @@ -156,17 +161,17 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual( Conjunction([Blend([FlattenedPrompt([('mountain, man, hairy', 1)]), FlattenedPrompt([('face, teeth,', 1), ('eyes', 0.9*0.9)])], weights=[1.0,-1.0])]), - parse_prompt('("mountain, man, hairy", "face, teeth, --eyes").blend(1,-1)') + parse_prompt('("mountain, man, hairy", "face, teeth, eyes--").blend(1,-1)') ) def test_nested(self): self.assertEqual(make_weighted_conjunction([('fire', 1.0), ('flames', 2.0), ('trees', 3.0)]), - parse_prompt('fire 2.0(flames 1.5(trees))')) + parse_prompt('fire (flames (trees)1.5)2.0')) self.assertEqual(Conjunction([Blend(prompts=[FlattenedPrompt([('fire', 1.0), ('flames', 1.2100000000000002)]), FlattenedPrompt([('mountain', 1.0), ('man', 2.0)])], weights=[1.0, 1.0])]), - parse_prompt('("fire ++(flames)", "mountain 2(man)").blend(1,1)')) + parse_prompt('("fire (flames)++", "mountain (man)2").blend(1,1)')) def test_cross_attention_control(self): @@ -237,15 +242,15 @@ class PromptParserTestCase(unittest.TestCase): flames_to_trees_fire = Conjunction([FlattenedPrompt([ CrossAttentionControlSubstitute([Fragment('flames',0.5)], [Fragment('trees',0.7)]), Fragment(',', 1), Fragment('fire', 2.0)])]) - self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(flames)".swap("0.7(trees)"), 2.0(fire)')) + self.assertEqual(flames_to_trees_fire, parse_prompt('"(flames)0.5".swap("(trees)0.7"), (fire)2.0')) flames_to_trees_fire = Conjunction([FlattenedPrompt([ CrossAttentionControlSubstitute([Fragment('fire',0.5), Fragment('flames',0.25)], [Fragment('trees',0.7)]), Fragment(',', 1), Fragment('fire', 2.0)])]) - self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(fire 0.5(flames))".swap("0.7(trees)"), 2.0(fire)')) + self.assertEqual(flames_to_trees_fire, parse_prompt('"(fire (flames)0.5)0.5".swap("(trees)0.7"), (fire)2.0')) flames_to_trees_fire = Conjunction([FlattenedPrompt([ CrossAttentionControlSubstitute([Fragment('fire',0.5), Fragment('flames',0.25)], [Fragment('trees',0.7), Fragment('houses', 1)]), Fragment(',', 1), Fragment('fire', 2.0)])]) - self.assertEqual(flames_to_trees_fire, parse_prompt('"0.5(fire 0.5(flames))".swap("0.7(trees) houses"), 2.0(fire)')) + self.assertEqual(flames_to_trees_fire, parse_prompt('"(fire (flames)0.5)0.5".swap("(trees)0.7 houses"), (fire)2.0')) def test_cross_attention_control_options(self): self.assertEqual(Conjunction([ @@ -271,48 +276,48 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(make_basic_conjunction(['mountain (man)']),parse_prompt('mountain \(man\)')) self.assertEqual(make_basic_conjunction(['mountain (man )']),parse_prompt('mountain (\(man)\)')) self.assertEqual(make_basic_conjunction(['mountain (man)']),parse_prompt('mountain (\(man\))')) - self.assertEqual(make_weighted_conjunction([('mountain', 1), ('(man)', 1.1)]), parse_prompt('mountain +(\(man\))')) - self.assertEqual(make_weighted_conjunction([('mountain', 1), ('(man)', 1.1)]), parse_prompt('"mountain" +(\(man\))')) - self.assertEqual(make_weighted_conjunction([('"mountain"', 1), ('(man)', 1.1)]), parse_prompt('\\"mountain\\" +(\(man\))')) + self.assertEqual(make_weighted_conjunction([('mountain', 1), ('(man)', 1.1)]), parse_prompt('mountain (\(man\))+')) + self.assertEqual(make_weighted_conjunction([('mountain', 1), ('(man)', 1.1)]), parse_prompt('"mountain" (\(man\))+')) + self.assertEqual(make_weighted_conjunction([('"mountain"', 1), ('(man)', 1.1)]), parse_prompt('\\"mountain\\" (\(man\))+')) # same weights for each are combined into one - self.assertEqual(make_weighted_conjunction([('"mountain" (man)', 1.1)]), parse_prompt('+(\\"mountain\\") +(\(man\))')) - self.assertEqual(make_weighted_conjunction([('"mountain"', 1.1), ('(man)', 0.9)]), parse_prompt('+(\\"mountain\\") -(\(man\))')) + self.assertEqual(make_weighted_conjunction([('"mountain" (man)', 1.1)]), parse_prompt('(\\"mountain\\")+ (\(man\))+')) + self.assertEqual(make_weighted_conjunction([('"mountain"', 1.1), ('(man)', 0.9)]), parse_prompt('(\\"mountain\\")+ (\(man\))-')) - self.assertEqual(make_weighted_conjunction([('mountain', 1), ('\(man\)', 1.1)]),parse_prompt('mountain 1.1(\(man\))')) - self.assertEqual(make_weighted_conjunction([('mountain', 1), ('\(man\)', 1.1)]),parse_prompt('"mountain" 1.1(\(man\))')) - self.assertEqual(make_weighted_conjunction([('"mountain"', 1), ('\(man\)', 1.1)]),parse_prompt('\\"mountain\\" 1.1(\(man\))')) + self.assertEqual(make_weighted_conjunction([('mountain', 1), ('\(man\)', 1.1)]),parse_prompt('mountain (\(man\))1.1')) + self.assertEqual(make_weighted_conjunction([('mountain', 1), ('\(man\)', 1.1)]),parse_prompt('"mountain" (\(man\))1.1')) + self.assertEqual(make_weighted_conjunction([('"mountain"', 1), ('\(man\)', 1.1)]),parse_prompt('\\"mountain\\" (\(man\))1.1')) # same weights for each are combined into one - self.assertEqual(make_weighted_conjunction([('\\"mountain\\" \(man\)', 1.1)]),parse_prompt('+(\\"mountain\\") 1.1(\(man\))')) - self.assertEqual(make_weighted_conjunction([('\\"mountain\\"', 1.1), ('\(man\)', 0.9)]),parse_prompt('1.1(\\"mountain\\") 0.9(\(man\))')) + self.assertEqual(make_weighted_conjunction([('\\"mountain\\" \(man\)', 1.1)]),parse_prompt('(\\"mountain\\")+ (\(man\))1.1')) + self.assertEqual(make_weighted_conjunction([('\\"mountain\\"', 1.1), ('\(man\)', 0.9)]),parse_prompt('(\\"mountain\\")1.1 (\(man\))0.9')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain', 1.1), ('\(man\)', 1.1*1.1)]),parse_prompt('hairy +(mountain +(\(man\)))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('\(man\)', 1.1*1.1), ('mountain', 1.1)]),parse_prompt('hairy +(1.1(\(man\)) "mountain")')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain', 1.1), ('\(man\)', 1.1*1.1)]),parse_prompt('hairy +("mountain" 1.1(\(man\)) )')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man', 1.1)]),parse_prompt('hairy +("mountain, man")')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man with a', 1.1), ('beard', 1.1*1.1)]), parse_prompt('hairy +("mountain, man" with a +beard)')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, man" with a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man\" with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\"man\\"" with a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, m\"an\" with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, m\\"an\\"" with a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain', 1.1), ('\(man\)', 1.1*1.1)]),parse_prompt('hairy (mountain (\(man\))+)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('\(man\)', 1.1*1.1), ('mountain', 1.1)]),parse_prompt('hairy ((\(man\))1.1 "mountain")+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain', 1.1), ('\(man\)', 1.1*1.1)]),parse_prompt('hairy ("mountain" (\(man\))1.1 )+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man', 1.1)]),parse_prompt('hairy ("mountain, man")+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man with a', 1.1), ('beard', 1.1*1.1)]), parse_prompt('hairy ("mountain, man" with a beard+)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, man with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, man" with a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man\" with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, \\"man\\"" with a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, m\"an\" with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, m\\"an\\"" with a (beard)2.0)+')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man (with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" \(with a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man w(ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" w\(ith a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man with( a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" with\( a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man )with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" \)with a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" w\)ith a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man with) a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mountain, \\\"man\" with\) a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mou)ntain, \"man (wit(h a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mou\)ntain, \\\"man\" \(wit\(h a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hai(ry', 1), ('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hai\(ry +("mountain, \\\"man\" w\)ith a 2.0(beard))')) - self.assertEqual(make_weighted_conjunction([('hairy((', 1), ('mountain, \"man with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy\(\( +("mountain, \\\"man\" with a 2.0(beard))')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man (with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, \\\"man\" \(with a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man w(ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, \\\"man\" w\(ith a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man with( a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, \\\"man\" with\( a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man )with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, \\\"man\" \)with a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, \\\"man\" w\)ith a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mountain, \"man with) a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mountain, \\\"man\" with\) a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mou)ntain, \"man (wit(h a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy ("mou\)ntain, \\\"man\" \(wit\(h a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hai(ry', 1), ('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hai\(ry ("mountain, \\\"man\" w\)ith a (beard)2.0)+')) + self.assertEqual(make_weighted_conjunction([('hairy((', 1), ('mountain, \"man with a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy\(\( ("mountain, \\\"man\" with a (beard)2.0)+')) - self.assertEqual(make_weighted_conjunction([('mountain, \"man (with a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" \(with a 2.0(beard)) hairy')) - self.assertEqual(make_weighted_conjunction([('mountain, \"man w(ith a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" w\(ith a 2.0(beard))hairy')) - self.assertEqual(make_weighted_conjunction([('mountain, \"man with( a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" with\( a 2.0(beard)) hairy')) - self.assertEqual(make_weighted_conjunction([('mountain, \"man )with a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" \)with a 2.0(beard)) hairy')) - self.assertEqual(make_weighted_conjunction([('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mountain, \\\"man\" w\)ith a 2.0(beard)) hairy')) - self.assertEqual(make_weighted_conjunction([('mountain, \"man with) a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt(' +("mountain, \\\"man\" with\) a 2.0(beard)) hairy')) - self.assertEqual(make_weighted_conjunction([('mou)ntain, \"man (wit(h a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('+("mou\)ntain, \\\"man\" \(wit\(h a 2.0(beard)) hairy')) - self.assertEqual(make_weighted_conjunction([('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0), ('hai(ry', 1)]), parse_prompt('+("mountain, \\\"man\" w\)ith a 2.0(beard)) hai\(ry ')) - self.assertEqual(make_weighted_conjunction([('mountain, \"man with a', 1.1), ('beard', 1.1*2.0), ('hairy((', 1)]), parse_prompt('+("mountain, \\\"man\" with a 2.0(beard)) hairy\(\( ')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man (with a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('("mountain, \\\"man\" \(with a (beard)2.0)+ hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man w(ith a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('("mountain, \\\"man\" w\(ith a (beard)2.0)+hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man with( a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('("mountain, \\\"man\" with\( a (beard)2.0)+ hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man )with a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('("mountain, \\\"man\" \)with a (beard)2.0)+ hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('("mountain, \\\"man\" w\)ith a (beard)2.0)+ hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man with) a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt(' ("mountain, \\\"man\" with\) a (beard)2.0)+ hairy')) + self.assertEqual(make_weighted_conjunction([('mou)ntain, \"man (wit(h a', 1.1), ('beard', 1.1*2.0), ('hairy', 1)]), parse_prompt('("mou\)ntain, \\\"man\" \(wit\(h a (beard)2.0)+ hairy')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man w)ith a', 1.1), ('beard', 1.1*2.0), ('hai(ry', 1)]), parse_prompt('("mountain, \\\"man\" w\)ith a (beard)2.0)+ hai\(ry ')) + self.assertEqual(make_weighted_conjunction([('mountain, \"man with a', 1.1), ('beard', 1.1*2.0), ('hairy((', 1)]), parse_prompt('("mountain, \\\"man\" with a (beard)2.0)+ hairy\(\( ')) def test_cross_attention_escaping(self): @@ -339,7 +344,10 @@ class PromptParserTestCase(unittest.TestCase): parse_prompt('mountain (\(\(\().swap(m\(on\)\)key)')) def test_single(self): - self.assertEqual(make_weighted_conjunction([('hairy', 1), ('mou)ntain, \"man (wit(h a', 1.1), ('beard', 1.1*2.0)]), parse_prompt('hairy +("mou\)ntain, \\\"man\" \(wit\(h a 2.0(beard))')) + # todo handle this + #self.assertEqual(make_basic_conjunction(['a badly formed +test prompt']), + # parse_prompt('a badly formed +test prompt')) + pass if __name__ == '__main__': From 92c6a3812dcc8be178ceac4d9580aad9937094d0 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 00:06:53 +0200 Subject: [PATCH 046/124] catch fewer exceptions in prompt2image --- ldm/generate.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index 39f0b06759..f6d5a12ebf 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -1,5 +1,5 @@ # Copyright (c) 2022 Lincoln D. Stein (https://github.com/lstein) - +import pyparsing # Derived from source code carrying the following copyrights # Copyright (c) 2022 Machine Vision and Learning Group, LMU Munich # Copyright (c) 2022 Robin Rombach and Patrick Esser and contributors @@ -24,6 +24,7 @@ from PIL import Image, ImageOps from torch import nn from pytorch_lightning import seed_everything, logging +from ldm.invoke.prompt_parser import PromptParser from ldm.util import instantiate_from_config from ldm.models.diffusion.ddim import DDIMSampler from ldm.models.diffusion.plms import PLMSSampler @@ -474,7 +475,7 @@ class Generate: print('**Interrupted** Partial results will be returned.') else: raise KeyboardInterrupt - except (RuntimeError, Exception) as e: + except RuntimeError as e: print(traceback.format_exc(), file=sys.stderr) print('>> Could not generate image.') From 2619a0b28641c3370095df9606caf332f1fbf16a Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 00:22:14 +0200 Subject: [PATCH 047/124] allow longer substitutions without quotes for cross attention swap --- ldm/invoke/prompt_parser.py | 2 +- tests/test_prompt_parser.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 48d08a7908..830c5313e3 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -495,7 +495,7 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) edited_fragment = pp.MatchFirst([ lparen + (quoted_fragment | - pp.Group(pp.Word(pp.printables, exclude_chars=string.whitespace + ',').set_parse_action(make_text_fragment)) + pp.Group(pp.OneOrMore(pp.Word(pp.printables, exclude_chars=string.whitespace + ',').set_parse_action(make_text_fragment))) ) + pp.Dict(pp.OneOrMore(comma + cross_attention_option)) + rparen, diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 203b95ddf0..0c4d9106db 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -269,6 +269,14 @@ class PromptParserTestCase(unittest.TestCase): Fragment('eating a hotdog', 1)])]), parse_prompt("a \"cat\".swap(dog, t_start=0.1, s_start=20) eating a hotdog")) + self.assertEqual( + Conjunction([ + FlattenedPrompt([Fragment('a fantasy forest landscape', 1), + CrossAttentionControlSubstitute([Fragment('', 1)], [Fragment('with a river', 1)], + options={'s_start': 0.8, 't_start': 0.8})])]), + parse_prompt("a fantasy forest landscape \"\".swap(with a river, s_start=0.8, t_start=0.8)")) + + def test_escaping(self): # make sure ", ( and ) can be escaped From ee4273d760e642cc33f15f85e0b82eeaaa8cc375 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 01:23:43 +0200 Subject: [PATCH 048/124] fix step count on ddim --- ldm/models/diffusion/sampler.py | 1 + ldm/models/diffusion/shared_invokeai_diffusion.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index 8099997bb3..79c15717fe 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -359,6 +359,7 @@ class Sampler(object): unconditional_guidance_scale=unconditional_guidance_scale, unconditional_conditioning=unconditional_conditioning, t_next = ts_next, + step_count=total_steps ) x_dec, pred_x0, e_t = outs diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index c14e71be8d..4bf5688586 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -86,14 +86,14 @@ class InvokeAIDiffuserComponent: cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, percent_through) if len(cross_attention_control_types_to_do)==0: - #print('step', step_index, ': not doing cross attention control') + print('pct', percent_through, ': not doing cross attention control') # faster batched path x_twice = torch.cat([x]*2) sigma_twice = torch.cat([sigma]*2) both_conditionings = torch.cat([unconditioning, conditioning]) unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) else: - #print('step', step_index, ': doing cross attention control on', cross_attention_control_types_to_do) + print('pct', percent_through, ': doing cross attention control on', cross_attention_control_types_to_do) # slower non-batched path (20% slower on mac MPS) # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. From cc2042bd4ca8a237e8e473563daa6e65fa431215 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 01:43:35 +0200 Subject: [PATCH 049/124] keep the effect of _start and _end arguments consistent across k* and other samplers --- ldm/invoke/generator/img2img.py | 3 ++- ldm/models/diffusion/cross_attention_control.py | 4 ++++ ldm/models/diffusion/ddim.py | 3 ++- ldm/models/diffusion/plms.py | 3 ++- ldm/models/diffusion/sampler.py | 7 ++++--- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 4942bcc0c3..e12f5e5e79 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -51,7 +51,8 @@ class Img2Img(Generator): unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, init_latent = self.init_latent, # changes how noising is performed in ksampler - extra_conditioning_info = extra_conditioning_info + extra_conditioning_info = extra_conditioning_info, + all_timesteps_count = steps ) return self.sample_to_image(samples) diff --git a/ldm/models/diffusion/cross_attention_control.py b/ldm/models/diffusion/cross_attention_control.py index 6e873f1c6d..1e5b073a3d 100644 --- a/ldm/models/diffusion/cross_attention_control.py +++ b/ldm/models/diffusion/cross_attention_control.py @@ -29,6 +29,10 @@ class CrossAttentionControl: class Context: def __init__(self, arguments: 'CrossAttentionControl.Arguments', step_count: int): + """ + :param arguments: Arguments for the cross-attention control process + :param step_count: The absolute total number of steps of diffusion (for img2img this is likely larger than the number of steps that will actually run) + """ self.arguments = arguments self.step_count = step_count diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index 5b5dfaf4af..b11e8578e7 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -16,9 +16,10 @@ class DDIMSampler(Sampler): super().prepare_to_sample(t_enc, **kwargs) extra_conditioning_info = kwargs.get('extra_conditioning_info', None) + all_timesteps_count = kwargs.get('all_timesteps_count', t_enc) if extra_conditioning_info is not None and extra_conditioning_info.wants_cross_attention_control: - self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info, step_count = t_enc) + self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info, step_count = all_timesteps_count) else: self.invokeai_diffuser.remove_cross_attention_control() diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index 40c2631bcd..6bd519b63b 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -21,9 +21,10 @@ class PLMSSampler(Sampler): super().prepare_to_sample(t_enc, **kwargs) extra_conditioning_info = kwargs.get('extra_conditioning_info', None) + all_timesteps_count = kwargs.get('all_timesteps_count', t_enc) if extra_conditioning_info is not None and extra_conditioning_info.wants_cross_attention_control: - self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info, step_count = t_enc) + self.invokeai_diffuser.setup_cross_attention_control(extra_conditioning_info, step_count = all_timesteps_count) else: self.invokeai_diffuser.remove_cross_attention_control() diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index 79c15717fe..853702ef68 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -235,7 +235,7 @@ class Sampler(object): dynamic_ncols=True, ) old_eps = [] - self.prepare_to_sample(t_enc=total_steps,**kwargs) + self.prepare_to_sample(t_enc=total_steps,all_timesteps_count=steps,**kwargs) img = self.get_initial_image(x_T,shape,total_steps) # probably don't need this at all @@ -310,6 +310,7 @@ class Sampler(object): use_original_steps=False, init_latent = None, mask = None, + all_timesteps_count = None, **kwargs ): @@ -327,7 +328,7 @@ class Sampler(object): iterator = tqdm(time_range, desc='Decoding image', total=total_steps) x_dec = x_latent x0 = init_latent - self.prepare_to_sample(t_enc=total_steps,**kwargs) + self.prepare_to_sample(t_enc=total_steps, all_timesteps_count=all_timesteps_count, **kwargs) for i, step in enumerate(iterator): index = total_steps - i - 1 @@ -359,7 +360,7 @@ class Sampler(object): unconditional_guidance_scale=unconditional_guidance_scale, unconditional_conditioning=unconditional_conditioning, t_next = ts_next, - step_count=total_steps + step_count=len(self.ddim_timesteps) ) x_dec, pred_x0, e_t = outs From 1fb15d5c8126e46c9ecfa2538393327ce798d858 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 02:02:42 +0200 Subject: [PATCH 050/124] fix hires fix --- ldm/invoke/generator/txt2img2img.py | 5 +++-- ldm/models/diffusion/shared_invokeai_diffusion.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ldm/invoke/generator/txt2img2img.py b/ldm/invoke/generator/txt2img2img.py index 5808f7bdb2..c8438d1f7f 100644 --- a/ldm/invoke/generator/txt2img2img.py +++ b/ldm/invoke/generator/txt2img2img.py @@ -23,7 +23,7 @@ class Txt2Img2Img(Generator): Return value depends on the seed at the time you call it kwargs are 'width' and 'height' """ - uc, c, extra_conditioing_info = conditioning + uc, c, extra_conditioning_info = conditioning @torch.no_grad() def make_image(x_T): @@ -96,7 +96,8 @@ class Txt2Img2Img(Generator): img_callback = step_callback, unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, - extra_conditioning_info = extra_conditioning_info + # cross-attention control is disabled during upscale + #extra_conditioning_info = None ) if self.free_gpu_mem: diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index 4bf5688586..f52dd46766 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -86,7 +86,7 @@ class InvokeAIDiffuserComponent: cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, percent_through) if len(cross_attention_control_types_to_do)==0: - print('pct', percent_through, ': not doing cross attention control') + print('not doing cross attention control') # faster batched path x_twice = torch.cat([x]*2) sigma_twice = torch.cat([sigma]*2) From 63902f3d3412376a779acbef57acf1826ef7c0fd Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 02:08:55 +0200 Subject: [PATCH 051/124] also apply conditioing during hires fix upscale --- ldm/invoke/generator/txt2img2img.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ldm/invoke/generator/txt2img2img.py b/ldm/invoke/generator/txt2img2img.py index c8438d1f7f..a10aad58ac 100644 --- a/ldm/invoke/generator/txt2img2img.py +++ b/ldm/invoke/generator/txt2img2img.py @@ -96,8 +96,8 @@ class Txt2Img2Img(Generator): img_callback = step_callback, unconditional_guidance_scale=cfg_scale, unconditional_conditioning=uc, - # cross-attention control is disabled during upscale - #extra_conditioning_info = None + extra_conditioning_info=extra_conditioning_info, + all_timesteps_count=steps ) if self.free_gpu_mem: From 0564397ee6d206a7ede5ff16628b4b46578339c4 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 11:16:43 +0200 Subject: [PATCH 052/124] cleanup logs --- ldm/models/diffusion/shared_invokeai_diffusion.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index f52dd46766..b8a7a04d0e 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -82,18 +82,18 @@ class InvokeAIDiffuserComponent: # flip because sigmas[0] is for the fully denoised image # percent_through must be <1 percent_through = 1.0 - float(sigma_index.item() + 1) / float(self.model.sigmas.shape[0]) - print('estimated percent_through', percent_through, 'from sigma', sigma.item()) + #print('estimated percent_through', percent_through, 'from sigma', sigma.item()) cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, percent_through) if len(cross_attention_control_types_to_do)==0: - print('not doing cross attention control') + #print('not doing cross attention control') # faster batched path x_twice = torch.cat([x]*2) sigma_twice = torch.cat([sigma]*2) both_conditionings = torch.cat([unconditioning, conditioning]) unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) else: - print('pct', percent_through, ': doing cross attention control on', cross_attention_control_types_to_do) + #print('pct', percent_through, ': doing cross attention control on', cross_attention_control_types_to_do) # slower non-batched path (20% slower on mac MPS) # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. From 44e4090909c0375f9344f647e85a2107f6b1ded0 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 11:16:52 +0200 Subject: [PATCH 053/124] re-enable legacy blend syntax --- backend/invoke_ai_web_server.py | 2 +- backend/server.py | 2 +- ldm/invoke/args.py | 2 +- ldm/invoke/conditioning.py | 70 ++++---------------------- ldm/invoke/prompt_parser.py | 88 ++++++++++++++++++++++++++++++--- tests/test_prompt_parser.py | 41 ++++++++++++++- 6 files changed, 134 insertions(+), 71 deletions(-) diff --git a/backend/invoke_ai_web_server.py b/backend/invoke_ai_web_server.py index 96ecda1af1..dabe072f80 100644 --- a/backend/invoke_ai_web_server.py +++ b/backend/invoke_ai_web_server.py @@ -14,7 +14,7 @@ from threading import Event from ldm.invoke.args import Args, APP_ID, APP_VERSION, calculate_init_img_hash from ldm.invoke.pngwriter import PngWriter, retrieve_metadata -from ldm.invoke.conditioning import split_weighted_subprompts +from ldm.invoke.prompt_parser import split_weighted_subprompts from backend.modules.parameters import parameters_to_command diff --git a/backend/server.py b/backend/server.py index 7b8a8a5a69..8ad861356c 100644 --- a/backend/server.py +++ b/backend/server.py @@ -33,7 +33,7 @@ from ldm.generate import Generate from ldm.invoke.restoration import Restoration from ldm.invoke.pngwriter import PngWriter, retrieve_metadata from ldm.invoke.args import APP_ID, APP_VERSION, calculate_init_img_hash -from ldm.invoke.conditioning import split_weighted_subprompts +from ldm.invoke.prompt_parser import split_weighted_subprompts from modules.parameters import parameters_to_command diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index 26920f28ea..12e9f96f6b 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -92,7 +92,7 @@ import copy import base64 import functools import ldm.invoke.pngwriter -from ldm.invoke.conditioning import split_weighted_subprompts +from ldm.invoke.prompt_parser import split_weighted_subprompts SAMPLER_CHOICES = [ 'ddim', diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 52d40312ac..65459b5c5f 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -41,9 +41,15 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n pp = PromptParser() - # we don't support conjunctions for now - parsed_prompt: Union[FlattenedPrompt, Blend] = pp.parse(prompt_string_cleaned).prompts[0] - parsed_negative_prompt: FlattenedPrompt = pp.parse(unconditioned_words).prompts[0] + parsed_prompt: Union[FlattenedPrompt, Blend] = None + legacy_blend: Blend = pp.parse_legacy_blend(prompt_string_cleaned) + if legacy_blend is not None: + parsed_prompt = legacy_blend + else: + # we don't support conjunctions for now + parsed_prompt = pp.parse_conjunction(prompt_string_cleaned).prompts[0] + + parsed_negative_prompt: FlattenedPrompt = pp.parse_conjunction(unconditioned_words).prompts[0] print("parsed prompt to", parsed_prompt) conditioning = None @@ -146,61 +152,3 @@ def get_tokens_length(model, fragments: list[Fragment]): return sum([len(x) for x in tokens]) -def split_weighted_subprompts(text, skip_normalize=False)->list: - """ - grabs all text up to the first occurrence of ':' - uses the grabbed text as a sub-prompt, and takes the value following ':' as weight - if ':' has no value defined, defaults to 1.0 - repeats until no text remaining - """ - prompt_parser = re.compile(""" - (?P # capture group for 'prompt' - (?:\\\:|[^:])+ # match one or more non ':' characters or escaped colons '\:' - ) # end 'prompt' - (?: # non-capture group - :+ # match one or more ':' characters - (?P # capture group for 'weight' - -?\d+(?:\.\d+)? # match positive or negative integer or decimal number - )? # end weight capture group, make optional - \s* # strip spaces after weight - | # OR - $ # else, if no ':' then match end of line - ) # end non-capture group - """, re.VERBOSE) - parsed_prompts = [(match.group("prompt").replace("\\:", ":"), float( - match.group("weight") or 1)) for match in re.finditer(prompt_parser, text)] - if skip_normalize: - return parsed_prompts - weight_sum = sum(map(lambda x: x[1], parsed_prompts)) - if weight_sum == 0: - print( - "Warning: Subprompt weights add up to zero. Discarding and using even weights instead.") - equal_weight = 1 / max(len(parsed_prompts), 1) - return [(x[0], equal_weight) for x in parsed_prompts] - return [(x[0], x[1] / weight_sum) for x in parsed_prompts] - -# shows how the prompt is tokenized -# usually tokens have '' to indicate end-of-word, -# but for readability it has been replaced with ' ' -def log_tokenization(text, model, log=False, weight=1): - if not log: - return - tokens = model.cond_stage_model.tokenizer._tokenize(text) - tokenized = "" - discarded = "" - usedTokens = 0 - totalTokens = len(tokens) - for i in range(0, totalTokens): - token = tokens[i].replace('', ' ') - # alternate color - s = (usedTokens % 6) + 1 - if i < model.cond_stage_model.max_length: - tokenized = tokenized + f"\x1b[0;3{s};40m{token}" - usedTokens += 1 - else: # over max token length - discarded = discarded + f"\x1b[0;3{s};40m{token}" - print(f"\n>> Tokens ({usedTokens}), Weight ({weight:.2f}):\n{tokenized}\x1b[0m") - if discarded != "": - print( - f">> Tokens Discarded ({totalTokens-usedTokens}):\n{discarded}\x1b[0m" - ) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 830c5313e3..3a96d664f0 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -1,6 +1,6 @@ import string -from typing import Union - +from typing import Union, Optional +import re import pyparsing as pp class Prompt(): @@ -223,10 +223,10 @@ class PromptParser(): def __init__(self, attention_plus_base=1.1, attention_minus_base=0.9): - self.root = build_parser_syntax(attention_plus_base, attention_minus_base) + self.conjunction, self.prompt = build_parser_syntax(attention_plus_base, attention_minus_base) - def parse(self, prompt: str) -> Conjunction: + def parse_conjunction(self, prompt: str) -> Conjunction: ''' :param prompt: The prompt string to parse :return: a Conjunction representing the parsed results. @@ -236,13 +236,25 @@ class PromptParser(): if len(prompt.strip()) == 0: return Conjunction(prompts=[FlattenedPrompt([('', 1.0)])], weights=[1.0]) - root = self.root.parse_string(prompt) + root = self.conjunction.parse_string(prompt) #print(f"'{prompt}' parsed to root", root) #fused = fuse_fragments(parts) #print("fused to", fused) return self.flatten(root[0]) + def parse_legacy_blend(self, text: str) -> Optional[Blend]: + weighted_subprompts = split_weighted_subprompts(text, skip_normalize=False) + if len(weighted_subprompts) == 1: + return None + strings = [x[0] for x in weighted_subprompts] + weights = [x[1] for x in weighted_subprompts] + + parsed_conjunctions = [self.parse_conjunction(x) for x in strings] + flattened_prompts = [x.prompts[0] for x in parsed_conjunctions] + + return Blend(prompts=flattened_prompts, weights=weights, normalize_weights=True) + def flatten(self, root: Conjunction) -> Conjunction: """ @@ -596,4 +608,68 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) conjunction.set_debug(False) # top-level is a conjunction of one or more blends or prompts - return conjunction + return conjunction, prompt + + + +def split_weighted_subprompts(text, skip_normalize=False)->list: + """ + Legacy blend parsing. + + grabs all text up to the first occurrence of ':' + uses the grabbed text as a sub-prompt, and takes the value following ':' as weight + if ':' has no value defined, defaults to 1.0 + repeats until no text remaining + """ + prompt_parser = re.compile(""" + (?P # capture group for 'prompt' + (?:\\\:|[^:])+ # match one or more non ':' characters or escaped colons '\:' + ) # end 'prompt' + (?: # non-capture group + :+ # match one or more ':' characters + (?P # capture group for 'weight' + -?\d+(?:\.\d+)? # match positive or negative integer or decimal number + )? # end weight capture group, make optional + \s* # strip spaces after weight + | # OR + $ # else, if no ':' then match end of line + ) # end non-capture group + """, re.VERBOSE) + parsed_prompts = [(match.group("prompt").replace("\\:", ":"), float( + match.group("weight") or 1)) for match in re.finditer(prompt_parser, text)] + if skip_normalize: + return parsed_prompts + weight_sum = sum(map(lambda x: x[1], parsed_prompts)) + if weight_sum == 0: + print( + "Warning: Subprompt weights add up to zero. Discarding and using even weights instead.") + equal_weight = 1 / max(len(parsed_prompts), 1) + return [(x[0], equal_weight) for x in parsed_prompts] + return [(x[0], x[1] / weight_sum) for x in parsed_prompts] + + +# shows how the prompt is tokenized +# usually tokens have '' to indicate end-of-word, +# but for readability it has been replaced with ' ' +def log_tokenization(text, model, log=False, weight=1): + if not log: + return + tokens = model.cond_stage_model.tokenizer._tokenize(text) + tokenized = "" + discarded = "" + usedTokens = 0 + totalTokens = len(tokens) + for i in range(0, totalTokens): + token = tokens[i].replace('', 'x` ') + # alternate color + s = (usedTokens % 6) + 1 + if i < model.cond_stage_model.max_length: + tokenized = tokenized + f"\x1b[0;3{s};40m{token}" + usedTokens += 1 + else: # over max token length + discarded = discarded + f"\x1b[0;3{s};40m{token}" + print(f"\n>> Tokens ({usedTokens}), Weight ({weight:.2f}):\n{tokenized}\x1b[0m") + if discarded != "": + print( + f">> Tokens Discarded ({totalTokens-usedTokens}):\n{discarded}\x1b[0m" + ) diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 0c4d9106db..486265d2f5 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -9,7 +9,7 @@ from ldm.invoke.prompt_parser import PromptParser, Blend, Conjunction, Flattened def parse_prompt(prompt_string): pp = PromptParser() #print(f"parsing '{prompt_string}'") - parse_result = pp.parse(prompt_string) + parse_result = pp.parse_conjunction(prompt_string) #print(f"-> parsed '{prompt_string}' to {parse_result}") return parse_result @@ -351,6 +351,45 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(Conjunction([FlattenedPrompt([('mountain', 1), CrossAttentionControlSubstitute([Fragment('(((', 1)], [Fragment('m(on))key', 1)])])]), parse_prompt('mountain (\(\(\().swap(m\(on\)\)key)')) + def test_legacy_blend(self): + pp = PromptParser() + + self.assertEqual(Blend([FlattenedPrompt([('mountain man', 1)]), + FlattenedPrompt([('man mountain', 1)])], + weights=[0.5,0.5]), + pp.parse_legacy_blend('mountain man:1 man mountain:1')) + + self.assertEqual(Blend([FlattenedPrompt([('mountain', 1.1), ('man', 1)]), + FlattenedPrompt([('man', 1), ('mountain', 0.9)])], + weights=[0.5,0.5]), + pp.parse_legacy_blend('mountain+ man:1 man mountain-:1')) + + self.assertEqual(Blend([FlattenedPrompt([('mountain', 1.1), ('man', 1)]), + FlattenedPrompt([('man', 1), ('mountain', 0.9)])], + weights=[0.5,0.5]), + pp.parse_legacy_blend('mountain+ man:1 man mountain-')) + + self.assertEqual(Blend([FlattenedPrompt([('mountain', 1.1), ('man', 1)]), + FlattenedPrompt([('man', 1), ('mountain', 0.9)])], + weights=[0.5,0.5]), + pp.parse_legacy_blend('mountain+ man: man mountain-:')) + + self.assertEqual(Blend([FlattenedPrompt([('mountain man', 1)]), + FlattenedPrompt([('man mountain', 1)])], + weights=[0.75,0.25]), + pp.parse_legacy_blend('mountain man:3 man mountain:1')) + + self.assertEqual(Blend([FlattenedPrompt([('mountain man', 1)]), + FlattenedPrompt([('man mountain', 1)])], + weights=[1.0,0.0]), + pp.parse_legacy_blend('mountain man:3 man mountain:0')) + + self.assertEqual(Blend([FlattenedPrompt([('mountain man', 1)]), + FlattenedPrompt([('man mountain', 1)])], + weights=[0.8,0.2]), + pp.parse_legacy_blend('"mountain man":4 man mountain')) + + def test_single(self): # todo handle this #self.assertEqual(make_basic_conjunction(['a badly formed +test prompt']), From 61a4897b71432e5a6d3307fb112f6023e4278409 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 11:49:47 +0200 Subject: [PATCH 054/124] re-enable tokenization logging --- ldm/invoke/conditioning.py | 29 ++++++++++++++++++++++------- ldm/invoke/prompt_parser.py | 5 +++++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 65459b5c5f..7c095de7b7 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -50,7 +50,7 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n parsed_prompt = pp.parse_conjunction(prompt_string_cleaned).prompts[0] parsed_negative_prompt: FlattenedPrompt = pp.parse_conjunction(unconditioned_words).prompts[0] - print("parsed prompt to", parsed_prompt) + print(f">> Parsed prompt to {parsed_prompt}") conditioning = None cac_args:CrossAttentionControl.Arguments = None @@ -59,7 +59,7 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n blend: Blend = parsed_prompt embeddings_to_blend = None for flattened_prompt in blend.prompts: - this_embedding, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt) + this_embedding, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt, log_tokens=log_tokens) embeddings_to_blend = this_embedding if embeddings_to_blend is None else torch.cat( (embeddings_to_blend, this_embedding)) conditioning = WeightedFrozenCLIPEmbedder.apply_embedding_weights(embeddings_to_blend.unsqueeze(0), @@ -103,14 +103,14 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n edit_options.append(None) original_token_count += count edited_token_count += count - original_embeddings, original_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, original_prompt) + original_embeddings, original_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, original_prompt, log_tokens=log_tokens) # naïvely building a single edited_embeddings like this disregards the effects of changing the absolute location of # subsequent tokens when there is >1 edit and earlier edits change the total token count. # eg "a cat.swap(smiling dog, s_start=0.5) eating a hotdog.swap(pizza)" - when the 'pizza' edit is active but the # 'cat' edit is not, the 'pizza' feature vector will nevertheless be affected by the introduction of the extra # token 'smiling' in the inactive 'cat' edit. # todo: build multiple edited_embeddings, one for each edit, and pass just the edited fragments through to the CrossAttentionControl functions - edited_embeddings, edited_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, edited_prompt) + edited_embeddings, edited_tokens = build_embeddings_and_tokens_for_flattened_prompt(model, edited_prompt, log_tokens=log_tokens) conditioning = original_embeddings edited_conditioning = edited_embeddings @@ -121,10 +121,10 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n edit_options = edit_options ) else: - conditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt) + conditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt, log_tokens=log_tokens) - unconditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, parsed_negative_prompt) + unconditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, parsed_negative_prompt, log_tokens=log_tokens) return ( unconditioning, conditioning, InvokeAIDiffuserComponent.ExtraConditioningInfo( cross_attention_control_args=cac_args @@ -138,12 +138,27 @@ def build_token_edit_opcodes(original_tokens, edited_tokens): return SequenceMatcher(None, original_tokens, edited_tokens).get_opcodes() -def build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt: FlattenedPrompt): +def build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt: FlattenedPrompt, log_tokens: bool=False): if type(flattened_prompt) is not FlattenedPrompt: raise Exception(f"embeddings can only be made from FlattenedPrompts, got {type(flattened_prompt)} instead") fragments = [x.text for x in flattened_prompt.children] weights = [x.weight for x in flattened_prompt.children] embeddings, tokens = model.get_learned_conditioning([fragments], return_tokens=True, fragment_weights=[weights]) + if not flattened_prompt.is_empty and log_tokens: + start_token = model.cond_stage_model.tokenizer.bos_token_id + end_token = model.cond_stage_model.tokenizer.eos_token_id + tokens_list = tokens[0].tolist() + if tokens_list[0] == start_token: + tokens_list[0] = '' + try: + first_end_token_index = tokens_list.index(end_token) + tokens_list[first_end_token_index] = '' + tokens_list = tokens_list[:first_end_token_index+1] + except ValueError: + pass + + print(f">> Prompt fragments {fragments}, tokenized to \n{tokens_list}") + return embeddings, tokens def get_tokens_length(model, fragments: list[Fragment]): diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 3a96d664f0..6709f48066 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -51,6 +51,11 @@ class FlattenedPrompt(): raise PromptParser.ParsingException( f"FlattenedPrompt cannot contain {fragment}, only Fragments or (str, float) tuples are allowed") + @property + def is_empty(self): + return len(self.children) == 0 or \ + (len(self.children) == 1 and len(self.children[0].text) == 0) + def __repr__(self): return f"FlattenedPrompt:{self.children}" def __eq__(self, other): From d12ae3bab0719c1e9f5aa925768407012538a97c Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Mon, 24 Oct 2022 14:58:38 +0200 Subject: [PATCH 055/124] documentation for new prompt syntax --- docs/features/PROMPTS.md | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/features/PROMPTS.md b/docs/features/PROMPTS.md index b5ef26858b..8fdb97b7b8 100644 --- a/docs/features/PROMPTS.md +++ b/docs/features/PROMPTS.md @@ -84,6 +84,48 @@ Getting close - but there's no sense in having a saddle when our horse doesn't h --- +## **Prompt Syntax Features** + +The InvokeAI prompting language has the following features: + +### Attention weighting +Append a word or phrase with `-` or `+`, or a weight between `0` and `2` (`1`=default), to decrease or increase "attention" (= a mix of per-token CFG weighting multiplier and, for `-`, a weighted blend with the prompt without the term). + +The following will be recognised: + * single words without parentheses: `a tall thin man picking apricots+` + * single or multiple words with parentheses: `a tall thin man picking (apricots)+` `a tall thin man picking (apricots)-` `a tall thin man (picking apricots)+` `a tall thin man (picking apricots)-` + * more effect with more symbols `a tall thin man (picking apricots)++` + * nesting `a tall thin man (picking apricots+)++` (`apricots` effectively gets `+++`) + * all of the above with explicit numbers `a tall thin man picking (apricots)1.1` `a tall thin man (picking (apricots)1.3)1.1`. (`+` is equivalent to 1.1, `++` is pow(1.1,2), `+++` is pow(1.1,3), etc; `-` means 0.9, `--` means pow(0.9,2), etc.) + * attention also applies to `[unconditioning]` so `a tall thin man picking apricots [(ladder)0.01]` will *very gently* nudge SD away from trying to draw the man on a ladder + +### Blending between prompts + +* `("a tall thin man picking apricots", "a tall thin man picking pears").blend(1,1)` +* The existing prompt blending using `:` will continue to be supported - `("a tall thin man picking apricots", "a tall thin man picking pears").blend(1,1)` is equivalent to `a tall thin man picking apricots:1 a tall thin man picking pears:1` in the old syntax. +* Attention weights can be nested inside blends. +* Non-normalized blends are supported by passing `no_normalize` as an additional argument to the blend weights, eg `("a tall thin man picking apricots", "a tall thin man picking pears").blend(1,-1,no_normalize)`. very fun to explore local maxima in the feature space, but also easy to produce garbage output. + +See the section below on "Prompt Blending" for more information about how this works. + +### Cross-Attention Control ('prompt2prompt') + +Denoise with a given prompt and then re-use the attention→pixel maps to substitute words in the original prompt for words in a new prompt. Based off [bloc97's colab](https://github.com/bloc97/CrossAttentionControl). + +* `a ("fluffy cat").swap("smiling dog") eating a hotdog`. + * quotes optional: `a (fluffy cat).swap(smiling dog) eating a hotdog`. + * for single word substitutions parentheses are also optional: `a cat.swap(dog) eating a hotdog`. +* Supports options `s_start`, `s_end`, `t_start`, `t_end` (each 0-1) loosely corresponding to bloc97's `prompt_edit_spatial_start/_end` and `prompt_edit_tokens_start/_end` but with the math swapped to make it easier to intuitively understand. + * Example usage:`a (cat).swap(dog, s_end=0.3) eating a hotdog` - the `s_end` argument means that the "spatial" (self-attention) edit will stop having any effect after 30% (=0.3) of the steps have been done, leaving Stable Diffusion with 70% of the steps where it is free to decide for itself how to reshape the cat-form into a dog form. + * The numbers represent a percentage through the step sequence where the edits should happen. 0 means the start (noisy starting image), 1 is the end (final image). + * For img2img, the step sequence does not start at 0 but instead at (1-strength) - so if strength is 0.7, s_start and s_end must both be greater than 0.3 (1-0.7) to have any effect. +* Convenience option `shape_freedom` (0-1) to specify how much "freedom" Stable Diffusion should have to change the shape of the subject being swapped. + * `a (cat).swap(dog, shape_freedom=0.5) eating a hotdog`. + +### Escaping parantheses () and speech marks "" + +If the model you are using has parentheses () or speech marks "" as part of its syntax, you will need to "escape" these using a backslash, so that`(my_keyword)` becomes `\(my_keyword\)`. Otherwise, the prompt parser will attempt to interpret the parentheses as part of the prompt syntax and it will get confused. + ## **Prompt Blending** You may blend together different sections of the prompt to explore the From 83a3cc9eb480a0cedf4b7ff73a8427880af0171a Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 00:30:48 -0400 Subject: [PATCH 056/124] start support for 1.5 inpainting model, not complete --- ldm/generate.py | 11 ++++- ldm/invoke/generator/base.py | 19 ++++---- ldm/invoke/model_cache.py | 2 + ldm/models/autoencoder.py | 2 +- ldm/models/diffusion/ddim.py | 14 +++++- ldm/models/diffusion/ddpm.py | 79 +++++++++++++++++++++++++++++++- ldm/models/diffusion/ksampler.py | 2 + ldm/models/diffusion/sampler.py | 30 +++++++++++- 8 files changed, 145 insertions(+), 14 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index 8ffb7110a3..a834844e7e 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -404,7 +404,10 @@ class Generate: ) # TODO: Hacky selection of operation to perform. Needs to be refactored. - if (init_image is not None) and (mask_image is not None): + if self.sampler.conditioning_key() in ('hybrid','concat'): + print(f'** Inpainting model detected. Will try it! **') + generator = self._make_omnibus() + elif (init_image is not None) and (mask_image is not None): generator = self._make_inpaint() elif (embiggen != None or embiggen_tiles != None): generator = self._make_embiggen() @@ -690,6 +693,12 @@ class Generate: self.generators['inpaint'] = Inpaint(self.model, self.precision) return self.generators['inpaint'] + def _make_omnibus(self): + if not self.generators.get('omnibus'): + from ldm.invoke.generator.omnibus import Omnibus + self.generators['omnibus'] = Omnibus(self.model, self.precision) + return self.generators['omnibus'] + def load_model(self): ''' preload model identified in self.model_name diff --git a/ldm/invoke/generator/base.py b/ldm/invoke/generator/base.py index 89476cd216..c70924449b 100644 --- a/ldm/invoke/generator/base.py +++ b/ldm/invoke/generator/base.py @@ -40,12 +40,13 @@ class Generator(): self.variation_amount = variation_amount self.with_variations = with_variations - def generate(self,prompt,init_image,width,height,iterations=1,seed=None, + def generate(self,prompt,init_image,width,height,sampler, iterations=1,seed=None, image_callback=None, step_callback=None, threshold=0.0, perlin=0.0, **kwargs): scope = choose_autocast(self.precision) - make_image = self.get_make_image( + make_image = self.get_make_image( prompt, + sampler = sampler, init_image = init_image, width = width, height = height, @@ -54,13 +55,16 @@ class Generator(): perlin = perlin, **kwargs ) - results = [] seed = seed if seed is not None else self.new_seed() first_seed = seed seed, initial_noise = self.generate_initial_noise(seed, width, height) - with scope(self.model.device.type), self.model.ema_scope(): + + scope = (scope(self.model.device.type), self.model.ema_scope()) if sampler.conditioning_key() not in ('hybrid','concat') else scope(self.model.device.type) + + with scope: for n in trange(iterations, desc='Generating'): + print('DEBUG: in iterations loop() called') x_T = None if self.variation_amount > 0: seed_everything(seed) @@ -75,7 +79,6 @@ class Generator(): x_T = self.get_noise(width,height) except: pass - image = make_image(x_T) results.append([image, seed]) if image_callback is not None: @@ -83,10 +86,10 @@ class Generator(): seed = self.new_seed() return results - def sample_to_image(self,samples): + def sample_to_image(self,samples)->Image.Image: """ - Returns a function returning an image derived from the prompt and the initial image - Return value depends on the seed at the time you call it + Given samples returned from a sampler, converts + it into a PIL Image """ x_samples = self.model.decode_first_stage(samples) x_samples = torch.clamp((x_samples + 1.0) / 2.0, min=0.0, max=1.0) diff --git a/ldm/invoke/model_cache.py b/ldm/invoke/model_cache.py index f580dfba25..f972a9eb16 100644 --- a/ldm/invoke/model_cache.py +++ b/ldm/invoke/model_cache.py @@ -13,6 +13,7 @@ import gc import hashlib import psutil import transformers +import traceback import os from sys import getrefcount from omegaconf import OmegaConf @@ -73,6 +74,7 @@ class ModelCache(object): self.models[model_name]['hash'] = hash except Exception as e: print(f'** model {model_name} could not be loaded: {str(e)}') + print(traceback.format_exc()) print(f'** restoring {self.current_model}') self.get_model(self.current_model) return None diff --git a/ldm/models/autoencoder.py b/ldm/models/autoencoder.py index 359f5688d1..3db7b6fd73 100644 --- a/ldm/models/autoencoder.py +++ b/ldm/models/autoencoder.py @@ -66,7 +66,7 @@ class VQModel(pl.LightningModule): self.use_ema = use_ema if self.use_ema: self.model_ema = LitEma(self) - print(f'Keeping EMAs of {len(list(self.model_ema.buffers()))}.') + print(f'>> Keeping EMAs of {len(list(self.model_ema.buffers()))}.') if ckpt_path is not None: self.init_from_ckpt(ckpt_path, ignore_keys=ignore_keys) diff --git a/ldm/models/diffusion/ddim.py b/ldm/models/diffusion/ddim.py index f5dada8627..bfb78c1397 100644 --- a/ldm/models/diffusion/ddim.py +++ b/ldm/models/diffusion/ddim.py @@ -41,7 +41,19 @@ class DDIMSampler(Sampler): else: x_in = torch.cat([x] * 2) t_in = torch.cat([t] * 2) - c_in = torch.cat([unconditional_conditioning, c]) + if isinstance(c, dict): + assert isinstance(unconditional_conditioning, dict) + c_in = dict() + for k in c: + if isinstance(c[k], list): + c_in[k] = [ + torch.cat([unconditional_conditioning[k][i], c[k][i]]) + for i in range(len(c[k])) + ] + else: + c_in[k] = torch.cat([unconditional_conditioning[k], c[k]]) + else: + c_in = torch.cat([unconditional_conditioning, c]) e_t_uncond, e_t = self.model.apply_model(x_in, t_in, c_in).chunk(2) e_t = e_t_uncond + unconditional_guidance_scale * ( e_t - e_t_uncond diff --git a/ldm/models/diffusion/ddpm.py b/ldm/models/diffusion/ddpm.py index 4b62b5e393..fd3b6688f3 100644 --- a/ldm/models/diffusion/ddpm.py +++ b/ldm/models/diffusion/ddpm.py @@ -19,6 +19,7 @@ from functools import partial from tqdm import tqdm from torchvision.utils import make_grid from pytorch_lightning.utilities.distributed import rank_zero_only +from omegaconf import ListConfig import urllib from ldm.util import ( @@ -120,7 +121,7 @@ class DDPM(pl.LightningModule): self.use_ema = use_ema if self.use_ema: self.model_ema = LitEma(self.model) - print(f'Keeping EMAs of {len(list(self.model_ema.buffers()))}.') + print(f' | Keeping EMAs of {len(list(self.model_ema.buffers()))}.') self.use_scheduler = scheduler_config is not None if self.use_scheduler: @@ -1883,6 +1884,24 @@ class LatentDiffusion(DDPM): return samples, intermediates + @torch.no_grad() + def get_unconditional_conditioning(self, batch_size, null_label=None): + if null_label is not None: + xc = null_label + if isinstance(xc, ListConfig): + xc = list(xc) + if isinstance(xc, dict) or isinstance(xc, list): + c = self.get_learned_conditioning(xc) + else: + if hasattr(xc, "to"): + xc = xc.to(self.device) + c = self.get_learned_conditioning(xc) + else: + # todo: get null label from cond_stage_model + raise NotImplementedError() + c = repeat(c, "1 ... -> b ...", b=batch_size).to(self.device) + return c + @torch.no_grad() def log_images( self, @@ -2138,6 +2157,7 @@ class DiffusionWrapper(pl.LightningModule): ] def forward(self, x, t, c_concat: list = None, c_crossattn: list = None): + print(f'DEBUG (ddpm) c_concat = {c_concat}') if self.conditioning_key is None: out = self.diffusion_model(x, t) elif self.conditioning_key == 'concat': @@ -2147,8 +2167,8 @@ class DiffusionWrapper(pl.LightningModule): cc = torch.cat(c_crossattn, 1) out = self.diffusion_model(x, t, context=cc) elif self.conditioning_key == 'hybrid': - xc = torch.cat([x] + c_concat, dim=1) cc = torch.cat(c_crossattn, 1) + xc = torch.cat([x] + c_concat, dim=1) out = self.diffusion_model(xc, t, context=cc) elif self.conditioning_key == 'adm': cc = c_crossattn[0] @@ -2187,3 +2207,58 @@ class Layout2ImgDiffusion(LatentDiffusion): cond_img = torch.stack(bbox_imgs, dim=0) logs['bbox_image'] = cond_img return logs + +class LatentInpaintDiffusion(LatentDiffusion): + def __init__( + self, + concat_keys=("mask", "masked_image"), + masked_image_key="masked_image", + finetune_keys=None, + *args, + **kwargs, + ): + super().__init__(*args, **kwargs) + self.masked_image_key = masked_image_key + assert self.masked_image_key in concat_keys + self.concat_keys = concat_keys + + + @torch.no_grad() + def get_input( + self, batch, k, cond_key=None, bs=None, return_first_stage_outputs=False + ): + # note: restricted to non-trainable encoders currently + assert ( + not self.cond_stage_trainable + ), "trainable cond stages not yet supported for inpainting" + z, c, x, xrec, xc = super().get_input( + batch, + self.first_stage_key, + return_first_stage_outputs=True, + force_c_encode=True, + return_original_cond=True, + bs=bs, + ) + + assert exists(self.concat_keys) + c_cat = list() + for ck in self.concat_keys: + cc = ( + rearrange(batch[ck], "b h w c -> b c h w") + .to(memory_format=torch.contiguous_format) + .float() + ) + if bs is not None: + cc = cc[:bs] + cc = cc.to(self.device) + bchw = z.shape + if ck != self.masked_image_key: + cc = torch.nn.functional.interpolate(cc, size=bchw[-2:]) + else: + cc = self.get_first_stage_encoding(self.encode_first_stage(cc)) + c_cat.append(cc) + c_cat = torch.cat(c_cat, dim=1) + all_conds = {"c_concat": [c_cat], "c_crossattn": [c]} + if return_first_stage_outputs: + return z, all_conds, x, xrec, xc + return z, all_conds diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index ac0615b30c..68c26b5d6c 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -281,3 +281,5 @@ class KSampler(Sampler): ''' return self.model.inner_model.q_sample(x0,ts) + def conditioning_key(self)->str: + return self.model.inner_model.model.conditioning_key diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index ff705513f8..9e57bc25d4 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -158,6 +158,18 @@ class Sampler(object): **kwargs, ): + if conditioning is not None: + if isinstance(conditioning, dict): + ctmp = conditioning[list(conditioning.keys())[0]] + while isinstance(ctmp, list): + ctmp = ctmp[0] + cbs = ctmp.shape[0] + if cbs != batch_size: + print(f"Warning: Got {cbs} conditionings but batch-size is {batch_size}") + else: + if conditioning.shape[0] != batch_size: + print(f"Warning: Got {conditioning.shape[0]} conditionings but batch-size is {batch_size}") + # check to see if make_schedule() has run, and if not, run it if self.ddim_timesteps is None: self.make_schedule( @@ -193,7 +205,7 @@ class Sampler(object): ) return samples, intermediates - #torch.no_grad() + @torch.no_grad() def do_sampling( self, cond, @@ -307,6 +319,19 @@ class Sampler(object): mask = None, ): + print(f'DEBUG(sampler): cond = {cond}') + if cond is not None: + if isinstance(cond, dict): + ctmp = cond[list(cond.keys())[0]] + while isinstance(ctmp, list): + ctmp = ctmp[0] + cbs = ctmp.shape[0] + if cbs != batch_size: + print(f"Warning: Got {cbs} conds but batch-size is {batch_size}") + else: + if cond.shape[0] != batch_size: + print(f"Warning: Got {cond.shape[0]} conditionings but batch-size is {batch_size}") + timesteps = ( np.arange(self.ddpm_num_timesteps) if use_original_steps @@ -411,3 +436,6 @@ class Sampler(object): return self.model.inner_model.q_sample(x0,ts) ''' return self.model.q_sample(x0,ts) + + def conditioning_key(self)->str: + return self.model.model.conditioning_key From be8a992b85f9c10eac380161849b9e4e69978908 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 00:38:24 -0400 Subject: [PATCH 057/124] add missing file --- ldm/invoke/generator/omnibus.py | 144 ++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 ldm/invoke/generator/omnibus.py diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py new file mode 100644 index 0000000000..43192cd152 --- /dev/null +++ b/ldm/invoke/generator/omnibus.py @@ -0,0 +1,144 @@ +"""omnibus module to be used with the runwayml 9-channel custom inpainting model""" + +import torch +import numpy as np +from PIL import Image +from ldm.invoke.generator.base import downsampling +from ldm.invoke.generator.img2img import Img2Img +from ldm.invoke.generator.txt2img import Txt2Img + +class Omnibus(Img2Img,Txt2Img): + def __init__(self, model, precision): + super().__init__(model, precision) + + def get_make_image( + self, + prompt, + sampler, + steps, + cfg_scale, + ddim_eta, + conditioning, + width, + height, + init_image = None, + mask_image = None, + strength = None, + step_callback=None, + threshold=0.0, + perlin=0.0, + **kwargs): + """ + Returns a function returning an image derived from the prompt and the initial image + Return value depends on the seed at the time you call it. + """ + self.perlin = perlin + + sampler.make_schedule( + ddim_num_steps=steps, ddim_eta=ddim_eta, verbose=False + ) + + if isinstance(init_image, Image.Image): + init_image = self._image_to_tensor(init_image) + + if isinstance(mask_image, Image.Image): + mask_image = self._image_to_tensor(mask_image,normalize=False) + + t_enc = steps + + if init_image is not None and mask_image is not None: # inpainting + masked_image = init_image * (1 - mask_image) # masked image is the image masked by mask - masked regions zero + + elif init_image is not None: # img2img + scope = choose_autocast(self.precision) + with scope(self.model.device.type): + self.init_latent = self.model.get_first_stage_encoding( + self.model.encode_first_stage(init_image) + ) # move to latent space + # create a completely black mask (1s) + mask_image = torch.ones(init_image.shape[0], 3, init_image.width, init_image.height, device=self.model.device) + # and the masked image is just a copy of the original + masked_image = init_image + t_enc = int(strength * steps) + + else: # txt2img + mask_image = torch.zeros(init_image.shape[0], 3, init_image.width, init_image.height, device=self.model.device) + masked_image = mask_image + + model = self.model + + def make_image(x_T): + with torch.no_grad(): + with torch.autocast("cuda"): + + batch = self.make_batch_sd( + init_image, + mask_image, + masked_image, + prompt=prompt, + device=model.device, + num_samples=1 + ) + + c = model.cond_stage_model.encode(batch["txt"]) + + c_cat = list() + for ck in model.concat_keys: + cc = batch[ck].float() + if ck != model.masked_image_key: + bchw = [num_samples, 4, h//8, w//8] + cc = torch.nn.functional.interpolate(cc, size=bchw[-2:]) + else: + cc = model.get_first_stage_encoding(model.encode_first_stage(cc)) + c_cat.append(cc) + c_cat = torch.cat(c_cat, dim=1) + + # cond + cond={"c_concat": [c_cat], "c_crossattn": [c]} + + # uncond cond + uc_cross = model.get_unconditional_conditioning(num_samples, "") + uc_full = {"c_concat": [c_cat], "c_crossattn": [uc_cross]} + shape = [model.channels, h//8, w//8] + + samples, = sampler.sample( + batch_size = 1, + S = t_enc, + x_T = x_T, + conditioning = cond, + shape = shape, + verbose = False, + unconditional_guidance_scale = cfg_scale, + unconditional_conditioning = uc_full, + eta = 1.0, + img_callback = step_callback, + threshold = threshold, + ) + if self.free_gpu_mem: + self.model.model.to("cpu") + return self.sample_to_image(samples) + + return make_image + + def make_batch_sd( + image, + mask, + masked_image, + prompt, + device, + num_samples=1): + batch = { + "image": repeat(image.to(device=device), "1 ... -> n ...", n=num_samples), + "txt": num_samples * [prompt], + "mask": repeat(mask.to(device=device), "1 ... -> n ...", n=num_samples), + "masked_image": repeat(masked_image.to(device=device), "1 ... -> n ...", n=num_samples), + } + return batch + + def get_noise(self, width:int, height:int): + if self.init_latent: + print('DEBUG: returning Img2Img.getnoise()') + return super(Img2Img,self).get_noise(width,height) + else: + print('DEBUG: returning Txt2Img.getnoise()') + return super(Txt2Img,self).get_noise(width,height) From a2e53892ec97fa4057e2a2a022ffd92c372bad17 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 00:47:13 -0400 Subject: [PATCH 058/124] fixed synax errors; now channel mismatch issue --- ldm/invoke/generator/omnibus.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index 43192cd152..b6ddbfdb03 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -2,6 +2,7 @@ import torch import numpy as np +from einops import repeat from PIL import Image from ldm.invoke.generator.base import downsampling from ldm.invoke.generator.img2img import Img2Img @@ -33,6 +34,7 @@ class Omnibus(Img2Img,Txt2Img): Return value depends on the seed at the time you call it. """ self.perlin = perlin + num_samples = 1 sampler.make_schedule( ddim_num_steps=steps, ddim_eta=ddim_eta, verbose=False @@ -77,7 +79,7 @@ class Omnibus(Img2Img,Txt2Img): masked_image, prompt=prompt, device=model.device, - num_samples=1 + num_samples=num_samples, ) c = model.cond_stage_model.encode(batch["txt"]) @@ -86,7 +88,7 @@ class Omnibus(Img2Img,Txt2Img): for ck in model.concat_keys: cc = batch[ck].float() if ck != model.masked_image_key: - bchw = [num_samples, 4, h//8, w//8] + bchw = [num_samples, 4, height//8, width//8] cc = torch.nn.functional.interpolate(cc, size=bchw[-2:]) else: cc = model.get_first_stage_encoding(model.encode_first_stage(cc)) @@ -99,7 +101,7 @@ class Omnibus(Img2Img,Txt2Img): # uncond cond uc_cross = model.get_unconditional_conditioning(num_samples, "") uc_full = {"c_concat": [c_cat], "c_crossattn": [uc_cross]} - shape = [model.channels, h//8, w//8] + shape = [model.channels, height//8, width//8] samples, = sampler.sample( batch_size = 1, @@ -121,6 +123,7 @@ class Omnibus(Img2Img,Txt2Img): return make_image def make_batch_sd( + self, image, mask, masked_image, From 175c7bddfc531fe59ded96ef881186ff06331c48 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 07:12:31 -0400 Subject: [PATCH 059/124] add missing inpainting yaml file --- .../v1-inpainting-inference.yaml | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 configs/stable-diffusion/v1-inpainting-inference.yaml diff --git a/configs/stable-diffusion/v1-inpainting-inference.yaml b/configs/stable-diffusion/v1-inpainting-inference.yaml new file mode 100644 index 0000000000..5652e04374 --- /dev/null +++ b/configs/stable-diffusion/v1-inpainting-inference.yaml @@ -0,0 +1,79 @@ +model: + base_learning_rate: 7.5e-05 + target: ldm.models.diffusion.ddpm.LatentInpaintDiffusion + params: + linear_start: 0.00085 + linear_end: 0.0120 + num_timesteps_cond: 1 + log_every_t: 200 + timesteps: 1000 + first_stage_key: "jpg" + cond_stage_key: "txt" + image_size: 64 + channels: 4 + cond_stage_trainable: false # Note: different from the one we trained before + conditioning_key: hybrid # important + monitor: val/loss_simple_ema + scale_factor: 0.18215 + finetune_keys: null + + scheduler_config: # 10000 warmup steps + target: ldm.lr_scheduler.LambdaLinearScheduler + params: + warm_up_steps: [ 2500 ] # NOTE for resuming. use 10000 if starting from scratch + cycle_lengths: [ 10000000000000 ] # incredibly large number to prevent corner cases + f_start: [ 1.e-6 ] + f_max: [ 1. ] + f_min: [ 1. ] + + personalization_config: + target: ldm.modules.embedding_manager.EmbeddingManager + params: + placeholder_strings: ["*"] + initializer_words: ['face', 'man', 'photo', 'africanmale'] + per_image_tokens: false + num_vectors_per_token: 1 + progressive_words: False + + unet_config: + target: ldm.modules.diffusionmodules.openaimodel.UNetModel + params: + image_size: 32 # unused + in_channels: 9 # 4 data + 4 downscaled image + 1 mask + out_channels: 4 + model_channels: 320 + attention_resolutions: [ 4, 2, 1 ] + num_res_blocks: 2 + channel_mult: [ 1, 2, 4, 4 ] + num_heads: 8 + use_spatial_transformer: True + transformer_depth: 1 + context_dim: 768 + use_checkpoint: True + legacy: False + + first_stage_config: + target: ldm.models.autoencoder.AutoencoderKL + params: + embed_dim: 4 + monitor: val/rec_loss + ddconfig: + double_z: true + z_channels: 4 + resolution: 256 + in_channels: 3 + out_ch: 3 + ch: 128 + ch_mult: + - 1 + - 2 + - 4 + - 4 + num_res_blocks: 2 + attn_resolutions: [] + dropout: 0.0 + lossconfig: + target: torch.nn.Identity + + cond_stage_config: + target: ldm.modules.encoders.modules.FrozenCLIPEmbedder From aaf7a4f1d3573f832a4231f4e2f7976f09ec3a89 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 10:00:28 -0400 Subject: [PATCH 060/124] inpaint and txt2img working with ddim sampler --- ldm/generate.py | 5 +++++ ldm/invoke/generator/img2img.py | 5 ++++- ldm/invoke/generator/omnibus.py | 18 ++++++++++++------ ldm/models/diffusion/ddpm.py | 1 - 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index a834844e7e..e1d35e6607 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -655,6 +655,7 @@ class Generate: return init_image,init_mask + # lots o' repeated code here! Turn into a make_func() def _make_base(self): if not self.generators.get('base'): from ldm.invoke.generator import Generator @@ -665,6 +666,7 @@ class Generate: if not self.generators.get('img2img'): from ldm.invoke.generator.img2img import Img2Img self.generators['img2img'] = Img2Img(self.model, self.precision) + self.generators['img2img'].free_gpu_mem = self.free_gpu_mem return self.generators['img2img'] def _make_embiggen(self): @@ -693,10 +695,13 @@ class Generate: self.generators['inpaint'] = Inpaint(self.model, self.precision) return self.generators['inpaint'] + # "omnibus" supports the runwayML custom inpainting model, which does + # txt2img, img2img and inpainting using slight variations on the same code def _make_omnibus(self): if not self.generators.get('omnibus'): from ldm.invoke.generator.omnibus import Omnibus self.generators['omnibus'] = Omnibus(self.model, self.precision) + self.generators['omnibus'].free_gpu_mem = self.free_gpu_mem return self.generators['omnibus'] def load_model(self): diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 613f1aca31..31c3ca256e 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -77,7 +77,10 @@ class Img2Img(Generator): def _image_to_tensor(self, image:Image, normalize:bool=True)->Tensor: image = np.array(image).astype(np.float32) / 255.0 - image = image[None].transpose(0, 3, 1, 2) + if len(image.shape) == 2: # 'L' image, as in a mask + image = image[None,None] + else: # 'RGB' image + image = image[None].transpose(0, 3, 1, 2) image = torch.from_numpy(image) if normalize: image = 2.0 * image - 1.0 diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index b6ddbfdb03..fd3d3d47f2 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -3,7 +3,7 @@ import torch import numpy as np from einops import repeat -from PIL import Image +from PIL import Image, ImageOps from ldm.invoke.generator.base import downsampling from ldm.invoke.generator.img2img import Img2Img from ldm.invoke.generator.txt2img import Txt2Img @@ -44,7 +44,7 @@ class Omnibus(Img2Img,Txt2Img): init_image = self._image_to_tensor(init_image) if isinstance(mask_image, Image.Image): - mask_image = self._image_to_tensor(mask_image,normalize=False) + mask_image = self._image_to_tensor(ImageOps.invert(mask_image).convert('L'),normalize=False) t_enc = steps @@ -53,10 +53,12 @@ class Omnibus(Img2Img,Txt2Img): elif init_image is not None: # img2img scope = choose_autocast(self.precision) + with scope(self.model.device.type): self.init_latent = self.model.get_first_stage_encoding( self.model.encode_first_stage(init_image) ) # move to latent space + # create a completely black mask (1s) mask_image = torch.ones(init_image.shape[0], 3, init_image.width, init_image.height, device=self.model.device) # and the masked image is just a copy of the original @@ -64,8 +66,9 @@ class Omnibus(Img2Img,Txt2Img): t_enc = int(strength * steps) else: # txt2img - mask_image = torch.zeros(init_image.shape[0], 3, init_image.width, init_image.height, device=self.model.device) - masked_image = mask_image + init_image = torch.zeros(1, 3, width, height, device=self.model.device) + mask_image = torch.ones(1, 1, width, height, device=self.model.device) + masked_image = init_image model = self.model @@ -102,8 +105,8 @@ class Omnibus(Img2Img,Txt2Img): uc_cross = model.get_unconditional_conditioning(num_samples, "") uc_full = {"c_concat": [c_cat], "c_crossattn": [uc_cross]} shape = [model.channels, height//8, width//8] - - samples, = sampler.sample( + + samples, _ = sampler.sample( batch_size = 1, S = t_enc, x_T = x_T, @@ -136,6 +139,9 @@ class Omnibus(Img2Img,Txt2Img): "mask": repeat(mask.to(device=device), "1 ... -> n ...", n=num_samples), "masked_image": repeat(masked_image.to(device=device), "1 ... -> n ...", n=num_samples), } + print(f'DEBUG: image = {batch["image"]} shape={batch["image"].shape}') + print(f'DEBUG: mask = {batch["mask"]} shape={batch["mask"].shape}') + print(f'DEBUG: masked_image = {batch["masked_image"]} shape={batch["masked_image"].shape}') return batch def get_noise(self, width:int, height:int): diff --git a/ldm/models/diffusion/ddpm.py b/ldm/models/diffusion/ddpm.py index fd3b6688f3..26492baf7c 100644 --- a/ldm/models/diffusion/ddpm.py +++ b/ldm/models/diffusion/ddpm.py @@ -2157,7 +2157,6 @@ class DiffusionWrapper(pl.LightningModule): ] def forward(self, x, t, c_concat: list = None, c_crossattn: list = None): - print(f'DEBUG (ddpm) c_concat = {c_concat}') if self.conditioning_key is None: out = self.diffusion_model(x, t) elif self.conditioning_key == 'concat': From b101be041bb1de73f637711b40936aff8c82aceb Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 10:45:12 -0400 Subject: [PATCH 061/124] add support for runwayML custom inpainting model This is still a work in progress but seems functional. It supports inpainting, txt2img and img2img on the ddim and k* samplers (plms still needs work, but I know what to do). To test this, get the file `sd-v1-5-inpainting.ckpt' from https://huggingface.co/runwayml/stable-diffusion-inpainting and place it at `models/ldm/stable-diffusion-v1/sd-v1-5-inpainting.ckpt` Launch invoke.py with --model inpainting-1.5 and proceed as usual. Caveats: 1. The inpainting model takes about 800 Mb more memory than the standard 1.5 model. This model will not work on 4 GB cards. 2. The inpainting model is temperamental. It wants you to describe the entire scene and not just the masked area to replace. So if you want to replace the parrot on a man's shoulder with a crow, the prompt "crow" may fail. Try "man with a crow on shoulder" instead. The symptom of a failed inpainting is that the area will be erased and replaced with background. 3. This has not been tested well. Please report bugs. --- configs/models.yaml | 7 +++++++ ldm/invoke/generator/omnibus.py | 11 ++++------- ldm/models/diffusion/ksampler.py | 22 +++++++++++++++++++--- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/configs/models.yaml b/configs/models.yaml index 46bc2df8b4..9522f025b1 100644 --- a/configs/models.yaml +++ b/configs/models.yaml @@ -13,6 +13,13 @@ stable-diffusion-1.4: default: true width: 512 height: 512 +inpainting-1.5: + description: runwayML tuned inpainting model v1.5 + weights: models/ldm/stable-diffusion-v1/sd-v1-5-inpainting.ckpt + config: configs/stable-diffusion/v1-inpainting-inference.yaml +# vae: models/ldm/stable-diffusion-v1/vae-ft-mse-840000-ema-pruned.ckpt + width: 512 + height: 512 stable-diffusion-1.5: config: configs/stable-diffusion/v1-inference.yaml weights: models/ldm/stable-diffusion-v1/v1-5-pruned-emaonly.ckpt diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index fd3d3d47f2..99fe046654 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -4,6 +4,7 @@ import torch import numpy as np from einops import repeat from PIL import Image, ImageOps +from ldm.invoke.devices import choose_autocast from ldm.invoke.generator.base import downsampling from ldm.invoke.generator.img2img import Img2Img from ldm.invoke.generator.txt2img import Txt2Img @@ -60,7 +61,7 @@ class Omnibus(Img2Img,Txt2Img): ) # move to latent space # create a completely black mask (1s) - mask_image = torch.ones(init_image.shape[0], 3, init_image.width, init_image.height, device=self.model.device) + mask_image = torch.ones(1, 1, init_image.shape[2], init_image.shape[3], device=self.model.device) # and the masked image is just a copy of the original masked_image = init_image t_enc = int(strength * steps) @@ -74,7 +75,8 @@ class Omnibus(Img2Img,Txt2Img): def make_image(x_T): with torch.no_grad(): - with torch.autocast("cuda"): + scope = choose_autocast(self.precision) + with scope(self.model.device.type): batch = self.make_batch_sd( init_image, @@ -139,15 +141,10 @@ class Omnibus(Img2Img,Txt2Img): "mask": repeat(mask.to(device=device), "1 ... -> n ...", n=num_samples), "masked_image": repeat(masked_image.to(device=device), "1 ... -> n ...", n=num_samples), } - print(f'DEBUG: image = {batch["image"]} shape={batch["image"].shape}') - print(f'DEBUG: mask = {batch["mask"]} shape={batch["mask"].shape}') - print(f'DEBUG: masked_image = {batch["masked_image"]} shape={batch["masked_image"].shape}') return batch def get_noise(self, width:int, height:int): if self.init_latent: - print('DEBUG: returning Img2Img.getnoise()') return super(Img2Img,self).get_noise(width,height) else: - print('DEBUG: returning Txt2Img.getnoise()') return super(Txt2Img,self).get_noise(width,height) diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 68c26b5d6c..59a3bebe4d 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -12,6 +12,22 @@ from ldm.modules.diffusionmodules.util import ( extract_into_tensor, ) +def make_cond_in(uncond, cond): + if isinstance(cond, dict): + assert isinstance(uncond, dict) + cond_in = dict() + for k in cond: + if isinstance(cond[k], list): + cond_in[k] = [ + torch.cat([uncond[k][i], cond[k][i]]) + for i in range(len(cond[k])) + ] + else: + cond_in[k] = torch.cat([uncond[k], cond[k]]) + else: + cond_in = torch.cat([uncond, cond]) + return cond_in + def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): if threshold <= 0.0: return result @@ -37,7 +53,7 @@ class CFGDenoiser(nn.Module): def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) - cond_in = torch.cat([uncond, cond]) + cond_in = make_cond_in(uncond,cond) uncond, cond = self.inner_model(x_in, sigma_in, cond=cond_in).chunk(2) if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) @@ -64,13 +80,12 @@ class KSampler(Sampler): def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) - cond_in = torch.cat([uncond, cond]) + cond_in = make_cond_in(uncond, cond) uncond, cond = self.inner_model( x_in, sigma_in, cond=cond_in ).chunk(2) return uncond + (cond - uncond) * cond_scale - def make_schedule( self, ddim_num_steps, @@ -283,3 +298,4 @@ class KSampler(Sampler): def conditioning_key(self)->str: return self.model.inner_model.model.conditioning_key + From 83e1c39ab85de131175edef209ff416ee1fd8814 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 11:42:30 -0400 Subject: [PATCH 062/124] plms works, bugs quashed - The plms sampler now works with custom inpainting model - Quashed bug that was causing generation on normal models to fail (oops!) - Can now generate non-square images with custom inpainting model --- ldm/invoke/generator/base.py | 7 +++---- ldm/invoke/generator/omnibus.py | 4 ++-- ldm/models/diffusion/ksampler.py | 27 ++++++--------------------- ldm/models/diffusion/plms.py | 2 +- ldm/models/diffusion/sampler.py | 21 +++++++++++++++++++++ 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/ldm/invoke/generator/base.py b/ldm/invoke/generator/base.py index c70924449b..03f066323c 100644 --- a/ldm/invoke/generator/base.py +++ b/ldm/invoke/generator/base.py @@ -60,11 +60,10 @@ class Generator(): first_seed = seed seed, initial_noise = self.generate_initial_noise(seed, width, height) - scope = (scope(self.model.device.type), self.model.ema_scope()) if sampler.conditioning_key() not in ('hybrid','concat') else scope(self.model.device.type) - - with scope: + # There used to be an additional self.model.ema_scope() here, but it breaks + # the inpaint-1.5 model. Not sure what it did.... ? + with scope(self.model.device.type): for n in trange(iterations, desc='Generating'): - print('DEBUG: in iterations loop() called') x_T = None if self.variation_amount > 0: seed_everything(seed) diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index 99fe046654..c8de01addb 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -67,8 +67,8 @@ class Omnibus(Img2Img,Txt2Img): t_enc = int(strength * steps) else: # txt2img - init_image = torch.zeros(1, 3, width, height, device=self.model.device) - mask_image = torch.ones(1, 1, width, height, device=self.model.device) + init_image = torch.zeros(1, 3, height, width, device=self.model.device) + mask_image = torch.ones(1, 1, height, width, device=self.model.device) masked_image = init_image model = self.model diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 59a3bebe4d..5f223cdf46 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -12,22 +12,6 @@ from ldm.modules.diffusionmodules.util import ( extract_into_tensor, ) -def make_cond_in(uncond, cond): - if isinstance(cond, dict): - assert isinstance(uncond, dict) - cond_in = dict() - for k in cond: - if isinstance(cond[k], list): - cond_in[k] = [ - torch.cat([uncond[k][i], cond[k][i]]) - for i in range(len(cond[k])) - ] - else: - cond_in[k] = torch.cat([uncond[k], cond[k]]) - else: - cond_in = torch.cat([uncond, cond]) - return cond_in - def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): if threshold <= 0.0: return result @@ -43,9 +27,10 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): class CFGDenoiser(nn.Module): - def __init__(self, model, threshold = 0, warmup = 0): + def __init__(self, sampler, threshold = 0, warmup = 0): super().__init__() - self.inner_model = model + self.inner_model = sampler.model + self.sampler = sampler self.threshold = threshold self.warmup_max = warmup self.warmup = max(warmup / 10, 1) @@ -53,7 +38,7 @@ class CFGDenoiser(nn.Module): def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) - cond_in = make_cond_in(uncond,cond) + cond_in = self.sampler.make_cond_in(uncond,cond) uncond, cond = self.inner_model(x_in, sigma_in, cond=cond_in).chunk(2) if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) @@ -80,7 +65,7 @@ class KSampler(Sampler): def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) - cond_in = make_cond_in(uncond, cond) + cond_in = self.make_cond_in(uncond, cond) uncond, cond = self.inner_model( x_in, sigma_in, cond=cond_in ).chunk(2) @@ -209,7 +194,7 @@ class KSampler(Sampler): else: x = torch.randn([batch_size, *shape], device=self.device) * sigmas[0] - model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10)) + model_wrap_cfg = CFGDenoiser(self, threshold=threshold, warmup=max(0.8*S,S-10)) extra_args = { 'cond': conditioning, 'uncond': unconditional_conditioning, diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index 9e722eb932..4261f549d2 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -45,7 +45,7 @@ class PLMSSampler(Sampler): else: x_in = torch.cat([x] * 2) t_in = torch.cat([t] * 2) - c_in = torch.cat([unconditional_conditioning, c]) + c_in = self.make_cond_in(unconditional_conditioning, c) e_t_uncond, e_t = self.model.apply_model( x_in, t_in, c_in ).chunk(2) diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index 9e57bc25d4..fd7ba106c1 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -439,3 +439,24 @@ class Sampler(object): def conditioning_key(self)->str: return self.model.model.conditioning_key + + def make_cond_in(self, uncond, cond): + ''' + This handles the choice between a conditional conditioning + that is a tensor (used by cross attention) vs one that is a dict + used by 'hybrid' + ''' + if isinstance(cond, dict): + assert isinstance(uncond, dict) + cond_in = dict() + for k in cond: + if isinstance(cond[k], list): + cond_in[k] = [ + torch.cat([uncond[k][i], cond[k][i]]) + for i in range(len(cond[k])) + ] + else: + cond_in[k] = torch.cat([uncond[k], cond[k]]) + else: + cond_in = torch.cat([uncond, cond]) + return cond_in From e33971fe2cb046d08548366bc775a4091b0739ea Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 11:42:30 -0400 Subject: [PATCH 063/124] plms works, bugs quashed - The plms sampler now works with custom inpainting model - Quashed bug that was causing generation on normal models to fail (oops!) - Can now generate non-square images with custom inpainting model Credits for advice and assistance during porting: @any-winter-4079 (http://github.com/any-winter-4079) @db3000 (Danny Beer http://github.com/db3000) --- ldm/invoke/generator/base.py | 7 +++---- ldm/invoke/generator/omnibus.py | 4 ++-- ldm/models/diffusion/ksampler.py | 27 ++++++--------------------- ldm/models/diffusion/plms.py | 2 +- ldm/models/diffusion/sampler.py | 21 +++++++++++++++++++++ 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/ldm/invoke/generator/base.py b/ldm/invoke/generator/base.py index c70924449b..03f066323c 100644 --- a/ldm/invoke/generator/base.py +++ b/ldm/invoke/generator/base.py @@ -60,11 +60,10 @@ class Generator(): first_seed = seed seed, initial_noise = self.generate_initial_noise(seed, width, height) - scope = (scope(self.model.device.type), self.model.ema_scope()) if sampler.conditioning_key() not in ('hybrid','concat') else scope(self.model.device.type) - - with scope: + # There used to be an additional self.model.ema_scope() here, but it breaks + # the inpaint-1.5 model. Not sure what it did.... ? + with scope(self.model.device.type): for n in trange(iterations, desc='Generating'): - print('DEBUG: in iterations loop() called') x_T = None if self.variation_amount > 0: seed_everything(seed) diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index 99fe046654..c8de01addb 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -67,8 +67,8 @@ class Omnibus(Img2Img,Txt2Img): t_enc = int(strength * steps) else: # txt2img - init_image = torch.zeros(1, 3, width, height, device=self.model.device) - mask_image = torch.ones(1, 1, width, height, device=self.model.device) + init_image = torch.zeros(1, 3, height, width, device=self.model.device) + mask_image = torch.ones(1, 1, height, width, device=self.model.device) masked_image = init_image model = self.model diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 59a3bebe4d..5f223cdf46 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -12,22 +12,6 @@ from ldm.modules.diffusionmodules.util import ( extract_into_tensor, ) -def make_cond_in(uncond, cond): - if isinstance(cond, dict): - assert isinstance(uncond, dict) - cond_in = dict() - for k in cond: - if isinstance(cond[k], list): - cond_in[k] = [ - torch.cat([uncond[k][i], cond[k][i]]) - for i in range(len(cond[k])) - ] - else: - cond_in[k] = torch.cat([uncond[k], cond[k]]) - else: - cond_in = torch.cat([uncond, cond]) - return cond_in - def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): if threshold <= 0.0: return result @@ -43,9 +27,10 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): class CFGDenoiser(nn.Module): - def __init__(self, model, threshold = 0, warmup = 0): + def __init__(self, sampler, threshold = 0, warmup = 0): super().__init__() - self.inner_model = model + self.inner_model = sampler.model + self.sampler = sampler self.threshold = threshold self.warmup_max = warmup self.warmup = max(warmup / 10, 1) @@ -53,7 +38,7 @@ class CFGDenoiser(nn.Module): def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) - cond_in = make_cond_in(uncond,cond) + cond_in = self.sampler.make_cond_in(uncond,cond) uncond, cond = self.inner_model(x_in, sigma_in, cond=cond_in).chunk(2) if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) @@ -80,7 +65,7 @@ class KSampler(Sampler): def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) sigma_in = torch.cat([sigma] * 2) - cond_in = make_cond_in(uncond, cond) + cond_in = self.make_cond_in(uncond, cond) uncond, cond = self.inner_model( x_in, sigma_in, cond=cond_in ).chunk(2) @@ -209,7 +194,7 @@ class KSampler(Sampler): else: x = torch.randn([batch_size, *shape], device=self.device) * sigmas[0] - model_wrap_cfg = CFGDenoiser(self.model, threshold=threshold, warmup=max(0.8*S,S-10)) + model_wrap_cfg = CFGDenoiser(self, threshold=threshold, warmup=max(0.8*S,S-10)) extra_args = { 'cond': conditioning, 'uncond': unconditional_conditioning, diff --git a/ldm/models/diffusion/plms.py b/ldm/models/diffusion/plms.py index 9e722eb932..4261f549d2 100644 --- a/ldm/models/diffusion/plms.py +++ b/ldm/models/diffusion/plms.py @@ -45,7 +45,7 @@ class PLMSSampler(Sampler): else: x_in = torch.cat([x] * 2) t_in = torch.cat([t] * 2) - c_in = torch.cat([unconditional_conditioning, c]) + c_in = self.make_cond_in(unconditional_conditioning, c) e_t_uncond, e_t = self.model.apply_model( x_in, t_in, c_in ).chunk(2) diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index 9e57bc25d4..fd7ba106c1 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -439,3 +439,24 @@ class Sampler(object): def conditioning_key(self)->str: return self.model.model.conditioning_key + + def make_cond_in(self, uncond, cond): + ''' + This handles the choice between a conditional conditioning + that is a tensor (used by cross attention) vs one that is a dict + used by 'hybrid' + ''' + if isinstance(cond, dict): + assert isinstance(uncond, dict) + cond_in = dict() + for k in cond: + if isinstance(cond[k], list): + cond_in[k] = [ + torch.cat([uncond[k][i], cond[k][i]]) + for i in range(len(cond[k])) + ] + else: + cond_in[k] = torch.cat([uncond[k], cond[k]]) + else: + cond_in = torch.cat([uncond, cond]) + return cond_in From 4352eb6628bcc0369a739c5b1055cc2c7e407da6 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 13:17:06 -0400 Subject: [PATCH 064/124] stop crashes on non-square images --- ldm/invoke/generator/omnibus.py | 3 ++- ldm/invoke/restoration/outcrop.py | 7 ++++++- ldm/models/diffusion/sampler.py | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index c8de01addb..2fccd7c6f7 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -71,6 +71,8 @@ class Omnibus(Img2Img,Txt2Img): mask_image = torch.ones(1, 1, height, width, device=self.model.device) masked_image = init_image + height = init_image.shape[2] + width = init_image.shape[3] model = self.model def make_image(x_T): @@ -88,7 +90,6 @@ class Omnibus(Img2Img,Txt2Img): ) c = model.cond_stage_model.encode(batch["txt"]) - c_cat = list() for ck in model.concat_keys: cc = batch[ck].float() diff --git a/ldm/invoke/restoration/outcrop.py b/ldm/invoke/restoration/outcrop.py index 017d9de7e1..0c4831dd84 100644 --- a/ldm/invoke/restoration/outcrop.py +++ b/ldm/invoke/restoration/outcrop.py @@ -89,6 +89,9 @@ class Outcrop(object): def _extend(self,image:Image,pixels:int)-> Image: extended_img = Image.new('RGBA',(image.width,image.height+pixels)) + mask_height = pixels if self.generate.model.model.conditioning_key in ('hybrid','concat') \ + else pixels *2 + # first paste places old image at top of extended image, stretch # it, and applies a gaussian blur to it # take the top half region, stretch and paste it @@ -105,7 +108,9 @@ class Outcrop(object): # now make the top part transparent to use as a mask alpha = extended_img.getchannel('A') - alpha.paste(0,(0,0,extended_img.width,pixels*2)) + alpha.paste(0,(0,0,extended_img.width,mask_height)) extended_img.putalpha(alpha) + extended_img.save('outputs/curly_extended.png') + return extended_img diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index fd7ba106c1..4e9fce0102 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -265,6 +265,7 @@ class Sampler(object): ) if mask is not None: + print('DEBUG: in masking routine') assert x0 is not None img_orig = self.model.q_sample( x0, ts From 3c1ef48fe24c027131b7c846970bec963b6c2b69 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 13:57:42 -0400 Subject: [PATCH 065/124] fix crash when doing img2img with ddim sampler and SD 1.5 --- ldm/models/diffusion/sampler.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index 4e9fce0102..ccebed3bfc 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -319,20 +319,6 @@ class Sampler(object): init_latent = None, mask = None, ): - - print(f'DEBUG(sampler): cond = {cond}') - if cond is not None: - if isinstance(cond, dict): - ctmp = cond[list(cond.keys())[0]] - while isinstance(ctmp, list): - ctmp = ctmp[0] - cbs = ctmp.shape[0] - if cbs != batch_size: - print(f"Warning: Got {cbs} conds but batch-size is {batch_size}") - else: - if cond.shape[0] != batch_size: - print(f"Warning: Got {cond.shape[0]} conditionings but batch-size is {batch_size}") - timesteps = ( np.arange(self.ddpm_num_timesteps) if use_original_steps From ca2f579f434269a8061f3fa85c9b2772330cbd30 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 15:56:07 -0400 Subject: [PATCH 066/124] prevent crash when providing empty quoted prompt ("") --- ldm/invoke/args.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index 2f8e2303cb..7068bd83c1 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -181,7 +181,9 @@ class Args(object): switches_started = False for element in elements: - if element[0] == '-' and not switches_started: + if len(element) == 0: # empty prompt + pass + elif element[0] == '-' and not switches_started: switches_started = True if switches_started: switches.append(element) From 8d5a2250117b8542bddce3e1733207382051f326 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 17:26:00 -0400 Subject: [PATCH 067/124] allow for empty prompts (useful for inpaint removal) --- scripts/invoke.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/invoke.py b/scripts/invoke.py index faa85de80e..466536bc46 100644 --- a/scripts/invoke.py +++ b/scripts/invoke.py @@ -171,9 +171,9 @@ def main_loop(gen, opt): except (OSError, AttributeError, KeyError): pass - if len(opt.prompt) == 0: - print('\nTry again with a prompt!') - continue +# if len(opt.prompt) == 0: +# print('\nTry again with a prompt!') +# continue # width and height are set by model if not specified if not opt.width: From f1ca78909722b7544529c62fc064d105a2951e97 Mon Sep 17 00:00:00 2001 From: Kyle Schouviller Date: Tue, 25 Oct 2022 17:10:28 -0700 Subject: [PATCH 068/124] Better inpainting color-correction --- ldm/invoke/generator/inpaint.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/ldm/invoke/generator/inpaint.py b/ldm/invoke/generator/inpaint.py index 8fbcf249aa..a6843599a9 100644 --- a/ldm/invoke/generator/inpaint.py +++ b/ldm/invoke/generator/inpaint.py @@ -125,18 +125,26 @@ class Inpaint(Img2Img): pil_init_image = pil_image.convert('RGBA') # Add an alpha channel if one doesn't exist # Build an image with only visible pixels from source to use as reference for color-matching. - # Note that this doesn't use the mask, which would exclude some source image pixels from the - # histogram and cause slight color changes. - init_rgb_pixels = np.asarray(pil_image.convert('RGB'), dtype=np.uint8).reshape(pil_image.width * pil_image.height, 3) - init_a_pixels = np.asarray(pil_init_image.getchannel('A'), dtype=np.uint8).reshape(pil_init_mask.width * pil_init_mask.height) - init_rgb_pixels = init_rgb_pixels[init_a_pixels > 0] - init_rgb_pixels = init_rgb_pixels.reshape(1, init_rgb_pixels.shape[0], init_rgb_pixels.shape[1]) # Filter to just pixels that have any alpha, this is now our histogram + init_rgb_pixels = np.asarray(pil_image.convert('RGB'), dtype=np.uint8) + init_a_pixels = np.asarray(pil_init_image.getchannel('A'), dtype=np.uint8) + init_mask_pixels = np.asarray(pil_init_mask, dtype=np.uint8) - # Get numpy version + # Get numpy version of result np_gen_result = np.asarray(gen_result, dtype=np.uint8) + # Mask and calculate mean and standard deviation + mask_pixels = init_a_pixels * init_mask_pixels > 0 + np_init_rgb_pixels_masked = init_rgb_pixels[mask_pixels, :] + np_gen_result_masked = np_gen_result[mask_pixels, :] + + init_means = np_init_rgb_pixels_masked.mean(axis=0) + init_std = np_init_rgb_pixels_masked.std(axis=0) + gen_means = np_gen_result_masked.mean(axis=0) + gen_std = np_gen_result_masked.std(axis=0) + # Color correct - np_matched_result = match_histograms(np_gen_result, init_rgb_pixels, channel_axis=-1) + np_matched_result = np_gen_result.copy() + np_matched_result[:,:,:] = (((np_matched_result[:,:,:].astype(np.float32) - gen_means[None,None,:]) / gen_std[None,None,:]) * init_std[None,None,:] + init_means[None,None,:]).clip(0, 255).astype(np.uint8) matched_result = Image.fromarray(np_matched_result, mode='RGB') # Blur the mask out (into init image) by specified amount @@ -151,4 +159,3 @@ class Inpaint(Img2Img): # Paste original on color-corrected generation (using blurred mask) matched_result.paste(pil_image, (0,0), mask = blurred_init_mask) return matched_result - From d3047c7cb096681226df5e2f5615923891af41e1 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 25 Oct 2022 22:44:42 -0400 Subject: [PATCH 069/124] do not encode init image in starting latent --- ldm/invoke/generator/omnibus.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index 2fccd7c6f7..d841cac64f 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -64,7 +64,6 @@ class Omnibus(Img2Img,Txt2Img): mask_image = torch.ones(1, 1, init_image.shape[2], init_image.shape[3], device=self.model.device) # and the masked image is just a copy of the original masked_image = init_image - t_enc = int(strength * steps) else: # txt2img init_image = torch.zeros(1, 3, height, width, device=self.model.device) @@ -111,7 +110,7 @@ class Omnibus(Img2Img,Txt2Img): samples, _ = sampler.sample( batch_size = 1, - S = t_enc, + S = steps, x_T = x_T, conditioning = cond, shape = shape, @@ -145,7 +144,4 @@ class Omnibus(Img2Img,Txt2Img): return batch def get_noise(self, width:int, height:int): - if self.init_latent: - return super(Img2Img,self).get_noise(width,height) - else: - return super(Txt2Img,self).get_noise(width,height) + return super(Txt2Img,self).get_noise(width,height) From 906dafe3cd286a0c7fc079d1d37fcec6756e4aec Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 26 Oct 2022 00:18:31 -0400 Subject: [PATCH 070/124] make variations work with inpainting model --- ldm/invoke/generator/base.py | 5 ++++- ldm/invoke/generator/img2img.py | 2 +- ldm/invoke/generator/omnibus.py | 6 +++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ldm/invoke/generator/base.py b/ldm/invoke/generator/base.py index e326bcfe8d..2e96c93cbb 100644 --- a/ldm/invoke/generator/base.py +++ b/ldm/invoke/generator/base.py @@ -6,6 +6,7 @@ import torch import numpy as np import random import os +import traceback from tqdm import tqdm, trange from PIL import Image, ImageFilter from einops import rearrange, repeat @@ -82,7 +83,9 @@ class Generator(): try: x_T = self.get_noise(width,height) except: - pass + print('** An error occurred while getting initial noise **') + print(traceback.format_exc()) + image = make_image(x_T) if self.safety_checker is not None: diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 31c3ca256e..73eb2e6a06 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -14,7 +14,7 @@ from ldm.models.diffusion.ddim import DDIMSampler class Img2Img(Generator): def __init__(self, model, precision): super().__init__(model, precision) - self.init_latent = None # by get_noise() + self.init_latent = None # by get_noise() def get_make_image(self,prompt,sampler,steps,cfg_scale,ddim_eta, conditioning,init_image,strength,step_callback=None,threshold=0.0,perlin=0.0,**kwargs): diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index d841cac64f..e0705ec397 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -70,6 +70,7 @@ class Omnibus(Img2Img,Txt2Img): mask_image = torch.ones(1, 1, height, width, device=self.model.device) masked_image = init_image + self.init_latent = init_image height = init_image.shape[2] width = init_image.shape[3] model = self.model @@ -144,4 +145,7 @@ class Omnibus(Img2Img,Txt2Img): return batch def get_noise(self, width:int, height:int): - return super(Txt2Img,self).get_noise(width,height) + if self.init_latent is not None: + height = self.init_latent.shape[2] + width = self.init_latent.shape[3] + return Txt2Img.get_noise(self,width,height) From eaf6d46a7befe8a7da835df1e6145d2585b29aa1 Mon Sep 17 00:00:00 2001 From: Kyle Schouviller Date: Wed, 26 Oct 2022 00:39:36 -0700 Subject: [PATCH 071/124] Adding outpainting implementation (as part of inpaint). --- ldm/generate.py | 22 +++- ldm/invoke/generator/inpaint.py | 193 ++++++++++++++++++++++++++++---- 2 files changed, 189 insertions(+), 26 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index 3ede1710e1..d6f402ab06 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -293,6 +293,13 @@ class Generate: catch_interrupts = False, hires_fix = False, use_mps_noise = False, + # Seam settings for outpainting + seam_size: int = 0, + seam_blur: int = 0, + seam_strength: float = 0.7, + seam_steps: int = 10, + tile_size: int = 32, + force_outpaint: bool = False, **args, ): # eat up additional cruft """ @@ -420,7 +427,7 @@ class Generate: ) # TODO: Hacky selection of operation to perform. Needs to be refactored. - if (init_image is not None) and (mask_image is not None): + if ((init_image is not None) and (mask_image is not None)) or force_outpaint: generator = self._make_inpaint() elif (embiggen != None or embiggen_tiles != None): generator = self._make_embiggen() @@ -464,7 +471,13 @@ class Generate: embiggen_tiles=embiggen_tiles, inpaint_replace=inpaint_replace, mask_blur_radius=mask_blur_radius, - safety_checker=checker + safety_checker=checker, + seam_size = seam_size, + seam_blur = seam_blur, + seam_strength = seam_strength, + seam_steps = seam_steps, + tile_size = tile_size, + force_outpaint = force_outpaint ) if init_color: @@ -888,8 +901,9 @@ class Generate: image = ImageOps.exif_transpose(image) return image - def _create_init_image(self, image, width, height, fit=True): - image = image.convert('RGB') + def _create_init_image(self, image: Image.Image, width, height, fit=True): + if image.mode != 'RGBA': + image = image.convert('RGB') image = self._fit_image(image, (width, height)) if fit else self._squeeze_image(image) return image diff --git a/ldm/invoke/generator/inpaint.py b/ldm/invoke/generator/inpaint.py index a6843599a9..be8f9d1b53 100644 --- a/ldm/invoke/generator/inpaint.py +++ b/ldm/invoke/generator/inpaint.py @@ -2,12 +2,13 @@ ldm.invoke.generator.inpaint descends from ldm.invoke.generator ''' +import math import torch import torchvision.transforms as T import numpy as np import cv2 as cv import PIL -from PIL import Image, ImageFilter +from PIL import Image, ImageFilter, ImageOps from skimage.exposure.histogram_matching import match_histograms from einops import rearrange, repeat from ldm.invoke.devices import choose_autocast @@ -24,11 +25,128 @@ class Inpaint(Img2Img): self.mask_blur_radius = 0 super().__init__(model, precision) + # Outpaint support code + def get_tile_images(self, image: np.ndarray, width=8, height=8): + _nrows, _ncols, depth = image.shape + _strides = image.strides + + nrows, _m = divmod(_nrows, height) + ncols, _n = divmod(_ncols, width) + if _m != 0 or _n != 0: + return None + + return np.lib.stride_tricks.as_strided( + np.ravel(image), + shape=(nrows, ncols, height, width, depth), + strides=(height * _strides[0], width * _strides[1], *_strides), + writeable=False + ) + + def tile_fill_missing(self, im: Image.Image, tile_size: int = 16, seed: int = None) -> Image: + a = np.asarray(im, dtype=np.uint8) + + tile_size = (tile_size, tile_size) + + # Get the image as tiles of a specified size + tiles = self.get_tile_images(a,*tile_size).copy() + + # Get the mask as tiles + tiles_mask = tiles[:,:,:,:,3] + + # Find any mask tiles with any fully transparent pixels (we will be replacing these later) + tmask_shape = tiles_mask.shape + tiles_mask = tiles_mask.reshape(math.prod(tiles_mask.shape)) + n,ny = (math.prod(tmask_shape[0:2])), math.prod(tmask_shape[2:]) + tiles_mask = (tiles_mask > 0) + tiles_mask = tiles_mask.reshape((n,ny)).all(axis = 1) + + # Get RGB tiles in single array and filter by the mask + tshape = tiles.shape + tiles_all = tiles.reshape((math.prod(tiles.shape[0:2]), * tiles.shape[2:])) + filtered_tiles = tiles_all[tiles_mask] + + if len(filtered_tiles) == 0: + return im + + # Find all invalid tiles and replace with a random valid tile + replace_count = (tiles_mask == False).sum() + rng = np.random.default_rng(seed = seed) + tiles_all[np.logical_not(tiles_mask)] = filtered_tiles[rng.choice(filtered_tiles.shape[0], replace_count),:,:,:] + + # Convert back to an image + tiles_all = tiles_all.reshape(tshape) + tiles_all = tiles_all.swapaxes(1,2) + st = tiles_all.reshape((math.prod(tiles_all.shape[0:2]), math.prod(tiles_all.shape[2:4]), tiles_all.shape[4])) + si = Image.fromarray(st, mode='RGBA') + + return si + + + def mask_edge(self, mask: Image, edge_size: int, edge_blur: int) -> Image: + npimg = np.asarray(mask, dtype=np.uint8) + + # Detect any partially transparent regions + npgradient = np.uint8(255 * (1.0 - np.floor(np.abs(0.5 - np.float32(npimg) / 255.0) * 2.0))) + + # Detect hard edges + npedge = cv.Canny(npimg, threshold1=100, threshold2=200) + + # Combine + npmask = npgradient + npedge + + # Expand + npmask = cv.dilate(npmask, np.ones((3,3), np.uint8), iterations = int(edge_size / 2)) + + new_mask = Image.fromarray(npmask) + + if edge_blur > 0: + new_mask = new_mask.filter(ImageFilter.BoxBlur(edge_blur)) + + return ImageOps.invert(new_mask) + + + def seam_paint(self, + im: Image.Image, + seam_size: int, + seam_blur: int, + prompt,sampler,steps,cfg_scale,ddim_eta, + conditioning,strength, + noise + ) -> Image.Image: + hard_mask = self.pil_image.split()[-1].copy() + mask = self.mask_edge(hard_mask, seam_size, seam_blur) + + make_image = self.get_make_image( + prompt, + sampler, + steps, + cfg_scale, + ddim_eta, + conditioning, + init_image = im.copy().convert('RGBA'), + mask_image = mask.convert('RGB'), # Code currently requires an RGB mask + strength = strength, + mask_blur_radius = 0, + seam_size = 0 + ) + + result = make_image(noise) + + return result + + @torch.no_grad() def get_make_image(self,prompt,sampler,steps,cfg_scale,ddim_eta, conditioning,init_image,mask_image,strength, mask_blur_radius: int = 8, - step_callback=None,inpaint_replace=False, **kwargs): + # Seam settings - when 0, doesn't fill seam + seam_size: int = 0, + seam_blur: int = 0, + seam_strength: float = 0.7, + seam_steps: int = 10, + tile_size: int = 32, + step_callback=None, + inpaint_replace=False, **kwargs): """ Returns a function returning an image derived from the prompt and the initial image + mask. Return value depends on the seed at @@ -37,7 +155,17 @@ class Inpaint(Img2Img): if isinstance(init_image, PIL.Image.Image): self.pil_image = init_image - init_image = self._image_to_tensor(init_image) + + # Fill missing areas of original image + init_filled = self.tile_fill_missing( + self.pil_image.copy(), + seed = self.seed, + tile_size = tile_size + ) + init_filled.paste(init_image, (0,0), init_image.split()[-1]) + + # Create init tensor + init_image = self._image_to_tensor(init_filled.convert('RGB')) if isinstance(mask_image, PIL.Image.Image): self.pil_mask = mask_image @@ -105,45 +233,55 @@ class Inpaint(Img2Img): mask = mask_image, init_latent = self.init_latent ) - return self.sample_to_image(samples) + + result = self.sample_to_image(samples) + + # Seam paint if this is our first pass (seam_size set to 0 during seam painting) + if seam_size > 0: + result = self.seam_paint( + result, + seam_size, + seam_blur, + prompt, + sampler, + seam_steps, + cfg_scale, + ddim_eta, + conditioning, + seam_strength, + x_T) + + return result return make_image - def sample_to_image(self, samples)->Image.Image: - gen_result = super().sample_to_image(samples).convert('RGB') - - if self.pil_image is None or self.pil_mask is None: - return gen_result - - pil_mask = self.pil_mask - pil_image = self.pil_image - mask_blur_radius = self.mask_blur_radius + def color_correct(self, image: Image.Image, base_image: Image.Image, mask: Image.Image, mask_blur_radius: int) -> Image.Image: # Get the original alpha channel of the mask if there is one. # Otherwise it is some other black/white image format ('1', 'L' or 'RGB') - pil_init_mask = pil_mask.getchannel('A') if pil_mask.mode == 'RGBA' else pil_mask.convert('L') - pil_init_image = pil_image.convert('RGBA') # Add an alpha channel if one doesn't exist + pil_init_mask = mask.getchannel('A') if mask.mode == 'RGBA' else mask.convert('L') + pil_init_image = base_image.convert('RGBA') # Add an alpha channel if one doesn't exist # Build an image with only visible pixels from source to use as reference for color-matching. - init_rgb_pixels = np.asarray(pil_image.convert('RGB'), dtype=np.uint8) + init_rgb_pixels = np.asarray(base_image.convert('RGB'), dtype=np.uint8) init_a_pixels = np.asarray(pil_init_image.getchannel('A'), dtype=np.uint8) init_mask_pixels = np.asarray(pil_init_mask, dtype=np.uint8) # Get numpy version of result - np_gen_result = np.asarray(gen_result, dtype=np.uint8) + np_image = np.asarray(image, dtype=np.uint8) # Mask and calculate mean and standard deviation mask_pixels = init_a_pixels * init_mask_pixels > 0 np_init_rgb_pixels_masked = init_rgb_pixels[mask_pixels, :] - np_gen_result_masked = np_gen_result[mask_pixels, :] + np_image_masked = np_image[mask_pixels, :] init_means = np_init_rgb_pixels_masked.mean(axis=0) init_std = np_init_rgb_pixels_masked.std(axis=0) - gen_means = np_gen_result_masked.mean(axis=0) - gen_std = np_gen_result_masked.std(axis=0) + gen_means = np_image_masked.mean(axis=0) + gen_std = np_image_masked.std(axis=0) # Color correct - np_matched_result = np_gen_result.copy() + np_matched_result = np_image.copy() np_matched_result[:,:,:] = (((np_matched_result[:,:,:].astype(np.float32) - gen_means[None,None,:]) / gen_std[None,None,:]) * init_std[None,None,:] + init_means[None,None,:]).clip(0, 255).astype(np.uint8) matched_result = Image.fromarray(np_matched_result, mode='RGB') @@ -157,5 +295,16 @@ class Inpaint(Img2Img): blurred_init_mask = pil_init_mask # Paste original on color-corrected generation (using blurred mask) - matched_result.paste(pil_image, (0,0), mask = blurred_init_mask) + matched_result.paste(base_image, (0,0), mask = blurred_init_mask) return matched_result + + + def sample_to_image(self, samples)->Image.Image: + gen_result = super().sample_to_image(samples).convert('RGB') + + if self.pil_image is None or self.pil_mask is None: + return gen_result + + corrected_result = self.color_correct(gen_result, self.pil_image, self.pil_mask, self.mask_blur_radius) + + return corrected_result From b1da13a984b7e0c8e5d7fa09f250b355040db303 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 26 Oct 2022 08:29:56 -0400 Subject: [PATCH 072/124] minor cleanups - change default model back to 1.4 - remove --fnformat from canonicalized dream prompt arguments (not needed for image reproducibility) - add -tm to canonicalized dream prompt arguments (definitely needed for image reproducibility) --- configs/models.yaml | 2 +- ldm/invoke/args.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configs/models.yaml b/configs/models.yaml index 40bdc88cd8..162da38da2 100644 --- a/configs/models.yaml +++ b/configs/models.yaml @@ -12,6 +12,7 @@ stable-diffusion-1.4: description: Stable Diffusion inference model version 1.4 width: 512 height: 512 + default: true inpainting-1.5: description: runwayML tuned inpainting model v1.5 weights: models/ldm/stable-diffusion-v1/sd-v1-5-inpainting.ckpt @@ -19,7 +20,6 @@ inpainting-1.5: # vae: models/ldm/stable-diffusion-v1/vae-ft-mse-840000-ema-pruned.ckpt width: 512 height: 512 - default: true stable-diffusion-1.5: config: configs/stable-diffusion/v1-inference.yaml weights: models/ldm/stable-diffusion-v1/v1-5-pruned-emaonly.ckpt diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index 7068bd83c1..a57928e22f 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -219,7 +219,6 @@ class Args(object): switches.append(f'-W {a["width"]}') switches.append(f'-H {a["height"]}') switches.append(f'-C {a["cfg_scale"]}') - switches.append(f'--fnformat {a["fnformat"]}') if a['perlin'] > 0: switches.append(f'--perlin {a["perlin"]}') if a['threshold'] > 0: @@ -245,6 +244,8 @@ class Args(object): switches.append(f'-f {a["strength"]}') if a['inpaint_replace']: switches.append(f'--inpaint_replace') + if a['text_mask']: + switches.append(f'-tm {" ".join([str(u) for u in a["text_mask"]])}') else: switches.append(f'-A {a["sampler_name"]}') From 2b6d78e4363f3eca726228a40b6de832eb0ac040 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 26 Oct 2022 08:29:56 -0400 Subject: [PATCH 073/124] minor cleanups - remove --fnformat from canonicalized dream prompt arguments (not needed for image reproducibility) - add -tm to canonicalized dream prompt arguments (definitely needed for image reproducibility) --- ldm/invoke/args.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index 2f8e2303cb..b24620df15 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -217,7 +217,6 @@ class Args(object): switches.append(f'-W {a["width"]}') switches.append(f'-H {a["height"]}') switches.append(f'-C {a["cfg_scale"]}') - switches.append(f'--fnformat {a["fnformat"]}') if a['perlin'] > 0: switches.append(f'--perlin {a["perlin"]}') if a['threshold'] > 0: @@ -243,6 +242,8 @@ class Args(object): switches.append(f'-f {a["strength"]}') if a['inpaint_replace']: switches.append(f'--inpaint_replace') + if a['text_mask']: + switches.append(f'-tm {" ".join([str(u) for u in a["text_mask"]])}') else: switches.append(f'-A {a["sampler_name"]}') From 2a44411f5b9faaaa603f07be0dceb364f7815825 Mon Sep 17 00:00:00 2001 From: Kyle Schouviller Date: Wed, 26 Oct 2022 12:09:38 -0700 Subject: [PATCH 074/124] Force RGB for img2img --- ldm/invoke/generator/img2img.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 613f1aca31..b9a721fcbb 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -29,7 +29,7 @@ class Img2Img(Generator): ) if isinstance(init_image, PIL.Image.Image): - init_image = self._image_to_tensor(init_image) + init_image = self._image_to_tensor(init_image.convert('RGB')) scope = choose_autocast(self.precision) with scope(self.model.device.type): From dac1ab0a05cb31d7a965f6577b273dc1ed479bb3 Mon Sep 17 00:00:00 2001 From: Kyle Schouviller Date: Tue, 25 Oct 2022 17:10:28 -0700 Subject: [PATCH 075/124] Better inpainting color-correction --- ldm/invoke/generator/inpaint.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/ldm/invoke/generator/inpaint.py b/ldm/invoke/generator/inpaint.py index 8fbcf249aa..a6843599a9 100644 --- a/ldm/invoke/generator/inpaint.py +++ b/ldm/invoke/generator/inpaint.py @@ -125,18 +125,26 @@ class Inpaint(Img2Img): pil_init_image = pil_image.convert('RGBA') # Add an alpha channel if one doesn't exist # Build an image with only visible pixels from source to use as reference for color-matching. - # Note that this doesn't use the mask, which would exclude some source image pixels from the - # histogram and cause slight color changes. - init_rgb_pixels = np.asarray(pil_image.convert('RGB'), dtype=np.uint8).reshape(pil_image.width * pil_image.height, 3) - init_a_pixels = np.asarray(pil_init_image.getchannel('A'), dtype=np.uint8).reshape(pil_init_mask.width * pil_init_mask.height) - init_rgb_pixels = init_rgb_pixels[init_a_pixels > 0] - init_rgb_pixels = init_rgb_pixels.reshape(1, init_rgb_pixels.shape[0], init_rgb_pixels.shape[1]) # Filter to just pixels that have any alpha, this is now our histogram + init_rgb_pixels = np.asarray(pil_image.convert('RGB'), dtype=np.uint8) + init_a_pixels = np.asarray(pil_init_image.getchannel('A'), dtype=np.uint8) + init_mask_pixels = np.asarray(pil_init_mask, dtype=np.uint8) - # Get numpy version + # Get numpy version of result np_gen_result = np.asarray(gen_result, dtype=np.uint8) + # Mask and calculate mean and standard deviation + mask_pixels = init_a_pixels * init_mask_pixels > 0 + np_init_rgb_pixels_masked = init_rgb_pixels[mask_pixels, :] + np_gen_result_masked = np_gen_result[mask_pixels, :] + + init_means = np_init_rgb_pixels_masked.mean(axis=0) + init_std = np_init_rgb_pixels_masked.std(axis=0) + gen_means = np_gen_result_masked.mean(axis=0) + gen_std = np_gen_result_masked.std(axis=0) + # Color correct - np_matched_result = match_histograms(np_gen_result, init_rgb_pixels, channel_axis=-1) + np_matched_result = np_gen_result.copy() + np_matched_result[:,:,:] = (((np_matched_result[:,:,:].astype(np.float32) - gen_means[None,None,:]) / gen_std[None,None,:]) * init_std[None,None,:] + init_means[None,None,:]).clip(0, 255).astype(np.uint8) matched_result = Image.fromarray(np_matched_result, mode='RGB') # Blur the mask out (into init image) by specified amount @@ -151,4 +159,3 @@ class Inpaint(Img2Img): # Paste original on color-corrected generation (using blurred mask) matched_result.paste(pil_image, (0,0), mask = blurred_init_mask) return matched_result - From bd8bb8c80b28e9df670ecd33b684764722e717b8 Mon Sep 17 00:00:00 2001 From: Kyle Schouviller Date: Wed, 26 Oct 2022 00:39:36 -0700 Subject: [PATCH 076/124] Adding outpainting implementation (as part of inpaint). --- ldm/generate.py | 22 +++- ldm/invoke/generator/inpaint.py | 193 ++++++++++++++++++++++++++++---- 2 files changed, 189 insertions(+), 26 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index 3ede1710e1..d6f402ab06 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -293,6 +293,13 @@ class Generate: catch_interrupts = False, hires_fix = False, use_mps_noise = False, + # Seam settings for outpainting + seam_size: int = 0, + seam_blur: int = 0, + seam_strength: float = 0.7, + seam_steps: int = 10, + tile_size: int = 32, + force_outpaint: bool = False, **args, ): # eat up additional cruft """ @@ -420,7 +427,7 @@ class Generate: ) # TODO: Hacky selection of operation to perform. Needs to be refactored. - if (init_image is not None) and (mask_image is not None): + if ((init_image is not None) and (mask_image is not None)) or force_outpaint: generator = self._make_inpaint() elif (embiggen != None or embiggen_tiles != None): generator = self._make_embiggen() @@ -464,7 +471,13 @@ class Generate: embiggen_tiles=embiggen_tiles, inpaint_replace=inpaint_replace, mask_blur_radius=mask_blur_radius, - safety_checker=checker + safety_checker=checker, + seam_size = seam_size, + seam_blur = seam_blur, + seam_strength = seam_strength, + seam_steps = seam_steps, + tile_size = tile_size, + force_outpaint = force_outpaint ) if init_color: @@ -888,8 +901,9 @@ class Generate: image = ImageOps.exif_transpose(image) return image - def _create_init_image(self, image, width, height, fit=True): - image = image.convert('RGB') + def _create_init_image(self, image: Image.Image, width, height, fit=True): + if image.mode != 'RGBA': + image = image.convert('RGB') image = self._fit_image(image, (width, height)) if fit else self._squeeze_image(image) return image diff --git a/ldm/invoke/generator/inpaint.py b/ldm/invoke/generator/inpaint.py index a6843599a9..be8f9d1b53 100644 --- a/ldm/invoke/generator/inpaint.py +++ b/ldm/invoke/generator/inpaint.py @@ -2,12 +2,13 @@ ldm.invoke.generator.inpaint descends from ldm.invoke.generator ''' +import math import torch import torchvision.transforms as T import numpy as np import cv2 as cv import PIL -from PIL import Image, ImageFilter +from PIL import Image, ImageFilter, ImageOps from skimage.exposure.histogram_matching import match_histograms from einops import rearrange, repeat from ldm.invoke.devices import choose_autocast @@ -24,11 +25,128 @@ class Inpaint(Img2Img): self.mask_blur_radius = 0 super().__init__(model, precision) + # Outpaint support code + def get_tile_images(self, image: np.ndarray, width=8, height=8): + _nrows, _ncols, depth = image.shape + _strides = image.strides + + nrows, _m = divmod(_nrows, height) + ncols, _n = divmod(_ncols, width) + if _m != 0 or _n != 0: + return None + + return np.lib.stride_tricks.as_strided( + np.ravel(image), + shape=(nrows, ncols, height, width, depth), + strides=(height * _strides[0], width * _strides[1], *_strides), + writeable=False + ) + + def tile_fill_missing(self, im: Image.Image, tile_size: int = 16, seed: int = None) -> Image: + a = np.asarray(im, dtype=np.uint8) + + tile_size = (tile_size, tile_size) + + # Get the image as tiles of a specified size + tiles = self.get_tile_images(a,*tile_size).copy() + + # Get the mask as tiles + tiles_mask = tiles[:,:,:,:,3] + + # Find any mask tiles with any fully transparent pixels (we will be replacing these later) + tmask_shape = tiles_mask.shape + tiles_mask = tiles_mask.reshape(math.prod(tiles_mask.shape)) + n,ny = (math.prod(tmask_shape[0:2])), math.prod(tmask_shape[2:]) + tiles_mask = (tiles_mask > 0) + tiles_mask = tiles_mask.reshape((n,ny)).all(axis = 1) + + # Get RGB tiles in single array and filter by the mask + tshape = tiles.shape + tiles_all = tiles.reshape((math.prod(tiles.shape[0:2]), * tiles.shape[2:])) + filtered_tiles = tiles_all[tiles_mask] + + if len(filtered_tiles) == 0: + return im + + # Find all invalid tiles and replace with a random valid tile + replace_count = (tiles_mask == False).sum() + rng = np.random.default_rng(seed = seed) + tiles_all[np.logical_not(tiles_mask)] = filtered_tiles[rng.choice(filtered_tiles.shape[0], replace_count),:,:,:] + + # Convert back to an image + tiles_all = tiles_all.reshape(tshape) + tiles_all = tiles_all.swapaxes(1,2) + st = tiles_all.reshape((math.prod(tiles_all.shape[0:2]), math.prod(tiles_all.shape[2:4]), tiles_all.shape[4])) + si = Image.fromarray(st, mode='RGBA') + + return si + + + def mask_edge(self, mask: Image, edge_size: int, edge_blur: int) -> Image: + npimg = np.asarray(mask, dtype=np.uint8) + + # Detect any partially transparent regions + npgradient = np.uint8(255 * (1.0 - np.floor(np.abs(0.5 - np.float32(npimg) / 255.0) * 2.0))) + + # Detect hard edges + npedge = cv.Canny(npimg, threshold1=100, threshold2=200) + + # Combine + npmask = npgradient + npedge + + # Expand + npmask = cv.dilate(npmask, np.ones((3,3), np.uint8), iterations = int(edge_size / 2)) + + new_mask = Image.fromarray(npmask) + + if edge_blur > 0: + new_mask = new_mask.filter(ImageFilter.BoxBlur(edge_blur)) + + return ImageOps.invert(new_mask) + + + def seam_paint(self, + im: Image.Image, + seam_size: int, + seam_blur: int, + prompt,sampler,steps,cfg_scale,ddim_eta, + conditioning,strength, + noise + ) -> Image.Image: + hard_mask = self.pil_image.split()[-1].copy() + mask = self.mask_edge(hard_mask, seam_size, seam_blur) + + make_image = self.get_make_image( + prompt, + sampler, + steps, + cfg_scale, + ddim_eta, + conditioning, + init_image = im.copy().convert('RGBA'), + mask_image = mask.convert('RGB'), # Code currently requires an RGB mask + strength = strength, + mask_blur_radius = 0, + seam_size = 0 + ) + + result = make_image(noise) + + return result + + @torch.no_grad() def get_make_image(self,prompt,sampler,steps,cfg_scale,ddim_eta, conditioning,init_image,mask_image,strength, mask_blur_radius: int = 8, - step_callback=None,inpaint_replace=False, **kwargs): + # Seam settings - when 0, doesn't fill seam + seam_size: int = 0, + seam_blur: int = 0, + seam_strength: float = 0.7, + seam_steps: int = 10, + tile_size: int = 32, + step_callback=None, + inpaint_replace=False, **kwargs): """ Returns a function returning an image derived from the prompt and the initial image + mask. Return value depends on the seed at @@ -37,7 +155,17 @@ class Inpaint(Img2Img): if isinstance(init_image, PIL.Image.Image): self.pil_image = init_image - init_image = self._image_to_tensor(init_image) + + # Fill missing areas of original image + init_filled = self.tile_fill_missing( + self.pil_image.copy(), + seed = self.seed, + tile_size = tile_size + ) + init_filled.paste(init_image, (0,0), init_image.split()[-1]) + + # Create init tensor + init_image = self._image_to_tensor(init_filled.convert('RGB')) if isinstance(mask_image, PIL.Image.Image): self.pil_mask = mask_image @@ -105,45 +233,55 @@ class Inpaint(Img2Img): mask = mask_image, init_latent = self.init_latent ) - return self.sample_to_image(samples) + + result = self.sample_to_image(samples) + + # Seam paint if this is our first pass (seam_size set to 0 during seam painting) + if seam_size > 0: + result = self.seam_paint( + result, + seam_size, + seam_blur, + prompt, + sampler, + seam_steps, + cfg_scale, + ddim_eta, + conditioning, + seam_strength, + x_T) + + return result return make_image - def sample_to_image(self, samples)->Image.Image: - gen_result = super().sample_to_image(samples).convert('RGB') - - if self.pil_image is None or self.pil_mask is None: - return gen_result - - pil_mask = self.pil_mask - pil_image = self.pil_image - mask_blur_radius = self.mask_blur_radius + def color_correct(self, image: Image.Image, base_image: Image.Image, mask: Image.Image, mask_blur_radius: int) -> Image.Image: # Get the original alpha channel of the mask if there is one. # Otherwise it is some other black/white image format ('1', 'L' or 'RGB') - pil_init_mask = pil_mask.getchannel('A') if pil_mask.mode == 'RGBA' else pil_mask.convert('L') - pil_init_image = pil_image.convert('RGBA') # Add an alpha channel if one doesn't exist + pil_init_mask = mask.getchannel('A') if mask.mode == 'RGBA' else mask.convert('L') + pil_init_image = base_image.convert('RGBA') # Add an alpha channel if one doesn't exist # Build an image with only visible pixels from source to use as reference for color-matching. - init_rgb_pixels = np.asarray(pil_image.convert('RGB'), dtype=np.uint8) + init_rgb_pixels = np.asarray(base_image.convert('RGB'), dtype=np.uint8) init_a_pixels = np.asarray(pil_init_image.getchannel('A'), dtype=np.uint8) init_mask_pixels = np.asarray(pil_init_mask, dtype=np.uint8) # Get numpy version of result - np_gen_result = np.asarray(gen_result, dtype=np.uint8) + np_image = np.asarray(image, dtype=np.uint8) # Mask and calculate mean and standard deviation mask_pixels = init_a_pixels * init_mask_pixels > 0 np_init_rgb_pixels_masked = init_rgb_pixels[mask_pixels, :] - np_gen_result_masked = np_gen_result[mask_pixels, :] + np_image_masked = np_image[mask_pixels, :] init_means = np_init_rgb_pixels_masked.mean(axis=0) init_std = np_init_rgb_pixels_masked.std(axis=0) - gen_means = np_gen_result_masked.mean(axis=0) - gen_std = np_gen_result_masked.std(axis=0) + gen_means = np_image_masked.mean(axis=0) + gen_std = np_image_masked.std(axis=0) # Color correct - np_matched_result = np_gen_result.copy() + np_matched_result = np_image.copy() np_matched_result[:,:,:] = (((np_matched_result[:,:,:].astype(np.float32) - gen_means[None,None,:]) / gen_std[None,None,:]) * init_std[None,None,:] + init_means[None,None,:]).clip(0, 255).astype(np.uint8) matched_result = Image.fromarray(np_matched_result, mode='RGB') @@ -157,5 +295,16 @@ class Inpaint(Img2Img): blurred_init_mask = pil_init_mask # Paste original on color-corrected generation (using blurred mask) - matched_result.paste(pil_image, (0,0), mask = blurred_init_mask) + matched_result.paste(base_image, (0,0), mask = blurred_init_mask) return matched_result + + + def sample_to_image(self, samples)->Image.Image: + gen_result = super().sample_to_image(samples).convert('RGB') + + if self.pil_image is None or self.pil_mask is None: + return gen_result + + corrected_result = self.color_correct(gen_result, self.pil_image, self.pil_mask, self.mask_blur_radius) + + return corrected_result From d05373d35a03c58b8370d8ec3d8752b99bbde24c Mon Sep 17 00:00:00 2001 From: Kyle Schouviller Date: Wed, 26 Oct 2022 12:09:38 -0700 Subject: [PATCH 077/124] Force RGB for img2img --- ldm/invoke/generator/img2img.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldm/invoke/generator/img2img.py b/ldm/invoke/generator/img2img.py index 613f1aca31..b9a721fcbb 100644 --- a/ldm/invoke/generator/img2img.py +++ b/ldm/invoke/generator/img2img.py @@ -29,7 +29,7 @@ class Img2Img(Generator): ) if isinstance(init_image, PIL.Image.Image): - init_image = self._image_to_tensor(init_image) + init_image = self._image_to_tensor(init_image.convert('RGB')) scope = choose_autocast(self.precision) with scope(self.model.device.type): From 2daf187bdba13f63b6bd512748f71e3faeb5350f Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 26 Oct 2022 18:25:48 -0400 Subject: [PATCH 078/124] working with 1.4, 1.5, not with inpainting 1.5 --- ldm/invoke/args.py | 50 ++++++++++++++++---------------- ldm/models/diffusion/ddpm.py | 2 +- ldm/models/diffusion/ksampler.py | 5 ++-- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index 143e49150e..26c5dc1c81 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -83,11 +83,11 @@ with metadata_from_png(): import argparse from argparse import Namespace, RawTextHelpFormatter import pydoc -import shlex import json import hashlib import os import re +import shlex import copy import base64 import functools @@ -169,30 +169,24 @@ class Args(object): def parse_cmd(self,cmd_string): '''Parse a invoke>-style command string ''' - command = cmd_string.replace("'", "\\'") - try: - elements = shlex.split(command) - elements = [x.replace("\\'","'") for x in elements] - except ValueError: - import sys, traceback - print(traceback.format_exc(), file=sys.stderr) - return - switches = [''] - switches_started = False - - for element in elements: - if len(element) == 0: # empty prompt - pass - elif element[0] == '-' and not switches_started: - switches_started = True - if switches_started: - switches.append(element) + # handle the case in which the prompt is enclosed by quotes + if cmd_string.startswith('"'): + a = shlex.split(cmd_string) + prompt = a[0] + switches = shlex.join(a[1:]) + else: + # no initial quote, so get everything up to the first thing + # that looks like a switch + match = re.match('^(.+?)\s(--?[a-zA-Z].+)',cmd_string) + if match: + prompt,switches = match.groups() else: - switches[0] += element - switches[0] += ' ' - switches[0] = switches[0][: len(switches[0]) - 1] + prompt = cmd_string + switches = '' + try: - self._cmd_switches = self._cmd_parser.parse_args(switches) + self._cmd_switches = self._cmd_parser.parse_args(shlex.split(switches)) + setattr(self._cmd_switches,'prompt',prompt) return self._cmd_switches except: return None @@ -213,7 +207,9 @@ class Args(object): a = vars(self) a.update(kwargs) switches = list() - switches.append(f'"{a["prompt"]}"') + prompt = a['prompt'] + prompt.replace('"','\\"') + switches.append(prompt) switches.append(f'-s {a["steps"]}') switches.append(f'-S {a["seed"]}') switches.append(f'-W {a["width"]}') @@ -573,7 +569,11 @@ class Args(object): variation_group = parser.add_argument_group('Creating and combining variations') postprocessing_group = parser.add_argument_group('Post-processing') special_effects_group = parser.add_argument_group('Special effects') - render_group.add_argument('prompt') + render_group.add_argument( + '--prompt', + default='', + help='prompt string', + ) render_group.add_argument( '-s', '--steps', diff --git a/ldm/models/diffusion/ddpm.py b/ldm/models/diffusion/ddpm.py index 827ab4e890..a5989532c4 100644 --- a/ldm/models/diffusion/ddpm.py +++ b/ldm/models/diffusion/ddpm.py @@ -827,7 +827,7 @@ class LatentDiffusion(DDPM): self.cond_stage_model.encode ): c = self.cond_stage_model.encode( - c, embedding_manager=self.embedding_manager, **kwargs + c, embedding_manager=self.embedding_manager,**kwargs ) if isinstance(c, DiagonalGaussianDistribution): c = c.mode() diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 5a63313b32..e3c8729dc3 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -23,10 +23,9 @@ def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): class CFGDenoiser(nn.Module): - def __init__(self, sampler, threshold = 0, warmup = 0): + def __init__(self, model, threshold = 0, warmup = 0): super().__init__() - self.inner_model = sampler.model - self.sampler = sampler + self.inner_model = model self.threshold = threshold self.warmup_max = warmup self.warmup = max(warmup / 10, 1) From 3f77b68a9da4299f24595401c280fc4a0ff93887 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 26 Oct 2022 18:27:35 -0400 Subject: [PATCH 079/124] fix mishandling of embedded quotes in prompt --- ldm/invoke/args.py | 50 ++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index b24620df15..26c5dc1c81 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -83,16 +83,16 @@ with metadata_from_png(): import argparse from argparse import Namespace, RawTextHelpFormatter import pydoc -import shlex import json import hashlib import os import re +import shlex import copy import base64 import functools import ldm.invoke.pngwriter -from ldm.invoke.conditioning import split_weighted_subprompts +from ldm.invoke.prompt_parser import split_weighted_subprompts SAMPLER_CHOICES = [ 'ddim', @@ -169,28 +169,24 @@ class Args(object): def parse_cmd(self,cmd_string): '''Parse a invoke>-style command string ''' - command = cmd_string.replace("'", "\\'") - try: - elements = shlex.split(command) - elements = [x.replace("\\'","'") for x in elements] - except ValueError: - import sys, traceback - print(traceback.format_exc(), file=sys.stderr) - return - switches = [''] - switches_started = False - - for element in elements: - if element[0] == '-' and not switches_started: - switches_started = True - if switches_started: - switches.append(element) + # handle the case in which the prompt is enclosed by quotes + if cmd_string.startswith('"'): + a = shlex.split(cmd_string) + prompt = a[0] + switches = shlex.join(a[1:]) + else: + # no initial quote, so get everything up to the first thing + # that looks like a switch + match = re.match('^(.+?)\s(--?[a-zA-Z].+)',cmd_string) + if match: + prompt,switches = match.groups() else: - switches[0] += element - switches[0] += ' ' - switches[0] = switches[0][: len(switches[0]) - 1] + prompt = cmd_string + switches = '' + try: - self._cmd_switches = self._cmd_parser.parse_args(switches) + self._cmd_switches = self._cmd_parser.parse_args(shlex.split(switches)) + setattr(self._cmd_switches,'prompt',prompt) return self._cmd_switches except: return None @@ -211,7 +207,9 @@ class Args(object): a = vars(self) a.update(kwargs) switches = list() - switches.append(f'"{a["prompt"]}"') + prompt = a['prompt'] + prompt.replace('"','\\"') + switches.append(prompt) switches.append(f'-s {a["steps"]}') switches.append(f'-S {a["seed"]}') switches.append(f'-W {a["width"]}') @@ -571,7 +569,11 @@ class Args(object): variation_group = parser.add_argument_group('Creating and combining variations') postprocessing_group = parser.add_argument_group('Post-processing') special_effects_group = parser.add_argument_group('Special effects') - render_group.add_argument('prompt') + render_group.add_argument( + '--prompt', + default='', + help='prompt string', + ) render_group.add_argument( '-s', '--steps', From 869d9e22c75664b0ba652c4f0947259cc836116d Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 26 Oct 2022 22:37:30 -0400 Subject: [PATCH 080/124] documentation fix --- docs/features/INPAINTING.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/features/INPAINTING.md b/docs/features/INPAINTING.md index 0503f1fc88..fae041a5ea 100644 --- a/docs/features/INPAINTING.md +++ b/docs/features/INPAINTING.md @@ -34,6 +34,16 @@ original unedited image and the masked (partially transparent) image: invoke> "man with cat on shoulder" -I./images/man.png -M./images/man-transparent.png ``` +If you are using Photoshop to make your transparent masks, here is a +protocol contributed by III_Communication36 (Discord name): + + Create your alpha channel for mask in photoshop, then run + image/adjust/threshold on that channel. Export as Save a copy using + superpng (3rd party free download plugin) making sure alpha channel + is selected. Then masking works as it should for the img2img + process 100%. Can feed just one image this way without needing to + feed the -M mask behind it + ## **Masking using Text** You can also create a mask using a text prompt to select the part of From 0d0481ce75822dfffef8e38e079eecd91dee536e Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 26 Oct 2022 22:40:01 -0400 Subject: [PATCH 081/124] inpaint model progress - working with plain prompts, weighted prompts and merge prompts - not tested with prompt2prompt --- .../stable-diffusion/v1-inpainting-inference.yaml | 2 +- ldm/models/diffusion/ksampler.py | 9 +-------- ldm/models/diffusion/shared_invokeai_diffusion.py | 14 +++++++++++++- ldm/modules/encoders/modules.py | 2 +- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/configs/stable-diffusion/v1-inpainting-inference.yaml b/configs/stable-diffusion/v1-inpainting-inference.yaml index 5652e04374..3ea164a359 100644 --- a/configs/stable-diffusion/v1-inpainting-inference.yaml +++ b/configs/stable-diffusion/v1-inpainting-inference.yaml @@ -76,4 +76,4 @@ model: target: torch.nn.Identity cond_stage_config: - target: ldm.modules.encoders.modules.FrozenCLIPEmbedder + target: ldm.modules.encoders.modules.WeightedFrozenCLIPEmbedder diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index e3c8729dc3..80404179a8 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -43,14 +43,7 @@ class CFGDenoiser(nn.Module): def forward(self, x, sigma, uncond, cond, cond_scale): - if isinstance(cond,dict): # hybrid model - x_in = torch.cat([x] * 2) - sigma_in = torch.cat([sigma] * 2) - cond_in = self.sampler.make_cond_in(uncond,cond) - uncond, cond = self.inner_model(x_in, sigma_in, cond=cond_in).chunk(2) - next_x = uncond + (cond - uncond) * cond_scale - else: # cross attention model - next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale) + next_x = self.invokeai_diffuser.do_diffusion_step(x, sigma, uncond, cond, cond_scale) if self.warmup < self.warmup_max: thresh = max(1, 1 + (self.threshold - 1) * (self.warmup / self.warmup_max)) self.warmup += 1 diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index b8a7a04d0e..e985417b2b 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -90,7 +90,19 @@ class InvokeAIDiffuserComponent: # faster batched path x_twice = torch.cat([x]*2) sigma_twice = torch.cat([sigma]*2) - both_conditionings = torch.cat([unconditioning, conditioning]) + if isinstance(conditioning, dict): + assert isinstance(unconditioning, dict) + both_conditionings = dict() + for k in conditioning: + if isinstance(conditioning[k], list): + both_conditionings[k] = [ + torch.cat([unconditioning[k][i], conditioning[k][i]]) + for i in range(len(conditioning[k])) + ] + else: + both_conditionings[k] = torch.cat([unconditioning[k], conditioning[k]]) + else: + both_conditionings = torch.cat([unconditioning, conditioning]) unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) else: #print('pct', percent_through, ': doing cross attention control on', cross_attention_control_types_to_do) diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 8917a27a40..670ab3f298 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -439,7 +439,7 @@ class FrozenCLIPEmbedder(AbstractEncoder): param.requires_grad = False def forward(self, text, **kwargs): - + print(f'DEBUG text={text}, max_length={self.max_length}') batch_encoding = self.tokenizer( text, truncation=True, From 79689e87cea0a0675ea4229254745d9bc2cc3306 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Wed, 26 Oct 2022 21:25:10 +0200 Subject: [PATCH 082/124] fix crash making embeddings from too-long prompts with attention weights --- ldm/modules/encoders/modules.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 670ab3f298..422179e1c6 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -598,7 +598,7 @@ class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): fragments, truncation=True, max_length=self.max_length, - return_overflowing_tokens=False, + return_overflowing_tokens=True, padding='do_not_pad', return_tensors=None, # just give me a list of ints )['input_ids'] @@ -616,8 +616,9 @@ class WeightedFrozenCLIPEmbedder(FrozenCLIPEmbedder): if (len(all_tokens) + 2) > self.max_length: excess_token_count = (len(all_tokens) + 2) - self.max_length - print(f"prompt is {excess_token_count} token(s) too long and has been truncated") + print(f">> Prompt is {excess_token_count} token(s) too long and has been truncated") all_tokens = all_tokens[:self.max_length - 2] + per_token_weights = per_token_weights[:self.max_length - 2] # pad out to a 77-entry array: [eos_token, , eos_token, ..., eos_token] # (77 = self.max_length) From 799dc6d0df9e50eafc1043623a0ed7a10ed54e80 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Thu, 27 Oct 2022 01:51:35 -0400 Subject: [PATCH 083/124] acceptable integration of new prompting system and inpainting This was a difficult merge because both PR #1108 and #1243 made changes to obscure parts of the diffusion code. - prompt weighting, merging and cross-attention working - cross-attention does not work with runwayML inpainting model, but weighting and merging are tested and working - CLI command parsing code rewritten in order to get embedded quotes right - --hires now works with runwayML inpainting - --embiggen does not work with runwayML and will give an error - Added an --invert option to invert masks applied to inpainting - Updated documentation --- docs/features/CLI.md | 5 +++ docs/features/PROMPTS.md | 26 +++++++++-- ldm/generate.py | 53 +++++++++++++++------- ldm/invoke/args.py | 5 +++ ldm/invoke/generator/base.py | 5 ++- ldm/invoke/generator/embiggen.py | 3 ++ ldm/invoke/generator/txt2img2img.py | 69 +++++++++++++++++++++++------ ldm/models/diffusion/sampler.py | 24 +--------- ldm/modules/encoders/modules.py | 1 - scripts/invoke.py | 21 ++++++--- 10 files changed, 148 insertions(+), 64 deletions(-) diff --git a/docs/features/CLI.md b/docs/features/CLI.md index 67a187fb3b..2cc8fa6d05 100644 --- a/docs/features/CLI.md +++ b/docs/features/CLI.md @@ -218,8 +218,13 @@ well as the --mask (-M) and --text_mask (-tm) arguments: | Argument | Shortcut | Default | Description | |--------------------|------------|---------------------|--------------| | `--init_mask ` | `-M` | `None` |Path to an image the same size as the initial_image, with areas for inpainting made transparent.| +| `--invert_mask ` | | False |If true, invert the mask so that transparent areas are opaque and vice versa.| | `--text_mask []` | `-tm []` | | Create a mask from a text prompt describing part of the image| +The mask may either be an image with transparent areas, in which case +the inpainting will occur in the transparent areas only, or a black +and white image, in which case all black areas will be painted into. + `--text_mask` (short form `-tm`) is a way to generate a mask using a text description of the part of the image to replace. For example, if you have an image of a breakfast plate with a bagel, toast and diff --git a/docs/features/PROMPTS.md b/docs/features/PROMPTS.md index 8fdb97b7b8..1a3dcb5e9d 100644 --- a/docs/features/PROMPTS.md +++ b/docs/features/PROMPTS.md @@ -45,7 +45,7 @@ Here's a prompt that depicts what it does. original prompt: -`#!bash "A fantastical translucent poney made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve" -s 20 -W 512 -H 768 -C 7.5 -A k_euler_a -S 1654590180` +`#!bash "A fantastical translucent pony made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve" -s 20 -W 512 -H 768 -C 7.5 -A k_euler_a -S 1654590180`
![step1](../assets/negative_prompt_walkthru/step1.png) @@ -110,7 +110,10 @@ See the section below on "Prompt Blending" for more information about how this w ### Cross-Attention Control ('prompt2prompt') -Denoise with a given prompt and then re-use the attention→pixel maps to substitute words in the original prompt for words in a new prompt. Based off [bloc97's colab](https://github.com/bloc97/CrossAttentionControl). +Generate an image with a given prompt and then paint over the image +using the `prompt2prompt` syntax to substitute words in the original +prompt for words in a new prompt. Based off [bloc97's +colab](https://github.com/bloc97/CrossAttentionControl). * `a ("fluffy cat").swap("smiling dog") eating a hotdog`. * quotes optional: `a (fluffy cat).swap(smiling dog) eating a hotdog`. @@ -122,9 +125,26 @@ Denoise with a given prompt and then re-use the attention→pixel maps to substi * Convenience option `shape_freedom` (0-1) to specify how much "freedom" Stable Diffusion should have to change the shape of the subject being swapped. * `a (cat).swap(dog, shape_freedom=0.5) eating a hotdog`. +Note that `prompt2prompt` is not currently working with the runwayML +inpainting model, and may never work due to the way this model is set +up. If you attempt to use `prompt2prompt` you will get the original +image back. However, since this model is so good at inpainting, a +good substitute is to use the `clipseg` text masking option: + +``` +invoke> a fluffy cat eating a hotdot +Outputs: +[1010] outputs/000025.2182095108.png: a fluffy cat eating a hotdog +invoke> a smiling dog eating a hotdog -I 000025.2182095108.png -tm cat +``` + ### Escaping parantheses () and speech marks "" -If the model you are using has parentheses () or speech marks "" as part of its syntax, you will need to "escape" these using a backslash, so that`(my_keyword)` becomes `\(my_keyword\)`. Otherwise, the prompt parser will attempt to interpret the parentheses as part of the prompt syntax and it will get confused. +If the model you are using has parentheses () or speech marks "" as +part of its syntax, you will need to "escape" these using a backslash, +so that`(my_keyword)` becomes `\(my_keyword\)`. Otherwise, the prompt +parser will attempt to interpret the parentheses as part of the prompt +syntax and it will get confused. ## **Prompt Blending** diff --git a/ldm/generate.py b/ldm/generate.py index 3785be56bb..ff0357adfd 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -274,6 +274,7 @@ class Generate: init_img = None, init_mask = None, text_mask = None, + invert_mask = False, fit = False, strength = None, init_color = None, @@ -311,6 +312,7 @@ class Generate: init_img // path to an initial image init_mask // path to a mask for the initial image text_mask // a text string that will be used to guide clipseg generation of the init_mask + invert_mask // boolean, if true invert the mask strength // strength for noising/unnoising init_img. 0.0 preserves image exactly, 1.0 replaces it completely facetool_strength // strength for GFPGAN/CodeFormer. 0.0 preserves image exactly, 1.0 replaces it completely ddim_eta // image randomness (eta=0.0 means the same seed always produces the same image) @@ -418,22 +420,11 @@ class Generate: height, fit=fit, text_mask=text_mask, + invert_mask=invert_mask, ) # TODO: Hacky selection of operation to perform. Needs to be refactored. - if self.sampler.conditioning_key() in ('hybrid','concat'): - print(f'** Inpainting model detected. Will try it! **') - generator = self._make_omnibus() - elif (init_image is not None) and (mask_image is not None): - generator = self._make_inpaint() - elif (embiggen != None or embiggen_tiles != None): - generator = self._make_embiggen() - elif init_image is not None: - generator = self._make_img2img() - elif hires_fix: - generator = self._make_txt2img2img() - else: - generator = self._make_txt2img() + generator = self.select_generator(init_image, mask_image, embiggen, hires_fix) generator.set_variation( self.seed, variation_amount, with_variations @@ -549,7 +540,7 @@ class Generate: # try to reuse the same filename prefix as the original file. # we take everything up to the first period prefix = None - m = re.match('^([^.]+)\.',os.path.basename(image_path)) + m = re.match(r'^([^.]+)\.',os.path.basename(image_path)) if m: prefix = m.groups()[0] @@ -603,10 +594,9 @@ class Generate: elif tool == 'embiggen': # fetch the metadata from the image - generator = self._make_embiggen() + generator = self.select_generator(embiggen=True) opt.strength = 0.40 print(f'>> Setting img2img strength to {opt.strength} for happy embiggening') - # embiggen takes a image path (sigh) generator.generate( prompt, sampler = self.sampler, @@ -640,6 +630,31 @@ class Generate: print(f'* postprocessing tool {tool} is not yet supported') return None + def select_generator( + self, + init_image:Image.Image=None, + mask_image:Image.Image=None, + embiggen:bool=False, + hires_fix:bool=False, + ): + inpainting_model_in_use = self.sampler.uses_inpainting_model() + + if hires_fix: + return self._make_txt2img2img() + + if embiggen is not None: + return self._make_embiggen() + + if inpainting_model_in_use: + return self._make_omnibus() + + if (init_image is not None) and (mask_image is not None): + return self._make_inpaint() + + if init_image is not None: + return self._make_img2img() + + return self._make_txt2img() def _make_images( self, @@ -649,6 +664,7 @@ class Generate: height, fit=False, text_mask=None, + invert_mask=False, ): init_image = None init_mask = None @@ -678,6 +694,9 @@ class Generate: elif text_mask: init_mask = self._txt2mask(image, text_mask, width, height, fit=fit) + if invert_mask: + init_mask = ImageOps.invert(init_mask) + return init_image,init_mask # lots o' repeated code here! Turn into a make_func() @@ -855,6 +874,8 @@ class Generate: def sample_to_image(self, samples): return self._make_base().sample_to_image(samples) + # very repetitive code - can this be simplified? The KSampler names are + # consistent, at least def _set_sampler(self): msg = f'>> Setting Sampler to {self.sampler_name}' if self.sampler_name == 'plms': diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index 26c5dc1c81..3c1bf2eae4 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -705,6 +705,11 @@ class Args(object): type=str, help='Path to input mask for inpainting mode (supersedes width and height)', ) + img2img_group.add_argument( + '--invert_mask', + action='store_true', + help='Invert the mask', + ) img2img_group.add_argument( '-tm', '--text_mask', diff --git a/ldm/invoke/generator/base.py b/ldm/invoke/generator/base.py index 2e96c93cbb..77b92d693d 100644 --- a/ldm/invoke/generator/base.py +++ b/ldm/invoke/generator/base.py @@ -29,7 +29,8 @@ class Generator(): self.threshold = 0 self.variation_amount = 0 self.with_variations = [] - self.use_mps_noise = False + self.use_mps_noise = False + self.free_gpu_mem = None # this is going to be overridden in img2img.py, txt2img.py and inpaint.py def get_make_image(self,prompt,**kwargs): @@ -50,7 +51,7 @@ class Generator(): **kwargs): scope = choose_autocast(self.precision) self.safety_checker = safety_checker - make_image = self.get_make_image( + make_image = self.get_make_image( prompt, sampler = sampler, init_image = init_image, diff --git a/ldm/invoke/generator/embiggen.py b/ldm/invoke/generator/embiggen.py index 53fbde68cf..dc6af35a6c 100644 --- a/ldm/invoke/generator/embiggen.py +++ b/ldm/invoke/generator/embiggen.py @@ -21,6 +21,7 @@ class Embiggen(Generator): def generate(self,prompt,iterations=1,seed=None, image_callback=None, step_callback=None, **kwargs): + scope = choose_autocast(self.precision) make_image = self.get_make_image( prompt, @@ -63,6 +64,8 @@ class Embiggen(Generator): Returns a function returning an image derived from the prompt and multi-stage twice-baked potato layering over the img2img on the initial image Return value depends on the seed at the time you call it """ + assert not sampler.uses_inpainting_model(), "--embiggen is not supported by inpainting models" + # Construct embiggen arg array, and sanity check arguments if embiggen == None: # embiggen can also be called with just embiggen_tiles embiggen = [1.0] # If not specified, assume no scaling diff --git a/ldm/invoke/generator/txt2img2img.py b/ldm/invoke/generator/txt2img2img.py index 9fad2d80e1..a11f1bc69d 100644 --- a/ldm/invoke/generator/txt2img2img.py +++ b/ldm/invoke/generator/txt2img2img.py @@ -5,10 +5,11 @@ ldm.invoke.generator.txt2img inherits from ldm.invoke.generator import torch import numpy as np import math -from ldm.invoke.generator.base import Generator +from ldm.invoke.generator.base import Generator from ldm.models.diffusion.ddim import DDIMSampler +from ldm.invoke.generator.omnibus import Omnibus from ldm.models.diffusion.shared_invokeai_diffusion import InvokeAIDiffuserComponent - +from PIL import Image class Txt2Img2Img(Generator): def __init__(self, model, precision): @@ -25,16 +26,16 @@ class Txt2Img2Img(Generator): """ uc, c, extra_conditioning_info = conditioning - @torch.no_grad() - def make_image(x_T): - - trained_square = 512 * 512 - actual_square = width * height - scale = math.sqrt(trained_square / actual_square) + trained_square = 512 * 512 + actual_square = width * height + scale = math.sqrt(trained_square / actual_square) + + init_width = math.ceil(scale * width / 64) * 64 + init_height = math.ceil(scale * height / 64) * 64 + + @torch.no_grad() + def make_image(x_T): - init_width = math.ceil(scale * width / 64) * 64 - init_height = math.ceil(scale * height / 64) * 64 - shape = [ self.latent_channels, init_height // self.downsampling_factor, @@ -105,8 +106,49 @@ class Txt2Img2Img(Generator): return self.sample_to_image(samples) - return make_image - + # in the case of the inpainting model being loaded, the trick of + # providing an interpolated latent doesn't work, so we transiently + # create a 512x512 PIL image, upscale it, and run the inpainting + # over it in img2img mode. Because the inpaing model is so conservative + # it doesn't change the image (much) + def inpaint_make_image(x_T): + omnibus = Omnibus(self.model,self.precision) + result = omnibus.generate( + prompt, + sampler=sampler, + width=init_width, + height=init_height, + step_callback=step_callback, + steps = steps, + cfg_scale = cfg_scale, + ddim_eta = ddim_eta, + conditioning = conditioning, + **kwargs + ) + assert result is not None and len(result)>0,'** txt2img failed **' + image = result[0][0] + interpolated_image = image.resize((width,height),resample=Image.Resampling.LANCZOS) + print(kwargs.pop('init_image',None)) + result = omnibus.generate( + prompt, + sampler=sampler, + init_image=interpolated_image, + width=width, + height=height, + seed=result[0][1], + step_callback=step_callback, + steps = steps, + cfg_scale = cfg_scale, + ddim_eta = ddim_eta, + conditioning = conditioning, + **kwargs + ) + return result[0][0] + + if sampler.uses_inpainting_model(): + return inpaint_make_image + else: + return make_image # returns a tensor filled with random numbers from a normal distribution def get_noise(self,width,height,scale = True): @@ -134,3 +176,4 @@ class Txt2Img2Img(Generator): scaled_height // self.downsampling_factor, scaled_width // self.downsampling_factor], device=device) + diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index f31f5b1758..f92ceb3d3f 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -272,7 +272,6 @@ class Sampler(object): ) if mask is not None: - print('DEBUG: in masking routine') assert x0 is not None img_orig = self.model.q_sample( x0, ts @@ -438,24 +437,5 @@ class Sampler(object): def conditioning_key(self)->str: return self.model.model.conditioning_key - # def make_cond_in(self, uncond, cond): - # ''' - # This handles the choice between a conditional conditioning - # that is a tensor (used by cross attention) vs one that is a dict - # used by 'hybrid' - # ''' - # if isinstance(cond, dict): - # assert isinstance(uncond, dict) - # cond_in = dict() - # for k in cond: - # if isinstance(cond[k], list): - # cond_in[k] = [ - # torch.cat([uncond[k][i], cond[k][i]]) - # for i in range(len(cond[k])) - # ] - # else: - # cond_in[k] = torch.cat([uncond[k], cond[k]]) - # else: - # cond_in = torch.cat([uncond, cond]) - # return cond_in - + def uses_inpainting_model(self)->bool: + return self.conditioning_key() in ('hybrid','concat') diff --git a/ldm/modules/encoders/modules.py b/ldm/modules/encoders/modules.py index 422179e1c6..cf8644a7fb 100644 --- a/ldm/modules/encoders/modules.py +++ b/ldm/modules/encoders/modules.py @@ -439,7 +439,6 @@ class FrozenCLIPEmbedder(AbstractEncoder): param.requires_grad = False def forward(self, text, **kwargs): - print(f'DEBUG text={text}, max_length={self.max_length}') batch_encoding = self.tokenizer( text, truncation=True, diff --git a/scripts/invoke.py b/scripts/invoke.py index 466536bc46..1937d47ab5 100644 --- a/scripts/invoke.py +++ b/scripts/invoke.py @@ -18,6 +18,7 @@ from ldm.invoke.image_util import make_grid from ldm.invoke.log import write_log from omegaconf import OmegaConf from pathlib import Path +from pyparsing import ParseException # global used in multiple functions (fix) infile = None @@ -328,12 +329,16 @@ def main_loop(gen, opt): if operation == 'generate': catch_ctrl_c = infile is None # if running interactively, we catch keyboard interrupts opt.last_operation='generate' - gen.prompt2image( - image_callback=image_writer, - step_callback=step_callback, - catch_interrupts=catch_ctrl_c, - **vars(opt) - ) + try: + gen.prompt2image( + image_callback=image_writer, + step_callback=step_callback, + catch_interrupts=catch_ctrl_c, + **vars(opt) + ) + except ParseException as e: + print('** An error occurred while processing your prompt **') + print(f'** {str(e)} **') elif operation == 'postprocess': print(f'>> fixing {opt.prompt}') opt.last_operation = do_postprocess(gen,opt,image_writer) @@ -592,7 +597,9 @@ def write_config_file(conf_path, gen, model_name, new_config, clobber=False, mak def do_textmask(gen, opt, callback): image_path = opt.prompt - assert os.path.exists(image_path), '** "{image_path}" not found. Please enter the name of an existing image file to mask **' + if not os.path.exists(image_path): + image_path = os.path.join(opt.outdir,image_path) + assert os.path.exists(image_path), '** "{opt.prompt}" not found. Please enter the name of an existing image file to mask **' assert opt.text_mask is not None and len(opt.text_mask) >= 1, '** Please provide a text mask with -tm **' tm = opt.text_mask[0] threshold = float(opt.text_mask[1]) if len(opt.text_mask) > 1 else 0.5 From 52de5c8b3391066ec3cb2925774b038d69dfab8b Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 26 Oct 2022 22:37:30 -0400 Subject: [PATCH 084/124] documentation fix --- docs/features/INPAINTING.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/features/INPAINTING.md b/docs/features/INPAINTING.md index 0503f1fc88..fae041a5ea 100644 --- a/docs/features/INPAINTING.md +++ b/docs/features/INPAINTING.md @@ -34,6 +34,16 @@ original unedited image and the masked (partially transparent) image: invoke> "man with cat on shoulder" -I./images/man.png -M./images/man-transparent.png ``` +If you are using Photoshop to make your transparent masks, here is a +protocol contributed by III_Communication36 (Discord name): + + Create your alpha channel for mask in photoshop, then run + image/adjust/threshold on that channel. Export as Save a copy using + superpng (3rd party free download plugin) making sure alpha channel + is selected. Then masking works as it should for the img2img + process 100%. Can feed just one image this way without needing to + feed the -M mask behind it + ## **Masking using Text** You can also create a mask using a text prompt to select the part of From 135c62f1a4edd332abc19491c78c89ee4949b9cf Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 27 Oct 2022 10:14:44 +0200 Subject: [PATCH 085/124] fix issue with hot-dog, improve () suppression --- ldm/invoke/prompt_parser.py | 74 ++++++++++++++++++++----------------- tests/test_prompt_parser.py | 9 +++-- 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 6709f48066..7613c9d93e 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -358,10 +358,11 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) quoted_fragment = pp.Forward() parenthesized_fragment = pp.Forward() cross_attention_substitute = pp.Forward() - prompt_part = pp.Forward() def make_text_fragment(x): #print("### making fragment for", x) + if type(x[0]) is Fragment: + assert(False) if type(x) is str: return Fragment(x) elif type(x) is pp.ParseResults or type(x) is list: @@ -396,8 +397,10 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) def parse_fragment_str(x, in_quotes: bool=False, in_parens: bool=False): - #print(f"parsing fragment string \"{x}\"") + #print(f"parsing fragment string for {x}") fragment_string = x[0] + #print(f"ppparsing fragment string \"{fragment_string}\"") + if len(fragment_string.strip()) == 0: return Fragment('') @@ -406,13 +409,16 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) fragment_string = fragment_string.replace('"', '\\"') #fragment_parser = pp.Group(pp.OneOrMore(attention | cross_attention_substitute | (greedy_word.set_parse_action(make_text_fragment)))) - result = pp.Group(pp.MatchFirst([ - pp.OneOrMore(prompt_part | quoted_fragment), - pp.Empty().set_parse_action(make_text_fragment) + pp.StringEnd() - ])).set_name('rr').set_debug(False).parse_string(fragment_string) - #result = (pp.OneOrMore(attention | unquoted_word) + pp.StringEnd()).parse_string(x[0]) - #print("parsed to", result) - return result + try: + result = pp.Group(pp.MatchFirst([ + pp.OneOrMore(quoted_fragment | attention | unquoted_word).set_name('pf_str_qfuq'), + pp.Empty().set_parse_action(make_text_fragment) + pp.StringEnd() + ])).set_name('blend-result').set_debug(False).parse_string(fragment_string) + #print("parsed to", result) + return result + except pp.ParseException as e: + print("parse_fragment_str couldn't parse prompt string:", e) + raise quoted_fragment << pp.QuotedString(quote_char='"', esc_char=None, esc_quote='\\"') quoted_fragment.set_parse_action(lambda x: parse_fragment_str(x, in_quotes=True)).set_name('quoted_fragment') @@ -422,14 +428,21 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) escaped_rparen = pp.Literal('\\)')#.set_parse_action(lambda x: ')') escaped_backslash = pp.Literal('\\\\')#.set_parse_action(lambda x: '"') + empty = ( + (lparen + pp.ZeroOrMore(pp.Word(string.whitespace)) + rparen) | + (quotes + pp.ZeroOrMore(pp.Word(string.whitespace)) + quotes)).set_debug(False).set_name('empty') + + def not_ends_with_swap(x): #print("trying to match:", x) return not x[0].endswith('.swap') - unquoted_fragment = pp.Combine(pp.OneOrMore( + unquoted_word = pp.Combine(pp.OneOrMore( escaped_rparen | escaped_lparen | escaped_quote | escaped_backslash | - pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()'))) - unquoted_fragment.set_parse_action(make_text_fragment).set_name('unquoted_fragment').set_debug(False) + (pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()') + (pp.NotAny(pp.Word('+') | pp.Word('-')))) + )) + + unquoted_word.set_parse_action(make_text_fragment).set_name('unquoted_word').set_debug(False) #print(unquoted_fragment.parse_string("cat.swap(dog)")) parenthesized_fragment << pp.Or([ @@ -510,15 +523,16 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) cross_attention_option_keyword = pp.Or([pp.Keyword("s_start"), pp.Keyword("s_end"), pp.Keyword("t_start"), pp.Keyword("t_end"), pp.Keyword("shape_freedom")]) cross_attention_option = pp.Group(cross_attention_option_keyword + pp.Literal("=").suppress() + number) edited_fragment = pp.MatchFirst([ + (lparen + rparen).set_parse_action(lambda x: Fragment('')), lparen + (quoted_fragment | - pp.Group(pp.OneOrMore(pp.Word(pp.printables, exclude_chars=string.whitespace + ',').set_parse_action(make_text_fragment))) + pp.Group(pp.ZeroOrMore(pp.Word(pp.printables, exclude_chars=string.whitespace + ',').set_parse_action(make_text_fragment))) ) + - pp.Dict(pp.OneOrMore(comma + cross_attention_option)) + + pp.Dict(pp.ZeroOrMore(comma + cross_attention_option)) + rparen, parenthesized_fragment ]) - cross_attention_substitute << original_fragment + pp.Literal(".swap").suppress() + edited_fragment + cross_attention_substitute << original_fragment + pp.Literal(".swap").set_debug(False).suppress() + edited_fragment original_fragment.set_name('original_fragment').set_debug(debug_cross_attention_control) edited_fragment.set_name('edited_fragment').set_debug(debug_cross_attention_control) @@ -533,24 +547,18 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) cross_attention_substitute.set_parse_action(make_cross_attention_substitute) - # simple fragments of text - # use Or to match the longest - prompt_part << pp.MatchFirst([ - cross_attention_substitute, - attention, - unquoted_fragment, - lparen + unquoted_fragment + rparen # matches case where user has +(term) and just deletes the + - ]) - prompt_part.set_debug(False) - prompt_part.set_name("prompt_part") - - empty = ( - (lparen + pp.ZeroOrMore(pp.Word(string.whitespace)) + rparen) | - (quotes + pp.ZeroOrMore(pp.Word(string.whitespace)) + quotes)).set_debug(False).set_name('empty') - # root prompt definition - prompt = (pp.OneOrMore(pp.Or([prompt_part, quoted_fragment, empty])) + pp.StringEnd()) \ - .set_parse_action(lambda x: Prompt(x)) + debug_root_prompt = False + prompt = (pp.OneOrMore(pp.Or([cross_attention_substitute.set_debug(debug_root_prompt), + attention.set_debug(debug_root_prompt), + quoted_fragment.set_debug(debug_root_prompt), + (lparen + (pp.ZeroOrMore(unquoted_word | pp.White().suppress()).leave_whitespace()) + rparen).set_name('parenthesized-uqw').set_debug(debug_root_prompt), + unquoted_word.set_debug(debug_root_prompt), + empty.set_parse_action(make_text_fragment).set_debug(debug_root_prompt)]) + ) + pp.StringEnd()) \ + .set_name('prompt') \ + .set_parse_action(lambda x: Prompt(x)) \ + .set_debug(debug_root_prompt) #print("parsing test:", prompt.parse_string("spaced eyes--")) #print("parsing test:", prompt.parse_string("eyes--")) @@ -567,7 +575,7 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) if len(x_unquoted.strip()) == 0: # print(' b : just an empty string') return Prompt([Fragment('')]) - # print(' b parsing ', c_unquoted) + #print(f' b parsing \'{x_unquoted}\'') x_parsed = prompt.parse_string(x_unquoted) #print(" quoted prompt was parsed to", type(x_parsed),":", x_parsed) return x_parsed[0] diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 486265d2f5..4fd7616ade 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -32,6 +32,7 @@ class PromptParserTestCase(unittest.TestCase): self.assertEqual(make_weighted_conjunction([("fire flames", 1)]), parse_prompt("fire flames")) self.assertEqual(make_weighted_conjunction([("fire, flames", 1)]), parse_prompt("fire, flames")) self.assertEqual(make_weighted_conjunction([("fire, flames , fire", 1)]), parse_prompt("fire, flames , fire")) + self.assertEqual(make_weighted_conjunction([("cat hot-dog eating", 1)]), parse_prompt("cat hot-dog eating")) def test_attention(self): self.assertEqual(make_weighted_conjunction([('flames', 0.5)]), parse_prompt("(flames)0.5")) @@ -106,10 +107,7 @@ class PromptParserTestCase(unittest.TestCase): #with self.assertRaises(pyparsing.ParseException): with self.assertRaises(pyparsing.ParseException): parse_prompt('a badly (formed +test prompt') - with self.assertRaises(pyparsing.ParseException): - parse_prompt('a badly (formed +test )prompt') - with self.assertRaises(pyparsing.ParseException): - parse_prompt('a badly (formed +test )prompt') + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a badly formed +test prompt',1)])]) , parse_prompt('a badly (formed +test )prompt')) with self.assertRaises(pyparsing.ParseException): parse_prompt('(((a badly (formed +test )prompt') with self.assertRaises(pyparsing.ParseException): @@ -394,6 +392,9 @@ class PromptParserTestCase(unittest.TestCase): # todo handle this #self.assertEqual(make_basic_conjunction(['a badly formed +test prompt']), # parse_prompt('a badly formed +test prompt')) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), + CrossAttentionControlSubstitute([Fragment('in winter',1)], [Fragment('',1)])])]), + parse_prompt('a forest landscape "in winter".swap()')) pass From 16e7cbdb3829dfc1cb52dde61ff1a32cef8ec77a Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Thu, 27 Oct 2022 08:30:09 -0400 Subject: [PATCH 086/124] tweaks to documentation and call signature for advanced prompting --- docs/features/PROMPTS.md | 16 ++++++++++++---- ldm/invoke/conditioning.py | 2 +- .../diffusion/shared_invokeai_diffusion.py | 4 ++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/features/PROMPTS.md b/docs/features/PROMPTS.md index 1a3dcb5e9d..fd8148f622 100644 --- a/docs/features/PROMPTS.md +++ b/docs/features/PROMPTS.md @@ -110,10 +110,15 @@ See the section below on "Prompt Blending" for more information about how this w ### Cross-Attention Control ('prompt2prompt') -Generate an image with a given prompt and then paint over the image -using the `prompt2prompt` syntax to substitute words in the original -prompt for words in a new prompt. Based off [bloc97's -colab](https://github.com/bloc97/CrossAttentionControl). +Sometimes an image you generate is almost right, and you just want to +change one detail without affecting the rest. You could use a photo editor and inpainting +to overpaint the area, but that's a pain. Here's where `prompt2prompt` +comes in handy. + +Generate an image with a given prompt, record the seed of the image, +and then use the `prompt2prompt` syntax to substitute words in the +original prompt for words in a new prompt. This works for `img2img` as well. + * `a ("fluffy cat").swap("smiling dog") eating a hotdog`. * quotes optional: `a (fluffy cat).swap(smiling dog) eating a hotdog`. @@ -125,6 +130,9 @@ colab](https://github.com/bloc97/CrossAttentionControl). * Convenience option `shape_freedom` (0-1) to specify how much "freedom" Stable Diffusion should have to change the shape of the subject being swapped. * `a (cat).swap(dog, shape_freedom=0.5) eating a hotdog`. +The `prompt2prompt` code is based off [bloc97's +colab](https://github.com/bloc97/CrossAttentionControl). + Note that `prompt2prompt` is not currently working with the runwayML inpainting model, and may never work due to the way this model is set up. If you attempt to use `prompt2prompt` you will get the original diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 7365bc9a87..33be8c342e 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -114,7 +114,7 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n conditioning = original_embeddings edited_conditioning = edited_embeddings - print('got edit_opcodes', edit_opcodes, 'options', edit_options) + print('>> got edit_opcodes', edit_opcodes, 'options', edit_options) cac_args = CrossAttentionControl.Arguments( edited_conditioning = edited_conditioning, edit_opcodes = edit_opcodes, diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index e985417b2b..14f08578c3 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -1,5 +1,5 @@ from math import ceil -from typing import Callable, Optional +from typing import Callable, Optional, Union import torch @@ -54,7 +54,7 @@ class InvokeAIDiffuserComponent: CrossAttentionControl.remove_cross_attention_control(self.model) def do_diffusion_step(self, x: torch.Tensor, sigma: torch.Tensor, - unconditioning: torch.Tensor, conditioning: torch.Tensor, + unconditioning: Union[torch.Tensor,dict], conditioning: Union[torch.Tensor,dict], unconditional_guidance_scale: float, step_index: int=None ): From e9f690bf9d0bc794c229ffd9e7c3d75a54daf47c Mon Sep 17 00:00:00 2001 From: Taylor Kems Date: Thu, 27 Oct 2022 07:19:26 -0500 Subject: [PATCH 087/124] Update IMG2IMG.md --- docs/features/IMG2IMG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/features/IMG2IMG.md b/docs/features/IMG2IMG.md index a540ff5cc9..99c72d2a73 100644 --- a/docs/features/IMG2IMG.md +++ b/docs/features/IMG2IMG.md @@ -121,8 +121,6 @@ Both of the outputs look kind of like what I was thinking of. With the strength If you want to try this out yourself, all of these are using a seed of `1592514025` with a width/height of `384`, step count `10`, the default sampler (`k_lms`), and the single-word prompt `"fire"`: -If you want to try this out yourself, all of these are using a seed of `1592514025` with a width/height of `384`, step count `10`, the default sampler (`k_lms`), and the single-word prompt `fire`: - ```commandline invoke> "fire" -s10 -W384 -H384 -S1592514025 -I /tmp/fire-drawing.png --strength 0.7 ``` From b2a3c5cbe8ddc810b5117062898a2fce1a159083 Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 00:01:10 +0200 Subject: [PATCH 088/124] update Dockerfile --- docker-build/Dockerfile | 109 +++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/docker-build/Dockerfile b/docker-build/Dockerfile index f3d6834c93..2f0c892730 100644 --- a/docker-build/Dockerfile +++ b/docker-build/Dockerfile @@ -1,57 +1,74 @@ -FROM debian +FROM ubuntu AS get_miniconda -ARG gsd -ENV GITHUB_STABLE_DIFFUSION $gsd +SHELL ["/bin/bash", "-c"] -ARG rsd -ENV REQS $rsd +# install wget +RUN apt-get update \ + && apt-get install -y \ + wget \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* -ARG cs -ENV CONDA_SUBDIR $cs +# download and install miniconda +ARG conda_version=py39_4.12.0-Linux-x86_64 +ARG conda_prefix=/opt/conda +RUN wget --progress=dot:giga -O /miniconda.sh \ + https://repo.anaconda.com/miniconda/Miniconda3-${conda_version}.sh \ + && bash /miniconda.sh -b -p ${conda_prefix} \ + && rm -f /miniconda.sh -ENV PIP_EXISTS_ACTION="w" +FROM ubuntu AS invokeai -# TODO: Optimize image size +# use bash +SHELL [ "/bin/bash", "-c" ] -SHELL ["/bin/bash", "-c"] +# clean bashrc +RUN echo "" > ~/.bashrc -WORKDIR / -RUN apt update && apt upgrade -y \ - && apt install -y \ - git \ - libgl1-mesa-glx \ - libglib2.0-0 \ - pip \ - python3 \ - && git clone $GITHUB_STABLE_DIFFUSION +# Install necesarry packages +RUN apt-get update \ + && apt-get install -y \ + --no-install-recommends \ + gcc \ + git \ + libgl1-mesa-glx \ + libglib2.0-0 \ + pip \ + python3 \ + python3-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* -# Install Anaconda or Miniconda -COPY anaconda.sh . -RUN bash anaconda.sh -b -u -p /anaconda && /anaconda/bin/conda init bash +# clone repository and create symlinks +ARG invokeai_git=https://github.com/invoke-ai/InvokeAI.git +ARG project_name=invokeai +RUN git clone ${invokeai_git} /${project_name} \ + && mkdir /${project_name}/models/ldm/stable-diffusion-v1 \ + && ln -s /data/models/sd-v1-4.ckpt /${project_name}/models/ldm/stable-diffusion-v1/model.ckpt \ + && ln -s /data/outputs/ /${project_name}/outputs -# SD -WORKDIR /stable-diffusion -RUN source ~/.bashrc \ - && conda create -y --name ldm && conda activate ldm \ - && conda config --env --set subdir $CONDA_SUBDIR \ - && pip3 install -r $REQS \ - && pip3 install basicsr facexlib realesrgan \ - && mkdir models/ldm/stable-diffusion-v1 \ - && ln -s "/data/sd-v1-4.ckpt" models/ldm/stable-diffusion-v1/model.ckpt +# set workdir +WORKDIR /${project_name} -# Face restoreation -# by default expected in a sibling directory to stable-diffusion -WORKDIR / -RUN git clone https://github.com/TencentARC/GFPGAN.git +# install conda env and preload models +ARG conda_prefix=/opt/conda +ARG conda_env_file=environment.yml +COPY --from=get_miniconda ${conda_prefix} ${conda_prefix} +RUN source ${conda_prefix}/etc/profile.d/conda.sh \ + && conda init bash \ + && source ~/.bashrc \ + && conda env create \ + --name ${project_name} \ + --file ${conda_env_file} \ + && rm -Rf ~/.cache \ + && conda clean -afy \ + && echo "conda activate ${project_name}" >> ~/.bashrc \ + && ln -s /data/models/GFPGANv1.4.pth ./src/gfpgan/experiments/pretrained_models/GFPGANv1.4.pth \ + && conda activate ${project_name} \ + && python scripts/preload_models.py -WORKDIR /GFPGAN -RUN pip3 install -r requirements.txt \ - && python3 setup.py develop \ - && ln -s "/data/GFPGANv1.4.pth" experiments/pretrained_models/GFPGANv1.4.pth - -WORKDIR /stable-diffusion -RUN python3 scripts/preload_models.py - -WORKDIR / -COPY entrypoint.sh . -ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file +# Copy entrypoint and set env +ENV CONDA_PREFIX=${conda_prefix} +ENV PROJECT_NAME=${project_name} +COPY docker-build/entrypoint.sh / +ENTRYPOINT [ "/entrypoint.sh" ] From 44731f8a3794f3b83e5ea68dedc0a33e76000d98 Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 00:02:07 +0200 Subject: [PATCH 089/124] add .dockerignore to repo-root since transfering the 2GB context would not be rly productive --- .dockerignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..8a0ebc5069 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +* +!environment*.yml +!docker-build From 624fe4794bf5e72905b202d25668141f5204c813 Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 00:02:58 +0200 Subject: [PATCH 090/124] add build script which also creates volume it needs a token from huggingface to be able to download the checkpoint --- docker-build/build.sh | 81 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 docker-build/build.sh diff --git a/docker-build/build.sh b/docker-build/build.sh new file mode 100755 index 0000000000..fea311ae82 --- /dev/null +++ b/docker-build/build.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +set -e +# IMPORTANT: You need to have a token on huggingface.co to be able to download the checkpoint!!! +# configure values by using env when executing build.sh +# f.e. env ARCH=aarch64 GITHUB_INVOKE_AI=https://github.com/yourname/yourfork.git ./build.sh + +source ./docker-build/env.sh || echo "please run from repository root" || exit 1 + +invokeai_conda_version=${INVOKEAI_CONDA_VERSION:-py39_4.12.0-${platform/\//-}} +invokeai_conda_prefix=${INVOKEAI_CONDA_PREFIX:-\/opt\/conda} +invokeai_conda_env_file=${INVOKEAI_CONDA_ENV_FILE:-environment.yml} +invokeai_git=${INVOKEAI_GIT:-https://github.com/invoke-ai/InvokeAI.git} +huggingface_token=${HUGGINGFACE_TOKEN?} + +# print the settings +echo "You are using these values:" +echo -e "project_name:\t\t ${project_name}" +echo -e "volumename:\t\t ${volumename}" +echo -e "arch:\t\t\t ${arch}" +echo -e "platform:\t\t ${platform}" +echo -e "invokeai_conda_version:\t ${invokeai_conda_version}" +echo -e "invokeai_conda_prefix:\t ${invokeai_conda_prefix}" +echo -e "invokeai_conda_env_file: ${invokeai_conda_env_file}" +echo -e "invokeai_git:\t\t ${invokeai_git}" +echo -e "invokeai_tag:\t\t ${invokeai_tag}\n" + +_runAlpine() { + docker run \ + --rm \ + --interactive \ + --tty \ + --mount source="$volumename",target=/data \ + --workdir /data \ + alpine "$@" +} + +_copyCheckpoints() { + echo "creating subfolders for models and outputs" + _runAlpine mkdir models + _runAlpine mkdir outputs + echo -n "downloading sd-v1-4.ckpt" + _runAlpine wget --header="Authorization: Bearer ${huggingface_token}" -O models/sd-v1-4.ckpt https://huggingface.co/CompVis/stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt + echo "done" + echo "downloading GFPGANv1.4.pth" + _runAlpine wget -O models/GFPGANv1.4.pth https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth +} + +_checkVolumeContent() { + _runAlpine ls -lhA /data/models +} + +_getModelMd5s() { + _runAlpine \ + alpine sh -c "md5sum /data/models/*" +} + +if [[ -n "$(docker volume ls -f name="${volumename}" -q)" ]]; then + echo "Volume already exists" + if [[ -z "$(_checkVolumeContent)" ]]; then + echo "looks empty, copying checkpoint" + _copyCheckpoints + fi + echo "Models in ${volumename}:" + _checkVolumeContent +else + echo -n "createing docker volume " + docker volume create "${volumename}" + _copyCheckpoints +fi + +# Build Container +docker build \ + --platform="${platform}" \ + --tag "${invokeai_tag}" \ + --build-arg project_name="${project_name}" \ + --build-arg conda_version="${invokeai_conda_version}" \ + --build-arg conda_prefix="${invokeai_conda_prefix}" \ + --build-arg conda_env_file="${invokeai_conda_env_file}" \ + --build-arg invokeai_git="${invokeai_git}" \ + --file ./docker-build/Dockerfile \ + . From 3e2cf8a25912be197a2914333ccfc621ed88f170 Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 00:03:25 +0200 Subject: [PATCH 091/124] add env.sh with variables shared in run and build --- docker-build/env.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docker-build/env.sh diff --git a/docker-build/env.sh b/docker-build/env.sh new file mode 100644 index 0000000000..36b718d362 --- /dev/null +++ b/docker-build/env.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +project_name=${PROJECT_NAME:-invokeai} +volumename=${VOLUMENAME:-${project_name}_data} +arch=${ARCH:-x86_64} +platform=${PLATFORM:-Linux/${arch}} +invokeai_tag=${INVOKEAI_TAG:-${project_name}-${arch}} + +export project_name +export volumename +export arch +export platform +export invokeai_tag From 67a7d46a292e9525e27f9b9f1f02f4dda9b44903 Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 00:03:48 +0200 Subject: [PATCH 092/124] add script to easily run the container --- docker-build/run.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100755 docker-build/run.sh diff --git a/docker-build/run.sh b/docker-build/run.sh new file mode 100755 index 0000000000..3d1a564f4c --- /dev/null +++ b/docker-build/run.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -e + +source ./docker-build/env.sh || echo "please run from repository root" || exit 1 + +docker run \ + --interactive \ + --tty \ + --rm \ + --platform "$platform" \ + --name "$project_name" \ + --hostname "$project_name" \ + --mount source="$volumename",target=/data \ + --publish 9090:9090 \ + "$invokeai_tag" ${1:+$@} From bf50a68eb56a7348dfcc869c4e7f43afc51117df Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 00:05:52 +0200 Subject: [PATCH 093/124] update entrypoint - when run without arguments it starts the web-interface - can also be run with your own arguments - if u do so it does not start web unless u do --- docker-build/entrypoint.sh | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docker-build/entrypoint.sh b/docker-build/entrypoint.sh index f47e6669e0..7c0ca12f88 100755 --- a/docker-build/entrypoint.sh +++ b/docker-build/entrypoint.sh @@ -1,10 +1,8 @@ #!/bin/bash +set -e -cd /stable-diffusion +source "${CONDA_PREFIX}/etc/profile.d/conda.sh" +conda activate "${PROJECT_NAME}" -if [ $# -eq 0 ]; then - python3 scripts/dream.py --full_precision -o /data - # bash -else - python3 scripts/dream.py --full_precision -o /data "$@" -fi \ No newline at end of file +python scripts/invoke.py \ + ${@:---web --host=0.0.0.0} From 99eb7e6ef2c89b48d0fe4c52f20e1c7d8c2fb0f5 Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 00:06:37 +0200 Subject: [PATCH 094/124] add conda env for linux-aarch64 - neither environment.yml nor environment-mac.yml was working --- environment-linux-aarch64.yml | 44 +++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 environment-linux-aarch64.yml diff --git a/environment-linux-aarch64.yml b/environment-linux-aarch64.yml new file mode 100644 index 0000000000..f430770c4d --- /dev/null +++ b/environment-linux-aarch64.yml @@ -0,0 +1,44 @@ +name: invokeai +channels: + - pytorch + - conda-forge +dependencies: + - python>=3.9 + - pip>=20.3 + - cudatoolkit + - pytorch + - torchvision + - numpy=1.19 + - imageio=2.9.0 + - opencv=4.6.0 + - pillow=8.* + - flask=2.1.* + - flask_cors=3.0.10 + - flask-socketio=5.3.0 + - send2trash=1.8.0 + - eventlet + - albumentations=0.4.3 + - pudb=2019.2 + - imageio-ffmpeg=0.4.2 + - pytorch-lightning=1.7.7 + - streamlit + - einops=0.3.0 + - kornia=0.6 + - torchmetrics=0.7.0 + - transformers=4.21.3 + - torch-fidelity=0.3.0 + - tokenizers>=0.11.1,!=0.11.3,<0.13 + - pip: + - omegaconf==2.1.1 + - realesrgan==0.2.5.0 + - test-tube>=0.7.5 + - pyreadline3 + - dependency_injector==4.40.0 + - -e git+https://github.com/openai/CLIP.git@main#egg=clip + - -e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers + - -e git+https://github.com/Birch-san/k-diffusion.git@mps#egg=k_diffusion + - -e git+https://github.com/TencentARC/GFPGAN.git#egg=gfpgan + - -e git+https://github.com/invoke-ai/clipseg.git@models-rename#egg=clipseg + - -e . +variables: + PYTORCH_ENABLE_MPS_FALLBACK: 1 From 9b15b228b82307dc83a9118d2da15e2b5bf4510c Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 00:07:06 +0200 Subject: [PATCH 095/124] add action to build the container it does not push the container but verify buildability --- .github/workflows/build-container.yml | 39 +++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/build-container.yml diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml new file mode 100644 index 0000000000..97f465a550 --- /dev/null +++ b/.github/workflows/build-container.yml @@ -0,0 +1,39 @@ +# Building the Image without pushing to confirm it is still buildable +# confirum functionality would unfortunately need way more resources +name: build container image +on: + push: + branches: + - 'main' + - 'development' + pull_request_target: + branches: + - 'main' + - 'development' + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Cache Docker layers + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: ${{ runner.os }}-buildx- + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + file: docker-build/Dockerfile + platforms: linux/amd64 + push: false + tags: ${{ github.repository }}:latest + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache From fb4feb380b2cce8663449da50b39243f9a0afe36 Mon Sep 17 00:00:00 2001 From: mauwii Date: Tue, 25 Oct 2022 02:50:04 +0200 Subject: [PATCH 096/124] update docker docs --- docs/installation/INSTALL_DOCKER.md | 128 ++++++++++------------------ 1 file changed, 45 insertions(+), 83 deletions(-) diff --git a/docs/installation/INSTALL_DOCKER.md b/docs/installation/INSTALL_DOCKER.md index eb2e2ab39f..50c3d89c81 100644 --- a/docs/installation/INSTALL_DOCKER.md +++ b/docs/installation/INSTALL_DOCKER.md @@ -36,20 +36,6 @@ another environment with NVIDIA GPUs on-premises or in the cloud. ### Prerequisites -#### Get the data files - -Go to -[Hugging Face](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original), -and click "Access repository" to Download the model file `sd-v1-4.ckpt` (~4 GB) -to `~/Downloads`. You'll need to create an account but it's quick and free. - -Also download the face restoration model. - -```Shell -cd ~/Downloads -wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth -``` - #### Install [Docker](https://github.com/santisbon/guides#docker) On the Docker Desktop app, go to Preferences, Resources, Advanced. Increase the @@ -57,86 +43,61 @@ CPUs and Memory to avoid this [Issue](https://github.com/invoke-ai/InvokeAI/issues/342). You may need to increase Swap and Disk image size too. +#### Get a Huggingface-Token + +Go to [Hugging Face](https://huggingface.co/settings/tokens), create a token and +temporary place it somewhere like a open texteditor window (but dont save it!, +only keep it open, we need it in the next step) + ### Setup Set the fork you want to use and other variables. -```Shell -TAG_STABLE_DIFFUSION="santisbon/stable-diffusion" -PLATFORM="linux/arm64" -GITHUB_STABLE_DIFFUSION="-b orig-gfpgan https://github.com/santisbon/stable-diffusion.git" -REQS_STABLE_DIFFUSION="requirements-linux-arm64.txt" -CONDA_SUBDIR="osx-arm64" +!!! tip -echo $TAG_STABLE_DIFFUSION -echo $PLATFORM -echo $GITHUB_STABLE_DIFFUSION -echo $REQS_STABLE_DIFFUSION -echo $CONDA_SUBDIR + I preffer to save my env vars + in the repository root in a `.env` (or `.envrc`) file to automatically re-apply + them when I come back. + +The build- and run- scripts contain default values for almost everything, +besides the [Hugging Face Token](https://huggingface.co/settings/tokens) you +created in the last step. + +Some Suggestions of variables you may want to change besides the Token: + +| Environment-Variable | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------------ | +| `HUGGINGFACE_TOKEN="hg_aewirhghlawrgkjbarug2"` | This is the only required variable, without you can't get the checkpoint | +| `ARCH=aarch64` | if you are using a ARM based CPU | +| `INVOKEAI_TAG=yourname/invokeai:latest` | the Container Repository / Tag which will be used | +| `INVOKEAI_CONDA_ENV_FILE=environment-linux-aarch64.yml` | since environment.yml wouldn't work with aarch | +| `INVOKEAI_GIT="-b branchname https://github.com/username/reponame"` | if you want to use your own fork | + +#### Build the Image + +I provided a build script, which is located in `docker-build/build.sh` but still +needs to be executed from the Repository root. + +```bash +docker-build/build.sh ``` -Create a Docker volume for the downloaded model files. +The build Script not only builds the container, but also creates the docker +volume if not existing yet, or if empty it will just download the models. When +it is done you can run the container via the run script -```Shell -docker volume create my-vol +```bash +docker-build/run.sh ``` -Copy the data files to the Docker volume using a lightweight Linux container. -We'll need the models at run time. You just need to create the container with -the mountpoint; no need to run this dummy container. +When used without arguments, the container will start the website and provide +you the link to open it. But if you want to use some other parameters you can +also do so. -```Shell -cd ~/Downloads # or wherever you saved the files +!!! warning "Deprecated" -docker create --platform $PLATFORM --name dummy --mount source=my-vol,target=/data alpine - -docker cp sd-v1-4.ckpt dummy:/data -docker cp GFPGANv1.4.pth dummy:/data -``` - -Get the repo and download the Miniconda installer (we'll need it at build time). -Replace the URL with the version matching your container OS and the architecture -it will run on. - -```Shell -cd ~ -git clone $GITHUB_STABLE_DIFFUSION - -cd stable-diffusion/docker-build -chmod +x entrypoint.sh -wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh -O anaconda.sh && chmod +x anaconda.sh -``` - -Build the Docker image. Give it any tag `-t` that you want. -Choose the Linux container's host platform: x86-64/Intel is `amd64`. Apple -silicon is `arm64`. If deploying the container to the cloud to leverage powerful -GPU instances you'll be on amd64 hardware but if you're just trying this out -locally on Apple silicon choose arm64. -The application uses libraries that need to match the host environment so use -the appropriate requirements file. -Tip: Check that your shell session has the env variables set above. - -```Shell -docker build -t $TAG_STABLE_DIFFUSION \ ---platform $PLATFORM \ ---build-arg gsd=$GITHUB_STABLE_DIFFUSION \ ---build-arg rsd=$REQS_STABLE_DIFFUSION \ ---build-arg cs=$CONDA_SUBDIR \ -. -``` - -Run a container using your built image. -Tip: Make sure you've created and populated the Docker volume (above). - -```Shell -docker run -it \ ---rm \ ---platform $PLATFORM \ ---name stable-diffusion \ ---hostname stable-diffusion \ ---mount source=my-vol,target=/data \ -$TAG_STABLE_DIFFUSION -``` + From here on it is the rest of the previous Docker-Docs, which will still + provide usefull informations for one or the other. ## Usage (time to have fun) @@ -240,7 +201,8 @@ server with: python3 scripts/invoke.py --full_precision --web ``` -If it's running on your Mac point your Mac web browser to http://127.0.0.1:9090 +If it's running on your Mac point your Mac web browser to + Press Control-C at the command line to stop the web server. From aa785c3ef1853743358b8a087ca4926e73ff5de3 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Thu, 27 Oct 2022 11:55:00 -0400 Subject: [PATCH 097/124] ready for merge after documentation added --- ldm/generate.py | 11 ++-- ldm/invoke/args.py | 105 ++++++++++++++++++++++---------- ldm/invoke/generator/omnibus.py | 2 + scripts/invoke.py | 5 +- 4 files changed, 84 insertions(+), 39 deletions(-) diff --git a/ldm/generate.py b/ldm/generate.py index 76d4068cf8..b075b72b6e 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -428,10 +428,11 @@ class Generate: fit=fit, text_mask=text_mask, invert_mask=invert_mask, + force_outpaint=force_outpaint, ) # TODO: Hacky selection of operation to perform. Needs to be refactored. - generator = self.select_generator(init_image, mask_image, embiggen, hires_fix) + generator = self.select_generator(init_image, mask_image, embiggen, hires_fix, force_outpaint) generator.set_variation( self.seed, variation_amount, with_variations @@ -649,6 +650,7 @@ class Generate: mask_image:Image.Image=None, embiggen:bool=False, hires_fix:bool=False, + force_outpaint:bool=False, ): inpainting_model_in_use = self.sampler.uses_inpainting_model() @@ -678,6 +680,7 @@ class Generate: fit=False, text_mask=None, invert_mask=False, + force_outpaint=False, ): init_image = None init_mask = None @@ -691,7 +694,7 @@ class Generate: # if image has a transparent area and no mask was provided, then try to generate mask if self._has_transparency(image): - self._transparency_check_and_warning(image, mask) + self._transparency_check_and_warning(image, mask, force_outpaint) init_mask = self._create_init_mask(image, width, height, fit=fit) if (image.width * image.height) > (self.width * self.height) and self.size_matters: @@ -1005,11 +1008,11 @@ class Generate: colored += 1 return colored == 0 - def _transparency_check_and_warning(self,image, mask): + def _transparency_check_and_warning(self,image, mask, force_outpaint=False): if not mask: print( '>> Initial image has transparent areas. Will inpaint in these regions.') - if self._check_for_erasure(image): + if (not force_outpaint) and self._check_for_erasure(image): print( '>> WARNING: Colors underneath the transparent region seem to have been erased.\n', '>> Inpainting will be suboptimal. Please preserve the colors when making\n', diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index 3c1bf2eae4..deb4196644 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -177,13 +177,16 @@ class Args(object): else: # no initial quote, so get everything up to the first thing # that looks like a switch - match = re.match('^(.+?)\s(--?[a-zA-Z].+)',cmd_string) - if match: - prompt,switches = match.groups() + if cmd_string.startswith('-'): + prompt = '' + switches = cmd_string else: - prompt = cmd_string - switches = '' - + match = re.match('^(.+?)\s(--?[a-zA-Z].+)',cmd_string) + if match: + prompt,switches = match.groups() + else: + prompt = cmd_string + switches = '' try: self._cmd_switches = self._cmd_parser.parse_args(shlex.split(switches)) setattr(self._cmd_switches,'prompt',prompt) @@ -566,9 +569,12 @@ class Args(object): ) render_group = parser.add_argument_group('General rendering') img2img_group = parser.add_argument_group('Image-to-image and inpainting') + inpainting_group = parser.add_argument_group('Inpainting') + outpainting_group = parser.add_argument_group('Outpainting and outcropping') variation_group = parser.add_argument_group('Creating and combining variations') postprocessing_group = parser.add_argument_group('Post-processing') special_effects_group = parser.add_argument_group('Special effects') + deprecated_group = parser.add_argument_group('Deprecated options') render_group.add_argument( '--prompt', default='', @@ -699,17 +705,6 @@ class Args(object): type=str, help='Path to input image for img2img mode (supersedes width and height)', ) - img2img_group.add_argument( - '-M', - '--init_mask', - type=str, - help='Path to input mask for inpainting mode (supersedes width and height)', - ) - img2img_group.add_argument( - '--invert_mask', - action='store_true', - help='Invert the mask', - ) img2img_group.add_argument( '-tm', '--text_mask', @@ -737,29 +732,68 @@ class Args(object): help='Strength for noising/unnoising. 0.0 preserves image exactly, 1.0 replaces it completely', default=0.75, ) - img2img_group.add_argument( - '-D', - '--out_direction', - nargs='+', + inpainting_group.add_argument( + '-M', + '--init_mask', type=str, - metavar=('direction', 'pixels'), - help='Direction to extend the given image (left|right|top|bottom). If a distance pixel value is not specified it defaults to half the image size' + help='Path to input mask for inpainting mode (supersedes width and height)', ) - img2img_group.add_argument( - '-c', - '--outcrop', - nargs='+', - type=str, - metavar=('direction','pixels'), - help='Outcrop the image with one or more direction/pixel pairs: -c top 64 bottom 128 left 64 right 64', + inpainting_group.add_argument( + '--invert_mask', + action='store_true', + help='Invert the mask', ) - img2img_group.add_argument( + inpainting_group.add_argument( '-r', '--inpaint_replace', type=float, default=0.0, help='when inpainting, adjust how aggressively to replace the part of the picture under the mask, from 0.0 (a gentle merge) to 1.0 (replace entirely)', ) + outpainting_group.add_argument( + '-c', + '--outcrop', + nargs='+', + type=str, + metavar=('direction','pixels'), + help='Outcrop the image with one or more direction/pixel pairs: e.g. -c top 64 bottom 128 left 64 right 64', + ) + outpainting_group.add_argument( + '--force_outpaint', + action='store_true', + default=False, + help='Force outpainting if you have no inpainting mask to pass', + ) + outpainting_group.add_argument( + '--seam_size', + type=int, + default=0, + help='When outpainting, size of the mask around the seam between original and outpainted image', + ) + outpainting_group.add_argument( + '--seam_blur', + type=int, + default=0, + help='When outpainting, the amount to blur the seam inwards', + ) + outpainting_group.add_argument( + '--seam_strength', + type=float, + default=0.7, + help='When outpainting, the img2img strength to use when filling the seam. Values around 0.7 work well', + ) + outpainting_group.add_argument( + '--seam_steps', + type=int, + default=10, + help='When outpainting, the number of steps to use to fill the seam. Low values (~10) work well', + ) + outpainting_group.add_argument( + '--tile_size', + type=int, + default=32, + help='When outpainting, the tile size to use for filling outpaint areas', + ) postprocessing_group.add_argument( '-ft', '--facetool', @@ -843,7 +877,14 @@ class Args(object): dest='use_mps_noise', help='Simulate noise on M1 systems to get the same results' ) - + deprecated_group.add_argument( + '-D', + '--out_direction', + nargs='+', + type=str, + metavar=('direction', 'pixels'), + help='Older outcropping system. Direction to extend the given image (left|right|top|bottom). If a distance pixel value is not specified it defaults to half the image size' + ) return parser def format_metadata(**kwargs): diff --git a/ldm/invoke/generator/omnibus.py b/ldm/invoke/generator/omnibus.py index e0705ec397..e8426a9205 100644 --- a/ldm/invoke/generator/omnibus.py +++ b/ldm/invoke/generator/omnibus.py @@ -42,6 +42,8 @@ class Omnibus(Img2Img,Txt2Img): ) if isinstance(init_image, Image.Image): + if init_image.mode != 'RGB': + init_image = init_image.convert('RGB') init_image = self._image_to_tensor(init_image) if isinstance(mask_image, Image.Image): diff --git a/scripts/invoke.py b/scripts/invoke.py index 1937d47ab5..671a8ad227 100644 --- a/scripts/invoke.py +++ b/scripts/invoke.py @@ -172,9 +172,8 @@ def main_loop(gen, opt): except (OSError, AttributeError, KeyError): pass -# if len(opt.prompt) == 0: -# print('\nTry again with a prompt!') -# continue + if len(opt.prompt) == 0: + opt.prompt = '' # width and height are set by model if not specified if not opt.width: From dc86fc92ce99af7c0f850a14bc4de845dd917c05 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 27 Oct 2022 19:01:54 +0200 Subject: [PATCH 098/124] fix crash parsing empty prompt "" --- ldm/invoke/prompt_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 7613c9d93e..8807c7986b 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -250,7 +250,7 @@ class PromptParser(): def parse_legacy_blend(self, text: str) -> Optional[Blend]: weighted_subprompts = split_weighted_subprompts(text, skip_normalize=False) - if len(weighted_subprompts) == 1: + if len(weighted_subprompts) <= 1: return None strings = [x[0] for x in weighted_subprompts] weights = [x[1] for x in weighted_subprompts] From f73d349dfe0b6ea47bc17c9f63692661344f1fc2 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 27 Oct 2022 19:40:37 +0200 Subject: [PATCH 099/124] refactor hybrid and cross attention control codepaths for readability --- ldm/invoke/conditioning.py | 36 ++-- .../diffusion/shared_invokeai_diffusion.py | 156 +++++++++++------- 2 files changed, 112 insertions(+), 80 deletions(-) diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 33be8c342e..9b775823aa 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -114,7 +114,7 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n conditioning = original_embeddings edited_conditioning = edited_embeddings - print('>> got edit_opcodes', edit_opcodes, 'options', edit_options) + #print('>> got edit_opcodes', edit_opcodes, 'options', edit_options) cac_args = CrossAttentionControl.Arguments( edited_conditioning = edited_conditioning, edit_opcodes = edit_opcodes, @@ -124,7 +124,13 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n conditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, flattened_prompt, log_tokens=log_tokens) unconditioning, _ = build_embeddings_and_tokens_for_flattened_prompt(model, parsed_negative_prompt, log_tokens=log_tokens) - conditioning = flatten_hybrid_conditioning(unconditioning, conditioning) + if isinstance(conditioning, dict): + # hybrid conditioning is in play + unconditioning, conditioning = flatten_hybrid_conditioning(unconditioning, conditioning) + if cac_args is not None: + print(">> Hybrid conditioning cannot currently be combined with cross attention control. Cross attention control will be ignored.") + cac_args = None + return ( unconditioning, conditioning, InvokeAIDiffuserComponent.ExtraConditioningInfo( cross_attention_control_args=cac_args @@ -172,19 +178,17 @@ def flatten_hybrid_conditioning(uncond, cond): that is a tensor (used by cross attention) vs one that has additional dimensions as well, as used by 'hybrid' ''' - if isinstance(cond, dict): - assert isinstance(uncond, dict) - cond_in = dict() - for k in cond: - if isinstance(cond[k], list): - cond_in[k] = [ - torch.cat([uncond[k][i], cond[k][i]]) - for i in range(len(cond[k])) - ] - else: - cond_in[k] = torch.cat([uncond[k], cond[k]]) - return cond_in - else: - return cond + assert isinstance(uncond, dict) + assert isinstance(cond, dict) + cond_flattened = dict() + for k in cond: + if isinstance(cond[k], list): + cond_flattened[k] = [ + torch.cat([uncond[k][i], cond[k][i]]) + for i in range(len(cond[k])) + ] + else: + cond_flattened[k] = torch.cat([uncond[k], cond[k]]) + return uncond, cond_flattened diff --git a/ldm/models/diffusion/shared_invokeai_diffusion.py b/ldm/models/diffusion/shared_invokeai_diffusion.py index 14f08578c3..90c8ebb981 100644 --- a/ldm/models/diffusion/shared_invokeai_diffusion.py +++ b/ldm/models/diffusion/shared_invokeai_diffusion.py @@ -12,7 +12,8 @@ class InvokeAIDiffuserComponent: all InvokeAI diffusion procedures. At the moment it includes the following features: - * Cross Attention Control ("prompt2prompt") + * Cross attention control ("prompt2prompt") + * Hybrid conditioning (used for inpainting) ''' @@ -47,88 +48,44 @@ class InvokeAIDiffuserComponent: #todo: refactor edited_conditioning, edit_opcodes, edit_options into a struct #todo: apply edit_options using step_count - def remove_cross_attention_control(self): self.conditioning = None self.cross_attention_control_context = None CrossAttentionControl.remove_cross_attention_control(self.model) + def do_diffusion_step(self, x: torch.Tensor, sigma: torch.Tensor, - unconditioning: Union[torch.Tensor,dict], conditioning: Union[torch.Tensor,dict], - unconditional_guidance_scale: float, - step_index: int=None + unconditioning: Union[torch.Tensor,dict], + conditioning: Union[torch.Tensor,dict], + unconditional_guidance_scale: float, + step_index: Optional[int]=None ): """ - :param x: Current latents + :param x: current latents :param sigma: aka t, passed to the internal model to control how much denoising will occur - :param unconditioning: [B x 77 x 768] embeddings for unconditioned output - :param conditioning: [B x 77 x 768] embeddings for conditioned output + :param unconditioning: embeddings for unconditioned output. for hybrid conditioning this is a dict of tensors [B x 77 x 768], otherwise a single tensor [B x 77 x 768] + :param conditioning: embeddings for conditioned output. for hybrid conditioning this is a dict of tensors [B x 77 x 768], otherwise a single tensor [B x 77 x 768] :param unconditional_guidance_scale: aka CFG scale, controls how much effect the conditioning tensor has - :param step_index: Counts upwards from 0 to (step_count-1) (as passed to setup_cross_attention_control, if using). May be called multiple times for a single step, therefore do not assume that its value will monotically increase. + :param step_index: counts upwards from 0 to (step_count-1) (as passed to setup_cross_attention_control, if using). May be called multiple times for a single step, therefore do not assume that its value will monotically increase. If None, will be estimated by comparing sigma against self.model.sigmas . :return: the new latents after applying the model to x using unscaled unconditioning and CFG-scaled conditioning. """ CrossAttentionControl.clear_requests(self.model) - cross_attention_control_types_to_do = [] + cross_attention_control_types_to_do = [] if self.cross_attention_control_context is not None: - if step_index is not None: - # percent_through will never reach 1.0 (but this is intended) - percent_through = float(step_index) / float(self.cross_attention_control_context.step_count) - else: - # find the current sigma in the sigma sequence - # todo: this doesn't work with k_dpm_2 because the sigma used jumps around in the sequence - sigma_index = torch.nonzero(self.model.sigmas <= sigma)[-1] - # flip because sigmas[0] is for the fully denoised image - # percent_through must be <1 - percent_through = 1.0 - float(sigma_index.item() + 1) / float(self.model.sigmas.shape[0]) - #print('estimated percent_through', percent_through, 'from sigma', sigma.item()) + percent_through = self.estimate_percent_through(step_index, sigma) cross_attention_control_types_to_do = CrossAttentionControl.get_active_cross_attention_control_types_for_step(self.cross_attention_control_context, percent_through) - if len(cross_attention_control_types_to_do)==0: - #print('not doing cross attention control') - # faster batched path - x_twice = torch.cat([x]*2) - sigma_twice = torch.cat([sigma]*2) - if isinstance(conditioning, dict): - assert isinstance(unconditioning, dict) - both_conditionings = dict() - for k in conditioning: - if isinstance(conditioning[k], list): - both_conditionings[k] = [ - torch.cat([unconditioning[k][i], conditioning[k][i]]) - for i in range(len(conditioning[k])) - ] - else: - both_conditionings[k] = torch.cat([unconditioning[k], conditioning[k]]) - else: - both_conditionings = torch.cat([unconditioning, conditioning]) - unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) + wants_cross_attention_control = (len(cross_attention_control_types_to_do) > 0) + wants_hybrid_conditioning = isinstance(conditioning, dict) + + if wants_hybrid_conditioning: + unconditioned_next_x, conditioned_next_x = self.apply_hybrid_conditioning(x, sigma, unconditioning, conditioning) + elif wants_cross_attention_control: + unconditioned_next_x, conditioned_next_x = self.apply_cross_attention_controlled_conditioning(x, sigma, unconditioning, conditioning, cross_attention_control_types_to_do) else: - #print('pct', percent_through, ': doing cross attention control on', cross_attention_control_types_to_do) - # slower non-batched path (20% slower on mac MPS) - # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of - # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. - # This messes app their application later, due to mismatched shape of dim 0 (seems to be 16 for batched vs. 8) - # (For the batched invocation the `wrangler` function gets attention tensor with shape[0]=16, - # representing batched uncond + cond, but then when it comes to applying the saved attention, the - # wrangler gets an attention tensor which only has shape[0]=8, representing just self.edited_conditionings.) - # todo: give CrossAttentionControl's `wrangler` function more info so it can work with a batched call as well. - unconditioned_next_x = self.model_forward_callback(x, sigma, unconditioning) - - # process x using the original prompt, saving the attention maps - for type in cross_attention_control_types_to_do: - CrossAttentionControl.request_save_attention_maps(self.model, type) - _ = self.model_forward_callback(x, sigma, conditioning) - CrossAttentionControl.clear_requests(self.model) - - # process x again, using the saved attention maps to control where self.edited_conditioning will be applied - for type in cross_attention_control_types_to_do: - CrossAttentionControl.request_apply_saved_attention_maps(self.model, type) - edited_conditioning = self.conditioning.cross_attention_control_args.edited_conditioning - conditioned_next_x = self.model_forward_callback(x, sigma, edited_conditioning) - CrossAttentionControl.clear_requests(self.model) - + unconditioned_next_x, conditioned_next_x = self.apply_standard_conditioning(x, sigma, unconditioning, conditioning) # to scale how much effect conditioning has, calculate the changes it does and then scale that scaled_delta = (conditioned_next_x - unconditioned_next_x) * unconditional_guidance_scale @@ -136,6 +93,77 @@ class InvokeAIDiffuserComponent: return combined_next_x + + # methods below are called from do_diffusion_step and should be considered private to this class. + + def apply_standard_conditioning(self, x, sigma, unconditioning, conditioning): + # fast batched path + x_twice = torch.cat([x] * 2) + sigma_twice = torch.cat([sigma] * 2) + both_conditionings = torch.cat([unconditioning, conditioning]) + unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, + both_conditionings).chunk(2) + return unconditioned_next_x, conditioned_next_x + + + def apply_hybrid_conditioning(self, x, sigma, unconditioning, conditioning): + assert isinstance(conditioning, dict) + assert isinstance(unconditioning, dict) + x_twice = torch.cat([x] * 2) + sigma_twice = torch.cat([sigma] * 2) + both_conditionings = dict() + for k in conditioning: + if isinstance(conditioning[k], list): + both_conditionings[k] = [ + torch.cat([unconditioning[k][i], conditioning[k][i]]) + for i in range(len(conditioning[k])) + ] + else: + both_conditionings[k] = torch.cat([unconditioning[k], conditioning[k]]) + unconditioned_next_x, conditioned_next_x = self.model_forward_callback(x_twice, sigma_twice, both_conditionings).chunk(2) + return unconditioned_next_x, conditioned_next_x + + + def apply_cross_attention_controlled_conditioning(self, x, sigma, unconditioning, conditioning, cross_attention_control_types_to_do): + # print('pct', percent_through, ': doing cross attention control on', cross_attention_control_types_to_do) + # slower non-batched path (20% slower on mac MPS) + # We are only interested in using attention maps for conditioned_next_x, but batching them with generation of + # unconditioned_next_x causes attention maps to *also* be saved for the unconditioned_next_x. + # This messes app their application later, due to mismatched shape of dim 0 (seems to be 16 for batched vs. 8) + # (For the batched invocation the `wrangler` function gets attention tensor with shape[0]=16, + # representing batched uncond + cond, but then when it comes to applying the saved attention, the + # wrangler gets an attention tensor which only has shape[0]=8, representing just self.edited_conditionings.) + # todo: give CrossAttentionControl's `wrangler` function more info so it can work with a batched call as well. + unconditioned_next_x = self.model_forward_callback(x, sigma, unconditioning) + + # process x using the original prompt, saving the attention maps + for type in cross_attention_control_types_to_do: + CrossAttentionControl.request_save_attention_maps(self.model, type) + _ = self.model_forward_callback(x, sigma, conditioning) + CrossAttentionControl.clear_requests(self.model) + + # process x again, using the saved attention maps to control where self.edited_conditioning will be applied + for type in cross_attention_control_types_to_do: + CrossAttentionControl.request_apply_saved_attention_maps(self.model, type) + edited_conditioning = self.conditioning.cross_attention_control_args.edited_conditioning + conditioned_next_x = self.model_forward_callback(x, sigma, edited_conditioning) + + CrossAttentionControl.clear_requests(self.model) + + return unconditioned_next_x, conditioned_next_x + + def estimate_percent_through(self, step_index, sigma): + if step_index is not None and self.cross_attention_control_context is not None: + # percent_through will never reach 1.0 (but this is intended) + return float(step_index) / float(self.cross_attention_control_context.step_count) + # find the best possible index of the current sigma in the sigma sequence + sigma_index = torch.nonzero(self.model.sigmas <= sigma)[-1] + # flip because sigmas[0] is for the fully denoised image + # percent_through must be <1 + return 1.0 - float(sigma_index.item() + 1) / float(self.model.sigmas.shape[0]) + # print('estimated percent_through', percent_through, 'from sigma', sigma.item()) + + # todo: make this work @classmethod def apply_conjunction(cls, x, t, forward_func, uc, c_or_weighted_c_list, global_guidance_scale): From e20108878caf51f97b151e45cf127212487fb56a Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 27 Oct 2022 21:17:23 +0200 Subject: [PATCH 100/124] fix attention weight inside .swap() --- ldm/invoke/prompt_parser.py | 13 +++++++------ tests/test_prompt_parser.py | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 8807c7986b..4a6d470140 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -129,7 +129,7 @@ class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): default_options = { 's_start': 0.0, - 's_end': 0.206, # ~= shape_freedom=0.5 + 's_end': 0.2062994740159002, # ~= shape_freedom=0.5 't_start': 0.0, 't_end': 1.0 } @@ -145,7 +145,7 @@ class CrossAttentionControlSubstitute(CrossAttentionControlledFragment): # so for shape_freedom = 0.5 we probably want s_end to be 0.2 # -> cube root and subtract from 1.0 merged_options['s_end'] = 1.0 - shape_freedom ** (1. / 3.) - print('converted shape_freedom argument to', merged_options) + #print('converted shape_freedom argument to', merged_options) merged_options.update(options) self.options = merged_options @@ -514,10 +514,11 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) # cross attention control debug_cross_attention_control = False - original_fragment = pp.Or([empty_string.set_debug(debug_cross_attention_control), + original_fragment = pp.MatchFirst([ quoted_fragment.set_debug(debug_cross_attention_control), parenthesized_fragment.set_debug(debug_cross_attention_control), - pp.Word(pp.printables, exclude_chars=string.whitespace + '.').set_parse_action(make_text_fragment) + pp.FollowedBy(".swap") + pp.Word(pp.printables, exclude_chars=string.whitespace + '.').set_parse_action(make_text_fragment) + pp.FollowedBy(".swap"), + empty_string.set_debug(debug_cross_attention_control), ]) # support keyword=number arguments cross_attention_option_keyword = pp.Or([pp.Keyword("s_start"), pp.Keyword("s_end"), pp.Keyword("t_start"), pp.Keyword("t_end"), pp.Keyword("shape_freedom")]) @@ -525,8 +526,8 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) edited_fragment = pp.MatchFirst([ (lparen + rparen).set_parse_action(lambda x: Fragment('')), lparen + - (quoted_fragment | - pp.Group(pp.ZeroOrMore(pp.Word(pp.printables, exclude_chars=string.whitespace + ',').set_parse_action(make_text_fragment))) + (quoted_fragment | attention | + pp.Group(pp.ZeroOrMore(build_escaped_word_parser_charbychar(',)').set_parse_action(make_text_fragment))) ) + pp.Dict(pp.ZeroOrMore(comma + cross_attention_option)) + rparen, diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 4fd7616ade..f2ac1b9999 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -250,6 +250,33 @@ class PromptParserTestCase(unittest.TestCase): Fragment(',', 1), Fragment('fire', 2.0)])]) self.assertEqual(flames_to_trees_fire, parse_prompt('"(fire (flames)0.5)0.5".swap("(trees)0.7 houses"), (fire)2.0')) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat',1)], [Fragment('dog',1)]), + Fragment('eating a', 1), + CrossAttentionControlSubstitute([Fragment('hotdog',1)], [Fragment('hotdog', pow(1.1,4))]) + ])]), + parse_prompt("a cat.swap(dog) eating a hotdog.swap(hotdog++++, shape_freedom=0.5)")) + + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat',1)], [Fragment('dog',1)]), + Fragment('eating a', 1), + CrossAttentionControlSubstitute([Fragment('hotdog',1)], [Fragment('hotdog', pow(1.1,4))]) + ])]), + parse_prompt("a cat.swap(dog) eating a hotdog.swap(\"hotdog++++\", shape_freedom=0.5)")) + + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat',1)], [Fragment('dog',1)]), + Fragment('eating a', 1), + CrossAttentionControlSubstitute([Fragment('hotdog',1)], [Fragment('h(o)tdog', pow(1.1,4))]) + ])]), + parse_prompt("a cat.swap(dog) eating a hotdog.swap(h\(o\)tdog++++, shape_freedom=0.5)")) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat',1)], [Fragment('dog',1)]), + Fragment('eating a', 1), + CrossAttentionControlSubstitute([Fragment('hotdog',1)], [Fragment('h(o)tdog', pow(1.1,4))]) + ])]), + parse_prompt("a cat.swap(dog) eating a hotdog.swap(\"h\(o\)tdog++++\", shape_freedom=0.5)")) + def test_cross_attention_control_options(self): self.assertEqual(Conjunction([ FlattenedPrompt([Fragment('a', 1), From 30745f163d1722c48f00c0db71837c1cbd6817cb Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 27 Oct 2022 21:17:54 +0200 Subject: [PATCH 101/124] add one more test case --- tests/test_prompt_parser.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index f2ac1b9999..839093289a 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -277,6 +277,13 @@ class PromptParserTestCase(unittest.TestCase): ])]), parse_prompt("a cat.swap(dog) eating a hotdog.swap(\"h\(o\)tdog++++\", shape_freedom=0.5)")) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a', 1), + CrossAttentionControlSubstitute([Fragment('cat',1)], [Fragment('dog',1)]), + Fragment('eating a', 1), + CrossAttentionControlSubstitute([Fragment('hotdog',1)], [Fragment('h(o)tdog', pow(0.9,1))]) + ])]), + parse_prompt("a cat.swap(dog) eating a hotdog.swap(h\(o\)tdog-, shape_freedom=0.5)")) + def test_cross_attention_control_options(self): self.assertEqual(Conjunction([ FlattenedPrompt([Fragment('a', 1), From 943808b925824d537264c2a51c3c2c908a9472e6 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Thu, 27 Oct 2022 15:50:32 -0400 Subject: [PATCH 102/124] add threshold for switchover from Karras to LDM noise schedule --- docs/features/CLI.md | 1 + ldm/generate.py | 27 ++++++++++++++++----------- ldm/invoke/args.py | 10 +++++++++- ldm/models/diffusion/ksampler.py | 11 +++++++---- ldm/models/diffusion/sampler.py | 14 +++++++++++++- 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/docs/features/CLI.md b/docs/features/CLI.md index 85524f6fa9..281f837578 100644 --- a/docs/features/CLI.md +++ b/docs/features/CLI.md @@ -153,6 +153,7 @@ Here are the invoke> command that apply to txt2img: | --cfg_scale | -C | 7.5 | How hard to try to match the prompt to the generated image; any number greater than 1.0 works, but the useful range is roughly 5.0 to 20.0 | | --seed | -S | None | Set the random seed for the next series of images. This can be used to recreate an image generated previously.| | --sampler | -A| k_lms | Sampler to use. Use -h to get list of available samplers. | +| --karras_max | | 29 | When using k_* samplers, set the maximum number of steps before shifting from using the Karras noise schedule (good for low step counts) to the LatentDiffusion noise schedule (good for high step counts) This value is sticky. [29] | | --hires_fix | | | Larger images often have duplication artefacts. This option suppresses duplicates by generating the image at low res, and then using img2img to increase the resolution | | --png_compression <0-9> | -z<0-9> | 6 | Select level of compression for output files, from 0 (no compression) to 9 (max compression) | | --grid | -g | False | Turn on grid mode to return a single image combining all the images generated by this prompt | diff --git a/ldm/generate.py b/ldm/generate.py index 135ec9ca54..18d62ca24a 100644 --- a/ldm/generate.py +++ b/ldm/generate.py @@ -176,6 +176,7 @@ class Generate: self.free_gpu_mem = free_gpu_mem self.size_matters = True # used to warn once about large image sizes and VRAM self.txt2mask = None + self.karras_max = None # Note that in previous versions, there was an option to pass the # device to Generate(). However the device was then ignored, so @@ -253,6 +254,7 @@ class Generate: variation_amount = 0.0, threshold = 0.0, perlin = 0.0, + karras_max = None, # these are specific to img2img and inpaint init_img = None, init_mask = None, @@ -331,7 +333,8 @@ class Generate: strength = strength or self.strength self.seed = seed self.log_tokenization = log_tokenization - self.step_callback = step_callback + self.step_callback = step_callback + self.karras_max = karras_max with_variations = [] if with_variations is None else with_variations # will instantiate the model or return it from cache @@ -376,6 +379,11 @@ class Generate: self.sampler_name = sampler_name self._set_sampler() + # bit of a hack to change the cached sampler's karras threshold to + # whatever the user asked for + if karras_max is not None and isinstance(self.sampler,KSampler): + self.sampler.adjust_settings(karras_max=karras_max) + tic = time.time() if self._has_cuda(): torch.cuda.reset_peak_memory_stats() @@ -815,26 +823,23 @@ class Generate: def _set_sampler(self): msg = f'>> Setting Sampler to {self.sampler_name}' + karras_max = self.karras_max # set in generate() call if self.sampler_name == 'plms': self.sampler = PLMSSampler(self.model, device=self.device) elif self.sampler_name == 'ddim': self.sampler = DDIMSampler(self.model, device=self.device) elif self.sampler_name == 'k_dpm_2_a': - self.sampler = KSampler( - self.model, 'dpm_2_ancestral', device=self.device - ) + self.sampler = KSampler(self.model, 'dpm_2_ancestral', device=self.device, karras_max=karras_max) elif self.sampler_name == 'k_dpm_2': - self.sampler = KSampler(self.model, 'dpm_2', device=self.device) + self.sampler = KSampler(self.model, 'dpm_2', device=self.device, karras_max=karras_max) elif self.sampler_name == 'k_euler_a': - self.sampler = KSampler( - self.model, 'euler_ancestral', device=self.device - ) + self.sampler = KSampler(self.model, 'euler_ancestral', device=self.device, karras_max=karras_max) elif self.sampler_name == 'k_euler': - self.sampler = KSampler(self.model, 'euler', device=self.device) + self.sampler = KSampler(self.model, 'euler', device=self.device, karras_max=karras_max) elif self.sampler_name == 'k_heun': - self.sampler = KSampler(self.model, 'heun', device=self.device) + self.sampler = KSampler(self.model, 'heun', device=self.device, karras_max=karras_max) elif self.sampler_name == 'k_lms': - self.sampler = KSampler(self.model, 'lms', device=self.device) + self.sampler = KSampler(self.model, 'lms', device=self.device, karras_max=karras_max) else: msg = f'>> Unsupported Sampler: {self.sampler_name}, Defaulting to plms' self.sampler = PLMSSampler(self.model, device=self.device) diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index e2302e4452..2b00b5a9ce 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -216,6 +216,8 @@ class Args(object): switches.append(f'-W {a["width"]}') switches.append(f'-H {a["height"]}') switches.append(f'-C {a["cfg_scale"]}') + if a['karras_max'] is not None: + switches.append(f'--karras_max {a["karras_max"]}') if a['perlin'] > 0: switches.append(f'--perlin {a["perlin"]}') if a['threshold'] > 0: @@ -669,7 +671,13 @@ class Args(object): default=6, choices=range(0,10), dest='png_compression', - help='level of PNG compression, from 0 (none) to 9 (maximum). Default is 6.' + help='level of PNG compression, from 0 (none) to 9 (maximum). [6]' + ) + render_group.add_argument( + '--karras_max', + type=int, + default=None, + help="control the point at which the K* samplers will shift from using the Karras noise schedule (good for low step counts) to the LatentDiffusion noise schedule (good for high step counts). Set to 0 to use LatentDiffusion for all step values, and to a high value (e.g. 1000) to use Karras for all step values. [29]." ) img2img_group.add_argument( '-I', diff --git a/ldm/models/diffusion/ksampler.py b/ldm/models/diffusion/ksampler.py index 677e051be7..1693baade5 100644 --- a/ldm/models/diffusion/ksampler.py +++ b/ldm/models/diffusion/ksampler.py @@ -14,7 +14,7 @@ from ldm.modules.diffusionmodules.util import ( # at this threshold, the scheduler will stop using the Karras # noise schedule and start using the model's schedule -STEP_THRESHOLD = 30 +STEP_THRESHOLD = 29 def cfg_apply_threshold(result, threshold = 0.0, scale = 0.7): if threshold <= 0.0: @@ -64,6 +64,9 @@ class KSampler(Sampler): self.sigmas = None self.ds = None self.s_in = None + self.karras_max = kwargs.get('karras_max',STEP_THRESHOLD) + if self.karras_max is None: + self.karras_max = STEP_THRESHOLD def forward(self, x, sigma, uncond, cond, cond_scale): x_in = torch.cat([x] * 2) @@ -103,11 +106,11 @@ class KSampler(Sampler): device=self.device, ) - if ddim_num_steps >= STEP_THRESHOLD: - print(f'>> number of steps ({ddim_num_steps}) >= {STEP_THRESHOLD}: using model sigmas') + if ddim_num_steps >= self.karras_max: + print(f'>> Ksampler using model noise schedule (steps > {self.karras_max})') self.sigmas = self.model_sigmas else: - print(f'>> number of steps ({ddim_num_steps}) < {STEP_THRESHOLD}: using karras sigmas') + print(f'>> Ksampler using karras noise schedule (steps <= {self.karras_max})') self.sigmas = self.karras_sigmas # ALERT: We are completely overriding the sample() method in the base class, which diff --git a/ldm/models/diffusion/sampler.py b/ldm/models/diffusion/sampler.py index ff705513f8..01193ed5a5 100644 --- a/ldm/models/diffusion/sampler.py +++ b/ldm/models/diffusion/sampler.py @@ -2,8 +2,8 @@ ldm.models.diffusion.sampler Base class for ldm.models.diffusion.ddim, ldm.models.diffusion.ksampler, etc - ''' + import torch import numpy as np from tqdm import tqdm @@ -411,3 +411,15 @@ class Sampler(object): return self.model.inner_model.q_sample(x0,ts) ''' return self.model.q_sample(x0,ts) + + def adjust_settings(self,**kwargs): + ''' + This is a catch-all method for adjusting any instance variables + after the sampler is instantiated. No type-checking performed + here, so use with care! + ''' + for k in kwargs.keys(): + try: + setattr(self,k,kwargs[k]) + except AttributeError: + print(f'** Warning: attempt to set unknown attribute {k} in sampler of type {type(self)}') From 245cf606a31ded27ff4ff924b213e01b63c1aafe Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 27 Oct 2022 22:36:33 +0200 Subject: [PATCH 103/124] be more forgiving about prompts with ((words)) --- ldm/invoke/prompt_parser.py | 26 +++++++++++++++----------- tests/test_prompt_parser.py | 16 +++++++++++++--- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/ldm/invoke/prompt_parser.py b/ldm/invoke/prompt_parser.py index 4a6d470140..7e9428d820 100644 --- a/ldm/invoke/prompt_parser.py +++ b/ldm/invoke/prompt_parser.py @@ -417,7 +417,7 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) #print("parsed to", result) return result except pp.ParseException as e: - print("parse_fragment_str couldn't parse prompt string:", e) + #print("parse_fragment_str couldn't parse prompt string:", e) raise quoted_fragment << pp.QuotedString(quote_char='"', esc_char=None, esc_quote='\\"') @@ -445,14 +445,17 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) unquoted_word.set_parse_action(make_text_fragment).set_name('unquoted_word').set_debug(False) #print(unquoted_fragment.parse_string("cat.swap(dog)")) - parenthesized_fragment << pp.Or([ - (lparen + quoted_fragment.copy().set_parse_action(lambda x: parse_fragment_str(x, in_quotes=True)).set_debug(False) + rparen).set_name('-quoted_paren_internal').set_debug(False), - (lparen + rparen).set_parse_action(lambda x: make_text_fragment('')).set_name('-()').set_debug(False), - (lparen + pp.Combine(pp.OneOrMore( + parenthesized_fragment << (lparen + + pp.Or([ + (parenthesized_fragment), + (quoted_fragment.copy().set_parse_action(lambda x: parse_fragment_str(x, in_quotes=True)).set_debug(False)).set_name('-quoted_paren_internal').set_debug(False), + (pp.Combine(pp.OneOrMore( escaped_quote | escaped_lparen | escaped_rparen | escaped_backslash | pp.Word(pp.printables, exclude_chars=string.whitespace + '\\"()') | pp.Word(string.whitespace) - )).set_name('--combined').set_parse_action(lambda x: parse_fragment_str(x, in_parens=True)).set_debug(False) + rparen)]).set_name('-unquoted_paren_internal').set_debug(False) + )).set_name('--combined').set_parse_action(lambda x: parse_fragment_str(x, in_parens=True)).set_debug(False)), + pp.Empty() + ]) + rparen) parenthesized_fragment.set_name('parenthesized_fragment').set_debug(False) debug_attention = False @@ -472,11 +475,12 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) + rparen + attention_with_parens_foot) attention_with_parens.set_name('attention_with_parens').set_debug(debug_attention) - attention_without_parens_foot = pp.Or(pp.Word('+') | pp.Word('-')).set_name('attention_without_parens_foots') - attention_without_parens <<= pp.Group( - (quoted_fragment.copy().set_name('attention_quoted_fragment_without_parens').set_debug(debug_attention) + attention_without_parens_foot) | + attention_without_parens_foot = pp.NotAny(pp.White()) + pp.Or(pp.Word('+') | pp.Word('-')).set_name('attention_without_parens_foots') + attention_without_parens <<= pp.Group(pp.MatchFirst([ + quoted_fragment.copy().set_name('attention_quoted_fragment_without_parens').set_debug(debug_attention) + attention_without_parens_foot, pp.Combine(build_escaped_word_parser_charbychar('()+-')).set_name('attention_word_without_parens').set_debug(debug_attention)#.set_parse_action(lambda x: print('escapéd', x)) - + attention_without_parens_foot)#.leave_whitespace() + + attention_without_parens_foot#.leave_whitespace() + ])) attention_without_parens.set_name('attention_without_parens').set_debug(debug_attention) @@ -553,7 +557,7 @@ def build_parser_syntax(attention_plus_base: float, attention_minus_base: float) prompt = (pp.OneOrMore(pp.Or([cross_attention_substitute.set_debug(debug_root_prompt), attention.set_debug(debug_root_prompt), quoted_fragment.set_debug(debug_root_prompt), - (lparen + (pp.ZeroOrMore(unquoted_word | pp.White().suppress()).leave_whitespace()) + rparen).set_name('parenthesized-uqw').set_debug(debug_root_prompt), + parenthesized_fragment.set_debug(debug_root_prompt), unquoted_word.set_debug(debug_root_prompt), empty.set_parse_action(make_text_fragment).set_debug(debug_root_prompt)]) ) + pp.StringEnd()) \ diff --git a/tests/test_prompt_parser.py b/tests/test_prompt_parser.py index 839093289a..7a82dca2b1 100644 --- a/tests/test_prompt_parser.py +++ b/tests/test_prompt_parser.py @@ -117,6 +117,15 @@ class PromptParserTestCase(unittest.TestCase): with self.assertRaises(pyparsing.ParseException): parse_prompt('("((a badly (formed +test ").blend(1.0)') + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('hamburger bun', 1)])]), + parse_prompt("hamburger ((bun))")) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('hamburger bun', 1)])]), + parse_prompt("hamburger (bun)")) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('hamburger kaiser roll', 1)])]), + parse_prompt("hamburger (kaiser roll)")) + self.assertEqual(Conjunction([FlattenedPrompt([Fragment('hamburger kaiser roll', 1)])]), + parse_prompt("hamburger ((kaiser roll))")) + def test_blend(self): self.assertEqual(Conjunction( @@ -284,6 +293,7 @@ class PromptParserTestCase(unittest.TestCase): ])]), parse_prompt("a cat.swap(dog) eating a hotdog.swap(h\(o\)tdog-, shape_freedom=0.5)")) + def test_cross_attention_control_options(self): self.assertEqual(Conjunction([ FlattenedPrompt([Fragment('a', 1), @@ -426,9 +436,9 @@ class PromptParserTestCase(unittest.TestCase): # todo handle this #self.assertEqual(make_basic_conjunction(['a badly formed +test prompt']), # parse_prompt('a badly formed +test prompt')) - self.assertEqual(Conjunction([FlattenedPrompt([Fragment('a forest landscape', 1), - CrossAttentionControlSubstitute([Fragment('in winter',1)], [Fragment('',1)])])]), - parse_prompt('a forest landscape "in winter".swap()')) + trees_and_houses_to_flames = Conjunction([FlattenedPrompt([('fire', 1.0), \ + CrossAttentionControlSubstitute([Fragment('trees and houses', 1)], [Fragment('flames',1)])])]) + self.assertEqual(trees_and_houses_to_flames, parse_prompt('fire (trees and houses).swap("flames")')) pass From d43167ac0b490f08b5fbf7e33055960cc3ee952d Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 27 Oct 2022 22:41:06 +0200 Subject: [PATCH 104/124] improve documentation of "attention weighting" syntax --- docs/assets/prompt_syntax/apricots--1.png | 0 docs/assets/prompt_syntax/apricots--2.png | 0 docs/assets/prompt_syntax/apricots--3.png | 0 docs/assets/prompt_syntax/apricots-0.png | 0 docs/assets/prompt_syntax/apricots-1.png | 0 docs/assets/prompt_syntax/apricots-2.png | 0 docs/assets/prompt_syntax/apricots-3.png | 0 docs/assets/prompt_syntax/apricots-4.png | 0 docs/assets/prompt_syntax/apricots-5.png | 0 docs/assets/prompt_syntax/mountain-man.png | 0 docs/assets/prompt_syntax/mountain-man1.png | 0 docs/assets/prompt_syntax/mountain-man2.png | 0 docs/assets/prompt_syntax/mountain-man3.png | 0 docs/assets/prompt_syntax/mountain-man4.png | 0 docs/assets/prompt_syntax/mountain1-man.png | 0 docs/assets/prompt_syntax/mountain2-man.png | 0 docs/assets/prompt_syntax/mountain3-man.png | 0 docs/features/PROMPTS.md | 39 +++++++++++++++++++-- 18 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 docs/assets/prompt_syntax/apricots--1.png create mode 100644 docs/assets/prompt_syntax/apricots--2.png create mode 100644 docs/assets/prompt_syntax/apricots--3.png create mode 100644 docs/assets/prompt_syntax/apricots-0.png create mode 100644 docs/assets/prompt_syntax/apricots-1.png create mode 100644 docs/assets/prompt_syntax/apricots-2.png create mode 100644 docs/assets/prompt_syntax/apricots-3.png create mode 100644 docs/assets/prompt_syntax/apricots-4.png create mode 100644 docs/assets/prompt_syntax/apricots-5.png create mode 100644 docs/assets/prompt_syntax/mountain-man.png create mode 100644 docs/assets/prompt_syntax/mountain-man1.png create mode 100644 docs/assets/prompt_syntax/mountain-man2.png create mode 100644 docs/assets/prompt_syntax/mountain-man3.png create mode 100644 docs/assets/prompt_syntax/mountain-man4.png create mode 100644 docs/assets/prompt_syntax/mountain1-man.png create mode 100644 docs/assets/prompt_syntax/mountain2-man.png create mode 100644 docs/assets/prompt_syntax/mountain3-man.png diff --git a/docs/assets/prompt_syntax/apricots--1.png b/docs/assets/prompt_syntax/apricots--1.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/apricots--2.png b/docs/assets/prompt_syntax/apricots--2.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/apricots--3.png b/docs/assets/prompt_syntax/apricots--3.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/apricots-0.png b/docs/assets/prompt_syntax/apricots-0.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/apricots-1.png b/docs/assets/prompt_syntax/apricots-1.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/apricots-2.png b/docs/assets/prompt_syntax/apricots-2.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/apricots-3.png b/docs/assets/prompt_syntax/apricots-3.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/apricots-4.png b/docs/assets/prompt_syntax/apricots-4.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/apricots-5.png b/docs/assets/prompt_syntax/apricots-5.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/mountain-man.png b/docs/assets/prompt_syntax/mountain-man.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/mountain-man1.png b/docs/assets/prompt_syntax/mountain-man1.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/mountain-man2.png b/docs/assets/prompt_syntax/mountain-man2.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/mountain-man3.png b/docs/assets/prompt_syntax/mountain-man3.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/mountain-man4.png b/docs/assets/prompt_syntax/mountain-man4.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/mountain1-man.png b/docs/assets/prompt_syntax/mountain1-man.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/mountain2-man.png b/docs/assets/prompt_syntax/mountain2-man.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/assets/prompt_syntax/mountain3-man.png b/docs/assets/prompt_syntax/mountain3-man.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/features/PROMPTS.md b/docs/features/PROMPTS.md index fd8148f622..f28488a74e 100644 --- a/docs/features/PROMPTS.md +++ b/docs/features/PROMPTS.md @@ -91,7 +91,7 @@ The InvokeAI prompting language has the following features: ### Attention weighting Append a word or phrase with `-` or `+`, or a weight between `0` and `2` (`1`=default), to decrease or increase "attention" (= a mix of per-token CFG weighting multiplier and, for `-`, a weighted blend with the prompt without the term). -The following will be recognised: +The following syntax is recognised: * single words without parentheses: `a tall thin man picking apricots+` * single or multiple words with parentheses: `a tall thin man picking (apricots)+` `a tall thin man picking (apricots)-` `a tall thin man (picking apricots)+` `a tall thin man (picking apricots)-` * more effect with more symbols `a tall thin man (picking apricots)++` @@ -99,6 +99,40 @@ The following will be recognised: * all of the above with explicit numbers `a tall thin man picking (apricots)1.1` `a tall thin man (picking (apricots)1.3)1.1`. (`+` is equivalent to 1.1, `++` is pow(1.1,2), `+++` is pow(1.1,3), etc; `-` means 0.9, `--` means pow(0.9,2), etc.) * attention also applies to `[unconditioning]` so `a tall thin man picking apricots [(ladder)0.01]` will *very gently* nudge SD away from trying to draw the man on a ladder +You can use this to increase or decrease the amount of something: + +`a man picking apricots from a tree` +![an AI generated image of a man picking apricots from a tree](../assets/prompt_syntax/apricots-0.png) + +Using `-` to reduce apricot-ness: + +| `a man picking apricots- from a tree` | `a man picking apricots-- from a tree` | `a man picking apricots--- from a tree` | +| -- | -- | -- | +| ![an AI generated image of a man picking apricots from a tree, with smaller apricots](../assets/prompt_syntax/apricots--1.png) | ![an AI generated image of a man picking apricots from a tree, with even smaller and fewer apricots](../assets/prompt_syntax/apricots--2.png) | ![an AI generated image of a man picking apricots from a tree, with very few very small apricots](../assets/prompt_syntax/apricots--3.png) | + +Using `+` to increase apricot-ness: + +| `a man picking apricots+ from a tree` | `a man picking apricots++ from a tree` | `a man picking apricots+++ from a tree` | `a man picking apricots++++ from a tree` | `a man picking apricots+++++ from a tree` | +| -- | -- | -- | +| ![an AI generated image of a man picking apricots from a tree, with larger, more vibrant apricots](../assets/prompt_syntax/apricots-1.png) | ![an AI generated image of a man picking apricots from a tree with even larger, even more vibrant apricots](../assets/prompt_syntax/apricots-2.png) | ![an AI generated image of a man picking apricots from a tree, but the man has been replaced by a pile of apricots](../assets/prompt_syntax/apricots-3.png) | ![an AI generated image of a man picking apricots from a tree, but the man has been replaced by a mound of giant melting-looking apricots](../assets/prompt_syntax/apricots-4.png) | ![an AI generated image of a man picking apricots from a tree, but the man and the leaves and parts of the ground have all been replaced by giant melting-looking apricots](../assets/prompt_syntax/apricots-5.png) | + +You can also change the balance between different parts of a prompt: + +`mountain man` +![an AI generated image of a mountain man](../assets/prompt_syntax/mountain-man.png) + +More mountain: + +| `mountain+ man` | `mountain++ man` | `mountain+++ man` | +| -- | -- | -- | +| ![](../assets/prompt_syntax/mountain1-man.png) | ![](../assets/prompt_syntax/mountain2-man.png) | ![](../assets/prompt_syntax/mountain3-man.png) | + +More man: + +| `mountain man+` | `mountain man++` | `mountain man+++` | `mountain man++++` | +| -- | -- | -- | -- | +| ![](../assets/prompt_syntax/mountain-man1.png) | ![](../assets/prompt_syntax/mountain-man2.png) | ![](../assets/prompt_syntax/mountain-man3.png) | ![](../assets/prompt_syntax/mountain-man4.png) | + ### Blending between prompts * `("a tall thin man picking apricots", "a tall thin man picking pears").blend(1,1)` @@ -119,7 +153,6 @@ Generate an image with a given prompt, record the seed of the image, and then use the `prompt2prompt` syntax to substitute words in the original prompt for words in a new prompt. This works for `img2img` as well. - * `a ("fluffy cat").swap("smiling dog") eating a hotdog`. * quotes optional: `a (fluffy cat).swap(smiling dog) eating a hotdog`. * for single word substitutions parentheses are also optional: `a cat.swap(dog) eating a hotdog`. @@ -130,6 +163,8 @@ original prompt for words in a new prompt. This works for `img2img` as well. * Convenience option `shape_freedom` (0-1) to specify how much "freedom" Stable Diffusion should have to change the shape of the subject being swapped. * `a (cat).swap(dog, shape_freedom=0.5) eating a hotdog`. + + The `prompt2prompt` code is based off [bloc97's colab](https://github.com/bloc97/CrossAttentionControl). From a90ce61b1b05dd42ff88679f3ce7d6478b8c56a9 Mon Sep 17 00:00:00 2001 From: Damian at mba Date: Thu, 27 Oct 2022 22:43:21 +0200 Subject: [PATCH 105/124] fix broken images --- docs/assets/prompt_syntax/apricots--1.png | Bin 0 -> 601186 bytes docs/assets/prompt_syntax/apricots--2.png | Bin 0 -> 585742 bytes docs/assets/prompt_syntax/apricots--3.png | Bin 0 -> 570026 bytes docs/assets/prompt_syntax/apricots-0.png | Bin 0 -> 584453 bytes docs/assets/prompt_syntax/apricots-1.png | Bin 0 -> 583122 bytes docs/assets/prompt_syntax/apricots-2.png | Bin 0 -> 582169 bytes docs/assets/prompt_syntax/apricots-3.png | Bin 0 -> 539732 bytes docs/assets/prompt_syntax/apricots-4.png | Bin 0 -> 500341 bytes docs/assets/prompt_syntax/apricots-5.png | Bin 0 -> 515521 bytes docs/assets/prompt_syntax/mountain-man.png | Bin 0 -> 499704 bytes docs/assets/prompt_syntax/mountain-man1.png | Bin 0 -> 510609 bytes docs/assets/prompt_syntax/mountain-man2.png | Bin 0 -> 536025 bytes docs/assets/prompt_syntax/mountain-man3.png | Bin 0 -> 607346 bytes docs/assets/prompt_syntax/mountain-man4.png | Bin 0 -> 612848 bytes docs/assets/prompt_syntax/mountain1-man.png | Bin 0 -> 500113 bytes docs/assets/prompt_syntax/mountain2-man.png | Bin 0 -> 498395 bytes docs/assets/prompt_syntax/mountain3-man.png | Bin 0 -> 500630 bytes 17 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/assets/prompt_syntax/apricots--1.png b/docs/assets/prompt_syntax/apricots--1.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0f0c17f08b058240197de8979a31b9159912194e 100644 GIT binary patch literal 601186 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

^P=U>DEm-4(;h|baQ>8>yquRPTmxftcwD% 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%0D$K&o^c{asuE)iIo_}h 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

6bo&)Mtu(<;SzeS3S`Hd_#atO(t3 z%SwpnAsbUu(pbVj|NixCu~1E`CP`J5qux#s_+GHeYnHU=gQLB)ibYW$?%m^LZa$fE zESHx_occkWwE9Dl;c*QNTjzPk*={Z_E=5I3^GuO7Mbh?%JDFQFEKA>!9p4GYoAvj% zhOOJ0(Hr#uW(A20{O#4nEz5!Z!xPtCyng$d60y_iD=J?r(pu0M$`?5tPwwiHW-;h? z2P{XnYp1{jCs8uVF0L*+ZCkU{^LN+H?r=PrY&=I-l#~4<81cP!A4$^A(NUw_7X{JK ztg`KS+`c)Xdi72mnc*AV@9Egu6$pXX`hw z-#vWzA!2A*lf~+m7kNpLYKj>^HtS88g-IM)rp2*bo@Q~BGXxwzdT@7potG)c0gi)7 zn%E6ZgtEkQcUN!2V9T(KqM8TC_gk$d3)!k7RY7n?8AjBbBgN_qk^+$>$Q&Rf&k9iy z5QSkJ8J3h)l`NY~5fAnr5N-w!4~{g$4AW{lSe}C4$Jb?B#S-SCnO;zjZ~H&C*bkgsQG& zQPefH#yO^yEVBYHY&M(!;eYslCrSA3?O7Cssw52tgKwWdtvQ+$S)K(fPZ0!$sg+gP zX}1G+Q!g+y9Ofm{9!w?N!%VL}+MHp{u9GSYvA*Lkdv-9r>TQ-`~Y<{CE zvc$1}{O;HD?X&=qXb3C|%QEwVuqKEVWlU+S)9G~D3oaE$d29kh`5n{-&ri zUS>A#+)usba@sV-Xckw1O*=Ixu?&!2q$XJ7r1N{~Z5C+zR<-@AW0TP$49oiA?_ z*U6Ij_Uhu@i)WV?@1DJS`t`FvEd52ChE-jPq6|4+;*cUK-ByDVLK(7J%`PwBQvhb$ zm7Dk%*XOb%o2I>9E?S+2A}JK3s%9KF2(u!I(&N*I|KjJryn6i_37qGy>$0qIQIcE{ zB*=hY|LWI>tu#|#FBX9pl_jo=0yEj=+3PG1L`AkN+Yfw6Gw$7c(y~Vk&>H>yoxNiW zP^;B_{_QhBr~r||31_e0*=_so_D&R7Q!@}kq=JK;eF*qCE@e?}Xx8q|VHy<9)?e_+XU{*PBk}Ri;D07Y#RM`RyhauSd zuIGEApaG6q%+?|&$4R!FuZ|D)A;O4uoX4c#-2}*)rR|7=h&ODj73Pb{9Y-OiqNa#N znnQwY(+HD*fV$To=4C1JEX&Gvr}5yy2Q`7Np9#FYI~=Hz`0mYSJzr#X+)xK9%SJ_n zvq0b=L1Z?&dwhH%t8$vvdPlPwT~R8c%x8FRz1$pkI&mDwQRFVSS&}i3DXJP13Tn(C z!m_X^a)7BMX&B?pc3b3Gr`L|NA_$@gL_(N=FFuWss`X_`$5 zX}23MUcNj!+^GRB3MfkQa=UVtZWxE6F3Yl>=T)=Sncqz=E^i;*KWeMWC0{d;sR3XR zGBurN**L4pqD;%2m(_|^hzCKq;&}4>mDlQ;m?bRBoLyh^cZU7_9$|~)(_K?lmfJ>A zZ11kegtC*#+HAu8on2QHS9HxFL^0uH>7$Q+^z?Us?An7bo_v0|*ZKPEKeB>s>Gmfd zeYM<1&%b@jFvY9aFZTBK03xPsxPBb^NnO)_{@rimG+wR)#4s(Z#Uhx-Vd!TjC$daA z==T&wb+;?ePXrDXSymSnp*Tz8IP__eu&nJlPUJe0zym6mbH%XXeRT%_{>j64 z@6RDr4o;r%yb^|yrWotR(v-9~Dc8$&9LA<H{0!n zmwuQ;t~=uTS)2vyRkyDJLS*ayP%Zy}P`))lII= zG#qbJUL=0t#bx1#p{gifef6XFZ(hHiztt5*l9lz^P2+55ILeBoB-PQ$ktm7t`L$tL zSyG%F?&!Ms>iahUu?*x0p(V|O#CKg!5I7mZ#da%-ai`Zc6wMF4yUE0E7~OV%XJ^NA z{N=`v!l10`Myu^@H_x8G6lD1aUwySZ8e)PKRV9=ZY2LIg*Kq`e_Pf2f%&NSEEU4@4h(`ZLwcy;lv(;oSOb9#It%c|>6D}c8f_h|26(BJhpO9~i*sc!10 zr>6v0)4Q7*WU@>-mR>A3!`6YJ=)3_3$NRqL+)d`ZD7QM@RdM6hUC=z5Tua{(t%3Nsw7ArgyjRR?BNtC$O$@p3?$b zvQ`wirWs!3xBH!s9zQugIAldZGpvIL_iMnqUJ!;MWr!qjl$Lqv#eq}Tb)(ZP%4Fj% zaGexY&LFPa8QA*ZFMjrmgM0TpFVjtnp>S{iAkNdOt}w+2A;=;I5Xu0=u>>#x0m{(j zV#4uUlH`&sLmn|K?4nv-8_?K~-c+6C|!K!YEp$vClAgcW8NU&F}yIAOEL+TZC(Oy{YPgfwV44RX0tuwX<{d@Zm?TPS210l9V-|HN+IwvMfwy zw{?|mw%c!h_nWKpceJWZODWRu*|R@wgEhew3mFDrQrEI1?~Hao{Pc%|-Q%)`vSzVR zz!gCNNGxw@nkvYS=SOjvB{87|0eM~Ls;(-gk!3|%R!NrC7)q+l2~1W7+wG(b-9fjx zvp0emLrMfuMie!S2FHs!LZpK%yUOaVtmu09Siz166 zKWLaXix_tuupF<+8jD!p3wK5bS&^Tgzvo!=;pbl^QH*OUOCo}Z<4~vFo83)bJ$)`P zjDip@($R2#&}+VX|9zY-bCS+hV^vd|?G~=9&0>|L(Z$)h*=!&dwFa#R4^JLGJo)7D z$C@HHTWv#cltuOW-OFG7?zhjLKYRK5^|KeRSy|jadi43HKeUYD<0l_?2P0Lm5vLkf zcfN60o@+JQd0rNAF7b+~nv3NYaYCGys;&^gWMzpEtT8F8$n};*9G@N?S5?U}(A|2S zW~b9?-Aos~PVX=N<$o_}J%X8Ge^jD!dVB7#*EM1!RWw!g?)90*2{NtQw#E|TZ(Pdo zMVdpzC0S(}HYT(vDIlyQC?YS_1%V8M0MV!@OR}LDqv7s)u}pY2%_V#;&{_{UQUvIaH z$OWOd@itkRmUV%vy3EQn$%~?B>ZYL@aTLzyD;7}&315BkV^!7`vjqet;uzm`@-z=T zf7ELI{6{|=wJp#0AZ1&PCSqBUXJttfC2@CmWN0eRYf70gj-!ww3IU~I;{U^M{{EXk z{uhx`ZLJx)POx6?_J{3en^cACZ?iPkWU{{7$m^I!kxzowMbtMyPM2s3resgN?{b-j3;qkiK?~o!YGL(fpr3Jx!eef!U(FL z7K&~KK}cE9X!al6`=Hxs=NU=TTvp|}C=^BFISwHPaYzvPZnra^&Imx7p>ZN#5egW< zKo+u0RpT^|7xSsAs)zf#&CZ}Z*zNU4d0qKohy=!q9FFI3jd@K{M0vY)TyGtEYe|(N zKYjiF{c5}3Y*vJnHLljH+0xmBv6GhxFN&Xj^y&ZNm;ZZP@5-uP<9h9E7u&7G3xXh3 zHK}kZ$gE|mr}yq#raGHk%_g%nOOq@f-`>1@^)$&n)s&mVewqUYN|L0I0*7JhXIV|^ z-k?`kH48aK;91IzdP9nstJ|xyx92$L1j#tqA56y6tSkXwk~otUgm;st*?G6SXee}b! zuAHqK#yJ#t%m9F(D5=f%(6qaR3T9(i0lHkSSF06Z>MZnaQxpZ}^_!PBlPk=StLw|z zY|4q;kAD73PU4f$^W0^eg-IF}bqzTVa=a|-rrFi)5z99ey@gm7ld8y)An_rn39f04 zvotYG6A~mU8(zunup?{3%6pMHDx{taTt$u#XtS}ZxPQn?2g2XmL`cDFG^C8l(yBryt#P(?CJBD z-{-gtoWx!z1qA6mQ zhJX|eO~bSvPsd@DynOv~?FF)|*A-I4h9K#(po_f9iP~be;YBq|;xGx*BuI;Vx>_N~ zvK(JwbUUBcxI!$;36$Z{yLT_D#I;q!&;czpKibrkwg6e$D%GOD683?C;ofdU65RZ^>> zL;_1lh5$iKxpk)$7ox=HS=`_4in8ST4hFTY>6)a|3M0rCY5CoYS9MWYc3))e%e&?K zt9cL?Q*Vnj*qiN|Wtm3Pp3kms?ykxzVc9B;U0o4X zQ|4F{M_~{+NfK6d6-M!P!9feV=*%B4W-7W-{?{v7nAb4wMGM!S4 zbIS6XniNH|(bfdXaaK{13Jm=0^A7A~@d>w3Q9hoLV?vei(t z%%9I^N$&Mpy={>5ije2^csveH9SR60wc~G%8oqMZawuhQag5ja=7p8N|r4 zm^h)Vu&QRidv|Lgc6WbIQN(FHwN!PtyMK0bkz^5NfZZ^YJS|nIj&fbV)K(k?S0?<`CR^(>etjc^5twcfLI6+cm zK+B@4;@F=rZ%6I@dq*b#P?3jOUJ4wSrg4!*nx=YQvNIZ}s&F^EnNB9WAgP9~SPd5O z5OS*4L$li zgaAV^WC)ZMeP<-F3?Vg0lXSD)E|Etx^i_f{rcN)kRl=m1Z!tHTMoDWhaZ08r9tdRc~*(Kl4ZsH zdk^~U9>?>`l|vwQlEeuU9%U@US*i#KC-5kXV_-KdO?v#ngWLBn(kweUJ@yt$7AUUg zF&OcjU>Z8dOWW-lK@L;mxf|1JhG7~;0ihUT(ChaXi&=$h0Bg&V^E50-Ia}QhIw$>R zuc{~u(u(A9oFIla3^Uw#B+vVu{UD3qynE>fezVm}ysRuz)sh9Cy}7>i!}#Qh5xBAI zI^EFM8iUl2tBO(z+wE=?22ogvvLFcx5dh*rUPRkq!jM{o%xZqEYC@K!g3N~gHY?Ir z%VHt7S#6Re<2a$H!Faq`3eiq?#Pc#@1cvaF`4-HVonZ$taJ^YQfBrqiLS0uk-(J^M zadgx-GMWUXP}dKiJP;Im_3ov<+r?!j@*0O&hEfWc^!- zEX#ROssd{Do2n^7Aa8xQB3Kak*vOHq&&q5wo4Zjp==b+`hCz@Z2xsg0 z`MZ}7?mzhA%db>T;us=H(q_A65Xwq?F};;Uf#*e*p^7YINfZRmVe5!tXkKItCV+rE zF2clDHBb~qnw7oYFeBBAZ=Vt<+!s^#E-$V{f&c2OAC3m2zy1&ZG0$^KK?yR~-2euT?r>tnB)%^IQM-8j>>g`z+MMav)x-4r7FNmHW39|IThaV)d?}ctw zL}5tZB!Q^vc~}%xWi^#fuak#SRo9@ZHC+=WA&%mfo*(O}kEE%PY9xtN;9_3{1BAAj)SAHMs2 zQDsq-$f{!MdJ2knZ{Age+NRPQG-s>3%ZppHq1I*OtsGf0WUV{94H(QjnTd6WyG*)k`uyWPz$^~8ti0= zyC}!5vj$92W4M@45B4>V=a!p|WhxZZhA!86+-wd+S*+q*M1`5PONc^-YTqL<*YNji#b#8{gp(MHQVcuDgwHYxmJ$bTnH}SJTyl zN5}0pzZ^Rpqey~gDk^1*Ub|`NlDi3#sQBWOk2`i(l8r&XJ6&uL%O+Vioh=&;je)5x z^Ohjlw$-q0$j~VBi@Z`5sVKtV{N@}o++c4PV`jZv4R-HwkiL8U?BL#Kk|<7R3qgbg z*Uz3mMJ#&q*{6tyc~MrlZ0ODN*-PJBRg4(=ap$m4YbuH&OX=D5YYNNGpbZ$r5ZJVA zPC$!=%8EV31nzosbU0{sd#m}nCX`Zgadmxlw|Mf=k5t(fC7B_F63mNSSzL}aB4q^@$W6l!qdd(^T4Txtfis!S zbj9Kk%MhvxO3VwsyP`!EmpD%1>0%uxX<8IX{ zGPL~U%P(!qj*a9-i=!bN%i2&%88C1IPXB zXFusQtl46=oXrvT{^=k7?azPwS5KZiUO7`IfOXAOWx6-Ie|Wx;%Rz<7X z(`U2W%lGeOg=0iO5Kl0~IW{ES)|vt@7HJ9yoXpn@rh6x+-#mSW%M>yc*Ci*3?skg+ zU+1MPh>EIgwth`~ftNo0;^Q()Z*IaMjtB;tqRWB?s36Pw`T0eV2VXw<#73qe2|VIv zcXwy>owIc%&1m-rby`t|Q3U0yAOH0K^?&>S?i?Q44P&#MUtM1MN%YA_UmAu9YeWIV zGJpWgv#h`M9A{b9Iajl38r7H@l5xAfd4F~J&G%0Qh93+LIbL5bHc3(nqJl9@lFYJo zSfMb8D*_ln%yCT#NPNGQrk34OH7QCxjPo=NqbxzP!8?AQ=7y%%7;IJ!Ah;rR6mCur z_GN*6`|4Q|r~T1jXZPsI2lo+@*6zB|YUX8ecYU5`QBFu((TAh`D98ZEiGoyQ0YhjK zWWPQC-Sb!9{^Y0s;`H!7;Bb-Uwyg$1xVpLer+@rg&C~>rMF{AcVq2OjacNc&K&!f{ zi~9cl9<6f7ajvs=osFi-qod=ry!+&fuUeM<%{O0*s+?s$Ahc%qhew|b8?2w^PhULe z#}NdvB5@jeJG~!nR@ZUnCvlKuX%I(QTrvdl z0x!!#8pqeuaa&amj~=lQU7o+Wx;Pv4cWGHQO_S%j>+5m2btaQVRpnJtmRY)7dVrw- zkSN&7n&E5~`#UYmlFC9DFXv^N>zet=M?V`+-Y4N=69!d{Aw-aH5BER%)0;oVet3Lz z&k(Gfdf_JOG}}M;@|Toh?xuHV7cVKxU`QNitEo*@Q|HUM*|U>q>u;T2Yqu`wW*s}r zm2KOGp+HcjStUujX4fdRkOWha>0)tRel$cOLsU)gVk`l@k zc`+Q0qR5X!kKz)*HM_heD4YcQM5VNDfTy`C<$68_+4KWR04UYKy0Aczp8h+#xdU=T$tV0r3p zXPTi&ybNl}aa@gvB+v|21Q&4}&X%{30f1DBz%s~S89?GN?DSf%UY!#G4!Zp`FI;DR zHyJ-VK4lQOxH-E#JLfrsOB@%)@Bi@aXgEAQJze`=k)|XqJ9=YpZ+Q0n@^(CKHZ9XK z4@bL{s{zS2tL2}*{V%O{zu##ShT(axDHs=L@8c{Q4LX1+3qNi*TmQ44{^DXf`}XN8 zv)Os@;A2%|-=2*nRd4qipd{ySt|Z+NWVzjHAqLHE7qZCea--d9d7)PVRx$Ly_=}&m zHT|D|`|B#ti=u3I+I5a8p)4W~9zFc^uYU~zi!f>0O`hcef`RMq?e8y_s_Xe-<^zy* zy3Oa`y?{K^ZFSzizwTXK|Kb;a`47MPn=;LCUPpd%esR|C4haBhl1UubP^_xRhrQ09 zp5HbNo?`&OBnX4yaR0%hC)d--%csxmX18tk8|~Js-@FLZ$Z><+{XXPrR^$u8Pq?ckRF> zx}qK&?703sO;d$OyGOe$X2UrC`A>h=FdG-QZ+CWE-+c2eCCvWL@j-uARa<9wFT*6p z1olRwhN@q@y}_VXHG$MM!@#5{5rjz+e*bdO?sg5`=Gc^CKpA8m~=0($N+-xriAvbq751)MY>6c&b z@1Go>++#>~_AZ~@y)|_C^!~>Jr?3oS7(!@CAr3PyEn>oylp&70?sq$iYz9HHojWyQ zdi{}XSv)5{d-(^W)o)l`mXj4#VHoHIL6Mb;r1$y*R*>JlyBM|my>@Fcof=Ks^OL~a zI;(kaFvLabdrJ=Tu2ZH-7I?lNx|E@Z!_js#wQNJPG;gy?vTAo{&}npQN(rs@RhR3sY_}VYrsZt>$!5*-lHITa*WnNs24PtwO~X(Wwyul7_m2(_I^E%PJd-3X z@Z7jccm&J3D02Vg^kyyT^7!ATT&2aIVVfgyPHR!e`U3;wZBecuf_>W2?k_$XXonX6{#zclSobK z631brNmiqSw!fJw9NTWIdF;&A6G1W+yU$8`mdBzb5kfjvqu**ft2L#0!?rC;k$FgX z;b3@r|LC~e?4Dg-%@%WkhgX+nk(Zb6$0T%M&YWCWI%8W!T@3RkWhVnT9IT#e83ltx$; z1%g;2AbfXswO%ex?mto$6B1Syg{&fg0z+@?9NfPfzil*nPaZxpOmneW)TF+-y=DMc zRirLU79o}wk~E#nmyqW&p9F3!Htobu7R#l;iUe`G(fs_=KQolZe7a-5_$~ zBG02ZUpj8≥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 z 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%0AP$E04M~I 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¥WQ;gIJ3g5!tpQLF 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

y#tlR+xPj6jU^&|2*mC*MHlE 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 a}dc`>#h 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

o zdFz-2s;rTabJXxb>-+~d?qai}gAn3(T0J(@+P@T?U62<;L4P~RgeCIS=Q3;}Zd9t{ z>~xg0D^vNTSuE7|r;mNaoHxIvnDhN&=?x6uDjAR88R=g6B2Qm;w_lm2dld0EyEs${ zqPr+1Vf8r9rK6*DePrh)?s-7i*{-yjPuo6a=AM$H89w#!k$*2Rvf{w|nARNXTRhHt zb0sL)-^79oRba}gN2$W!5}MIA$rIt-hhr1<1VNm7v3DH_{+rBOL-W0ZO~f#&IiJw< zbXIL|dj61NZ-?9DZ{G|oaD-%!r-!Pzja)RZX)h-K2F^pfZE5d(&1eRdU4&G;fg(0d zlz#bCjW+dE2qIGi47|^%;cWdI@He0K`G-5460#W}J4tS~12n%qtDw+-B@=6?Rf*l* zpY`0t7k2b4!FIK?$(!A9OlRFw`+6xu?t}InM+G#u*njgi^*8lo;?MtmhzOe#*G^c| zbYXEe5lApO-2MwodCTU#Qze5do>>UsizmgC+G>Ydb(}c@XHNuWK{iq@eQZ(Io{xk# zbc=My`=>t13B1kWhzbv{u};&u(Q`+SlPZdeXL%r;+tB7FuB?Tch7J%j!>j%bZd-UX z_;=lPG&PzJHKgpBJbCoq#4wYWJT+B!*XxlE$Ps6NT+y_>DO)DOw0C^Py@d8>=ga9{ z%{>zSLvc%T?eCppr6D(t@jhh9hLx|quOh3fn5T1XqXo_+`2zr8V`c5BCllwCI<3Q1 zub;)xGKn-b#mTI7Sw!gq1VuDB^9D%;4*Hp~vuHCkmfcZZ$7p=7U-u`IoJUjKR%>DO zUfXwN&(v$6+&*{j+Pm@+uT~AopIEZe_4qlJyV$j~IOXn_%P`ScYYX=jk}ix(--rhd zPp|xjCr2kGaDoh~<@wg_7YM>wD#__Dbl=Ktfz~;q)aF`{Q!E5kkwVWdu-rqX4h`hs zh7amy1g3q@wj305WCrzuY5C0njN?2^!RTO>zD8mAA>>S-?{A#oMovJ%7cgULYfGWo zb)V3fu8NeFOl=SplxkN>+x!k&rbQ!{sbQ`vDiE~2u}~w(_*MXvg&jP(df&bm*ym5h z{VOHvtpZgR4Q{^wnS8EA;}fhx2LD&ZJV}~^k>y_~w;HH8kGYmg50>xiNg_tWV!Bt^ z&@5%9fUVr}>|fc;j3NG&Ss5~6z^zj629Bfb#4JTHkb6dm%^^i_6Gggdsv@}ekuvXs zQMJR}2zE*0wHW7b^V!a+ItnGMvzF@#K_6`%bwMC2iZmZD-<(k7QkpKAde8b9M{$RfeCVgk*mJer$wrSF5B;{@SFMy=STdV^+|uv{(dQ(&L^5#S*Mn<>sZAACCqr64JKL4q_uR=2;l8K-#e(G_x&jH z#fSXxKdV!rx32glnM|zW&D?)XpS}QF^?e}xW!A#jH-F}-C3d_qE z5tTvU;(IH~Kh++nSb3e?KX@kLojOhlaG{56+Osjv(>W)Cy1O$(3s`GxljF2fYtiTp zlq(vI-pKqvFmJN9euC5MH$g0!ZS`a+{NUfeKATm@j77G_(|d-v8KVD#ABNrbA$G7E zo#(~&sxSTPQYcy-QRZxCF1HGdTX(M|ih}=v2?G@SN9~+&vUEN>ed&S@PC-u%4#)r}7s2S})aUqu(

lY=iHWg^N_#QzY!sMd=hzCQScssNW*UAWyV%>u$AT5>8plI-95Om+xzG8;{R z?G~c1CtS!59O!F2nEBM+@j+8ZmoL2i8cgF(AcHRV%D8BVt!xsbE}8w|@hZV0GX+o@ zCwhjh3b)%n_*MdLDqpa&;VbhL;psWQc~g+bApg(T;Ptx(H-e_!baPKH^C3_a1`2m$8C2v)$JRl1@QgncDYz@yQvjPm}oX& z|1Nqi9Mh))lQ2zieOs`t_k?U*ei$RW3XfQkod7R zA}~ZT>juvI_QNKGHcsxHMB{L1`aJyAzHcoMY)&)keP3j+n4-XSt`62QIiVPIOB!B) zh9}fvQs416)_RK0W(Sy}J~;jkDwGD6gX@-)2pUfktHd0Tr^m-zc=dlbSWHKhs$lQ~ zD&g+r<^|E{ZpHeElRvr06V6l8>F1YxJIwIx)~keXjhv$vRWKbV2yx_e6?r(hgP#bQ zjEt8Df|py1W4}sHNRMA*W3KYH!qO3$u7qJ8MAKO0N%GMA=z$>ew7zciLhA@r7q^`| z*=`yHwFr8G<9E^TT}WLLPQjoX5Sacfth*G43F=2U!8X@bVfpG_N2le0x~+p}Qoe}O z*q_!nNoB)TZx9%#D3FlMw^^XZG(pb>+E$mR;deoLM1U<-I$Ae#Vv_o7WBq0{Zgc5X z(rX_+yx}+&ZX@(CMOLHWoR;uKvo;j=CYIJzJfAtRI=l#mG?W3=S|XzPqIg9CB?N#w2?oEysaQ0r%~D*bhT$K)ey*_5QQ3`Z_tZF(>Bz z&?dF&R`@YPT>2s!hKA;m&M6>n6S?NHTjoj?>B-GUIcRkBO6q!&Jo`w3mh^28LzmC| zOxfqHTUzRt8q2v@cy*s6BVMuiBlInxJv70N!yn(-*-RT8*qQIWc!atH=VD~K<(Vvc zx?|$-WgSJj#Mn@5)IQ-Zqx}42%9J0Q!qoKDa--{@HJP z#UEkgjanE}_-wgt*ZbI|hoK7%xebHfLI;HYxK~)H0VW%rOBbW{Y(`X6oHu@>n&!Rg zs&FUGc<9a}4{PSGA97xR^vYM1AeLh4LR(dew6tNTjP>|Ac|!rC=7Vh@s8IY%CdC%b=sKL z^~uZy+226u9@m|&H{IkCoqTo}M6~Yv{AIYiUFC3@rfAA-!a)xtGByYkVV6Se)PJvS z%C)z5baSbz-uvaV3pEu61lc*%q6k!b(yOs8g>O%XXroYj@_r;C$K{1|ZUYlQE^xE! z>xHh+Un^SCc^Yq_P%8wn@Vqw#g?1GJZrJu53d?7cW5bD;I9^`n3&Y_64oXx!zJ*43FfiicWT_K3%FPp-QSB ztzznDM2@zSO}NKe37zYNy7GR!cMyS|RwI#`ge8)d1UcfH;mMFX%)yl7<9VS>B@M7q z)}==YiFE{!W2`~WyxrswQ9!8jiZzNG&h7tzsCu1GI2J<9PIzqb#n=C>hqZt{X0AWv zUCg>u{?CQp>dt*Ca%n3ZUndWJB5ww8c^gjNpcI6xNjiM6=PcWqo1+cctD^3(MnlP1 zKagNvs`$gM$QA2@E$pwl{+LKXP0fVB{exF^VvUuJ=J$2#GArwsc&n@Z1mv@K;;&ns z>+(Pp#LcSsOthaI5bKZY)>>{0J8Hj-Qq#C+K(xK5&V4V%G-o{!n!y5*Pq^&uO1sy&gr&Vi?NnMMe z1HAC?%P*8-UyCKBn2w>c$&o`Lkkhd&UgYlXDW`6hAxSSYpJ}?0hdSL_S5W1_4fW1v zJQEq{pYL{7^ii2B@obj{m>*yatfi>1>})P=9X2jZqdT3Ij8e(SxG#j$QzFStV*-6>q0Ly&+zL4 zF2PuZ%*@Ve{l*48v2fzPdX*z;Dl89WB@#*tiI0Qxz)-n7Oj<&$Qz?%xF&{3?pdk;& zoAX`2SN$~^yc!{WGIkv^>#8ZK`K9?Tz)=Xy{m5J>_WqIO-dQ?y6wo>qr7hwNVPa-v zl)TL)WxKg0B7#+R7tlm)oGX60MdaW@TDwcHkZ^4^mZH!OZ$_<>CV1U>n=XY>w|HniU(ZZ;CFn4}Ou6a}+M1Lth&(dIk4eP9xO!k2YWsh# zKmB#O)p@e)kTaQjmpR6?TJnK4wr(}lF1ckmNI=KHBO>y3ReP5sZrpIxGurRAyFlET zFffKSL&PcvMMIeWiFaUsn?4E+wo^Vq4c6~58hFR#56TttbuQzZ4H ze5x=H%cJXLU1@p=oPx${BwG4dz;|-IUwij<=`7|qj{SvMg&zg}o=14_RXG{*V%Db{ zBrj92`AMuCwnMKzHNun81G&kCKMoGp9F7%Fshx^0FJI)#aGcGQ*D1JkeKB;=zvH12yChuN6Tsj<--^8{WAz3ANEDB;(LmLd5L z4h}B2{Zk$Ft6d3ZxnL?E(;}9ZbmI8^XAnJX#J3Ysv9wjJIN%~<(Dc_kxSAGTe5sZz zYBuh19>_`-G(}liU0eie8*oXF_pVE>aGVqPw{&cq$?*Bpd*)~%Cev2Vg7V91VWl9d z;tC{L8pM@>_r6I)9|y0gaEOXwxo#35+Nk@)N@erY+HUg*G zJ5W=@i-xE7z2xgLDg&5(|3RfEa^;k`6-x3UJo84pTeqr|^*C2_lBoD{w%C2&j{u7I zNPFtb8=r5n&$Q0&dXcWNojVkJ1U)NUdGXx>hdC6JjtvPEchb5oq{(tI8a%l9X?sPm zBWyP4IiPF`VO52y)$H0O6uqIDC7>D!6oOKcShdD?Yz?>WxzYimHIPX;D^dJ9IQ{Qp zoSql)-zeRlq@j%T&bAoZ^*lC3$@DzR36D8(SJf2QYAc>x-@$wUK|@N{6bMQa%J!op z0@k^d714(=o%riCzKDXR@YIMp>=g=&W)Dg4W8R z12M*-0rp(>v(PcbE^(TI=^7_Kj8>dkh+JC%s#4ZRZ@Y91o8^-dVv|=m^>O z63hP{lOsmA<6~mx{GG;)>q+qd4Gvq1-*cp_17ehztWSsj^P?pALN^c6V%B4-AooV! ziRC6d+gx5=@79l!VF-h|vNgAB`Vb~kQaLZ2BN7PS^%(SqYkMX)8T(wT675x53d<-d z7GN0{?y@m=Xh*ULt#QVo(a%qh6=&(sxqO*GO0)_c{{j?Y3*{_St7A0Idn z+OH2?VLqhJt<)NArgiMya?$$q`aFXWBk=rSSK74X;L<4)c{}#)EtIrYl&J=#3i4R@ zNvxx#R!RU9NJk5h0FDMQ(m`E7=L7(=p)Xh{K^i4ubpy|s@h>9M3TAad5mAHA6b=yf zq(7OOuAv~VTwcu_uB2RL+o(;4+G$OBV?XIw$X@}t@E=5$4CZ2%1{iDnGj*`=LV;@s zMJICwoTfj1rC!r5tKn}ijtqGI#DM&*y-6^HQ@{7$;udG;A>#7O3ctx60nHDyfj8LN zB5x8OQ{~ViACCVOJGulO$qd1t3@(INK3i|k%fKiP*A>wvq<%?C`9%yfR#*KGd#kh@v zgR+Bvu#-3KfMre|*cuDO4e&7)xliR)KivBF$1>yRv6>X|lX_!9IV6`N_bNM+yID2T zm;0a^lI3uRV^_V+M=`Vji-pc20>X;ey36?7kUxQ8!+^-((p4PnV z228TAziWet`rI$`3a-X4sP$InehlYmd@pkqe7k)Dw~N!Y509*$gGdpd^NFErx$Hjq z^Xca13WAx!in)U_st%oS5uu^i{x*V>EQz+A7`g%Ypc&4S=M~~P84###ko>l^<%PVE zjy6&JR#V$xGG5XWu#=u%3t=bDAP9*#boo-;a$eQP27b5KO?a=sqCdKsxu(SNE)5V% z&$R2Wm9Kn1Q(y+K7v8@qk(>`Pf?j+nP^<>vn}dF}*3`6tC6+B+9r9f6C!6W!koA6u zq$v9=%M39ZU$N?`bNy{66}^3FdgSLDREr_ls;dC;eLL>{lqS;g@-lVhaA`#XaP-et zRZT^c>xf#9q{#iM2US{q@h{ zA1^rpt*$J{_L1b$t~3*fp+`)E?TUOb1d z(TwGr(-F=-!^Fg^r2&qOvIPS##In(6Gur~Yl+!(oXN7a^vT#qY{3T)o?;2-T7D>WN zUo|G2S#BM1|1HRIh^~ChAa7?J9UGt`u)|Je)M|zr*@!fXh!OimY9k|@);-Z_$Hjh&(ljIR@X>N=3f%?F>N0uH1)kI7x`USi<_@iD`T1Mwk4EerHt zx28kY51+{G2#qoiN8tj8=f`BXAwf&d;*)~RO zo6J2|?pz@>B1bE89}RQWFf~`@wj>tP8nN70u9Wll`TYg6!~64oyEow5zU*eGs=jP&sU8-F`6B>}n?|;y69$V8ErWqB1zTv%ieb%JLD%dqY#N z_pXq}VSzU;ztCj+$mN!emjIbOpUYH_e3{JSON)8?LebS$a*pRQMo$j)+{0^oX>BB; z-v@UsZy_=n?HS~gkA)ewuAS42?X<1J?f$DQb~YFfZ|H0e$+INc)t~9o;$9^x{MX2? zZIJ4ads_D!34QLTU+Ze<0a3e5`OLG(!q4=zm~1{I!ahS$T{Sto;Q6bcC5*jm`V3+{ zkKFM#gu$+9uSxTSvs?3+89qj#` zk!yEZ+Z*#IpO-A|td?x-#Zc;KTl4!J^_TjH#M=@pY+$`I+p)8Kt6Td=UDOmd-6jH6 zp+I`QOxdnsA$B4ReM;;1uYp9VK`H@MV8q`Uv+du>rgtReSRdeDe?GJKKo09(QGNS@ zW?)2g^fK);J>-quP^Q?aNei33>vXw??Nk0d(Oa|k;fnJ$yZ)UMKoNONT8J{WtF6E>hE1Ha0EdIbUXJ0kN%8>T^$Z%Ku>U&g{%kd_s9iyRdYV@o^V@!vPB zlUzXNUAVa&(qQ&f$=-_diO`wF;p2G?E$FhygvkZXM^FWmLPef<2kd6F`YnaEoxi1^ z#pSM0ClrzJX=B3*8F@Ui5Qz;V3w@aJ=NrJ_^LSrD*>%{j_sJhQ@!h`&%HW(8{4Z67 z@l*f&$%*X8v^OlutO+;!Z|E_Ddv)z!pd8<2oMs|WaQ$qo+8GbHkYSYuF|^^JBz{1gnVMe3pQYFN~i((m#4-tF53X+**gv+!VLOxNp`hXo@r`pN75@ z$v1~UxSMf4NBL+%Bl=%U+`&Sm6Zn0U<26&azD)oLaGYH*|F^un>vqEu7W8j_DD1(> z&%;{A+ceW>Vv}JP=aCHZ>uI51NDJ#%?4pKOsk9Xw)xFbnTVaUpvDY>I3yyHb$MQ@$ z<|)v_u@`aT*)h2F;VT6`xZdw#KLSi>qVi%yD->c(seWx|KgMzlO-tsQFK`tf!MSCa z&~tgJ>uWUHqv!T|$*zXk{ytpVA+5B&ps0}8ZZEX&?fH1@?&PL$O2Vmc3UC4aCLdF} zoZ@rHE1BRvA_88HzK2jW|3yOoX}u>lcBSKRYjx-Fx69&g@efDGKEtWC9ip}M2!F9*pAbngdar28Bi+D881xYI>@ts=$ffKW zWgF1Hb~$+}tV;;&)2|!{hQ=7%yS9e$>$*Q3Brk=wkdO*ZnVne=ZgVBb&qKVA8{?CVXT zDyX>lT!@_D@tpI?(A@b359&MG(o4+dNZ;L#1AsNAyvWHpW%q(Vhak=F=vW(0cC$&Z zA(L!nHUjX}$=X{xUCM=mLg+uP5EkI&#h@$@t)G!$0x7JlteT6*lcxq3SN-R{lYCW? zP8)w7q3pQCaMd_G=c_D&czQD^(3E zbv%6S;Gbf7UB$DWXx?fA6z* z%Q#HOM%>{KWw*3YEc1$J970;`MV)G)dN0rJ{DuvEBz*dF;L?IrEgBFHhyvnx?HsV*p3%=VeThTPRS6Omqmmm9G#qFFO*iYR~97WtrUwYO(;{_-6?Tc^(+ zB$RsWZ+@*svQwT-5Lc+0vt{#|M;vhV_&L)>2@ja4LC1YPUxp~cLrODfRH;M@rlgWk z=>bAK1SAvtHIRjwU+y!=h3iaHJ?!!7{DYxQcSCEAQ($&seel`di`)Wb)x7L90Hf*zuuPvf7Tynz0|@dR*}+8uiM*-q!CNf#HIf&1)P9KAWR zy}-(vlHS$DuoSsuj++DgN>&x3dfBeu3qO?9O^)sIl;>K2Sh|^?9_T!;+Wsk1Co-j! zPMirmTer^5nA zEFh3$xmS}eGBBkv`_#LBluC{ezqnw98z!cpbB~qPix&w5FN<-j&`G~UkSkZ;Bi0)cl^peK_9&ev#V5cqI;B7-pmMsN;H$6HPv>WhEQLm$YVczd znHlmZAIz>^A&cE-KSl7py+}hKBcwt@E#`1`Nk1Xz5uEGV-nPVj zso|}uz`rBgeW8vvh%|_W`z!D7YQye`Aiu<*j!bO?B7~a$=YvNJLg6%+bG?gLMQBqp zRZY)HmY*QyDBFL25x)g9WY^&-kifLjHa5sGd%lYi5sTAw2bpo|Ucl7Rs;s)I8b5a^`FpMOaEJ+G zXK`_0Ao1k)#K}<4q>k`2SdM>Xxp#2UW5dh!q?#IF!gpm|wdihY89|=Uf!fsOT`q3T z@gHcZXZ!B3*Hawsz~1<%C-2#8(9OX?(Rc z`ifm?FK2;azd4Tp3NOr4goQ!U! zJ2*PpW1ViHupaT|edAj&68oKR8{r2frKa!|akEk7i|n^KUQL8g90Xpi;g{#FT(WVF zy`aD3-#BZ!wiolbg<_9>%vKeS{eKr9N{a|U>%b4fv$z11A zO~$k^i}qKyv*7L=@$ddXoKxTe%QHe+U*U=;$=rX! zpIv5=2_07N)A1T-IYiq6&eSc5Xif z8At2Ds;4(JVWQ^QFHl7jvEe(5%n|et{{{wLPjr>dl|A{xnVpn0;D4pL*4+IxvpX`1 z+oNb^b??Jm%1Y2Mz(quIuceJzry8AR;fe%n|8(=__WiNLN9m@`Mn7WS*b6Q!CH!WRjzpB z&8_`foLFhi-j~QCSBi^1^KFZp3erH#fxQgzrN8uy>1v!J&>P_IGk1Iu-f~O2PUUoD zo^>eaYIt8|CI3K5&JDD9ubM0)sHKHoH>wbNr-r%`y}Nb`jT{eE9Yp5U!+6iooEjd6g%NFK zC?XWx*4hvvi)UE2D2k-BLI6fASCPH^I?mx%2#NftR(s>@1kvh+KN1TZrSzf{v){q* zqIUljP6vfN=f_Kwe5>6f;FojnW@G^UsIpv3wydgUpLWNvgG85>pw>HL-#j`s?x^(u zuSArfB@P5Z^pNJ!yOpx^B75C;u1GR!4Bn1JXP&Nv4SL3qe}(+`UDNmVRH=iaV%SnwWoG^Kv~7l%Ywop83s8E`??tJGQRS!O zH5?ZVuAK zu;`7Cj!0e<@|nveHkLeB29|c70NXG0KDR z3lPVH?&#c-%z;O)elJ2H&H1lf7F3mCFI)6bznb(bGFx{bC*}M{Irm&2!tM6_fUp&8 zFg47-UVRZ???ObbUQy5AY3oRzgZ>xy_tSN7u*@O~$_eH-nb>Ybu0p^!Z+69~((rnv$o z#Zy*+9yIG58^!AkSXjYlw?v5Hj3i*4I5P3oPYeE zI0_q-&*-A34ae43>0w{hERktf*!50<-+XkYT-PK}60_#<{rUey&H*}rsOx+Kclwdj#-i7cFOpOE7c&4G$JpQ&^2M-o-cvlH z&s{p3?O7ZXcCpKynBt5}?r!Bfc+$YqE0?OQ-_41Nj>BL4xPVy*G zYS!xo@CgyoHWOo#vPv|xpbd$^1l^Laq0Ig)Nkm12$2c~AR7jUY-=Y?R3Y1LazKmJb z`7BRH$3|{vXhhda;MXQw<+Q*LGv3hxgf+E6pG(n^o(p`}(Tz0OC%UkU-LBDb;r1`) zHh=vs_q?J73mN;dHY*1vAGum9#wU<{QXM8DXWm`T%w9QvYq;o63;JMv{WCG7_o80* z%1a~;3zuM-!;u}NZhR!_LO&L4tKBuFLbH?d6qYm9+uAc+>?SyLEfC!+V^LpLoE-{8 z(nl2rw!em=w0}t%zJU#r4`;@%_bDKr^OM(i)h2FQ^izo6>q($8HPeTQv0S}eV(`2L z`1(5!?u+mu38I={x+oGSyO5wrDqohIT(4=RT_3*aYqEa3cWmxez{SF%PGrMJXs^IA z)h2GXU?EaXK+uTA-MgEKwcutvVEovY4t1<#%BWn1H2GW18&6PkPU|NH) z2wJ^O4c`BT?z5}3;9Db8uRjeezQ4EQ(pg;3n?L5Jw%VcFr`>2@Qo-(#6LQ|<3%O2C`vCd{=9g#PxADWlaW|^4!URXqW-$aAKXXTa zX6jGVzUI+1&9NUNKBLvCp`!8(R7-Gcmf)o{+apMxpIaf-;R%qX zwHkUIqHoQOP{NgMI>fcw+o0-v^^n%CTzJDzk8e2F>UM=Vwm91VXCZ9crR;YPIi5R0 zkmQCd{%~zdOHIs%{SnOU=VE#G2&>s#e~AtSm*Ra)$E*~SN}4A97z$`)otF>oHMz_i zD}iBCffO)hbUC^JzYI~NV?dWsjdvDLN(yVxOI`rs6^$>!Hj~{*YtKy^jbAiQB3>64 z3B?@#JiKRF;MnAfHZ{hauBBLm#}!`HO9WkRBoz&NVDRArtV}_{A%O}4qVV*`sellI zq#UrZaEmQVpW$zu1_i%$G028oKsybxe8DXd-0ZC(epBty4PFGuO9PC*-S#9q-~|XH zO-VWQVMV!K9Z;@xJp8kHcfTtU%DxcZm|3hr+fYhdqE{B5JjNq+5%!XToogYjw%IKD zf*^6_gl9UBpxnRpr*1Z^a0e13DpdJ7$9`%i2nK;9P+;LCVcpcUlkdtva0{9QS^$Fa za>tw;PdRy0jar8=dm>2%q4uRxKX(gifEBORd z34`d1#z}&Og2w!<*oON@$H#XnMFmK>YLT;Fl7o7w#QtTHN66|vEpTtY{&Xe6id$7Q2U&1ZQYB#|Jco+ z_psRA%SmqUFkzRB$YyQst|6x8Xj6ATmpJndedreyWS=ID#>Ni9Ns(SAU#MeZ!rk>k3KUq z;-%<&@iEFi=nD})CKThhQ!egSJH~Oph4#1J(+-!A`m_1IJv<8)dbU~)ZJC2e-wbPh zl&x)FN?2^^JRnZ2oT`w^y|S}!ijaPBo#j<#Q9I~f)Y1Oj+lk5bH2DA$O-Oe%mhT(3 z+Dm+3OHP8F;=e3uYB8}XldoFsTEMFm-W6Es%ciBVoGSjr&2cPMa)oSxcv>@wt45$= zG&*A<{zQKX+VeJYRb33f@Yp3joc45jrPLY}pD;A8B!pllp4k?mWXA`Q2aOP-y_&6^ z#Q`m?bS356w_)-lAs4HCwP2)y1Oq+)&vWrj^SPPG%8ZT=`bQZAEgx+VH zDA4aYbsUZpYr8gGvlbwahTMc6XC=Mb&EP|?*I*}t-g%XKc`n=at=J|X&&*rP{oZW6 zJF4uzB9d`q#9(5BKI|U~A7VIITT!~%!QYkW8NRsvd`fHa@#-~j{C3Luj{W7kK`$4R zMU=&}qwU9VJ_am90em@W7%%+w!(qm9nvYB@me;0q4 zYGDSAF2m=_9dojEF!R@?qhL>;vF3B_{;zjJ@a!`=IkjG?FnEwlzCdND!`w4rwzobw zb1o+E%QbQGkES}0!M$x&uyQW!?A5czKmuN0!q?mUj5OLQZf`!PICj}ihVeCAt&Bjg zzp}wNlF1eIyNHLR-qcFX5M@l>Ek+XFIMn*DPvyy|sj2i6qWCI^B0>Gmorg}htOma* z{dic!al`LB&fwXDAmyTOLN-}*^26b+V{3Iy4$_IRWM+%^%fz)Xa!yy)&$-={e1Z(f z=dnxLq@(#fgl&3PjP(e|duuv6(1G?x^<~#c#Osb}9@N(2hpP!Fs>K~j24->Se8c|H zqm@WFLe%@uNMEr6{LQq#*tPSD)GkQyIS#tF@sxrUh+UZ(au)P6Gn<1I=(H;XW$B`F zEW(|CFqcjD8Hm|637T9$#cJ&^mSp2g;z4IOojFIef&P^?Kihj{hIWa(G1NWT^>1ND zeGLn7q=dGq_FO#F(bEuiKO!b{cbO*J&@jadS5xN~x*|j|2x~2ZX^D9ufQ$z}L0*9U zvPP_tyZ05T(ZFGT+IoxDYvUY+bomc~+1%#*x!xXm<0Tq@|5EQdOf<6l%3r2soI0Jv z?8OyCzKpVha>HHo<{*Xyyf&Cq6B6%o$!{W`RDGJooXf0o&pGCVJ~uSy)6UIRk~ShFt=*#eeiq8D@RQHw&H$`V4wi=0kI^M42K&93umxeuTE) z)z~)?CbGN_R(byBwb~tNi_|O+f^7n!6#Q*jU`e?H@6BvLKein=5vy3Z(jKw7*@vlk zgL{M35r6xWI_Y4!HW0|w7lh?IIEv+C$sgjCD_s#w^5WCAYSMbWt!hTiHKm->(@B34 zZ_&3MVN9vLhj=$v8bD%KOZ{qb+ty!R}<#^ zJ68@0$pjkFg8N^2X0Z0XW4 z&7FUno2Mo=aP>fhy9~#7?L3k2WOVCj$kdU#IrHoALmv7f%JFgrYa80BGqwkW_Ri74VO6^yiw;4{nxvFC_ComFNp zgMwiqHV9GJx7W9asCb`jWpl;*w+pHG=k8?!0=ix;Gyw3+A71w~rV!Qt?VRp?8GL(n z&(^q0{F(blrat*n=2vjU^HAeUk611=)f%Nkv*egdP|pcfNSvo(GE?kPS8L+Pub#$C z%v%c-HMg01{HW#R;y4_))Az z`#Xk%E&eGaqx{$6Y9OCq_y^o3smjRFJX0(ug>Ru_A@Du5Obq81{-doPsD9LyJz|%RJAQ2H2Za;^d*uIhFAJ9M%c~nx}$e(DP)dM`Bz$8}2Ov&_3 ztC$wsjl{VTtxjs=RrFCJ%K!8QKsc25)8HeaOo}(n%u{ZCcS}A% zvVM8|my5|ZvC8gAs@Ija$X$GYw*R#3mdULqVl{UkCXv3fm|sp!G3!&ieJ5g1#;r*& zS>4%;hsW%k7^Xr3lluzErN8pei2b3VV1Dw84H5nuWeS2rK|1S~IYY(19N*tqMnLXOhuq0{eVJs(oC3elEG``CUT zhXx!&S(S59&5c5PFXDC^r;oNbMwMsM6%|i|&3oMu^%S>uM-Dw;*c>n|z1614Urok} z=HbQ7xlt&do`IPUt_`=OYAg^OT9f~P(h5jduGWV?e9&$y&45J*ZEpVS+2k%6nOVGY zG7(2042C>i3Q=5SH^9^OYSY1wiNxh)#ck|otc>_TXS980FoS;cRBrlP`0YH zGST3XZt=ckBMh7^fgY{(_r6Y1_Kl>GumpHeKWCE^jrbJZhNj&foTZJ?Xa2@N2nzlS z7HOKQ2gu|Ca#1I3oi(wv{$eO~U73+fYAcfF6`FqFa7kP0dPVAuF56@yNhQfr_uEH&56<*~Uu~4!Tq(8Dyv>;`=sKv zE&n7(&M;y9izv%&Qil^u&D`=*xjwbJo2eU8H%?;=0B#^S*Ia$2M&$nQKl|&y10CkQ z9X7g#Mw_LW-p#x`mqkN8Ps-0&W8W_XNKf4$p>hutasrY{^7pZua+n5U?|(O`p4&^c z)dJx7HI*49HI10Skf^Flzjj+1_Ch_+J;LElvJUkXe%*wmvqqRa%>XCr9ib3K#4)(&Xm zM$(kuYN22E64pH0^SqNE#NC>(I{1*2=|>UOwX~Xjsoq=ReQ62=Vp#xjB|&);9`tf{ zYck)1eqiBaX6i51w1p<{HctL3c^DWH9rpl$`@x)#gTN3FM3YH*jw=D;3V!=HNcfO} zHuxM@a1{jNzZ(BDbD9kV6Xs{sZ6HZ&-*BT%NK?wv+U((MmMcGEvR3K(_9IhRlQAQ) zF@=Sp_W3m%we4;6iHxje!-@pPL-{fax2PteIvK`5)V0jf`i1md`hOqz`5@pA zr4T|Hlh$cgF1_?d@l>YScBj1$T~vBhi$iS<87LLY6CdHtO%;WP%{kCY(~DUD#bu8c z|7FZA(J$_g#ZgEu?Q`d@<-5FiKH2CAz@1M&R!RDpPAn6#5D_o|ciY(?LC<=$vp?24 z7p1WRh_q|ru!8uTqA8WmKsJ|@)Fe;ADQ=B60kq1hcQ`+2);d&`Y zN}j-s_hf6wnL+}_24YIjeb+j6?CgtUcFsO05JQ+w^MXqZKjIX!^#q3g2Dka#d@rCt zyywMD)+O|(_otTcO-8M~dhENVzVHhU`^y%4BRa$NWG^m2J*I7cwr|+ZNp{>`3hGGh z5|_jY++12eRv*65cQadgaFkmf!&y&R_6kmY5`D9M+^U(jq*8y@>tJ)OFJ&$f-TI=l z_0GePFgbzCR|NH2HFG#7f@C%5hl|&oxkP^anErR{gl#5N*>`_7yIf5|DmF91@V8pD z_*Y{zFjoy>&luwDrc?nAat6v`+`+j+RYkQC{eWjz$me#u@Q=={7{#8?wTjK0MB7==r}>GX=&U)WVDl|>f+oROhLa}$Y;h!Zvx z&_?EVmsQ;B9X@}4ktI26m=j`JU1joH2RV$4?O8RzP_gSMjd&+Rqo}`LXaSpv=)B5j{(@C8}qIi!X&f>H?}L7`T5DW z^VnNz6uXHlD&B>)*u8^5OKVZF`_%Qfg|Xao;f>Ye7pz}p*Gi4k5*zh7s4uqZA-e

^qDM$bIoU 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

S^M}jz7On*K-(v0?*7*2F12cK?EwY9P9 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%0AYeRFE2cPhwH?XoT0g~c40lDk61GZ`1 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

    koeKFgk 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

    o^+1t_ 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
    EpVvhV1K!gDd+?|KmRkC(Wg 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ð|#^5S2Uc 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 literal 0 HcmV?d00001 diff --git a/docs/assets/prompt_syntax/apricots--3.png b/docs/assets/prompt_syntax/apricots--3.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c98ffd8b071dda8499a5e65dfdd7e25174c882a6 100644 GIT binary patch literal 570026 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

wkr5I5Rx^qRsxukd+ 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 literal 0 HcmV?d00001 diff --git a/docs/assets/prompt_syntax/apricots--2.png b/docs/assets/prompt_syntax/apricots--2.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5c519b09aed80cf87824d0ec08f1b58d672aefb3 100644 GIT binary patch literal 585742 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�$Zzk1t4}iD>!lm!`*zY^sRC~R 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