Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a0563a3fa0 | ||
|
|
ba0795aaaa | ||
|
|
9538b054cd | ||
|
|
71b536c47f | ||
|
|
b03791e456 | ||
|
|
fd0acd2b50 |
@@ -811,6 +811,7 @@ def load_sparsectrl(ckpt_path: str, controlnet_data: dict[str, Tensor]=None, tim
|
|||||||
controlnet_config["operations"] = manual_cast_clean_groupnorm
|
controlnet_config["operations"] = manual_cast_clean_groupnorm
|
||||||
else:
|
else:
|
||||||
controlnet_config["operations"] = disable_weight_init_clean_groupnorm
|
controlnet_config["operations"] = disable_weight_init_clean_groupnorm
|
||||||
|
controlnet_config["dtype"] = unet_dtype
|
||||||
controlnet_config.pop("out_channels")
|
controlnet_config.pop("out_channels")
|
||||||
# get proper hint channels
|
# get proper hint channels
|
||||||
if use_simplified_conditioning_embedding:
|
if use_simplified_conditioning_embedding:
|
||||||
@@ -845,6 +846,10 @@ def load_sparsectrl(ckpt_path: str, controlnet_data: dict[str, Tensor]=None, tim
|
|||||||
missing, unexpected = control_model.load_state_dict(controlnet_data, strict=False)
|
missing, unexpected = control_model.load_state_dict(controlnet_data, strict=False)
|
||||||
if len(missing) > 0 or len(unexpected) > 0:
|
if len(missing) > 0 or len(unexpected) > 0:
|
||||||
logger.info(f"SparseCtrl ControlNet: {missing}, {unexpected}")
|
logger.info(f"SparseCtrl ControlNet: {missing}, {unexpected}")
|
||||||
|
# cast control_model to the intended dtype; load_state_dict can leave weights
|
||||||
|
# in their on-disk dtype (e.g. comfy's lazy/zero-copy state dict loading), which
|
||||||
|
# would otherwise mismatch the activations at runtime
|
||||||
|
control_model = control_model.to(unet_dtype)
|
||||||
|
|
||||||
global_average_pooling = False
|
global_average_pooling = False
|
||||||
filename = os.path.splitext(ckpt_path)[0]
|
filename = os.path.splitext(ckpt_path)[0]
|
||||||
@@ -944,6 +949,7 @@ def load_svdcontrolnet(ckpt_path: str, controlnet_data: dict[str, Tensor]=None,
|
|||||||
manual_cast_dtype = comfy.model_management.unet_manual_cast(unet_dtype, load_device)
|
manual_cast_dtype = comfy.model_management.unet_manual_cast(unet_dtype, load_device)
|
||||||
if manual_cast_dtype is not None:
|
if manual_cast_dtype is not None:
|
||||||
controlnet_config["operations"] = comfy.ops.manual_cast
|
controlnet_config["operations"] = comfy.ops.manual_cast
|
||||||
|
controlnet_config["dtype"] = unet_dtype
|
||||||
controlnet_config.pop("out_channels")
|
controlnet_config.pop("out_channels")
|
||||||
controlnet_config["hint_channels"] = controlnet_data["{}input_hint_block.0.weight".format(prefix)].shape[1]
|
controlnet_config["hint_channels"] = controlnet_data["{}input_hint_block.0.weight".format(prefix)].shape[1]
|
||||||
control_model = SVDControlNet(**controlnet_config)
|
control_model = SVDControlNet(**controlnet_config)
|
||||||
@@ -972,6 +978,10 @@ def load_svdcontrolnet(ckpt_path: str, controlnet_data: dict[str, Tensor]=None,
|
|||||||
missing, unexpected = control_model.load_state_dict(controlnet_data, strict=False)
|
missing, unexpected = control_model.load_state_dict(controlnet_data, strict=False)
|
||||||
if len(missing) > 0 or len(unexpected) > 0:
|
if len(missing) > 0 or len(unexpected) > 0:
|
||||||
logger.info(f"SVD-ControlNet: {missing}, {unexpected}")
|
logger.info(f"SVD-ControlNet: {missing}, {unexpected}")
|
||||||
|
# cast control_model to the intended dtype; load_state_dict can leave weights
|
||||||
|
# in their on-disk dtype (e.g. comfy's lazy/zero-copy state dict loading), which
|
||||||
|
# would otherwise mismatch the activations at runtime
|
||||||
|
control_model = control_model.to(unet_dtype)
|
||||||
|
|
||||||
global_average_pooling = False
|
global_average_pooling = False
|
||||||
filename = os.path.splitext(ckpt_path)[0]
|
filename = os.path.splitext(ckpt_path)[0]
|
||||||
|
|||||||
@@ -338,8 +338,10 @@ class AbstractPreprocWrapper:
|
|||||||
class disable_weight_init_clean_groupnorm(comfy.ops.disable_weight_init):
|
class disable_weight_init_clean_groupnorm(comfy.ops.disable_weight_init):
|
||||||
class GroupNorm(comfy.ops.disable_weight_init.GroupNorm):
|
class GroupNorm(comfy.ops.disable_weight_init.GroupNorm):
|
||||||
def forward_comfy_cast_weights(self, input):
|
def forward_comfy_cast_weights(self, input):
|
||||||
weight, bias = comfy.ops.cast_bias_weight(self, input)
|
weight, bias, offload_stream = comfy.ops.cast_bias_weight(self, input, offloadable=True)
|
||||||
return torch.nn.functional.group_norm(input, self.num_groups, weight, bias, self.eps)
|
x = torch.nn.functional.group_norm(input, self.num_groups, weight, bias, self.eps)
|
||||||
|
comfy.ops.uncast_bias_weight(self, weight, bias, offload_stream)
|
||||||
|
return x
|
||||||
|
|
||||||
def forward(self, input):
|
def forward(self, input):
|
||||||
if self.comfy_cast_weights:
|
if self.comfy_cast_weights:
|
||||||
|
|||||||
+2
-1
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "comfyui-advanced-controlnet"
|
name = "comfyui-advanced-controlnet"
|
||||||
description = "Nodes for scheduling ControlNet strength across timesteps and batched latents, as well as applying custom weights and attention masks."
|
description = "Nodes for scheduling ControlNet strength across timesteps and batched latents, as well as applying custom weights and attention masks."
|
||||||
version = "1.5.6"
|
version = "1.5.8"
|
||||||
license = { file = "LICENSE" }
|
license = { file = "LICENSE" }
|
||||||
dependencies = []
|
dependencies = []
|
||||||
|
|
||||||
@@ -13,3 +13,4 @@ Repository = "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet"
|
|||||||
PublisherId = "kosinkadink"
|
PublisherId = "kosinkadink"
|
||||||
DisplayName = "ComfyUI-Advanced-ControlNet"
|
DisplayName = "ComfyUI-Advanced-ControlNet"
|
||||||
Icon = ""
|
Icon = ""
|
||||||
|
requires-comfyui = ">=0.3.68"
|
||||||
|
|||||||
Reference in New Issue
Block a user