From 9a652338454db3f3a78ef70f385b67b38990e841 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 22 Apr 2023 11:23:17 -0400 Subject: [PATCH] update setup to deal with extensions preload --- README.md | 8 ++++--- extensions-builtin/a1111-sd-webui-lycoris | 2 +- javascript/dragdrop.js | 1 + javascript/imageParams.js | 1 + launch.py | 7 +++--- modules/errors.py | 2 ++ modules/script_loading.py | 5 ++++- modules/ui.py | 3 --- setup.py | 27 +++++++++++++++++------ 9 files changed, 38 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 1dfa6d2e1..5b98cde34 100644 --- a/README.md +++ b/README.md @@ -29,9 +29,9 @@ If you are looking an amazing simple-to-use Stable Diffusion tool, I'd suggest [ ### Fork does differ in few things - New installer -- New logger -- New error and exception handlers -- Enhanced environment tuning +- Advanced CUDA tuning + Available in UI Settings +- Advanced environment tuning - Optimized startup and models lazy-loading - Built-in performance profiler - Updated libraries to latest known compatible versions @@ -45,6 +45,8 @@ If you are looking an amazing simple-to-use Stable Diffusion tool, I'd suggest [ - Built-in `LoRA`, `LyCORIS`, `Custom Diffusion`, `Dreambooth` training - Majority of settings configurable via UI without the need for command line flags e.g, cross-optimization methods, system folders, etc. +- New logger +- New error and exception handlers ### Optimizations diff --git a/extensions-builtin/a1111-sd-webui-lycoris b/extensions-builtin/a1111-sd-webui-lycoris index d0db3f439..f39bc5598 160000 --- a/extensions-builtin/a1111-sd-webui-lycoris +++ b/extensions-builtin/a1111-sd-webui-lycoris @@ -1 +1 @@ -Subproject commit d0db3f439129a4979f4b27ec67e2dd69bb9d3058 +Subproject commit f39bc5598b3469aa8a3c757a47b28ee205b0e947 diff --git a/javascript/dragdrop.js b/javascript/dragdrop.js index fe0089248..e4cd41ec4 100644 --- a/javascript/dragdrop.js +++ b/javascript/dragdrop.js @@ -61,6 +61,7 @@ window.document.addEventListener('dragover', e => { window.document.addEventListener('drop', e => { const target = e.composedPath()[0]; + if (!target.placeholder) return; if (target.placeholder.indexOf("Prompt") == -1) { return; } diff --git a/javascript/imageParams.js b/javascript/imageParams.js index 67404a89b..8a4b1a098 100644 --- a/javascript/imageParams.js +++ b/javascript/imageParams.js @@ -1,6 +1,7 @@ window.onload = (function(){ window.addEventListener('drop', e => { const target = e.composedPath()[0]; + if (!target.placeholder) return; const idx = selected_gallery_index(); if (target.placeholder.indexOf("Prompt") == -1) return; diff --git a/launch.py b/launch.py index 244aad8b9..3c209160a 100644 --- a/launch.py +++ b/launch.py @@ -5,7 +5,7 @@ import shlex import logging import setup import modules.paths_internal -from modules import cmd_args +import modules.cmd_args setup.ensure_base_requirements() from rich import print # pylint: disable=redefined-builtin,wrong-import-order @@ -14,8 +14,9 @@ from rich import print # pylint: disable=redefined-builtin,wrong-import-order commandline_args = os.environ.get('COMMANDLINE_ARGS', "") sys.argv += shlex.split(commandline_args) +setup.extensions_preload() setup.parse_args() -args, _ = cmd_args.parser.parse_known_args() +args, _ = modules.cmd_args.parser.parse_known_args() script_path = modules.paths_internal.script_path extensions_dir = modules.paths_internal.extensions_dir git = os.environ.get('GIT', "git") @@ -89,10 +90,10 @@ def git_clone(url, tgt, _name, commithash=None): def run_extension_installer(ext_dir): setup.run_extension_installer(ext_dir) - if __name__ == "__main__": setup.run_setup() setup.set_environment() + setup.extensions_preload() setup.log.info(f"Server arguments: {sys.argv[1:]}") setup.log.debug('Starting WebUI') logging.disable(logging.INFO) diff --git a/modules/errors.py b/modules/errors.py index abd83cd41..181592d62 100644 --- a/modules/errors.py +++ b/modules/errors.py @@ -1,5 +1,6 @@ import sys import logging +import warnings from rich import print # pylint: disable=redefined-builtin from rich.console import Console from rich.theme import Theme @@ -18,6 +19,7 @@ already_displayed = {} def install(suppress=[]): + warnings.filterwarnings("ignore", category=UserWarning) pretty_install(console=console) traceback_install(console=console, extra_lines=1, width=console.width, word_wrap=False, indent_guides=False, suppress=suppress) logging.basicConfig(level=logging.INFO, format='%(asctime)s | %(levelname)s | %(pathname)s | %(message)s') diff --git a/modules/script_loading.py b/modules/script_loading.py index abfc05473..d93fd898f 100644 --- a/modules/script_loading.py +++ b/modules/script_loading.py @@ -12,12 +12,15 @@ def load_module(path): errors.display(e, f'Module load: {path}') return module +preloaded = [] def preload_extensions(extensions_dir, parser): if not os.path.isdir(extensions_dir): return - for dirname in sorted(os.listdir(extensions_dir)): + if dirname in preloaded: + continue + preloaded.append(dirname) preload_script = os.path.join(extensions_dir, dirname, "preload.py") if not os.path.isfile(preload_script): continue diff --git a/modules/ui.py b/modules/ui.py index 97455cbfa..e49266c94 100644 --- a/modules/ui.py +++ b/modules/ui.py @@ -3,7 +3,6 @@ import mimetypes import os import sys from functools import reduce -import warnings import gradio as gr import gradio.routes @@ -33,8 +32,6 @@ from modules.generation_parameters_copypaste import image_from_url_text import modules.extras errors.install() -warnings.filterwarnings("ignore", category=UserWarning) -# this is a fix for Windows users. Without it, javascript files will be served with text/html content-type and the browser will not show any UI mimetypes.init() mimetypes.add_type('application/javascript', '.js') diff --git a/setup.py b/setup.py index 2e205f7a7..572c34b73 100644 --- a/setup.py +++ b/setup.py @@ -361,6 +361,7 @@ def set_environment(): def check_extensions(): newest_all = os.path.getmtime('requirements.txt') + print(newest_all) from modules.paths_internal import extensions_builtin_dir, extensions_dir for folder in [extensions_builtin_dir, extensions_dir]: if not os.path.isdir(folder): @@ -370,9 +371,11 @@ def check_extensions(): newest = 0 extension_dir = os.path.join(folder, ext) for f in os.listdir(extension_dir): - if '.json' in f or '.csv' in f: + if '.json' in f or '.csv' in f or '__pycache__' in f: continue ts = os.path.getmtime(os.path.join(extension_dir, f)) + if ts > newest_all: + print(folder, ext, f) newest = max(newest, ts) newest_all = max(newest_all, newest) log.debug(f'Extension version: {time.ctime(newest)} {folder}{os.pathsep}{ext}') @@ -462,16 +465,26 @@ def parse_args(): parser.add_argument('--skip-requirements', default = False, action='store_true', help = "Skips checking and installing requirements, default: %(default)s") parser.add_argument('--skip-extensions', default = False, action='store_true', help = "Skips running individual extension installers, default: %(default)s") parser.add_argument('--skip-git', default = False, action='store_true', help = "Skips running all GIT operations, default: %(default)s") - log.info('Running extension preloading') - from modules.script_loading import preload_extensions - from modules.paths_internal import extensions_builtin_dir, extensions_dir - preload_extensions(extensions_dir, parser) - preload_extensions(extensions_builtin_dir, parser) - global args # pylint: disable=global-statement args = parser.parse_args() +def extensions_preload(): + setup_time = 0 + if os.path.isfile('setup.log'): + with open('setup.log', 'r', encoding='utf8') as f: + lines = f.readlines() + for line in lines: + if 'Setup complete without errors' in line: + setup_time = int(line.split(' ')[-1]) + if setup_time > 0: + log.info('Running extension preloading') + from modules.script_loading import preload_extensions + from modules.paths_internal import extensions_builtin_dir, extensions_dir + for ext_dir in [extensions_builtin_dir, extensions_dir]: + preload_extensions(ext_dir, parser) + + def git_reset(): log.warning('Running GIT reset') global quick_allowed # pylint: disable=global-statement