From 441ca2f648ac2a44b489abb86fe840f739d1e7bf Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 19 Oct 2023 13:22:34 -0400 Subject: [PATCH] fix model paths --- CHANGELOG.md | 1 + modules/paths.py | 56 ++++++++++++++++++++------------------------ modules/sd_models.py | 3 ++- webui.py | 2 +- 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97677921d..fade0f679 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Service release addressing all zero-day issues reported so far... - fix diffusers dpm++ 2m and 1s samplers - fix new style filename template - fix image name template using model name +- fix model path using relative path - force second requirements check on startup - remove lyco, multiple_tqdm - enhance extension compatibility for exensions directly importing codeformers diff --git a/modules/paths.py b/modules/paths.py index c364085c8..0fd7b87b5 100644 --- a/modules/paths.py +++ b/modules/paths.py @@ -1,17 +1,18 @@ import os import sys -import modules.paths_internal +from modules import paths_internal, errors -data_path = modules.paths_internal.data_path -script_path = modules.paths_internal.script_path -models_path = modules.paths_internal.models_path -sd_configs_path = modules.paths_internal.sd_configs_path -sd_default_config = modules.paths_internal.sd_default_config -sd_model_file = modules.paths_internal.sd_model_file -default_sd_model_file = modules.paths_internal.default_sd_model_file -extensions_dir = modules.paths_internal.extensions_dir -extensions_builtin_dir = modules.paths_internal.extensions_builtin_dir +debug = errors.log.info if os.environ.get('SD_PATH_DEBUG', None) is not None else lambda *args, **kwargs: None +data_path = paths_internal.data_path +script_path = paths_internal.script_path +models_path = paths_internal.models_path +sd_configs_path = paths_internal.sd_configs_path +sd_default_config = paths_internal.sd_default_config +sd_model_file = paths_internal.sd_model_file +default_sd_model_file = paths_internal.default_sd_model_file +extensions_dir = paths_internal.extensions_dir +extensions_builtin_dir = paths_internal.extensions_builtin_dir # data_path = cmd_opts_pre.data sys.path.insert(0, script_path) @@ -39,14 +40,14 @@ paths = {} for d, must_exist, what, _options in path_dirs: must_exist_path = os.path.abspath(os.path.join(script_path, d, must_exist)) if not os.path.exists(must_exist_path): - print(f"Warning: {what} not found at path {must_exist_path}", file=sys.stderr) + errors.log.error(f'Required path not found: path={must_exist_path} item={what}') else: d = os.path.abspath(d) sys.path.append(d) paths[what] = d -def create_paths(opts, log=None): +def create_paths(opts): def create_path(folder): if folder is None or folder == '': return @@ -54,28 +55,22 @@ def create_paths(opts, log=None): return try: os.makedirs(folder, exist_ok=True) - if log is not None: - log.debug(f'Create folder={folder}') + errors.log.info(f'Create folder={folder}') except Exception as e: - if log is not None: - log.error(f'Create Failed folder={folder} {e}') + errors.log.error(f'Create Failed folder={folder} {e}') def fix_path(folder): tgt = opts.data.get(folder, None) or opts.data_labels[folder].default if tgt is None or tgt == '': return tgt - if os.path.isabs(tgt): - return tgt - if len(data_path) > 0 and tgt.startswith(data_path): # path is already relative to data_path - return tgt - else: - tgt = os.path.join(data_path, tgt) - if tgt.startswith('..'): - tgt = os.path.abspath(tgt) - if os.path.isabs(tgt): - return tgt - tgt = os.path.relpath(tgt, script_path) - opts.data[folder] = tgt + fix = tgt + if not os.path.isabs(tgt) and len(data_path) > 0 and not tgt.startswith(data_path): # path is already relative to data_path + fix = os.path.join(data_path, fix) + if fix.startswith('..'): + fix = os.path.abspath(fix) + fix = fix if os.path.isabs(fix) else os.path.relpath(fix, script_path) + opts.data[folder] = fix + debug(f'Paths: folder={folder} original="{tgt}" target="{fix}"') return opts.data[folder] create_path(data_path) @@ -85,11 +80,12 @@ def create_paths(opts, log=None): create_path(extensions_dir) create_path(extensions_builtin_dir) create_path(fix_path('temp_dir')) - create_path(fix_path('hypernetwork_dir')) create_path(fix_path('ckpt_dir')) - create_path(fix_path('vae_dir')) create_path(fix_path('diffusers_dir')) + create_path(fix_path('vae_dir')) + create_path(fix_path('lora_dir')) create_path(fix_path('embeddings_dir')) + create_path(fix_path('hypernetwork_dir')) create_path(fix_path('outdir_samples')) create_path(fix_path('outdir_txt2img_samples')) create_path(fix_path('outdir_img2img_samples')) diff --git a/modules/sd_models.py b/modules/sd_models.py index a6ab5656a..ff95ee7a8 100644 --- a/modules/sd_models.py +++ b/modules/sd_models.py @@ -269,7 +269,8 @@ def select_checkpoint(op='model'): return checkpoint_info if len(checkpoints_list) == 0 and not shared.cmd_opts.no_download: shared.log.error("Cannot generate without a checkpoint") - shared.log.error("Use --ckpt to force using existing checkpoint") + shared.log.info("Set system paths to use existing folders in a different location") + shared.log.info("Or use --ckpt to force using existing checkpoint") return None checkpoint_info = next(iter(checkpoints_list.values())) if model_checkpoint is not None: diff --git a/webui.py b/webui.py index f8e750888..daab8d82b 100644 --- a/webui.py +++ b/webui.py @@ -216,7 +216,7 @@ def start_common(): log.info(f'Using data path: {shared.cmd_opts.data_dir}') if shared.cmd_opts.models_dir is not None and len(shared.cmd_opts.models_dir) > 0 and shared.cmd_opts.models_dir != 'models': log.info(f'Using models path: {shared.cmd_opts.models_dir}') - create_paths(opts, log) + create_paths(opts) async_policy() initialize() if shared.opts.clean_temp_dir_at_start: