mirror of
https://git.datalinker.icu/comfyanonymous/ComfyUI
synced 2026-11-12 23:07:03 +08:00
Merge branch 'comfyanonymous:master' into master
This commit is contained in:
commit
c7577be4d7
@ -240,7 +240,7 @@ def convert_text_enc_state_dict_v20(text_enc_dict, prefix=""):
|
|||||||
text_proj = "transformer.text_projection.weight"
|
text_proj = "transformer.text_projection.weight"
|
||||||
if k.endswith(text_proj):
|
if k.endswith(text_proj):
|
||||||
new_state_dict[k.replace(text_proj, "text_projection")] = v.transpose(0, 1).contiguous()
|
new_state_dict[k.replace(text_proj, "text_projection")] = v.transpose(0, 1).contiguous()
|
||||||
|
else:
|
||||||
relabelled_key = textenc_pattern.sub(lambda m: protected[re.escape(m.group(0))], k)
|
relabelled_key = textenc_pattern.sub(lambda m: protected[re.escape(m.group(0))], k)
|
||||||
new_state_dict[relabelled_key] = v
|
new_state_dict[relabelled_key] = v
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import torch
|
||||||
|
|
||||||
class LatentFormat:
|
class LatentFormat:
|
||||||
scale_factor = 1.0
|
scale_factor = 1.0
|
||||||
@ -34,6 +35,32 @@ class SDXL(LatentFormat):
|
|||||||
]
|
]
|
||||||
self.taesd_decoder_name = "taesdxl_decoder"
|
self.taesd_decoder_name = "taesdxl_decoder"
|
||||||
|
|
||||||
|
class SDXL_Playground_2_5(LatentFormat):
|
||||||
|
def __init__(self):
|
||||||
|
self.scale_factor = 0.5
|
||||||
|
self.latents_mean = torch.tensor([-1.6574, 1.886, -1.383, 2.5155]).view(1, 4, 1, 1)
|
||||||
|
self.latents_std = torch.tensor([8.4927, 5.9022, 6.5498, 5.2299]).view(1, 4, 1, 1)
|
||||||
|
|
||||||
|
self.latent_rgb_factors = [
|
||||||
|
# R G B
|
||||||
|
[ 0.3920, 0.4054, 0.4549],
|
||||||
|
[-0.2634, -0.0196, 0.0653],
|
||||||
|
[ 0.0568, 0.1687, -0.0755],
|
||||||
|
[-0.3112, -0.2359, -0.2076]
|
||||||
|
]
|
||||||
|
self.taesd_decoder_name = "taesdxl_decoder"
|
||||||
|
|
||||||
|
def process_in(self, latent):
|
||||||
|
latents_mean = self.latents_mean.to(latent.device, latent.dtype)
|
||||||
|
latents_std = self.latents_std.to(latent.device, latent.dtype)
|
||||||
|
return (latent - latents_mean) * self.scale_factor / latents_std
|
||||||
|
|
||||||
|
def process_out(self, latent):
|
||||||
|
latents_mean = self.latents_mean.to(latent.device, latent.dtype)
|
||||||
|
latents_std = self.latents_std.to(latent.device, latent.dtype)
|
||||||
|
return latent * latents_std / self.scale_factor + latents_mean
|
||||||
|
|
||||||
|
|
||||||
class SD_X4(LatentFormat):
|
class SD_X4(LatentFormat):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.scale_factor = 0.08333
|
self.scale_factor = 0.08333
|
||||||
|
|||||||
@ -484,7 +484,6 @@ class UNetModel(nn.Module):
|
|||||||
self.predict_codebook_ids = n_embed is not None
|
self.predict_codebook_ids = n_embed is not None
|
||||||
|
|
||||||
self.default_num_video_frames = None
|
self.default_num_video_frames = None
|
||||||
self.default_image_only_indicator = None
|
|
||||||
|
|
||||||
time_embed_dim = model_channels * 4
|
time_embed_dim = model_channels * 4
|
||||||
self.time_embed = nn.Sequential(
|
self.time_embed = nn.Sequential(
|
||||||
@ -708,6 +707,9 @@ class UNetModel(nn.Module):
|
|||||||
device=device,
|
device=device,
|
||||||
operations=operations
|
operations=operations
|
||||||
)]
|
)]
|
||||||
|
|
||||||
|
self.middle_block = None
|
||||||
|
if transformer_depth_middle >= -1:
|
||||||
if transformer_depth_middle >= 0:
|
if transformer_depth_middle >= 0:
|
||||||
mid_block += [get_attention_layer( # always uses a self-attn
|
mid_block += [get_attention_layer( # always uses a self-attn
|
||||||
ch, num_heads, dim_head, depth=transformer_depth_middle, context_dim=context_dim,
|
ch, num_heads, dim_head, depth=transformer_depth_middle, context_dim=context_dim,
|
||||||
@ -827,7 +829,7 @@ class UNetModel(nn.Module):
|
|||||||
transformer_patches = transformer_options.get("patches", {})
|
transformer_patches = transformer_options.get("patches", {})
|
||||||
|
|
||||||
num_video_frames = kwargs.get("num_video_frames", self.default_num_video_frames)
|
num_video_frames = kwargs.get("num_video_frames", self.default_num_video_frames)
|
||||||
image_only_indicator = kwargs.get("image_only_indicator", self.default_image_only_indicator)
|
image_only_indicator = kwargs.get("image_only_indicator", None)
|
||||||
time_context = kwargs.get("time_context", None)
|
time_context = kwargs.get("time_context", None)
|
||||||
|
|
||||||
assert (y is not None) == (
|
assert (y is not None) == (
|
||||||
@ -858,6 +860,7 @@ class UNetModel(nn.Module):
|
|||||||
h = p(h, transformer_options)
|
h = p(h, transformer_options)
|
||||||
|
|
||||||
transformer_options["block"] = ("middle", 0)
|
transformer_options["block"] = ("middle", 0)
|
||||||
|
if self.middle_block is not None:
|
||||||
h = forward_timestep_embed(self.middle_block, h, emb, context, transformer_options, time_context=time_context, num_video_frames=num_video_frames, image_only_indicator=image_only_indicator)
|
h = forward_timestep_embed(self.middle_block, h, emb, context, transformer_options, time_context=time_context, num_video_frames=num_video_frames, image_only_indicator=image_only_indicator)
|
||||||
h = apply_control(h, control, 'middle')
|
h = apply_control(h, control, 'middle')
|
||||||
|
|
||||||
|
|||||||
@ -46,18 +46,20 @@ class AlphaBlender(nn.Module):
|
|||||||
else:
|
else:
|
||||||
raise ValueError(f"unknown merge strategy {self.merge_strategy}")
|
raise ValueError(f"unknown merge strategy {self.merge_strategy}")
|
||||||
|
|
||||||
def get_alpha(self, image_only_indicator: torch.Tensor) -> torch.Tensor:
|
def get_alpha(self, image_only_indicator: torch.Tensor, device) -> torch.Tensor:
|
||||||
# skip_time_mix = rearrange(repeat(skip_time_mix, 'b -> (b t) () () ()', t=t), '(b t) 1 ... -> b 1 t ...', t=t)
|
# skip_time_mix = rearrange(repeat(skip_time_mix, 'b -> (b t) () () ()', t=t), '(b t) 1 ... -> b 1 t ...', t=t)
|
||||||
if self.merge_strategy == "fixed":
|
if self.merge_strategy == "fixed":
|
||||||
# make shape compatible
|
# make shape compatible
|
||||||
# alpha = repeat(self.mix_factor, '1 -> b () t () ()', t=t, b=bs)
|
# alpha = repeat(self.mix_factor, '1 -> b () t () ()', t=t, b=bs)
|
||||||
alpha = self.mix_factor.to(image_only_indicator.device)
|
alpha = self.mix_factor.to(device)
|
||||||
elif self.merge_strategy == "learned":
|
elif self.merge_strategy == "learned":
|
||||||
alpha = torch.sigmoid(self.mix_factor.to(image_only_indicator.device))
|
alpha = torch.sigmoid(self.mix_factor.to(device))
|
||||||
# make shape compatible
|
# make shape compatible
|
||||||
# alpha = repeat(alpha, '1 -> s () ()', s = t * bs)
|
# alpha = repeat(alpha, '1 -> s () ()', s = t * bs)
|
||||||
elif self.merge_strategy == "learned_with_images":
|
elif self.merge_strategy == "learned_with_images":
|
||||||
assert image_only_indicator is not None, "need image_only_indicator ..."
|
if image_only_indicator is None:
|
||||||
|
alpha = rearrange(torch.sigmoid(self.mix_factor.to(device)), "... -> ... 1")
|
||||||
|
else:
|
||||||
alpha = torch.where(
|
alpha = torch.where(
|
||||||
image_only_indicator.bool(),
|
image_only_indicator.bool(),
|
||||||
torch.ones(1, 1, device=image_only_indicator.device),
|
torch.ones(1, 1, device=image_only_indicator.device),
|
||||||
@ -76,7 +78,7 @@ class AlphaBlender(nn.Module):
|
|||||||
x_temporal,
|
x_temporal,
|
||||||
image_only_indicator=None,
|
image_only_indicator=None,
|
||||||
) -> torch.Tensor:
|
) -> torch.Tensor:
|
||||||
alpha = self.get_alpha(image_only_indicator)
|
alpha = self.get_alpha(image_only_indicator, x_spatial.device)
|
||||||
x = (
|
x = (
|
||||||
alpha.to(x_spatial.dtype) * x_spatial
|
alpha.to(x_spatial.dtype) * x_spatial
|
||||||
+ (1.0 - alpha).to(x_spatial.dtype) * x_temporal
|
+ (1.0 - alpha).to(x_spatial.dtype) * x_temporal
|
||||||
|
|||||||
@ -15,9 +15,10 @@ class ModelType(Enum):
|
|||||||
V_PREDICTION = 2
|
V_PREDICTION = 2
|
||||||
V_PREDICTION_EDM = 3
|
V_PREDICTION_EDM = 3
|
||||||
STABLE_CASCADE = 4
|
STABLE_CASCADE = 4
|
||||||
|
EDM = 5
|
||||||
|
|
||||||
|
|
||||||
from comfy.model_sampling import EPS, V_PREDICTION, ModelSamplingDiscrete, ModelSamplingContinuousEDM, StableCascadeSampling
|
from comfy.model_sampling import EPS, V_PREDICTION, EDM, ModelSamplingDiscrete, ModelSamplingContinuousEDM, StableCascadeSampling
|
||||||
|
|
||||||
|
|
||||||
def model_sampling(model_config, model_type):
|
def model_sampling(model_config, model_type):
|
||||||
@ -33,6 +34,9 @@ def model_sampling(model_config, model_type):
|
|||||||
elif model_type == ModelType.STABLE_CASCADE:
|
elif model_type == ModelType.STABLE_CASCADE:
|
||||||
c = EPS
|
c = EPS
|
||||||
s = StableCascadeSampling
|
s = StableCascadeSampling
|
||||||
|
elif model_type == ModelType.EDM:
|
||||||
|
c = EDM
|
||||||
|
s = ModelSamplingContinuousEDM
|
||||||
|
|
||||||
class ModelSampling(s, c):
|
class ModelSampling(s, c):
|
||||||
pass
|
pass
|
||||||
@ -368,7 +372,6 @@ class SVD_img2vid(BaseModel):
|
|||||||
if "time_conditioning" in kwargs:
|
if "time_conditioning" in kwargs:
|
||||||
out["time_context"] = comfy.conds.CONDCrossAttn(kwargs["time_conditioning"])
|
out["time_context"] = comfy.conds.CONDCrossAttn(kwargs["time_conditioning"])
|
||||||
|
|
||||||
out['image_only_indicator'] = comfy.conds.CONDConstant(torch.zeros((1,), device=device))
|
|
||||||
out['num_video_frames'] = comfy.conds.CONDConstant(noise.shape[0])
|
out['num_video_frames'] = comfy.conds.CONDConstant(noise.shape[0])
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|||||||
@ -151,8 +151,10 @@ def detect_unet_config(state_dict, key_prefix):
|
|||||||
channel_mult.append(last_channel_mult)
|
channel_mult.append(last_channel_mult)
|
||||||
if "{}middle_block.1.proj_in.weight".format(key_prefix) in state_dict_keys:
|
if "{}middle_block.1.proj_in.weight".format(key_prefix) in state_dict_keys:
|
||||||
transformer_depth_middle = count_blocks(state_dict_keys, '{}middle_block.1.transformer_blocks.'.format(key_prefix) + '{}')
|
transformer_depth_middle = count_blocks(state_dict_keys, '{}middle_block.1.transformer_blocks.'.format(key_prefix) + '{}')
|
||||||
else:
|
elif "{}middle_block.0.in_layers.0.weight".format(key_prefix) in state_dict_keys:
|
||||||
transformer_depth_middle = -1
|
transformer_depth_middle = -1
|
||||||
|
else:
|
||||||
|
transformer_depth_middle = -2
|
||||||
|
|
||||||
unet_config["in_channels"] = in_channels
|
unet_config["in_channels"] = in_channels
|
||||||
unet_config["out_channels"] = out_channels
|
unet_config["out_channels"] = out_channels
|
||||||
@ -242,6 +244,7 @@ def unet_config_from_diffusers_unet(state_dict, dtype=None):
|
|||||||
down_blocks = count_blocks(state_dict, "down_blocks.{}")
|
down_blocks = count_blocks(state_dict, "down_blocks.{}")
|
||||||
for i in range(down_blocks):
|
for i in range(down_blocks):
|
||||||
attn_blocks = count_blocks(state_dict, "down_blocks.{}.attentions.".format(i) + '{}')
|
attn_blocks = count_blocks(state_dict, "down_blocks.{}.attentions.".format(i) + '{}')
|
||||||
|
res_blocks = count_blocks(state_dict, "down_blocks.{}.resnets.".format(i) + '{}')
|
||||||
for ab in range(attn_blocks):
|
for ab in range(attn_blocks):
|
||||||
transformer_count = count_blocks(state_dict, "down_blocks.{}.attentions.{}.transformer_blocks.".format(i, ab) + '{}')
|
transformer_count = count_blocks(state_dict, "down_blocks.{}.attentions.{}.transformer_blocks.".format(i, ab) + '{}')
|
||||||
transformer_depth.append(transformer_count)
|
transformer_depth.append(transformer_count)
|
||||||
@ -250,7 +253,7 @@ def unet_config_from_diffusers_unet(state_dict, dtype=None):
|
|||||||
|
|
||||||
attn_res *= 2
|
attn_res *= 2
|
||||||
if attn_blocks == 0:
|
if attn_blocks == 0:
|
||||||
transformer_depth.append(0)
|
for i in range(res_blocks):
|
||||||
transformer_depth.append(0)
|
transformer_depth.append(0)
|
||||||
|
|
||||||
match["transformer_depth"] = transformer_depth
|
match["transformer_depth"] = transformer_depth
|
||||||
@ -329,7 +332,19 @@ def unet_config_from_diffusers_unet(state_dict, dtype=None):
|
|||||||
'channel_mult': [1, 2, 4], 'transformer_depth_middle': -1, 'use_linear_in_transformer': True, 'context_dim': 2048, 'num_head_channels': 64,
|
'channel_mult': [1, 2, 4], 'transformer_depth_middle': -1, 'use_linear_in_transformer': True, 'context_dim': 2048, 'num_head_channels': 64,
|
||||||
'use_temporal_attention': False, 'use_temporal_resblock': False}
|
'use_temporal_attention': False, 'use_temporal_resblock': False}
|
||||||
|
|
||||||
supported_models = [SDXL, SDXL_refiner, SD21, SD15, SD21_uncliph, SD21_unclipl, SDXL_mid_cnet, SDXL_small_cnet, SDXL_diffusers_inpaint, SSD_1B, Segmind_Vega]
|
KOALA_700M = {'use_checkpoint': False, 'image_size': 32, 'out_channels': 4, 'use_spatial_transformer': True, 'legacy': False,
|
||||||
|
'num_classes': 'sequential', 'adm_in_channels': 2816, 'dtype': dtype, 'in_channels': 4, 'model_channels': 320,
|
||||||
|
'num_res_blocks': [1, 1, 1], 'transformer_depth': [0, 2, 5], 'transformer_depth_output': [0, 0, 2, 2, 5, 5],
|
||||||
|
'channel_mult': [1, 2, 4], 'transformer_depth_middle': -2, 'use_linear_in_transformer': True, 'context_dim': 2048, 'num_head_channels': 64,
|
||||||
|
'use_temporal_attention': False, 'use_temporal_resblock': False}
|
||||||
|
|
||||||
|
KOALA_1B = {'use_checkpoint': False, 'image_size': 32, 'out_channels': 4, 'use_spatial_transformer': True, 'legacy': False,
|
||||||
|
'num_classes': 'sequential', 'adm_in_channels': 2816, 'dtype': dtype, 'in_channels': 4, 'model_channels': 320,
|
||||||
|
'num_res_blocks': [1, 1, 1], 'transformer_depth': [0, 2, 6], 'transformer_depth_output': [0, 0, 2, 2, 6, 6],
|
||||||
|
'channel_mult': [1, 2, 4], 'transformer_depth_middle': 6, 'use_linear_in_transformer': True, 'context_dim': 2048, 'num_head_channels': 64,
|
||||||
|
'use_temporal_attention': False, 'use_temporal_resblock': False}
|
||||||
|
|
||||||
|
supported_models = [SDXL, SDXL_refiner, SD21, SD15, SD21_uncliph, SD21_unclipl, SDXL_mid_cnet, SDXL_small_cnet, SDXL_diffusers_inpaint, SSD_1B, Segmind_Vega, KOALA_700M, KOALA_1B]
|
||||||
|
|
||||||
for unet_config in supported_models:
|
for unet_config in supported_models:
|
||||||
matches = True
|
matches = True
|
||||||
|
|||||||
@ -11,12 +11,25 @@ class EPS:
|
|||||||
sigma = sigma.view(sigma.shape[:1] + (1,) * (model_output.ndim - 1))
|
sigma = sigma.view(sigma.shape[:1] + (1,) * (model_output.ndim - 1))
|
||||||
return model_input - model_output * sigma
|
return model_input - model_output * sigma
|
||||||
|
|
||||||
|
def noise_scaling(self, sigma, noise, latent_image, max_denoise=False):
|
||||||
|
if max_denoise:
|
||||||
|
noise = noise * torch.sqrt(1.0 + sigma ** 2.0)
|
||||||
|
else:
|
||||||
|
noise = noise * sigma
|
||||||
|
if latent_image is not None:
|
||||||
|
noise += latent_image
|
||||||
|
return noise
|
||||||
|
|
||||||
class V_PREDICTION(EPS):
|
class V_PREDICTION(EPS):
|
||||||
def calculate_denoised(self, sigma, model_output, model_input):
|
def calculate_denoised(self, sigma, model_output, model_input):
|
||||||
sigma = sigma.view(sigma.shape[:1] + (1,) * (model_output.ndim - 1))
|
sigma = sigma.view(sigma.shape[:1] + (1,) * (model_output.ndim - 1))
|
||||||
return model_input * self.sigma_data ** 2 / (sigma ** 2 + self.sigma_data ** 2) - model_output * sigma * self.sigma_data / (sigma ** 2 + self.sigma_data ** 2) ** 0.5
|
return model_input * self.sigma_data ** 2 / (sigma ** 2 + self.sigma_data ** 2) - model_output * sigma * self.sigma_data / (sigma ** 2 + self.sigma_data ** 2) ** 0.5
|
||||||
|
|
||||||
|
class EDM(V_PREDICTION):
|
||||||
|
def calculate_denoised(self, sigma, model_output, model_input):
|
||||||
|
sigma = sigma.view(sigma.shape[:1] + (1,) * (model_output.ndim - 1))
|
||||||
|
return model_input * self.sigma_data ** 2 / (sigma ** 2 + self.sigma_data ** 2) + model_output * sigma * self.sigma_data / (sigma ** 2 + self.sigma_data ** 2) ** 0.5
|
||||||
|
|
||||||
|
|
||||||
class ModelSamplingDiscrete(torch.nn.Module):
|
class ModelSamplingDiscrete(torch.nn.Module):
|
||||||
def __init__(self, model_config=None):
|
def __init__(self, model_config=None):
|
||||||
@ -92,8 +105,6 @@ class ModelSamplingDiscrete(torch.nn.Module):
|
|||||||
class ModelSamplingContinuousEDM(torch.nn.Module):
|
class ModelSamplingContinuousEDM(torch.nn.Module):
|
||||||
def __init__(self, model_config=None):
|
def __init__(self, model_config=None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.sigma_data = 1.0
|
|
||||||
|
|
||||||
if model_config is not None:
|
if model_config is not None:
|
||||||
sampling_settings = model_config.sampling_settings
|
sampling_settings = model_config.sampling_settings
|
||||||
else:
|
else:
|
||||||
@ -101,9 +112,11 @@ class ModelSamplingContinuousEDM(torch.nn.Module):
|
|||||||
|
|
||||||
sigma_min = sampling_settings.get("sigma_min", 0.002)
|
sigma_min = sampling_settings.get("sigma_min", 0.002)
|
||||||
sigma_max = sampling_settings.get("sigma_max", 120.0)
|
sigma_max = sampling_settings.get("sigma_max", 120.0)
|
||||||
self.set_sigma_range(sigma_min, sigma_max)
|
sigma_data = sampling_settings.get("sigma_data", 1.0)
|
||||||
|
self.set_parameters(sigma_min, sigma_max, sigma_data)
|
||||||
|
|
||||||
def set_sigma_range(self, sigma_min, sigma_max):
|
def set_parameters(self, sigma_min, sigma_max, sigma_data):
|
||||||
|
self.sigma_data = sigma_data
|
||||||
sigmas = torch.linspace(math.log(sigma_min), math.log(sigma_max), 1000).exp()
|
sigmas = torch.linspace(math.log(sigma_min), math.log(sigma_max), 1000).exp()
|
||||||
|
|
||||||
self.register_buffer('sigmas', sigmas) #for compatibility with some schedulers
|
self.register_buffer('sigmas', sigmas) #for compatibility with some schedulers
|
||||||
|
|||||||
@ -278,7 +278,7 @@ class KSamplerX0Inpaint(torch.nn.Module):
|
|||||||
def forward(self, x, sigma, uncond, cond, cond_scale, denoise_mask, model_options={}, seed=None):
|
def forward(self, x, sigma, uncond, cond, cond_scale, denoise_mask, model_options={}, seed=None):
|
||||||
if denoise_mask is not None:
|
if denoise_mask is not None:
|
||||||
latent_mask = 1. - denoise_mask
|
latent_mask = 1. - denoise_mask
|
||||||
x = x * denoise_mask + (self.latent_image + self.noise * sigma.reshape([sigma.shape[0]] + [1] * (len(self.noise.shape) - 1))) * latent_mask
|
x = x * denoise_mask + self.inner_model.inner_model.model_sampling.noise_scaling(sigma.reshape([sigma.shape[0]] + [1] * (len(self.noise.shape) - 1)), self.noise, self.latent_image) * latent_mask
|
||||||
out = self.inner_model(x, sigma, cond=cond, uncond=uncond, cond_scale=cond_scale, model_options=model_options, seed=seed)
|
out = self.inner_model(x, sigma, cond=cond, uncond=uncond, cond_scale=cond_scale, model_options=model_options, seed=seed)
|
||||||
if denoise_mask is not None:
|
if denoise_mask is not None:
|
||||||
out = out * denoise_mask + self.latent_image * latent_mask
|
out = out * denoise_mask + self.latent_image * latent_mask
|
||||||
@ -534,19 +534,13 @@ class KSAMPLER(Sampler):
|
|||||||
else:
|
else:
|
||||||
model_k.noise = noise
|
model_k.noise = noise
|
||||||
|
|
||||||
if self.max_denoise(model_wrap, sigmas):
|
noise = model_wrap.inner_model.model_sampling.noise_scaling(sigmas[0], noise, latent_image, self.max_denoise(model_wrap, sigmas))
|
||||||
noise = noise * torch.sqrt(1.0 + sigmas[0] ** 2.0)
|
|
||||||
else:
|
|
||||||
noise = noise * sigmas[0]
|
|
||||||
|
|
||||||
k_callback = None
|
k_callback = None
|
||||||
total_steps = len(sigmas) - 1
|
total_steps = len(sigmas) - 1
|
||||||
if callback is not None:
|
if callback is not None:
|
||||||
k_callback = lambda x: callback(x["i"], x["denoised"], x["x"], total_steps)
|
k_callback = lambda x: callback(x["i"], x["denoised"], x["x"], total_steps)
|
||||||
|
|
||||||
if latent_image is not None:
|
|
||||||
noise += latent_image
|
|
||||||
|
|
||||||
samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)
|
samples = self.sampler_function(model_k, noise, sigmas, extra_args=extra_args, callback=k_callback, disable=disable_pbar, **self.extra_options)
|
||||||
return samples
|
return samples
|
||||||
|
|
||||||
@ -588,7 +582,7 @@ def sample(model, noise, positive, negative, cfg, device, sampler, sigmas, model
|
|||||||
calculate_start_end_timesteps(model, negative)
|
calculate_start_end_timesteps(model, negative)
|
||||||
calculate_start_end_timesteps(model, positive)
|
calculate_start_end_timesteps(model, positive)
|
||||||
|
|
||||||
if latent_image is not None:
|
if latent_image is not None and torch.count_nonzero(latent_image) > 0: #Don't shift the empty latent image.
|
||||||
latent_image = model.process_latent_in(latent_image)
|
latent_image = model.process_latent_in(latent_image)
|
||||||
|
|
||||||
if hasattr(model, 'extra_conds'):
|
if hasattr(model, 'extra_conds'):
|
||||||
|
|||||||
@ -163,7 +163,13 @@ class SDXL(supported_models_base.BASE):
|
|||||||
latent_format = latent_formats.SDXL
|
latent_format = latent_formats.SDXL
|
||||||
|
|
||||||
def model_type(self, state_dict, prefix=""):
|
def model_type(self, state_dict, prefix=""):
|
||||||
if "v_pred" in state_dict:
|
if 'edm_mean' in state_dict and 'edm_std' in state_dict: #Playground V2.5
|
||||||
|
self.latent_format = latent_formats.SDXL_Playground_2_5()
|
||||||
|
self.sampling_settings["sigma_data"] = 0.5
|
||||||
|
self.sampling_settings["sigma_max"] = 80.0
|
||||||
|
self.sampling_settings["sigma_min"] = 0.002
|
||||||
|
return model_base.ModelType.EDM
|
||||||
|
elif "v_pred" in state_dict:
|
||||||
return model_base.ModelType.V_PREDICTION
|
return model_base.ModelType.V_PREDICTION
|
||||||
else:
|
else:
|
||||||
return model_base.ModelType.EPS
|
return model_base.ModelType.EPS
|
||||||
@ -228,6 +234,26 @@ class Segmind_Vega(SDXL):
|
|||||||
"use_temporal_attention": False,
|
"use_temporal_attention": False,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class KOALA_700M(SDXL):
|
||||||
|
unet_config = {
|
||||||
|
"model_channels": 320,
|
||||||
|
"use_linear_in_transformer": True,
|
||||||
|
"transformer_depth": [0, 2, 5],
|
||||||
|
"context_dim": 2048,
|
||||||
|
"adm_in_channels": 2816,
|
||||||
|
"use_temporal_attention": False,
|
||||||
|
}
|
||||||
|
|
||||||
|
class KOALA_1B(SDXL):
|
||||||
|
unet_config = {
|
||||||
|
"model_channels": 320,
|
||||||
|
"use_linear_in_transformer": True,
|
||||||
|
"transformer_depth": [0, 2, 6],
|
||||||
|
"context_dim": 2048,
|
||||||
|
"adm_in_channels": 2816,
|
||||||
|
"use_temporal_attention": False,
|
||||||
|
}
|
||||||
|
|
||||||
class SVD_img2vid(supported_models_base.BASE):
|
class SVD_img2vid(supported_models_base.BASE):
|
||||||
unet_config = {
|
unet_config = {
|
||||||
"model_channels": 320,
|
"model_channels": 320,
|
||||||
@ -374,5 +400,5 @@ class Stable_Cascade_B(Stable_Cascade_C):
|
|||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
models = [Stable_Zero123, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXLRefiner, SDXL, SSD1B, Segmind_Vega, SD_X4Upscaler, Stable_Cascade_C, Stable_Cascade_B]
|
models = [Stable_Zero123, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXLRefiner, SDXL, SSD1B, KOALA_700M, KOALA_1B, Segmind_Vega, SD_X4Upscaler, Stable_Cascade_C, Stable_Cascade_B]
|
||||||
models += [SVD_img2vid]
|
models += [SVD_img2vid]
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import folder_paths
|
import folder_paths
|
||||||
import comfy.sd
|
import comfy.sd
|
||||||
import comfy.model_sampling
|
import comfy.model_sampling
|
||||||
|
import comfy.latent_formats
|
||||||
import torch
|
import torch
|
||||||
|
|
||||||
class LCM(comfy.model_sampling.EPS):
|
class LCM(comfy.model_sampling.EPS):
|
||||||
@ -135,7 +136,7 @@ class ModelSamplingContinuousEDM:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def INPUT_TYPES(s):
|
def INPUT_TYPES(s):
|
||||||
return {"required": { "model": ("MODEL",),
|
return {"required": { "model": ("MODEL",),
|
||||||
"sampling": (["v_prediction", "eps"],),
|
"sampling": (["v_prediction", "edm_playground_v2.5", "eps"],),
|
||||||
"sigma_max": ("FLOAT", {"default": 120.0, "min": 0.0, "max": 1000.0, "step":0.001, "round": False}),
|
"sigma_max": ("FLOAT", {"default": 120.0, "min": 0.0, "max": 1000.0, "step":0.001, "round": False}),
|
||||||
"sigma_min": ("FLOAT", {"default": 0.002, "min": 0.0, "max": 1000.0, "step":0.001, "round": False}),
|
"sigma_min": ("FLOAT", {"default": 0.002, "min": 0.0, "max": 1000.0, "step":0.001, "round": False}),
|
||||||
}}
|
}}
|
||||||
@ -148,17 +149,25 @@ class ModelSamplingContinuousEDM:
|
|||||||
def patch(self, model, sampling, sigma_max, sigma_min):
|
def patch(self, model, sampling, sigma_max, sigma_min):
|
||||||
m = model.clone()
|
m = model.clone()
|
||||||
|
|
||||||
|
latent_format = None
|
||||||
|
sigma_data = 1.0
|
||||||
if sampling == "eps":
|
if sampling == "eps":
|
||||||
sampling_type = comfy.model_sampling.EPS
|
sampling_type = comfy.model_sampling.EPS
|
||||||
elif sampling == "v_prediction":
|
elif sampling == "v_prediction":
|
||||||
sampling_type = comfy.model_sampling.V_PREDICTION
|
sampling_type = comfy.model_sampling.V_PREDICTION
|
||||||
|
elif sampling == "edm_playground_v2.5":
|
||||||
|
sampling_type = comfy.model_sampling.EDM
|
||||||
|
sigma_data = 0.5
|
||||||
|
latent_format = comfy.latent_formats.SDXL_Playground_2_5()
|
||||||
|
|
||||||
class ModelSamplingAdvanced(comfy.model_sampling.ModelSamplingContinuousEDM, sampling_type):
|
class ModelSamplingAdvanced(comfy.model_sampling.ModelSamplingContinuousEDM, sampling_type):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
model_sampling = ModelSamplingAdvanced(model.model.model_config)
|
model_sampling = ModelSamplingAdvanced(model.model.model_config)
|
||||||
model_sampling.set_sigma_range(sigma_min, sigma_max)
|
model_sampling.set_parameters(sigma_min, sigma_max, sigma_data)
|
||||||
m.add_object_patch("model_sampling", model_sampling)
|
m.add_object_patch("model_sampling", model_sampling)
|
||||||
|
if latent_format is not None:
|
||||||
|
m.add_object_patch("latent_format", latent_format)
|
||||||
return (m, )
|
return (m, )
|
||||||
|
|
||||||
class RescaleCFG:
|
class RescaleCFG:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user