diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index 0a0cfa9b7..ce2e8cf03 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -162,6 +162,7 @@ function setupExtraNetworksForTab(tabname) { let text = `${elem.querySelector('.name').textContent.toLowerCase()} ${elem.querySelector('.search_term').textContent.toLowerCase()}`; text = text.replace('models--', 'Diffusers').replace('\\', '/'); elem.style.display = text.indexOf(searchTerm) === -1 ? 'none' : ''; + console.log({ search: searchTerm, text, display: elem.style.display }); }); searchTimer = null; }, 100); diff --git a/modules/dml/__init__.py b/modules/dml/__init__.py index f14f479a2..3661559ec 100644 --- a/modules/dml/__init__.py +++ b/modules/dml/__init__.py @@ -9,7 +9,7 @@ default_memory_provider = "None" if platform.system() == "Windows": memory_providers.append("Performance Counter") default_memory_provider = "Performance Counter" -do_nothing = lambda: None +do_nothing = lambda: None # pylint: disable=unnecessary-lambda-assignment def _set_memory_provider(): from modules.shared import opts, cmd_opts, log @@ -63,7 +63,7 @@ def directml_init(): return True, None def directml_do_hijack(): - import modules.dml.hijack + import modules.dml.hijack # pylint: disable=unused-import from modules.devices import device if not torch.dml.has_float64_support(device): @@ -79,9 +79,9 @@ class OverrideItem(NamedTuple): message: Optional[str] opts_override_table = { - "diffusers_generator_device": OverrideItem("cpu", None, "DirectML does not support torch Generator API."), - "diffusers_model_cpu_offload": OverrideItem(False, None, "Diffusers' model CPU offloading does not support DirectML devices."), - "diffusers_seq_cpu_offload": OverrideItem(False, lambda opts: opts.diffusers_pipeline != "Stable Diffusion XL", "Diffusers' sequential CPU offloading is available only on StableDiffusionXLPipeline with DirectML devices."), + "diffusers_generator_device": OverrideItem("cpu", None, "DirectML does not support torch Generator API"), + "diffusers_model_cpu_offload": OverrideItem(False, None, "Diffusers model CPU offloading does not support DirectML devices"), + "diffusers_seq_cpu_offload": OverrideItem(False, lambda opts: opts.diffusers_pipeline != "Stable Diffusion XL", "Diffusers sequential CPU offloading is available only on StableDiffusionXLPipeline with DirectML devices"), } def directml_override_opts(): @@ -96,11 +96,9 @@ def directml_override_opts(): if getattr(shared.opts, key) != item.value and (item.condition is None or item.condition(shared.opts)): count += 1 setattr(shared.opts, key, item.value) - if item.message is not None: - shared.log.warning(item.message) - shared.log.warning(f'{key} is automatically overriden to {item.value}.') + shared.log.warning(f'Overriding: {key}={item.value} {item.message if item.message is not None else ""}') if count > 0: - shared.log.info(f'{count} options are automatically overriden. If you want to keep them from overriding, run with --experimental argument.') + shared.log.info(f'Options override: count={count}. If you want to keep them from overriding, run with --experimental argument.') _set_memory_provider() diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index d22c73a13..8ef2fe638 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -78,8 +78,8 @@ def process_diffusers(p: StableDiffusionProcessing, seeds, prompts, negative_pro model.vae.to(devices.device) latents.to(model.vae.device) - needs_upcasting = model.vae.dtype == torch.float16 and model.vae.config.force_upcast - if needs_upcasting: # this is done by diffusers automatically if output_type != 'latent' + upcast = (model.vae.dtype == torch.float16) and model.vae.config.force_upcast and hasattr(model, 'upcast_vae') + if upcast: # this is done by diffusers automatically if output_type != 'latent' model.upcast_vae() latents = latents.to(next(iter(model.vae.post_quant_conv.parameters())).dtype) @@ -87,7 +87,7 @@ def process_diffusers(p: StableDiffusionProcessing, seeds, prompts, negative_pro if shared.opts.diffusers_move_unet and not model.has_accelerate: model.unet.to(unet_device) t1 = time.time() - shared.log.debug(f'VAE decode: name={sd_vae.loaded_vae_file if sd_vae.loaded_vae_file is not None else "baked"} dtype={model.vae.dtype} upcast={model.vae.config.get("force_upcast", None)} images={latents.shape[0]} latents={latents.shape} time={round(t1-t0, 3)}s') + shared.log.debug(f'VAE decode: name={sd_vae.loaded_vae_file if sd_vae.loaded_vae_file is not None else "baked"} dtype={model.vae.dtype} upcast={upcast} images={latents.shape[0]} latents={latents.shape} time={round(t1-t0, 3)}s') return decoded def full_vae_encode(image, model): diff --git a/modules/scripts.py b/modules/scripts.py index b81ce2aa1..c5eb6afe8 100644 --- a/modules/scripts.py +++ b/modules/scripts.py @@ -398,7 +398,7 @@ class ScriptRunner: dropdown.init_field = init_field dropdown.change(fn=select_script, inputs=[dropdown], outputs=[script.group for script in self.selectable_scripts]) - + def onload_script_visibility(params): title = params.get('Script', None) if title: diff --git a/modules/sd_models.py b/modules/sd_models.py index 318d2915e..aa457408f 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -586,7 +586,7 @@ model_data = ModelData() def change_backend(): - shared.log.info(f'Pipeline changed: {shared.backend}') + shared.log.info(f'Backend changed: {shared.backend}') unload_model_weights() checkpoints_loaded.clear() from modules.sd_samplers import list_samplers @@ -762,7 +762,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No diffusers_load_config.pop('safety_checker', None) diffusers_load_config.pop('requires_safety_checker', None) diffusers_load_config.pop('load_safety_checker', None) - shared.log.debug(f'Model {op}: pipeline={sd_model.__class__.__name__} config={diffusers_load_config}') # pylint: disable=protected-access + shared.log.debug(f'Setting {op}: pipeline={sd_model.__class__.__name__} config={diffusers_load_config}') # pylint: disable=protected-access except Exception as e: shared.log.error(f'Diffusers failed loading model using pipeline: {checkpoint_info.path} {shared.opts.diffusers_pipeline} {e}') return @@ -773,8 +773,8 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No sd_model.scheduler.name = 'DDIM' if (shared.opts.diffusers_model_cpu_offload or shared.cmd_opts.medvram) and (shared.opts.diffusers_seq_cpu_offload or shared.cmd_opts.lowvram): - shared.log.warning(f'Model {op}: Model CPU offload (--medvram) and Sequential CPU offload (--lowvram) are not compatible') - shared.log.debug(f'Model {op}: disabling model CPU offload and --medvram') + shared.log.warning(f'Setting {op}: Model CPU offload and Sequential CPU offload are not compatible') + shared.log.debug(f'Setting {op}: disabling model CPU offload') shared.opts.diffusers_model_cpu_offload=False shared.cmd_opts.medvram=False @@ -783,7 +783,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No sd_model.has_accelerate = False if hasattr(sd_model, "enable_model_cpu_offload"): if (shared.cmd_opts.medvram and devices.backend != "directml") or shared.opts.diffusers_model_cpu_offload: - shared.log.debug(f'Model {op}: enable model CPU offload') + shared.log.debug(f'Setting {op}: enable model CPU offload') if shared.opts.diffusers_move_base or shared.opts.diffusers_move_unet or shared.opts.diffusers_move_refiner: shared.opts.diffusers_move_base = False shared.opts.diffusers_move_unet = False @@ -793,7 +793,7 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No sd_model.has_accelerate = True if hasattr(sd_model, "enable_sequential_cpu_offload"): if shared.cmd_opts.lowvram or shared.opts.diffusers_seq_cpu_offload: - shared.log.debug(f'Model {op}: enable sequential CPU offload') + shared.log.debug(f'Setting {op}: enable sequential CPU offload') if shared.opts.diffusers_move_base or shared.opts.diffusers_move_unet or shared.opts.diffusers_move_refiner: shared.opts.diffusers_move_base = False shared.opts.diffusers_move_unet = False @@ -803,19 +803,19 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No sd_model.has_accelerate = True if hasattr(sd_model, "enable_vae_slicing"): if shared.cmd_opts.lowvram or shared.opts.diffusers_vae_slicing: - shared.log.debug(f'Model {op}: enable VAE slicing') + shared.log.debug(f'Setting {op}: enable VAE slicing') sd_model.enable_vae_slicing() else: sd_model.disable_vae_slicing() if hasattr(sd_model, "enable_vae_tiling"): if shared.cmd_opts.lowvram or shared.opts.diffusers_vae_tiling: - shared.log.debug(f'Model {op}: enable VAE tiling') + shared.log.debug(f'Setting {op}: enable VAE tiling') sd_model.enable_vae_tiling() else: sd_model.disable_vae_tiling() if hasattr(sd_model, "enable_attention_slicing"): if shared.cmd_opts.lowvram or shared.opts.diffusers_attention_slicing: - shared.log.debug(f'Model {op}: enable attention slicing') + shared.log.debug(f'Setting {op}: enable attention slicing') sd_model.enable_attention_slicing() else: sd_model.disable_attention_slicing() @@ -832,11 +832,11 @@ def load_diffuser(checkpoint_info=None, already_loaded_state_dict=None, timer=No if shared.opts.no_half_vae: devices.dtype_vae = torch.float32 sd_model.vae.to(devices.dtype_vae) - shared.log.debug(f'Model {op} VAE: name={sd_vae.loaded_vae_file} upcast={sd_model.vae.config.get("force_upcast", None)}') + shared.log.debug(f'Setting {op} VAE: name={sd_vae.loaded_vae_file} upcast={sd_model.vae.config.get("force_upcast", None)}') if shared.opts.cross_attention_optimization == "xFormers" and hasattr(sd_model, 'enable_xformers_memory_efficient_attention'): sd_model.enable_xformers_memory_efficient_attention() if shared.opts.opt_channelslast: - shared.log.debug(f'Model {op}: enable channels last') + shared.log.debug(f'Setting {op}: enable channels last') sd_model.unet.to(memory_format=torch.channels_last) base_sent_to_cpu=False @@ -1163,20 +1163,21 @@ def disable_offload(sd_model): def unload_model_weights(op='model'): - from modules import sd_hijack if op == 'model' or op == 'dict': if model_data.sd_model: - if shared.backend == shared.Backend.ORIGINAL: + if shared.backend != shared.Backend.ORIGINAL: # moving from diffusers=>original + from modules import sd_hijack model_data.sd_model.to(devices.cpu) sd_hijack.model_hijack.undo_hijack(model_data.sd_model) - else: + else: # moving from original=>diffusers disable_offload(model_data.sd_model) model_data.sd_model.to('meta') model_data.sd_model = None shared.log.debug(f'Unload weights {op}: {memory_stats()}') else: if model_data.sd_refiner: - if shared.backend == shared.Backend.ORIGINAL: + if shared.backend != shared.Backend.ORIGINAL: + from modules import sd_hijack model_data.sd_model.to(devices.cpu) sd_hijack.model_hijack.undo_hijack(model_data.sd_refiner) else: