diff --git a/modules/prompt_parser_diffusers.py b/modules/prompt_parser_diffusers.py index 5fe559353..c44c5652f 100644 --- a/modules/prompt_parser_diffusers.py +++ b/modules/prompt_parser_diffusers.py @@ -216,17 +216,16 @@ def prepare_embedding_providers(pipe, clip_skip) -> list[EmbeddingsProvider]: def pad_to_same_length(pipe, embeds): - if not hasattr(pipe, 'encode_prompt') and not (hasattr(pipe, "prior_pipe") and hasattr(pipe.prior_pipe, "encode_prompt")): + if not hasattr(pipe, 'encode_prompt') and 'StableCascade' not in pipe.__class__.__name__: return embeds device = pipe.device if str(pipe.device) != 'meta' else devices.device - try: - if getattr(pipe, "prior_pipe", None) and getattr(pipe.prior_pipe, "text_encoder", None) is not None: # Cascade - empty_embed = pipe.prior_pipe.encode_prompt(device, 1, 1, False, "") - empty_embed = [torch.zeros(empty_embed[0].shape, device=empty_embed[0].device, dtype=empty_embed[0].dtype)] - else: # SDXL + if shared.opts.diffusers_empty_prompt_pad or 'StableCascade' in pipe.__class__.__name__: + empty_embed = [torch.empty((1, 77, embeds[0].shape[2]), device=device, dtype=embeds[0].dtype)] + else: + try: empty_embed = pipe.encode_prompt("") - except TypeError: # SD1.5 - empty_embed = pipe.encode_prompt("", device, 1, False) + except TypeError: # SD1.5 + empty_embed = pipe.encode_prompt("", device, 1, False) max_token_count = max([embed.shape[1] for embed in embeds]) repeats = max_token_count - min([embed.shape[1] for embed in embeds]) empty_batched = empty_embed[0].to(embeds[0].device).repeat(embeds[0].shape[0], repeats // empty_embed[0].shape[1], 1) diff --git a/modules/shared.py b/modules/shared.py index f7395ce47..ce5f82b4e 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -534,6 +534,7 @@ options_templates.update(options_section(('diffusers', "Diffusers Settings"), { "disable_accelerate": OptionInfo(False, "Disable accelerate"), "diffusers_force_zeros": OptionInfo(False, "Force zeros for prompts when empty", gr.Checkbox, {"visible": False}), "diffusers_pooled": OptionInfo("default", "Diffusers SDXL pooled embeds", gr.Radio, {"choices": ['default', 'weighted']}), + "diffusers_empty_prompt_pad": OptionInfo(False, "Use empty values for prompt padding", gr.Checkbox), "huggingface_token": OptionInfo('', 'HuggingFace token'), "onnx_sep": OptionInfo("