Files
pkpkTech-ComfyUI-TemporaryL…/LoadTempCheckpoint.py
T
2024-02-04 12:35:58 +09:00

97 lines
4.0 KiB
Python

import torch
import folder_paths
import comfy.sd
import comfy.utils
import comfy.clip_vision
import comfy.model_detection
import comfy.model_management
import comfy.model_patcher
import comfy.checkpoint_pickle
from .utils import download_file, load_torch_bin
class LoadTempCheckpoint:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"ckpt_url": ("STRING", {"default": ""}),
"ckpt_type": (["auto", "safetensors", "other"], {"default": "auto"}),
"download_split": ("INT", {"default": 4, "min": 1, "max": 8, "step": 1})
},
}
RETURN_TYPES = ("MODEL", "CLIP", "VAE", "CLIP_VISION")
FUNCTION = "load_checkpoint"
CATEGORY = "temporary_loaders"
def load_checkpoint(self, ckpt_url, ckpt_type, download_split, output_model=True, output_vae=True, output_clip=True, output_clipvision=True):
bin, file_name = download_file(ckpt_url, download_split)
if bin is None:
raise file_name if file_name is not None else Exception("Download failed.")
is_safetensors = file_name.endswith(".safetensors") if ckpt_type =="auto" else ckpt_type == "safetensors"
sd = load_torch_bin(bin, is_safetensors)
sd_keys = sd.keys()
clip = None
clipvision = None
vae = None
model = None
model_patcher = None
clip_target = None
parameters = comfy.utils.calculate_parameters(sd, "model.diffusion_model.")
unet_dtype = comfy.model_management.unet_dtype(model_params=parameters)
load_device = comfy.model_management.get_torch_device()
manual_cast_dtype = comfy.model_management.unet_manual_cast(unet_dtype, load_device)
class WeightsLoader(torch.nn.Module):
pass
model_config = comfy.model_detection.model_config_from_unet(sd, "model.diffusion_model.", unet_dtype)
model_config.set_manual_cast(manual_cast_dtype)
if model_config is None:
raise RuntimeError("ERROR: Could not detect model type of: {}".format(ckpt_url))
if model_config.clip_vision_prefix is not None:
if output_clipvision:
clipvision = comfy.clip_vision.load_clipvision_from_sd(sd, model_config.clip_vision_prefix, True)
if output_model:
inital_load_device = comfy.model_management.unet_inital_load_device(parameters, unet_dtype)
offload_device = comfy.model_management.unet_offload_device()
model = model_config.get_model(sd, "model.diffusion_model.", device=inital_load_device)
model.load_model_weights(sd, "model.diffusion_model.")
if output_vae:
# vae_sd = comfy.utils.state_dict_prefix_replace(sd, {k: "" for k in model_config.vae_key_prefix}, filter_keys=True)
vae_sd = comfy.utils.state_dict_prefix_replace(sd, {k: "" for k in "first_stage_model."}, filter_keys=True)
vae_sd = model_config.process_vae_state_dict(vae_sd)
vae = comfy.sd.VAE(sd=vae_sd)
if output_clip:
w = WeightsLoader()
clip_target = model_config.clip_target()
if clip_target is not None:
clip = comfy.sd.CLIP(clip_target, embedding_directory=folder_paths.get_folder_paths("embeddings"))
w.cond_stage_model = clip.cond_stage_model
sd = model_config.process_clip_state_dict(sd)
comfy.sd.load_model_weights(w, sd)
left_over = sd.keys()
if len(left_over) > 0:
print("left over keys:", left_over)
if output_model:
model_patcher = comfy.model_patcher.ModelPatcher(model, load_device=load_device, offload_device=comfy.model_management.unet_offload_device(), current_device=inital_load_device)
if inital_load_device != torch.device("cpu"):
print("loaded straight to GPU")
comfy.model_management.load_model_gpu(model_patcher)
return (model_patcher, clip, vae, clipvision)