From d878970873f1a21fb2f59104686d0dcfb12d57b8 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 5 Nov 2023 11:07:39 -0500 Subject: [PATCH] add reference models --- .eslintrc.json | 4 +-- .gitignore | 4 ++- CHANGELOG.md | 3 ++ html/reference.json | 40 +++++++++++++++++++++++ installer.py | 2 -- javascript/extensions.js | 2 +- javascript/settings.js | 2 +- javascript/ui.js | 28 +++++++++------- models/Reference/unidiffuser-v1.jpg | Bin 0 -> 48568 bytes modules/modelloader.py | 30 ++++++++++++++--- modules/ui.py | 21 ++++++++++-- modules/ui_extra_networks.py | 14 +++++--- modules/ui_extra_networks_checkpoints.py | 35 +++++++++++++++++--- 13 files changed, 150 insertions(+), 35 deletions(-) create mode 100644 html/reference.json create mode 100644 models/Reference/unidiffuser-v1.jpg diff --git a/.eslintrc.json b/.eslintrc.json index ca36cce73..3d73788c3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -68,11 +68,11 @@ "switch_to_extras": "readonly", "get_tab_index": "readonly", "create_submit_args": "readonly", - "restart_reload": "readonly", + "restartReload": "readonly", "updateInput": "readonly", "toggleCompact": "readonly", // settings.js - "register_drag_drop": "readonly", + "registerDragDrop": "readonly", //extraNetworks.js "requestGet": "readonly", "getENActiveTab": "readonly", diff --git a/.gitignore b/.gitignore index ec0afa225..32c9bf88d 100644 --- a/.gitignore +++ b/.gitignore @@ -58,6 +58,8 @@ cache .idea/ /localizations -# unexcluded so folders get created +# force included !/models/VAE-approx !/models/VAE-approx/model.pt +!/models/Reference +!/models/Reference/**/* diff --git a/CHANGELOG.md b/CHANGELOG.md index b7edc215d..1b8dbdce2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ Also, [Wiki](https://github.com/vladmandic/automatic/wiki) has been updated with Some highlights: [OpenVINO](https://github.com/vladmandic/automatic/wiki/OpenVINO), [IntelArc](https://github.com/vladmandic/automatic/wiki/Intel-ARC), [DirectML](https://github.com/vladmandic/automatic/wiki/DirectML), [ONNX/Olive>](https://github.com/vladmandic/automatic/wiki/ONNX-Runtime) - **Diffusers** + - since now **SD.Next** supports **12** different model types, we've added reference model for each type in + *Extra networks -> Reference* for easier select & auto-download + Models can still be downloaded manually, this is just a convenience feature & a showcase for supported models - new model type: [Segmind SSD-1B](https://huggingface.co/segmind/SSD-1B) its a *distilled* model, this time 50% smaller and faster version of SD-XL! (and quality does not suffer, its just more optimized) diff --git a/html/reference.json b/html/reference.json new file mode 100644 index 000000000..4a1ad9d34 --- /dev/null +++ b/html/reference.json @@ -0,0 +1,40 @@ +{ + "RunwayML SD 1.5": { + "path": "runwayml/stable-diffusion-v1-5" + }, + "StabilityAI SD 2.1": { + "path": "stabilityai/stable-diffusion-2-1-base" + }, + "StabilityAI SD-XL 1.0 Base": { + "path": "stabilityai/stable-diffusion-xl-base-1.0" + }, + "Segmind SSD-1B": { + "path": "segmind/SSD-1B" + }, + "Segmind Tiny": { + "path": "segmind/tiny-sd" + }, + "LCM Dreamshaper 7": { + "path": "SimianLuo/LCM_Dreamshaper_v7" + }, + "Warp Wuerstchen": { + "path": "warp-ai/wuerstchen" + }, + "Kandinsky 2.1": { + "path": "kandinsky-community/kandinsky-2-1" + }, + "Kandinsky 2.2": { + "path": "kandinsky-community/kandinsky-2-2-decoder" + }, + "DeepFloyd IF Medium": { + "path": "DeepFloyd/IF-I-M-v1.0" + }, + "Tsinghua UniDiffuser": { + "path": "thu-ml/unidiffuser-v1", + "desc": "UniDiffuser is a unified diffusion framework to fit all distributions relevant to a set of multi-modal data in one transformer. UniDiffuser is able to perform image, text, text-to-image, image-to-text, and image-text pair generation by setting proper timesteps without additional overhead.\nSpecifically, UniDiffuser employs a variation of transformer, called U-ViT, which parameterizes the joint noise prediction network. Other components perform as encoders and decoders of different modalities, including a pretrained image autoencoder from Stable Diffusion, a pretrained image ViT-B/32 CLIP encoder, a pretrained text ViT-L CLIP encoder, and a GPT-2 text decoder finetuned by ourselves.", + "preview": "unidiffuser-v1.jpg" + }, + "Sudo-AI Zero123": { + "path": "sudo-ai/zero123plus-v1.1" + } +} diff --git a/installer.py b/installer.py index c44e27a63..01a48ad8e 100644 --- a/installer.py +++ b/installer.py @@ -508,8 +508,6 @@ def check_torch(): import xformers if torch.__version__ != '2.0.1+cu118' and xformers.__version__ in ['0.0.22', '0.0.21', '0.0.20']: log.warning(f'Likely incompatible torch with: xformers=={xformers.__version__} installed: torch=={torch.__version__} required: torch==2.1.0+cu118 - build xformers manually or downgrade torch') - if 'cu118' not in torch.__version__: - log.warning(f'Likely incompatible Cuda with: xformers=={xformers.__version__} installed: torch=={torch.__version__} required: torch==2.1.0+cu118 - build xformers manually or downgrade torch') elif not args.experimental and not args.use_xformers: uninstall('xformers') except Exception as e: diff --git a/javascript/extensions.js b/javascript/extensions.js index 1e56a9a36..f94f9b57d 100644 --- a/javascript/extensions.js +++ b/javascript/extensions.js @@ -5,7 +5,7 @@ function extensions_apply(extensions_disabled_list, extensions_update_list, disa if (x.name.startsWith('enable_') && !x.checked) disable.push(x.name.substring(7)); if (x.name.startsWith('update_') && x.checked) update.push(x.name.substring(7)); }); - restart_reload(); + restartReload(); log('Extensions apply:', { disable, update }); return [JSON.stringify(disable), JSON.stringify(update), disable_all]; } diff --git a/javascript/settings.js b/javascript/settings.js index 3cd84b52a..dacc8bd87 100644 --- a/javascript/settings.js +++ b/javascript/settings.js @@ -89,7 +89,7 @@ onAfterUiUpdate(async () => { const jsdata = textarea.value; updateOpts(jsdata); executeCallbacks(optionsChangedCallbacks); - register_drag_drop(); + registerDragDrop(); Object.defineProperty(textarea, 'value', { set(newValue) { diff --git a/javascript/ui.js b/javascript/ui.js index 028cc9fd9..8581fa3db 100644 --- a/javascript/ui.js +++ b/javascript/ui.js @@ -211,7 +211,7 @@ function recalculate_prompts_inpaint(...args) { return Array.from(arguments); } -function register_drag_drop() { +function registerDragDrop() { const qs = gradioApp().getElementById('quicksettings'); if (!qs) return; qs.addEventListener('dragover', (evt) => { @@ -297,7 +297,7 @@ function getTranslation(...args) { return null; } -function monitor_server_status() { +function monitorServerStatus() { document.open(); document.write(` @@ -305,12 +305,12 @@ function monitor_server_status() {

Waiting for server...

@@ -318,12 +318,12 @@ function monitor_server_status() { document.close(); } -function restart_reload() { +function restartReload() { document.body.style = 'background: #222222; font-size: 1rem; font-family:monospace; margin-top:20%; color:lightgray; text-align:center'; document.body.innerHTML = '

Server shutdown in progress...

'; fetch('/sdapi/v1/progress') - .then((res) => setTimeout(restart_reload, 1000)) - .catch((e) => setTimeout(monitor_server_status, 500)); + .then((res) => setTimeout(restartReload, 1000)) + .catch((e) => setTimeout(monitorServerStatus, 500)); return []; } @@ -351,6 +351,12 @@ function selectVAE(name) { log(`Change VAE: ${desiredVAEName}`); } +function selectReference(name) { + console.log('HERE', name); + desiredCheckpointName = name; + gradioApp().getElementById('change_reference').click(); +} + function currentImg2imgSourceResolution(_a, _b, scaleBy) { const img = gradioApp().querySelector('#mode_img2img > div[style="display: block;"] img'); return img ? [img.naturalWidth, img.naturalHeight, scaleBy] : [0, 0, scaleBy]; @@ -361,7 +367,7 @@ function updateImg2imgResizeToTextAfterChangingImage() { return []; } -function create_theme_element() { +function createThemeElement() { const el = document.createElement('img'); el.id = 'theme-preview'; el.className = 'theme-preview'; @@ -393,7 +399,7 @@ function previewTheme() { if (theme) { window.open(theme.subdomain, '_blank'); } else { - const el = document.getElementById('theme-preview') || create_theme_element(); + const el = document.getElementById('theme-preview') || createThemeElement(); el.style.display = el.style.display === 'block' ? 'none' : 'block'; name = name.replace('/', '-'); el.src = `/file=html/${name}.jpg`; diff --git a/models/Reference/unidiffuser-v1.jpg b/models/Reference/unidiffuser-v1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72f104c952ec427f0f764ea7172b2137391fc0f5 GIT binary patch literal 48568 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 DuJJVZ literal 0 HcmV?d00001 diff --git a/modules/modelloader.py b/modules/modelloader.py index 86cfdf3c7..4d4858cec 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -213,21 +213,24 @@ def download_diffusers_model(hub_id: str, cache_dir: str = None, download_config pipeline_dir = None ok = True + err = None try: pipeline_dir = DiffusionPipeline.download(hub_id, **download_config) except Exception as e: + err = e ok = False - shared.log.warning(f"Diffusers download error: {hub_id} {e}") - if not ok: + # shared.log.warning(f"Diffusers download error: {hub_id} {e}") + if not ok and 'Repository Not Found' not in str(err): try: download_config.pop('load_connected_pipeline') download_config.pop('variant') pipeline_dir = hf.snapshot_download(hub_id, **download_config) - except Exception as e: - shared.log.warning(f"Diffusers hub download error: {hub_id} {e}") + except Exception: + # shared.log.warning(f"Diffusers download error: {hub_id} {e}") + pass if pipeline_dir is None: - shared.log.error(f"Diffusers no pipeline folder: {hub_id}") + shared.log.error(f"Diffusers download error: {hub_id} {err}") return None try: # TODO diffusers is this real error? @@ -314,6 +317,23 @@ def find_diffuser(name: str): return None +def load_reference(name: str): + found = [r for r in diffuser_repos if name == r['name'] or name == r['friendly'] or name == r['path']] + if len(found) > 0: # already downloaded + shared.log.debug(f'Reference model: {found[0]}') + return True + shared.log.debug(f'Reference download: {name}') + model_dir = download_diffusers_model(name, shared.opts.diffusers_dir) + if model_dir is None: + shared.log.debug(f'Reference download failed: {name}') + return False + else: + shared.log.debug(f'Reference download complete: {name}') + from modules import sd_models + sd_models.list_models() + return True + + modelloader_directories = {} cache_last = 0 cache_time = 1 diff --git a/modules/ui.py b/modules/ui.py index 361c82e23..f18fc1456 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -1157,9 +1157,9 @@ def create_ui(startup_timer = None): inputs=components, outputs=[text_settings, result], ) - defaults_submit.click(fn=lambda: modules.shared.restore_defaults(restart=True), _js="restart_reload") - restart_submit.click(fn=lambda: modules.shared.restart_server(restart=True), _js="restart_reload") - shutdown_submit.click(fn=lambda: modules.shared.restart_server(restart=False), _js="restart_reload") + defaults_submit.click(fn=lambda: modules.shared.restore_defaults(restart=True), _js="restartReload") + restart_submit.click(fn=lambda: modules.shared.restart_server(restart=True), _js="restartReload") + shutdown_submit.click(fn=lambda: modules.shared.restart_server(restart=False), _js="restartReload") for _i, k, _item in quicksettings_list: component = component_dict[k] @@ -1194,6 +1194,21 @@ def create_ui(startup_timer = None): outputs=[component_dict['sd_vae'], text_settings], ) + def reference_submit(model): + from modules import modelloader + loaded = modelloader.load_reference(model) + if loaded: + return model if loaded else opts.sd_model_checkpoint + print('HERE', model, loaded) + return loaded + + button_set_reference = gr.Button('Change reference', elem_id='change_reference', visible=False) + button_set_reference.click( + fn=reference_submit, + _js="function(v){ return desiredCheckpointName; }", + inputs=[component_dict['sd_model_checkpoint']], + outputs=[component_dict['sd_model_checkpoint']], + ) component_keys = [k for k in opts.data_labels.keys() if k in component_dict] def get_settings_values(): diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index 9a9257d39..1804a1199 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -15,10 +15,11 @@ from collections import OrderedDict import gradio as gr from PIL import Image from starlette.responses import FileResponse, JSONResponse -from modules import shared, scripts, modelloader +from modules import paths, shared, scripts, modelloader from modules.ui_components import ToolButton import modules.ui_symbols as symbols + allowed_dirs = [] dir_cache = {} # key=path, value=(mtime, listdir(path)) refresh_time = 0 @@ -238,8 +239,11 @@ class ExtraNetworksPage: allowed_folders = [os.path.abspath(x) for x in self.allowed_directories_for_previews()] for parentdir, dirs in {d: modelloader.directory_directories(d) for d in allowed_folders}.items(): for tgt in dirs.keys(): - if shared.opts.diffusers_dir in tgt: - subdirs[os.path.basename(shared.opts.diffusers_dir)] = 1 + if shared.backend == shared.Backend.DIFFUSERS: + if os.path.join(paths.models_path, 'Reference') in tgt: + subdirs['Reference'] = 1 + if shared.opts.diffusers_dir in tgt: + subdirs[os.path.basename(shared.opts.diffusers_dir)] = 1 if 'models--' in tgt: continue subdir = tgt[len(parentdir):].replace("\\", "/") @@ -737,7 +741,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): return ui_refresh_click(title) def ui_save_click(): - from modules import paths, generation_parameters_copypaste + from modules import generation_parameters_copypaste filename = os.path.join(paths.data_path, "params.txt") if os.path.exists(filename): with open(filename, "r", encoding="utf8") as file: @@ -749,7 +753,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): return res def ui_quicksave_click(name): - from modules import paths, generation_parameters_copypaste + from modules import generation_parameters_copypaste fn = os.path.join(paths.data_path, "params.txt") if os.path.exists(fn): with open(fn, "r", encoding="utf8") as file: diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index ee01e54cd..30849c088 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -1,8 +1,9 @@ import html import json import os -from modules import shared, ui_extra_networks, sd_models +from modules import shared, ui_extra_networks, sd_models, paths +reference_dir = os.path.join(paths.models_path, 'Reference') class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): def __init__(self): @@ -11,11 +12,35 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): def refresh(self): shared.refresh_checkpoints() + def list_reference(self): + if shared.backend != shared.Backend.DIFFUSERS: + return [] + reference_models = shared.readfile(os.path.join('html', 'reference.json')) + for k, v in reference_models.items(): + name = os.path.join(reference_dir, k) + yield { + "type": 'Model', + "name": name, + "title": name, + "filename": v['path'], + "search_term": self.search_terms_from_path(name), + "preview": self.find_preview(os.path.join(reference_dir, os.path.basename(v['path']))), + "local_preview": f"{os.path.splitext(name)[0]}.{shared.opts.samples_format}", + "onclick": '"' + html.escape(f"""return selectReference({json.dumps(v['path'])})""") + '"', + "hash": None, + "mtime": 0, + "size": 0, + "info": {}, + "metadata": {}, + "description": v.get('desc', ''), + } + def list_items(self): checkpoint: sd_models.CheckpointInfo checkpoints = sd_models.checkpoints_list.copy() for name, checkpoint in checkpoints.items(): try: + exists = os.path.exists(checkpoint.filename) record = { "type": 'Model', "name": checkpoint.name, @@ -27,14 +52,16 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): "local_preview": f"{os.path.splitext(checkpoint.filename)[0]}.{shared.opts.samples_format}", "metadata": checkpoint.metadata, "onclick": '"' + html.escape(f"""return selectCheckpoint({json.dumps(name)})""") + '"', - "mtime": os.path.getmtime(checkpoint.filename), - "size": os.path.getsize(checkpoint.filename), + "mtime": os.path.getmtime(checkpoint.filename) if exists else 0, + "size": os.path.getsize(checkpoint.filename) if exists else 0, } record["info"] = self.find_info(checkpoint.filename) record["description"] = self.find_description(checkpoint.filename, record["info"]) yield record except Exception as e: shared.log.debug(f"Extra networks error: type=model file={name} {e}") + for record in self.list_reference(): + yield record def allowed_directories_for_previews(self): - return [v for v in [shared.opts.ckpt_dir, shared.opts.diffusers_dir, sd_models.model_path] if v is not None] + return [v for v in [shared.opts.ckpt_dir, shared.opts.diffusers_dir, reference_dir, sd_models.model_path] if v is not None]