From d9b594e3a7f7ca3c6a61ae280da42b319e7399ab Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 26 Sep 2024 10:55:27 -0400 Subject: [PATCH] improve lora detection, logging and error handling --- CHANGELOG.md | 4 +++- .../Lora/extra_networks_lora.py | 6 +++--- extensions-builtin/Lora/networks.py | 21 +++++++++++-------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff026bc60..4697367c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2024-09-24 +## Update for 2024-09-26 - **reprocess** - new top-level button: reprocess your last generated image(s) @@ -54,6 +54,8 @@ - loras are no longer filtered per detected type vs loaded model type as its unreliable - loras display in networks now shows possible version in top-left corner - correct using of `extra_networks_default_multiplier` if not scale is specified + - improve lora base model detection + - improve lora error handling and logging - setting `lora_load_gpu` to load LoRA directly to GPU *default*: true unless lovwram - **huggingface**: diff --git a/extensions-builtin/Lora/extra_networks_lora.py b/extensions-builtin/Lora/extra_networks_lora.py index 39ae11342..f900f98a1 100644 --- a/extensions-builtin/Lora/extra_networks_lora.py +++ b/extensions-builtin/Lora/extra_networks_lora.py @@ -126,10 +126,10 @@ class ExtraNetworkLora(extra_networks.ExtraNetwork): names, te_multipliers, unet_multipliers, dyn_dims = self.parse(p, params_list, step) networks.load_networks(names, te_multipliers, unet_multipliers, dyn_dims) t2 = time.time() - if len(names) > 0 and step == 0: + if len(networks.loaded_networks) > 0 and step == 0: self.infotext(p) self.prompt(p) - shared.log.info(f'Load network: type=LoRA apply={names} patch={t1-t0:.2f} te={te_multipliers} unet={unet_multipliers} dims={dyn_dims} load={t2-t1:.2f}') + shared.log.info(f'Load network: type=LoRA apply={[n.name for n in networks.loaded_networks]} patch={t1-t0:.2f} te={te_multipliers} unet={unet_multipliers} dims={dyn_dims} load={t2-t1:.2f}') elif self.active: self.active = False @@ -156,5 +156,5 @@ class ExtraNetworkLora(extra_networks.ExtraNetwork): if self.errors: p.comment("Networks with errors: " + ", ".join(f"{k} ({v})" for k, v in self.errors.items())) for k, v in self.errors.items(): - shared.log.error(f'LoRA errors: file="{k}" errors={v}') + shared.log.error(f'LoRA: name="{k}" errors={v}') self.errors.clear() diff --git a/extensions-builtin/Lora/networks.py b/extensions-builtin/Lora/networks.py index 16328af0a..6e20b5a59 100644 --- a/extensions-builtin/Lora/networks.py +++ b/extensions-builtin/Lora/networks.py @@ -86,7 +86,7 @@ def load_diffusers(name, network_on_disk, lora_scale=shared.opts.extra_networks_ t0 = time.time() name = name.replace(".", "_") #cached = lora_cache.get(name, None) - shared.log.debug(f'Load network: type=LoRA name="{name}" file="{network_on_disk.filename}" type=diffusers scale={lora_scale} fuse={shared.opts.lora_fuse_diffusers}') + shared.log.debug(f'Load network: type=LoRA name="{name}" file="{network_on_disk.filename}" detected={network_on_disk.sd_version} method=diffusers scale={lora_scale} fuse={shared.opts.lora_fuse_diffusers}') # if cached is not None: # return cached if not shared.native: @@ -101,9 +101,9 @@ def load_diffusers(name, network_on_disk, lora_scale=shared.opts.extra_networks_ pass else: if 'The following keys have not been correctly renamed' in str(e): - shared.log.error(f'Load network: type=LoRA file="{network_on_disk.filename}" diffusers unsupported format') + shared.log.error(f'Load network: type=LoRA name="{name}" diffusers unsupported format') else: - shared.log.error(f'Load network: type=LoRA file="{network_on_disk.filename}" {e}') + shared.log.error(f'Load network: type=LoRA name="{name}" {e}') if debug: errors.display(e, "LoRA") return None @@ -169,10 +169,13 @@ def load_network(name, network_on_disk) -> network.Network: else: net.modules[key] = net_module if len(keys_failed_to_match) > 0: - shared.log.warning(f'LoRA file="{network_on_disk.filename}" unmatched={len(keys_failed_to_match)} matched={len(matched_networks)}') + shared.log.warning(f'LoRA name="{name}" type={set(network_types)} unmatched={len(keys_failed_to_match)} matched={len(matched_networks)}') if debug: - shared.log.debug(f'LoRA file="{network_on_disk.filename}" unmatched={keys_failed_to_match}') - shared.log.debug(f'LoRA file="{network_on_disk.filename}" type={set(network_types)} keys={len(matched_networks)}') + shared.log.debug(f'LoRA name="{name}" unmatched={keys_failed_to_match}') + else: + shared.log.debug(f'LoRA name="{name}" type={set(network_types)} keys={len(matched_networks)}') + if len(matched_networks) == 0: + return None lora_cache[name] = net t1 = time.time() net.bundle_embeddings = bundle_embeddings @@ -184,10 +187,10 @@ def load_networks(names, te_multipliers=None, unet_multipliers=None, dyn_dims=No if shared.opts.diffusers_offload_mode == "balanced": sd_models.disable_offload(shared.sd_model) sd_models.move_model(shared.sd_model, devices.cpu) - networks_on_disk = [available_network_aliases.get(name, None) for name in names] + networks_on_disk: list[network.NetworkOnDisk] = [available_network_aliases.get(name, None) for name in names] if any(x is None for x in networks_on_disk): list_available_networks() - networks_on_disk = [available_network_aliases.get(name, None) for name in names] + networks_on_disk: list[network.NetworkOnDisk] = [available_network_aliases.get(name, None) for name in names] failed_to_load_networks = [] recompile_model = False if shared.compiled_model_state is not None and shared.compiled_model_state.is_compiled: @@ -237,7 +240,7 @@ def load_networks(names, te_multipliers=None, unet_multipliers=None, dyn_dims=No continue if net is None: failed_to_load_networks.append(name) - shared.log.error(f'Load network: type=LoRA network="{name}" unknown type') + shared.log.error(f'Load network: type=LoRA name="{name}" detected={network_on_disk.sd_version} failed') continue if shared.native: shared.sd_model.embedding_db.load_diffusers_embedding(None, net.bundle_embeddings)