(self,
prompts,
negative_prompts,
steps,
clip_skip,
p,
prompt_attention=None,
prompt_mean_norm=None,
diffusers_zeros_prompt_pad=None,
te_pooled_embeds=None,
)
| 48 | |
| 49 | class PromptEmbedder: |
| 50 | def __init__(self, |
| 51 | prompts, |
| 52 | negative_prompts, |
| 53 | steps, |
| 54 | clip_skip, |
| 55 | p, |
| 56 | prompt_attention=None, |
| 57 | prompt_mean_norm=None, |
| 58 | diffusers_zeros_prompt_pad=None, |
| 59 | te_pooled_embeds=None, |
| 60 | ): |
| 61 | t0 = time.time() |
| 62 | self.prompt_attention_value = prompt_attention or shared.opts.prompt_attention |
| 63 | self.prompt_mean_norm = prompt_mean_norm if prompt_mean_norm is not None else shared.opts.prompt_mean_norm |
| 64 | self.diffusers_zeros_prompt_pad = diffusers_zeros_prompt_pad if diffusers_zeros_prompt_pad is not None else shared.opts.diffusers_zeros_prompt_pad |
| 65 | self.te_pooled_embeds = te_pooled_embeds if te_pooled_embeds is not None else shared.opts.te_pooled_embeds |
| 66 | self.prompts = prompts |
| 67 | self.negative_prompts = negative_prompts |
| 68 | self.batchsize = len(self.prompts) |
| 69 | self.attention = last_attention |
| 70 | self.allsame = False # dont collapse prompts |
| 71 | # self.allsame = self.compare_prompts() # collapses batched prompts to single prompt if possible |
| 72 | self.steps = steps |
| 73 | self.clip_skip = clip_skip |
| 74 | # All embeds are nested lists, outer list batch length, inner schedule length |
| 75 | self.prompt_embeds = [[] for _ in range(self.batchsize)] |
| 76 | self.positive_pooleds = [[] for _ in range(self.batchsize)] |
| 77 | self.negative_prompt_embeds = [[] for _ in range(self.batchsize)] |
| 78 | self.negative_pooleds = [[] for _ in range(self.batchsize)] |
| 79 | self.prompt_attention_masks = [[] for _ in range(self.batchsize)] |
| 80 | self.negative_prompt_attention_masks = [[] for _ in range(self.batchsize)] |
| 81 | self.positive_schedule = None |
| 82 | self.negative_schedule = None |
| 83 | self.scheduled_prompt = False |
| 84 | if hasattr(p, 'dummy'): |
| 85 | return |
| 86 | earlyout = self.checkcache(p) |
| 87 | if earlyout: |
| 88 | return |
| 89 | self.pipe = prepare_model(shared.sd_model) |
| 90 | if self.pipe is None: |
| 91 | log.error("Prompt encode: cannot find text encoder in model") |
| 92 | return |
| 93 | seen_prompts = {} |
| 94 | # per prompt in batch |
| 95 | for batchidx, (prompt, negative_prompt) in enumerate(zip(self.prompts, self.negative_prompts, strict=False)): |
| 96 | self.prepare_schedule(prompt, negative_prompt) |
| 97 | schedule_key = ( |
| 98 | tuple(self.positive_schedule) if self.positive_schedule is not None else None, |
| 99 | tuple(self.negative_schedule) if self.negative_schedule is not None else None, |
| 100 | self.scheduled_prompt, |
| 101 | ) |
| 102 | cache_key = (prompt, negative_prompt, schedule_key) |
| 103 | cached_idx = seen_prompts.get(cache_key) |
| 104 | if cached_idx is not None: |
| 105 | self.clone_embeds(batchidx, cached_idx) |
| 106 | continue |
| 107 | if self.scheduled_prompt: |
nothing calls this directly
no test coverage detected