From 8a31e5c5e3dd7be361fdd984170fd1bac801712a Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 17 Jan 2023 00:18:09 -0500 Subject: [PATCH 1/4] allow safetensors models to be imported --- ldm/invoke/CLI.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ldm/invoke/CLI.py b/ldm/invoke/CLI.py index cfe9a64ed5..83b5281847 100644 --- a/ldm/invoke/CLI.py +++ b/ldm/invoke/CLI.py @@ -572,7 +572,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') and os.path.isfile(model_path): + 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) elif re.match('^[\w.+-]+/[\w.+-]+$',model_path): model_name = import_diffuser_model(model_path, gen, opt, completer) @@ -628,9 +628,9 @@ def import_ckpt_model(path_or_url:str, gen, opt, completer)->str: model_description=default_description ) config_file = None - + default = Path(Globals.root,'configs/stable-diffusion/v1-inference.yaml') completer.complete_extensions(('.yaml','.yml')) - completer.set_line('configs/stable-diffusion/v1-inference.yaml') + completer.set_line(str(default)) done = False while not done: config_file = input('Configuration file for this model: ').strip() From fc2098834d51f673eabdc58e311cff4e6e6bfe3e Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 17 Jan 2023 08:11:19 -0500 Subject: [PATCH 2/4] support direct loading of .safetensors models - Small fix to allow ckpt files with the .safetensors suffix to be directly loaded, rather than undergo a conversion step first. --- ldm/invoke/model_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ldm/invoke/model_manager.py b/ldm/invoke/model_manager.py index 880d75476f..eeb2208c91 100644 --- a/ldm/invoke/model_manager.py +++ b/ldm/invoke/model_manager.py @@ -142,7 +142,7 @@ class ModelManager(object): Return true if this is a legacy (.ckpt) model ''' info = self.model_info(model_name) - if 'weights' in info and info['weights'].endswith('.ckpt'): + if 'weights' in info and info['weights'].endswith(('.ckpt','.safetensors')): return True return False From 0b5c0c374e235b160238d36c6ba30d150df81d1a Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Tue, 17 Jan 2023 22:51:57 -0500 Subject: [PATCH 3/4] load safetensors vaes --- ldm/invoke/model_manager.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ldm/invoke/model_manager.py b/ldm/invoke/model_manager.py index eeb2208c91..9b0d21546a 100644 --- a/ldm/invoke/model_manager.py +++ b/ldm/invoke/model_manager.py @@ -359,7 +359,9 @@ class ModelManager(object): vae = os.path.normpath(os.path.join(Globals.root,vae)) if os.path.exists(vae): print(f' | Loading VAE weights from: {vae}') - vae_ckpt = torch.load(vae, map_location="cpu") + vae_ckpt = safetensors.torch.load_file(vae) \ + if vae.endswith('.safetensors') \ + else torch.load(vae, map_location="cpu") vae_dict = {k: v for k, v in vae_ckpt["state_dict"].items() if k[0:4] != "loss"} model.first_stage_model.load_state_dict(vae_dict, strict=False) else: From 1c62ae461e410c9c933571351cbae2e719cf3c68 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Wed, 18 Jan 2023 12:15:57 -0500 Subject: [PATCH 4/4] fix vae safetensor loading --- ldm/invoke/model_manager.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ldm/invoke/model_manager.py b/ldm/invoke/model_manager.py index 8aeeda650a..671e00aacd 100644 --- a/ldm/invoke/model_manager.py +++ b/ldm/invoke/model_manager.py @@ -359,10 +359,14 @@ class ModelManager(object): vae = os.path.normpath(os.path.join(Globals.root,vae)) if os.path.exists(vae): print(f' | Loading VAE weights from: {vae}') - vae_ckpt = safetensors.torch.load_file(vae) \ - if vae.endswith('.safetensors') \ - else torch.load(vae, map_location="cpu") - vae_dict = {k: v for k, v in vae_ckpt["state_dict"].items() if k[0:4] != "loss"} + vae_ckpt = None + vae_dict = None + if vae.endswith('.safetensors'): + vae_ckpt = safetensors.torch.load_file(vae) + vae_dict = {k: v for k, v in vae_ckpt.items() if k[0:4] != "loss"} + else: + vae_ckpt = torch.load(vae, map_location="cpu") + vae_dict = {k: v for k, v in vae_ckpt['state_dict'].items() if k[0:4] != "loss"} model.first_stage_model.load_state_dict(vae_dict, strict=False) else: print(f' | VAE file {vae} not found. Skipping.')