mirror of https://github.com/vladmandic/automatic
remove dependency on pkg_resources and refactor cmd_args
parent
6fdd3a53cf
commit
e9eadd06db
|
|
@ -54,6 +54,9 @@ TBD
|
|||
- refactor: all image handling to `modules/image/`
|
||||
- refactor: captioning part-2, thanks @CalamitousFelicitousness
|
||||
- refactor: remove face restoration, thanks @CalamitousFelicitousness
|
||||
- refactor: unified command line parsing
|
||||
- refactor: launch use threads to async execute non-critical tasks
|
||||
- refactor: switch from deprecated `pkg_resources` to `importlib`
|
||||
- update `lint` rules, thanks @awsr
|
||||
- remove requirements: `clip`, `open-clip`
|
||||
- update `requirements`
|
||||
|
|
|
|||
144
installer.py
144
installer.py
|
|
@ -12,6 +12,7 @@ import subprocess
|
|||
import cProfile
|
||||
import importlib
|
||||
import importlib.util
|
||||
import importlib.metadata
|
||||
|
||||
|
||||
class Dot(dict): # dot notation access to dictionary attributes
|
||||
|
|
@ -27,7 +28,7 @@ version = {
|
|||
'url': 'unknown',
|
||||
'kanvas': 'unknown',
|
||||
}
|
||||
pkg_resources, setuptools, distutils = None, None, None # defined via ensure_base_requirements
|
||||
setuptools, distutils = None, None # defined via ensure_base_requirements
|
||||
current_branch = None
|
||||
log = logging.getLogger("sd")
|
||||
console = None
|
||||
|
|
@ -340,25 +341,23 @@ def print_profile(profiler: cProfile.Profile, msg: str):
|
|||
|
||||
|
||||
def package_version(package):
|
||||
global pkg_resources # pylint: disable=global-statement
|
||||
if pkg_resources is None:
|
||||
import pkg_resources # pylint: disable=redefined-outer-name
|
||||
try:
|
||||
return pkg_resources.get_distribution(package).version
|
||||
return importlib.metadata.version(package)
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
||||
def package_spec(package):
|
||||
global pkg_resources # pylint: disable=global-statement
|
||||
if pkg_resources is None:
|
||||
import pkg_resources # pylint: disable=redefined-outer-name
|
||||
spec = pkg_resources.working_set.by_key.get(package, None) # more reliable than importlib
|
||||
if spec is None:
|
||||
spec = pkg_resources.working_set.by_key.get(package.lower(), None) # check name variations
|
||||
if spec is None:
|
||||
spec = pkg_resources.working_set.by_key.get(package.replace('_', '-'), None) # check name variations
|
||||
return spec
|
||||
try:
|
||||
return importlib.metadata.distribution(package)
|
||||
except Exception:
|
||||
try:
|
||||
return importlib.metadata.distribution(package.lower())
|
||||
except Exception:
|
||||
try:
|
||||
return importlib.metadata.distribution(package.replace('_', '-'))
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
||||
# check if package is installed
|
||||
|
|
@ -366,11 +365,6 @@ def installed(package, friendly: str = None, reload = False, quiet = False): # p
|
|||
t_start = time.time()
|
||||
ok = True
|
||||
try:
|
||||
if reload:
|
||||
try:
|
||||
importlib.reload(pkg_resources)
|
||||
except Exception:
|
||||
pass
|
||||
if friendly:
|
||||
pkgs = friendly.split()
|
||||
else:
|
||||
|
|
@ -500,10 +494,7 @@ def install(package, friendly: str = None, ignore: bool = False, reinstall: bool
|
|||
isolation = '' if not no_build_isolation else '--no-build-isolation '
|
||||
cmd = f"install{' --upgrade' if not args.uv else ''}{' --force-reinstall' if force else ''} {deps}{isolation}{package}"
|
||||
res = pip(cmd, ignore=ignore, uv=package != "uv" and not package.startswith('git+'))
|
||||
try:
|
||||
importlib.reload(pkg_resources)
|
||||
except Exception:
|
||||
pass
|
||||
pass
|
||||
ts('install', t_start)
|
||||
return res
|
||||
|
||||
|
|
@ -693,7 +684,7 @@ def check_diffusers():
|
|||
target_commit = 'bcbbded7c3fc873343a7c8f8a63d91d5c727a4a3' # diffusers commit hash
|
||||
# if args.use_rocm or args.use_zluda or args.use_directml:
|
||||
# sha = '043ab2520f6a19fce78e6e060a68dbc947edb9f9' # lock diffusers versions for now
|
||||
pkg = pkg_resources.working_set.by_key.get('diffusers', None)
|
||||
pkg = package_spec('diffusers')
|
||||
minor = int(pkg.version.split('.')[1] if pkg is not None else -1)
|
||||
current = opts.get('diffusers_version', '') if minor > -1 else ''
|
||||
if (minor == -1) or ((current != target_commit) and (not args.experimental)):
|
||||
|
|
@ -715,8 +706,8 @@ def check_transformers():
|
|||
t_start = time.time()
|
||||
if args.skip_all or args.skip_git or args.experimental:
|
||||
return
|
||||
pkg_transformers = pkg_resources.working_set.by_key.get('transformers', None)
|
||||
pkg_tokenizers = pkg_resources.working_set.by_key.get('tokenizers', None)
|
||||
pkg_transformers = package_spec('transformers')
|
||||
pkg_tokenizers = package_spec('tokenizers')
|
||||
if args.use_directml:
|
||||
target_transformers = '4.52.4'
|
||||
target_tokenizers = '0.21.4'
|
||||
|
|
@ -1072,7 +1063,7 @@ def check_torch():
|
|||
try:
|
||||
if args.use_directml and allow_directml:
|
||||
import torch_directml # pylint: disable=import-error
|
||||
dml_ver = pkg_resources.get_distribution("torch-directml")
|
||||
dml_ver = package_version("torch-directml")
|
||||
log.warning(f'Torch backend: DirectML ({dml_ver})')
|
||||
log.warning('DirectML: end-of-life')
|
||||
for i in range(0, torch_directml.device_count()):
|
||||
|
|
@ -1165,8 +1156,7 @@ def install_extensions(force=False):
|
|||
if args.profile:
|
||||
pr = cProfile.Profile()
|
||||
pr.enable()
|
||||
pkg_resources._initialize_master_working_set() # pylint: disable=protected-access
|
||||
pkgs = [f'{p.project_name}=={p._version}' for p in pkg_resources.working_set] # pylint: disable=protected-access,not-an-iterable
|
||||
pkgs = [f"{d.metadata['Name']}=={d.version}" for d in importlib.metadata.distributions()]
|
||||
log.debug(f'Installed packages: {len(pkgs)}')
|
||||
from modules.paths import extensions_builtin_dir, extensions_dir
|
||||
extensions_duplicates = []
|
||||
|
|
@ -1199,9 +1189,8 @@ def install_extensions(force=False):
|
|||
log.debug(f'Extension force: name="{ext}" commit={commit}')
|
||||
res.append(git(f'checkout {commit}', os.path.join(folder, ext)))
|
||||
run_extension_installer(os.path.join(folder, ext))
|
||||
pkg_resources._initialize_master_working_set() # pylint: disable=protected-access
|
||||
try:
|
||||
updated = [f'{p.project_name}=={p._version}' for p in pkg_resources.working_set] # pylint: disable=protected-access,not-an-iterable
|
||||
updated = [f"{d.metadata['Name']}=={d.version}" for d in importlib.metadata.distributions()]
|
||||
diff = [x for x in updated if x not in pkgs]
|
||||
pkgs = updated
|
||||
if len(diff) > 0:
|
||||
|
|
@ -1274,11 +1263,11 @@ def ensure_base_requirements():
|
|||
|
||||
def update_setuptools():
|
||||
local_log = logging.getLogger('sdnext.installer')
|
||||
global pkg_resources, setuptools, distutils # pylint: disable=global-statement
|
||||
global setuptools, distutils # pylint: disable=global-statement
|
||||
# python may ship with incompatible setuptools
|
||||
subprocess.run(f'"{sys.executable}" -m pip install setuptools=={setuptools_version}', shell=True, check=False, env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
# need to delete all references to modules to be able to reload them otherwise python will use cached version
|
||||
modules = [m for m in sys.modules if m.startswith('setuptools') or m.startswith('pkg_resources') or m.startswith('distutils')]
|
||||
modules = [m for m in sys.modules if m.startswith('setuptools') or m.startswith('distutils')]
|
||||
for m in modules:
|
||||
del sys.modules[m]
|
||||
try:
|
||||
|
|
@ -1296,16 +1285,15 @@ def ensure_base_requirements():
|
|||
local_log.critical(f'Import: distutils {e}')
|
||||
os._exit(1)
|
||||
try:
|
||||
pkg_resources = importlib.import_module('pkg_resources')
|
||||
sys.modules['pkg_resources'] = pkg_resources
|
||||
distutils = importlib.import_module('distutils')
|
||||
sys.modules['distutils'] = distutils
|
||||
except ImportError as e:
|
||||
local_log.info(f'Python: version={platform.python_version()} platform={platform.system()} bin="{sys.executable}" venv="{sys.prefix}"')
|
||||
local_log.critical(f'Import: pkg_resources {e}')
|
||||
local_log.critical(f'Import: distutils {e}')
|
||||
os._exit(1)
|
||||
|
||||
try:
|
||||
global pkg_resources, setuptools # pylint: disable=global-statement
|
||||
import pkg_resources # pylint: disable=redefined-outer-name
|
||||
global setuptools # pylint: disable=global-statement
|
||||
import setuptools # pylint: disable=redefined-outer-name
|
||||
if setuptools.__version__ != setuptools_version:
|
||||
update_setuptools()
|
||||
|
|
@ -1705,6 +1693,25 @@ def update_wiki():
|
|||
ts('wiki', t_start)
|
||||
|
||||
|
||||
def run_deferred_tasks():
|
||||
t_start = time.time()
|
||||
log.debug('Starting deferred tasks')
|
||||
time.sleep(1.0) # wait for server to start
|
||||
try:
|
||||
check_version()
|
||||
except Exception as e:
|
||||
log.error(f'Deferred task error: check_version {e}')
|
||||
try:
|
||||
check_modified_files()
|
||||
except Exception as e:
|
||||
log.error(f'Deferred task error: check_modified_files {e}')
|
||||
try:
|
||||
update_wiki()
|
||||
except Exception as e:
|
||||
log.error(f'Deferred task error: update_wiki {e}')
|
||||
log.debug(f'Deferred tasks complete: time={round(time.time() - t_start, 2)}')
|
||||
|
||||
|
||||
# check if we can run setup in quick mode
|
||||
def check_timestamp():
|
||||
if not quick_allowed or not os.path.isfile(log_file):
|
||||
|
|
@ -1743,6 +1750,7 @@ def check_timestamp():
|
|||
return ok
|
||||
|
||||
|
||||
|
||||
def add_args(parser):
|
||||
import argparse
|
||||
group_install = parser.add_argument_group('Install')
|
||||
|
|
@ -1760,66 +1768,6 @@ def add_args(parser):
|
|||
group_install.add_argument('--skip-all', default=os.environ.get("SD_SKIPALL",False), action='store_true', help="Skips running all checks, default: %(default)s")
|
||||
group_install.add_argument('--skip-env', default=os.environ.get("SD_SKIPENV",False), action='store_true', help="Skips setting of env variables during startup, default: %(default)s")
|
||||
|
||||
group_compute = parser.add_argument_group('Compute Engine')
|
||||
group_compute.add_argument("--device-id", type=str, default=os.environ.get("SD_DEVICEID", None), help="Select the default GPU device to use, default: %(default)s")
|
||||
group_compute.add_argument("--use-cuda", default=os.environ.get("SD_USECUDA",False), action='store_true', help="Force use nVidia CUDA backend, default: %(default)s")
|
||||
group_compute.add_argument("--use-ipex", default=os.environ.get("SD_USEIPEX",False), action='store_true', help="Force use Intel OneAPI XPU backend, default: %(default)s")
|
||||
group_compute.add_argument("--use-rocm", default=os.environ.get("SD_USEROCM",False), action='store_true', help="Force use AMD ROCm backend, default: %(default)s")
|
||||
group_compute.add_argument('--use-zluda', default=os.environ.get("SD_USEZLUDA", False), action='store_true', help="Force use ZLUDA, AMD GPUs only, default: %(default)s")
|
||||
group_compute.add_argument("--use-openvino", default=os.environ.get("SD_USEOPENVINO",False), action='store_true', help="Use Intel OpenVINO backend, default: %(default)s")
|
||||
group_compute.add_argument('--use-directml', default=os.environ.get("SD_USEDIRECTML",False), action='store_true', help="Use DirectML if no compatible GPU is detected, default: %(default)s")
|
||||
group_compute.add_argument("--use-xformers", default=os.environ.get("SD_USEXFORMERS",False), action='store_true', help="Force use xFormers cross-optimization, default: %(default)s")
|
||||
group_compute.add_argument("--use-nightly", default=os.environ.get("SD_USENIGHTLY",False), action='store_true', help="Force use nightly torch builds, default: %(default)s")
|
||||
|
||||
group_paths = parser.add_argument_group('Paths')
|
||||
group_paths.add_argument("--ckpt", type=str, default=os.environ.get("SD_MODEL", None), help="Path to model checkpoint to load immediately, default: %(default)s")
|
||||
group_paths.add_argument("--data-dir", type=str, default=os.environ.get("SD_DATADIR", ''), help="Base path where all user data is stored, default: %(default)s")
|
||||
group_paths.add_argument("--models-dir", type=str, default=os.environ.get("SD_MODELSDIR", 'models'), help="Base path where all models are stored, default: %(default)s",)
|
||||
group_paths.add_argument("--extensions-dir", type=str, default=os.environ.get("SD_EXTENSIONSDIR", None), help="Base path where all extensions are stored, default: %(default)s",)
|
||||
|
||||
group_ui = parser.add_argument_group('UI')
|
||||
group_ui.add_argument('--theme', type=str, default=os.environ.get("SD_THEME", None), help='Override UI theme')
|
||||
group_ui.add_argument('--locale', type=str, default=os.environ.get("SD_LOCALE", None), help='Override UI locale')
|
||||
|
||||
group_http = parser.add_argument_group('HTTP')
|
||||
group_http.add_argument("--server-name", type=str, default=os.environ.get("SD_SERVERNAME", None), help="Sets hostname of server, default: %(default)s")
|
||||
group_http.add_argument("--tls-keyfile", type=str, default=os.environ.get("SD_TLSKEYFILE", None), help="Enable TLS and specify key file, default: %(default)s")
|
||||
group_http.add_argument("--tls-certfile", type=str, default=os.environ.get("SD_TLSCERTFILE", None), help="Enable TLS and specify cert file, default: %(default)s")
|
||||
group_http.add_argument("--tls-selfsign", action="store_true", default=os.environ.get("SD_TLSSELFSIGN", False), help="Enable TLS with self-signed certificates, default: %(default)s")
|
||||
group_http.add_argument("--cors-origins", type=str, default=os.environ.get("SD_CORSORIGINS", None), help="Allowed CORS origins as comma-separated list, default: %(default)s")
|
||||
group_http.add_argument("--cors-regex", type=str, default=os.environ.get("SD_CORSREGEX", None), help="Allowed CORS origins as regular expression, default: %(default)s")
|
||||
group_http.add_argument('--subpath', type=str, default=os.environ.get("SD_SUBPATH", None), help='Customize the URL subpath for usage with reverse proxy')
|
||||
group_http.add_argument("--autolaunch", default=os.environ.get("SD_AUTOLAUNCH", False), action='store_true', help="Open the UI URL in the system's default browser upon launch")
|
||||
group_http.add_argument("--auth", type=str, default=os.environ.get("SD_AUTH", None), help='Set access authentication like "user:pwd,user:pwd""')
|
||||
group_http.add_argument("--auth-file", type=str, default=os.environ.get("SD_AUTHFILE", None), help='Set access authentication using file, default: %(default)s')
|
||||
group_http.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access")
|
||||
group_http.add_argument("--share", default=os.environ.get("SD_SHARE", False), action='store_true', help="Enable UI accessible through Gradio site, default: %(default)s")
|
||||
group_http.add_argument("--insecure", default=os.environ.get("SD_INSECURE", False), action='store_true', help="Enable extensions tab regardless of other options, default: %(default)s")
|
||||
group_http.add_argument("--listen", default=os.environ.get("SD_LISTEN", False), action='store_true', help="Launch web server using public IP address, default: %(default)s")
|
||||
group_http.add_argument("--remote", default=os.environ.get("SD_REMOTE", False), action='store_true', help="Reduce client-server communication, default: %(default)s")
|
||||
group_http.add_argument("--port", type=int, default=os.environ.get("SD_PORT", 7860), help="Launch web server with given server port, default: %(default)s")
|
||||
|
||||
group_diag = parser.add_argument_group('Diagnostics')
|
||||
group_diag.add_argument('--experimental', default=os.environ.get("SD_EXPERIMENTAL",False), action='store_true', help="Allow unsupported versions of libraries, default: %(default)s")
|
||||
group_diag.add_argument('--ignore', default=os.environ.get("SD_IGNORE",False), action='store_true', help="Ignore any errors and attempt to continue")
|
||||
group_diag.add_argument('--new', default=os.environ.get("SD_NEW",False), action='store_true', help="Force newer/untested version of libraries, default: %(default)s")
|
||||
group_diag.add_argument('--safe', default=os.environ.get("SD_SAFE",False), action='store_true', help="Run in safe mode with no user extensions")
|
||||
group_diag.add_argument('--test', default=os.environ.get("SD_TEST",False), action='store_true', help="Run test only and exit")
|
||||
group_diag.add_argument('--version', default=False, action='store_true', help="Print version information")
|
||||
group_diag.add_argument("--monitor", default=os.environ.get("SD_MONITOR", 0), help="Run memory monitor, default: %(default)s")
|
||||
group_diag.add_argument("--status", default=os.environ.get("SD_STATUS", 120), help="Run server is-alive status, default: %(default)s")
|
||||
|
||||
group_log = parser.add_argument_group('Logging')
|
||||
group_log.add_argument("--log", type=str, default=os.environ.get("SD_LOG", None), help="Set log file, default: %(default)s")
|
||||
group_log.add_argument('--debug', default=not os.environ.get("SD_NODEBUG",False), action='store_true', help="Run with debug logging, default: %(default)s")
|
||||
group_log.add_argument("--trace", default=os.environ.get("SD_TRACE", False), action='store_true', help="Run with trace logging, default: %(default)s")
|
||||
group_log.add_argument("--profile", default=os.environ.get("SD_PROFILE", False), action='store_true', help="Run profiler, default: %(default)s")
|
||||
group_log.add_argument('--docs', default=not os.environ.get("SD_NODOCS", False), action='store_true', help = "Mount API docs, default: %(default)s")
|
||||
group_log.add_argument("--api-log", default=not os.environ.get("SD_NOAPILOG", False), action='store_true', help="Log all API requests")
|
||||
|
||||
group_nargs = parser.add_argument_group('Other')
|
||||
group_nargs.add_argument('args', type=str, nargs='*', help=argparse.SUPPRESS)
|
||||
|
||||
|
||||
def parse_args(parser):
|
||||
# command line args
|
||||
|
|
|
|||
|
|
@ -246,7 +246,6 @@ def main():
|
|||
installer.git_reset()
|
||||
if args.skip_git or args.skip_all:
|
||||
installer.log.info('Skipping GIT operations')
|
||||
installer.check_version()
|
||||
installer.log.info(f'Platform: {installer.print_dict(installer.get_platform())}')
|
||||
installer.check_venv()
|
||||
installer.log.info(f'Args: {sys.argv[1:]}')
|
||||
|
|
@ -259,7 +258,6 @@ def main():
|
|||
installer.check_onnx()
|
||||
installer.check_transformers()
|
||||
installer.check_diffusers()
|
||||
installer.check_modified_files()
|
||||
if args.test:
|
||||
installer.log.info('Startup: test mode')
|
||||
installer.quick_allowed = False
|
||||
|
|
@ -282,7 +280,6 @@ def main():
|
|||
init_paths()
|
||||
installer.install_extensions()
|
||||
installer.install_requirements() # redo requirements since extensions may change them
|
||||
installer.update_wiki()
|
||||
if len(installer.errors) == 0:
|
||||
installer.log.debug(f'Setup complete without errors: {round(time.time())}')
|
||||
else:
|
||||
|
|
@ -292,6 +289,8 @@ def main():
|
|||
args = installer.parse_args(parser)
|
||||
installer.log.info(f'Installer time: {init_summary()}')
|
||||
get_custom_args()
|
||||
import threading
|
||||
threading.Thread(target=installer.run_deferred_tasks, daemon=True).start()
|
||||
|
||||
uv, instance = start_server(immediate=True, server=None)
|
||||
if installer.restart_required:
|
||||
|
|
|
|||
|
|
@ -1,7 +1,86 @@
|
|||
import os
|
||||
import sys
|
||||
import argparse
|
||||
from modules.paths import data_path, models_path
|
||||
import shlex
|
||||
|
||||
|
||||
def get_argv():
|
||||
return shlex.split(" ".join(sys.argv[1:])) if "USED_VSCODE_COMMAND_PICKARGS" in os.environ else sys.argv[1:]
|
||||
|
||||
|
||||
def add_core_args(p):
|
||||
p.add_argument("--ckpt", type=str, default=os.environ.get("SD_MODEL", None), help="Path to model checkpoint to load immediately, default: %(default)s")
|
||||
p.add_argument("--data-dir", type=str, default=os.environ.get("SD_DATADIR", ''), help="Base path where all user data is stored, default: %(default)s")
|
||||
p.add_argument("--models-dir", type=str, default=os.environ.get("SD_MODELSDIR", None), help="Base path where all models are stored, default: %(default)s",)
|
||||
p.add_argument("--embeddings-dir", type=str, default=os.environ.get("SD_EMBEDDINGSDIR", None), help="Base path where all embeddings are stored, default: %(default)s",)
|
||||
p.add_argument("--hypernetwork-dir", type=str, default=os.environ.get("SD_HYPERNETWORKDIR", None), help="Base path where all hypernetworks are stored, default: %(default)s",)
|
||||
p.add_argument("--vae-dir", type=str, default=os.environ.get("SD_VAEDIR", None), help="Base path where all VAEs are stored, default: %(default)s",)
|
||||
p.add_argument("--lora-dir", type=str, default=os.environ.get("SD_LORADIR", None), help="Base path where all LoRAs are stored, default: %(default)s",)
|
||||
p.add_argument("--extensions-dir", type=str, default=os.environ.get("SD_EXTENSIONSDIR", None), help="Base path where all extensions are stored, default: %(default)s",)
|
||||
|
||||
|
||||
def add_config_arg(p, data_dir):
|
||||
p.add_argument("--config", type=str, default=os.environ.get("SD_CONFIG", os.path.join(data_dir, 'config.json')), help="Use specific server configuration file, default: %(default)s")
|
||||
|
||||
|
||||
def add_compute_args(p):
|
||||
p.add_argument("--device-id", type=str, default=os.environ.get("SD_DEVICEID", None), help="Select the default GPU device to use, default: %(default)s")
|
||||
p.add_argument("--use-cuda", default=os.environ.get("SD_USECUDA", False), action='store_true', help="Force use nVidia CUDA backend, default: %(default)s")
|
||||
p.add_argument("--use-ipex", default=os.environ.get("SD_USEIPEX", False), action='store_true', help="Force use Intel OneAPI XPU backend, default: %(default)s")
|
||||
p.add_argument("--use-rocm", default=os.environ.get("SD_USEROCM", False), action='store_true', help="Force use AMD ROCm backend, default: %(default)s")
|
||||
p.add_argument('--use-zluda', default=os.environ.get("SD_USEZLUDA", False), action='store_true', help="Force use ZLUDA, AMD GPUs only, default: %(default)s")
|
||||
p.add_argument("--use-openvino", default=os.environ.get("SD_USEOPENVINO", False), action='store_true', help="Use Intel OpenVINO backend, default: %(default)s")
|
||||
p.add_argument('--use-directml', default=os.environ.get("SD_USEDIRECTML", False), action='store_true', help="Use DirectML if no compatible GPU is detected, default: %(default)s")
|
||||
p.add_argument("--use-xformers", default=os.environ.get("SD_USEXFORMERS", False), action='store_true', help="Force use xFormers cross-optimization, default: %(default)s")
|
||||
p.add_argument("--use-nightly", default=os.environ.get("SD_USENIGHTLY", False), action='store_true', help="Force use nightly torch builds, default: %(default)s")
|
||||
p.add_argument("--no-half", default=os.environ.get("SD_NOHALF", False), action='store_true', help="Do not switch the model to 16-bit float, default: %(default)s")
|
||||
p.add_argument("--no-half-vae", default=os.environ.get("SD_NOHALFVAE", False), action='store_true', help="Do not switch VAE model to 16-bit float, default: %(default)s")
|
||||
p.add_argument("--precision", type=str, help="Evaluate at this precision, default: %(default)s", choices=["full", "autocast"], default="autocast")
|
||||
p.add_argument("--upcast-sampling", default=os.environ.get("SD_UPCASTSAMPLING", False), action='store_true', help="Upcast sampling, default: %(default)s")
|
||||
|
||||
|
||||
def add_ui_args(p):
|
||||
p.add_argument('--theme', type=str, default=os.environ.get("SD_THEME", None), help='Override UI theme')
|
||||
p.add_argument('--locale', type=str, default=os.environ.get("SD_LOCALE", None), help='Override UI locale')
|
||||
|
||||
|
||||
def add_http_args(p):
|
||||
p.add_argument("--server-name", type=str, default=os.environ.get("SD_SERVERNAME", None), help="Sets hostname of server, default: %(default)s")
|
||||
p.add_argument("--tls-keyfile", type=str, default=os.environ.get("SD_TLSKEYFILE", None), help="Enable TLS and specify key file, default: %(default)s")
|
||||
p.add_argument("--tls-certfile", type=str, default=os.environ.get("SD_TLSCERTFILE", None), help="Enable TLS and specify cert file, default: %(default)s")
|
||||
p.add_argument("--tls-selfsign", action="store_true", default=os.environ.get("SD_TLSSELFSIGN", False), help="Enable TLS with self-signed certificates, default: %(default)s")
|
||||
p.add_argument("--cors-origins", type=str, default=os.environ.get("SD_CORSORIGINS", None), help="Allowed CORS origins as comma-separated list, default: %(default)s")
|
||||
p.add_argument("--cors-regex", type=str, default=os.environ.get("SD_CORSREGEX", None), help="Allowed CORS origins as regular expression, default: %(default)s")
|
||||
p.add_argument('--subpath', type=str, default=os.environ.get("SD_SUBPATH", None), help='Customize the URL subpath for usage with reverse proxy')
|
||||
p.add_argument("--autolaunch", default=os.environ.get("SD_AUTOLAUNCH", False), action='store_true', help="Open the UI URL in the system's default browser upon launch")
|
||||
p.add_argument("--auth", type=str, default=os.environ.get("SD_AUTH", None), help='Set access authentication like "user:pwd,user:pwd""')
|
||||
p.add_argument("--auth-file", type=str, default=os.environ.get("SD_AUTHFILE", None), help='Set access authentication using file, default: %(default)s')
|
||||
p.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access")
|
||||
p.add_argument("--share", default=os.environ.get("SD_SHARE", False), action='store_true', help="Enable UI accessible through Gradio site, default: %(default)s")
|
||||
p.add_argument("--insecure", default=os.environ.get("SD_INSECURE", False), action='store_true', help="Enable extensions tab regardless of other options, default: %(default)s")
|
||||
p.add_argument("--listen", default=os.environ.get("SD_LISTEN", False), action='store_true', help="Launch web server using public IP address, default: %(default)s")
|
||||
p.add_argument("--remote", default=os.environ.get("SD_REMOTE", False), action='store_true', help="Reduce client-server communication, default: %(default)s")
|
||||
p.add_argument("--port", type=int, default=os.environ.get("SD_PORT", 7860), help="Launch web server with given server port, default: %(default)s")
|
||||
|
||||
|
||||
def add_diag_args(p):
|
||||
p.add_argument('--experimental', default=os.environ.get("SD_EXPERIMENTAL", False), action='store_true', help="Allow unsupported versions of libraries, default: %(default)s")
|
||||
p.add_argument('--ignore', default=os.environ.get("SD_IGNORE", False), action='store_true', help="Ignore any errors and attempt to continue")
|
||||
p.add_argument('--new', default=os.environ.get("SD_NEW", False), action='store_true', help="Force newer/untested version of libraries, default: %(default)s")
|
||||
p.add_argument('--safe', default=os.environ.get("SD_SAFE", False), action='store_true', help="Run in safe mode with no user extensions")
|
||||
p.add_argument('--test', default=os.environ.get("SD_TEST", False), action='store_true', help="Run test only and exit")
|
||||
p.add_argument('--version', default=False, action='store_true', help="Print version information")
|
||||
p.add_argument("--monitor", default=os.environ.get("SD_MONITOR", 0), help="Run memory monitor, default: %(default)s")
|
||||
p.add_argument("--status", default=os.environ.get("SD_STATUS", 120), help="Run server is-alive status, default: %(default)s")
|
||||
|
||||
|
||||
def add_log_args(p):
|
||||
p.add_argument("--log", type=str, default=os.environ.get("SD_LOG", None), help="Set log file, default: %(default)s")
|
||||
p.add_argument('--debug', default=not os.environ.get("SD_NODEBUG", False), action='store_true', help="Run with debug logging, default: %(default)s")
|
||||
p.add_argument("--trace", default=os.environ.get("SD_TRACE", False), action='store_true', help="Run with trace logging, default: %(default)s")
|
||||
p.add_argument("--profile", default=os.environ.get("SD_PROFILE", False), action='store_true', help="Run profiler, default: %(default)s")
|
||||
p.add_argument('--docs', default=not os.environ.get("SD_NODOCS", False), action='store_true', help="Mount API docs, default: %(default)s")
|
||||
p.add_argument("--api-log", default=not os.environ.get("SD_NOAPILOG", False), action='store_true', help="Log all API requests")
|
||||
|
||||
|
||||
parsed = None
|
||||
|
|
@ -18,20 +97,41 @@ def parse_args():
|
|||
|
||||
def main_args():
|
||||
# main server args
|
||||
from modules.paths import data_path
|
||||
group_paths = parser.add_argument_group('Paths')
|
||||
add_core_args(group_paths)
|
||||
group_config = parser.add_argument_group('Configuration')
|
||||
group_config.add_argument("--config", type=str, default=os.environ.get("SD_CONFIG", os.path.join(data_path, 'config.json')), help="Use specific server configuration file, default: %(default)s")
|
||||
add_config_arg(group_config, data_path)
|
||||
group_config.add_argument("--ui-config", type=str, default=os.environ.get("SD_UICONFIG", os.path.join(data_path, 'ui-config.json')), help="Use specific UI configuration file, default: %(default)s")
|
||||
group_config.add_argument("--freeze", default=os.environ.get("SD_FREEZE", False), action='store_true', help="Disable editing settings")
|
||||
group_config.add_argument("--medvram", default=os.environ.get("SD_MEDVRAM", False), action='store_true', help="Split model stages and keep only active part in VRAM, default: %(default)s")
|
||||
group_config.add_argument("--lowvram", default=os.environ.get("SD_LOWVRAM", False), action='store_true', help="Split model components and keep only active part in VRAM, default: %(default)s")
|
||||
group_config.add_argument("--disable", default=os.environ.get("SD_DISABLE", ''), help="Disable specific UI tabs: %(default)s")
|
||||
|
||||
group_compute = parser.add_argument_group('Compute Engine')
|
||||
add_compute_args(group_compute)
|
||||
|
||||
group_ui = parser.add_argument_group('UI')
|
||||
add_ui_args(group_ui)
|
||||
|
||||
group_http = parser.add_argument_group('HTTP')
|
||||
add_http_args(group_http)
|
||||
|
||||
group_diag = parser.add_argument_group('Diagnostics')
|
||||
add_diag_args(group_diag)
|
||||
|
||||
group_log = parser.add_argument_group('Logging')
|
||||
add_log_args(group_log)
|
||||
|
||||
group_nargs = parser.add_argument_group('Other')
|
||||
group_nargs.add_argument('args', type=str, nargs='*', help=argparse.SUPPRESS)
|
||||
|
||||
|
||||
def compatibility_args():
|
||||
# removed args are added here as hidden in fixed format for compatbility reasons
|
||||
from modules.paths import data_path, models_path
|
||||
group_compat = parser.add_argument_group('Compatibility options')
|
||||
group_compat.add_argument('--backend', type=str, choices=['diffusers', 'original'], help=argparse.SUPPRESS)
|
||||
group_compat.add_argument('--hypernetwork-dir', default=os.path.join(models_path, 'hypernetworks'), help=argparse.SUPPRESS)
|
||||
group_compat.add_argument("--allow-code", default=os.environ.get("SD_ALLOWCODE", False), action='store_true', help=argparse.SUPPRESS)
|
||||
group_compat.add_argument("--enable_insecure_extension_access", default=os.environ.get("SD_INSECURE", False), action='store_true', help=argparse.SUPPRESS)
|
||||
group_compat.add_argument("--use-cpu", nargs='+', default=[], type=str.lower, help=argparse.SUPPRESS)
|
||||
|
|
@ -54,6 +154,7 @@ def compatibility_args():
|
|||
|
||||
def settings_args(opts, args):
|
||||
# removed args are added here as hidden in fixed format for compatbility reasons
|
||||
from modules.paths import data_path
|
||||
group_compat = parser.add_argument_group('Compatibility options')
|
||||
group_compat.add_argument("--allow-code", default=os.environ.get("SD_ALLOWCODE", False), action='store_true', help=argparse.SUPPRESS)
|
||||
group_compat.add_argument("--use-cpu", nargs='+', default=[], type=str.lower, help=argparse.SUPPRESS)
|
||||
|
|
@ -69,33 +170,6 @@ def settings_args(opts, args):
|
|||
group_compat.add_argument("--allowed-paths", nargs='+', default=[], type=str, required=False, help="add additional paths to paths allowed for web access")
|
||||
group_compat.add_argument("--api", action='store_true', help=argparse.SUPPRESS, default=True)
|
||||
group_compat.add_argument("--api-auth", type=str, help=argparse.SUPPRESS, default=None)
|
||||
# removed args that have been moved to opts are added here as hidden with default values as defined in opts
|
||||
group_compat.add_argument("--ckpt-dir", type=str, help=argparse.SUPPRESS, default=opts.ckpt_dir)
|
||||
group_compat.add_argument("--vae-dir", type=str, help=argparse.SUPPRESS, default=opts.vae_dir)
|
||||
group_compat.add_argument("--embeddings-dir", type=str, help=argparse.SUPPRESS, default=opts.embeddings_dir)
|
||||
group_compat.add_argument("--embeddings-templates-dir", type=str, help=argparse.SUPPRESS, default=opts.embeddings_templates_dir)
|
||||
group_compat.add_argument("--esrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.esrgan_models_path)
|
||||
group_compat.add_argument("--bsrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.bsrgan_models_path)
|
||||
group_compat.add_argument("--realesrgan-models-path", type=str, help=argparse.SUPPRESS, default=opts.realesrgan_models_path)
|
||||
group_compat.add_argument("--scunet-models-path", help=argparse.SUPPRESS, default=opts.scunet_models_path)
|
||||
group_compat.add_argument("--swinir-models-path", help=argparse.SUPPRESS, default=opts.swinir_models_path)
|
||||
group_compat.add_argument("--ldsr-models-path", help=argparse.SUPPRESS, default=opts.ldsr_models_path)
|
||||
group_compat.add_argument("--clip-models-path", type=str, help=argparse.SUPPRESS, default=opts.clip_models_path)
|
||||
group_compat.add_argument("--opt-channelslast", help=argparse.SUPPRESS, action='store_true', default=opts.opt_channelslast)
|
||||
group_compat.add_argument("--xformers", default=(opts.cross_attention_optimization == "xFormers"), action='store_true', help=argparse.SUPPRESS)
|
||||
group_compat.add_argument("--disable-nan-check", help=argparse.SUPPRESS, action='store_true', default=opts.disable_nan_check)
|
||||
group_compat.add_argument("--rollback-vae", help=argparse.SUPPRESS, default=opts.rollback_vae)
|
||||
group_compat.add_argument("--no-half", help=argparse.SUPPRESS, action='store_true', default=opts.no_half)
|
||||
group_compat.add_argument("--no-half-vae", help=argparse.SUPPRESS, action='store_true', default=opts.no_half_vae)
|
||||
group_compat.add_argument("--precision", help=argparse.SUPPRESS, default=opts.precision)
|
||||
group_compat.add_argument("--sub-quad-q-chunk-size", help=argparse.SUPPRESS, default=opts.sub_quad_q_chunk_size)
|
||||
group_compat.add_argument("--sub-quad-kv-chunk-size", help=argparse.SUPPRESS, default=opts.sub_quad_kv_chunk_size)
|
||||
group_compat.add_argument("--sub-quad-chunk-threshold", help=argparse.SUPPRESS, default=opts.sub_quad_chunk_threshold)
|
||||
group_compat.add_argument("--lora-dir", help=argparse.SUPPRESS, default=opts.lora_dir)
|
||||
group_compat.add_argument("--embeddings-dir", help=argparse.SUPPRESS, default=opts.embeddings_dir)
|
||||
group_compat.add_argument("--enable-console-prompts", help=argparse.SUPPRESS, action='store_true', default=False)
|
||||
group_compat.add_argument("--safe", help=argparse.SUPPRESS, action='store_true', default=False)
|
||||
group_compat.add_argument("--use-xformers", help=argparse.SUPPRESS, action='store_true', default=False)
|
||||
|
||||
# removed opts are added here with fixed values for compatibility reasons
|
||||
opts.use_old_emphasis_implementation = False
|
||||
|
|
@ -117,14 +191,18 @@ def settings_args(opts, args):
|
|||
opts.enable_pnginfo = True
|
||||
opts.data['clip_skip'] = 1
|
||||
|
||||
opts.onchange("lora_dir", lambda: setattr(args, "lora_dir", opts.lora_dir))
|
||||
|
||||
if "USED_VSCODE_COMMAND_PICKARGS" in os.environ:
|
||||
import shlex
|
||||
argv = shlex.split(" ".join(sys.argv[1:])) if "USED_VSCODE_COMMAND_PICKARGS" in os.environ else sys.argv[1:]
|
||||
argv = get_argv()
|
||||
args = parser.parse_args(argv)
|
||||
else:
|
||||
args = parser.parse_args()
|
||||
|
||||
for d in ['lora_dir', 'embeddings_dir', 'hypernetwork_dir', 'vae_dir', 'ckpt_dir', 'temp_dir', 'diffusers_dir', 'hfcache_dir', 'tunable_dir', 'unet_dir', 'te_dir', 'styles_dir', 'wildcards_dir', 'control_dir', 'yolo_dir', 'no_half', 'no_half_vae', 'precision', 'upcast_sampling', 'esrgan_models_path', 'bsrgan_models_path', 'realesrgan_models_path', 'scunet_models_path', 'swinir_models_path', 'ldsr_models_path', 'clip_models_path', 'onnx_cached_models_path']:
|
||||
if hasattr(opts, d):
|
||||
if getattr(args, d, None) is None:
|
||||
setattr(args, d, getattr(opts, d))
|
||||
opts.onchange(d, lambda d=d: setattr(args, d, getattr(opts, d)), call=False)
|
||||
|
||||
return args
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -56,9 +56,8 @@ def check_dependencies():
|
|||
pkgs = ' '.join(packages)
|
||||
pip(cmd + pkgs, ignore=False, quiet=True, uv=False)
|
||||
try:
|
||||
import pkg_resources
|
||||
import importlib.metadata
|
||||
import imp # pylint: disable=deprecated-module
|
||||
imp.reload(pkg_resources)
|
||||
import mmcv # pylint: disable=unused-import
|
||||
import mmengine # pylint: disable=unused-import
|
||||
from mmengine.registry import Registry
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import os
|
|||
import sys
|
||||
import time
|
||||
import contextlib
|
||||
import importlib.metadata
|
||||
import torch
|
||||
from modules import rocm, attention
|
||||
from modules.errors import log, display, install as install_traceback
|
||||
|
|
@ -112,10 +113,10 @@ def get_gpu_info():
|
|||
return ''
|
||||
|
||||
def get_package_version(pkg: str):
|
||||
import pkg_resources
|
||||
spec = pkg_resources.working_set.by_key.get(pkg, None) # more reliable than importlib
|
||||
version = pkg_resources.get_distribution(pkg).version if spec is not None else None
|
||||
return version
|
||||
try:
|
||||
return importlib.metadata.version(pkg)
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
if not torch.cuda.is_available():
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ def install_nunchaku():
|
|||
import sys
|
||||
import platform
|
||||
import importlib
|
||||
import pkg_resources
|
||||
import importlib.metadata
|
||||
import torch
|
||||
python_ver = f'{sys.version_info.major}{sys.version_info.minor}'
|
||||
if python_ver not in ['311', '312', '313']:
|
||||
|
|
@ -81,7 +81,7 @@ def install_nunchaku():
|
|||
cmd = f'install --upgrade {url}'
|
||||
log.debug(f'Nunchaku: install="{url}"')
|
||||
pip(cmd, ignore=False, uv=False)
|
||||
importlib.reload(pkg_resources)
|
||||
pass
|
||||
if not check():
|
||||
log.error('Nunchaku: install failed')
|
||||
return False
|
||||
|
|
|
|||
|
|
@ -9,14 +9,12 @@ from installer import log
|
|||
|
||||
|
||||
# parse args, parse again after we have the data-dir and early-read the config file
|
||||
argv = shlex.split(" ".join(sys.argv[1:])) if "USED_VSCODE_COMMAND_PICKARGS" in os.environ else sys.argv[1:]
|
||||
from modules.cmd_args import get_argv, add_core_args, add_config_arg
|
||||
argv = get_argv()
|
||||
parser = argparse.ArgumentParser(add_help=False)
|
||||
parser.add_argument("--ckpt", type=str, default=os.environ.get("SD_MODEL", None), help="Path to model checkpoint to load immediately, default: %(default)s")
|
||||
parser.add_argument("--data-dir", type=str, default=os.environ.get("SD_DATADIR", ''), help="Base path where all user data is stored, default: %(default)s")
|
||||
parser.add_argument("--models-dir", type=str, default=os.environ.get("SD_MODELSDIR", None), help="Base path where all models are stored, default: %(default)s",)
|
||||
parser.add_argument("--extensions-dir", type=str, default=os.environ.get("SD_EXTENSIONSDIR", None), help="Base path where all extensions are stored, default: %(default)s",)
|
||||
add_core_args(parser)
|
||||
cli = parser.parse_known_args(argv)[0]
|
||||
parser.add_argument("--config", type=str, default=os.environ.get("SD_CONFIG", os.path.join(cli.data_dir, 'config.json')), help="Use specific server configuration file, default: %(default)s") # twice because we want data_dir
|
||||
add_config_arg(parser, cli.data_dir)
|
||||
cli = parser.parse_known_args(argv)[0]
|
||||
config_path = cli.config if os.path.isabs(cli.config) else os.path.join(cli.data_dir, cli.config)
|
||||
|
||||
|
|
|
|||
|
|
@ -74,8 +74,11 @@ class Upscaler:
|
|||
if k != self.name:
|
||||
continue
|
||||
for model in v:
|
||||
local_name = os.path.join(self.user_path, modelloader.friendly_fullname(model[1]))
|
||||
model_path = local_name if os.path.exists(local_name) else model[1]
|
||||
if self.user_path is not None:
|
||||
local_name = os.path.join(self.user_path, modelloader.friendly_fullname(model[1]))
|
||||
model_path = local_name if os.path.exists(local_name) else model[1]
|
||||
else:
|
||||
model_path = model[1]
|
||||
scaler = UpscalerData(name=f'{k} {model[0]}', path=model_path, upscaler=self)
|
||||
scalers.append(scaler)
|
||||
loaded.append(model_path)
|
||||
|
|
|
|||
Loading…
Reference in New Issue