diff --git a/.gitignore b/.gitignore index 9e9eb30c7..a4e6a9a87 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ __pycache__ /params.txt /cache.json /setup.log +venv # all models and temp files *.ckpt diff --git a/TODO.md b/TODO.md index 1fcb098c7..104644418 100644 --- a/TODO.md +++ b/TODO.md @@ -14,6 +14,7 @@ Stuff to be fixed... - Investigate integration with `Torch-DirectML` - Set defaults for Apple M1 - Set defaults for CPU-only +- Support mupliple folders for models ## Integration diff --git a/extensions-builtin/sd-extension-system-info b/extensions-builtin/sd-extension-system-info index f9eea88c5..0567ac1cf 160000 --- a/extensions-builtin/sd-extension-system-info +++ b/extensions-builtin/sd-extension-system-info @@ -1 +1 @@ -Subproject commit f9eea88c59d8413d0665bf4fc7f93a36f03e79f9 +Subproject commit 0567ac1cf6e06e348dcb9da7a5b6b2476d7873a1 diff --git a/extensions-builtin/sd-webui-controlnet b/extensions-builtin/sd-webui-controlnet index e18851080..0f549888f 160000 --- a/extensions-builtin/sd-webui-controlnet +++ b/extensions-builtin/sd-webui-controlnet @@ -1 +1 @@ -Subproject commit e1885108055726638f0204aadf668064faf7eebc +Subproject commit 0f549888fd49aea48a4a5049f75c2e87ad3affad diff --git a/launch.py b/launch.py index eb1bf71aa..377270de4 100644 --- a/launch.py +++ b/launch.py @@ -87,6 +87,6 @@ if __name__ == "__main__": setup.run_setup(False) setup.set_environment() # setup.check_torch() - setup.log.info(f"Server Arguments: {sys.argv[1:]}") + setup.log.info(f"Server arguments: {sys.argv[1:]}") import webui webui.webui() diff --git a/modules/import_hook.py b/modules/import_hook.py index 3621bf81f..792302b33 100644 --- a/modules/import_hook.py +++ b/modules/import_hook.py @@ -1,6 +1,6 @@ import sys -from modules import shared +from modules.shared import opts # this will break any attempt to import xformers which will prevent stability diffusion repo from trying to use it -if shared.opts.cross_attention_optimization != "xFormers": +if opts.cross_attention_optimization != "xFormers": sys.modules["xformers"] = None diff --git a/setup.py b/setup.py index 3518630a2..7c2caf0b8 100644 --- a/setup.py +++ b/setup.py @@ -3,44 +3,45 @@ import sys import json import time import subprocess -import argparse +import logging from modules.cmd_args import parser -# command line args -# parser = argparse.ArgumentParser(description = 'Setup for SD WebUI') -parser.add_argument('--debug', default = False, action='store_true', help = "Run installer with debug logging, default: %(default)s") -parser.add_argument('--quick', default = False, action='store_true', help = "Skip installing if setup.log is newer than repo timestamp, default: %(default)s") -parser.add_argument('--upgrade', default = False, action='store_true', help = "Upgrade main repository to latest version, default: %(default)s") -parser.add_argument('--noupdate', default = False, action='store_true', help = "Skip update extensions and submodules, default: %(default)s") -parser.add_argument('--skip-extensions', default = False, action='store_true', help = "Skips running individual extension installers, default: %(default)s") -args = parser.parse_args() +class Dot(dict): # dot notation access to dictionary attributes + __getattr__ = dict.get + __setattr__ = dict.__setitem__ + __delattr__ = dict.__delitem__ + + +log = logging.getLogger("sd") +args = Dot({ 'debug': False, 'quick': False, 'upgrade': False, 'noupdate': False, 'skip-extensions': False }) # setup console and file logging -if os.path.isfile('setup.log'): - os.remove('setup.log') -time.sleep(0.1) # prevent race condition -import logging -logging.basicConfig(level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(pathname)s | %(message)s', filename='setup.log', filemode='a', encoding='utf-8', force=True) -log = logging.getLogger("sd") -print=print -try: # we may not have rich on the first run - from rich import print - from rich.logging import RichHandler - from rich.console import Console - from rich.pretty import install as pretty_install - from rich.traceback import install as traceback_install - console = Console(log_time=True, log_time_format='%H:%M:%S-%f') - pretty_install(console=console) - traceback_install(console=console, extra_lines=1, width=console.width, word_wrap=False, indent_guides=False, suppress=[]) - rh = RichHandler(show_time=True, omit_repeated_times=False, show_level=True, show_path=False, markup=False, rich_tracebacks=True, log_time_format='%H:%M:%S-%f', level=logging.DEBUG if args.debug else logging.INFO, console=console) - log.addHandler(rh) -except: - pass - sh = logging.StreamHandler() - sh.setLevel(logging.DEBUG if args.debug else logging.INFO) - log.addHandler(sh) +def setup_logging(): + try: + if os.path.isfile('setup.log'): + os.remove('setup.log') + time.sleep(0.1) # prevent race condition + except: + pass + logging.basicConfig(level=logging.DEBUG, format='%(asctime)s | %(levelname)s | %(pathname)s | %(message)s', filename='setup.log', filemode='a', encoding='utf-8', force=True) + try: # we may not have rich on the first run + from rich import print + from rich.logging import RichHandler + from rich.console import Console + from rich.pretty import install as pretty_install + from rich.traceback import install as traceback_install + console = Console(log_time=True, log_time_format='%H:%M:%S-%f') + pretty_install(console=console) + traceback_install(console=console, extra_lines=1, width=console.width, word_wrap=False, indent_guides=False, suppress=[]) + rh = RichHandler(show_time=True, omit_repeated_times=False, show_level=True, show_path=False, markup=False, rich_tracebacks=True, log_time_format='%H:%M:%S-%f', level=logging.DEBUG if args.debug else logging.INFO, console=console) + log.addHandler(rh) + except: + pass + sh = logging.StreamHandler() + sh.setLevel(logging.DEBUG if args.debug else logging.INFO) + log.addHandler(sh) def installed(package): @@ -56,8 +57,8 @@ def installed(package): if spec is None: spec = pkg_resources.working_set.by_key.get(p[0].replace('_', '-'), None) # check name variations ok = ok and spec is not None - version = pkg_resources.get_distribution(p[0]).version if ok and len(p) > 1: + version = pkg_resources.get_distribution(p[0]).version ok = ok and version == p[1] if not ok: log.warning(f"Package wrong version found: {p[0]} {version} required {p[1]}") @@ -326,8 +327,22 @@ def check_timestamp(): return setup_time >= version_time +def parse_args(): + # command line args + # parser = argparse.ArgumentParser(description = 'Setup for SD WebUI') + parser.add_argument('--debug', default = False, action='store_true', help = "Run installer with debug logging, default: %(default)s") + parser.add_argument('--quick', default = False, action='store_true', help = "Skip installing if setup.log is newer than repo timestamp, default: %(default)s") + parser.add_argument('--upgrade', default = False, action='store_true', help = "Upgrade main repository to latest version, default: %(default)s") + parser.add_argument('--noupdate', default = False, action='store_true', help = "Skip update extensions and submodules, default: %(default)s") + parser.add_argument('--skip-extensions', default = False, action='store_true', help = "Skips running individual extension installers, default: %(default)s") + global args + args = parser.parse_args() + + # entry method when used as module def run_setup(quick = False): + setup_logging() + parse_args() check_python() if (quick or args.quick) and check_timestamp(): log.info('Attempting quick setup') diff --git a/webui.py b/webui.py index 3ea656b12..945e2990e 100644 --- a/webui.py +++ b/webui.py @@ -9,8 +9,7 @@ from setup import log import logging logging.getLogger("xformers").addFilter(lambda record: 'A matching Triton is not available' not in record.getMessage()) - -from modules import paths, timer, import_hook, errors +from modules import paths, timer, errors startup_timer = timer.Timer() @@ -21,6 +20,7 @@ warnings.filterwarnings(action="ignore", category=DeprecationWarning, module="py warnings.filterwarnings(action="ignore", category=UserWarning, module="torchvision") startup_timer.record("torch") +from modules import import_hook import gradio import ldm.modules.encoders.modules