From 8cd5d95b8a1cb213cce2f949c394c841a09d9cab Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 8 Nov 2022 05:30:20 +0000 Subject: [PATCH] move all models into subdirectories of ./models - this required an update to the invoke-ai fork of gfpgan - simultaneously reverted consolidation of environment and requirements files, as their presence in a directory triggered setup.py to try to install a sub-package. --- docs/installation/INSTALL_DOCKER.md | 2 +- docs/installation/INSTALL_LINUX.md | 4 +-- docs/installation/INSTALL_WINDOWS.md | 4 +-- ...nvironment-rocm.yml => environment-AMD.yml | 0 ...vironment-cuda.yml => environment-cuda.yml | 0 ...rch64.yml => environment-linux-aarch64.yml | 0 ...environment-mac.yml => environment-mac.yml | 0 ldm/invoke/args.py | 4 +-- ldm/invoke/conditioning.py | 1 - ldm/invoke/restoration/gfpgan.py | 6 ++-- ldm/invoke/txt2mask.py | 6 ++-- ...ts-lin-AMD.txt => requirements-lin-AMD.txt | 0 ...txt => requirements-lin-win-colab-CUDA.txt | 0 ...-arm64.txt => requirements-linux-arm64.txt | 0 ...PS-CPU.txt => requirements-mac-MPS-CPU.txt | 0 ...ents-mkdocs.txt => requirements-mkdocs.txt | 0 ...irements-rocm.txt => requirements-rocm.txt | 0 .../requirements.txt => requirements.txt | 0 scripts/preload_models.py | 35 ++++++++++--------- setup.py | 3 +- 20 files changed, 34 insertions(+), 31 deletions(-) rename environments/environment-rocm.yml => environment-AMD.yml (100%) rename environments/environment-cuda.yml => environment-cuda.yml (100%) rename environments/environment-linux-aarch64.yml => environment-linux-aarch64.yml (100%) rename environments/environment-mac.yml => environment-mac.yml (100%) rename environments/requirements-lin-AMD.txt => requirements-lin-AMD.txt (100%) rename environments/requirements-lin-win-colab-CUDA.txt => requirements-lin-win-colab-CUDA.txt (100%) rename environments/requirements-linux-arm64.txt => requirements-linux-arm64.txt (100%) rename environments/requirements-mac-MPS-CPU.txt => requirements-mac-MPS-CPU.txt (100%) rename environments/requirements-mkdocs.txt => requirements-mkdocs.txt (100%) rename environments/requirements-rocm.txt => requirements-rocm.txt (100%) rename environments/requirements.txt => requirements.txt (100%) diff --git a/docs/installation/INSTALL_DOCKER.md b/docs/installation/INSTALL_DOCKER.md index dc8d886980..50c3d89c81 100644 --- a/docs/installation/INSTALL_DOCKER.md +++ b/docs/installation/INSTALL_DOCKER.md @@ -70,7 +70,7 @@ Some Suggestions of variables you may want to change besides the Token: | `HUGGINGFACE_TOKEN="hg_aewirhghlawrgkjbarug2"` | This is the only required variable, without you can't get the checkpoint | | `ARCH=aarch64` | if you are using a ARM based CPU | | `INVOKEAI_TAG=yourname/invokeai:latest` | the Container Repository / Tag which will be used | -| `INVOKEAI_CONDA_ENV_FILE=environments/environment-linux-aarch64.yml`| since environment.yml wouldn't work with aarch | +| `INVOKEAI_CONDA_ENV_FILE=environment-linux-aarch64.yml` | since environment.yml wouldn't work with aarch | | `INVOKEAI_GIT="-b branchname https://github.com/username/reponame"` | if you want to use your own fork | #### Build the Image diff --git a/docs/installation/INSTALL_LINUX.md b/docs/installation/INSTALL_LINUX.md index 971d9ed169..684bccb153 100644 --- a/docs/installation/INSTALL_LINUX.md +++ b/docs/installation/INSTALL_LINUX.md @@ -48,7 +48,7 @@ title: Manual Installation, Linux ```bash (base) rm -rf src # (this is a precaution in case there is already a src directory) - (base) ~/InvokeAI$ conda env create -f environments/environment-cuda.yml + (base) ~/InvokeAI$ conda env create -f environment-cuda.yml (base) ~/InvokeAI$ conda activate invokeai (invokeai) ~/InvokeAI$ ``` @@ -57,7 +57,7 @@ title: Manual Installation, Linux ```bash (base) rm -rf src # (this is a precaution in case there is already a src directory) - (base) ~/InvokeAI$ conda env create -f environments/environment-rocm.yml + (base) ~/InvokeAI$ conda env create -f environment-AMD.yml (base) ~/InvokeAI$ conda activate invokeai (invokeai) ~/InvokeAI$ ``` diff --git a/docs/installation/INSTALL_WINDOWS.md b/docs/installation/INSTALL_WINDOWS.md index 2e7d86d3df..22d7a5dee2 100644 --- a/docs/installation/INSTALL_WINDOWS.md +++ b/docs/installation/INSTALL_WINDOWS.md @@ -45,7 +45,7 @@ Note that you will need NVIDIA drivers, Python 3.10, and Git installed beforehan ```bash rmdir src # (this is a precaution in case there is already a src directory) - conda env create -f environments/environment-cuda.yml + conda env create -f environment-cuda.yml conda activate invokeai (invokeai)> ``` @@ -54,7 +54,7 @@ Note that you will need NVIDIA drivers, Python 3.10, and Git installed beforehan ```bash rmdir src # (this is a precaution in case there is already a src directory) - conda env create -f environments/environment-rocm.yml + conda env create -f environment-AMD.yml conda activate invokeai (invokeai)> ``` diff --git a/environments/environment-rocm.yml b/environment-AMD.yml similarity index 100% rename from environments/environment-rocm.yml rename to environment-AMD.yml diff --git a/environments/environment-cuda.yml b/environment-cuda.yml similarity index 100% rename from environments/environment-cuda.yml rename to environment-cuda.yml diff --git a/environments/environment-linux-aarch64.yml b/environment-linux-aarch64.yml similarity index 100% rename from environments/environment-linux-aarch64.yml rename to environment-linux-aarch64.yml diff --git a/environments/environment-mac.yml b/environment-mac.yml similarity index 100% rename from environments/environment-mac.yml rename to environment-mac.yml diff --git a/ldm/invoke/args.py b/ldm/invoke/args.py index 36272c8ddd..b40d67c834 100644 --- a/ldm/invoke/args.py +++ b/ldm/invoke/args.py @@ -500,13 +500,13 @@ class Args(object): postprocessing_group.add_argument( '--gfpgan_model_path', type=str, - default='experiments/pretrained_models/GFPGANv1.4.pth', + default='./GFPGANv1.4.pth', help='Indicates the path to the GFPGAN model, relative to --gfpgan_dir.', ) postprocessing_group.add_argument( '--gfpgan_dir', type=str, - default='./src/gfpgan', + default='./models/gfpgan', help='Indicates the directory containing the GFPGAN code.', ) web_server_group.add_argument( diff --git a/ldm/invoke/conditioning.py b/ldm/invoke/conditioning.py index 04fbd7c10a..ba0dd84275 100644 --- a/ldm/invoke/conditioning.py +++ b/ldm/invoke/conditioning.py @@ -47,7 +47,6 @@ def get_uc_and_c_and_ec(prompt_string_uncleaned, model, log_tokens=False, skip_n parsed_prompt = pp.parse_conjunction(prompt_string_cleaned).prompts[0] parsed_negative_prompt: FlattenedPrompt = pp.parse_conjunction(unconditioned_words).prompts[0] - print(f">> Parsed prompt to {parsed_prompt}") conditioning = None cac_args:CrossAttentionControl.Arguments = None diff --git a/ldm/invoke/restoration/gfpgan.py b/ldm/invoke/restoration/gfpgan.py index 9042de5d6c..fa0058d09f 100644 --- a/ldm/invoke/restoration/gfpgan.py +++ b/ldm/invoke/restoration/gfpgan.py @@ -10,8 +10,9 @@ from PIL import Image class GFPGAN(): def __init__( self, - gfpgan_dir='src/gfpgan', - gfpgan_model_path='experiments/pretrained_models/GFPGANv1.4.pth') -> None: + gfpgan_dir='models/gfpgan', + gfpgan_model_path='GFPGANv1.4.pth' + ) -> None: self.model_path = os.path.join(gfpgan_dir, gfpgan_model_path) self.gfpgan_model_exists = os.path.isfile(self.model_path) @@ -74,6 +75,7 @@ class GFPGAN(): image = image.resize(res.size) res = Image.blend(image, res, strength) + if torch.cuda.is_available(): torch.cuda.empty_cache() self.gfpgan = None diff --git a/ldm/invoke/txt2mask.py b/ldm/invoke/txt2mask.py index 2103f2f48c..6bdd1814d1 100644 --- a/ldm/invoke/txt2mask.py +++ b/ldm/invoke/txt2mask.py @@ -29,14 +29,14 @@ work fine. import torch import numpy as np -from clipseg_models.clipseg import CLIPDensePredT +from clipseg.clipseg import CLIPDensePredT from einops import rearrange, repeat from PIL import Image, ImageOps from torchvision import transforms CLIP_VERSION = 'ViT-B/16' -CLIPSEG_WEIGHTS = 'src/clipseg/weights/rd64-uni.pth' -CLIPSEG_WEIGHTS_REFINED = 'src/clipseg/weights/rd64-uni-refined.pth' +CLIPSEG_WEIGHTS = 'models/clipseg/clipseg_weights/rd64-uni.pth' +CLIPSEG_WEIGHTS_REFINED = 'models/clipseg/clipseg_weights/rd64-uni-refined.pth' CLIPSEG_SIZE = 352 class SegmentedGrayscale(object): diff --git a/environments/requirements-lin-AMD.txt b/requirements-lin-AMD.txt similarity index 100% rename from environments/requirements-lin-AMD.txt rename to requirements-lin-AMD.txt diff --git a/environments/requirements-lin-win-colab-CUDA.txt b/requirements-lin-win-colab-CUDA.txt similarity index 100% rename from environments/requirements-lin-win-colab-CUDA.txt rename to requirements-lin-win-colab-CUDA.txt diff --git a/environments/requirements-linux-arm64.txt b/requirements-linux-arm64.txt similarity index 100% rename from environments/requirements-linux-arm64.txt rename to requirements-linux-arm64.txt diff --git a/environments/requirements-mac-MPS-CPU.txt b/requirements-mac-MPS-CPU.txt similarity index 100% rename from environments/requirements-mac-MPS-CPU.txt rename to requirements-mac-MPS-CPU.txt diff --git a/environments/requirements-mkdocs.txt b/requirements-mkdocs.txt similarity index 100% rename from environments/requirements-mkdocs.txt rename to requirements-mkdocs.txt diff --git a/environments/requirements-rocm.txt b/requirements-rocm.txt similarity index 100% rename from environments/requirements-rocm.txt rename to requirements-rocm.txt diff --git a/environments/requirements.txt b/requirements.txt similarity index 100% rename from environments/requirements.txt rename to requirements.txt diff --git a/scripts/preload_models.py b/scripts/preload_models.py index cf70159842..0b0feb1af5 100644 --- a/scripts/preload_models.py +++ b/scripts/preload_models.py @@ -415,7 +415,7 @@ def download_kornia(): #--------------------------------------------- def download_clip(): - print('Loading CLIP model...',end='') + print('Loading CLIP model (ignore deprecation errors)...',end='') sys.stdout.flush() version = 'openai/clip-vit-large-patch14' tokenizer = CLIPTokenizer.from_pretrained(version) @@ -424,7 +424,7 @@ def download_clip(): #--------------------------------------------- def download_gfpgan(): - print('Installing models from RealESRGAN and facexlib...',end='') + print('Installing models from RealESRGAN and facexlib (ignore deprecation errors)...',end='') try: from realesrgan import RealESRGANer from realesrgan.archs.srvgg_arch import SRVGGNetCompact @@ -442,19 +442,19 @@ def download_gfpgan(): print('Error loading ESRGAN:') print(traceback.format_exc()) - print('Loading models from GFPGAN') + print('Loading models from GFPGAN...',end='') for model in ( [ 'https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth', - 'src/gfpgan/experiments/pretrained_models/GFPGANv1.4.pth' + 'models/gfpgan/GFPGANv1.4.pth' ], [ 'https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth', - './gfpgan/weights/detection_Resnet50_Final.pth' + 'models/gfpgan/weights/detection_Resnet50_Final.pth' ], [ 'https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth', - './gfpgan/weights/parsing_parsenet.pth' + 'models/gfpgan/weights/parsing_parsenet.pth' ], ): model_url,model_dest = model @@ -489,22 +489,23 @@ def download_clipseg(): import zipfile try: model_url = 'https://owncloud.gwdg.de/index.php/s/ioHbRzFx6th32hn/download' - model_dest = 'src/clipseg/clipseg_weights.zip' - weights_dir = 'src/clipseg/weights' - if not os.path.exists(weights_dir): + model_dest = 'models/clipseg/clipseg_weights' + weights_zip = 'models/clipseg/weights.zip' + + if not os.path.exists(model_dest): os.makedirs(os.path.dirname(model_dest), exist_ok=True) - if not os.path.exists('src/clipseg/weights/rd64-uni-refined.pth'): - request.urlretrieve(model_url,model_dest) - with zipfile.ZipFile(model_dest,'r') as zip: - zip.extractall('src/clipseg') - os.rename('src/clipseg/clipseg_weights','src/clipseg/weights') - os.remove(model_dest) - from clipseg_models.clipseg import CLIPDensePredT + if not os.path.exists(f'{model_dest}/rd64-uni-refined.pth'): + request.urlretrieve(model_url,weights_zip) + with zipfile.ZipFile(weights_zip,'r') as zip: + zip.extractall('models/clipseg') + os.remove(weights_zip) + + from clipseg.clipseg import CLIPDensePredT model = CLIPDensePredT(version='ViT-B/16', reduce_dim=64, ) model.eval() model.load_state_dict( torch.load( - 'src/clipseg/weights/rd64-uni-refined.pth', + 'models/clipseg/clipseg_weights/rd64-uni-refined.pth', map_location=torch.device('cpu') ), strict=False, diff --git a/setup.py b/setup.py index 0c5ddb2ae4..bc6c7cdc31 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup( name='invoke-ai', version='2.1.3', - description='', + description='InvokeAI text to image generation toolkit', packages=find_packages(), install_requires=[ 'torch', @@ -11,3 +11,4 @@ setup( 'tqdm', ], ) +