aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLee Bousfield <ljbousfield@gmail.com>2023-01-08 10:17:50 -0700
committerLee Bousfield <ljbousfield@gmail.com>2023-01-08 10:17:50 -0700
commitcb255faec6e5f6b47b7632e6b7d450b9e2f6678b (patch)
treecd66342b905fea20d9db840feefde3a594c76fad
parent8850fc23b6e8a8e210bdfe4aade81516fb5770f3 (diff)
Add support for loading VAEs from safetensor files
-rw-r--r--modules/sd_vae.py21
1 files changed, 18 insertions, 3 deletions
diff --git a/modules/sd_vae.py b/modules/sd_vae.py
index ac71d62d..9fcfd9db 100644
--- a/modules/sd_vae.py
+++ b/modules/sd_vae.py
@@ -1,4 +1,5 @@
import torch
+import safetensors.torch
import os
import collections
from collections import namedtuple
@@ -72,8 +73,10 @@ def refresh_vae_list(vae_path=vae_path, model_path=model_path):
candidates = [
*glob.iglob(os.path.join(model_path, '**/*.vae.ckpt'), recursive=True),
*glob.iglob(os.path.join(model_path, '**/*.vae.pt'), recursive=True),
+ *glob.iglob(os.path.join(model_path, '**/*.vae.safetensors'), recursive=True),
*glob.iglob(os.path.join(vae_path, '**/*.ckpt'), recursive=True),
- *glob.iglob(os.path.join(vae_path, '**/*.pt'), recursive=True)
+ *glob.iglob(os.path.join(vae_path, '**/*.pt'), recursive=True),
+ *glob.iglob(os.path.join(vae_path, '**/*.safetensors'), recursive=True),
]
if shared.cmd_opts.vae_path is not None and os.path.isfile(shared.cmd_opts.vae_path):
candidates.append(shared.cmd_opts.vae_path)
@@ -137,6 +140,12 @@ def resolve_vae(checkpoint_file=None, vae_file="auto"):
if os.path.isfile(vae_file_try):
vae_file = vae_file_try
print(f"Using VAE found similar to selected model: {vae_file}")
+ # if still not found, try look for ".vae.safetensors" beside model
+ if vae_file == "auto":
+ vae_file_try = model_path + ".vae.safetensors"
+ if os.path.isfile(vae_file_try):
+ vae_file = vae_file_try
+ print(f"Using VAE found similar to selected model: {vae_file}")
# No more fallbacks for auto
if vae_file == "auto":
vae_file = None
@@ -163,8 +172,14 @@ def load_vae(model, vae_file=None):
assert os.path.isfile(vae_file), f"VAE file doesn't exist: {vae_file}"
print(f"Loading VAE weights from: {vae_file}")
store_base_vae(model)
- vae_ckpt = torch.load(vae_file, map_location=shared.weight_load_location)
- vae_dict_1 = {k: v for k, v in vae_ckpt["state_dict"].items() if k[0:4] != "loss" and k not in vae_ignore_keys}
+ _, extension = os.path.splitext(vae_file)
+ if extension.lower() == ".safetensors":
+ vae_ckpt = safetensors.torch.load_file(vae_file, device=shared.weight_load_location)
+ else:
+ vae_ckpt = torch.load(vae_file, map_location=shared.weight_load_location)
+ if "state_dict" in vae_ckpt:
+ vae_ckpt = vae_ckpt["state_dict"]
+ vae_dict_1 = {k: v for k, v in vae_ckpt.items() if k[0:4] != "loss" and k not in vae_ignore_keys}
_load_vae_dict(model, vae_dict_1)
if cache_enabled: