mirror of
https://github.com/vladmandic/automatic
synced 2026-09-19 17:24:32 +02:00
improve lora detection, logging and error handling
This commit is contained in:
+3
-1
@@ -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**:
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user