From f86c8b043c0cdd61b70a6a95f83cc4aa2a56c8d6 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Sun, 15 Jan 2023 15:08:59 -0500 Subject: [PATCH 1/3] further improvements to initial load - Migration process will not crash if duplicate model files are found, one in legacy location and the other in new location. The model in the legacy location will be deleted in this case. - Added a hint to stable-diffusion-2.1 telling people it will work best with 768 pixel images. - Added the anything-4.0 model. --- configs/INITIAL_MODELS.yaml | 45 ++++++++++++++++++++++--------------- ldm/invoke/model_manager.py | 19 +++++++++++----- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/configs/INITIAL_MODELS.yaml b/configs/INITIAL_MODELS.yaml index 5df64d742d..fa55b16ef4 100644 --- a/configs/INITIAL_MODELS.yaml +++ b/configs/INITIAL_MODELS.yaml @@ -1,8 +1,13 @@ -stable-diffusion-2.1: - description: Stable Diffusion version 2.1 diffusers model (5.21 GB) +stable-diffusion-2.1-768: + description: Stable Diffusion version 2.1 diffusers model, trained on 768x768 images (5.21 GB) repo_id: stabilityai/stable-diffusion-2-1 format: diffusers recommended: True +stable-diffusion-2.1-base: + description: Stable Diffusion version 2.1 diffusers base model, trained on 512x512 images (5.21 GB) + repo_id: stabilityai/stable-diffusion-2-1-base + format: diffusers + recommended: False stable-diffusion-1.5: description: Stable Diffusion version 1.5 weight file (4.27 GB) repo_id: runwayml/stable-diffusion-v1-5 @@ -10,10 +15,17 @@ stable-diffusion-1.5: recommended: True vae: repo_id: stabilityai/sd-vae-ft-mse +stable-diffusion-1.4: + description: The original Stable Diffusion version 1.4 weight file (4.27 GB) + repo_id: CompVis/stable-diffusion-v1-4 + recommended: False + format: diffusers + vae: + repo_id: stabilityai/sd-vae-ft-mse width: 512 height: 512 inpainting-1.5: - description: RunwayML SD 1.5 model optimized for inpainting (4.27 GB) + description: RunwayML SD 1.5 model optimized for inpainting (ckpt version) (4.27 GB) repo_id: runwayml/stable-diffusion-inpainting config: v1-inpainting-inference.yaml file: sd-v1-5-inpainting.ckpt @@ -24,17 +36,13 @@ inpainting-1.5: recommended: True width: 512 height: 512 -stable-diffusion-1.4: - description: The original Stable Diffusion version 1.4 weight file (4.27 GB) - repo_id: CompVis/stable-diffusion-v1-4 - recommended: False - format: diffusers - vae: - repo_id: stabilityai/sd-vae-ft-mse - width: 512 - height: 512 +waifu-diffusion-1.4: + description: Latest waifu diffusion 1.4 (diffusers version) + format: diffusers + repo_id: hakurei/waifu-diffusion + recommended: True waifu-diffusion-1.3: - description: Stable Diffusion 1.4 fine tuned on anime-styled images (4.27 GB) + description: Stable Diffusion 1.4 fine tuned on anime-styled images (ckpt version) (4.27 GB) repo_id: hakurei/waifu-diffusion-v1-3 config: v1-inference.yaml file: model-epoch09-float32.ckpt @@ -52,10 +60,8 @@ trinart-2.0: recommended: False vae: repo_id: stabilityai/sd-vae-ft-mse - width: 512 - height: 512 trinart_characters-2.0: - description: An SD model finetuned with 19.2M anime/manga style images (4.27 GB) + description: An SD model finetuned with 19.2M anime/manga style images (ckpt version) (4.27 GB) repo_id: naclbit/trinart_derrida_characters_v2_stable_diffusion config: v1-inference.yaml file: derrida_final.ckpt @@ -66,6 +72,11 @@ trinart_characters-2.0: recommended: False width: 512 height: 512 +anything-4.0: + description: High-quality, highly detailed anime style images with just a few prompts + format: diffusers + repo_id: andite/anything-v4.0 + recommended: False papercut-1.0: description: SD 1.5 fine-tuned for papercut art (use "PaperCut" in your prompts) (2.13 GB) repo_id: Fictiverse/Stable_Diffusion_PaperCut_Model @@ -73,8 +84,6 @@ papercut-1.0: vae: repo_id: stabilityai/sd-vae-ft-mse recommended: False - width: 512 - height: 512 voxel_art-1.0: description: Stable Diffusion trained on voxel art (use "VoxelArt" in your prompts) (4.27 GB) repo_id: Fictiverse/Stable_Diffusion_VoxelArt_Model diff --git a/ldm/invoke/model_manager.py b/ldm/invoke/model_manager.py index 880d75476f..a00c4836e8 100644 --- a/ldm/invoke/model_manager.py +++ b/ldm/invoke/model_manager.py @@ -753,16 +753,20 @@ class ModelManager(object): print('** Legacy version <= 2.2.5 model directory layout detected. Reorganizing.') print('** This is a quick one-time operation.') - from shutil import move + from shutil import move, rmtree # transformer files get moved into the hub directory hub = models_dir / 'hub' os.makedirs(hub, exist_ok=True) for model in legacy_locations: - source = models_dir /model + source = models_dir / model + dest = hub / model.stem + print(f'** {source} => {dest}') if source.exists(): - print(f'DEBUG: Moving {models_dir / model} into hub') - move(models_dir / model, hub) + if dest.exists(): + rmtree(source) + else: + move(source, dest) # anything else gets moved into the diffusers directory diffusers = models_dir / 'diffusers' @@ -773,7 +777,12 @@ class ModelManager(object): if full_path.is_relative_to(hub) or full_path.is_relative_to(diffusers): continue if Path(dir).match('models--*--*'): - move(full_path,diffusers) + dest = diffusers / dir + print(f'** {full_path} => {dest}') + if dest.exists(): + rmtree(full_path) + else: + move(full_path,dest) # now clean up by removing any empty directories empty = [root for root, dirs, files, in os.walk(models_dir) if not len(dirs) and not len(files)] From d6ac0eeffd372171329fc9ce515f675298bc706a Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Mon, 16 Jan 2023 14:21:34 -0500 Subject: [PATCH 2/3] make SD-1.5 the default again --- configs/INITIAL_MODELS.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/INITIAL_MODELS.yaml b/configs/INITIAL_MODELS.yaml index 6411a64779..cc3746224e 100644 --- a/configs/INITIAL_MODELS.yaml +++ b/configs/INITIAL_MODELS.yaml @@ -13,6 +13,7 @@ stable-diffusion-1_5: repo_id: runwayml/stable-diffusion-v1-5 format: diffusers recommended: True + default: True vae: repo_id: stabilityai/sd-vae-ft-mse stable-diffusion-1_4: From 088cd2c4dddea15f6dd87e97e2f5a227d7258735 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Mon, 16 Jan 2023 17:11:59 -0500 Subject: [PATCH 3/3] further tweaks to model management - Work around problem with OmegaConf.update() that prevented model names from containing periods. - Fix logic bug in !delete_model that didn't check for existence of model in config file. --- configs/INITIAL_MODELS.yaml | 22 +++++++++++----------- ldm/invoke/CLI.py | 7 +++---- ldm/invoke/model_manager.py | 8 +++++--- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/configs/INITIAL_MODELS.yaml b/configs/INITIAL_MODELS.yaml index cc3746224e..94502855da 100644 --- a/configs/INITIAL_MODELS.yaml +++ b/configs/INITIAL_MODELS.yaml @@ -1,14 +1,14 @@ -stable-diffusion-2_1-768: +stable-diffusion-2.1-768: description: Stable Diffusion version 2.1 diffusers model, trained on 768x768 images (5.21 GB) repo_id: stabilityai/stable-diffusion-2-1 format: diffusers recommended: True -stable-diffusion-2_1-base: +stable-diffusion-2.1-base: description: Stable Diffusion version 2.1 diffusers base model, trained on 512x512 images (5.21 GB) repo_id: stabilityai/stable-diffusion-2-1-base format: diffusers recommended: False -stable-diffusion-1_5: +stable-diffusion-1.5: description: Stable Diffusion version 1.5 weight file (4.27 GB) repo_id: runwayml/stable-diffusion-v1-5 format: diffusers @@ -16,7 +16,7 @@ stable-diffusion-1_5: default: True vae: repo_id: stabilityai/sd-vae-ft-mse -stable-diffusion-1_4: +stable-diffusion-1.4: description: The original Stable Diffusion version 1.4 weight file (4.27 GB) repo_id: CompVis/stable-diffusion-v1-4 recommended: False @@ -25,7 +25,7 @@ stable-diffusion-1_4: repo_id: stabilityai/sd-vae-ft-mse width: 512 height: 512 -inpainting-1_5: +inpainting-1.5: description: RunwayML SD 1.5 model optimized for inpainting (ckpt version) (4.27 GB) repo_id: runwayml/stable-diffusion-inpainting config: v1-inpainting-inference.yaml @@ -37,12 +37,12 @@ inpainting-1_5: recommended: True width: 512 height: 512 -waifu-diffusion-1_4: +waifu-diffusion-1.4: description: Latest waifu diffusion 1.4 (diffusers version) format: diffusers repo_id: hakurei/waifu-diffusion recommended: True -waifu-diffusion-1_3: +waifu-diffusion-1.3: description: Stable Diffusion 1.4 fine tuned on anime-styled images (ckpt version) (4.27 GB) repo_id: hakurei/waifu-diffusion-v1-3 config: v1-inference.yaml @@ -54,7 +54,7 @@ waifu-diffusion-1_3: recommended: False width: 512 height: 512 -trinart-2_0: +trinart-2.0: description: An SD model finetuned with ~40,000 assorted high resolution manga/anime-style pictures (2.13 GB) repo_id: naclbit/trinart_stable_diffusion_v2 format: diffusers @@ -73,19 +73,19 @@ trinart_characters-2_0: recommended: False width: 512 height: 512 -anything-4_0: +anything-4.0: description: High-quality, highly detailed anime style images with just a few prompts format: diffusers repo_id: andite/anything-v4.0 recommended: False -papercut-1_0: +papercut-1.0: description: SD 1.5 fine-tuned for papercut art (use "PaperCut" in your prompts) (2.13 GB) repo_id: Fictiverse/Stable_Diffusion_PaperCut_Model format: diffusers vae: repo_id: stabilityai/sd-vae-ft-mse recommended: False -voxel_art-1_0: +voxel_art-1.0: description: Stable Diffusion trained on voxel art (use "VoxelArt" in your prompts) (4.27 GB) repo_id: Fictiverse/Stable_Diffusion_VoxelArt_Model config: v1-inference.yaml diff --git a/ldm/invoke/CLI.py b/ldm/invoke/CLI.py index cfe9a64ed5..6fb0efeb8d 100644 --- a/ldm/invoke/CLI.py +++ b/ldm/invoke/CLI.py @@ -613,8 +613,6 @@ def import_diffuser_model(path_or_repo:str, gen, opt, completer)->str: description = model_description): print('** model failed to import') return None - if input('Make this the default model? [n] ').startswith(('y','Y')): - manager.set_default_model(model_name) return model_name def import_ckpt_model(path_or_url:str, gen, opt, completer)->str: @@ -647,8 +645,6 @@ def import_ckpt_model(path_or_url:str, gen, opt, completer)->str: print('** model failed to import') return None - if input('Make this the default model? [n] ').startswith(('y','Y')): - manager.set_model_default(model_name) return model_name def _verify_load(model_name:str, gen)->bool: @@ -726,6 +722,9 @@ def del_config(model_name:str, gen, opt, completer): if model_name == current_model: print("** Can't delete active model. !switch to another model first. **") return + if model_name not in gen.model_manager.config: + print(f"** Unknown model {model_name}") + return gen.model_manager.del_model(model_name) gen.model_manager.commit(opt.conf) print(f'** {model_name} deleted') diff --git a/ldm/invoke/model_manager.py b/ldm/invoke/model_manager.py index a00c4836e8..0e7f052456 100644 --- a/ldm/invoke/model_manager.py +++ b/ldm/invoke/model_manager.py @@ -230,6 +230,9 @@ class ModelManager(object): Delete the named model. ''' omega = self.config + if model_name not in omega: + print(f'** Unknown model {model_name}') + return del omega[model_name] if model_name in self.stack: self.stack.remove(model_name) @@ -253,9 +256,8 @@ class ModelManager(object): assert (clobber or model_name not in omega), f'attempt to overwrite existing model definition "{model_name}"' - if model_name not in omega: - omega[model_name] = dict() - OmegaConf.update(omega,model_name,model_attributes,merge=False) + omega[model_name] = model_attributes + if 'weights' in omega[model_name]: omega[model_name]['weights'].replace('\\','/')