diff --git a/modules/processing_class.py b/modules/processing_class.py index d38aae790..2f11db375 100644 --- a/modules/processing_class.py +++ b/modules/processing_class.py @@ -486,7 +486,7 @@ class StableDiffusionProcessingImg2Img(StableDiffusionProcessing): image = images.resize_image(self.resize_mode, image, self.width, self.height, upscaler_name=self.resize_name, context=self.resize_context) self.width = image.width self.height = image.height - if self.image_mask is not None and shared.opts.mask_apply_overlay: + if self.image_mask is not None and shared.opts.mask_apply_overlay and not hasattr(self, 'xyz'): image_masked = Image.new('RGBa', (image.width, image.height)) image_to_paste = image.convert("RGBA").convert("RGBa") image_to_mask = ImageOps.invert(self.mask_for_overlay.convert('L')) if self.mask_for_overlay is not None else None diff --git a/modules/pulid/pulid_sampling.py b/modules/pulid/pulid_sampling.py index e319c0d27..6a2ef31f3 100644 --- a/modules/pulid/pulid_sampling.py +++ b/modules/pulid/pulid_sampling.py @@ -393,8 +393,8 @@ def sample_dpmpp_2s_ancestral(model, x, sigmas, extra_args=None, callback=None, extra_args = {} if extra_args is None else extra_args noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler s_in = x.new_ones([x.shape[0]]) - sigma_fn = lambda t: t.neg().exp() - t_fn = lambda sigma: sigma.log().neg() + sigma_fn = lambda t: t.neg().exp() # pylint: disable=C3001 + t_fn = lambda sigma: sigma.log().neg() # pylint: disable=C3001 for i in trange(len(sigmas) - 1, disable=disable): denoised = model(x, sigmas[i] * s_in, **extra_args) @@ -430,8 +430,8 @@ def sample_dpmpp_sde(model, x, sigmas, extra_args=None, callback=None, disable=N noise_sampler = BrownianTreeNoiseSampler(x, sigma_min, sigma_max) if noise_sampler is None else noise_sampler extra_args = {} if extra_args is None else extra_args s_in = x.new_ones([x.shape[0]]) - sigma_fn = lambda t: t.neg().exp() - t_fn = lambda sigma: sigma.log().neg() + sigma_fn = lambda t: t.neg().exp() # pylint: disable=C3001 + t_fn = lambda sigma: sigma.log().neg() # pylint: disable=C3001 for i in trange(len(sigmas) - 1, disable=disable): denoised = model(x, sigmas[i] * s_in, **extra_args) @@ -472,8 +472,8 @@ def sample_dpmpp_2m(model, x, sigmas, extra_args=None, callback=None, disable=No """DPM-Solver++(2M).""" extra_args = {} if extra_args is None else extra_args s_in = x.new_ones([x.shape[0]]) - sigma_fn = lambda t: t.neg().exp() - t_fn = lambda sigma: sigma.log().neg() + sigma_fn = lambda t: t.neg().exp() # pylint: disable=C3001 + t_fn = lambda sigma: sigma.log().neg() # pylint: disable=C3001 old_denoised = None for i in trange(len(sigmas) - 1, disable=disable): diff --git a/modules/sd_models.py b/modules/sd_models.py index 1f932bd30..8320ac293 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -449,6 +449,9 @@ def move_model(model, device=None, force=False): devices.torch_gc() return + if hasattr(model, 'pipe'): + move_model(model.pipe, device, force) + fn = f'{sys._getframe(2).f_code.co_name}:{sys._getframe(1).f_code.co_name}' # pylint: disable=protected-access if getattr(model, 'vae', None) is not None and get_diffusers_task(model) != DiffusersTaskType.TEXT_2_IMAGE: if device == devices.device and model.vae.device.type != "meta": # force vae back to gpu if not in txt2img mode @@ -476,7 +479,8 @@ def move_model(model, device=None, force=False): try: t0 = time.time() try: - model.to(device) + if hasattr(model, 'to'): + model.to(device) if hasattr(model, "prior_pipe"): model.prior_pipe.to(device) except Exception as e0: @@ -486,7 +490,8 @@ def move_model(model, device=None, force=False): if hasattr(component, 'modules'): for module in component.modules(): try: - module.to(device) + if hasattr(module, 'to'): + module.to(device) except Exception as e2: if 'Cannot copy out of meta tensor' in str(e2): if os.environ.get('SD_MOVE_DEBUG', None): diff --git a/scripts/apg.py b/scripts/apg.py index 0476da246..6d0ec107e 100644 --- a/scripts/apg.py +++ b/scripts/apg.py @@ -2,6 +2,9 @@ import gradio as gr from modules import scripts, processing, shared, sd_models +registered = False + + class Script(scripts.Script): def __init__(self): super().__init__() @@ -24,6 +27,10 @@ class Script(scripts.Script): return [eta, momentum, threshold] def register(self): # register xyz grid elements + global registered # pylint: disable=global-statement + if registered: + return + registered = True def apply_field(field): def fun(p, x, xs): # pylint: disable=unused-argument setattr(p, field, x) diff --git a/scripts/pulid_ext.py b/scripts/pulid_ext.py index b7fad31bc..7ec32e904 100644 --- a/scripts/pulid_ext.py +++ b/scripts/pulid_ext.py @@ -9,13 +9,15 @@ from modules import shared, devices, errors, scripts, processing, processing_hel debug = os.environ.get('SD_PULID_DEBUG', None) is not None direct = False +registered = False +uploaded_images = [] class Script(scripts.Script): def __init__(self): - self.images = [] self.pulid = None self.cache = None + self.mask_apply_overlay = shared.opts.mask_apply_overlay super().__init__() self.register() # pulid is script with processing override so xyz doesnt execute @@ -33,6 +35,10 @@ class Script(scripts.Script): install('pydantic==1.10.15', 'pydantic', ignore=False, reinstall=True) def register(self): # register xyz grid elements + global registered # pylint: disable=global-statement + if registered: + return + registered = True def apply_field(field): def fun(p, x, xs): # pylint: disable=unused-argument setattr(p, field, x) @@ -52,7 +58,7 @@ class Script(scripts.Script): def load_images(self, files): - self.images = [] + uploaded_images.clear() for file in files or []: try: if isinstance(file, str): @@ -66,10 +72,10 @@ class Script(scripts.Script): image = Image.open(file.name) # _TemporaryFileWrapper from gr.Files else: raise ValueError(f'IP adapter unknown input: {file}') - self.images.append(image) + uploaded_images.append(image) except Exception as e: shared.log.warning(f'IP adapter failed to load image: {e}') - return gr.update(value=self.images, visible=len(self.images) > 0) + return gr.update(value=uploaded_images, visible=len(uploaded_images) > 0) # return signature is array of gradio components def ui(self, _is_img2img): @@ -95,7 +101,7 @@ class Script(scripts.Script): try: if len(gallery) == 0: from modules.api.api import decode_base64_to_image - images = getattr(p, 'pulid_images', self.images) + images = getattr(p, 'pulid_images', uploaded_images) images = [decode_base64_to_image(image) if isinstance(image, str) else image for image in images] else: images = [Image.open(f['name']) if isinstance(f, dict) else f for f in gallery] @@ -134,6 +140,8 @@ class Script(scripts.Script): ortho = getattr(p, 'pulid_ortho', ortho) sampler = getattr(p, 'pulid_sampler', sampler) sampler_fn = getattr(self.pulid.sampling, f'sample_{sampler}', None) + self.mask_apply_overlay = shared.opts.mask_apply_overlay + shared.opts.data['mask_apply_overlay'] = False if sampler_fn is None: sampler_fn = self.pulid.sampling.sample_dpmpp_2m_sde @@ -149,7 +157,7 @@ class Script(scripts.Script): ) shared.sd_model.no_recurse = True sd_models.copy_diffuser_options(shared.sd_model, shared.sd_model.pipe) - # sd_models.move_model(shared.sd_model, devices.device) # move pipeline to device + sd_models.move_model(shared.sd_model, devices.device) # move pipeline to device sd_models.set_diffuser_options(shared.sd_model, vae=None, op='model') devices.torch_gc() except Exception as e: @@ -204,11 +212,12 @@ class Script(scripts.Script): def after(self, p: processing.StableDiffusionProcessing, processed: processing.Processed, *args): # pylint: disable=unused-argument _strength, _zero, _sampler, _ortho, _gallery, cache = args - cache = getattr(p, 'pulid_cache', cache) - if cache: - shared.log.debug(f'PuLID cache: class={shared.sd_model.__class__.__name__}') - return processed if hasattr(shared.sd_model, 'pipe') and shared.sd_model_type == "sdxl": + shared.opts.data['mask_apply_overlay'] = self.mask_apply_overlay + cache = getattr(p, 'pulid_cache', cache) + if cache: + shared.log.debug(f'PuLID cache: class={shared.sd_model.__class__.__name__}') + return processed if hasattr(shared.sd_model, 'app'): shared.sd_model.app = None shared.sd_model.ip_adapter = None diff --git a/scripts/xyz_grid_classes.py b/scripts/xyz_grid_classes.py index 08ea279f4..c3d3554e2 100644 --- a/scripts/xyz_grid_classes.py +++ b/scripts/xyz_grid_classes.py @@ -136,6 +136,7 @@ axis_options = [ AxisOption("[Postprocess] Upscaler", str, apply_upscaler, cost=0.4, choices=lambda: [x.name for x in shared.sd_upscalers][1:]), AxisOption("[Postprocess] Context", str, apply_context, choices=lambda: ["Add with forward", "Remove with forward", "Add with backward", "Remove with backward"]), AxisOption("[Postprocess] Detailer", str, apply_detailer, fmt=format_value_add_label), + AxisOption("[Postprocess] Detailer strength", str, apply_field("detailer_strength")), AxisOption("[HDR] Mode", int, apply_field("hdr_mode")), AxisOption("[HDR] Brightness", float, apply_field("hdr_brightness")), AxisOption("[HDR] Color", float, apply_field("hdr_color")),