From 9997fde144b4995289db93f702dd0b1fd8cf41b0 Mon Sep 17 00:00:00 2001 From: Eugene Brodsky Date: Sat, 14 Jan 2023 02:13:01 -0500 Subject: [PATCH] (config) moving the 'configs' dir into the 'config' module This allows reliable distribution of the initial 'configs' directory with the Python package, and enables the configuration script to be running from anywhere, as long as the virtual environment is available on the sys.path --- MANIFEST.in | 1 + ldm/invoke/CLI.py | 6 +- .../config/configs}/INITIAL_MODELS.yaml | 0 .../config/configs}/models.yaml.example | 0 .../invoke/config/configs}/sd-concepts.txt | 0 .../stable-diffusion/v1-finetune.yaml | 0 .../stable-diffusion/v1-finetune_style.yaml | 0 .../stable-diffusion/v1-inference.yaml | 0 .../v1-inpainting-inference.yaml | 0 .../stable-diffusion/v1-m1-finetune.yaml | 0 .../stable-diffusion/v2-inference-v.yaml | 0 ldm/invoke/config/configure_invokeai.py | 19 ++-- setup.py | 100 ++++++++++++++++++ 13 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 MANIFEST.in rename {configs => ldm/invoke/config/configs}/INITIAL_MODELS.yaml (100%) rename {configs => ldm/invoke/config/configs}/models.yaml.example (100%) rename {configs => ldm/invoke/config/configs}/sd-concepts.txt (100%) rename {configs => ldm/invoke/config/configs}/stable-diffusion/v1-finetune.yaml (100%) rename {configs => ldm/invoke/config/configs}/stable-diffusion/v1-finetune_style.yaml (100%) rename {configs => ldm/invoke/config/configs}/stable-diffusion/v1-inference.yaml (100%) rename {configs => ldm/invoke/config/configs}/stable-diffusion/v1-inpainting-inference.yaml (100%) rename {configs => ldm/invoke/config/configs}/stable-diffusion/v1-m1-finetune.yaml (100%) rename {configs => ldm/invoke/config/configs}/stable-diffusion/v2-inference-v.yaml (100%) create mode 100644 setup.py diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000000..f93117ad91 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +recursive-include ldm/invoke/config/configs * \ No newline at end of file diff --git a/ldm/invoke/CLI.py b/ldm/invoke/CLI.py index f5f0d5b86b..9ddab9ed15 100644 --- a/ldm/invoke/CLI.py +++ b/ldm/invoke/CLI.py @@ -574,7 +574,7 @@ def import_model(model_path:str, gen, opt, completer): if model_path.startswith(('http:','https:','ftp:')): model_name = import_ckpt_model(model_path, gen, opt, completer) elif os.path.exists(model_path) and model_path.endswith(('.ckpt','.safetensors')) and os.path.isfile(model_path): - model_name = import_ckpt_model(model_path, gen, opt, completer) + model_name = import_ckpt_model(model_path, gen, opt, completer) elif re.match('^[\w.+-]+/[\w.+-]+$',model_path): model_name = import_diffuser_model(model_path, gen, opt, completer) elif os.path.isdir(model_path): @@ -743,7 +743,7 @@ def del_config(model_name:str, gen, opt, completer): if input(f'Remove {model_name} from the list of models known to InvokeAI? [y] ').strip().startswith(('n','N')): return - + delete_completely = input('Completely remove the model file or directory from disk? [n] ').startswith(('y','Y')) gen.model_manager.del_model(model_name,delete_files=delete_completely) gen.model_manager.commit(opt.conf) @@ -1118,7 +1118,7 @@ def report_model_error(opt:Namespace, e:Exception): if yes_to_all is not None: sys.argv.append(yes_to_all) - import ldm.invoke.configure_invokeai as configure_invokeai + from ldm.invoke.config import configure_invokeai configure_invokeai.main() print('** InvokeAI will now restart') sys.argv = previous_args diff --git a/configs/INITIAL_MODELS.yaml b/ldm/invoke/config/configs/INITIAL_MODELS.yaml similarity index 100% rename from configs/INITIAL_MODELS.yaml rename to ldm/invoke/config/configs/INITIAL_MODELS.yaml diff --git a/configs/models.yaml.example b/ldm/invoke/config/configs/models.yaml.example similarity index 100% rename from configs/models.yaml.example rename to ldm/invoke/config/configs/models.yaml.example diff --git a/configs/sd-concepts.txt b/ldm/invoke/config/configs/sd-concepts.txt similarity index 100% rename from configs/sd-concepts.txt rename to ldm/invoke/config/configs/sd-concepts.txt diff --git a/configs/stable-diffusion/v1-finetune.yaml b/ldm/invoke/config/configs/stable-diffusion/v1-finetune.yaml similarity index 100% rename from configs/stable-diffusion/v1-finetune.yaml rename to ldm/invoke/config/configs/stable-diffusion/v1-finetune.yaml diff --git a/configs/stable-diffusion/v1-finetune_style.yaml b/ldm/invoke/config/configs/stable-diffusion/v1-finetune_style.yaml similarity index 100% rename from configs/stable-diffusion/v1-finetune_style.yaml rename to ldm/invoke/config/configs/stable-diffusion/v1-finetune_style.yaml diff --git a/configs/stable-diffusion/v1-inference.yaml b/ldm/invoke/config/configs/stable-diffusion/v1-inference.yaml similarity index 100% rename from configs/stable-diffusion/v1-inference.yaml rename to ldm/invoke/config/configs/stable-diffusion/v1-inference.yaml diff --git a/configs/stable-diffusion/v1-inpainting-inference.yaml b/ldm/invoke/config/configs/stable-diffusion/v1-inpainting-inference.yaml similarity index 100% rename from configs/stable-diffusion/v1-inpainting-inference.yaml rename to ldm/invoke/config/configs/stable-diffusion/v1-inpainting-inference.yaml diff --git a/configs/stable-diffusion/v1-m1-finetune.yaml b/ldm/invoke/config/configs/stable-diffusion/v1-m1-finetune.yaml similarity index 100% rename from configs/stable-diffusion/v1-m1-finetune.yaml rename to ldm/invoke/config/configs/stable-diffusion/v1-m1-finetune.yaml diff --git a/configs/stable-diffusion/v2-inference-v.yaml b/ldm/invoke/config/configs/stable-diffusion/v2-inference-v.yaml similarity index 100% rename from configs/stable-diffusion/v2-inference-v.yaml rename to ldm/invoke/config/configs/stable-diffusion/v2-inference-v.yaml diff --git a/ldm/invoke/config/configure_invokeai.py b/ldm/invoke/config/configure_invokeai.py index 5eb1e09720..c45445cc99 100755 --- a/ldm/invoke/config/configure_invokeai.py +++ b/ldm/invoke/config/configure_invokeai.py @@ -48,9 +48,11 @@ except ImportError: #--------------------------globals----------------------- Model_dir = 'models' Weights_dir = 'ldm/stable-diffusion-v1/' -Dataset_path = './configs/INITIAL_MODELS.yaml' -Default_config_file = './configs/models.yaml' -SD_Configs = './configs/stable-diffusion' + +# the initial "configs" dir is now bundled with the `config` package +Dataset_path = Path(__file__).parent / "configs" / 'INITIAL_MODELS.yaml' +Default_config_file = Path(__file__).parent / "configs" / 'models.yaml' +SD_Configs = Path(__file__).parent / "configs" / 'stable-diffusion' assert os.path.exists(Dataset_path),"The configs directory cannot be found. Please run this script from within the invokeai runtime directory." @@ -690,7 +692,6 @@ def select_outputs(root:str,yes_to_all:bool=False): #------------------------------------- def initialize_rootdir(root:str,yes_to_all:bool=False): - assert os.path.exists('./configs'),'Run this script from within the InvokeAI source code directory, "InvokeAI" or the runtime directory "invokeai".' print(f'** INITIALIZING INVOKEAI RUNTIME DIRECTORY **') root_selected = False @@ -720,11 +721,11 @@ def initialize_rootdir(root:str,yes_to_all:bool=False): for name in ('models','configs','embeddings','text-inversion-data','text-inversion-training-data'): os.makedirs(os.path.join(root,name), exist_ok=True) - for src in (['configs']): - dest = os.path.join(root,src) - if not os.path.samefile(src,dest): - shutil.copytree(src,dest,dirs_exist_ok=True) - os.makedirs(outputs, exist_ok=True) + + configs_src = Path(__file__).parent / "configs" + configs_dest = Path(root) / "configs" + if not os.path.samefile(configs_src, configs_dest): + shutil.copytree(configs_src, configs_dest, dirs_exist_ok=True) init_file = os.path.join(Globals.root,Globals.initfile) diff --git a/setup.py b/setup.py new file mode 100644 index 0000000000..da90c3967b --- /dev/null +++ b/setup.py @@ -0,0 +1,100 @@ +import sys +import os +import re +from setuptools import setup, find_packages + +def list_files(directory): + listing = list() + for root, dirs, files in os.walk(directory,topdown=False): + pair = (root,[os.path.join(root,f) for f in files]) + listing.append(pair) + return listing + + +def get_version()->str: + from ldm.invoke import __version__ as version + return version + +# The canonical version number is stored in the file ldm/invoke/_version.py +VERSION = get_version() +DESCRIPTION = ('An implementation of Stable Diffusion which provides various new features' + ' and options to aid the image generation process') +LONG_DESCRIPTION = ('This version of Stable Diffusion features a slick WebGUI, an' + ' interactive command-line script that combines text2img and img2img' + ' functionality in a "dream bot" style interface, and multiple features' + ' and other enhancements.') +HOMEPAGE = 'https://github.com/invoke-ai/InvokeAI' +FRONTEND_FILES = list_files('frontend/dist') +FRONTEND_FILES.append(('assets',['assets/caution.png'])) +print(FRONTEND_FILES) + +REQUIREMENTS=[ + 'accelerate', + 'albumentations', + 'diffusers', + 'eventlet', + 'flask_cors', + 'flask_socketio', + 'flaskwebgui', + 'getpass_asterisk', + 'imageio-ffmpeg', + 'pyreadline3', + 'realesrgan', + 'send2trash', + 'streamlit', + 'taming-transformers-rom1504', + 'test-tube', + 'torch-fidelity', + 'torch', + 'torchvision', + 'transformers', + 'picklescan', + 'clip', + 'clipseg', + 'gfpgan', + 'k-diffusion', + 'pypatchmatch', +] + +setup( + name='InvokeAI', + version=VERSION, + description=DESCRIPTION, + long_description=LONG_DESCRIPTION, + author='The InvokeAI Project', + author_email='lincoln.stein@gmail.com', + url=HOMEPAGE, + license='MIT', + packages=find_packages(exclude=['tests.*']), + install_requires=REQUIREMENTS, + dependency_links=['https://download.pytorch.org/whl/torch_stable.html'], + python_requires='>=3.9, <3.11', + classifiers=[ + 'Development Status :: 4 - Beta', + 'Environment :: GPU', + 'Environment :: GPU :: NVIDIA CUDA', + 'Environment :: MacOS X', + 'Intended Audience :: End Users/Desktop', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Operating System :: POSIX :: Linux', + 'Operating System :: MacOS', + 'Operating System :: Microsoft :: Windows', + 'Programming Language :: Python :: 3 :: Only,' + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Topic :: Artistic Software', + 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application', + 'Topic :: Internet :: WWW/HTTP :: WSGI :: Server', + 'Topic :: Multimedia :: Graphics', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'Topic :: Scientific/Engineering :: Image Processing', + ], + scripts = ['scripts/invoke.py','scripts/configure_invokeai.py', 'scripts/sd-metadata.py', + 'scripts/images2prompt.py','scripts/merge_embeddings.py', + 'scripts/textual_inversion_fe.py','scripts/textual_inversion.py' + ], + data_files=FRONTEND_FILES, + include_package_data=True, +)