From 0b901e08ceef054de758d7226c04c43b76a0a613 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 29 Aug 2024 10:42:38 -0400 Subject: [PATCH] xhinker move te as needed --- CHANGELOG.md | 11 ++++++----- html/reference.json | 2 +- modules/prompt_parser_diffusers.py | 20 ++++++++++++++++++++ modules/prompt_parser_xhinker.py | 5 +---- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aeb6ad70a..4babaa918 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Change Log for SD.Next -## Update for 2024-08-28 +## Update for 2024-08-29 -### Highlights for 2024-08-28 +### Highlights for 2024-08-29 Summer break is over and we are back with a massive update! @@ -15,13 +15,14 @@ Support for all of the new models: What else? Just a bit... ;) -New **fast-install** mode, new **controlnet-union** *all-in-one* model, support for **DoRA** networks, additional **VLM** models, new **AuraSR** upscaler, new **Optimum Quanto** and **BitsAndBytes** quantization modes, new **balanced offload** mode and more... +New **fast-install** mode, new **ControlNet-Union** *all-in-one* model, support for **DoRA** networks, additional **VLM** models, new **AuraSR** upscaler, new **Optimum Quanto** and **BitsAndBytes** quantization modes, new **balanced offload** mode and more... **Breaking Changes...** -Due to internal changes, you'll need to reset your **attention** and **offload** settings! +Due to internal changes, you'll need to reset your **attention** and **offload** settings! +But...For a good reason, new *balanced offload* is magic when it comes to memory utilization while sacrificing minimal performance! -### Details for 2024-08-27 +### Details for 2024-08-29 **New Models...** diff --git a/html/reference.json b/html/reference.json index 853de1e80..0f9294ad2 100644 --- a/html/reference.json +++ b/html/reference.json @@ -150,7 +150,7 @@ }, "AuraFlow 0.3": { - "path": "https://huggingface.co/fal/AuraFlow-v0.3", + "path": "fal/AuraFlow-v0.3", "desc": "AuraFlow v0.3 is the fully open-sourced flow-based text-to-image generation model. The model was trained with more compute compared to the previous version, AuraFlow-v0.2. Compared to AuraFlow-v0.2, the model is fine-tuned on more aesthetic datasets and now supports various aspect ratio, (now width and height up to 1536 pixels).", "preview": "fal--AuraFlow.jpg", "skip": true, diff --git a/modules/prompt_parser_diffusers.py b/modules/prompt_parser_diffusers.py index bd671c011..750a92e44 100644 --- a/modules/prompt_parser_diffusers.py +++ b/modules/prompt_parser_diffusers.py @@ -459,6 +459,18 @@ def get_xhinker_text_embeddings(pipe, prompt: str = "", neg_prompt: str = "", cl except Exception: pass prompt_embed = positive_pooled = negative_embed = negative_pooled = None + + te1_device, te2_device, te3_device = None, None, None + if hasattr(pipe, "text_encoder") and pipe.text_encoder.device != devices.device: + te1_device = pipe.text_encoder.device + pipe.text_encoder = pipe.text_encoder.to(devices.device) + if hasattr(pipe, "text_encoder_2") and pipe.text_encoder_2.device != devices.device: + te2_device = pipe.text_encoder_2.device + pipe.text_encoder_2 = pipe.text_encoder_2.to(devices.device) + if hasattr(pipe, "text_encoder_3") and pipe.text_encoder_3.device != devices.device: + te3_device = pipe.text_encoder_3.device + pipe.text_encoder_3 = pipe.text_encoder_3.to(devices.device) + if SD3: prompt_embed, negative_embed, positive_pooled, negative_pooled = get_weighted_text_embeddings_sd3(pipe=pipe, prompt=prompt, neg_prompt=neg_prompt, use_t5_encoder=bool(pipe.text_encoder_3)) elif 'Flux' in pipe.__class__.__name__: @@ -467,4 +479,12 @@ def get_xhinker_text_embeddings(pipe, prompt: str = "", neg_prompt: str = "", cl prompt_embed, negative_embed, positive_pooled, negative_pooled = get_weighted_text_embeddings_sdxl_2p(pipe=pipe, prompt=prompt, prompt_2=prompt_2, neg_prompt=neg_prompt, neg_prompt_2=neg_prompt_2) else: prompt_embed, negative_embed = get_weighted_text_embeddings_sd15(pipe=pipe, prompt=prompt, neg_prompt=neg_prompt, clip_skip=clip_skip) + + if te1_device is not None: + pipe.text_encoder = pipe.text_encoder.to(te1_device) + if te2_device is not None: + pipe.text_encoder_2 = pipe.text_encoder_2.to(te2_device) + if te3_device is not None: + pipe.text_encoder_3 = pipe.text_encoder_3.to(te3_device) + return prompt_embed, positive_pooled, negative_embed, negative_pooled diff --git a/modules/prompt_parser_xhinker.py b/modules/prompt_parser_xhinker.py index 07c92eddb..6e43c8860 100644 --- a/modules/prompt_parser_xhinker.py +++ b/modules/prompt_parser_xhinker.py @@ -1392,9 +1392,6 @@ def get_weighted_text_embeddings_flux1( # use avg pooling embeddings pool_embeds_list = [] - te_device = pipe.text_encoder.device - if pipe.text_encoder.device != device: - pipe.text_encoder = pipe.text_encoder.to(device) for token_group in prompt_token_groups: token_tensor = torch.tensor( [token_group] @@ -1407,7 +1404,7 @@ def get_weighted_text_embeddings_flux1( ) pooled_prompt_embeds = prompt_embeds_1.pooler_output.squeeze(0) pool_embeds_list.append(pooled_prompt_embeds) - pipe.text_encoder = pipe.text_encoder.to(te_device) + prompt_embeds = torch.stack(pool_embeds_list, dim=0) # get the avg pool