From 85e8aa8ce20dad2f87ebc4eafbc97707174ba64b Mon Sep 17 00:00:00 2001 From: Magee Date: Sun, 10 Mar 2024 16:06:08 -0400 Subject: [PATCH 1/3] feat: add config for temp path and temp path cleanup on launch (#1992) * Added options to set the Gradio cache path and clear cache on launch. * Renamed cache to temp * clear temp * feat: do not delete temp folder but only clean content also use fallback to system temp dir see https://github.com/gradio-app/gradio/blob/6683ab2589f9d8658e1f51acc1b7526edce988d3/gradio/utils.py#L1151 * refactor: code cleanup * feat: unify arg --temp-path and new temp_path config value * feat: change default temp dir from gradio to fooocus * refactor: move temp path method definition and configs * feat: rename get_temp_path to init_temp_path --------- Co-authored-by: steveyourcreativepeople Co-authored-by: Manuel Schmid --- args_manager.py | 3 --- launch.py | 21 ++++++++++++++------- modules/config.py | 36 +++++++++++++++++++++++++++++++++++- modules/launch_util.py | 20 +++++++++++++++++--- modules/private_logger.py | 2 +- 5 files changed, 67 insertions(+), 15 deletions(-) diff --git a/args_manager.py b/args_manager.py index c7c1b7ab..8c3e1918 100644 --- a/args_manager.py +++ b/args_manager.py @@ -49,7 +49,4 @@ if args_parser.args.disable_analytics: if args_parser.args.disable_in_browser: args_parser.args.in_browser = False -if args_parser.args.temp_path is None: - args_parser.args.temp_path = os.path.join(gettempdir(), 'Fooocus') - args = args_parser.args diff --git a/launch.py b/launch.py index 4269f1fc..b3b06d6e 100644 --- a/launch.py +++ b/launch.py @@ -1,6 +1,6 @@ import os -import sys import ssl +import sys print('[System ARGV] ' + str(sys.argv)) @@ -15,15 +15,13 @@ if "GRADIO_SERVER_PORT" not in os.environ: ssl._create_default_https_context = ssl._create_unverified_context - import platform import fooocus_version from build_launcher import build_launcher -from modules.launch_util import is_installed, run, python, run_pip, requirements_met +from modules.launch_util import is_installed, run, python, run_pip, requirements_met, delete_folder_content from modules.model_loader import load_file_from_url - REINSTALL_ALL = False TRY_INSTALL_XFORMERS = False @@ -68,6 +66,7 @@ vae_approx_filenames = [ 'https://huggingface.co/lllyasviel/misc/resolve/main/xl-to-v1_interposer-v3.1.safetensors') ] + def ini_args(): from args_manager import args return args @@ -77,14 +76,23 @@ prepare_environment() build_launcher() args = ini_args() - if args.gpu_device_id is not None: os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu_device_id) print("Set device to:", args.gpu_device_id) - from modules import config +os.environ['GRADIO_TEMP_DIR'] = config.temp_path + +if config.temp_path_cleanup_on_launch: + print(f'[Cleanup] Attempting to delete content of temp dir {config.temp_path}') + result = delete_folder_content(config.temp_path, '[Cleanup] ') + if result: + print("[Cleanup] Cleanup successful") + else: + print(f"[Cleanup] Failed to delete content of temp dir.") + + def download_models(): for file_name, url in vae_approx_filenames: load_file_from_url(url=url, model_dir=config.path_vae_approx, file_name=file_name) @@ -123,5 +131,4 @@ def download_models(): download_models() - from webui import * diff --git a/modules/config.py b/modules/config.py index a68bd218..543bba5e 100644 --- a/modules/config.py +++ b/modules/config.py @@ -3,6 +3,7 @@ import json import math import numbers import args_manager +import tempfile import modules.flags import modules.sdxl_styles @@ -10,6 +11,7 @@ from modules.model_loader import load_file_from_url from modules.util import get_files_from_folder, makedirs_with_log from modules.flags import Performance, MetadataScheme + def get_config_path(key, default_value): env = os.getenv(key) if env is not None and isinstance(env, str): @@ -18,6 +20,7 @@ def get_config_path(key, default_value): else: return os.path.abspath(default_value) + config_path = get_config_path('config_path', "./config.txt") config_example_path = get_config_path('config_example_path', "config_modification_tutorial.txt") config_dict = {} @@ -117,7 +120,7 @@ def get_path_output() -> str: global config_dict path_output = get_dir_or_set_default('path_outputs', '../outputs/', make_directory=True) if args_manager.args.output_path: - print(f'[CONFIG] Overriding config value path_outputs with {args_manager.args.output_path}') + print(f'Overriding config value path_outputs with {args_manager.args.output_path}') config_dict['path_outputs'] = path_output = args_manager.args.output_path return path_output @@ -178,6 +181,7 @@ path_clip_vision = get_dir_or_set_default('path_clip_vision', '../models/clip_vi path_fooocus_expansion = get_dir_or_set_default('path_fooocus_expansion', '../models/prompt_expansion/fooocus_expansion') path_outputs = get_path_output() + def get_config_item_or_set_default(key, default_value, validator, disable_empty_as_none=False): global config_dict, visited_keys @@ -206,6 +210,36 @@ def get_config_item_or_set_default(key, default_value, validator, disable_empty_ return default_value +def init_temp_path(path: str | None, default_path: str) -> str: + if args_manager.args.temp_path: + path = args_manager.args.temp_path + + if path != '' and path != default_path: + try: + if not os.path.isabs(path): + path = os.path.abspath(path) + os.makedirs(path, exist_ok=True) + print(f'Using temp path {path}') + return path + except Exception as e: + print(f'Could not create temp path {path}. Reason: {e}') + print(f'Using default temp path {default_path} instead.') + + os.makedirs(default_path, exist_ok=True) + return default_path + + +default_temp_path = os.path.join(tempfile.gettempdir(), 'fooocus') +temp_path = init_temp_path(get_config_item_or_set_default( + key='temp_path', + default_value=default_temp_path, + validator=lambda x: isinstance(x, str), +), default_temp_path) +temp_path_cleanup_on_launch = get_config_item_or_set_default( + key='temp_path_cleanup_on_launch', + default_value=True, + validator=lambda x: isinstance(x, bool) +) default_base_model_name = get_config_item_or_set_default( key='default_model', default_value='model.safetensors', diff --git a/modules/launch_util.py b/modules/launch_util.py index b483d515..370dc048 100644 --- a/modules/launch_util.py +++ b/modules/launch_util.py @@ -1,6 +1,7 @@ import os import importlib import importlib.util +import shutil import subprocess import sys import re @@ -9,9 +10,6 @@ import importlib.metadata import packaging.version from packaging.requirements import Requirement - - - logging.getLogger("torch.distributed.nn").setLevel(logging.ERROR) # sshh... logging.getLogger("xformers").addFilter(lambda record: 'A matching Triton is not available' not in record.getMessage()) @@ -101,3 +99,19 @@ def requirements_met(requirements_file): return True + +def delete_folder_content(folder, prefix=None): + result = True + + for filename in os.listdir(folder): + file_path = os.path.join(folder, filename) + try: + if os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) + elif os.path.isdir(file_path): + shutil.rmtree(file_path) + except Exception as e: + print(f'{prefix}Failed to delete {file_path}. Reason: {e}') + result = False + + return result \ No newline at end of file diff --git a/modules/private_logger.py b/modules/private_logger.py index 01e570a7..73fdda54 100644 --- a/modules/private_logger.py +++ b/modules/private_logger.py @@ -21,7 +21,7 @@ def get_current_html_path(output_format=None): def log(img, metadata, metadata_parser: MetadataParser | None = None, output_format=None) -> str: - path_outputs = args_manager.args.temp_path if args_manager.args.disable_image_log else modules.config.path_outputs + path_outputs = modules.config.temp_path if args_manager.args.disable_image_log else modules.config.path_outputs output_format = output_format if output_format else modules.config.default_output_format date_string, local_temp_filename, only_name = generate_temp_filename(folder=path_outputs, extension=output_format) os.makedirs(os.path.dirname(local_temp_filename), exist_ok=True) From 5409bfdb2610bc50804b6bedf36d152339aaadc2 Mon Sep 17 00:00:00 2001 From: Manuel Schmid <9307310+mashb1t@users.noreply.github.com> Date: Sun, 10 Mar 2024 21:08:55 +0100 Subject: [PATCH 2/3] Revert "feat: add config for temp path and temp path cleanup on launch (#1992)" (#2502) This reverts commit 85e8aa8ce20dad2f87ebc4eafbc97707174ba64b. --- args_manager.py | 3 +++ launch.py | 21 +++++++-------------- modules/config.py | 36 +----------------------------------- modules/launch_util.py | 20 +++----------------- modules/private_logger.py | 2 +- 5 files changed, 15 insertions(+), 67 deletions(-) diff --git a/args_manager.py b/args_manager.py index 8c3e1918..c7c1b7ab 100644 --- a/args_manager.py +++ b/args_manager.py @@ -49,4 +49,7 @@ if args_parser.args.disable_analytics: if args_parser.args.disable_in_browser: args_parser.args.in_browser = False +if args_parser.args.temp_path is None: + args_parser.args.temp_path = os.path.join(gettempdir(), 'Fooocus') + args = args_parser.args diff --git a/launch.py b/launch.py index b3b06d6e..4269f1fc 100644 --- a/launch.py +++ b/launch.py @@ -1,6 +1,6 @@ import os -import ssl import sys +import ssl print('[System ARGV] ' + str(sys.argv)) @@ -15,13 +15,15 @@ if "GRADIO_SERVER_PORT" not in os.environ: ssl._create_default_https_context = ssl._create_unverified_context + import platform import fooocus_version from build_launcher import build_launcher -from modules.launch_util import is_installed, run, python, run_pip, requirements_met, delete_folder_content +from modules.launch_util import is_installed, run, python, run_pip, requirements_met from modules.model_loader import load_file_from_url + REINSTALL_ALL = False TRY_INSTALL_XFORMERS = False @@ -66,7 +68,6 @@ vae_approx_filenames = [ 'https://huggingface.co/lllyasviel/misc/resolve/main/xl-to-v1_interposer-v3.1.safetensors') ] - def ini_args(): from args_manager import args return args @@ -76,23 +77,14 @@ prepare_environment() build_launcher() args = ini_args() + if args.gpu_device_id is not None: os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu_device_id) print("Set device to:", args.gpu_device_id) + from modules import config -os.environ['GRADIO_TEMP_DIR'] = config.temp_path - -if config.temp_path_cleanup_on_launch: - print(f'[Cleanup] Attempting to delete content of temp dir {config.temp_path}') - result = delete_folder_content(config.temp_path, '[Cleanup] ') - if result: - print("[Cleanup] Cleanup successful") - else: - print(f"[Cleanup] Failed to delete content of temp dir.") - - def download_models(): for file_name, url in vae_approx_filenames: load_file_from_url(url=url, model_dir=config.path_vae_approx, file_name=file_name) @@ -131,4 +123,5 @@ def download_models(): download_models() + from webui import * diff --git a/modules/config.py b/modules/config.py index 543bba5e..a68bd218 100644 --- a/modules/config.py +++ b/modules/config.py @@ -3,7 +3,6 @@ import json import math import numbers import args_manager -import tempfile import modules.flags import modules.sdxl_styles @@ -11,7 +10,6 @@ from modules.model_loader import load_file_from_url from modules.util import get_files_from_folder, makedirs_with_log from modules.flags import Performance, MetadataScheme - def get_config_path(key, default_value): env = os.getenv(key) if env is not None and isinstance(env, str): @@ -20,7 +18,6 @@ def get_config_path(key, default_value): else: return os.path.abspath(default_value) - config_path = get_config_path('config_path', "./config.txt") config_example_path = get_config_path('config_example_path', "config_modification_tutorial.txt") config_dict = {} @@ -120,7 +117,7 @@ def get_path_output() -> str: global config_dict path_output = get_dir_or_set_default('path_outputs', '../outputs/', make_directory=True) if args_manager.args.output_path: - print(f'Overriding config value path_outputs with {args_manager.args.output_path}') + print(f'[CONFIG] Overriding config value path_outputs with {args_manager.args.output_path}') config_dict['path_outputs'] = path_output = args_manager.args.output_path return path_output @@ -181,7 +178,6 @@ path_clip_vision = get_dir_or_set_default('path_clip_vision', '../models/clip_vi path_fooocus_expansion = get_dir_or_set_default('path_fooocus_expansion', '../models/prompt_expansion/fooocus_expansion') path_outputs = get_path_output() - def get_config_item_or_set_default(key, default_value, validator, disable_empty_as_none=False): global config_dict, visited_keys @@ -210,36 +206,6 @@ def get_config_item_or_set_default(key, default_value, validator, disable_empty_ return default_value -def init_temp_path(path: str | None, default_path: str) -> str: - if args_manager.args.temp_path: - path = args_manager.args.temp_path - - if path != '' and path != default_path: - try: - if not os.path.isabs(path): - path = os.path.abspath(path) - os.makedirs(path, exist_ok=True) - print(f'Using temp path {path}') - return path - except Exception as e: - print(f'Could not create temp path {path}. Reason: {e}') - print(f'Using default temp path {default_path} instead.') - - os.makedirs(default_path, exist_ok=True) - return default_path - - -default_temp_path = os.path.join(tempfile.gettempdir(), 'fooocus') -temp_path = init_temp_path(get_config_item_or_set_default( - key='temp_path', - default_value=default_temp_path, - validator=lambda x: isinstance(x, str), -), default_temp_path) -temp_path_cleanup_on_launch = get_config_item_or_set_default( - key='temp_path_cleanup_on_launch', - default_value=True, - validator=lambda x: isinstance(x, bool) -) default_base_model_name = get_config_item_or_set_default( key='default_model', default_value='model.safetensors', diff --git a/modules/launch_util.py b/modules/launch_util.py index 370dc048..b483d515 100644 --- a/modules/launch_util.py +++ b/modules/launch_util.py @@ -1,7 +1,6 @@ import os import importlib import importlib.util -import shutil import subprocess import sys import re @@ -10,6 +9,9 @@ import importlib.metadata import packaging.version from packaging.requirements import Requirement + + + logging.getLogger("torch.distributed.nn").setLevel(logging.ERROR) # sshh... logging.getLogger("xformers").addFilter(lambda record: 'A matching Triton is not available' not in record.getMessage()) @@ -99,19 +101,3 @@ def requirements_met(requirements_file): return True - -def delete_folder_content(folder, prefix=None): - result = True - - for filename in os.listdir(folder): - file_path = os.path.join(folder, filename) - try: - if os.path.isfile(file_path) or os.path.islink(file_path): - os.unlink(file_path) - elif os.path.isdir(file_path): - shutil.rmtree(file_path) - except Exception as e: - print(f'{prefix}Failed to delete {file_path}. Reason: {e}') - result = False - - return result \ No newline at end of file diff --git a/modules/private_logger.py b/modules/private_logger.py index 73fdda54..01e570a7 100644 --- a/modules/private_logger.py +++ b/modules/private_logger.py @@ -21,7 +21,7 @@ def get_current_html_path(output_format=None): def log(img, metadata, metadata_parser: MetadataParser | None = None, output_format=None) -> str: - path_outputs = modules.config.temp_path if args_manager.args.disable_image_log else modules.config.path_outputs + path_outputs = args_manager.args.temp_path if args_manager.args.disable_image_log else modules.config.path_outputs output_format = output_format if output_format else modules.config.default_output_format date_string, local_temp_filename, only_name = generate_temp_filename(folder=path_outputs, extension=output_format) os.makedirs(os.path.dirname(local_temp_filename), exist_ok=True) From bc9c58608291592504613129e74eabdd57339847 Mon Sep 17 00:00:00 2001 From: Manuel Schmid <9307310+mashb1t@users.noreply.github.com> Date: Sun, 10 Mar 2024 23:13:09 +0100 Subject: [PATCH 3/3] fix: use correct method call for interrupt_current_processing (#2506) actually achieves the same result, stopping the task --- modules/async_worker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/async_worker.py b/modules/async_worker.py index a8661f4d..83fc3912 100644 --- a/modules/async_worker.py +++ b/modules/async_worker.py @@ -787,7 +787,7 @@ def worker(): try: if async_task.last_stop is not False: - ldm_patched.model_management.interrupt_current_processing() + ldm_patched.modules.model_management.interrupt_current_processing() positive_cond, negative_cond = task['c'], task['uc'] if 'cn' in goals: