diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c47398af..f076ffac5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,19 @@ # Change Log for SD.Next -## Update for 2023-09-07 +## Update for 2023-09-10 Mostly a service release - tons of fixes - new option **inference mode** - default is standard `torch.no_grad` new option is `torch.inference_only` which is slightly faster and uses less vram, but only works on some gpus -- updated gradio -- styles support for subfolders +- new cmdline param `--no-metadata` + skips reading metadata from models that are not already cached +- updated gradio +- styles support for subfolders - clean-up logging - capture system info in startup log - - better diagnostic output + - better diagnostic output - capture extension output - capture ldm output - cleaner server restart diff --git a/extensions-builtin/Lora/lora.py b/extensions-builtin/Lora/lora.py index 607dd8e33..4705830b8 100644 --- a/extensions-builtin/Lora/lora.py +++ b/extensions-builtin/Lora/lora.py @@ -77,19 +77,16 @@ class LoraOnDisk: self.filename = filename self.metadata = {} self.is_safetensors = os.path.splitext(filename)[1].lower() == ".safetensors" - if self.is_safetensors: try: self.metadata = sd_models.read_metadata_from_safetensors(filename) except Exception as e: errors.display(e, f"reading lora metadata: {filename}") - if self.metadata: m = {} for k, v in sorted(self.metadata.items(), key=lambda x: metadata_tags_order.get(x[0], 999)): m[k] = v self.metadata = m - self.ssmd_cover_images = self.metadata.pop('ssmd_cover_images', None) # those are cover images and they are too big to display in UI as text self.alias = self.metadata.get('ss_output_name', self.name) self.hash = None @@ -442,19 +439,13 @@ def list_available_loras(): forbidden_lora_aliases.clear() available_lora_hash_lookup.clear() forbidden_lora_aliases.update({"none": 1, "Addams": 1}) - os.makedirs(shared.cmd_opts.lora_dir, exist_ok=True) - for filename in sorted([*filter(extension_filter(['.PT', '.CKPT', '.SAFETENSORS']), directory_files(shared.cmd_opts.lora_dir))], key=str.lower): - name = os.path.splitext(os.path.basename(filename))[0] entry = LoraOnDisk(name, filename) - available_loras[name] = entry - if entry.alias in available_lora_aliases: forbidden_lora_aliases[entry.alias.lower()] = 1 - available_lora_aliases[name] = entry available_lora_aliases[entry.alias] = entry diff --git a/extensions-builtin/Lora/ui_extra_networks_lora.py b/extensions-builtin/Lora/ui_extra_networks_lora.py index a06ab27d8..1327ea76f 100644 --- a/extensions-builtin/Lora/ui_extra_networks_lora.py +++ b/extensions-builtin/Lora/ui_extra_networks_lora.py @@ -13,13 +13,13 @@ class ExtraNetworksPageLora(ui_extra_networks.ExtraNetworksPage): lora.list_available_loras() def list_items(self): - for name, lora_on_disk in lora.available_loras.items(): - path, _ext = os.path.splitext(lora_on_disk.filename) - alias = lora_on_disk.get_alias() + for name, l in lora.available_loras.items(): + path, _ext = os.path.splitext(l.filename) + alias = l.get_alias() prompt = f" " prompt = json.dumps(prompt) - metadata = json.dumps(lora_on_disk.metadata, indent=4) if lora_on_disk.metadata else None - possible_tags = lora_on_disk.metadata.get('ss_tag_frequency', {}) if lora_on_disk.metadata is not None else {} + metadata = json.dumps(l.metadata, indent=4) if l.metadata else None + possible_tags = l.metadata.get('ss_tag_frequency', {}) if l.metadata is not None else {} if isinstance(possible_tags, str): possible_tags = {} shared.log.debug(f'Lora has invalid metadata: {path}') @@ -33,12 +33,12 @@ class ExtraNetworksPageLora(ui_extra_networks.ExtraNetworksPage): yield { "name": name, "filename": path, - "fullname": lora_on_disk.filename, - "hash": lora_on_disk.shorthash, + "fullname": l.filename, + "hash": l.shorthash, "preview": self.find_preview(path), "description": self.find_description(path), "info": self.find_info(path), - "search_term": self.search_terms_from_path(lora_on_disk.filename) + ' '.join(tags.keys()), + "search_term": self.search_terms_from_path(l.filename) + ' '.join(tags.keys()), "prompt": prompt, "local_preview": f"{path}.{shared.opts.samples_format}", "metadata": metadata, diff --git a/javascript/style.css b/javascript/style.css index b1255e14d..c563f0a78 100644 --- a/javascript/style.css +++ b/javascript/style.css @@ -19,7 +19,7 @@ div.gradio-html.min{ min-height: 0; } .gradio-dropdown label span:not(.has-info), .gradio-textbox label span:not(.has-info), .gradio-number label span:not(.has-info) { margin-bottom: 0; } .gradio-dropdown ul.options li.item { padding: 0.05em 0; } .gradio-dropdown ul.options li.item:not(:has(.hide)) { background-color: var(--neutral-100); } -.gradio-dropdown ul.options { z-index: 3000; min-width: fit-content; max-width: inherit; max-height: 25vh !important; white-space: nowrap; } +.gradio-dropdown ul.options { z-index: 3000; min-width: fit-content; max-width: fit-content; max-height: 25vh !important; white-space: nowrap; } .gradio-dropdown:not(.multiselect) .wrap-inner.wrap-inner.wrap-inner{ flex-wrap: unset; } .gradio-dropdown.multiselect .token-remove.remove-all.remove-all{ display: flex; } .gradio-dropdown.multiselect div.wrap-inner { overflow-x: hidden; overflow-y: auto; max-height: 50vh; overflow-wrap: anywhere; } @@ -120,7 +120,7 @@ div#extras_scale_to_tab div.form{ flex-direction: row; } #quicksettings > button { margin-left: -0.5em; } #settings { display: flex; gap: var(--layout-gap); } -#settings div { border: none; justify-content: normal; gap: 0.5em; } +#settings div { border: none; gap: 0.5em; width: fit-content; } #settings > div.tab-content { flex: 10 0 75%; display: grid; } #settings > div.tab-content > div { border: none; padding: 0; } diff --git a/modules/cmd_args.py b/modules/cmd_args.py index 41b6340da..23e13c08b 100644 --- a/modules/cmd_args.py +++ b/modules/cmd_args.py @@ -36,6 +36,7 @@ group.add_argument("--tls-certfile", type=str, help="Enable TLS and specify cert group.add_argument("--tls-selfsign", action="store_true", help="Enable TLS with self-signed certificates, default: %(default)s", default=None) group.add_argument("--server-name", type=str, help="Sets hostname of server, default: %(default)s", default=None) group.add_argument("--no-hashing", action='store_true', help="Disable hashing of checkpoints, default: %(default)s", default=False) +group.add_argument("--no-metadata", action='store_true', help="Disable reading of metadata from models, default: %(default)s", default=False) group.add_argument("--no-download", action='store_true', help="Disable download of default model, default: %(default)s", default=False) group.add_argument("--profile", action='store_true', help="Run profiler, default: %(default)s") group.add_argument("--disable-queue", action='store_true', help="Disable queues, default: %(default)s") diff --git a/modules/sd_models.py b/modules/sd_models.py index 14b78921a..90795368a 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -321,6 +321,8 @@ def read_metadata_from_safetensors(filename): if res is not None: return res res = {} + if shared.cmd_opts.no_metadata: + return {} try: t0 = time.time() with open(filename, mode="rb") as file: diff --git a/wiki b/wiki index de31c082f..c069991c3 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit de31c082f8bc04ebf33667587320bbafa469f4c1 +Subproject commit c069991c32e4bdc5c7355062868550f8459f3df0