more extensions

This commit is contained in:
salt
2024-02-20 08:30:59 -08:00
parent 8048a05d12
commit 7053eec79c
145 changed files with 7747 additions and 2775 deletions
+14 -1
View File
@@ -1,5 +1,18 @@
__pycache__/ __pycache__/
*.py[cod] *.py[cod]
/output/
/input/
!/input/example.png
/models/
/temp/
/custom_nodes/
!custom_nodes/example_node.py.example
extra_model_paths.yaml
/.vs /.vs
.idea/ .idea/
venv/ venv/
/web/extensions/*
!/web/extensions/logging.js.example
!/web/extensions/core/
/tests-ui/data/object_info.json
/user/
+1 -1
View File
@@ -11,7 +11,7 @@ This ui will let you design and execute advanced stable diffusion pipelines usin
## Features ## Features
- Nodes/graph/flowchart interface to experiment and create complex Stable Diffusion workflows without needing to code anything. - Nodes/graph/flowchart interface to experiment and create complex Stable Diffusion workflows without needing to code anything.
- Fully supports SD1.x, SD2.x, [SDXL](https://comfyanonymous.github.io/ComfyUI_examples/sdxl/) and [Stable Video Diffusion](https://comfyanonymous.github.io/ComfyUI_examples/video/) - Fully supports SD1.x, SD2.x, [SDXL](https://comfyanonymous.github.io/ComfyUI_examples/sdxl/), [Stable Video Diffusion](https://comfyanonymous.github.io/ComfyUI_examples/video/) and [Stable Cascade](https://comfyanonymous.github.io/ComfyUI_examples/stable_cascade/)
- Asynchronous Queue system - Asynchronous Queue system
- Many optimizations: Only re-executes the parts of the workflow that changes between executions. - Many optimizations: Only re-executes the parts of the workflow that changes between executions.
- Command line option: ```--lowvram``` to make it work on GPUs with less than 3GB vram (enabled automatically on GPUs with low vram) - Command line option: ```--lowvram``` to make it work on GPUs with less than 3GB vram (enabled automatically on GPUs with low vram)
+1 -1
View File
@@ -97,7 +97,7 @@ class CLIPTextModel_(torch.nn.Module):
x = self.embeddings(input_tokens) x = self.embeddings(input_tokens)
mask = None mask = None
if attention_mask is not None: if attention_mask is not None:
mask = 1.0 - attention_mask.to(x.dtype).unsqueeze(1).unsqueeze(1).expand(attention_mask.shape[0], 1, attention_mask.shape[-1], attention_mask.shape[-1]) mask = 1.0 - attention_mask.to(x.dtype).reshape((attention_mask.shape[0], 1, -1, attention_mask.shape[-1])).expand(attention_mask.shape[0], 1, attention_mask.shape[-1], attention_mask.shape[-1])
mask = mask.masked_fill(mask.to(torch.bool), float("-inf")) mask = mask.masked_fill(mask.to(torch.bool), float("-inf"))
causal_mask = torch.empty(x.shape[1], x.shape[1], dtype=x.dtype, device=x.device).fill_(float("-inf")).triu_(1) causal_mask = torch.empty(x.shape[1], x.shape[1], dtype=x.dtype, device=x.device).fill_(float("-inf")).triu_(1)
+14 -5
View File
@@ -166,7 +166,7 @@ class ControlNet(ControlBase):
if x_noisy.shape[0] != self.cond_hint.shape[0]: if x_noisy.shape[0] != self.cond_hint.shape[0]:
self.cond_hint = broadcast_image_to(self.cond_hint, x_noisy.shape[0], batched_number) self.cond_hint = broadcast_image_to(self.cond_hint, x_noisy.shape[0], batched_number)
context = cond['c_crossattn'] context = cond.get('crossattn_controlnet', cond['c_crossattn'])
y = cond.get('y', None) y = cond.get('y', None)
if y is not None: if y is not None:
y = y.to(dtype) y = y.to(dtype)
@@ -318,9 +318,10 @@ def load_controlnet(ckpt_path, model=None):
return ControlLora(controlnet_data) return ControlLora(controlnet_data)
controlnet_config = None controlnet_config = None
supported_inference_dtypes = None
if "controlnet_cond_embedding.conv_in.weight" in controlnet_data: #diffusers format if "controlnet_cond_embedding.conv_in.weight" in controlnet_data: #diffusers format
unet_dtype = comfy.model_management.unet_dtype() controlnet_config = comfy.model_detection.unet_config_from_diffusers_unet(controlnet_data)
controlnet_config = comfy.model_detection.unet_config_from_diffusers_unet(controlnet_data, unet_dtype)
diffusers_keys = comfy.utils.unet_to_diffusers(controlnet_config) diffusers_keys = comfy.utils.unet_to_diffusers(controlnet_config)
diffusers_keys["controlnet_mid_block.weight"] = "middle_block_out.0.weight" diffusers_keys["controlnet_mid_block.weight"] = "middle_block_out.0.weight"
diffusers_keys["controlnet_mid_block.bias"] = "middle_block_out.0.bias" diffusers_keys["controlnet_mid_block.bias"] = "middle_block_out.0.bias"
@@ -380,12 +381,20 @@ def load_controlnet(ckpt_path, model=None):
return net return net
if controlnet_config is None: if controlnet_config is None:
unet_dtype = comfy.model_management.unet_dtype() model_config = comfy.model_detection.model_config_from_unet(controlnet_data, prefix, True)
controlnet_config = comfy.model_detection.model_config_from_unet(controlnet_data, prefix, unet_dtype, True).unet_config supported_inference_dtypes = model_config.supported_inference_dtypes
controlnet_config = model_config.unet_config
load_device = comfy.model_management.get_torch_device() load_device = comfy.model_management.get_torch_device()
if supported_inference_dtypes is None:
unet_dtype = comfy.model_management.unet_dtype()
else:
unet_dtype = comfy.model_management.unet_dtype(supported_dtypes=supported_inference_dtypes)
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 = comfy.cldm.cldm.ControlNet(**controlnet_config) control_model = comfy.cldm.cldm.ControlNet(**controlnet_config)
+27 -25
View File
@@ -2,7 +2,8 @@ import torch
from torch import nn from torch import nn
from .ldm.modules.attention import CrossAttention from .ldm.modules.attention import CrossAttention
from inspect import isfunction from inspect import isfunction
import comfy.ops
ops = comfy.ops.manual_cast
def exists(val): def exists(val):
return val is not None return val is not None
@@ -22,7 +23,7 @@ def default(val, d):
class GEGLU(nn.Module): class GEGLU(nn.Module):
def __init__(self, dim_in, dim_out): def __init__(self, dim_in, dim_out):
super().__init__() super().__init__()
self.proj = nn.Linear(dim_in, dim_out * 2) self.proj = ops.Linear(dim_in, dim_out * 2)
def forward(self, x): def forward(self, x):
x, gate = self.proj(x).chunk(2, dim=-1) x, gate = self.proj(x).chunk(2, dim=-1)
@@ -35,14 +36,14 @@ class FeedForward(nn.Module):
inner_dim = int(dim * mult) inner_dim = int(dim * mult)
dim_out = default(dim_out, dim) dim_out = default(dim_out, dim)
project_in = nn.Sequential( project_in = nn.Sequential(
nn.Linear(dim, inner_dim), ops.Linear(dim, inner_dim),
nn.GELU() nn.GELU()
) if not glu else GEGLU(dim, inner_dim) ) if not glu else GEGLU(dim, inner_dim)
self.net = nn.Sequential( self.net = nn.Sequential(
project_in, project_in,
nn.Dropout(dropout), nn.Dropout(dropout),
nn.Linear(inner_dim, dim_out) ops.Linear(inner_dim, dim_out)
) )
def forward(self, x): def forward(self, x):
@@ -57,11 +58,12 @@ class GatedCrossAttentionDense(nn.Module):
query_dim=query_dim, query_dim=query_dim,
context_dim=context_dim, context_dim=context_dim,
heads=n_heads, heads=n_heads,
dim_head=d_head) dim_head=d_head,
operations=ops)
self.ff = FeedForward(query_dim, glu=True) self.ff = FeedForward(query_dim, glu=True)
self.norm1 = nn.LayerNorm(query_dim) self.norm1 = ops.LayerNorm(query_dim)
self.norm2 = nn.LayerNorm(query_dim) self.norm2 = ops.LayerNorm(query_dim)
self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.))) self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.)))
self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.))) self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.)))
@@ -87,17 +89,18 @@ class GatedSelfAttentionDense(nn.Module):
# we need a linear projection since we need cat visual feature and obj # we need a linear projection since we need cat visual feature and obj
# feature # feature
self.linear = nn.Linear(context_dim, query_dim) self.linear = ops.Linear(context_dim, query_dim)
self.attn = CrossAttention( self.attn = CrossAttention(
query_dim=query_dim, query_dim=query_dim,
context_dim=query_dim, context_dim=query_dim,
heads=n_heads, heads=n_heads,
dim_head=d_head) dim_head=d_head,
operations=ops)
self.ff = FeedForward(query_dim, glu=True) self.ff = FeedForward(query_dim, glu=True)
self.norm1 = nn.LayerNorm(query_dim) self.norm1 = ops.LayerNorm(query_dim)
self.norm2 = nn.LayerNorm(query_dim) self.norm2 = ops.LayerNorm(query_dim)
self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.))) self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.)))
self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.))) self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.)))
@@ -126,14 +129,14 @@ class GatedSelfAttentionDense2(nn.Module):
# we need a linear projection since we need cat visual feature and obj # we need a linear projection since we need cat visual feature and obj
# feature # feature
self.linear = nn.Linear(context_dim, query_dim) self.linear = ops.Linear(context_dim, query_dim)
self.attn = CrossAttention( self.attn = CrossAttention(
query_dim=query_dim, context_dim=query_dim, dim_head=d_head) query_dim=query_dim, context_dim=query_dim, dim_head=d_head, operations=ops)
self.ff = FeedForward(query_dim, glu=True) self.ff = FeedForward(query_dim, glu=True)
self.norm1 = nn.LayerNorm(query_dim) self.norm1 = ops.LayerNorm(query_dim)
self.norm2 = nn.LayerNorm(query_dim) self.norm2 = ops.LayerNorm(query_dim)
self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.))) self.register_parameter('alpha_attn', nn.Parameter(torch.tensor(0.)))
self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.))) self.register_parameter('alpha_dense', nn.Parameter(torch.tensor(0.)))
@@ -201,11 +204,11 @@ class PositionNet(nn.Module):
self.position_dim = fourier_freqs * 2 * 4 # 2 is sin&cos, 4 is xyxy self.position_dim = fourier_freqs * 2 * 4 # 2 is sin&cos, 4 is xyxy
self.linears = nn.Sequential( self.linears = nn.Sequential(
nn.Linear(self.in_dim + self.position_dim, 512), ops.Linear(self.in_dim + self.position_dim, 512),
nn.SiLU(), nn.SiLU(),
nn.Linear(512, 512), ops.Linear(512, 512),
nn.SiLU(), nn.SiLU(),
nn.Linear(512, out_dim), ops.Linear(512, out_dim),
) )
self.null_positive_feature = torch.nn.Parameter( self.null_positive_feature = torch.nn.Parameter(
@@ -215,16 +218,15 @@ class PositionNet(nn.Module):
def forward(self, boxes, masks, positive_embeddings): def forward(self, boxes, masks, positive_embeddings):
B, N, _ = boxes.shape B, N, _ = boxes.shape
dtype = self.linears[0].weight.dtype masks = masks.unsqueeze(-1)
masks = masks.unsqueeze(-1).to(dtype) positive_embeddings = positive_embeddings
positive_embeddings = positive_embeddings.to(dtype)
# embedding position (it may includes padding as placeholder) # embedding position (it may includes padding as placeholder)
xyxy_embedding = self.fourier_embedder(boxes.to(dtype)) # B*N*4 --> B*N*C xyxy_embedding = self.fourier_embedder(boxes) # B*N*4 --> B*N*C
# learnable null embedding # learnable null embedding
positive_null = self.null_positive_feature.view(1, 1, -1) positive_null = self.null_positive_feature.to(device=boxes.device, dtype=boxes.dtype).view(1, 1, -1)
xyxy_null = self.null_position_feature.view(1, 1, -1) xyxy_null = self.null_position_feature.to(device=boxes.device, dtype=boxes.dtype).view(1, 1, -1)
# replace padding with learnable null embedding # replace padding with learnable null embedding
positive_embeddings = positive_embeddings * \ positive_embeddings = positive_embeddings * \
@@ -251,7 +253,7 @@ class Gligen(nn.Module):
def func(x, extra_options): def func(x, extra_options):
key = extra_options["transformer_index"] key = extra_options["transformer_index"]
module = self.module_list[key] module = self.module_list[key]
return module(x, objs) return module(x, objs.to(device=x.device, dtype=x.dtype))
return func return func
def set_position(self, latent_image_shape, position_params, device): def set_position(self, latent_image_shape, position_params, device):
@@ -37,3 +37,11 @@ class SDXL(LatentFormat):
class SD_X4(LatentFormat): class SD_X4(LatentFormat):
def __init__(self): def __init__(self):
self.scale_factor = 0.08333 self.scale_factor = 0.08333
class SC_Prior(LatentFormat):
def __init__(self):
self.scale_factor = 1.0
class SC_B(LatentFormat):
def __init__(self):
self.scale_factor = 1.0
@@ -0,0 +1,161 @@
"""
This file is part of ComfyUI.
Copyright (C) 2024 Stability AI
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import torch
import torch.nn as nn
from comfy.ldm.modules.attention import optimized_attention
class Linear(torch.nn.Linear):
def reset_parameters(self):
return None
class Conv2d(torch.nn.Conv2d):
def reset_parameters(self):
return None
class OptimizedAttention(nn.Module):
def __init__(self, c, nhead, dropout=0.0, dtype=None, device=None, operations=None):
super().__init__()
self.heads = nhead
self.to_q = operations.Linear(c, c, bias=True, dtype=dtype, device=device)
self.to_k = operations.Linear(c, c, bias=True, dtype=dtype, device=device)
self.to_v = operations.Linear(c, c, bias=True, dtype=dtype, device=device)
self.out_proj = operations.Linear(c, c, bias=True, dtype=dtype, device=device)
def forward(self, q, k, v):
q = self.to_q(q)
k = self.to_k(k)
v = self.to_v(v)
out = optimized_attention(q, k, v, self.heads)
return self.out_proj(out)
class Attention2D(nn.Module):
def __init__(self, c, nhead, dropout=0.0, dtype=None, device=None, operations=None):
super().__init__()
self.attn = OptimizedAttention(c, nhead, dtype=dtype, device=device, operations=operations)
# self.attn = nn.MultiheadAttention(c, nhead, dropout=dropout, bias=True, batch_first=True, dtype=dtype, device=device)
def forward(self, x, kv, self_attn=False):
orig_shape = x.shape
x = x.view(x.size(0), x.size(1), -1).permute(0, 2, 1) # Bx4xHxW -> Bx(HxW)x4
if self_attn:
kv = torch.cat([x, kv], dim=1)
# x = self.attn(x, kv, kv, need_weights=False)[0]
x = self.attn(x, kv, kv)
x = x.permute(0, 2, 1).view(*orig_shape)
return x
def LayerNorm2d_op(operations):
class LayerNorm2d(operations.LayerNorm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def forward(self, x):
return super().forward(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
return LayerNorm2d
class GlobalResponseNorm(nn.Module):
"from https://github.com/facebookresearch/ConvNeXt-V2/blob/3608f67cc1dae164790c5d0aead7bf2d73d9719b/models/utils.py#L105"
def __init__(self, dim, dtype=None, device=None):
super().__init__()
self.gamma = nn.Parameter(torch.zeros(1, 1, 1, dim, dtype=dtype, device=device))
self.beta = nn.Parameter(torch.zeros(1, 1, 1, dim, dtype=dtype, device=device))
def forward(self, x):
Gx = torch.norm(x, p=2, dim=(1, 2), keepdim=True)
Nx = Gx / (Gx.mean(dim=-1, keepdim=True) + 1e-6)
return self.gamma.to(device=x.device, dtype=x.dtype) * (x * Nx) + self.beta.to(device=x.device, dtype=x.dtype) + x
class ResBlock(nn.Module):
def __init__(self, c, c_skip=0, kernel_size=3, dropout=0.0, dtype=None, device=None, operations=None): # , num_heads=4, expansion=2):
super().__init__()
self.depthwise = operations.Conv2d(c, c, kernel_size=kernel_size, padding=kernel_size // 2, groups=c, dtype=dtype, device=device)
# self.depthwise = SAMBlock(c, num_heads, expansion)
self.norm = LayerNorm2d_op(operations)(c, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
self.channelwise = nn.Sequential(
operations.Linear(c + c_skip, c * 4, dtype=dtype, device=device),
nn.GELU(),
GlobalResponseNorm(c * 4, dtype=dtype, device=device),
nn.Dropout(dropout),
operations.Linear(c * 4, c, dtype=dtype, device=device)
)
def forward(self, x, x_skip=None):
x_res = x
x = self.norm(self.depthwise(x))
if x_skip is not None:
x = torch.cat([x, x_skip], dim=1)
x = self.channelwise(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
return x + x_res
class AttnBlock(nn.Module):
def __init__(self, c, c_cond, nhead, self_attn=True, dropout=0.0, dtype=None, device=None, operations=None):
super().__init__()
self.self_attn = self_attn
self.norm = LayerNorm2d_op(operations)(c, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
self.attention = Attention2D(c, nhead, dropout, dtype=dtype, device=device, operations=operations)
self.kv_mapper = nn.Sequential(
nn.SiLU(),
operations.Linear(c_cond, c, dtype=dtype, device=device)
)
def forward(self, x, kv):
kv = self.kv_mapper(kv)
x = x + self.attention(self.norm(x), kv, self_attn=self.self_attn)
return x
class FeedForwardBlock(nn.Module):
def __init__(self, c, dropout=0.0, dtype=None, device=None, operations=None):
super().__init__()
self.norm = LayerNorm2d_op(operations)(c, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
self.channelwise = nn.Sequential(
operations.Linear(c, c * 4, dtype=dtype, device=device),
nn.GELU(),
GlobalResponseNorm(c * 4, dtype=dtype, device=device),
nn.Dropout(dropout),
operations.Linear(c * 4, c, dtype=dtype, device=device)
)
def forward(self, x):
x = x + self.channelwise(self.norm(x).permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
return x
class TimestepBlock(nn.Module):
def __init__(self, c, c_timestep, conds=['sca'], dtype=None, device=None, operations=None):
super().__init__()
self.mapper = operations.Linear(c_timestep, c * 2, dtype=dtype, device=device)
self.conds = conds
for cname in conds:
setattr(self, f"mapper_{cname}", operations.Linear(c_timestep, c * 2, dtype=dtype, device=device))
def forward(self, x, t):
t = t.chunk(len(self.conds) + 1, dim=1)
a, b = self.mapper(t[0])[:, :, None, None].chunk(2, dim=1)
for i, c in enumerate(self.conds):
ac, bc = getattr(self, f"mapper_{c}")(t[i + 1])[:, :, None, None].chunk(2, dim=1)
a, b = a + ac, b + bc
return x * (1 + a) + b
@@ -0,0 +1,258 @@
"""
This file is part of ComfyUI.
Copyright (C) 2024 Stability AI
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import torch
from torch import nn
from torch.autograd import Function
class vector_quantize(Function):
@staticmethod
def forward(ctx, x, codebook):
with torch.no_grad():
codebook_sqr = torch.sum(codebook ** 2, dim=1)
x_sqr = torch.sum(x ** 2, dim=1, keepdim=True)
dist = torch.addmm(codebook_sqr + x_sqr, x, codebook.t(), alpha=-2.0, beta=1.0)
_, indices = dist.min(dim=1)
ctx.save_for_backward(indices, codebook)
ctx.mark_non_differentiable(indices)
nn = torch.index_select(codebook, 0, indices)
return nn, indices
@staticmethod
def backward(ctx, grad_output, grad_indices):
grad_inputs, grad_codebook = None, None
if ctx.needs_input_grad[0]:
grad_inputs = grad_output.clone()
if ctx.needs_input_grad[1]:
# Gradient wrt. the codebook
indices, codebook = ctx.saved_tensors
grad_codebook = torch.zeros_like(codebook)
grad_codebook.index_add_(0, indices, grad_output)
return (grad_inputs, grad_codebook)
class VectorQuantize(nn.Module):
def __init__(self, embedding_size, k, ema_decay=0.99, ema_loss=False):
"""
Takes an input of variable size (as long as the last dimension matches the embedding size).
Returns one tensor containing the nearest neigbour embeddings to each of the inputs,
with the same size as the input, vq and commitment components for the loss as a touple
in the second output and the indices of the quantized vectors in the third:
quantized, (vq_loss, commit_loss), indices
"""
super(VectorQuantize, self).__init__()
self.codebook = nn.Embedding(k, embedding_size)
self.codebook.weight.data.uniform_(-1./k, 1./k)
self.vq = vector_quantize.apply
self.ema_decay = ema_decay
self.ema_loss = ema_loss
if ema_loss:
self.register_buffer('ema_element_count', torch.ones(k))
self.register_buffer('ema_weight_sum', torch.zeros_like(self.codebook.weight))
def _laplace_smoothing(self, x, epsilon):
n = torch.sum(x)
return ((x + epsilon) / (n + x.size(0) * epsilon) * n)
def _updateEMA(self, z_e_x, indices):
mask = nn.functional.one_hot(indices, self.ema_element_count.size(0)).float()
elem_count = mask.sum(dim=0)
weight_sum = torch.mm(mask.t(), z_e_x)
self.ema_element_count = (self.ema_decay * self.ema_element_count) + ((1-self.ema_decay) * elem_count)
self.ema_element_count = self._laplace_smoothing(self.ema_element_count, 1e-5)
self.ema_weight_sum = (self.ema_decay * self.ema_weight_sum) + ((1-self.ema_decay) * weight_sum)
self.codebook.weight.data = self.ema_weight_sum / self.ema_element_count.unsqueeze(-1)
def idx2vq(self, idx, dim=-1):
q_idx = self.codebook(idx)
if dim != -1:
q_idx = q_idx.movedim(-1, dim)
return q_idx
def forward(self, x, get_losses=True, dim=-1):
if dim != -1:
x = x.movedim(dim, -1)
z_e_x = x.contiguous().view(-1, x.size(-1)) if len(x.shape) > 2 else x
z_q_x, indices = self.vq(z_e_x, self.codebook.weight.detach())
vq_loss, commit_loss = None, None
if self.ema_loss and self.training:
self._updateEMA(z_e_x.detach(), indices.detach())
# pick the graded embeddings after updating the codebook in order to have a more accurate commitment loss
z_q_x_grd = torch.index_select(self.codebook.weight, dim=0, index=indices)
if get_losses:
vq_loss = (z_q_x_grd - z_e_x.detach()).pow(2).mean()
commit_loss = (z_e_x - z_q_x_grd.detach()).pow(2).mean()
z_q_x = z_q_x.view(x.shape)
if dim != -1:
z_q_x = z_q_x.movedim(-1, dim)
return z_q_x, (vq_loss, commit_loss), indices.view(x.shape[:-1])
class ResBlock(nn.Module):
def __init__(self, c, c_hidden):
super().__init__()
# depthwise/attention
self.norm1 = nn.LayerNorm(c, elementwise_affine=False, eps=1e-6)
self.depthwise = nn.Sequential(
nn.ReplicationPad2d(1),
nn.Conv2d(c, c, kernel_size=3, groups=c)
)
# channelwise
self.norm2 = nn.LayerNorm(c, elementwise_affine=False, eps=1e-6)
self.channelwise = nn.Sequential(
nn.Linear(c, c_hidden),
nn.GELU(),
nn.Linear(c_hidden, c),
)
self.gammas = nn.Parameter(torch.zeros(6), requires_grad=True)
# Init weights
def _basic_init(module):
if isinstance(module, nn.Linear) or isinstance(module, nn.Conv2d):
torch.nn.init.xavier_uniform_(module.weight)
if module.bias is not None:
nn.init.constant_(module.bias, 0)
self.apply(_basic_init)
def _norm(self, x, norm):
return norm(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2)
def forward(self, x):
mods = self.gammas
x_temp = self._norm(x, self.norm1) * (1 + mods[0]) + mods[1]
try:
x = x + self.depthwise(x_temp) * mods[2]
except: #operation not implemented for bf16
x_temp = self.depthwise[0](x_temp.float()).to(x.dtype)
x = x + self.depthwise[1](x_temp) * mods[2]
x_temp = self._norm(x, self.norm2) * (1 + mods[3]) + mods[4]
x = x + self.channelwise(x_temp.permute(0, 2, 3, 1)).permute(0, 3, 1, 2) * mods[5]
return x
class StageA(nn.Module):
def __init__(self, levels=2, bottleneck_blocks=12, c_hidden=384, c_latent=4, codebook_size=8192,
scale_factor=0.43): # 0.3764
super().__init__()
self.c_latent = c_latent
self.scale_factor = scale_factor
c_levels = [c_hidden // (2 ** i) for i in reversed(range(levels))]
# Encoder blocks
self.in_block = nn.Sequential(
nn.PixelUnshuffle(2),
nn.Conv2d(3 * 4, c_levels[0], kernel_size=1)
)
down_blocks = []
for i in range(levels):
if i > 0:
down_blocks.append(nn.Conv2d(c_levels[i - 1], c_levels[i], kernel_size=4, stride=2, padding=1))
block = ResBlock(c_levels[i], c_levels[i] * 4)
down_blocks.append(block)
down_blocks.append(nn.Sequential(
nn.Conv2d(c_levels[-1], c_latent, kernel_size=1, bias=False),
nn.BatchNorm2d(c_latent), # then normalize them to have mean 0 and std 1
))
self.down_blocks = nn.Sequential(*down_blocks)
self.down_blocks[0]
self.codebook_size = codebook_size
self.vquantizer = VectorQuantize(c_latent, k=codebook_size)
# Decoder blocks
up_blocks = [nn.Sequential(
nn.Conv2d(c_latent, c_levels[-1], kernel_size=1)
)]
for i in range(levels):
for j in range(bottleneck_blocks if i == 0 else 1):
block = ResBlock(c_levels[levels - 1 - i], c_levels[levels - 1 - i] * 4)
up_blocks.append(block)
if i < levels - 1:
up_blocks.append(
nn.ConvTranspose2d(c_levels[levels - 1 - i], c_levels[levels - 2 - i], kernel_size=4, stride=2,
padding=1))
self.up_blocks = nn.Sequential(*up_blocks)
self.out_block = nn.Sequential(
nn.Conv2d(c_levels[0], 3 * 4, kernel_size=1),
nn.PixelShuffle(2),
)
def encode(self, x, quantize=False):
x = self.in_block(x)
x = self.down_blocks(x)
if quantize:
qe, (vq_loss, commit_loss), indices = self.vquantizer.forward(x, dim=1)
return qe / self.scale_factor, x / self.scale_factor, indices, vq_loss + commit_loss * 0.25
else:
return x / self.scale_factor
def decode(self, x):
x = x * self.scale_factor
x = self.up_blocks(x)
x = self.out_block(x)
return x
def forward(self, x, quantize=False):
qe, x, _, vq_loss = self.encode(x, quantize)
x = self.decode(qe)
return x, vq_loss
class Discriminator(nn.Module):
def __init__(self, c_in=3, c_cond=0, c_hidden=512, depth=6):
super().__init__()
d = max(depth - 3, 3)
layers = [
nn.utils.spectral_norm(nn.Conv2d(c_in, c_hidden // (2 ** d), kernel_size=3, stride=2, padding=1)),
nn.LeakyReLU(0.2),
]
for i in range(depth - 1):
c_in = c_hidden // (2 ** max((d - i), 0))
c_out = c_hidden // (2 ** max((d - 1 - i), 0))
layers.append(nn.utils.spectral_norm(nn.Conv2d(c_in, c_out, kernel_size=3, stride=2, padding=1)))
layers.append(nn.InstanceNorm2d(c_out))
layers.append(nn.LeakyReLU(0.2))
self.encoder = nn.Sequential(*layers)
self.shuffle = nn.Conv2d((c_hidden + c_cond) if c_cond > 0 else c_hidden, 1, kernel_size=1)
self.logits = nn.Sigmoid()
def forward(self, x, cond=None):
x = self.encoder(x)
if cond is not None:
cond = cond.view(cond.size(0), cond.size(1), 1, 1, ).expand(-1, -1, x.size(-2), x.size(-1))
x = torch.cat([x, cond], dim=1)
x = self.shuffle(x)
x = self.logits(x)
return x
@@ -0,0 +1,257 @@
"""
This file is part of ComfyUI.
Copyright (C) 2024 Stability AI
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import math
import numpy as np
import torch
from torch import nn
from .common import AttnBlock, LayerNorm2d_op, ResBlock, FeedForwardBlock, TimestepBlock
class StageB(nn.Module):
def __init__(self, c_in=4, c_out=4, c_r=64, patch_size=2, c_cond=1280, c_hidden=[320, 640, 1280, 1280],
nhead=[-1, -1, 20, 20], blocks=[[2, 6, 28, 6], [6, 28, 6, 2]],
block_repeat=[[1, 1, 1, 1], [3, 3, 2, 2]], level_config=['CT', 'CT', 'CTA', 'CTA'], c_clip=1280,
c_clip_seq=4, c_effnet=16, c_pixels=3, kernel_size=3, dropout=[0, 0, 0.0, 0.0], self_attn=True,
t_conds=['sca'], stable_cascade_stage=None, dtype=None, device=None, operations=None):
super().__init__()
self.dtype = dtype
self.c_r = c_r
self.t_conds = t_conds
self.c_clip_seq = c_clip_seq
if not isinstance(dropout, list):
dropout = [dropout] * len(c_hidden)
if not isinstance(self_attn, list):
self_attn = [self_attn] * len(c_hidden)
# CONDITIONING
self.effnet_mapper = nn.Sequential(
operations.Conv2d(c_effnet, c_hidden[0] * 4, kernel_size=1, dtype=dtype, device=device),
nn.GELU(),
operations.Conv2d(c_hidden[0] * 4, c_hidden[0], kernel_size=1, dtype=dtype, device=device),
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
)
self.pixels_mapper = nn.Sequential(
operations.Conv2d(c_pixels, c_hidden[0] * 4, kernel_size=1, dtype=dtype, device=device),
nn.GELU(),
operations.Conv2d(c_hidden[0] * 4, c_hidden[0], kernel_size=1, dtype=dtype, device=device),
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
)
self.clip_mapper = operations.Linear(c_clip, c_cond * c_clip_seq, dtype=dtype, device=device)
self.clip_norm = operations.LayerNorm(c_cond, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
self.embedding = nn.Sequential(
nn.PixelUnshuffle(patch_size),
operations.Conv2d(c_in * (patch_size ** 2), c_hidden[0], kernel_size=1, dtype=dtype, device=device),
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
)
def get_block(block_type, c_hidden, nhead, c_skip=0, dropout=0, self_attn=True):
if block_type == 'C':
return ResBlock(c_hidden, c_skip, kernel_size=kernel_size, dropout=dropout, dtype=dtype, device=device, operations=operations)
elif block_type == 'A':
return AttnBlock(c_hidden, c_cond, nhead, self_attn=self_attn, dropout=dropout, dtype=dtype, device=device, operations=operations)
elif block_type == 'F':
return FeedForwardBlock(c_hidden, dropout=dropout, dtype=dtype, device=device, operations=operations)
elif block_type == 'T':
return TimestepBlock(c_hidden, c_r, conds=t_conds, dtype=dtype, device=device, operations=operations)
else:
raise Exception(f'Block type {block_type} not supported')
# BLOCKS
# -- down blocks
self.down_blocks = nn.ModuleList()
self.down_downscalers = nn.ModuleList()
self.down_repeat_mappers = nn.ModuleList()
for i in range(len(c_hidden)):
if i > 0:
self.down_downscalers.append(nn.Sequential(
LayerNorm2d_op(operations)(c_hidden[i - 1], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device),
operations.Conv2d(c_hidden[i - 1], c_hidden[i], kernel_size=2, stride=2, dtype=dtype, device=device),
))
else:
self.down_downscalers.append(nn.Identity())
down_block = nn.ModuleList()
for _ in range(blocks[0][i]):
for block_type in level_config[i]:
block = get_block(block_type, c_hidden[i], nhead[i], dropout=dropout[i], self_attn=self_attn[i])
down_block.append(block)
self.down_blocks.append(down_block)
if block_repeat is not None:
block_repeat_mappers = nn.ModuleList()
for _ in range(block_repeat[0][i] - 1):
block_repeat_mappers.append(operations.Conv2d(c_hidden[i], c_hidden[i], kernel_size=1, dtype=dtype, device=device))
self.down_repeat_mappers.append(block_repeat_mappers)
# -- up blocks
self.up_blocks = nn.ModuleList()
self.up_upscalers = nn.ModuleList()
self.up_repeat_mappers = nn.ModuleList()
for i in reversed(range(len(c_hidden))):
if i > 0:
self.up_upscalers.append(nn.Sequential(
LayerNorm2d_op(operations)(c_hidden[i], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device),
operations.ConvTranspose2d(c_hidden[i], c_hidden[i - 1], kernel_size=2, stride=2, dtype=dtype, device=device),
))
else:
self.up_upscalers.append(nn.Identity())
up_block = nn.ModuleList()
for j in range(blocks[1][::-1][i]):
for k, block_type in enumerate(level_config[i]):
c_skip = c_hidden[i] if i < len(c_hidden) - 1 and j == k == 0 else 0
block = get_block(block_type, c_hidden[i], nhead[i], c_skip=c_skip, dropout=dropout[i],
self_attn=self_attn[i])
up_block.append(block)
self.up_blocks.append(up_block)
if block_repeat is not None:
block_repeat_mappers = nn.ModuleList()
for _ in range(block_repeat[1][::-1][i] - 1):
block_repeat_mappers.append(operations.Conv2d(c_hidden[i], c_hidden[i], kernel_size=1, dtype=dtype, device=device))
self.up_repeat_mappers.append(block_repeat_mappers)
# OUTPUT
self.clf = nn.Sequential(
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device),
operations.Conv2d(c_hidden[0], c_out * (patch_size ** 2), kernel_size=1, dtype=dtype, device=device),
nn.PixelShuffle(patch_size),
)
# --- WEIGHT INIT ---
# self.apply(self._init_weights) # General init
# nn.init.normal_(self.clip_mapper.weight, std=0.02) # conditionings
# nn.init.normal_(self.effnet_mapper[0].weight, std=0.02) # conditionings
# nn.init.normal_(self.effnet_mapper[2].weight, std=0.02) # conditionings
# nn.init.normal_(self.pixels_mapper[0].weight, std=0.02) # conditionings
# nn.init.normal_(self.pixels_mapper[2].weight, std=0.02) # conditionings
# torch.nn.init.xavier_uniform_(self.embedding[1].weight, 0.02) # inputs
# nn.init.constant_(self.clf[1].weight, 0) # outputs
#
# # blocks
# for level_block in self.down_blocks + self.up_blocks:
# for block in level_block:
# if isinstance(block, ResBlock) or isinstance(block, FeedForwardBlock):
# block.channelwise[-1].weight.data *= np.sqrt(1 / sum(blocks[0]))
# elif isinstance(block, TimestepBlock):
# for layer in block.modules():
# if isinstance(layer, nn.Linear):
# nn.init.constant_(layer.weight, 0)
#
# def _init_weights(self, m):
# if isinstance(m, (nn.Conv2d, nn.Linear)):
# torch.nn.init.xavier_uniform_(m.weight)
# if m.bias is not None:
# nn.init.constant_(m.bias, 0)
def gen_r_embedding(self, r, max_positions=10000):
r = r * max_positions
half_dim = self.c_r // 2
emb = math.log(max_positions) / (half_dim - 1)
emb = torch.arange(half_dim, device=r.device).float().mul(-emb).exp()
emb = r[:, None] * emb[None, :]
emb = torch.cat([emb.sin(), emb.cos()], dim=1)
if self.c_r % 2 == 1: # zero pad
emb = nn.functional.pad(emb, (0, 1), mode='constant')
return emb
def gen_c_embeddings(self, clip):
if len(clip.shape) == 2:
clip = clip.unsqueeze(1)
clip = self.clip_mapper(clip).view(clip.size(0), clip.size(1) * self.c_clip_seq, -1)
clip = self.clip_norm(clip)
return clip
def _down_encode(self, x, r_embed, clip):
level_outputs = []
block_group = zip(self.down_blocks, self.down_downscalers, self.down_repeat_mappers)
for down_block, downscaler, repmap in block_group:
x = downscaler(x)
for i in range(len(repmap) + 1):
for block in down_block:
if isinstance(block, ResBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
ResBlock)):
x = block(x)
elif isinstance(block, AttnBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
AttnBlock)):
x = block(x, clip)
elif isinstance(block, TimestepBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
TimestepBlock)):
x = block(x, r_embed)
else:
x = block(x)
if i < len(repmap):
x = repmap[i](x)
level_outputs.insert(0, x)
return level_outputs
def _up_decode(self, level_outputs, r_embed, clip):
x = level_outputs[0]
block_group = zip(self.up_blocks, self.up_upscalers, self.up_repeat_mappers)
for i, (up_block, upscaler, repmap) in enumerate(block_group):
for j in range(len(repmap) + 1):
for k, block in enumerate(up_block):
if isinstance(block, ResBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
ResBlock)):
skip = level_outputs[i] if k == 0 and i > 0 else None
if skip is not None and (x.size(-1) != skip.size(-1) or x.size(-2) != skip.size(-2)):
x = torch.nn.functional.interpolate(x, skip.shape[-2:], mode='bilinear',
align_corners=True)
x = block(x, skip)
elif isinstance(block, AttnBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
AttnBlock)):
x = block(x, clip)
elif isinstance(block, TimestepBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
TimestepBlock)):
x = block(x, r_embed)
else:
x = block(x)
if j < len(repmap):
x = repmap[j](x)
x = upscaler(x)
return x
def forward(self, x, r, effnet, clip, pixels=None, **kwargs):
if pixels is None:
pixels = x.new_zeros(x.size(0), 3, 8, 8)
# Process the conditioning embeddings
r_embed = self.gen_r_embedding(r).to(dtype=x.dtype)
for c in self.t_conds:
t_cond = kwargs.get(c, torch.zeros_like(r))
r_embed = torch.cat([r_embed, self.gen_r_embedding(t_cond).to(dtype=x.dtype)], dim=1)
clip = self.gen_c_embeddings(clip)
# Model Blocks
x = self.embedding(x)
x = x + self.effnet_mapper(
nn.functional.interpolate(effnet, size=x.shape[-2:], mode='bilinear', align_corners=True))
x = x + nn.functional.interpolate(self.pixels_mapper(pixels), size=x.shape[-2:], mode='bilinear',
align_corners=True)
level_outputs = self._down_encode(x, r_embed, clip)
x = self._up_decode(level_outputs, r_embed, clip)
return self.clf(x)
def update_weights_ema(self, src_model, beta=0.999):
for self_params, src_params in zip(self.parameters(), src_model.parameters()):
self_params.data = self_params.data * beta + src_params.data.clone().to(self_params.device) * (1 - beta)
for self_buffers, src_buffers in zip(self.buffers(), src_model.buffers()):
self_buffers.data = self_buffers.data * beta + src_buffers.data.clone().to(self_buffers.device) * (1 - beta)
@@ -0,0 +1,271 @@
"""
This file is part of ComfyUI.
Copyright (C) 2024 Stability AI
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import torch
from torch import nn
import numpy as np
import math
from .common import AttnBlock, LayerNorm2d_op, ResBlock, FeedForwardBlock, TimestepBlock
# from .controlnet import ControlNetDeliverer
class UpDownBlock2d(nn.Module):
def __init__(self, c_in, c_out, mode, enabled=True, dtype=None, device=None, operations=None):
super().__init__()
assert mode in ['up', 'down']
interpolation = nn.Upsample(scale_factor=2 if mode == 'up' else 0.5, mode='bilinear',
align_corners=True) if enabled else nn.Identity()
mapping = operations.Conv2d(c_in, c_out, kernel_size=1, dtype=dtype, device=device)
self.blocks = nn.ModuleList([interpolation, mapping] if mode == 'up' else [mapping, interpolation])
def forward(self, x):
for block in self.blocks:
x = block(x)
return x
class StageC(nn.Module):
def __init__(self, c_in=16, c_out=16, c_r=64, patch_size=1, c_cond=2048, c_hidden=[2048, 2048], nhead=[32, 32],
blocks=[[8, 24], [24, 8]], block_repeat=[[1, 1], [1, 1]], level_config=['CTA', 'CTA'],
c_clip_text=1280, c_clip_text_pooled=1280, c_clip_img=768, c_clip_seq=4, kernel_size=3,
dropout=[0.0, 0.0], self_attn=True, t_conds=['sca', 'crp'], switch_level=[False], stable_cascade_stage=None,
dtype=None, device=None, operations=None):
super().__init__()
self.dtype = dtype
self.c_r = c_r
self.t_conds = t_conds
self.c_clip_seq = c_clip_seq
if not isinstance(dropout, list):
dropout = [dropout] * len(c_hidden)
if not isinstance(self_attn, list):
self_attn = [self_attn] * len(c_hidden)
# CONDITIONING
self.clip_txt_mapper = operations.Linear(c_clip_text, c_cond, dtype=dtype, device=device)
self.clip_txt_pooled_mapper = operations.Linear(c_clip_text_pooled, c_cond * c_clip_seq, dtype=dtype, device=device)
self.clip_img_mapper = operations.Linear(c_clip_img, c_cond * c_clip_seq, dtype=dtype, device=device)
self.clip_norm = operations.LayerNorm(c_cond, elementwise_affine=False, eps=1e-6, dtype=dtype, device=device)
self.embedding = nn.Sequential(
nn.PixelUnshuffle(patch_size),
operations.Conv2d(c_in * (patch_size ** 2), c_hidden[0], kernel_size=1, dtype=dtype, device=device),
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6)
)
def get_block(block_type, c_hidden, nhead, c_skip=0, dropout=0, self_attn=True):
if block_type == 'C':
return ResBlock(c_hidden, c_skip, kernel_size=kernel_size, dropout=dropout, dtype=dtype, device=device, operations=operations)
elif block_type == 'A':
return AttnBlock(c_hidden, c_cond, nhead, self_attn=self_attn, dropout=dropout, dtype=dtype, device=device, operations=operations)
elif block_type == 'F':
return FeedForwardBlock(c_hidden, dropout=dropout, dtype=dtype, device=device, operations=operations)
elif block_type == 'T':
return TimestepBlock(c_hidden, c_r, conds=t_conds, dtype=dtype, device=device, operations=operations)
else:
raise Exception(f'Block type {block_type} not supported')
# BLOCKS
# -- down blocks
self.down_blocks = nn.ModuleList()
self.down_downscalers = nn.ModuleList()
self.down_repeat_mappers = nn.ModuleList()
for i in range(len(c_hidden)):
if i > 0:
self.down_downscalers.append(nn.Sequential(
LayerNorm2d_op(operations)(c_hidden[i - 1], elementwise_affine=False, eps=1e-6),
UpDownBlock2d(c_hidden[i - 1], c_hidden[i], mode='down', enabled=switch_level[i - 1], dtype=dtype, device=device, operations=operations)
))
else:
self.down_downscalers.append(nn.Identity())
down_block = nn.ModuleList()
for _ in range(blocks[0][i]):
for block_type in level_config[i]:
block = get_block(block_type, c_hidden[i], nhead[i], dropout=dropout[i], self_attn=self_attn[i])
down_block.append(block)
self.down_blocks.append(down_block)
if block_repeat is not None:
block_repeat_mappers = nn.ModuleList()
for _ in range(block_repeat[0][i] - 1):
block_repeat_mappers.append(operations.Conv2d(c_hidden[i], c_hidden[i], kernel_size=1, dtype=dtype, device=device))
self.down_repeat_mappers.append(block_repeat_mappers)
# -- up blocks
self.up_blocks = nn.ModuleList()
self.up_upscalers = nn.ModuleList()
self.up_repeat_mappers = nn.ModuleList()
for i in reversed(range(len(c_hidden))):
if i > 0:
self.up_upscalers.append(nn.Sequential(
LayerNorm2d_op(operations)(c_hidden[i], elementwise_affine=False, eps=1e-6),
UpDownBlock2d(c_hidden[i], c_hidden[i - 1], mode='up', enabled=switch_level[i - 1], dtype=dtype, device=device, operations=operations)
))
else:
self.up_upscalers.append(nn.Identity())
up_block = nn.ModuleList()
for j in range(blocks[1][::-1][i]):
for k, block_type in enumerate(level_config[i]):
c_skip = c_hidden[i] if i < len(c_hidden) - 1 and j == k == 0 else 0
block = get_block(block_type, c_hidden[i], nhead[i], c_skip=c_skip, dropout=dropout[i],
self_attn=self_attn[i])
up_block.append(block)
self.up_blocks.append(up_block)
if block_repeat is not None:
block_repeat_mappers = nn.ModuleList()
for _ in range(block_repeat[1][::-1][i] - 1):
block_repeat_mappers.append(operations.Conv2d(c_hidden[i], c_hidden[i], kernel_size=1, dtype=dtype, device=device))
self.up_repeat_mappers.append(block_repeat_mappers)
# OUTPUT
self.clf = nn.Sequential(
LayerNorm2d_op(operations)(c_hidden[0], elementwise_affine=False, eps=1e-6, dtype=dtype, device=device),
operations.Conv2d(c_hidden[0], c_out * (patch_size ** 2), kernel_size=1, dtype=dtype, device=device),
nn.PixelShuffle(patch_size),
)
# --- WEIGHT INIT ---
# self.apply(self._init_weights) # General init
# nn.init.normal_(self.clip_txt_mapper.weight, std=0.02) # conditionings
# nn.init.normal_(self.clip_txt_pooled_mapper.weight, std=0.02) # conditionings
# nn.init.normal_(self.clip_img_mapper.weight, std=0.02) # conditionings
# torch.nn.init.xavier_uniform_(self.embedding[1].weight, 0.02) # inputs
# nn.init.constant_(self.clf[1].weight, 0) # outputs
#
# # blocks
# for level_block in self.down_blocks + self.up_blocks:
# for block in level_block:
# if isinstance(block, ResBlock) or isinstance(block, FeedForwardBlock):
# block.channelwise[-1].weight.data *= np.sqrt(1 / sum(blocks[0]))
# elif isinstance(block, TimestepBlock):
# for layer in block.modules():
# if isinstance(layer, nn.Linear):
# nn.init.constant_(layer.weight, 0)
#
# def _init_weights(self, m):
# if isinstance(m, (nn.Conv2d, nn.Linear)):
# torch.nn.init.xavier_uniform_(m.weight)
# if m.bias is not None:
# nn.init.constant_(m.bias, 0)
def gen_r_embedding(self, r, max_positions=10000):
r = r * max_positions
half_dim = self.c_r // 2
emb = math.log(max_positions) / (half_dim - 1)
emb = torch.arange(half_dim, device=r.device).float().mul(-emb).exp()
emb = r[:, None] * emb[None, :]
emb = torch.cat([emb.sin(), emb.cos()], dim=1)
if self.c_r % 2 == 1: # zero pad
emb = nn.functional.pad(emb, (0, 1), mode='constant')
return emb
def gen_c_embeddings(self, clip_txt, clip_txt_pooled, clip_img):
clip_txt = self.clip_txt_mapper(clip_txt)
if len(clip_txt_pooled.shape) == 2:
clip_txt_pooled = clip_txt_pooled.unsqueeze(1)
if len(clip_img.shape) == 2:
clip_img = clip_img.unsqueeze(1)
clip_txt_pool = self.clip_txt_pooled_mapper(clip_txt_pooled).view(clip_txt_pooled.size(0), clip_txt_pooled.size(1) * self.c_clip_seq, -1)
clip_img = self.clip_img_mapper(clip_img).view(clip_img.size(0), clip_img.size(1) * self.c_clip_seq, -1)
clip = torch.cat([clip_txt, clip_txt_pool, clip_img], dim=1)
clip = self.clip_norm(clip)
return clip
def _down_encode(self, x, r_embed, clip, cnet=None):
level_outputs = []
block_group = zip(self.down_blocks, self.down_downscalers, self.down_repeat_mappers)
for down_block, downscaler, repmap in block_group:
x = downscaler(x)
for i in range(len(repmap) + 1):
for block in down_block:
if isinstance(block, ResBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
ResBlock)):
if cnet is not None:
next_cnet = cnet()
if next_cnet is not None:
x = x + nn.functional.interpolate(next_cnet, size=x.shape[-2:], mode='bilinear',
align_corners=True)
x = block(x)
elif isinstance(block, AttnBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
AttnBlock)):
x = block(x, clip)
elif isinstance(block, TimestepBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
TimestepBlock)):
x = block(x, r_embed)
else:
x = block(x)
if i < len(repmap):
x = repmap[i](x)
level_outputs.insert(0, x)
return level_outputs
def _up_decode(self, level_outputs, r_embed, clip, cnet=None):
x = level_outputs[0]
block_group = zip(self.up_blocks, self.up_upscalers, self.up_repeat_mappers)
for i, (up_block, upscaler, repmap) in enumerate(block_group):
for j in range(len(repmap) + 1):
for k, block in enumerate(up_block):
if isinstance(block, ResBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
ResBlock)):
skip = level_outputs[i] if k == 0 and i > 0 else None
if skip is not None and (x.size(-1) != skip.size(-1) or x.size(-2) != skip.size(-2)):
x = torch.nn.functional.interpolate(x, skip.shape[-2:], mode='bilinear',
align_corners=True)
if cnet is not None:
next_cnet = cnet()
if next_cnet is not None:
x = x + nn.functional.interpolate(next_cnet, size=x.shape[-2:], mode='bilinear',
align_corners=True)
x = block(x, skip)
elif isinstance(block, AttnBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
AttnBlock)):
x = block(x, clip)
elif isinstance(block, TimestepBlock) or (
hasattr(block, '_fsdp_wrapped_module') and isinstance(block._fsdp_wrapped_module,
TimestepBlock)):
x = block(x, r_embed)
else:
x = block(x)
if j < len(repmap):
x = repmap[j](x)
x = upscaler(x)
return x
def forward(self, x, r, clip_text, clip_text_pooled, clip_img, cnet=None, **kwargs):
# Process the conditioning embeddings
r_embed = self.gen_r_embedding(r).to(dtype=x.dtype)
for c in self.t_conds:
t_cond = kwargs.get(c, torch.zeros_like(r))
r_embed = torch.cat([r_embed, self.gen_r_embedding(t_cond).to(dtype=x.dtype)], dim=1)
clip = self.gen_c_embeddings(clip_text, clip_text_pooled, clip_img)
# Model Blocks
x = self.embedding(x)
if cnet is not None:
cnet = ControlNetDeliverer(cnet)
level_outputs = self._down_encode(x, r_embed, clip, cnet)
x = self._up_decode(level_outputs, r_embed, clip, cnet)
return self.clf(x)
def update_weights_ema(self, src_model, beta=0.999):
for self_params, src_params in zip(self.parameters(), src_model.parameters()):
self_params.data = self_params.data * beta + src_params.data.clone().to(self_params.device) * (1 - beta)
for self_buffers, src_buffers in zip(self.buffers(), src_model.buffers()):
self_buffers.data = self_buffers.data * beta + src_buffers.data.clone().to(self_buffers.device) * (1 - beta)
@@ -0,0 +1,95 @@
"""
This file is part of ComfyUI.
Copyright (C) 2024 Stability AI
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import torch
import torchvision
from torch import nn
# EfficientNet
class EfficientNetEncoder(nn.Module):
def __init__(self, c_latent=16):
super().__init__()
self.backbone = torchvision.models.efficientnet_v2_s().features.eval()
self.mapper = nn.Sequential(
nn.Conv2d(1280, c_latent, kernel_size=1, bias=False),
nn.BatchNorm2d(c_latent, affine=False), # then normalize them to have mean 0 and std 1
)
self.mean = nn.Parameter(torch.tensor([0.485, 0.456, 0.406]))
self.std = nn.Parameter(torch.tensor([0.229, 0.224, 0.225]))
def forward(self, x):
x = x * 0.5 + 0.5
x = (x - self.mean.view([3,1,1])) / self.std.view([3,1,1])
o = self.mapper(self.backbone(x))
return o
# Fast Decoder for Stage C latents. E.g. 16 x 24 x 24 -> 3 x 192 x 192
class Previewer(nn.Module):
def __init__(self, c_in=16, c_hidden=512, c_out=3):
super().__init__()
self.blocks = nn.Sequential(
nn.Conv2d(c_in, c_hidden, kernel_size=1), # 16 channels to 512 channels
nn.GELU(),
nn.BatchNorm2d(c_hidden),
nn.Conv2d(c_hidden, c_hidden, kernel_size=3, padding=1),
nn.GELU(),
nn.BatchNorm2d(c_hidden),
nn.ConvTranspose2d(c_hidden, c_hidden // 2, kernel_size=2, stride=2), # 16 -> 32
nn.GELU(),
nn.BatchNorm2d(c_hidden // 2),
nn.Conv2d(c_hidden // 2, c_hidden // 2, kernel_size=3, padding=1),
nn.GELU(),
nn.BatchNorm2d(c_hidden // 2),
nn.ConvTranspose2d(c_hidden // 2, c_hidden // 4, kernel_size=2, stride=2), # 32 -> 64
nn.GELU(),
nn.BatchNorm2d(c_hidden // 4),
nn.Conv2d(c_hidden // 4, c_hidden // 4, kernel_size=3, padding=1),
nn.GELU(),
nn.BatchNorm2d(c_hidden // 4),
nn.ConvTranspose2d(c_hidden // 4, c_hidden // 4, kernel_size=2, stride=2), # 64 -> 128
nn.GELU(),
nn.BatchNorm2d(c_hidden // 4),
nn.Conv2d(c_hidden // 4, c_hidden // 4, kernel_size=3, padding=1),
nn.GELU(),
nn.BatchNorm2d(c_hidden // 4),
nn.Conv2d(c_hidden // 4, c_out, kernel_size=1),
)
def forward(self, x):
return (self.blocks(x) - 0.5) * 2.0
class StageC_coder(nn.Module):
def __init__(self):
super().__init__()
self.previewer = Previewer()
self.encoder = EfficientNetEncoder()
def encode(self, x):
return self.encoder(x)
def decode(self, x):
return self.previewer(x)
@@ -114,7 +114,12 @@ def attention_basic(q, k, v, heads, mask=None):
mask = repeat(mask, 'b j -> (b h) () j', h=h) mask = repeat(mask, 'b j -> (b h) () j', h=h)
sim.masked_fill_(~mask, max_neg_value) sim.masked_fill_(~mask, max_neg_value)
else: else:
sim += mask if len(mask.shape) == 2:
bs = 1
else:
bs = mask.shape[0]
mask = mask.reshape(bs, -1, mask.shape[-2], mask.shape[-1]).expand(b, heads, -1, -1).reshape(-1, mask.shape[-2], mask.shape[-1])
sim.add_(mask)
# attention, what we cannot get enough of # attention, what we cannot get enough of
sim = sim.softmax(dim=-1) sim = sim.softmax(dim=-1)
@@ -165,6 +170,13 @@ def attention_sub_quad(query, key, value, heads, mask=None):
if query_chunk_size is None: if query_chunk_size is None:
query_chunk_size = 512 query_chunk_size = 512
if mask is not None:
if len(mask.shape) == 2:
bs = 1
else:
bs = mask.shape[0]
mask = mask.reshape(bs, -1, mask.shape[-2], mask.shape[-1]).expand(b, heads, -1, -1).reshape(-1, mask.shape[-2], mask.shape[-1])
hidden_states = efficient_dot_product_attention( hidden_states = efficient_dot_product_attention(
query, query,
key, key,
@@ -223,6 +235,13 @@ def attention_split(q, k, v, heads, mask=None):
raise RuntimeError(f'Not enough memory, use lower resolution (max approx. {max_res}x{max_res}). ' raise RuntimeError(f'Not enough memory, use lower resolution (max approx. {max_res}x{max_res}). '
f'Need: {mem_required/64/gb:0.1f}GB free, Have:{mem_free_total/gb:0.1f}GB free') f'Need: {mem_required/64/gb:0.1f}GB free, Have:{mem_free_total/gb:0.1f}GB free')
if mask is not None:
if len(mask.shape) == 2:
bs = 1
else:
bs = mask.shape[0]
mask = mask.reshape(bs, -1, mask.shape[-2], mask.shape[-1]).expand(b, heads, -1, -1).reshape(-1, mask.shape[-2], mask.shape[-1])
# print("steps", steps, mem_required, mem_free_total, modifier, q.element_size(), tensor_size) # print("steps", steps, mem_required, mem_free_total, modifier, q.element_size(), tensor_size)
first_op_done = False first_op_done = False
cleared_cache = False cleared_cache = False
@@ -98,7 +98,7 @@ def make_beta_schedule(schedule, n_timestep, linear_start=1e-4, linear_end=2e-2,
alphas = torch.cos(alphas).pow(2) alphas = torch.cos(alphas).pow(2)
alphas = alphas / alphas[0] alphas = alphas / alphas[0]
betas = 1 - alphas[1:] / alphas[:-1] betas = 1 - alphas[1:] / alphas[:-1]
betas = np.clip(betas, a_min=0, a_max=0.999) betas = torch.clamp(betas, min=0, max=0.999)
elif schedule == "squaredcos_cap_v2": # used for karlo prior elif schedule == "squaredcos_cap_v2": # used for karlo prior
# return early # return early
@@ -113,7 +113,7 @@ def make_beta_schedule(schedule, n_timestep, linear_start=1e-4, linear_end=2e-2,
betas = torch.linspace(linear_start, linear_end, n_timestep, dtype=torch.float64) ** 0.5 betas = torch.linspace(linear_start, linear_end, n_timestep, dtype=torch.float64) ** 0.5
else: else:
raise ValueError(f"schedule '{schedule}' unknown.") raise ValueError(f"schedule '{schedule}' unknown.")
return betas.numpy() return betas
def make_ddim_timesteps(ddim_discr_method, num_ddim_timesteps, num_ddpm_timesteps, verbose=True): def make_ddim_timesteps(ddim_discr_method, num_ddim_timesteps, num_ddpm_timesteps, verbose=True):
+62 -3
View File
@@ -1,5 +1,7 @@
import torch import torch
from comfy.ldm.modules.diffusionmodules.openaimodel import UNetModel, Timestep from comfy.ldm.modules.diffusionmodules.openaimodel import UNetModel, Timestep
from comfy.ldm.cascade.stage_c import StageC
from comfy.ldm.cascade.stage_b import StageB
from comfy.ldm.modules.encoders.noise_aug_modules import CLIPEmbeddingNoiseAugmentation from comfy.ldm.modules.encoders.noise_aug_modules import CLIPEmbeddingNoiseAugmentation
from comfy.ldm.modules.diffusionmodules.upscaling import ImageConcatWithNoiseAugmentation from comfy.ldm.modules.diffusionmodules.upscaling import ImageConcatWithNoiseAugmentation
import comfy.model_management import comfy.model_management
@@ -12,9 +14,10 @@ class ModelType(Enum):
EPS = 1 EPS = 1
V_PREDICTION = 2 V_PREDICTION = 2
V_PREDICTION_EDM = 3 V_PREDICTION_EDM = 3
STABLE_CASCADE = 4
from comfy.model_sampling import EPS, V_PREDICTION, ModelSamplingDiscrete, ModelSamplingContinuousEDM from comfy.model_sampling import EPS, V_PREDICTION, ModelSamplingDiscrete, ModelSamplingContinuousEDM, StableCascadeSampling
def model_sampling(model_config, model_type): def model_sampling(model_config, model_type):
@@ -27,6 +30,9 @@ def model_sampling(model_config, model_type):
elif model_type == ModelType.V_PREDICTION_EDM: elif model_type == ModelType.V_PREDICTION_EDM:
c = V_PREDICTION c = V_PREDICTION
s = ModelSamplingContinuousEDM s = ModelSamplingContinuousEDM
elif model_type == ModelType.STABLE_CASCADE:
c = EPS
s = StableCascadeSampling
class ModelSampling(s, c): class ModelSampling(s, c):
pass pass
@@ -35,7 +41,7 @@ def model_sampling(model_config, model_type):
class BaseModel(torch.nn.Module): class BaseModel(torch.nn.Module):
def __init__(self, model_config, model_type=ModelType.EPS, device=None): def __init__(self, model_config, model_type=ModelType.EPS, device=None, unet_model=UNetModel):
super().__init__() super().__init__()
unet_config = model_config.unet_config unet_config = model_config.unet_config
@@ -48,7 +54,7 @@ class BaseModel(torch.nn.Module):
operations = comfy.ops.manual_cast operations = comfy.ops.manual_cast
else: else:
operations = comfy.ops.disable_weight_init operations = comfy.ops.disable_weight_init
self.diffusion_model = UNetModel(**unet_config, device=device, operations=operations) self.diffusion_model = unet_model(**unet_config, device=device, operations=operations)
self.model_type = model_type self.model_type = model_type
self.model_sampling = model_sampling(model_config, model_type) self.model_sampling = model_sampling(model_config, model_type)
@@ -153,6 +159,10 @@ class BaseModel(torch.nn.Module):
if cross_attn is not None: if cross_attn is not None:
out['c_crossattn'] = comfy.conds.CONDCrossAttn(cross_attn) out['c_crossattn'] = comfy.conds.CONDCrossAttn(cross_attn)
cross_attn_cnet = kwargs.get("cross_attn_controlnet", None)
if cross_attn_cnet is not None:
out['crossattn_controlnet'] = comfy.conds.CONDCrossAttn(cross_attn_cnet)
return out return out
def load_model_weights(self, sd, unet_prefix=""): def load_model_weights(self, sd, unet_prefix=""):
@@ -423,3 +433,52 @@ class SD_X4Upscaler(BaseModel):
out['c_concat'] = comfy.conds.CONDNoiseShape(image) out['c_concat'] = comfy.conds.CONDNoiseShape(image)
out['y'] = comfy.conds.CONDRegular(noise_level) out['y'] = comfy.conds.CONDRegular(noise_level)
return out return out
class StableCascade_C(BaseModel):
def __init__(self, model_config, model_type=ModelType.STABLE_CASCADE, device=None):
super().__init__(model_config, model_type, device=device, unet_model=StageC)
self.diffusion_model.eval().requires_grad_(False)
def extra_conds(self, **kwargs):
out = {}
clip_text_pooled = kwargs["pooled_output"]
if clip_text_pooled is not None:
out['clip_text_pooled'] = comfy.conds.CONDRegular(clip_text_pooled)
if "unclip_conditioning" in kwargs:
embeds = []
for unclip_cond in kwargs["unclip_conditioning"]:
weight = unclip_cond["strength"]
embeds.append(unclip_cond["clip_vision_output"].image_embeds.unsqueeze(0) * weight)
clip_img = torch.cat(embeds, dim=1)
else:
clip_img = torch.zeros((1, 1, 768))
out["clip_img"] = comfy.conds.CONDRegular(clip_img)
out["sca"] = comfy.conds.CONDRegular(torch.zeros((1,)))
out["crp"] = comfy.conds.CONDRegular(torch.zeros((1,)))
cross_attn = kwargs.get("cross_attn", None)
if cross_attn is not None:
out['clip_text'] = comfy.conds.CONDCrossAttn(cross_attn)
return out
class StableCascade_B(BaseModel):
def __init__(self, model_config, model_type=ModelType.STABLE_CASCADE, device=None):
super().__init__(model_config, model_type, device=device, unet_model=StageB)
self.diffusion_model.eval().requires_grad_(False)
def extra_conds(self, **kwargs):
out = {}
noise = kwargs.get("noise", None)
clip_text_pooled = kwargs["pooled_output"]
if clip_text_pooled is not None:
out['clip'] = comfy.conds.CONDRegular(clip_text_pooled)
#size of prior doesn't really matter if zeros because it gets resized but I still want it to get batched
prior = kwargs.get("stable_cascade_prior", torch.zeros((1, 16, (noise.shape[2] * 4) // 42, (noise.shape[3] * 4) // 42), dtype=noise.dtype, layout=noise.layout, device=noise.device))
out["effnet"] = comfy.conds.CONDRegular(prior)
out["sca"] = comfy.conds.CONDRegular(torch.zeros((1,)))
return out
@@ -28,9 +28,38 @@ def calculate_transformer_depth(prefix, state_dict_keys, state_dict):
return last_transformer_depth, context_dim, use_linear_in_transformer, time_stack return last_transformer_depth, context_dim, use_linear_in_transformer, time_stack
return None return None
def detect_unet_config(state_dict, key_prefix, dtype): def detect_unet_config(state_dict, key_prefix):
state_dict_keys = list(state_dict.keys()) state_dict_keys = list(state_dict.keys())
if '{}clf.1.weight'.format(key_prefix) in state_dict_keys: #stable cascade
unet_config = {}
text_mapper_name = '{}clip_txt_mapper.weight'.format(key_prefix)
if text_mapper_name in state_dict_keys:
unet_config['stable_cascade_stage'] = 'c'
w = state_dict[text_mapper_name]
if w.shape[0] == 1536: #stage c lite
unet_config['c_cond'] = 1536
unet_config['c_hidden'] = [1536, 1536]
unet_config['nhead'] = [24, 24]
unet_config['blocks'] = [[4, 12], [12, 4]]
elif w.shape[0] == 2048: #stage c full
unet_config['c_cond'] = 2048
elif '{}clip_mapper.weight'.format(key_prefix) in state_dict_keys:
unet_config['stable_cascade_stage'] = 'b'
w = state_dict['{}down_blocks.1.0.channelwise.0.weight'.format(key_prefix)]
if w.shape[-1] == 640:
unet_config['c_hidden'] = [320, 640, 1280, 1280]
unet_config['nhead'] = [-1, -1, 20, 20]
unet_config['blocks'] = [[2, 6, 28, 6], [6, 28, 6, 2]]
unet_config['block_repeat'] = [[1, 1, 1, 1], [3, 3, 2, 2]]
elif w.shape[-1] == 576: #stage b lite
unet_config['c_hidden'] = [320, 576, 1152, 1152]
unet_config['nhead'] = [-1, 9, 18, 18]
unet_config['blocks'] = [[2, 4, 14, 4], [4, 14, 4, 2]]
unet_config['block_repeat'] = [[1, 1, 1, 1], [2, 2, 2, 2]]
return unet_config
unet_config = { unet_config = {
"use_checkpoint": False, "use_checkpoint": False,
"image_size": 32, "image_size": 32,
@@ -45,7 +74,6 @@ def detect_unet_config(state_dict, key_prefix, dtype):
else: else:
unet_config["adm_in_channels"] = None unet_config["adm_in_channels"] = None
unet_config["dtype"] = dtype
model_channels = state_dict['{}input_blocks.0.0.weight'.format(key_prefix)].shape[0] model_channels = state_dict['{}input_blocks.0.0.weight'.format(key_prefix)].shape[0]
in_channels = state_dict['{}input_blocks.0.0.weight'.format(key_prefix)].shape[1] in_channels = state_dict['{}input_blocks.0.0.weight'.format(key_prefix)].shape[1]
@@ -159,8 +187,8 @@ def model_config_from_unet_config(unet_config):
print("no match", unet_config) print("no match", unet_config)
return None return None
def model_config_from_unet(state_dict, unet_key_prefix, dtype, use_base_if_no_match=False): def model_config_from_unet(state_dict, unet_key_prefix, use_base_if_no_match=False):
unet_config = detect_unet_config(state_dict, unet_key_prefix, dtype) unet_config = detect_unet_config(state_dict, unet_key_prefix)
model_config = model_config_from_unet_config(unet_config) model_config = model_config_from_unet_config(unet_config)
if model_config is None and use_base_if_no_match: if model_config is None and use_base_if_no_match:
return comfy.supported_models_base.BASE(unet_config) return comfy.supported_models_base.BASE(unet_config)
@@ -206,7 +234,7 @@ def convert_config(unet_config):
return new_config return new_config
def unet_config_from_diffusers_unet(state_dict, dtype): def unet_config_from_diffusers_unet(state_dict, dtype=None):
match = {} match = {}
transformer_depth = [] transformer_depth = []
@@ -313,8 +341,8 @@ def unet_config_from_diffusers_unet(state_dict, dtype):
return convert_config(unet_config) return convert_config(unet_config)
return None return None
def model_config_from_diffusers_unet(state_dict, dtype): def model_config_from_diffusers_unet(state_dict):
unet_config = unet_config_from_diffusers_unet(state_dict, dtype) unet_config = unet_config_from_diffusers_unet(state_dict)
if unet_config is not None: if unet_config is not None:
return model_config_from_unet_config(unet_config) return model_config_from_unet_config(unet_config)
return None return None
@@ -487,7 +487,7 @@ def unet_inital_load_device(parameters, dtype):
else: else:
return cpu_dev return cpu_dev
def unet_dtype(device=None, model_params=0): def unet_dtype(device=None, model_params=0, supported_dtypes=[torch.float16, torch.bfloat16, torch.float32]):
if args.bf16_unet: if args.bf16_unet:
return torch.bfloat16 return torch.bfloat16
if args.fp16_unet: if args.fp16_unet:
@@ -496,21 +496,32 @@ def unet_dtype(device=None, model_params=0):
return torch.float8_e4m3fn return torch.float8_e4m3fn
if args.fp8_e5m2_unet: if args.fp8_e5m2_unet:
return torch.float8_e5m2 return torch.float8_e5m2
if should_use_fp16(device=device, model_params=model_params): if should_use_fp16(device=device, model_params=model_params, manual_cast=True):
return torch.float16 if torch.float16 in supported_dtypes:
return torch.float16
if should_use_bf16(device, model_params=model_params, manual_cast=True):
if torch.bfloat16 in supported_dtypes:
return torch.bfloat16
return torch.float32 return torch.float32
# None means no manual cast # None means no manual cast
def unet_manual_cast(weight_dtype, inference_device): def unet_manual_cast(weight_dtype, inference_device, supported_dtypes=[torch.float16, torch.bfloat16, torch.float32]):
if weight_dtype == torch.float32: if weight_dtype == torch.float32:
return None return None
fp16_supported = comfy.model_management.should_use_fp16(inference_device, prioritize_performance=False) fp16_supported = should_use_fp16(inference_device, prioritize_performance=False)
if fp16_supported and weight_dtype == torch.float16: if fp16_supported and weight_dtype == torch.float16:
return None return None
if fp16_supported: bf16_supported = should_use_bf16(inference_device)
if bf16_supported and weight_dtype == torch.bfloat16:
return None
if fp16_supported and torch.float16 in supported_dtypes:
return torch.float16 return torch.float16
elif bf16_supported and torch.bfloat16 in supported_dtypes:
return torch.bfloat16
else: else:
return torch.float32 return torch.float32
@@ -546,10 +557,8 @@ def text_encoder_dtype(device=None):
if is_device_cpu(device): if is_device_cpu(device):
return torch.float16 return torch.float16
if should_use_fp16(device, prioritize_performance=False): return torch.float16
return torch.float16
else:
return torch.float32
def intermediate_device(): def intermediate_device():
if args.gpu_only: if args.gpu_only:
@@ -686,19 +695,22 @@ def mps_mode():
global cpu_state global cpu_state
return cpu_state == CPUState.MPS return cpu_state == CPUState.MPS
def is_device_cpu(device): def is_device_type(device, type):
if hasattr(device, 'type'): if hasattr(device, 'type'):
if (device.type == 'cpu'): if (device.type == type):
return True return True
return False return False
def is_device_cpu(device):
return is_device_type(device, 'cpu')
def is_device_mps(device): def is_device_mps(device):
if hasattr(device, 'type'): return is_device_type(device, 'mps')
if (device.type == 'mps'):
return True
return False
def should_use_fp16(device=None, model_params=0, prioritize_performance=True): def is_device_cuda(device):
return is_device_type(device, 'cuda')
def should_use_fp16(device=None, model_params=0, prioritize_performance=True, manual_cast=False):
global directml_enabled global directml_enabled
if device is not None: if device is not None:
@@ -708,9 +720,9 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
if FORCE_FP16: if FORCE_FP16:
return True return True
if device is not None: #TODO if device is not None:
if is_device_mps(device): if is_device_mps(device):
return False return True
if FORCE_FP32: if FORCE_FP32:
return False return False
@@ -718,16 +730,22 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
if directml_enabled: if directml_enabled:
return False return False
if cpu_mode() or mps_mode(): if mps_mode():
return False #TODO ? return True
if cpu_mode():
return False
if is_intel_xpu(): if is_intel_xpu():
return True return True
if torch.cuda.is_bf16_supported(): if torch.version.hip:
return True return True
props = torch.cuda.get_device_properties("cuda") props = torch.cuda.get_device_properties("cuda")
if props.major >= 8:
return True
if props.major < 6: if props.major < 6:
return False return False
@@ -740,7 +758,7 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
if x in props.name.lower(): if x in props.name.lower():
fp16_works = True fp16_works = True
if fp16_works: if fp16_works or manual_cast:
free_model_memory = (get_free_memory() * 0.9 - minimum_inference_memory()) free_model_memory = (get_free_memory() * 0.9 - minimum_inference_memory())
if (not prioritize_performance) or model_params * 4 > free_model_memory: if (not prioritize_performance) or model_params * 4 > free_model_memory:
return True return True
@@ -756,6 +774,43 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
return True return True
def should_use_bf16(device=None, model_params=0, prioritize_performance=True, manual_cast=False):
if device is not None:
if is_device_cpu(device): #TODO ? bf16 works on CPU but is extremely slow
return False
if device is not None: #TODO not sure about mps bf16 support
if is_device_mps(device):
return False
if FORCE_FP32:
return False
if directml_enabled:
return False
if cpu_mode() or mps_mode():
return False
if is_intel_xpu():
return True
if device is None:
device = torch.device("cuda")
props = torch.cuda.get_device_properties(device)
if props.major >= 8:
return True
bf16_works = torch.cuda.is_bf16_supported()
if bf16_works or manual_cast:
free_model_memory = (get_free_memory() * 0.9 - minimum_inference_memory())
if (not prioritize_performance) or model_params * 4 > free_model_memory:
return True
return False
def soft_empty_cache(force=False): def soft_empty_cache(force=False):
global cpu_state global cpu_state
if cpu_state == CPUState.MPS: if cpu_state == CPUState.MPS:
@@ -1,5 +1,4 @@
import torch import torch
import numpy as np
from comfy.ldm.modules.diffusionmodules.util import make_beta_schedule from comfy.ldm.modules.diffusionmodules.util import make_beta_schedule
import math import math
@@ -42,8 +41,7 @@ class ModelSamplingDiscrete(torch.nn.Module):
else: else:
betas = make_beta_schedule(beta_schedule, timesteps, linear_start=linear_start, linear_end=linear_end, cosine_s=cosine_s) betas = make_beta_schedule(beta_schedule, timesteps, linear_start=linear_start, linear_end=linear_end, cosine_s=cosine_s)
alphas = 1. - betas alphas = 1. - betas
alphas_cumprod = torch.tensor(np.cumprod(alphas, axis=0), dtype=torch.float32) alphas_cumprod = torch.cumprod(alphas, dim=0)
# alphas_cumprod_prev = np.append(1., alphas_cumprod[:-1])
timesteps, = betas.shape timesteps, = betas.shape
self.num_timesteps = int(timesteps) self.num_timesteps = int(timesteps)
@@ -58,8 +56,8 @@ class ModelSamplingDiscrete(torch.nn.Module):
self.set_sigmas(sigmas) self.set_sigmas(sigmas)
def set_sigmas(self, sigmas): def set_sigmas(self, sigmas):
self.register_buffer('sigmas', sigmas) self.register_buffer('sigmas', sigmas.float())
self.register_buffer('log_sigmas', sigmas.log()) self.register_buffer('log_sigmas', sigmas.log().float())
@property @property
def sigma_min(self): def sigma_min(self):
@@ -134,3 +132,56 @@ class ModelSamplingContinuousEDM(torch.nn.Module):
log_sigma_min = math.log(self.sigma_min) log_sigma_min = math.log(self.sigma_min)
return math.exp((math.log(self.sigma_max) - log_sigma_min) * percent + log_sigma_min) return math.exp((math.log(self.sigma_max) - log_sigma_min) * percent + log_sigma_min)
class StableCascadeSampling(ModelSamplingDiscrete):
def __init__(self, model_config=None):
super().__init__()
if model_config is not None:
sampling_settings = model_config.sampling_settings
else:
sampling_settings = {}
self.set_parameters(sampling_settings.get("shift", 1.0))
def set_parameters(self, shift=1.0, cosine_s=8e-3):
self.shift = shift
self.cosine_s = torch.tensor(cosine_s)
self._init_alpha_cumprod = torch.cos(self.cosine_s / (1 + self.cosine_s) * torch.pi * 0.5) ** 2
#This part is just for compatibility with some schedulers in the codebase
self.num_timesteps = 10000
sigmas = torch.empty((self.num_timesteps), dtype=torch.float32)
for x in range(self.num_timesteps):
t = (x + 1) / self.num_timesteps
sigmas[x] = self.sigma(t)
self.set_sigmas(sigmas)
def sigma(self, timestep):
alpha_cumprod = (torch.cos((timestep + self.cosine_s) / (1 + self.cosine_s) * torch.pi * 0.5) ** 2 / self._init_alpha_cumprod)
if self.shift != 1.0:
var = alpha_cumprod
logSNR = (var/(1-var)).log()
logSNR += 2 * torch.log(1.0 / torch.tensor(self.shift))
alpha_cumprod = logSNR.sigmoid()
alpha_cumprod = alpha_cumprod.clamp(0.0001, 0.9999)
return ((1 - alpha_cumprod) / alpha_cumprod) ** 0.5
def timestep(self, sigma):
var = 1 / ((sigma * sigma) + 1)
var = var.clamp(0, 1.0)
s, min_var = self.cosine_s.to(var.device), self._init_alpha_cumprod.to(var.device)
t = (((var * min_var) ** 0.5).acos() / (torch.pi * 0.5)) * (1 + s) - s
return t
def percent_to_sigma(self, percent):
if percent <= 0.0:
return 999999999.9
if percent >= 1.0:
return 0.0
percent = 1.0 - percent
return self.sigma(torch.tensor(percent))
+48 -1
View File
@@ -1,3 +1,21 @@
"""
This file is part of ComfyUI.
Copyright (C) 2024 Stability AI
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import torch import torch
import comfy.model_management import comfy.model_management
@@ -78,7 +96,11 @@ class disable_weight_init:
return None return None
def forward_comfy_cast_weights(self, input): def forward_comfy_cast_weights(self, input):
weight, bias = cast_bias_weight(self, input) if self.weight is not None:
weight, bias = cast_bias_weight(self, input)
else:
weight = None
bias = None
return torch.nn.functional.layer_norm(input, self.normalized_shape, weight, bias, self.eps) return torch.nn.functional.layer_norm(input, self.normalized_shape, weight, bias, self.eps)
def forward(self, *args, **kwargs): def forward(self, *args, **kwargs):
@@ -87,6 +109,28 @@ class disable_weight_init:
else: else:
return super().forward(*args, **kwargs) return super().forward(*args, **kwargs)
class ConvTranspose2d(torch.nn.ConvTranspose2d):
comfy_cast_weights = False
def reset_parameters(self):
return None
def forward_comfy_cast_weights(self, input, output_size=None):
num_spatial_dims = 2
output_padding = self._output_padding(
input, output_size, self.stride, self.padding, self.kernel_size,
num_spatial_dims, self.dilation)
weight, bias = cast_bias_weight(self, input)
return torch.nn.functional.conv_transpose2d(
input, weight, bias, self.stride, self.padding,
output_padding, self.groups, self.dilation)
def forward(self, *args, **kwargs):
if self.comfy_cast_weights:
return self.forward_comfy_cast_weights(*args, **kwargs)
else:
return super().forward(*args, **kwargs)
@classmethod @classmethod
def conv_nd(s, dims, *args, **kwargs): def conv_nd(s, dims, *args, **kwargs):
if dims == 2: if dims == 2:
@@ -112,3 +156,6 @@ class manual_cast(disable_weight_init):
class LayerNorm(disable_weight_init.LayerNorm): class LayerNorm(disable_weight_init.LayerNorm):
comfy_cast_weights = True comfy_cast_weights = True
class ConvTranspose2d(disable_weight_init.ConvTranspose2d):
comfy_cast_weights = True
+3 -2
View File
@@ -295,7 +295,7 @@ def simple_scheduler(model, steps):
def ddim_scheduler(model, steps): def ddim_scheduler(model, steps):
s = model.model_sampling s = model.model_sampling
sigs = [] sigs = []
ss = len(s.sigmas) // steps ss = max(len(s.sigmas) // steps, 1)
x = 1 x = 1
while x < len(s.sigmas): while x < len(s.sigmas):
sigs += [float(s.sigmas[x])] sigs += [float(s.sigmas[x])]
@@ -652,6 +652,7 @@ def sampler_object(name):
class KSampler: class KSampler:
SCHEDULERS = SCHEDULER_NAMES SCHEDULERS = SCHEDULER_NAMES
SAMPLERS = SAMPLER_NAMES SAMPLERS = SAMPLER_NAMES
DISCARD_PENULTIMATE_SIGMA_SAMPLERS = set(('dpm_2', 'dpm_2_ancestral', 'uni_pc', 'uni_pc_bh2'))
def __init__(self, model, steps, device, sampler=None, scheduler=None, denoise=None, model_options={}): def __init__(self, model, steps, device, sampler=None, scheduler=None, denoise=None, model_options={}):
self.model = model self.model = model
@@ -670,7 +671,7 @@ class KSampler:
sigmas = None sigmas = None
discard_penultimate_sigma = False discard_penultimate_sigma = False
if self.sampler in ['dpm_2', 'dpm_2_ancestral', 'uni_pc', 'uni_pc_bh2']: if self.sampler in self.DISCARD_PENULTIMATE_SIGMA_SAMPLERS:
steps += 1 steps += 1
discard_penultimate_sigma = True discard_penultimate_sigma = True
+94 -32
View File
@@ -1,7 +1,11 @@
import torch import torch
from enum import Enum
from comfy import model_management from comfy import model_management
from .ldm.models.autoencoder import AutoencoderKL, AutoencodingEngine from .ldm.models.autoencoder import AutoencoderKL, AutoencodingEngine
from .ldm.cascade.stage_a import StageA
from .ldm.cascade.stage_c_coder import StageC_coder
import yaml import yaml
import comfy.utils import comfy.utils
@@ -134,8 +138,11 @@ class CLIP:
tokens = self.tokenize(text) tokens = self.tokenize(text)
return self.encode_from_tokens(tokens) return self.encode_from_tokens(tokens)
def load_sd(self, sd): def load_sd(self, sd, full_model=False):
return self.cond_stage_model.load_sd(sd) if full_model:
return self.cond_stage_model.load_state_dict(sd, strict=False)
else:
return self.cond_stage_model.load_sd(sd)
def get_sd(self): def get_sd(self):
return self.cond_stage_model.state_dict() return self.cond_stage_model.state_dict()
@@ -155,7 +162,10 @@ class VAE:
self.memory_used_encode = lambda shape, dtype: (1767 * shape[2] * shape[3]) * model_management.dtype_size(dtype) #These are for AutoencoderKL and need tweaking (should be lower) self.memory_used_encode = lambda shape, dtype: (1767 * shape[2] * shape[3]) * model_management.dtype_size(dtype) #These are for AutoencoderKL and need tweaking (should be lower)
self.memory_used_decode = lambda shape, dtype: (2178 * shape[2] * shape[3] * 64) * model_management.dtype_size(dtype) self.memory_used_decode = lambda shape, dtype: (2178 * shape[2] * shape[3] * 64) * model_management.dtype_size(dtype)
self.downscale_ratio = 8 self.downscale_ratio = 8
self.upscale_ratio = 8
self.latent_channels = 4 self.latent_channels = 4
self.process_input = lambda image: image * 2.0 - 1.0
self.process_output = lambda image: torch.clamp((image + 1.0) / 2.0, min=0.0, max=1.0)
if config is None: if config is None:
if "decoder.mid.block_1.mix_factor" in sd: if "decoder.mid.block_1.mix_factor" in sd:
@@ -168,6 +178,34 @@ class VAE:
decoder_config={'target': "comfy.ldm.modules.temporal_ae.VideoDecoder", 'params': decoder_config}) decoder_config={'target': "comfy.ldm.modules.temporal_ae.VideoDecoder", 'params': decoder_config})
elif "taesd_decoder.1.weight" in sd: elif "taesd_decoder.1.weight" in sd:
self.first_stage_model = comfy.taesd.taesd.TAESD() self.first_stage_model = comfy.taesd.taesd.TAESD()
elif "vquantizer.codebook.weight" in sd: #VQGan: stage a of stable cascade
self.first_stage_model = StageA()
self.downscale_ratio = 4
self.upscale_ratio = 4
#TODO
#self.memory_used_encode
#self.memory_used_decode
self.process_input = lambda image: image
self.process_output = lambda image: image
elif "backbone.1.0.block.0.1.num_batches_tracked" in sd: #effnet: encoder for stage c latent of stable cascade
self.first_stage_model = StageC_coder()
self.downscale_ratio = 32
self.latent_channels = 16
new_sd = {}
for k in sd:
new_sd["encoder.{}".format(k)] = sd[k]
sd = new_sd
elif "blocks.11.num_batches_tracked" in sd: #previewer: decoder for stage c latent of stable cascade
self.first_stage_model = StageC_coder()
self.latent_channels = 16
new_sd = {}
for k in sd:
new_sd["previewer.{}".format(k)] = sd[k]
sd = new_sd
elif "encoder.backbone.1.0.block.0.1.num_batches_tracked" in sd: #combined effnet and previewer for stable cascade
self.first_stage_model = StageC_coder()
self.downscale_ratio = 32
self.latent_channels = 16
else: else:
#default SD1.x/SD2.x VAE parameters #default SD1.x/SD2.x VAE parameters
ddconfig = {'double_z': True, 'z_channels': 4, 'resolution': 256, 'in_channels': 3, 'out_ch': 3, 'ch': 128, 'ch_mult': [1, 2, 4, 4], 'num_res_blocks': 2, 'attn_resolutions': [], 'dropout': 0.0} ddconfig = {'double_z': True, 'z_channels': 4, 'resolution': 256, 'in_channels': 3, 'out_ch': 3, 'ch': 128, 'ch_mult': [1, 2, 4, 4], 'num_res_blocks': 2, 'attn_resolutions': [], 'dropout': 0.0}
@@ -175,6 +213,7 @@ class VAE:
if 'encoder.down.2.downsample.conv.weight' not in sd: #Stable diffusion x4 upscaler VAE if 'encoder.down.2.downsample.conv.weight' not in sd: #Stable diffusion x4 upscaler VAE
ddconfig['ch_mult'] = [1, 2, 4] ddconfig['ch_mult'] = [1, 2, 4]
self.downscale_ratio = 4 self.downscale_ratio = 4
self.upscale_ratio = 4
self.first_stage_model = AutoencoderKL(ddconfig=ddconfig, embed_dim=4) self.first_stage_model = AutoencoderKL(ddconfig=ddconfig, embed_dim=4)
else: else:
@@ -200,18 +239,27 @@ class VAE:
self.patcher = comfy.model_patcher.ModelPatcher(self.first_stage_model, load_device=self.device, offload_device=offload_device) self.patcher = comfy.model_patcher.ModelPatcher(self.first_stage_model, load_device=self.device, offload_device=offload_device)
def vae_encode_crop_pixels(self, pixels):
x = (pixels.shape[1] // self.downscale_ratio) * self.downscale_ratio
y = (pixels.shape[2] // self.downscale_ratio) * self.downscale_ratio
if pixels.shape[1] != x or pixels.shape[2] != y:
x_offset = (pixels.shape[1] % self.downscale_ratio) // 2
y_offset = (pixels.shape[2] % self.downscale_ratio) // 2
pixels = pixels[:, x_offset:x + x_offset, y_offset:y + y_offset, :]
return pixels
def decode_tiled_(self, samples, tile_x=64, tile_y=64, overlap = 16): def decode_tiled_(self, samples, tile_x=64, tile_y=64, overlap = 16):
steps = samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x, tile_y, overlap) steps = samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x, tile_y, overlap)
steps += samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x // 2, tile_y * 2, overlap) steps += samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x // 2, tile_y * 2, overlap)
steps += samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x * 2, tile_y // 2, overlap) steps += samples.shape[0] * comfy.utils.get_tiled_scale_steps(samples.shape[3], samples.shape[2], tile_x * 2, tile_y // 2, overlap)
pbar = comfy.utils.ProgressBar(steps) pbar = comfy.utils.ProgressBar(steps)
decode_fn = lambda a: (self.first_stage_model.decode(a.to(self.vae_dtype).to(self.device)) + 1.0).float() decode_fn = lambda a: self.first_stage_model.decode(a.to(self.vae_dtype).to(self.device)).float()
output = torch.clamp(( output = self.process_output(
(comfy.utils.tiled_scale(samples, decode_fn, tile_x // 2, tile_y * 2, overlap, upscale_amount = self.downscale_ratio, output_device=self.output_device, pbar = pbar) + (comfy.utils.tiled_scale(samples, decode_fn, tile_x // 2, tile_y * 2, overlap, upscale_amount = self.upscale_ratio, output_device=self.output_device, pbar = pbar) +
comfy.utils.tiled_scale(samples, decode_fn, tile_x * 2, tile_y // 2, overlap, upscale_amount = self.downscale_ratio, output_device=self.output_device, pbar = pbar) + comfy.utils.tiled_scale(samples, decode_fn, tile_x * 2, tile_y // 2, overlap, upscale_amount = self.upscale_ratio, output_device=self.output_device, pbar = pbar) +
comfy.utils.tiled_scale(samples, decode_fn, tile_x, tile_y, overlap, upscale_amount = self.downscale_ratio, output_device=self.output_device, pbar = pbar)) comfy.utils.tiled_scale(samples, decode_fn, tile_x, tile_y, overlap, upscale_amount = self.upscale_ratio, output_device=self.output_device, pbar = pbar))
/ 3.0) / 2.0, min=0.0, max=1.0) / 3.0)
return output return output
def encode_tiled_(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64): def encode_tiled_(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64):
@@ -220,7 +268,7 @@ class VAE:
steps += pixel_samples.shape[0] * comfy.utils.get_tiled_scale_steps(pixel_samples.shape[3], pixel_samples.shape[2], tile_x * 2, tile_y // 2, overlap) steps += pixel_samples.shape[0] * comfy.utils.get_tiled_scale_steps(pixel_samples.shape[3], pixel_samples.shape[2], tile_x * 2, tile_y // 2, overlap)
pbar = comfy.utils.ProgressBar(steps) pbar = comfy.utils.ProgressBar(steps)
encode_fn = lambda a: self.first_stage_model.encode((2. * a - 1.).to(self.vae_dtype).to(self.device)).float() encode_fn = lambda a: self.first_stage_model.encode((self.process_input(a)).to(self.vae_dtype).to(self.device)).float()
samples = comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x, tile_y, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar) samples = comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x, tile_y, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar)
samples += comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x * 2, tile_y // 2, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar) samples += comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x * 2, tile_y // 2, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar)
samples += comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x // 2, tile_y * 2, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar) samples += comfy.utils.tiled_scale(pixel_samples, encode_fn, tile_x // 2, tile_y * 2, overlap, upscale_amount = (1/self.downscale_ratio), out_channels=self.latent_channels, output_device=self.output_device, pbar=pbar)
@@ -235,10 +283,10 @@ class VAE:
batch_number = int(free_memory / memory_used) batch_number = int(free_memory / memory_used)
batch_number = max(1, batch_number) batch_number = max(1, batch_number)
pixel_samples = torch.empty((samples_in.shape[0], 3, round(samples_in.shape[2] * self.downscale_ratio), round(samples_in.shape[3] * self.downscale_ratio)), device=self.output_device) pixel_samples = torch.empty((samples_in.shape[0], 3, round(samples_in.shape[2] * self.upscale_ratio), round(samples_in.shape[3] * self.upscale_ratio)), device=self.output_device)
for x in range(0, samples_in.shape[0], batch_number): for x in range(0, samples_in.shape[0], batch_number):
samples = samples_in[x:x+batch_number].to(self.vae_dtype).to(self.device) samples = samples_in[x:x+batch_number].to(self.vae_dtype).to(self.device)
pixel_samples[x:x+batch_number] = torch.clamp((self.first_stage_model.decode(samples).to(self.output_device).float() + 1.0) / 2.0, min=0.0, max=1.0) pixel_samples[x:x+batch_number] = self.process_output(self.first_stage_model.decode(samples).to(self.output_device).float())
except model_management.OOM_EXCEPTION as e: except model_management.OOM_EXCEPTION as e:
print("Warning: Ran out of memory when regular VAE decoding, retrying with tiled VAE decoding.") print("Warning: Ran out of memory when regular VAE decoding, retrying with tiled VAE decoding.")
pixel_samples = self.decode_tiled_(samples_in) pixel_samples = self.decode_tiled_(samples_in)
@@ -252,6 +300,7 @@ class VAE:
return output.movedim(1,-1) return output.movedim(1,-1)
def encode(self, pixel_samples): def encode(self, pixel_samples):
pixel_samples = self.vae_encode_crop_pixels(pixel_samples)
pixel_samples = pixel_samples.movedim(-1,1) pixel_samples = pixel_samples.movedim(-1,1)
try: try:
memory_used = self.memory_used_encode(pixel_samples.shape, self.vae_dtype) memory_used = self.memory_used_encode(pixel_samples.shape, self.vae_dtype)
@@ -261,7 +310,7 @@ class VAE:
batch_number = max(1, batch_number) batch_number = max(1, batch_number)
samples = torch.empty((pixel_samples.shape[0], self.latent_channels, round(pixel_samples.shape[2] // self.downscale_ratio), round(pixel_samples.shape[3] // self.downscale_ratio)), device=self.output_device) samples = torch.empty((pixel_samples.shape[0], self.latent_channels, round(pixel_samples.shape[2] // self.downscale_ratio), round(pixel_samples.shape[3] // self.downscale_ratio)), device=self.output_device)
for x in range(0, pixel_samples.shape[0], batch_number): for x in range(0, pixel_samples.shape[0], batch_number):
pixels_in = (2. * pixel_samples[x:x+batch_number] - 1.).to(self.vae_dtype).to(self.device) pixels_in = self.process_input(pixel_samples[x:x+batch_number]).to(self.vae_dtype).to(self.device)
samples[x:x+batch_number] = self.first_stage_model.encode(pixels_in).to(self.output_device).float() samples[x:x+batch_number] = self.first_stage_model.encode(pixels_in).to(self.output_device).float()
except model_management.OOM_EXCEPTION as e: except model_management.OOM_EXCEPTION as e:
@@ -271,6 +320,7 @@ class VAE:
return samples return samples
def encode_tiled(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64): def encode_tiled(self, pixel_samples, tile_x=512, tile_y=512, overlap = 64):
pixel_samples = self.vae_encode_crop_pixels(pixel_samples)
model_management.load_model_gpu(self.patcher) model_management.load_model_gpu(self.patcher)
pixel_samples = pixel_samples.movedim(-1,1) pixel_samples = pixel_samples.movedim(-1,1)
samples = self.encode_tiled_(pixel_samples, tile_x=tile_x, tile_y=tile_y, overlap=overlap) samples = self.encode_tiled_(pixel_samples, tile_x=tile_x, tile_y=tile_y, overlap=overlap)
@@ -297,8 +347,11 @@ def load_style_model(ckpt_path):
model.load_state_dict(model_data) model.load_state_dict(model_data)
return StyleModel(model) return StyleModel(model)
class CLIPType(Enum):
STABLE_DIFFUSION = 1
STABLE_CASCADE = 2
def load_clip(ckpt_paths, embedding_directory=None): def load_clip(ckpt_paths, embedding_directory=None, clip_type=CLIPType.STABLE_DIFFUSION):
clip_data = [] clip_data = []
for p in ckpt_paths: for p in ckpt_paths:
clip_data.append(comfy.utils.load_torch_file(p, safe_load=True)) clip_data.append(comfy.utils.load_torch_file(p, safe_load=True))
@@ -314,8 +367,12 @@ def load_clip(ckpt_paths, embedding_directory=None):
clip_target.params = {} clip_target.params = {}
if len(clip_data) == 1: if len(clip_data) == 1:
if "text_model.encoder.layers.30.mlp.fc1.weight" in clip_data[0]: if "text_model.encoder.layers.30.mlp.fc1.weight" in clip_data[0]:
clip_target.clip = sdxl_clip.SDXLRefinerClipModel if clip_type == CLIPType.STABLE_CASCADE:
clip_target.tokenizer = sdxl_clip.SDXLTokenizer clip_target.clip = sdxl_clip.StableCascadeClipModel
clip_target.tokenizer = sdxl_clip.StableCascadeTokenizer
else:
clip_target.clip = sdxl_clip.SDXLRefinerClipModel
clip_target.tokenizer = sdxl_clip.SDXLTokenizer
elif "text_model.encoder.layers.22.mlp.fc1.weight" in clip_data[0]: elif "text_model.encoder.layers.22.mlp.fc1.weight" in clip_data[0]:
clip_target.clip = sd2_clip.SD2ClipModel clip_target.clip = sd2_clip.SD2ClipModel
clip_target.tokenizer = sd2_clip.SD2Tokenizer clip_target.tokenizer = sd2_clip.SD2Tokenizer
@@ -438,15 +495,12 @@ def load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, o
clip_target = None clip_target = None
parameters = comfy.utils.calculate_parameters(sd, "model.diffusion_model.") parameters = comfy.utils.calculate_parameters(sd, "model.diffusion_model.")
unet_dtype = model_management.unet_dtype(model_params=parameters)
load_device = model_management.get_torch_device() load_device = model_management.get_torch_device()
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device)
class WeightsLoader(torch.nn.Module): model_config = model_detection.model_config_from_unet(sd, "model.diffusion_model.")
pass unet_dtype = model_management.unet_dtype(model_params=parameters, supported_dtypes=model_config.supported_inference_dtypes)
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device, model_config.supported_inference_dtypes)
model_config = model_detection.model_config_from_unet(sd, "model.diffusion_model.", unet_dtype) model_config.set_inference_dtype(unet_dtype, manual_cast_dtype)
model_config.set_manual_cast(manual_cast_dtype)
if model_config is None: if model_config is None:
raise RuntimeError("ERROR: Could not detect model type of: {}".format(ckpt_path)) raise RuntimeError("ERROR: Could not detect model type of: {}".format(ckpt_path))
@@ -467,13 +521,19 @@ def load_checkpoint_guess_config(ckpt_path, output_vae=True, output_clip=True, o
vae = VAE(sd=vae_sd) vae = VAE(sd=vae_sd)
if output_clip: if output_clip:
w = WeightsLoader()
clip_target = model_config.clip_target() clip_target = model_config.clip_target()
if clip_target is not None: if clip_target is not None:
clip = CLIP(clip_target, embedding_directory=embedding_directory) clip_sd = model_config.process_clip_state_dict(sd)
w.cond_stage_model = clip.cond_stage_model if len(clip_sd) > 0:
sd = model_config.process_clip_state_dict(sd) clip = CLIP(clip_target, embedding_directory=embedding_directory)
load_model_weights(w, sd) m, u = clip.load_sd(clip_sd, full_model=True)
if len(m) > 0:
print("clip missing:", m)
if len(u) > 0:
print("clip unexpected:", u)
else:
print("no CLIP/text encoder weights in checkpoint, the text encoder model will not be loaded.")
left_over = sd.keys() left_over = sd.keys()
if len(left_over) > 0: if len(left_over) > 0:
@@ -492,16 +552,15 @@ def load_unet_state_dict(sd): #load unet in diffusers format
parameters = comfy.utils.calculate_parameters(sd) parameters = comfy.utils.calculate_parameters(sd)
unet_dtype = model_management.unet_dtype(model_params=parameters) unet_dtype = model_management.unet_dtype(model_params=parameters)
load_device = model_management.get_torch_device() load_device = model_management.get_torch_device()
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device)
if "input_blocks.0.0.weight" in sd: #ldm if "input_blocks.0.0.weight" in sd or 'clf.1.weight' in sd: #ldm or stable cascade
model_config = model_detection.model_config_from_unet(sd, "", unet_dtype) model_config = model_detection.model_config_from_unet(sd, "")
if model_config is None: if model_config is None:
return None return None
new_sd = sd new_sd = sd
else: #diffusers else: #diffusers
model_config = model_detection.model_config_from_diffusers_unet(sd, unet_dtype) model_config = model_detection.model_config_from_diffusers_unet(sd)
if model_config is None: if model_config is None:
return None return None
@@ -513,8 +572,11 @@ def load_unet_state_dict(sd): #load unet in diffusers format
new_sd[diffusers_keys[k]] = sd.pop(k) new_sd[diffusers_keys[k]] = sd.pop(k)
else: else:
print(diffusers_keys[k], k) print(diffusers_keys[k], k)
offload_device = model_management.unet_offload_device() offload_device = model_management.unet_offload_device()
model_config.set_manual_cast(manual_cast_dtype) unet_dtype = model_management.unet_dtype(model_params=parameters, supported_dtypes=model_config.supported_inference_dtypes)
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device, model_config.supported_inference_dtypes)
model_config.set_inference_dtype(unet_dtype, manual_cast_dtype)
model = model_config.get_model(new_sd, "") model = model_config.get_model(new_sd, "")
model = model.to(offload_device) model = model.to(offload_device)
model.load_model_weights(new_sd, "") model.load_model_weights(new_sd, "")
+2 -2
View File
@@ -67,7 +67,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder):
] ]
def __init__(self, version="openai/clip-vit-large-patch14", device="cpu", max_length=77, def __init__(self, version="openai/clip-vit-large-patch14", device="cpu", max_length=77,
freeze=True, layer="last", layer_idx=None, textmodel_json_config=None, dtype=None, model_class=comfy.clip_model.CLIPTextModel, freeze=True, layer="last", layer_idx=None, textmodel_json_config=None, dtype=None, model_class=comfy.clip_model.CLIPTextModel,
special_tokens={"start": 49406, "end": 49407, "pad": 49407}, layer_norm_hidden_state=True): # clip-vit-base-patch32 special_tokens={"start": 49406, "end": 49407, "pad": 49407}, layer_norm_hidden_state=True, enable_attention_masks=False): # clip-vit-base-patch32
super().__init__() super().__init__()
assert layer in self.LAYERS assert layer in self.LAYERS
@@ -88,7 +88,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder):
self.special_tokens = special_tokens self.special_tokens = special_tokens
self.text_projection = torch.nn.Parameter(torch.eye(self.transformer.get_input_embeddings().weight.shape[1])) self.text_projection = torch.nn.Parameter(torch.eye(self.transformer.get_input_embeddings().weight.shape[1]))
self.logit_scale = torch.nn.Parameter(torch.tensor(4.6055)) self.logit_scale = torch.nn.Parameter(torch.tensor(4.6055))
self.enable_attention_masks = False self.enable_attention_masks = enable_attention_masks
self.layer_norm_hidden_state = layer_norm_hidden_state self.layer_norm_hidden_state = layer_norm_hidden_state
if layer == "hidden": if layer == "hidden":
@@ -64,3 +64,25 @@ class SDXLClipModel(torch.nn.Module):
class SDXLRefinerClipModel(sd1_clip.SD1ClipModel): class SDXLRefinerClipModel(sd1_clip.SD1ClipModel):
def __init__(self, device="cpu", dtype=None): def __init__(self, device="cpu", dtype=None):
super().__init__(device=device, dtype=dtype, clip_name="g", clip_model=SDXLClipG) super().__init__(device=device, dtype=dtype, clip_name="g", clip_model=SDXLClipG)
class StableCascadeClipGTokenizer(sd1_clip.SDTokenizer):
def __init__(self, tokenizer_path=None, embedding_directory=None):
super().__init__(tokenizer_path, pad_with_end=True, embedding_directory=embedding_directory, embedding_size=1280, embedding_key='clip_g')
class StableCascadeTokenizer(sd1_clip.SD1Tokenizer):
def __init__(self, embedding_directory=None):
super().__init__(embedding_directory=embedding_directory, clip_name="g", tokenizer=StableCascadeClipGTokenizer)
class StableCascadeClipG(sd1_clip.SDClipModel):
def __init__(self, device="cpu", max_length=77, freeze=True, layer="hidden", layer_idx=-1, dtype=None):
textmodel_json_config = os.path.join(os.path.dirname(os.path.realpath(__file__)), "clip_config_bigg.json")
super().__init__(device=device, freeze=freeze, layer=layer, layer_idx=layer_idx, textmodel_json_config=textmodel_json_config, dtype=dtype,
special_tokens={"start": 49406, "end": 49407, "pad": 49407}, layer_norm_hidden_state=False, enable_attention_masks=True)
def load_sd(self, sd):
return super().load_sd(sd)
class StableCascadeClipModel(sd1_clip.SD1ClipModel):
def __init__(self, device="cpu", dtype=None):
super().__init__(device=device, dtype=dtype, clip_name="g", clip_model=StableCascadeClipG)
@@ -40,8 +40,8 @@ class SD15(supported_models_base.BASE):
state_dict['cond_stage_model.transformer.text_model.embeddings.position_ids'] = ids.round() state_dict['cond_stage_model.transformer.text_model.embeddings.position_ids'] = ids.round()
replace_prefix = {} replace_prefix = {}
replace_prefix["cond_stage_model."] = "cond_stage_model.clip_l." replace_prefix["cond_stage_model."] = "clip_l."
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix) state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
return state_dict return state_dict
def process_clip_state_dict_for_saving(self, state_dict): def process_clip_state_dict_for_saving(self, state_dict):
@@ -72,10 +72,10 @@ class SD20(supported_models_base.BASE):
def process_clip_state_dict(self, state_dict): def process_clip_state_dict(self, state_dict):
replace_prefix = {} replace_prefix = {}
replace_prefix["conditioner.embedders.0.model."] = "cond_stage_model.model." #SD2 in sgm format replace_prefix["conditioner.embedders.0.model."] = "clip_h." #SD2 in sgm format
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix) replace_prefix["cond_stage_model.model."] = "clip_h."
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
state_dict = utils.transformers_convert(state_dict, "cond_stage_model.model.", "cond_stage_model.clip_h.transformer.text_model.", 24) state_dict = utils.transformers_convert(state_dict, "clip_h.", "clip_h.transformer.text_model.", 24)
return state_dict return state_dict
def process_clip_state_dict_for_saving(self, state_dict): def process_clip_state_dict_for_saving(self, state_dict):
@@ -131,11 +131,10 @@ class SDXLRefiner(supported_models_base.BASE):
def process_clip_state_dict(self, state_dict): def process_clip_state_dict(self, state_dict):
keys_to_replace = {} keys_to_replace = {}
replace_prefix = {} replace_prefix = {}
replace_prefix["conditioner.embedders.0.model."] = "clip_g."
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
state_dict = utils.transformers_convert(state_dict, "conditioner.embedders.0.model.", "cond_stage_model.clip_g.transformer.text_model.", 32) state_dict = utils.transformers_convert(state_dict, "clip_g.", "clip_g.transformer.text_model.", 32)
keys_to_replace["conditioner.embedders.0.model.text_projection"] = "cond_stage_model.clip_g.text_projection"
keys_to_replace["conditioner.embedders.0.model.logit_scale"] = "cond_stage_model.clip_g.logit_scale"
state_dict = utils.state_dict_key_replace(state_dict, keys_to_replace) state_dict = utils.state_dict_key_replace(state_dict, keys_to_replace)
return state_dict return state_dict
@@ -179,13 +178,13 @@ class SDXL(supported_models_base.BASE):
keys_to_replace = {} keys_to_replace = {}
replace_prefix = {} replace_prefix = {}
replace_prefix["conditioner.embedders.0.transformer.text_model"] = "cond_stage_model.clip_l.transformer.text_model" replace_prefix["conditioner.embedders.0.transformer.text_model"] = "clip_l.transformer.text_model"
state_dict = utils.transformers_convert(state_dict, "conditioner.embedders.1.model.", "cond_stage_model.clip_g.transformer.text_model.", 32) replace_prefix["conditioner.embedders.1.model."] = "clip_g."
keys_to_replace["conditioner.embedders.1.model.text_projection"] = "cond_stage_model.clip_g.text_projection" state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
keys_to_replace["conditioner.embedders.1.model.text_projection.weight"] = "cond_stage_model.clip_g.text_projection"
keys_to_replace["conditioner.embedders.1.model.logit_scale"] = "cond_stage_model.clip_g.logit_scale" state_dict = utils.transformers_convert(state_dict, "clip_g.", "clip_g.transformer.text_model.", 32)
keys_to_replace["clip_g.text_projection.weight"] = "clip_g.text_projection"
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix)
state_dict = utils.state_dict_key_replace(state_dict, keys_to_replace) state_dict = utils.state_dict_key_replace(state_dict, keys_to_replace)
return state_dict return state_dict
@@ -306,5 +305,66 @@ class SD_X4Upscaler(SD20):
out = model_base.SD_X4Upscaler(self, device=device) out = model_base.SD_X4Upscaler(self, device=device)
return out return out
models = [Stable_Zero123, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXLRefiner, SDXL, SSD1B, Segmind_Vega, SD_X4Upscaler] class Stable_Cascade_C(supported_models_base.BASE):
unet_config = {
"stable_cascade_stage": 'c',
}
unet_extra_config = {}
latent_format = latent_formats.SC_Prior
supported_inference_dtypes = [torch.bfloat16, torch.float32]
sampling_settings = {
"shift": 2.0,
}
vae_key_prefix = ["vae."]
text_encoder_key_prefix = ["text_encoder."]
clip_vision_prefix = "clip_l_vision."
def process_unet_state_dict(self, state_dict):
key_list = list(state_dict.keys())
for y in ["weight", "bias"]:
suffix = "in_proj_{}".format(y)
keys = filter(lambda a: a.endswith(suffix), key_list)
for k_from in keys:
weights = state_dict.pop(k_from)
prefix = k_from[:-(len(suffix) + 1)]
shape_from = weights.shape[0] // 3
for x in range(3):
p = ["to_q", "to_k", "to_v"]
k_to = "{}.{}.{}".format(prefix, p[x], y)
state_dict[k_to] = weights[shape_from*x:shape_from*(x + 1)]
return state_dict
def get_model(self, state_dict, prefix="", device=None):
out = model_base.StableCascade_C(self, device=device)
return out
def clip_target(self):
return supported_models_base.ClipTarget(sdxl_clip.StableCascadeTokenizer, sdxl_clip.StableCascadeClipModel)
class Stable_Cascade_B(Stable_Cascade_C):
unet_config = {
"stable_cascade_stage": 'b',
}
unet_extra_config = {}
latent_format = latent_formats.SC_B
supported_inference_dtypes = [torch.float16, torch.bfloat16, torch.float32]
sampling_settings = {
"shift": 1.0,
}
clip_vision_prefix = None
def get_model(self, state_dict, prefix="", device=None):
out = model_base.StableCascade_B(self, device=device)
return out
models = [Stable_Zero123, SD15, SD20, SD21UnclipL, SD21UnclipH, SDXLRefiner, SDXL, SSD1B, Segmind_Vega, SD_X4Upscaler, Stable_Cascade_C, Stable_Cascade_B]
models += [SVD_img2vid] models += [SVD_img2vid]
@@ -22,13 +22,15 @@ class BASE:
sampling_settings = {} sampling_settings = {}
latent_format = latent_formats.LatentFormat latent_format = latent_formats.LatentFormat
vae_key_prefix = ["first_stage_model."] vae_key_prefix = ["first_stage_model."]
text_encoder_key_prefix = ["cond_stage_model."]
supported_inference_dtypes = [torch.float16, torch.bfloat16, torch.float32]
manual_cast_dtype = None manual_cast_dtype = None
@classmethod @classmethod
def matches(s, unet_config): def matches(s, unet_config):
for k in s.unet_config: for k in s.unet_config:
if s.unet_config[k] != unet_config[k]: if k not in unet_config or s.unet_config[k] != unet_config[k]:
return False return False
return True return True
@@ -54,6 +56,7 @@ class BASE:
return out return out
def process_clip_state_dict(self, state_dict): def process_clip_state_dict(self, state_dict):
state_dict = utils.state_dict_prefix_replace(state_dict, {k: "" for k in self.text_encoder_key_prefix}, filter_keys=True)
return state_dict return state_dict
def process_unet_state_dict(self, state_dict): def process_unet_state_dict(self, state_dict):
@@ -63,7 +66,7 @@ class BASE:
return state_dict return state_dict
def process_clip_state_dict_for_saving(self, state_dict): def process_clip_state_dict_for_saving(self, state_dict):
replace_prefix = {"": "cond_stage_model."} replace_prefix = {"": self.text_encoder_key_prefix[0]}
return utils.state_dict_prefix_replace(state_dict, replace_prefix) return utils.state_dict_prefix_replace(state_dict, replace_prefix)
def process_clip_vision_state_dict_for_saving(self, state_dict): def process_clip_vision_state_dict_for_saving(self, state_dict):
@@ -77,8 +80,9 @@ class BASE:
return utils.state_dict_prefix_replace(state_dict, replace_prefix) return utils.state_dict_prefix_replace(state_dict, replace_prefix)
def process_vae_state_dict_for_saving(self, state_dict): def process_vae_state_dict_for_saving(self, state_dict):
replace_prefix = {"": "first_stage_model."} replace_prefix = {"": self.vae_key_prefix[0]}
return utils.state_dict_prefix_replace(state_dict, replace_prefix) return utils.state_dict_prefix_replace(state_dict, replace_prefix)
def set_manual_cast(self, manual_cast_dtype): def set_inference_dtype(self, dtype, manual_cast_dtype):
self.unet_config['dtype'] = dtype
self.manual_cast_dtype = manual_cast_dtype self.manual_cast_dtype = manual_cast_dtype
+4
View File
@@ -169,6 +169,8 @@ UNET_MAP_BASIC = {
} }
def unet_to_diffusers(unet_config): def unet_to_diffusers(unet_config):
if "num_res_blocks" not in unet_config:
return {}
num_res_blocks = unet_config["num_res_blocks"] num_res_blocks = unet_config["num_res_blocks"]
channel_mult = unet_config["channel_mult"] channel_mult = unet_config["channel_mult"]
transformer_depth = unet_config["transformer_depth"][:] transformer_depth = unet_config["transformer_depth"][:]
@@ -413,6 +415,8 @@ def tiled_scale(samples, function, tile_x=64, tile_y=64, overlap = 8, upscale_am
out_div = torch.zeros((s.shape[0], out_channels, round(s.shape[2] * upscale_amount), round(s.shape[3] * upscale_amount)), device=output_device) out_div = torch.zeros((s.shape[0], out_channels, round(s.shape[2] * upscale_amount), round(s.shape[3] * upscale_amount)), device=output_device)
for y in range(0, s.shape[2], tile_y - overlap): for y in range(0, s.shape[2], tile_y - overlap):
for x in range(0, s.shape[3], tile_x - overlap): for x in range(0, s.shape[3], tile_x - overlap):
x = max(0, min(s.shape[-1] - overlap, x))
y = max(0, min(s.shape[-2] - overlap, y))
s_in = s[:,:,y:y+tile_y,x:x+tile_x] s_in = s[:,:,y:y+tile_y,x:x+tile_x]
ps = function(s_in).to(output_device) ps = function(s_in).to(output_device)
@@ -0,0 +1,25 @@
class CLIPTextEncodeControlnet:
@classmethod
def INPUT_TYPES(s):
return {"required": {"clip": ("CLIP", ), "conditioning": ("CONDITIONING", ), "text": ("STRING", {"multiline": True})}}
RETURN_TYPES = ("CONDITIONING",)
FUNCTION = "encode"
CATEGORY = "_for_testing/conditioning"
def encode(self, clip, conditioning, text):
tokens = clip.tokenize(text)
cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True)
c = []
for t in conditioning:
n = [t[0], t[1].copy()]
n[1]['cross_attn_controlnet'] = cond
n[1]['pooled_output_controlnet'] = pooled
c.append(n)
return (c, )
NODE_CLASS_MAPPINGS = {
"CLIPTextEncodeControlnet": CLIPTextEncodeControlnet
}
@@ -48,6 +48,25 @@ class RepeatImageBatch:
s = image.repeat((amount, 1,1,1)) s = image.repeat((amount, 1,1,1))
return (s,) return (s,)
class ImageFromBatch:
@classmethod
def INPUT_TYPES(s):
return {"required": { "image": ("IMAGE",),
"batch_index": ("INT", {"default": 0, "min": 0, "max": 63}),
"length": ("INT", {"default": 1, "min": 1, "max": 64}),
}}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "frombatch"
CATEGORY = "image/batch"
def frombatch(self, image, batch_index, length):
s_in = image
batch_index = min(s_in.shape[0] - 1, batch_index)
length = min(s_in.shape[0] - batch_index, length)
s = s_in[batch_index:batch_index + length].clone()
return (s,)
class SaveAnimatedWEBP: class SaveAnimatedWEBP:
def __init__(self): def __init__(self):
self.output_dir = folder_paths.get_output_directory() self.output_dir = folder_paths.get_output_directory()
@@ -170,6 +189,7 @@ class SaveAnimatedPNG:
NODE_CLASS_MAPPINGS = { NODE_CLASS_MAPPINGS = {
"ImageCrop": ImageCrop, "ImageCrop": ImageCrop,
"RepeatImageBatch": RepeatImageBatch, "RepeatImageBatch": RepeatImageBatch,
"ImageFromBatch": ImageFromBatch,
"SaveAnimatedWEBP": SaveAnimatedWEBP, "SaveAnimatedWEBP": SaveAnimatedWEBP,
"SaveAnimatedPNG": SaveAnimatedPNG, "SaveAnimatedPNG": SaveAnimatedPNG,
} }
@@ -126,7 +126,7 @@ class LatentBatchSeedBehavior:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { "samples": ("LATENT",), return {"required": { "samples": ("LATENT",),
"seed_behavior": (["random", "fixed"],),}} "seed_behavior": (["random", "fixed"],{"default": "fixed"}),}}
RETURN_TYPES = ("LATENT",) RETURN_TYPES = ("LATENT",)
FUNCTION = "op" FUNCTION = "op"
@@ -99,6 +99,32 @@ class ModelSamplingDiscrete:
m.add_object_patch("model_sampling", model_sampling) m.add_object_patch("model_sampling", model_sampling)
return (m, ) return (m, )
class ModelSamplingStableCascade:
@classmethod
def INPUT_TYPES(s):
return {"required": { "model": ("MODEL",),
"shift": ("FLOAT", {"default": 2.0, "min": 0.0, "max": 100.0, "step":0.01}),
}}
RETURN_TYPES = ("MODEL",)
FUNCTION = "patch"
CATEGORY = "advanced/model"
def patch(self, model, shift):
m = model.clone()
sampling_base = comfy.model_sampling.StableCascadeSampling
sampling_type = comfy.model_sampling.EPS
class ModelSamplingAdvanced(sampling_base, sampling_type):
pass
model_sampling = ModelSamplingAdvanced(model.model.model_config)
model_sampling.set_parameters(shift)
m.add_object_patch("model_sampling", model_sampling)
return (m, )
class ModelSamplingContinuousEDM: class ModelSamplingContinuousEDM:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
@@ -171,5 +197,6 @@ class RescaleCFG:
NODE_CLASS_MAPPINGS = { NODE_CLASS_MAPPINGS = {
"ModelSamplingDiscrete": ModelSamplingDiscrete, "ModelSamplingDiscrete": ModelSamplingDiscrete,
"ModelSamplingContinuousEDM": ModelSamplingContinuousEDM, "ModelSamplingContinuousEDM": ModelSamplingContinuousEDM,
"ModelSamplingStableCascade": ModelSamplingStableCascade,
"RescaleCFG": RescaleCFG, "RescaleCFG": RescaleCFG,
} }
@@ -0,0 +1,109 @@
"""
This file is part of ComfyUI.
Copyright (C) 2024 Stability AI
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import torch
import nodes
import comfy.utils
class StableCascade_EmptyLatentImage:
def __init__(self, device="cpu"):
self.device = device
@classmethod
def INPUT_TYPES(s):
return {"required": {
"width": ("INT", {"default": 1024, "min": 256, "max": nodes.MAX_RESOLUTION, "step": 8}),
"height": ("INT", {"default": 1024, "min": 256, "max": nodes.MAX_RESOLUTION, "step": 8}),
"compression": ("INT", {"default": 42, "min": 4, "max": 128, "step": 1}),
"batch_size": ("INT", {"default": 1, "min": 1, "max": 4096})
}}
RETURN_TYPES = ("LATENT", "LATENT")
RETURN_NAMES = ("stage_c", "stage_b")
FUNCTION = "generate"
CATEGORY = "_for_testing/stable_cascade"
def generate(self, width, height, compression, batch_size=1):
c_latent = torch.zeros([batch_size, 16, height // compression, width // compression])
b_latent = torch.zeros([batch_size, 4, height // 4, width // 4])
return ({
"samples": c_latent,
}, {
"samples": b_latent,
})
class StableCascade_StageC_VAEEncode:
def __init__(self, device="cpu"):
self.device = device
@classmethod
def INPUT_TYPES(s):
return {"required": {
"image": ("IMAGE",),
"vae": ("VAE", ),
"compression": ("INT", {"default": 42, "min": 4, "max": 128, "step": 1}),
}}
RETURN_TYPES = ("LATENT", "LATENT")
RETURN_NAMES = ("stage_c", "stage_b")
FUNCTION = "generate"
CATEGORY = "_for_testing/stable_cascade"
def generate(self, image, vae, compression):
width = image.shape[-2]
height = image.shape[-3]
out_width = (width // compression) * vae.downscale_ratio
out_height = (height // compression) * vae.downscale_ratio
s = comfy.utils.common_upscale(image.movedim(-1,1), out_width, out_height, "bicubic", "center").movedim(1,-1)
c_latent = vae.encode(s[:,:,:,:3])
b_latent = torch.zeros([c_latent.shape[0], 4, height // 4, width // 4])
return ({
"samples": c_latent,
}, {
"samples": b_latent,
})
class StableCascade_StageB_Conditioning:
@classmethod
def INPUT_TYPES(s):
return {"required": { "conditioning": ("CONDITIONING",),
"stage_c": ("LATENT",),
}}
RETURN_TYPES = ("CONDITIONING",)
FUNCTION = "set_prior"
CATEGORY = "_for_testing/stable_cascade"
def set_prior(self, conditioning, stage_c):
c = []
for t in conditioning:
d = t[1].copy()
d['stable_cascade_prior'] = stage_c['samples']
n = [t[0], d]
c.append(n)
return (c, )
NODE_CLASS_MAPPINGS = {
"StableCascade_EmptyLatentImage": StableCascade_EmptyLatentImage,
"StableCascade_StageB_Conditioning": StableCascade_StageB_Conditioning,
"StableCascade_StageC_VAEEncode": StableCascade_StageC_VAEEncode,
}
+244 -252
View File
@@ -1,257 +1,249 @@
** ComfyUI startup time: 2024-02-03 21:05:40.485965 ** ComfyUI startup time: 2024-02-20 07:57:36.757969
[2024-02-03 21:05] ** Platform: Linux [2024-02-20 07:57] ** Platform: Linux
[2024-02-03 21:05] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] [2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
[2024-02-03 21:05] ** Python executable: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3 [2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
[2024-02-03 21:05] ** Log path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log [2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
[2024-02-03 21:05] [2024-02-20 07:57]
Prestartup times for custom nodes: Prestartup times for custom nodes:
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy [2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager [2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:05] [2024-02-20 07:57]
[2024-02-03 21:05] ****** User settings have been changed to be stored on the server instead of browser storage. ****** [2024-02-20 07:57] ****** User settings have been changed to be stored on the server instead of browser storage. ******
[2024-02-03 21:05] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ****** [2024-02-20 07:57] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******
[2024-02-03 21:05] Efficiency Nodes: Attempting to add Control Net options to the 'HiRes-Fix Script' Node (comfyui_controlnet_aux add-on)...Success! [2024-02-20 07:57] Efficiency Nodes: Attempting to add Control Net options to the 'HiRes-Fix Script' Node (comfyui_controlnet_aux add-on)...Success!
[2024-02-03 21:05] Efficiency Nodes Warning: Failed to import python package 'simpleeval'; related nodes disabled. [2024-02-20 07:57] Efficiency Nodes Warning: Failed to import python package 'simpleeval'; related nodes disabled.
[2024-02-03 21:05] [2024-02-20 07:57]
[2024-02-03 21:05] ### Loading: ComfyUI-Impact-Pack (V4.73.3) [2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (V4.78)
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20] [2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Check dependencies [2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check dependencies
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating subpack [2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating subpack
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', 'GitPython'] in 'None' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', 'GitPython'] in 'None'
[2024-02-03 21:05] Collecting GitPython [2024-02-20 07:57] Collecting GitPython
[2024-02-03 21:05] Using cached GitPython-3.1.41-py3-none-any.whl (196 kB) [2024-02-20 07:57] Using cached GitPython-3.1.42-py3-none-any.whl (195 kB)
[2024-02-03 21:05] Collecting gitdb<5,>=4.0.1 [2024-02-20 07:57] Collecting gitdb<5,>=4.0.1
[2024-02-03 21:05] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB) [2024-02-20 07:57] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB)
[2024-02-03 21:05] Collecting smmap<6,>=3.0.1 [2024-02-20 07:57] Collecting smmap<6,>=3.0.1
[2024-02-03 21:05] Using cached smmap-5.0.1-py3-none-any.whl (24 kB) [2024-02-20 07:57] Using cached smmap-5.0.1-py3-none-any.whl (24 kB)
[2024-02-03 21:05] Installing collected packages: smmap, gitdb, GitPython [2024-02-20 07:57] Installing collected packages: smmap, gitdb, GitPython
[2024-02-03 21:05] Successfully installed GitPython-3.1.41 gitdb-4.0.11 smmap-5.0.1 [2024-02-20 07:57] Successfully installed GitPython-3.1.42 gitdb-4.0.11 smmap-5.0.1
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', 'install.py'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', 'install.py'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/e3893a92c5c1907136b6cc75404094db767c1e0cfefe1b43e87dad72af2e4c9f?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27face_yolov8m.pt%3B+filename%3D%22face_yolov8m.pt%22%3B&Expires=1707271547&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI3MTU0N319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlL2UzODkzYTkyYzVjMTkwNzEzNmI2Y2M3NTQwNDA5NGRiNzY3YzFlMGNmZWZlMWI0M2U4N2RhZDcyYWYyZTRjOWY%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=gO2u6BHHN041QdWEenk3PJJ%7EhG3Tu7VRc1dirPXQpC8MBc4Ifs3Qb3Og0wDiJlsO14jRkodYAfxYQfZUfTnvbHLwVf9amr1BeVUDXdveTgReZG5do79je4MdE-OkcFscsctQFxjMWiPPFc96MWYDPsBloV8xos6YNYXTdPPB2efa19nFNFP56hwbjSbenkEE3Detf7j0m4ta%7ExwlvMDiUQArg8bJm27FQu-Kkj7JXg01Y9jR1exiBm7P9FXT4zLA0M2kIbB87CDsjN0Rc9c3cSMyg0GhqGu%7Enh404cPbY5Cp1HbDvEUoodC2rDQhqTbiUu-D1BIH4TKG7ICYjrV-Jw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/face_yolov8m.pt [2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/e3893a92c5c1907136b6cc75404094db767c1e0cfefe1b43e87dad72af2e4c9f?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27face_yolov8m.pt%3B+filename%3D%22face_yolov8m.pt%22%3B&Expires=1708700672&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMDY3Mn19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlL2UzODkzYTkyYzVjMTkwNzEzNmI2Y2M3NTQwNDA5NGRiNzY3YzFlMGNmZWZlMWI0M2U4N2RhZDcyYWYyZTRjOWY%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=YqPhukw4gdolcqysRQfZPHDbxzji5-x5N1afxX14%7E2Djh%7EUQVRNqFfDFdRJ1nKdleqCAKaafGcQUQbvFHtRq4C--en9fYAComs8mKWrcBan1vUgMFg8QTWWig5x0nBiJe1A8eCoQ7D7qyR8sx7SukcQf62xhEe0H3GVA94aAWIy0AW29WhaUeAM7MQw0DjCbaOCejOQn8neMrqUjjlsux1AwSlw%7EBJU2kk3ZBekzonX2zag7GQoht0lwopD-y0XQ7WH%7ELPaD1VOWphpdq59ZZhIs515Nz7HyVckx6YtvOzJnsaCVMBDPls9sUHhBMd5i54E8RudbHu9uBpZWWe3haQ__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/face_yolov8m.pt
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 51996128/51996128 [00:00<00:00, 82768130.39it/s] [2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 51996128/51996128 [00:00<00:00, 95807035.85it/s]
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/30878cea9870964d4a238339e9dcff002078bbbaa1a058b07e11c167f67eca1c?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27hand_yolov8s.pt%3B+filename%3D%22hand_yolov8s.pt%22%3B&Expires=1707267882&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI2Nzg4Mn19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzMwODc4Y2VhOTg3MDk2NGQ0YTIzODMzOWU5ZGNmZjAwMjA3OGJiYmFhMWEwNThiMDdlMTFjMTY3ZjY3ZWNhMWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=rSo6jzXkXXBX0UqUzGSLHwPnR-utKCLRx%7EZqDCu7P01C%7EXkHoOz6urAqNu4S1MR5dbozl4UA1S%7EikO95CdhqCEgUbavkbRIoemWUALHcqAMEDS4S52NRNvAriED2WcL0JcUHCxa3VYo8xBgYYFdyP7cj8H0LGDzJqNk9HH2wh2hkY0jwsilpD1XL2b5iawwTLuop6mqdsnwpxYfY1JHCUhSEJh3oDG-LgQiwqOY90sTdDlVkImP8Pr4jQy0KU29B%7EZcGuOrFPkFQm8ajy8ZfggEK2BJOYvWT501M125DVWmsw8xbXilLRAnvXTP276QFKHbMie5piQ0inwmcE-mRhw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/hand_yolov8s.pt [2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/30878cea9870964d4a238339e9dcff002078bbbaa1a058b07e11c167f67eca1c?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27hand_yolov8s.pt%3B+filename%3D%22hand_yolov8s.pt%22%3B&Expires=1708703860&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMzg2MH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzMwODc4Y2VhOTg3MDk2NGQ0YTIzODMzOWU5ZGNmZjAwMjA3OGJiYmFhMWEwNThiMDdlMTFjMTY3ZjY3ZWNhMWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=WVG1I3otJ5Ly6l60OQafoATYQdskZxwTNQBmHrHmNyFRx7SPqOUKViTgQyweq03mxnLh1H0aKl0WDXr%7EJ0yy18OsSYN09GZD77uNDGqAaPO8m20KwJySinKRfbbFZmYo1dwEKmG1-mYXqUxOBhdPRo9pKXkguPzGy1APjpSlDz4zqBlsginzyzrYIpbeZ3an1d4JtihzITVzOyRGOPL1kE6H87gK9faOv1cjWIj2QJL9Fx2YepNDdCtVeHapnEH9v7HvYrcz268nVtRXBUmP9P3JdClKBIR-lq9CHic02INNEJQHG7-hXGD-RZl3A%7EB4hdNP8Nf%7EtRmpL8yu6pgEww__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/hand_yolov8s.pt
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 22484536/22484536 [00:00<00:00, 76459125.60it/s] [2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 22484536/22484536 [00:00<00:00, 80692120.55it/s]
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/1fd7e562f240a5debd48bf737753de6fb60c63f8664121bb522f090a885d8254?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27person_yolov8m-seg.pt%3B+filename%3D%22person_yolov8m-seg.pt%22%3B&Expires=1707268213&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI2ODIxM319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzFmZDdlNTYyZjI0MGE1ZGViZDQ4YmY3Mzc3NTNkZTZmYjYwYzYzZjg2NjQxMjFiYjUyMmYwOTBhODg1ZDgyNTQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=furDvMunH-c4MWMYZA7AZeKyBE4gscdQeKgna6MFJmx4Lb5-TBs0LcIbMSEgTexlaK%7EUxNsFOeseZLI9rfnnVVYGS7MgyGNlucus60DQOIzR4x%7EtGChq-WtSiTmFX5p1gkc51ativvYWp2K-qyXO0Kminc6YHq1OpYFfWHguJ-V83LbQe61J1VPaUW%7ES2hZEV927r-tK81rSLRzQOB5NFTibMDrqXsV6yTyEaerjczsXsrAoPVr5ibHMhtAfV5gcIeIO5Nuc4nSXQgw75H4Xnf%7E5f6Uzi-wtiKKgHaDVdazTMqkdyWSggr-cxSnFag%7ETZW-nol6kTmbJ17uh084uGg__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/segm/person_yolov8m-seg.pt [2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/1fd7e562f240a5debd48bf737753de6fb60c63f8664121bb522f090a885d8254?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27person_yolov8m-seg.pt%3B+filename%3D%22person_yolov8m-seg.pt%22%3B&Expires=1708702215&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMjIxNX19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzFmZDdlNTYyZjI0MGE1ZGViZDQ4YmY3Mzc3NTNkZTZmYjYwYzYzZjg2NjQxMjFiYjUyMmYwOTBhODg1ZDgyNTQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=HOG-dw%7EPHSKUMmad-wwtHqqY7PnOinwIKJUv7IM-Ui5GXq7NFg-spyPkbJXwqkB5LVWxC5l-aWQDBzxVpQisLiu47YPo%7EUPAJ86DU%7EDdvHN7DEOBJoUqwjWYlfudwfNvLyE7DfEGM3xKh7gctMnD2DengytQ4rZrk4vWzrh9fXYamwLMFPr8QfdgwFdinUqZUt0WAkzZUVOeR8Vm42KTL40LKor9JZzQuzlNy5ul0jal1SudRYH3vank8ld1KMa0wsKVs2WUiMaEldAIXtMSqsCNNiKiu0v2ibamMmv4-Xy5FNetmkYH3s5IjBpdyRO127EuCz0EZttV4Lloe7SCvw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/segm/person_yolov8m-seg.pt
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 54791722/54791722 [00:00<00:00, 90788474.85it/s] [2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 54791722/54791722 [00:00<00:00, 96343854.43it/s]
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt [2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
[2024-02-03 21:05] Collecting ultralytics!=8.0.177 [2024-02-20 07:57] Collecting ultralytics!=8.0.177
[2024-02-03 21:05] Using cached ultralytics-8.1.9-py3-none-any.whl (709 kB) [2024-02-20 07:57] Using cached ultralytics-8.1.16-py3-none-any.whl (715 kB)
[2024-02-03 21:05] Requirement already satisfied: numpy>=1.22.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.3) [2024-02-20 07:57] Requirement already satisfied: psutil in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
[2024-02-03 21:05] Collecting seaborn>=0.11.0 [2024-02-20 07:57] Requirement already satisfied: opencv-python>=4.6.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
[2024-02-03 21:05] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB) [2024-02-20 07:57] Requirement already satisfied: torchvision>=0.9.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
[2024-02-03 21:05] Requirement already satisfied: opencv-python>=4.6.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80) [2024-02-20 07:57] Requirement already satisfied: pillow>=7.1.2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
[2024-02-03 21:05] Requirement already satisfied: matplotlib>=3.3.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.2) [2024-02-20 07:57] Collecting seaborn>=0.11.0
[2024-02-03 21:05] Requirement already satisfied: psutil in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8) [2024-02-20 07:57] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
[2024-02-03 21:05] Collecting pandas>=1.1.4 [2024-02-20 07:57] Requirement already satisfied: torch>=1.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Using cached pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.0 MB) [2024-02-20 07:57] Collecting py-cpuinfo
[2024-02-03 21:05] Requirement already satisfied: pillow>=7.1.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0) [2024-02-20 07:57] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
[2024-02-03 21:05] Requirement already satisfied: scipy>=1.4.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0) [2024-02-20 07:57] Requirement already satisfied: scipy>=1.4.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
[2024-02-03 21:05] Requirement already satisfied: torch>=1.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Collecting thop>=0.1.1
[2024-02-03 21:05] Requirement already satisfied: tqdm>=4.64.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.1) [2024-02-20 07:57] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
[2024-02-03 21:05] Requirement already satisfied: requests>=2.23.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0) [2024-02-20 07:57] Requirement already satisfied: tqdm>=4.64.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.2)
[2024-02-03 21:05] Collecting py-cpuinfo [2024-02-20 07:57] Requirement already satisfied: matplotlib>=3.3.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.3)
[2024-02-03 21:05] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB) [2024-02-20 07:57] Collecting pandas>=1.1.4
[2024-02-03 21:05] Collecting thop>=0.1.1 [2024-02-20 07:57] Using cached pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.0 MB)
[2024-02-03 21:05] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB) [2024-02-20 07:57] Requirement already satisfied: requests>=2.23.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
[2024-02-03 21:05] Requirement already satisfied: pyyaml>=5.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1) [2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
[2024-02-03 21:05] Requirement already satisfied: torchvision>=0.9.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0) [2024-02-20 07:57] Requirement already satisfied: kiwisolver>=1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
[2024-02-03 21:05] Requirement already satisfied: kiwisolver>=1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5) [2024-02-20 07:57] Requirement already satisfied: cycler>=0.10 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
[2024-02-03 21:05] Requirement already satisfied: contourpy>=1.0.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0) [2024-02-20 07:57] Requirement already satisfied: pyparsing>=2.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
[2024-02-03 21:05] Requirement already satisfied: python-dateutil>=2.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2) [2024-02-20 07:57] Requirement already satisfied: fonttools>=4.22.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.49.0)
[2024-02-03 21:05] Requirement already satisfied: cycler>=0.10 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1) [2024-02-20 07:57] Requirement already satisfied: packaging>=20.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
[2024-02-03 21:05] Requirement already satisfied: pyparsing>=2.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1) [2024-02-20 07:57] Requirement already satisfied: contourpy>=1.0.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
[2024-02-03 21:05] Requirement already satisfied: fonttools>=4.22.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.47.2) [2024-02-20 07:57] Requirement already satisfied: numpy<2,>=1.21 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.4)
[2024-02-03 21:05] Requirement already satisfied: packaging>=20.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2) [2024-02-20 07:57] Requirement already satisfied: python-dateutil>=2.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
[2024-02-03 21:05] Collecting pytz>=2020.1 [2024-02-20 07:57] Collecting tzdata>=2022.7
[2024-02-03 21:05] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB) [2024-02-20 07:57] Using cached tzdata-2024.1-py2.py3-none-any.whl (345 kB)
[2024-02-03 21:05] Collecting tzdata>=2022.7 [2024-02-20 07:57] Collecting pytz>=2020.1
[2024-02-03 21:05] Using cached tzdata-2023.4-py2.py3-none-any.whl (346 kB) [2024-02-20 07:57] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
[2024-02-03 21:05] Requirement already satisfied: idna<4,>=2.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6) [2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.1)
[2024-02-03 21:05] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
[2024-02-03 21:05] Requirement already satisfied: certifi>=2017.4.17 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2) [2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
[2024-02-03 21:05] Requirement already satisfied: charset-normalizer<4,>=2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2) [2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
[2024-02-03 21:05] Requirement already satisfied: typing-extensions>=4.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0) [2024-02-20 07:57] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: sympy in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106) [2024-02-20 07:57] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26) [2024-02-20 07:57] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
[2024-02-03 21:05] Requirement already satisfied: networkx in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1) [2024-02-20 07:57] Requirement already satisfied: triton==2.2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Requirement already satisfied: triton==2.2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1) [2024-02-20 07:57] Requirement already satisfied: filelock in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54) [2024-02-20 07:57] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
[2024-02-03 21:05] Requirement already satisfied: filelock in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1) [2024-02-20 07:57] Requirement already satisfied: typing-extensions>=4.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3) [2024-02-20 07:57] Requirement already satisfied: networkx in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: fsspec in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.0)
[2024-02-03 21:05] Requirement already satisfied: jinja2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3) [2024-02-20 07:57] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
[2024-02-03 21:05] Requirement already satisfied: fsspec in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.12.2) [2024-02-20 07:57] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: sympy in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107) [2024-02-20 07:57] Requirement already satisfied: jinja2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106) [2024-02-20 07:57] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101) [2024-02-20 07:57] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
[2024-02-03 21:05] Requirement already satisfied: six>=1.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0) [2024-02-20 07:57] Requirement already satisfied: six>=1.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
[2024-02-03 21:05] Requirement already satisfied: MarkupSafe>=2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5) [2024-02-20 07:57] Requirement already satisfied: MarkupSafe>=2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
[2024-02-03 21:05] Requirement already satisfied: mpmath>=0.19 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0) [2024-02-20 07:57] Requirement already satisfied: mpmath>=0.19 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
[2024-02-03 21:05] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics [2024-02-20 07:57] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics
[2024-02-03 21:05] Successfully installed pandas-2.2.0 py-cpuinfo-9.0.0 pytz-2024.1 seaborn-0.13.2 thop-0.1.1.post2209072238 tzdata-2023.4 ultralytics-8.1.9 [2024-02-20 07:57] Successfully installed pandas-2.2.0 py-cpuinfo-9.0.0 pytz-2024.1 seaborn-0.13.2 thop-0.1.1.post2209072238 tzdata-2024.1 ultralytics-8.1.16
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt [2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
[2024-02-03 21:05] Requirement already satisfied: ultralytics!=8.0.177 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (8.1.9) [2024-02-20 07:57] Requirement already satisfied: ultralytics!=8.0.177 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (8.1.16)
[2024-02-03 21:05] Requirement already satisfied: matplotlib>=3.3.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.2) [2024-02-20 07:57] Requirement already satisfied: psutil in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
[2024-02-03 21:05] Requirement already satisfied: pyyaml>=5.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1) [2024-02-20 07:57] Requirement already satisfied: pillow>=7.1.2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
[2024-02-03 21:05] Requirement already satisfied: seaborn>=0.11.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.13.2) [2024-02-20 07:57] Requirement already satisfied: torchvision>=0.9.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
[2024-02-03 21:05] Requirement already satisfied: pillow>=7.1.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0) [2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
[2024-02-03 21:05] Requirement already satisfied: requests>=2.23.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0) [2024-02-20 07:57] Requirement already satisfied: py-cpuinfo in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (9.0.0)
[2024-02-03 21:05] Requirement already satisfied: py-cpuinfo in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (9.0.0) [2024-02-20 07:57] Requirement already satisfied: pandas>=1.1.4 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Requirement already satisfied: thop>=0.1.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.1.1.post2209072238) [2024-02-20 07:57] Requirement already satisfied: seaborn>=0.11.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.13.2)
[2024-02-03 21:05] Requirement already satisfied: torch>=1.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: matplotlib>=3.3.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.3)
[2024-02-03 21:05] Requirement already satisfied: scipy>=1.4.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0) [2024-02-20 07:57] Requirement already satisfied: scipy>=1.4.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
[2024-02-03 21:05] Requirement already satisfied: psutil in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8) [2024-02-20 07:57] Requirement already satisfied: opencv-python>=4.6.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
[2024-02-03 21:05] Requirement already satisfied: opencv-python>=4.6.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80) [2024-02-20 07:57] Requirement already satisfied: torch>=1.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Requirement already satisfied: numpy>=1.22.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.3) [2024-02-20 07:57] Requirement already satisfied: tqdm>=4.64.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.2)
[2024-02-03 21:05] Requirement already satisfied: tqdm>=4.64.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.1) [2024-02-20 07:57] Requirement already satisfied: requests>=2.23.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
[2024-02-03 21:05] Requirement already satisfied: pandas>=1.1.4 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: thop>=0.1.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.1.1.post2209072238)
[2024-02-03 21:05] Requirement already satisfied: torchvision>=0.9.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0) [2024-02-20 07:57] Requirement already satisfied: numpy<2,>=1.21 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.4)
[2024-02-03 21:05] Requirement already satisfied: contourpy>=1.0.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0) [2024-02-20 07:57] Requirement already satisfied: kiwisolver>=1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
[2024-02-03 21:05] Requirement already satisfied: packaging>=20.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2) [2024-02-20 07:57] Requirement already satisfied: python-dateutil>=2.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
[2024-02-03 21:05] Requirement already satisfied: kiwisolver>=1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5) [2024-02-20 07:57] Requirement already satisfied: fonttools>=4.22.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.49.0)
[2024-02-03 21:05] Requirement already satisfied: cycler>=0.10 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1) [2024-02-20 07:57] Requirement already satisfied: pyparsing>=2.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
[2024-02-03 21:05] Requirement already satisfied: python-dateutil>=2.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2) [2024-02-20 07:57] Requirement already satisfied: cycler>=0.10 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
[2024-02-03 21:05] Requirement already satisfied: fonttools>=4.22.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.47.2) [2024-02-20 07:57] Requirement already satisfied: contourpy>=1.0.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
[2024-02-03 21:05] Requirement already satisfied: pyparsing>=2.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1) [2024-02-20 07:57] Requirement already satisfied: packaging>=20.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
[2024-02-03 21:05] Requirement already satisfied: pytz>=2020.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1) [2024-02-20 07:57] Requirement already satisfied: tzdata>=2022.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
[2024-02-03 21:05] Requirement already satisfied: tzdata>=2022.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.4) [2024-02-20 07:57] Requirement already satisfied: pytz>=2020.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
[2024-02-03 21:05] Requirement already satisfied: idna<4,>=2.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6) [2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
[2024-02-03 21:05] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.1)
[2024-02-03 21:05] Requirement already satisfied: certifi>=2017.4.17 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2) [2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
[2024-02-03 21:05] Requirement already satisfied: charset-normalizer<4,>=2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2) [2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: jinja2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107) [2024-02-20 07:57] Requirement already satisfied: typing-extensions>=4.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
[2024-02-03 21:05] Requirement already satisfied: filelock in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1) [2024-02-20 07:57] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: triton==2.2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: networkx in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
[2024-02-03 21:05] Requirement already satisfied: jinja2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3) [2024-02-20 07:57] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
[2024-02-03 21:05] Requirement already satisfied: fsspec in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.12.2) [2024-02-20 07:57] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1) [2024-02-20 07:57] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106) [2024-02-20 07:57] Requirement already satisfied: sympy in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
[2024-02-03 21:05] Requirement already satisfied: sympy in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12) [2024-02-20 07:57] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54) [2024-02-20 07:57] Requirement already satisfied: filelock in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
[2024-02-03 21:05] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: typing-extensions>=4.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0) [2024-02-20 07:57] Requirement already satisfied: fsspec in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.0)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: triton==2.2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Requirement already satisfied: networkx in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1) [2024-02-20 07:57] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101) [2024-02-20 07:57] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
[2024-02-03 21:05] Requirement already satisfied: six>=1.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0) [2024-02-20 07:57] Requirement already satisfied: six>=1.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
[2024-02-03 21:05] Requirement already satisfied: MarkupSafe>=2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5) [2024-02-20 07:57] Requirement already satisfied: MarkupSafe>=2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
[2024-02-03 21:05] Requirement already satisfied: mpmath>=0.19 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0) [2024-02-20 07:57] Requirement already satisfied: mpmath>=0.19 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt [2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt'] in 'None' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt'] in 'None'
[2024-02-03 21:05] Collecting segment-anything [2024-02-20 07:57] Requirement already satisfied: segment-anything in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 1)) (1.0)
[2024-02-03 21:05] Using cached segment_anything-1.0-py3-none-any.whl (36 kB) [2024-02-20 07:57] Requirement already satisfied: scikit-image in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (0.22.0)
[2024-02-03 21:05] Collecting scikit-image [2024-02-20 07:57] Requirement already satisfied: piexif in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 3)) (1.1.3)
[2024-02-03 21:06] Using cached scikit_image-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.7 MB) [2024-02-20 07:57] Requirement already satisfied: transformers in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.37.2)
[2024-02-03 21:06] Collecting piexif [2024-02-20 07:57] Requirement already satisfied: opencv-python-headless in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 5)) (4.9.0.80)
[2024-02-03 21:06] Using cached piexif-1.1.3-py2.py3-none-any.whl (20 kB) [2024-02-20 07:57] Requirement already satisfied: GitPython in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (3.1.42)
[2024-02-03 21:06] Requirement already satisfied: transformers in ./venv/lib/python3.10/site-packages (from -r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.37.2) [2024-02-20 07:57] Requirement already satisfied: scipy>=1.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.12.0)
[2024-02-03 21:06] Collecting opencv-python-headless [2024-02-20 07:57] Requirement already satisfied: imageio>=2.27 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2.34.0)
[2024-02-03 21:06] Using cached opencv_python_headless-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49.6 MB) [2024-02-20 07:57] Requirement already satisfied: networkx>=2.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (3.2.1)
[2024-02-03 21:06] Requirement already satisfied: GitPython in ./venv/lib/python3.10/site-packages (from -r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (3.1.41) [2024-02-20 07:57] Requirement already satisfied: tifffile>=2022.8.12 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2024.2.12)
[2024-02-03 21:06] Requirement already satisfied: packaging>=21 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (23.2) [2024-02-20 07:57] Requirement already satisfied: packaging>=21 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (23.2)
[2024-02-03 21:06] Requirement already satisfied: networkx>=2.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (3.2.1) [2024-02-20 07:57] Requirement already satisfied: pillow>=9.0.1 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (10.2.0)
[2024-02-03 21:06] Requirement already satisfied: pillow>=9.0.1 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (10.2.0) [2024-02-20 07:57] Requirement already satisfied: lazy_loader>=0.3 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (0.3)
[2024-02-03 21:06] Collecting lazy_loader>=0.3 [2024-02-20 07:57] Requirement already satisfied: numpy>=1.22 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.26.4)
[2024-02-03 21:06] Using cached lazy_loader-0.3-py3-none-any.whl (9.1 kB) [2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (6.0.1)
[2024-02-03 21:06] Requirement already satisfied: imageio>=2.27 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2.33.1) [2024-02-20 07:57] Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.20.3)
[2024-02-03 21:06] Collecting tifffile>=2022.8.12 [2024-02-20 07:57] Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.31.0)
[2024-02-03 21:06] Using cached tifffile-2024.1.30-py3-none-any.whl (224 kB) [2024-02-20 07:57] Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.13.1)
[2024-02-03 21:06] Requirement already satisfied: numpy>=1.22 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.26.3) [2024-02-20 07:57] Requirement already satisfied: tqdm>=4.27 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.66.2)
[2024-02-03 21:06] Requirement already satisfied: scipy>=1.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.12.0) [2024-02-20 07:57] Requirement already satisfied: regex!=2019.12.17 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.25)
[2024-02-03 21:06] Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.31.0) [2024-02-20 07:57] Requirement already satisfied: tokenizers<0.19,>=0.14 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.15.2)
[2024-02-03 21:06] Requirement already satisfied: tokenizers<0.19,>=0.14 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.15.1) [2024-02-20 07:57] Requirement already satisfied: safetensors>=0.4.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.4.2)
[2024-02-03 21:06] Requirement already satisfied: pyyaml>=5.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (6.0.1) [2024-02-20 07:57] Requirement already satisfied: gitdb<5,>=4.0.1 in ./venv/lib/python3.10/site-packages (from GitPython->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (4.0.11)
[2024-02-03 21:06] Requirement already satisfied: regex!=2019.12.17 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.25) [2024-02-20 07:57] Requirement already satisfied: smmap<6,>=3.0.1 in ./venv/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->GitPython->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (5.0.1)
[2024-02-03 21:06] Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.20.3) [2024-02-20 07:57] Requirement already satisfied: fsspec>=2023.5.0 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.0)
[2024-02-03 21:06] Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.13.1) [2024-02-20 07:57] Requirement already satisfied: typing-extensions>=3.7.4.3 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.9.0)
[2024-02-03 21:06] Requirement already satisfied: safetensors>=0.4.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.4.2) [2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.2.1)
[2024-02-03 21:06] Requirement already satisfied: tqdm>=4.27 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.66.1) [2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.3.2)
[2024-02-03 21:06] Requirement already satisfied: gitdb<5,>=4.0.1 in ./venv/lib/python3.10/site-packages (from GitPython->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (4.0.11) [2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.6)
[2024-02-03 21:06] Requirement already satisfied: smmap<6,>=3.0.1 in ./venv/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->GitPython->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (5.0.1) [2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.2)
[2024-02-03 21:06] Requirement already satisfied: fsspec>=2023.5.0 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.2) [2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check basic models
[2024-02-03 21:06] Requirement already satisfied: typing-extensions>=3.7.4.3 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.9.0) [2024-02-20 07:57] Downloading https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/sams/sam_vit_b_01ec64.pth
[2024-02-03 21:06] Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.2) 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 98225271.16it/s]
[2024-02-03 21:06] Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.3.2) [2024-02-20 07:57] ### ComfyUI-Impact-Pack: onnx model directory created (/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/onnx)
[2024-02-03 21:06] Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.2.0) [2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
[2024-02-03 21:06] Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.6) [2024-02-20 07:57] [Impact Pack] Wildcards loading done.
[2024-02-03 21:06] Installing collected packages: segment-anything, tifffile, piexif, opencv-python-headless, lazy_loader, scikit-image [2024-02-20 07:57]
[2024-02-03 21:06] Successfully installed lazy_loader-0.3 opencv-python-headless-4.9.0.80 piexif-1.1.3 scikit-image-0.22.0 segment-anything-1.0 tifffile-2024.1.30 [2024-02-20 07:57] [rgthree] Loaded 34 magnificent nodes.
[2024-02-03 21:06] ### ComfyUI-Impact-Pack: Check basic models [2024-02-20 07:57] [rgthree] Will use rgthree's optimized recursive execution.
[2024-02-03 21:06] Downloading https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/sams/sam_vit_b_01ec64.pth [2024-02-20 07:57]
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 111849469.49it/s] [2024-02-20 07:57] ### Loading: ComfyUI-Manager (V2.7.2)
[2024-02-03 21:06] ### ComfyUI-Impact-Pack: onnx model directory created (/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/onnx) [2024-02-20 07:57] ### ComfyUI Revision: 2005 [0d0fbabd] | Released on '2024-02-20'
[2024-02-03 21:06] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4) [2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
[2024-02-03 21:06] [Impact Pack] Wildcards loading done. [2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
[2024-02-03 21:06] [AnimateDiffEvo] - ERROR - No motion models found. Please download one and place in: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models', '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/animatediff_models'] [2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
[2024-02-03 21:06] WAS Node Suite: Created default conf file at `/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json`. [2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
[2024-02-03 21:06] WAS Node Suite: OpenCV Python FFMPEG support is enabled [2024-02-20 07:58] [VideoHelperSuite] - WARNING - Failed to import imageio_ffmpeg
[2024-02-03 21:06] WAS Node Suite Warning: `ffmpeg_bin_path` is not set in `/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json` config file. Will attempt to use system ffmpeg binaries if available. [2024-02-20 07:58] [AnimateDiffEvo] - ERROR - No motion models found. Please download one and place in: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models', '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/animatediff_models']
[2024-02-03 21:06] WAS Node Suite: Finished. Loaded 211 nodes successfully. [2024-02-20 07:58] FizzleDorf Custom Nodes: Loaded
[2024-02-03 21:06] [2024-02-20 07:58] Collecting requirements-parser
"Opportunities don't happen. You create them." - Chris Grosser [2024-02-20 07:58] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
[2024-02-03 21:06] [2024-02-20 07:58] Collecting types-setuptools>=57.0.0
[2024-02-03 21:06] [VideoHelperSuite] - WARNING - Failed to import imageio_ffmpeg [2024-02-20 07:58] Using cached types_setuptools-69.1.0.20240217-py3-none-any.whl (51 kB)
[2024-02-03 21:06] FizzleDorf Custom Nodes: Loaded [2024-02-20 07:58] Installing collected packages: types-setuptools, requirements-parser
[2024-02-03 21:06] [2024-02-20 07:58] Successfully installed requirements-parser-0.5.0 types-setuptools-69.1.0.20240217
[2024-02-03 21:06] [rgthree] Loaded 33 epic nodes. [2024-02-20 07:58]
[2024-02-03 21:06] [rgthree] Will use rgthree's optimized recursive execution. [2024-02-20 07:58] Command executed successfully!
[2024-02-03 21:06] [2024-02-20 07:58] [comfy_mtb] | INFO -> loaded 55 nodes successfuly
[2024-02-03 21:06] Collecting requirements-parser [2024-02-20 07:58] [comfy_mtb] | INFO -> Some nodes (10) could not be loaded. This can be ignored, but go to http://127.0.0.1:8188/mtb if you want more information.
[2024-02-03 21:06] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB) [2024-02-20 07:58] WAS Node Suite: Created default conf file at `/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json`.
[2024-02-03 21:06] Collecting types-setuptools>=57.0.0 [2024-02-20 07:58] WAS Node Suite: OpenCV Python FFMPEG support is enabled
[2024-02-03 21:06] Using cached types_setuptools-69.0.0.20240125-py3-none-any.whl (51 kB) [2024-02-20 07:58] WAS Node Suite Warning: `ffmpeg_bin_path` is not set in `/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json` config file. Will attempt to use system ffmpeg binaries if available.
[2024-02-03 21:06] Installing collected packages: types-setuptools, requirements-parser [2024-02-20 07:58] WAS Node Suite: Finished. Loaded 211 nodes successfully.
[2024-02-03 21:06] Successfully installed requirements-parser-0.5.0 types-setuptools-69.0.0.20240125 [2024-02-20 07:58]
[2024-02-03 21:06] "Creativity takes courage." - Henri Matisse
[2024-02-03 21:06] Command executed successfully! [2024-02-20 07:58]
[2024-02-03 21:06] [comfy_mtb] | INFO -> loaded 53 nodes successfuly [2024-02-20 07:58]
[2024-02-03 21:06] [comfy_mtb] | INFO -> Some nodes (12) could not be loaded. This can be ignored, but go to http://127.0.0.1:8188/mtb if you want more information.
[2024-02-03 21:06] /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux/node_wrappers/dwpose.py:26: UserWarning: DWPose: Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device. DWPose might run very slowly
warnings.warn("DWPose: Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device. DWPose might run very slowly")
[2024-02-03 21:06] ### Loading: ComfyUI-Manager (V2.7)
[2024-02-03 21:06] ### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)
[2024-02-03 21:06]
Import times for custom nodes: Import times for custom nodes:
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Logic [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUi_NNLatentUpscale [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Logic
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy-image-saver [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUi_NNLatentUpscale
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_IPAdapter_plus [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy-image-saver
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Custom-Scripts [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_IPAdapter_plus
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/Derfuu_ComfyUI_ModdedNodes [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/Derfuu_ComfyUI_ModdedNodes
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_essentials [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Custom-Scripts
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_FizzNodes [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Advanced-ControlNet [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_FizzNodes
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_essentials
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Advanced-ControlNet
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved
[2024-02-03 21:06] 0.1 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes [2024-02-20 07:58] 0.1 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes
[2024-02-03 21:06] 0.9 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-comfyui [2024-02-20 07:58] 0.4 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-comfyui
[2024-02-03 21:06] 1.3 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui [2024-02-20 07:58] 0.5 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui
[2024-02-03 21:06] 2.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb [2024-02-20 07:58] 0.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_segment_anything
[2024-02-03 21:06] 25.8 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack [2024-02-20 07:58] 0.9 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb
[2024-02-03 21:06] [2024-02-20 07:58] 12.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rembg-comfyui-node
[2024-02-03 21:06] Starting server [2024-02-20 07:58] 14.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
[2024-02-03 21:06] [2024-02-20 07:58]
[2024-02-03 21:06] To see the GUI go to: http://127.0.0.1:8188 [2024-02-20 07:58] Starting server
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json [2024-02-20 07:58]
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json [2024-02-20 07:58] To see the GUI go to: http://127.0.0.1:8188
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
+253 -261
View File
@@ -1,267 +1,259 @@
** ComfyUI startup time: 2024-02-03 21:05:40.484447 ** ComfyUI startup time: 2024-02-20 07:57:36.757364
[2024-02-03 21:05] ** Platform: Linux [2024-02-20 07:57] ** Platform: Linux
[2024-02-03 21:05] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] [2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
[2024-02-03 21:05] ** Python executable: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3 [2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
[2024-02-03 21:05] ** Log path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log [2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
[2024-02-03 21:05] [2024-02-20 07:57]
Prestartup times for custom nodes: Prestartup times for custom nodes:
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy [2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager [2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:05] [2024-02-20 07:57]
[2024-02-03 21:05] ** ComfyUI startup time: 2024-02-03 21:05:40.485965 [2024-02-20 07:57] ** ComfyUI startup time: 2024-02-20 07:57:36.757969
[2024-02-03 21:05] ** Platform: Linux [2024-02-20 07:57] ** Platform: Linux
[2024-02-03 21:05] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] [2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
[2024-02-03 21:05] ** Python executable: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3 [2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
[2024-02-03 21:05] ** Log path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log [2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
[2024-02-03 21:05] [2024-02-20 07:57]
Prestartup times for custom nodes: Prestartup times for custom nodes:
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy [2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
[2024-02-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager [2024-02-20 07:57] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:05] [2024-02-20 07:57]
[2024-02-03 21:05] ****** User settings have been changed to be stored on the server instead of browser storage. ****** [2024-02-20 07:57] ****** User settings have been changed to be stored on the server instead of browser storage. ******
[2024-02-03 21:05] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ****** [2024-02-20 07:57] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******
[2024-02-03 21:05] Efficiency Nodes: Attempting to add Control Net options to the 'HiRes-Fix Script' Node (comfyui_controlnet_aux add-on)...Success! [2024-02-20 07:57] Efficiency Nodes: Attempting to add Control Net options to the 'HiRes-Fix Script' Node (comfyui_controlnet_aux add-on)...Success!
[2024-02-03 21:05] Efficiency Nodes Warning: Failed to import python package 'simpleeval'; related nodes disabled. [2024-02-20 07:57] Efficiency Nodes Warning: Failed to import python package 'simpleeval'; related nodes disabled.
[2024-02-03 21:05] [2024-02-20 07:57]
[2024-02-03 21:05] ### Loading: ComfyUI-Impact-Pack (V4.73.3) [2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (V4.78)
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20] [2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Check dependencies [2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check dependencies
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating subpack [2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating subpack
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', 'GitPython'] in 'None' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', 'GitPython'] in 'None'
[2024-02-03 21:05] Collecting GitPython [2024-02-20 07:57] Collecting GitPython
[2024-02-03 21:05] Using cached GitPython-3.1.41-py3-none-any.whl (196 kB) [2024-02-20 07:57] Using cached GitPython-3.1.42-py3-none-any.whl (195 kB)
[2024-02-03 21:05] Collecting gitdb<5,>=4.0.1 [2024-02-20 07:57] Collecting gitdb<5,>=4.0.1
[2024-02-03 21:05] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB) [2024-02-20 07:57] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB)
[2024-02-03 21:05] Collecting smmap<6,>=3.0.1 [2024-02-20 07:57] Collecting smmap<6,>=3.0.1
[2024-02-03 21:05] Using cached smmap-5.0.1-py3-none-any.whl (24 kB) [2024-02-20 07:57] Using cached smmap-5.0.1-py3-none-any.whl (24 kB)
[2024-02-03 21:05] Installing collected packages: smmap, gitdb, GitPython [2024-02-20 07:57] Installing collected packages: smmap, gitdb, GitPython
[2024-02-03 21:05] Successfully installed GitPython-3.1.41 gitdb-4.0.11 smmap-5.0.1 [2024-02-20 07:57] Successfully installed GitPython-3.1.42 gitdb-4.0.11 smmap-5.0.1
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', 'install.py'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', 'install.py'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/e3893a92c5c1907136b6cc75404094db767c1e0cfefe1b43e87dad72af2e4c9f?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27face_yolov8m.pt%3B+filename%3D%22face_yolov8m.pt%22%3B&Expires=1707271547&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI3MTU0N319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlL2UzODkzYTkyYzVjMTkwNzEzNmI2Y2M3NTQwNDA5NGRiNzY3YzFlMGNmZWZlMWI0M2U4N2RhZDcyYWYyZTRjOWY%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=gO2u6BHHN041QdWEenk3PJJ%7EhG3Tu7VRc1dirPXQpC8MBc4Ifs3Qb3Og0wDiJlsO14jRkodYAfxYQfZUfTnvbHLwVf9amr1BeVUDXdveTgReZG5do79je4MdE-OkcFscsctQFxjMWiPPFc96MWYDPsBloV8xos6YNYXTdPPB2efa19nFNFP56hwbjSbenkEE3Detf7j0m4ta%7ExwlvMDiUQArg8bJm27FQu-Kkj7JXg01Y9jR1exiBm7P9FXT4zLA0M2kIbB87CDsjN0Rc9c3cSMyg0GhqGu%7Enh404cPbY5Cp1HbDvEUoodC2rDQhqTbiUu-D1BIH4TKG7ICYjrV-Jw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/face_yolov8m.pt [2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/e3893a92c5c1907136b6cc75404094db767c1e0cfefe1b43e87dad72af2e4c9f?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27face_yolov8m.pt%3B+filename%3D%22face_yolov8m.pt%22%3B&Expires=1708700672&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMDY3Mn19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlL2UzODkzYTkyYzVjMTkwNzEzNmI2Y2M3NTQwNDA5NGRiNzY3YzFlMGNmZWZlMWI0M2U4N2RhZDcyYWYyZTRjOWY%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=YqPhukw4gdolcqysRQfZPHDbxzji5-x5N1afxX14%7E2Djh%7EUQVRNqFfDFdRJ1nKdleqCAKaafGcQUQbvFHtRq4C--en9fYAComs8mKWrcBan1vUgMFg8QTWWig5x0nBiJe1A8eCoQ7D7qyR8sx7SukcQf62xhEe0H3GVA94aAWIy0AW29WhaUeAM7MQw0DjCbaOCejOQn8neMrqUjjlsux1AwSlw%7EBJU2kk3ZBekzonX2zag7GQoht0lwopD-y0XQ7WH%7ELPaD1VOWphpdq59ZZhIs515Nz7HyVckx6YtvOzJnsaCVMBDPls9sUHhBMd5i54E8RudbHu9uBpZWWe3haQ__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/face_yolov8m.pt
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 51996128/51996128 [00:00<00:00, 82768130.39it/s] [2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 51996128/51996128 [00:00<00:00, 95807035.85it/s]
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/30878cea9870964d4a238339e9dcff002078bbbaa1a058b07e11c167f67eca1c?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27hand_yolov8s.pt%3B+filename%3D%22hand_yolov8s.pt%22%3B&Expires=1707267882&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI2Nzg4Mn19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzMwODc4Y2VhOTg3MDk2NGQ0YTIzODMzOWU5ZGNmZjAwMjA3OGJiYmFhMWEwNThiMDdlMTFjMTY3ZjY3ZWNhMWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=rSo6jzXkXXBX0UqUzGSLHwPnR-utKCLRx%7EZqDCu7P01C%7EXkHoOz6urAqNu4S1MR5dbozl4UA1S%7EikO95CdhqCEgUbavkbRIoemWUALHcqAMEDS4S52NRNvAriED2WcL0JcUHCxa3VYo8xBgYYFdyP7cj8H0LGDzJqNk9HH2wh2hkY0jwsilpD1XL2b5iawwTLuop6mqdsnwpxYfY1JHCUhSEJh3oDG-LgQiwqOY90sTdDlVkImP8Pr4jQy0KU29B%7EZcGuOrFPkFQm8ajy8ZfggEK2BJOYvWT501M125DVWmsw8xbXilLRAnvXTP276QFKHbMie5piQ0inwmcE-mRhw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/hand_yolov8s.pt [2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/30878cea9870964d4a238339e9dcff002078bbbaa1a058b07e11c167f67eca1c?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27hand_yolov8s.pt%3B+filename%3D%22hand_yolov8s.pt%22%3B&Expires=1708703860&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMzg2MH19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzMwODc4Y2VhOTg3MDk2NGQ0YTIzODMzOWU5ZGNmZjAwMjA3OGJiYmFhMWEwNThiMDdlMTFjMTY3ZjY3ZWNhMWM%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=WVG1I3otJ5Ly6l60OQafoATYQdskZxwTNQBmHrHmNyFRx7SPqOUKViTgQyweq03mxnLh1H0aKl0WDXr%7EJ0yy18OsSYN09GZD77uNDGqAaPO8m20KwJySinKRfbbFZmYo1dwEKmG1-mYXqUxOBhdPRo9pKXkguPzGy1APjpSlDz4zqBlsginzyzrYIpbeZ3an1d4JtihzITVzOyRGOPL1kE6H87gK9faOv1cjWIj2QJL9Fx2YepNDdCtVeHapnEH9v7HvYrcz268nVtRXBUmP9P3JdClKBIR-lq9CHic02INNEJQHG7-hXGD-RZl3A%7EB4hdNP8Nf%7EtRmpL8yu6pgEww__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/bbox/hand_yolov8s.pt
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 22484536/22484536 [00:00<00:00, 76459125.60it/s] [2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 22484536/22484536 [00:00<00:00, 80692120.55it/s]
[2024-02-03 21:05] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/1fd7e562f240a5debd48bf737753de6fb60c63f8664121bb522f090a885d8254?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27person_yolov8m-seg.pt%3B+filename%3D%22person_yolov8m-seg.pt%22%3B&Expires=1707268213&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwNzI2ODIxM319LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzFmZDdlNTYyZjI0MGE1ZGViZDQ4YmY3Mzc3NTNkZTZmYjYwYzYzZjg2NjQxMjFiYjUyMmYwOTBhODg1ZDgyNTQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=furDvMunH-c4MWMYZA7AZeKyBE4gscdQeKgna6MFJmx4Lb5-TBs0LcIbMSEgTexlaK%7EUxNsFOeseZLI9rfnnVVYGS7MgyGNlucus60DQOIzR4x%7EtGChq-WtSiTmFX5p1gkc51ativvYWp2K-qyXO0Kminc6YHq1OpYFfWHguJ-V83LbQe61J1VPaUW%7ES2hZEV927r-tK81rSLRzQOB5NFTibMDrqXsV6yTyEaerjczsXsrAoPVr5ibHMhtAfV5gcIeIO5Nuc4nSXQgw75H4Xnf%7E5f6Uzi-wtiKKgHaDVdazTMqkdyWSggr-cxSnFag%7ETZW-nol6kTmbJ17uh084uGg__&Key-Pair-Id=KVTP0A1DKRTAX to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/segm/person_yolov8m-seg.pt [2024-02-20 07:57] Downloading https://cdn-lfs.huggingface.co/repos/0d/db/0ddb8d3fcb6ee9737d9dd7e090e6c6cb6e40728d12307180160e7f654cb345de/1fd7e562f240a5debd48bf737753de6fb60c63f8664121bb522f090a885d8254?response-content-disposition=attachment%3B+filename*%3DUTF-8%27%27person_yolov8m-seg.pt%3B+filename%3D%22person_yolov8m-seg.pt%22%3B&Expires=1708702215&Policy=eyJTdGF0ZW1lbnQiOlt7IkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTcwODcwMjIxNX19LCJSZXNvdXJjZSI6Imh0dHBzOi8vY2RuLWxmcy5odWdnaW5nZmFjZS5jby9yZXBvcy8wZC9kYi8wZGRiOGQzZmNiNmVlOTczN2Q5ZGQ3ZTA5MGU2YzZjYjZlNDA3MjhkMTIzMDcxODAxNjBlN2Y2NTRjYjM0NWRlLzFmZDdlNTYyZjI0MGE1ZGViZDQ4YmY3Mzc3NTNkZTZmYjYwYzYzZjg2NjQxMjFiYjUyMmYwOTBhODg1ZDgyNTQ%7EcmVzcG9uc2UtY29udGVudC1kaXNwb3NpdGlvbj0qIn1dfQ__&Signature=HOG-dw%7EPHSKUMmad-wwtHqqY7PnOinwIKJUv7IM-Ui5GXq7NFg-spyPkbJXwqkB5LVWxC5l-aWQDBzxVpQisLiu47YPo%7EUPAJ86DU%7EDdvHN7DEOBJoUqwjWYlfudwfNvLyE7DfEGM3xKh7gctMnD2DengytQ4rZrk4vWzrh9fXYamwLMFPr8QfdgwFdinUqZUt0WAkzZUVOeR8Vm42KTL40LKor9JZzQuzlNy5ul0jal1SudRYH3vank8ld1KMa0wsKVs2WUiMaEldAIXtMSqsCNNiKiu0v2ibamMmv4-Xy5FNetmkYH3s5IjBpdyRO127EuCz0EZttV4Lloe7SCvw__&Key-Pair-Id=KVTP0A1DKRTAX to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/ultralytics/segm/person_yolov8m-seg.pt
[2024-02-03 21:05] [2024-02-03 21:05] 100%|██████████| 54791722/54791722 [00:00<00:00, 90788474.85it/s] [2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 54791722/54791722 [00:00<00:00, 96343854.43it/s]
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt [2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
[2024-02-03 21:05] Collecting ultralytics!=8.0.177 [2024-02-20 07:57] Collecting ultralytics!=8.0.177
[2024-02-03 21:05] Using cached ultralytics-8.1.9-py3-none-any.whl (709 kB) [2024-02-20 07:57] Using cached ultralytics-8.1.16-py3-none-any.whl (715 kB)
[2024-02-03 21:05] Requirement already satisfied: numpy>=1.22.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.3) [2024-02-20 07:57] Requirement already satisfied: psutil in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
[2024-02-03 21:05] Collecting seaborn>=0.11.0 [2024-02-20 07:57] Requirement already satisfied: opencv-python>=4.6.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
[2024-02-03 21:05] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB) [2024-02-20 07:57] Requirement already satisfied: torchvision>=0.9.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
[2024-02-03 21:05] Requirement already satisfied: opencv-python>=4.6.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80) [2024-02-20 07:57] Requirement already satisfied: pillow>=7.1.2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
[2024-02-03 21:05] Requirement already satisfied: matplotlib>=3.3.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.2) [2024-02-20 07:57] Collecting seaborn>=0.11.0
[2024-02-03 21:05] Requirement already satisfied: psutil in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8) [2024-02-20 07:57] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
[2024-02-03 21:05] Collecting pandas>=1.1.4 [2024-02-20 07:57] Requirement already satisfied: torch>=1.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Using cached pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.0 MB) [2024-02-20 07:57] Collecting py-cpuinfo
[2024-02-03 21:05] Requirement already satisfied: pillow>=7.1.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0) [2024-02-20 07:57] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
[2024-02-03 21:05] Requirement already satisfied: scipy>=1.4.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0) [2024-02-20 07:57] Requirement already satisfied: scipy>=1.4.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
[2024-02-03 21:05] Requirement already satisfied: torch>=1.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Collecting thop>=0.1.1
[2024-02-03 21:05] Requirement already satisfied: tqdm>=4.64.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.1) [2024-02-20 07:57] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
[2024-02-03 21:05] Requirement already satisfied: requests>=2.23.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0) [2024-02-20 07:57] Requirement already satisfied: tqdm>=4.64.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.2)
[2024-02-03 21:05] Collecting py-cpuinfo [2024-02-20 07:57] Requirement already satisfied: matplotlib>=3.3.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.3)
[2024-02-03 21:05] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB) [2024-02-20 07:57] Collecting pandas>=1.1.4
[2024-02-03 21:05] Collecting thop>=0.1.1 [2024-02-20 07:57] Using cached pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.0 MB)
[2024-02-03 21:05] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB) [2024-02-20 07:57] Requirement already satisfied: requests>=2.23.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
[2024-02-03 21:05] Requirement already satisfied: pyyaml>=5.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1) [2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
[2024-02-03 21:05] Requirement already satisfied: torchvision>=0.9.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0) [2024-02-20 07:57] Requirement already satisfied: kiwisolver>=1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
[2024-02-03 21:05] Requirement already satisfied: kiwisolver>=1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5) [2024-02-20 07:57] Requirement already satisfied: cycler>=0.10 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
[2024-02-03 21:05] Requirement already satisfied: contourpy>=1.0.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0) [2024-02-20 07:57] Requirement already satisfied: pyparsing>=2.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
[2024-02-03 21:05] Requirement already satisfied: python-dateutil>=2.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2) [2024-02-20 07:57] Requirement already satisfied: fonttools>=4.22.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.49.0)
[2024-02-03 21:05] Requirement already satisfied: cycler>=0.10 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1) [2024-02-20 07:57] Requirement already satisfied: packaging>=20.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
[2024-02-03 21:05] Requirement already satisfied: pyparsing>=2.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1) [2024-02-20 07:57] Requirement already satisfied: contourpy>=1.0.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
[2024-02-03 21:05] Requirement already satisfied: fonttools>=4.22.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.47.2) [2024-02-20 07:57] Requirement already satisfied: numpy<2,>=1.21 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.4)
[2024-02-03 21:05] Requirement already satisfied: packaging>=20.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2) [2024-02-20 07:57] Requirement already satisfied: python-dateutil>=2.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
[2024-02-03 21:05] Collecting pytz>=2020.1 [2024-02-20 07:57] Collecting tzdata>=2022.7
[2024-02-03 21:05] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB) [2024-02-20 07:57] Using cached tzdata-2024.1-py2.py3-none-any.whl (345 kB)
[2024-02-03 21:05] Collecting tzdata>=2022.7 [2024-02-20 07:57] Collecting pytz>=2020.1
[2024-02-03 21:05] Using cached tzdata-2023.4-py2.py3-none-any.whl (346 kB) [2024-02-20 07:57] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
[2024-02-03 21:05] Requirement already satisfied: idna<4,>=2.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6) [2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.1)
[2024-02-03 21:05] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
[2024-02-03 21:05] Requirement already satisfied: certifi>=2017.4.17 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2) [2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
[2024-02-03 21:05] Requirement already satisfied: charset-normalizer<4,>=2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2) [2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
[2024-02-03 21:05] Requirement already satisfied: typing-extensions>=4.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0) [2024-02-20 07:57] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: sympy in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106) [2024-02-20 07:57] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26) [2024-02-20 07:57] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
[2024-02-03 21:05] Requirement already satisfied: networkx in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1) [2024-02-20 07:57] Requirement already satisfied: triton==2.2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Requirement already satisfied: triton==2.2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1) [2024-02-20 07:57] Requirement already satisfied: filelock in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54) [2024-02-20 07:57] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
[2024-02-03 21:05] Requirement already satisfied: filelock in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1) [2024-02-20 07:57] Requirement already satisfied: typing-extensions>=4.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3) [2024-02-20 07:57] Requirement already satisfied: networkx in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: fsspec in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.0)
[2024-02-03 21:05] Requirement already satisfied: jinja2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3) [2024-02-20 07:57] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
[2024-02-03 21:05] Requirement already satisfied: fsspec in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.12.2) [2024-02-20 07:57] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: sympy in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107) [2024-02-20 07:57] Requirement already satisfied: jinja2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106) [2024-02-20 07:57] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101) [2024-02-20 07:57] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
[2024-02-03 21:05] Requirement already satisfied: six>=1.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0) [2024-02-20 07:57] Requirement already satisfied: six>=1.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
[2024-02-03 21:05] Requirement already satisfied: MarkupSafe>=2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5) [2024-02-20 07:57] Requirement already satisfied: MarkupSafe>=2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
[2024-02-03 21:05] Requirement already satisfied: mpmath>=0.19 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0) [2024-02-20 07:57] Requirement already satisfied: mpmath>=0.19 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
[2024-02-03 21:05] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics [2024-02-20 07:57] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics
[2024-02-03 21:05] Successfully installed pandas-2.2.0 py-cpuinfo-9.0.0 pytz-2024.1 seaborn-0.13.2 thop-0.1.1.post2209072238 tzdata-2023.4 ultralytics-8.1.9 [2024-02-20 07:57] Successfully installed pandas-2.2.0 py-cpuinfo-9.0.0 pytz-2024.1 seaborn-0.13.2 thop-0.1.1.post2209072238 tzdata-2024.1 ultralytics-8.1.16
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt [2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack/requirements.txt
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', 'requirements.txt'] in '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/impact_subpack'
[2024-02-03 21:05] Requirement already satisfied: ultralytics!=8.0.177 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (8.1.9) [2024-02-20 07:57] Requirement already satisfied: ultralytics!=8.0.177 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (8.1.16)
[2024-02-03 21:05] Requirement already satisfied: matplotlib>=3.3.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.2) [2024-02-20 07:57] Requirement already satisfied: psutil in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8)
[2024-02-03 21:05] Requirement already satisfied: pyyaml>=5.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1) [2024-02-20 07:57] Requirement already satisfied: pillow>=7.1.2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0)
[2024-02-03 21:05] Requirement already satisfied: seaborn>=0.11.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.13.2) [2024-02-20 07:57] Requirement already satisfied: torchvision>=0.9.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0)
[2024-02-03 21:05] Requirement already satisfied: pillow>=7.1.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.2.0) [2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (6.0.1)
[2024-02-03 21:05] Requirement already satisfied: requests>=2.23.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0) [2024-02-20 07:57] Requirement already satisfied: py-cpuinfo in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (9.0.0)
[2024-02-03 21:05] Requirement already satisfied: py-cpuinfo in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (9.0.0) [2024-02-20 07:57] Requirement already satisfied: pandas>=1.1.4 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Requirement already satisfied: thop>=0.1.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.1.1.post2209072238) [2024-02-20 07:57] Requirement already satisfied: seaborn>=0.11.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.13.2)
[2024-02-03 21:05] Requirement already satisfied: torch>=1.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: matplotlib>=3.3.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.8.3)
[2024-02-03 21:05] Requirement already satisfied: scipy>=1.4.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0) [2024-02-20 07:57] Requirement already satisfied: scipy>=1.4.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12.0)
[2024-02-03 21:05] Requirement already satisfied: psutil in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (5.9.8) [2024-02-20 07:57] Requirement already satisfied: opencv-python>=4.6.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80)
[2024-02-03 21:05] Requirement already satisfied: opencv-python>=4.6.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0.80) [2024-02-20 07:57] Requirement already satisfied: torch>=1.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Requirement already satisfied: numpy>=1.22.2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.3) [2024-02-20 07:57] Requirement already satisfied: tqdm>=4.64.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.2)
[2024-02-03 21:05] Requirement already satisfied: tqdm>=4.64.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.66.1) [2024-02-20 07:57] Requirement already satisfied: requests>=2.23.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.31.0)
[2024-02-03 21:05] Requirement already satisfied: pandas>=1.1.4 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: thop>=0.1.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.1.1.post2209072238)
[2024-02-03 21:05] Requirement already satisfied: torchvision>=0.9.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.17.0) [2024-02-20 07:57] Requirement already satisfied: numpy<2,>=1.21 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.26.4)
[2024-02-03 21:05] Requirement already satisfied: contourpy>=1.0.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0) [2024-02-20 07:57] Requirement already satisfied: kiwisolver>=1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5)
[2024-02-03 21:05] Requirement already satisfied: packaging>=20.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2) [2024-02-20 07:57] Requirement already satisfied: python-dateutil>=2.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2)
[2024-02-03 21:05] Requirement already satisfied: kiwisolver>=1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.4.5) [2024-02-20 07:57] Requirement already satisfied: fonttools>=4.22.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.49.0)
[2024-02-03 21:05] Requirement already satisfied: cycler>=0.10 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1) [2024-02-20 07:57] Requirement already satisfied: pyparsing>=2.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1)
[2024-02-03 21:05] Requirement already satisfied: python-dateutil>=2.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.8.2) [2024-02-20 07:57] Requirement already satisfied: cycler>=0.10 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (0.12.1)
[2024-02-03 21:05] Requirement already satisfied: fonttools>=4.22.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.47.2) [2024-02-20 07:57] Requirement already satisfied: contourpy>=1.0.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.2.0)
[2024-02-03 21:05] Requirement already satisfied: pyparsing>=2.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.1) [2024-02-20 07:57] Requirement already satisfied: packaging>=20.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (23.2)
[2024-02-03 21:05] Requirement already satisfied: pytz>=2020.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1) [2024-02-20 07:57] Requirement already satisfied: tzdata>=2022.7 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
[2024-02-03 21:05] Requirement already satisfied: tzdata>=2022.7 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.4) [2024-02-20 07:57] Requirement already satisfied: pytz>=2020.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from pandas>=1.1.4->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.1)
[2024-02-03 21:05] Requirement already satisfied: idna<4,>=2.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6) [2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.6)
[2024-02-03 21:05] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.1)
[2024-02-03 21:05] Requirement already satisfied: certifi>=2017.4.17 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2) [2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2)
[2024-02-03 21:05] Requirement already satisfied: charset-normalizer<4,>=2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.3.2) [2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from requests>=2.23.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.2)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: jinja2 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107) [2024-02-20 07:57] Requirement already satisfied: typing-extensions>=4.8.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0)
[2024-02-03 21:05] Requirement already satisfied: filelock in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1) [2024-02-20 07:57] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: triton==2.2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0) [2024-02-20 07:57] Requirement already satisfied: networkx in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1)
[2024-02-03 21:05] Requirement already satisfied: jinja2 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.1.3) [2024-02-20 07:57] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106)
[2024-02-03 21:05] Requirement already satisfied: fsspec in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2023.12.2) [2024-02-20 07:57] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (8.9.2.26) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1) [2024-02-20 07:57] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.0.106) [2024-02-20 07:57] Requirement already satisfied: sympy in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12)
[2024-02-03 21:05] Requirement already satisfied: sympy in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.12) [2024-02-20 07:57] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.3.1)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.0.2.54) [2024-02-20 07:57] Requirement already satisfied: filelock in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.13.1)
[2024-02-03 21:05] Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (10.3.2.106) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nccl-cu12==2.19.3 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.19.3) [2024-02-20 07:57] Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105)
[2024-02-03 21:05] Requirement already satisfied: typing-extensions>=4.8.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (4.9.0) [2024-02-20 07:57] Requirement already satisfied: fsspec in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2024.2.0)
[2024-02-03 21:05] Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.1.105) [2024-02-20 07:57] Requirement already satisfied: triton==2.2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.2.0)
[2024-02-03 21:05] Requirement already satisfied: networkx in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (3.2.1) [2024-02-20 07:57] Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (11.4.5.107)
[2024-02-03 21:05] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101) [2024-02-20 07:57] Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (12.3.101)
[2024-02-03 21:05] Requirement already satisfied: six>=1.5 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0) [2024-02-20 07:57] Requirement already satisfied: six>=1.5 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib>=3.3.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.16.0)
[2024-02-03 21:05] Requirement already satisfied: MarkupSafe>=2.0 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5) [2024-02-20 07:57] Requirement already satisfied: MarkupSafe>=2.0 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from jinja2->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (2.1.5)
[2024-02-03 21:05] Requirement already satisfied: mpmath>=0.19 in /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0) [2024-02-20 07:57] Requirement already satisfied: mpmath>=0.19 in /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/lib/python3.10/site-packages (from sympy->torch>=1.8.0->ultralytics!=8.0.177->-r requirements.txt (line 1)) (1.3.0)
[2024-02-03 21:05] req_path: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt [2024-02-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt
[2024-02-03 21:05] [Impact Pack] EXECUTE: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt'] in 'None' [2024-02-20 07:57] [Impact Pack] EXECUTE: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3', '-m', 'pip', 'install', '-r', '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt'] in 'None'
[2024-02-03 21:05] Collecting segment-anything [2024-02-20 07:57] Requirement already satisfied: segment-anything in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 1)) (1.0)
[2024-02-03 21:05] Using cached segment_anything-1.0-py3-none-any.whl (36 kB) [2024-02-20 07:57] Requirement already satisfied: scikit-image in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (0.22.0)
[2024-02-03 21:05] Collecting scikit-image [2024-02-20 07:57] Requirement already satisfied: piexif in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 3)) (1.1.3)
[2024-02-03 21:06] Using cached scikit_image-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.7 MB) [2024-02-20 07:57] Requirement already satisfied: transformers in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.37.2)
[2024-02-03 21:06] Collecting piexif [2024-02-20 07:57] Requirement already satisfied: opencv-python-headless in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 5)) (4.9.0.80)
[2024-02-03 21:06] Using cached piexif-1.1.3-py2.py3-none-any.whl (20 kB) [2024-02-20 07:57] Requirement already satisfied: GitPython in ./venv/lib/python3.10/site-packages (from -r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (3.1.42)
[2024-02-03 21:06] Requirement already satisfied: transformers in ./venv/lib/python3.10/site-packages (from -r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.37.2) [2024-02-20 07:57] Requirement already satisfied: scipy>=1.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.12.0)
[2024-02-03 21:06] Collecting opencv-python-headless [2024-02-20 07:57] Requirement already satisfied: imageio>=2.27 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2.34.0)
[2024-02-03 21:06] Using cached opencv_python_headless-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49.6 MB) [2024-02-20 07:57] Requirement already satisfied: networkx>=2.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (3.2.1)
[2024-02-03 21:06] Requirement already satisfied: GitPython in ./venv/lib/python3.10/site-packages (from -r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (3.1.41) [2024-02-20 07:57] Requirement already satisfied: tifffile>=2022.8.12 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2024.2.12)
[2024-02-03 21:06] Requirement already satisfied: packaging>=21 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (23.2) [2024-02-20 07:57] Requirement already satisfied: packaging>=21 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (23.2)
[2024-02-03 21:06] Requirement already satisfied: networkx>=2.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (3.2.1) [2024-02-20 07:57] Requirement already satisfied: pillow>=9.0.1 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (10.2.0)
[2024-02-03 21:06] Requirement already satisfied: pillow>=9.0.1 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (10.2.0) [2024-02-20 07:57] Requirement already satisfied: lazy_loader>=0.3 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (0.3)
[2024-02-03 21:06] Collecting lazy_loader>=0.3 [2024-02-20 07:57] Requirement already satisfied: numpy>=1.22 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.26.4)
[2024-02-03 21:06] Using cached lazy_loader-0.3-py3-none-any.whl (9.1 kB) [2024-02-20 07:57] Requirement already satisfied: pyyaml>=5.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (6.0.1)
[2024-02-03 21:06] Requirement already satisfied: imageio>=2.27 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (2.33.1) [2024-02-20 07:57] Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.20.3)
[2024-02-03 21:06] Collecting tifffile>=2022.8.12 [2024-02-20 07:57] Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.31.0)
[2024-02-03 21:06] Using cached tifffile-2024.1.30-py3-none-any.whl (224 kB) [2024-02-20 07:57] Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.13.1)
[2024-02-03 21:06] Requirement already satisfied: numpy>=1.22 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.26.3) [2024-02-20 07:57] Requirement already satisfied: tqdm>=4.27 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.66.2)
[2024-02-03 21:06] Requirement already satisfied: scipy>=1.8 in ./venv/lib/python3.10/site-packages (from scikit-image->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 2)) (1.12.0) [2024-02-20 07:57] Requirement already satisfied: regex!=2019.12.17 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.25)
[2024-02-03 21:06] Requirement already satisfied: requests in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.31.0) [2024-02-20 07:57] Requirement already satisfied: tokenizers<0.19,>=0.14 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.15.2)
[2024-02-03 21:06] Requirement already satisfied: tokenizers<0.19,>=0.14 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.15.1) [2024-02-20 07:57] Requirement already satisfied: safetensors>=0.4.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.4.2)
[2024-02-03 21:06] Requirement already satisfied: pyyaml>=5.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (6.0.1) [2024-02-20 07:57] Requirement already satisfied: gitdb<5,>=4.0.1 in ./venv/lib/python3.10/site-packages (from GitPython->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (4.0.11)
[2024-02-03 21:06] Requirement already satisfied: regex!=2019.12.17 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.25) [2024-02-20 07:57] Requirement already satisfied: smmap<6,>=3.0.1 in ./venv/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->GitPython->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (5.0.1)
[2024-02-03 21:06] Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.20.3) [2024-02-20 07:57] Requirement already satisfied: fsspec>=2023.5.0 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.0)
[2024-02-03 21:06] Requirement already satisfied: filelock in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.13.1) [2024-02-20 07:57] Requirement already satisfied: typing-extensions>=3.7.4.3 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.9.0)
[2024-02-03 21:06] Requirement already satisfied: safetensors>=0.4.1 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (0.4.2) [2024-02-20 07:57] Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.2.1)
[2024-02-03 21:06] Requirement already satisfied: tqdm>=4.27 in ./venv/lib/python3.10/site-packages (from transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.66.1) [2024-02-20 07:57] Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.3.2)
[2024-02-03 21:06] Requirement already satisfied: gitdb<5,>=4.0.1 in ./venv/lib/python3.10/site-packages (from GitPython->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (4.0.11) [2024-02-20 07:57] Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.6)
[2024-02-03 21:06] Requirement already satisfied: smmap<6,>=3.0.1 in ./venv/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->GitPython->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 6)) (5.0.1) [2024-02-20 07:57] Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.2)
[2024-02-03 21:06] Requirement already satisfied: fsspec>=2023.5.0 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2023.12.2) [2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check basic models
[2024-02-03 21:06] Requirement already satisfied: typing-extensions>=3.7.4.3 in ./venv/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (4.9.0) [2024-02-20 07:57] Downloading https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth to /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/sams/sam_vit_b_01ec64.pth
[2024-02-03 21:06] Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2024.2.2) 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 98225271.16it/s]
[2024-02-03 21:06] Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.3.2) [2024-02-20 07:57] ### ComfyUI-Impact-Pack: onnx model directory created (/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/onnx)
[2024-02-03 21:06] Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (2.2.0) [2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
[2024-02-03 21:06] Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.10/site-packages (from requests->transformers->-r /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt (line 4)) (3.6) [2024-02-20 07:57] [Impact Pack] Wildcards loading done.
[2024-02-03 21:06] Installing collected packages: segment-anything, tifffile, piexif, opencv-python-headless, lazy_loader, scikit-image [2024-02-20 07:57]
[2024-02-03 21:06] Successfully installed lazy_loader-0.3 opencv-python-headless-4.9.0.80 piexif-1.1.3 scikit-image-0.22.0 segment-anything-1.0 tifffile-2024.1.30 [2024-02-20 07:57] [rgthree] Loaded 34 magnificent nodes.
[2024-02-03 21:06] ### ComfyUI-Impact-Pack: Check basic models [2024-02-20 07:57] [rgthree] Will use rgthree's optimized recursive execution.
[2024-02-03 21:06] Downloading https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth to /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/sams/sam_vit_b_01ec64.pth [2024-02-20 07:57]
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 111849469.49it/s] [2024-02-20 07:57] ### Loading: ComfyUI-Manager (V2.7.2)
[2024-02-03 21:06] ### ComfyUI-Impact-Pack: onnx model directory created (/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/onnx) [2024-02-20 07:57] ### ComfyUI Revision: 2005 [0d0fbabd] | Released on '2024-02-20'
[2024-02-03 21:06] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4) [2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
[2024-02-03 21:06] [Impact Pack] Wildcards loading done. [2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
[2024-02-03 21:06] [AnimateDiffEvo] - ERROR - No motion models found. Please download one and place in: ['/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models', '/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/animatediff_models'] [2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
[2024-02-03 21:06] WAS Node Suite: Created default conf file at `/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json`. [2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
[2024-02-03 21:06] WAS Node Suite: OpenCV Python FFMPEG support is enabled [2024-02-20 07:58] [VideoHelperSuite] - WARNING - Failed to import imageio_ffmpeg
[2024-02-03 21:06] WAS Node Suite Warning: `ffmpeg_bin_path` is not set in `/home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json` config file. Will attempt to use system ffmpeg binaries if available. [2024-02-20 07:58] [AnimateDiffEvo] - ERROR - No motion models found. Please download one and place in: ['/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models', '/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/models/animatediff_models']
[2024-02-03 21:06] WAS Node Suite: Finished. Loaded 211 nodes successfully. [2024-02-20 07:58] FizzleDorf Custom Nodes: Loaded
[2024-02-03 21:06] [2024-02-20 07:58] Collecting requirements-parser
"Opportunities don't happen. You create them." - Chris Grosser [2024-02-20 07:58] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
[2024-02-03 21:06] [2024-02-20 07:58] Collecting types-setuptools>=57.0.0
[2024-02-03 21:06] [VideoHelperSuite] - WARNING - Failed to import imageio_ffmpeg [2024-02-20 07:58] Using cached types_setuptools-69.1.0.20240217-py3-none-any.whl (51 kB)
[2024-02-03 21:06] FizzleDorf Custom Nodes: Loaded [2024-02-20 07:58] Installing collected packages: types-setuptools, requirements-parser
[2024-02-03 21:06] [2024-02-20 07:58] Successfully installed requirements-parser-0.5.0 types-setuptools-69.1.0.20240217
[2024-02-03 21:06] [rgthree] Loaded 33 epic nodes. [2024-02-20 07:58]
[2024-02-03 21:06] [rgthree] Will use rgthree's optimized recursive execution. [2024-02-20 07:58] Command executed successfully!
[2024-02-03 21:06] [2024-02-20 07:58] [comfy_mtb] | INFO -> loaded 55 nodes successfuly
[2024-02-03 21:06] Collecting requirements-parser [2024-02-20 07:58] [comfy_mtb] | INFO -> Some nodes (10) could not be loaded. This can be ignored, but go to http://127.0.0.1:8188/mtb if you want more information.
[2024-02-03 21:06] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB) [2024-02-20 07:58] WAS Node Suite: Created default conf file at `/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json`.
[2024-02-03 21:06] Collecting types-setuptools>=57.0.0 [2024-02-20 07:58] WAS Node Suite: OpenCV Python FFMPEG support is enabled
[2024-02-03 21:06] Using cached types_setuptools-69.0.0.20240125-py3-none-any.whl (51 kB) [2024-02-20 07:58] WAS Node Suite Warning: `ffmpeg_bin_path` is not set in `/home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui/was_suite_config.json` config file. Will attempt to use system ffmpeg binaries if available.
[2024-02-03 21:06] Installing collected packages: types-setuptools, requirements-parser [2024-02-20 07:58] WAS Node Suite: Finished. Loaded 211 nodes successfully.
[2024-02-03 21:06] Successfully installed requirements-parser-0.5.0 types-setuptools-69.0.0.20240125 [2024-02-20 07:58]
[2024-02-03 21:06] "Creativity takes courage." - Henri Matisse
[2024-02-03 21:06] Command executed successfully! [2024-02-20 07:58]
[2024-02-03 21:06] [comfy_mtb] | INFO -> loaded 53 nodes successfuly [2024-02-20 07:58]
[2024-02-03 21:06] [comfy_mtb] | INFO -> Some nodes (12) could not be loaded. This can be ignored, but go to http://127.0.0.1:8188/mtb if you want more information.
[2024-02-03 21:06] /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux/node_wrappers/dwpose.py:26: UserWarning: DWPose: Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device. DWPose might run very slowly
warnings.warn("DWPose: Onnxruntime not found or doesn't come with acceleration providers, switch to OpenCV with CPU device. DWPose might run very slowly")
[2024-02-03 21:06] ### Loading: ComfyUI-Manager (V2.7)
[2024-02-03 21:06] ### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)
[2024-02-03 21:06]
Import times for custom nodes: Import times for custom nodes:
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Logic [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUi_NNLatentUpscale [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Logic
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy-image-saver [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUi_NNLatentUpscale
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_IPAdapter_plus [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy-image-saver
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Custom-Scripts [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_IPAdapter_plus
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/Derfuu_ComfyUI_ModdedNodes [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/Derfuu_ComfyUI_ModdedNodes
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_essentials [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Custom-Scripts
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_FizzNodes [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Advanced-ControlNet [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_FizzNodes
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI_essentials
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rgthree-comfy [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Frame-Interpolation
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_controlnet_aux [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Advanced-ControlNet
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager [2024-02-20 07:58] 0.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved
[2024-02-03 21:06] 0.1 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes [2024-02-20 07:58] 0.1 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes
[2024-02-03 21:06] 0.9 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-comfyui [2024-02-20 07:58] 0.4 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-comfyui
[2024-02-03 21:06] 1.3 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui [2024-02-20 07:58] 0.5 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/was-node-suite-comfyui
[2024-02-03 21:06] 2.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb [2024-02-20 07:58] 0.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_segment_anything
[2024-02-03 21:06] 25.8 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack [2024-02-20 07:58] 0.9 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb
[2024-02-03 21:06] [2024-02-20 07:58] 12.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rembg-comfyui-node
[2024-02-03 21:06] Starting server [2024-02-20 07:58] 14.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
[2024-02-03 21:06] [2024-02-20 07:58]
[2024-02-03 21:06] To see the GUI go to: http://127.0.0.1:8188 [2024-02-20 07:58] Starting server
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json [2024-02-20 07:58]
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json [2024-02-20 07:58] To see the GUI go to: http://127.0.0.1:8188
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
@@ -1,5 +1,5 @@
# ComfyUI-Advanced-ControlNet # ComfyUI-Advanced-ControlNet
Nodes for scheduling ControlNet strength across timesteps and batched latents, as well as applying custom weights and attention masks. The ControlNet nodes here fully support sliding context sampling, like the one used in the [ComfyUI-AnimateDiff-Evolved](https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved) nodes. Currently supports ControlNets, T2IAdapters, ControlLoRAs, ControlLLLite, and SparseCtrls. Nodes for scheduling ControlNet strength across timesteps and batched latents, as well as applying custom weights and attention masks. The ControlNet nodes here fully support sliding context sampling, like the one used in the [ComfyUI-AnimateDiff-Evolved](https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved) nodes. Currently supports ControlNets, T2IAdapters, ControlLoRAs, ControlLLLite, SparseCtrls, and SVD-ControlNets.
Custom weights allow replication of the "My prompt is more important" feature of Auto1111's sd-webui ControlNet extension. Custom weights allow replication of the "My prompt is more important" feature of Auto1111's sd-webui ControlNet extension.
@@ -12,6 +12,8 @@ ControlNet preprocessors are available through [comfyui_controlnet_aux](https://
- ControlNet, T2IAdapter, and ControlLoRA support for sliding context windows. - ControlNet, T2IAdapter, and ControlLoRA support for sliding context windows.
- ControlLLLite support (requires model_optional to be passed into and out of Apply Advanced ControlNet node) - ControlLLLite support (requires model_optional to be passed into and out of Apply Advanced ControlNet node)
- SparseCtrl support - SparseCtrl support
- SVD-ControlNet support
- Stable Video Diffusion ControlNets trained by **CiaraRowles**: [Depth](https://huggingface.co/CiaraRowles/temporal-controlnet-depth-svd-v1/tree/main/controlnet), [Lineart](https://huggingface.co/CiaraRowles/temporal-controlnet-lineart-svd-v1/tree/main/controlnet)
## Table of Contents: ## Table of Contents:
- [Scheduling Explanation](#scheduling-explanation) - [Scheduling Explanation](#scheduling-explanation)
@@ -12,6 +12,7 @@ from model_patcher import ModelPatcher
from .control_sparsectrl import SparseControlNet, SparseCtrlMotionWrapper, SparseMethod, SparseSettings, SparseSpreadMethod, PreprocSparseRGBWrapper from .control_sparsectrl import SparseControlNet, SparseCtrlMotionWrapper, SparseMethod, SparseSettings, SparseSpreadMethod, PreprocSparseRGBWrapper
from .control_lllite import LLLiteModule, LLLitePatch from .control_lllite import LLLiteModule, LLLitePatch
from .control_svd import svd_unet_config_from_diffusers_unet, SVDControlNet, svd_unet_to_diffusers
from .utils import (AdvancedControlBase, TimestepKeyframeGroup, LatentKeyframeGroup, ControlWeightType, ControlWeights, WeightTypeException, from .utils import (AdvancedControlBase, TimestepKeyframeGroup, LatentKeyframeGroup, ControlWeightType, ControlWeights, WeightTypeException,
manual_cast_clean_groupnorm, disable_weight_init_clean_groupnorm, prepare_mask_batch, get_properly_arranged_t2i_weights, load_torch_file_with_dict_factory) manual_cast_clean_groupnorm, disable_weight_init_clean_groupnorm, prepare_mask_batch, get_properly_arranged_t2i_weights, load_torch_file_with_dict_factory)
from .logger import logger from .logger import logger
@@ -64,7 +65,7 @@ class ControlNetAdvanced(ControlNet, AdvancedControlBase):
# prepare mask_cond_hint # prepare mask_cond_hint
self.prepare_mask_cond_hint(x_noisy=x_noisy, t=t, cond=cond, batched_number=batched_number, dtype=dtype) self.prepare_mask_cond_hint(x_noisy=x_noisy, t=t, cond=cond, batched_number=batched_number, dtype=dtype)
context = cond['c_crossattn'] context = cond.get('crossattn_controlnet', cond['c_crossattn'])
# uses 'y' in new ComfyUI update # uses 'y' in new ComfyUI update
y = cond.get('y', None) y = cond.get('y', None)
if y is None: # TODO: remove this in the future since no longer used by newest ComfyUI if y is None: # TODO: remove this in the future since no longer used by newest ComfyUI
@@ -168,6 +169,71 @@ class ControlLoraAdvanced(ControlLora, AdvancedControlBase):
global_average_pooling=v.global_average_pooling, device=v.device) global_average_pooling=v.global_average_pooling, device=v.device)
class SVDControlNetAdvanced(ControlNetAdvanced):
def __init__(self, control_model: SVDControlNet, timestep_keyframes: TimestepKeyframeGroup, global_average_pooling=False, device=None, load_device=None, manual_cast_dtype=None):
super().__init__(control_model=control_model, timestep_keyframes=timestep_keyframes, global_average_pooling=global_average_pooling, device=device, load_device=load_device, manual_cast_dtype=manual_cast_dtype)
def set_cond_hint(self, *args, **kwargs):
to_return = super().set_cond_hint(*args, **kwargs)
# cond hint for SVD-ControlNet needs to be scaled between (-1, 1) instead of (0, 1)
self.cond_hint_original = self.cond_hint_original * 2.0 - 1.0
return to_return
def get_control_advanced(self, x_noisy, t, cond, batched_number):
control_prev = None
if self.previous_controlnet is not None:
control_prev = self.previous_controlnet.get_control(x_noisy, t, cond, batched_number)
if self.timestep_range is not None:
if t[0] > self.timestep_range[0] or t[0] < self.timestep_range[1]:
if control_prev is not None:
return control_prev
else:
return None
dtype = self.control_model.dtype
if self.manual_cast_dtype is not None:
dtype = self.manual_cast_dtype
output_dtype = x_noisy.dtype
# make cond_hint appropriate dimensions
# TODO: change this to not require cond_hint upscaling every step when self.sub_idxs are present
if self.sub_idxs is not None or self.cond_hint is None or x_noisy.shape[2] * 8 != self.cond_hint.shape[2] or x_noisy.shape[3] * 8 != self.cond_hint.shape[3]:
if self.cond_hint is not None:
del self.cond_hint
self.cond_hint = None
# if self.cond_hint_original length greater or equal to real latent count, subdivide it before scaling
if self.sub_idxs is not None and self.cond_hint_original.size(0) >= self.full_latent_length:
self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original[self.sub_idxs], x_noisy.shape[3] * 8, x_noisy.shape[2] * 8, 'nearest-exact', "center").to(dtype).to(self.device)
else:
self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original, x_noisy.shape[3] * 8, x_noisy.shape[2] * 8, 'nearest-exact', "center").to(dtype).to(self.device)
if x_noisy.shape[0] != self.cond_hint.shape[0]:
self.cond_hint = broadcast_image_to(self.cond_hint, x_noisy.shape[0], batched_number)
# prepare mask_cond_hint
self.prepare_mask_cond_hint(x_noisy=x_noisy, t=t, cond=cond, batched_number=batched_number, dtype=dtype)
context = cond.get('crossattn_controlnet', cond['c_crossattn'])
# uses 'y' in new ComfyUI update
y = cond.get('y', None)
if y is not None:
y = y.to(dtype)
timestep = self.model_sampling_current.timestep(t)
x_noisy = self.model_sampling_current.calculate_input(t, x_noisy)
# concat c_concat if exists (should exist for SVD), doubling channels to 8
if cond.get('c_concat', None) is not None:
x_noisy = torch.cat([x_noisy] + [cond['c_concat']], dim=1)
control = self.control_model(x=x_noisy.to(dtype), hint=self.cond_hint, timesteps=timestep.float(), context=context.to(dtype), y=y, cond=cond)
return self.control_merge(None, control, control_prev, output_dtype)
def copy(self):
c = SVDControlNetAdvanced(self.control_model, self.timestep_keyframes, global_average_pooling=self.global_average_pooling, load_device=self.load_device, manual_cast_dtype=self.manual_cast_dtype)
self.copy_to(c)
self.copy_to_advanced(c)
return c
class SparseCtrlAdvanced(ControlNetAdvanced): class SparseCtrlAdvanced(ControlNetAdvanced):
def __init__(self, control_model, timestep_keyframes: TimestepKeyframeGroup, sparse_settings: SparseSettings=None, global_average_pooling=False, device=None, load_device=None, manual_cast_dtype=None): def __init__(self, control_model, timestep_keyframes: TimestepKeyframeGroup, sparse_settings: SparseSettings=None, global_average_pooling=False, device=None, load_device=None, manual_cast_dtype=None):
super().__init__(control_model=control_model, timestep_keyframes=timestep_keyframes, global_average_pooling=global_average_pooling, device=device, load_device=load_device, manual_cast_dtype=manual_cast_dtype) super().__init__(control_model=control_model, timestep_keyframes=timestep_keyframes, global_average_pooling=global_average_pooling, device=device, load_device=load_device, manual_cast_dtype=manual_cast_dtype)
@@ -282,27 +348,19 @@ class SparseCtrlAdvanced(ControlNetAdvanced):
return c return c
class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase): class ReferenceAdvanced(ControlBase, AdvancedControlBase):
# This ControlNet is more of an attention patch than a traditional controlnet def __init__(self, timestep_keyframes: TimestepKeyframeGroup, device=None):
def __init__(self, patch: LLLitePatch, timestep_keyframes: TimestepKeyframeGroup, device=None):
super().__init__(device) super().__init__(device)
AdvancedControlBase.__init__(self, super(), timestep_keyframes=timestep_keyframes, weights_default=ControlWeights.controllllite(), require_model=True) AdvancedControlBase.__init__(self, super(), timestep_keyframes=timestep_keyframes, weights_default=ControlWeights.controllllite(), require_model=True)
self.patch = patch.clone_with_control(self) # TODO: save attn patches here
def patch_model(self, model: ModelPatcher): def patch_model(self, model: ModelPatcher):
model.set_model_attn1_patch(self.patch) # TODO: do model patching here
model.set_model_attn2_patch(self.patch) pass
def set_cond_hint(self, *args, **kwargs):
to_return = super().set_cond_hint(*args, **kwargs)
# cond hint for LLLite needs to be scaled between (-1, 1) instead of (0, 1)
self.cond_hint_original = self.cond_hint_original * 2.0 - 1.0
return to_return
def pre_run_advanced(self, *args, **kwargs): def pre_run_advanced(self, *args, **kwargs):
AdvancedControlBase.pre_run_advanced(self, *args, **kwargs) AdvancedControlBase.pre_run_advanced(self, *args, **kwargs)
self.patch.set_control(self) # TODO: set control on patches
#logger.warn(f"in pre_run_advanced: {id(self)}")
def get_control_advanced(self, x_noisy: Tensor, t, cond, batched_number: int): def get_control_advanced(self, x_noisy: Tensor, t, cond, batched_number: int):
# normal ControlNet stuff # normal ControlNet stuff
@@ -332,24 +390,121 @@ class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase):
# done preparing; model patches will take care of everything now. # done preparing; model patches will take care of everything now.
# return normal controlnet stuff # return normal controlnet stuff
return control_prev return control_prev
def cleanup_advanced(self):
super().cleanup_advanced()
# TODO: cleanup patches here
def copy(self):
c = ReferenceAdvanced(self.timestep_keyframes)
self.copy_to(c)
self.copy_to_advanced(c)
return c
class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase):
# This ControlNet is more of an attention patch than a traditional controlnet
def __init__(self, patch_attn1: LLLitePatch, patch_attn2: LLLitePatch, timestep_keyframes: TimestepKeyframeGroup, device=None):
super().__init__(device)
AdvancedControlBase.__init__(self, super(), timestep_keyframes=timestep_keyframes, weights_default=ControlWeights.controllllite(), require_model=True)
self.patch_attn1 = patch_attn1.set_control(self)
self.patch_attn2 = patch_attn2.set_control(self)
self.latent_dims_div2 = None
self.latent_dims_div4 = None
def patch_model(self, model: ModelPatcher):
model.set_model_attn1_patch(self.patch_attn1)
model.set_model_attn2_patch(self.patch_attn2)
def set_cond_hint(self, *args, **kwargs):
to_return = super().set_cond_hint(*args, **kwargs)
# cond hint for LLLite needs to be scaled between (-1, 1) instead of (0, 1)
self.cond_hint_original = self.cond_hint_original * 2.0 - 1.0
return to_return
def pre_run_advanced(self, *args, **kwargs):
AdvancedControlBase.pre_run_advanced(self, *args, **kwargs)
#logger.error(f"in cn: {id(self.patch_attn1)},{id(self.patch_attn2)}")
self.patch_attn1.set_control(self)
self.patch_attn2.set_control(self)
#logger.warn(f"in pre_run_advanced: {id(self)}")
def get_control_advanced(self, x_noisy: Tensor, t, cond, batched_number: int):
# normal ControlNet stuff
control_prev = None
if self.previous_controlnet is not None:
control_prev = self.previous_controlnet.get_control(x_noisy, t, cond, batched_number)
if self.timestep_range is not None:
if t[0] > self.timestep_range[0] or t[0] < self.timestep_range[1]:
return control_prev
dtype = x_noisy.dtype
# prepare cond_hint
if self.sub_idxs is not None or self.cond_hint is None or x_noisy.shape[2] * 8 != self.cond_hint.shape[2] or x_noisy.shape[3] * 8 != self.cond_hint.shape[3]:
if self.cond_hint is not None:
del self.cond_hint
self.cond_hint = None
# if self.cond_hint_original length greater or equal to real latent count, subdivide it before scaling
if self.sub_idxs is not None and self.cond_hint_original.size(0) >= self.full_latent_length:
self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original[self.sub_idxs], x_noisy.shape[3] * 8, x_noisy.shape[2] * 8, 'nearest-exact', "center").to(dtype).to(self.device)
else:
self.cond_hint = comfy.utils.common_upscale(self.cond_hint_original, x_noisy.shape[3] * 8, x_noisy.shape[2] * 8, 'nearest-exact', "center").to(dtype).to(self.device)
if x_noisy.shape[0] != self.cond_hint.shape[0]:
self.cond_hint = broadcast_image_to(self.cond_hint, x_noisy.shape[0], batched_number)
# some special logic here compared to other controlnets:
# * The cond_emb in attn patches will divide latent dims by 2 or 4, integer
# * Due to this loss, the cond_emb will become smaller than x input if latent dims are not divisble by 2 or 4
divisible_by_2_h = x_noisy.shape[2]%2==0
divisible_by_2_w = x_noisy.shape[3]%2==0
if not (divisible_by_2_h and divisible_by_2_w):
#logger.warn(f"{x_noisy.shape} not divisible by 2!")
new_h = (x_noisy.shape[2]//2)*2
new_w = (x_noisy.shape[3]//2)*2
if not divisible_by_2_h:
new_h += 2
if not divisible_by_2_w:
new_w += 2
self.latent_dims_div2 = (new_h, new_w)
divisible_by_4_h = x_noisy.shape[2]%4==0
divisible_by_4_w = x_noisy.shape[3]%4==0
if not (divisible_by_4_h and divisible_by_4_w):
#logger.warn(f"{x_noisy.shape} not divisible by 4!")
new_h = (x_noisy.shape[2]//4)*4
new_w = (x_noisy.shape[3]//4)*4
if not divisible_by_4_h:
new_h += 4
if not divisible_by_4_w:
new_w += 4
self.latent_dims_div4 = (new_h, new_w)
# prepare mask
self.prepare_mask_cond_hint(x_noisy=x_noisy, t=t, cond=cond, batched_number=batched_number)
# done preparing; model patches will take care of everything now.
# return normal controlnet stuff
return control_prev
def cleanup_advanced(self): def cleanup_advanced(self):
super().cleanup_advanced() super().cleanup_advanced()
self.patch.cleanup() self.patch_attn1.cleanup()
self.patch_attn2.cleanup()
self.latent_dims_div2 = None
self.latent_dims_div4 = None
def copy(self): def copy(self):
c = ControlLLLiteAdvanced(self.patch, self.timestep_keyframes) c = ControlLLLiteAdvanced(self.patch_attn1, self.patch_attn2, self.timestep_keyframes)
self.copy_to(c) self.copy_to(c)
self.copy_to_advanced(c) self.copy_to_advanced(c)
return c return c
# deepcopy needs to properly keep track of objects to work between model.clone calls! # deepcopy needs to properly keep track of objects to work between model.clone calls!
def __deepcopy__(self, *args, **kwargs): # def __deepcopy__(self, *args, **kwargs):
return self # self.cleanup_advanced()
# return self
# def get_models(self): # def get_models(self):
# # get_models is called once at the start of every KSampler run - use to reset already_patched status # # get_models is called once at the start of every KSampler run - use to reset already_patched status
# out = super().get_models() # out = super().get_models()
# logger.error(f"in get_models! {id(self)}")
# return out # return out
@@ -360,8 +515,9 @@ def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, mo
controlnet_type = ControlWeightType.DEFAULT controlnet_type = ControlWeightType.DEFAULT
has_controlnet_key = False has_controlnet_key = False
has_motion_modules_key = False has_motion_modules_key = False
has_temporal_res_block_key = False
for key in controlnet_data: for key in controlnet_data:
# LLLLite check # LLLite check
if "lllite" in key: if "lllite" in key:
controlnet_type = ControlWeightType.CONTROLLLLITE controlnet_type = ControlWeightType.CONTROLLLLITE
break break
@@ -370,14 +526,23 @@ def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, mo
has_motion_modules_key = True has_motion_modules_key = True
elif "controlnet" in key: elif "controlnet" in key:
has_controlnet_key = True has_controlnet_key = True
# SVD-ControlNet check
elif "temporal_res_block" in key:
has_temporal_res_block_key = True
if has_controlnet_key and has_motion_modules_key: if has_controlnet_key and has_motion_modules_key:
controlnet_type = ControlWeightType.SPARSECTRL controlnet_type = ControlWeightType.SPARSECTRL
elif has_controlnet_key and has_temporal_res_block_key:
controlnet_type = ControlWeightType.SVD_CONTROLNET
if controlnet_type != ControlWeightType.DEFAULT: if controlnet_type != ControlWeightType.DEFAULT:
if controlnet_type == ControlWeightType.CONTROLLLLITE: if controlnet_type == ControlWeightType.CONTROLLLLITE:
control = load_controllllite(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe) control = load_controllllite(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe)
elif controlnet_type == ControlWeightType.SPARSECTRL: elif controlnet_type == ControlWeightType.SPARSECTRL:
control = load_sparsectrl(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe, model=model) control = load_sparsectrl(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe, model=model)
elif controlnet_type == ControlWeightType.SVD_CONTROLNET:
control = load_svdcontrolnet(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe)
#raise Exception(f"SVD-ControlNet is not supported yet!")
#control = comfy_cn.load_controlnet(ckpt_path, model=model)
# otherwise, load vanilla ControlNet # otherwise, load vanilla ControlNet
else: else:
try: try:
@@ -602,6 +767,129 @@ def load_controllllite(ckpt_path: str, controlnet_data: dict[str, Tensor]=None,
#logger.info(f"loaded {ckpt_path} successfully, {len(modules)} modules") #logger.info(f"loaded {ckpt_path} successfully, {len(modules)} modules")
patch = LLLitePatch(modules=modules) patch_attn1 = LLLitePatch(modules=modules, patch_type=LLLitePatch.ATTN1)
control = ControlLLLiteAdvanced(patch=patch, timestep_keyframes=timestep_keyframe) patch_attn2 = LLLitePatch(modules=modules, patch_type=LLLitePatch.ATTN2)
control = ControlLLLiteAdvanced(patch_attn1=patch_attn1, patch_attn2=patch_attn2, timestep_keyframes=timestep_keyframe)
return control return control
def load_svdcontrolnet(ckpt_path: str, controlnet_data: dict[str, Tensor]=None, timestep_keyframe: TimestepKeyframeGroup=None, model=None):
if controlnet_data is None:
controlnet_data = comfy.utils.load_torch_file(ckpt_path, safe_load=True)
controlnet_config = None
if "controlnet_cond_embedding.conv_in.weight" in controlnet_data: #diffusers format
unet_dtype = comfy.model_management.unet_dtype()
controlnet_config = svd_unet_config_from_diffusers_unet(controlnet_data, unet_dtype)
diffusers_keys = svd_unet_to_diffusers(controlnet_config)
diffusers_keys["controlnet_mid_block.weight"] = "middle_block_out.0.weight"
diffusers_keys["controlnet_mid_block.bias"] = "middle_block_out.0.bias"
count = 0
loop = True
while loop:
suffix = [".weight", ".bias"]
for s in suffix:
k_in = "controlnet_down_blocks.{}{}".format(count, s)
k_out = "zero_convs.{}.0{}".format(count, s)
if k_in not in controlnet_data:
loop = False
break
diffusers_keys[k_in] = k_out
count += 1
count = 0
loop = True
while loop:
suffix = [".weight", ".bias"]
for s in suffix:
if count == 0:
k_in = "controlnet_cond_embedding.conv_in{}".format(s)
else:
k_in = "controlnet_cond_embedding.blocks.{}{}".format(count - 1, s)
k_out = "input_hint_block.{}{}".format(count * 2, s)
if k_in not in controlnet_data:
k_in = "controlnet_cond_embedding.conv_out{}".format(s)
loop = False
diffusers_keys[k_in] = k_out
count += 1
new_sd = {}
for k in diffusers_keys:
if k in controlnet_data:
new_sd[diffusers_keys[k]] = controlnet_data.pop(k)
leftover_keys = controlnet_data.keys()
if len(leftover_keys) > 0:
spatial_leftover_keys = []
temporal_leftover_keys = []
other_leftover_keys = []
for key in leftover_keys:
if "spatial" in key:
spatial_leftover_keys.append(key)
elif "temporal" in key:
temporal_leftover_keys.append(key)
else:
other_leftover_keys.append(key)
logger.warn(f"spatial_leftover_keys ({len(spatial_leftover_keys)}): {spatial_leftover_keys}")
logger.warn(f"temporal_leftover_keys ({len(temporal_leftover_keys)}): {temporal_leftover_keys}")
logger.warn(f"other_leftover_keys ({len(other_leftover_keys)}): {other_leftover_keys}")
#print("leftover keys:", leftover_keys)
controlnet_data = new_sd
pth_key = 'control_model.zero_convs.0.0.weight'
pth = False
key = 'zero_convs.0.0.weight'
if pth_key in controlnet_data:
pth = True
key = pth_key
prefix = "control_model."
elif key in controlnet_data:
prefix = ""
else:
raise ValueError("The provided model is not a valid SVD-ControlNet model! [ErrorCode: MUSTARD]")
if controlnet_config is None:
unet_dtype = comfy.model_management.unet_dtype()
controlnet_config = comfy.model_detection.model_config_from_unet(controlnet_data, prefix, unet_dtype, True).unet_config
load_device = comfy.model_management.get_torch_device()
manual_cast_dtype = comfy.model_management.unet_manual_cast(unet_dtype, load_device)
if manual_cast_dtype is not None:
controlnet_config["operations"] = comfy.ops.manual_cast
controlnet_config.pop("out_channels")
controlnet_config["hint_channels"] = controlnet_data["{}input_hint_block.0.weight".format(prefix)].shape[1]
control_model = SVDControlNet(**controlnet_config)
if pth:
if 'difference' in controlnet_data:
if model is not None:
comfy.model_management.load_models_gpu([model])
model_sd = model.model_state_dict()
for x in controlnet_data:
c_m = "control_model."
if x.startswith(c_m):
sd_key = "diffusion_model.{}".format(x[len(c_m):])
if sd_key in model_sd:
cd = controlnet_data[x]
cd += model_sd[sd_key].type(cd.dtype).to(cd.device)
else:
print("WARNING: Loaded a diff controlnet without a model. It will very likely not work.")
class WeightsLoader(torch.nn.Module):
pass
w = WeightsLoader()
w.control_model = control_model
missing, unexpected = w.load_state_dict(controlnet_data, strict=False)
else:
missing, unexpected = control_model.load_state_dict(controlnet_data, strict=False)
if len(missing) > 0 or len(unexpected) > 0:
logger.info(f"SVD-ControlNet: {missing}, {unexpected}")
global_average_pooling = False
filename = os.path.splitext(ckpt_path)[0]
if filename.endswith("_shuffle") or filename.endswith("_shuffle_fp16"): #TODO: smarter way of enabling global_average_pooling
global_average_pooling = True
control = SVDControlNetAdvanced(control_model, timestep_keyframes=timestep_keyframe, global_average_pooling=global_average_pooling, load_device=load_device, manual_cast_dtype=manual_cast_dtype)
return control
@@ -11,7 +11,7 @@ import comfy.utils
from comfy.controlnet import ControlBase from comfy.controlnet import ControlBase
from .logger import logger from .logger import logger
from .utils import AdvancedControlBase, prepare_mask_batch from .utils import AdvancedControlBase, deepcopy_with_sharing, prepare_mask_batch
def extra_options_to_module_prefix(extra_options): def extra_options_to_module_prefix(extra_options):
@@ -38,12 +38,16 @@ def extra_options_to_module_prefix(extra_options):
class LLLitePatch: class LLLitePatch:
def __init__(self, modules: dict[str, 'LLLiteModule'], control: Union[AdvancedControlBase, ControlBase]=None): ATTN1 = "attn1"
ATTN2 = "attn2"
def __init__(self, modules: dict[str, 'LLLiteModule'], patch_type: str, control: Union[AdvancedControlBase, ControlBase]=None):
self.modules = modules self.modules = modules
self.control = control self.control = control
self.patch_type = patch_type
#logger.error(f"create LLLitePatch: {id(self)},{control}") #logger.error(f"create LLLitePatch: {id(self)},{control}")
def __call__(self, q, k, v, extra_options): def __call__(self, q, k, v, extra_options):
#logger.error(f"in __call__: {id(self)}")
# determine if have anything to run # determine if have anything to run
if self.control.timestep_range is not None: if self.control.timestep_range is not None:
# it turns out comparing single-value tensors to floats is extremely slow # it turns out comparing single-value tensors to floats is extremely slow
@@ -78,21 +82,37 @@ class LLLitePatch:
self.modules[d] = self.modules[d].to(device) self.modules[d] = self.modules[d].to(device)
return self return self
def set_control(self, control: Union[AdvancedControlBase, ControlBase]): def set_control(self, control: Union[AdvancedControlBase, ControlBase]) -> 'LLLitePatch':
self.control = control self.control = control
#logger.error(f"set control for LLLitePatch: {id(self)},{id(control)}") return self
#logger.error(f"set control for LLLitePatch: {id(self)}, cn: {id(control)}")
def clone_with_control(self, control: AdvancedControlBase): def clone_with_control(self, control: AdvancedControlBase):
#logger.error(f"clone-set control for LLLitePatch: {id(self)},{id(control)}") #logger.error(f"clone-set control for LLLitePatch: {id(self)},{id(control)}")
return LLLitePatch(self.modules, control) return LLLitePatch(self.modules, self.patch_type, control)
def cleanup(self): def cleanup(self):
#del self.control #total_cleaned = 0
#self.control = None
for module in self.modules.values(): for module in self.modules.values():
module.cleanup() module.cleanup()
# total_cleaned += 1
#logger.info(f"cleaned modules: {total_cleaned}, {id(self)}")
#logger.error(f"cleanup LLLitePatch: {id(self)}") #logger.error(f"cleanup LLLitePatch: {id(self)}")
# make sure deepcopy does not copy control, and deepcopied LLLitePatch should be assigned to control
def __deepcopy__(self, memo):
self.cleanup()
to_return: LLLitePatch = deepcopy_with_sharing(self, shared_attribute_names = ['control'], memo=memo)
#logger.warn(f"patch {id(self)} turned into {id(to_return)}")
try:
if self.patch_type == self.ATTN1:
to_return.control.patch_attn1 = to_return
elif self.patch_type == self.ATTN2:
to_return.control.patch_attn2 = to_return
except Exception:
pass
return to_return
# TODO: use comfy.ops to support fp8 properly # TODO: use comfy.ops to support fp8 properly
class LLLiteModule(torch.nn.Module): class LLLiteModule(torch.nn.Module):
@@ -159,6 +179,7 @@ class LLLiteModule(torch.nn.Module):
self.prev_sub_idxs = None self.prev_sub_idxs = None
def cleanup(self): def cleanup(self):
del self.cond_emb
self.cond_emb = None self.cond_emb = None
self.cx_shape = None self.cx_shape = None
self.prev_batch = 0 self.prev_batch = 0
@@ -167,9 +188,15 @@ class LLLiteModule(torch.nn.Module):
def forward(self, x: Tensor, control: Union[AdvancedControlBase, ControlBase]): def forward(self, x: Tensor, control: Union[AdvancedControlBase, ControlBase]):
mask = None mask = None
mask_tk = None mask_tk = None
#logger.info(x.shape)
if self.cond_emb is None or control.sub_idxs != self.prev_sub_idxs or x.shape[0] != self.prev_batch: if self.cond_emb is None or control.sub_idxs != self.prev_sub_idxs or x.shape[0] != self.prev_batch:
# print(f"cond_emb is None, {self.name}") # print(f"cond_emb is None, {self.name}")
cx = self.conditioning1(control.cond_hint.to(x.device, dtype=x.dtype)) cond_hint = control.cond_hint.to(x.device, dtype=x.dtype)
if control.latent_dims_div2 is not None and x.shape[-1] != 1280:
cond_hint = comfy.utils.common_upscale(cond_hint, control.latent_dims_div2[0] * 8, control.latent_dims_div2[1] * 8, 'nearest-exact', "center").to(x.device, dtype=x.dtype)
elif control.latent_dims_div4 is not None and x.shape[-1] == 1280:
cond_hint = comfy.utils.common_upscale(cond_hint, control.latent_dims_div4[0] * 8, control.latent_dims_div4[1] * 8, 'nearest-exact', "center").to(x.device, dtype=x.dtype)
cx = self.conditioning1(cond_hint)
self.cx_shape = cx.shape self.cx_shape = cx.shape
if not self.is_conv2d: if not self.is_conv2d:
# reshape / b,c,h,w -> b,h*w,c # reshape / b,c,h,w -> b,h*w,c
@@ -211,6 +238,7 @@ class LLLiteModule(torch.nn.Module):
elif mask_tk is not None: elif mask_tk is not None:
mask = mask * mask_tk mask = mask * mask_tk
#logger.info(f"cs: {cx.shape}, x: {x.shape}, is_conv2d: {self.is_conv2d}")
cx = torch.cat([cx, self.down(x)], dim=1 if self.is_conv2d else 2) cx = torch.cat([cx, self.down(x)], dim=1 if self.is_conv2d else 2)
cx = self.mid(cx) cx = self.mid(cx)
cx = self.up(cx) cx = self.up(cx)
@@ -4,7 +4,7 @@ import torch
import numpy as np import numpy as np
from PIL import Image, ImageOps from PIL import Image, ImageOps
from .utils import ControlWeights, LatentKeyframeGroup, TimestepKeyframeGroup, TimestepKeyframe from .utils import ControlWeights, LatentKeyframeGroup, TimestepKeyframeGroup, TimestepKeyframe, BIGMAX
from .logger import logger from .logger import logger
@@ -16,8 +16,8 @@ class LoadImagesFromDirectory:
"directory": ("STRING", {"default": ""}), "directory": ("STRING", {"default": ""}),
}, },
"optional": { "optional": {
"image_load_cap": ("INT", {"default": 0, "min": 0, "step": 1}), "image_load_cap": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
"start_index": ("INT", {"default": 0, "min": 0, "step": 1}), "start_index": ("INT", {"default": 0, "min": 0, "max": BIGMAX, "step": 1}),
} }
} }
@@ -2,7 +2,7 @@ from typing import Union
import numpy as np import numpy as np
from collections.abc import Iterable from collections.abc import Iterable
from .utils import LatentKeyframe, LatentKeyframeGroup from .utils import LatentKeyframe, LatentKeyframeGroup, BIGMIN, BIGMAX
from .utils import StrengthInterpolation as SI from .utils import StrengthInterpolation as SI
from .logger import logger from .logger import logger
@@ -12,7 +12,7 @@ class LatentKeyframeNode:
def INPUT_TYPES(s): def INPUT_TYPES(s):
return { return {
"required": { "required": {
"batch_index": ("INT", {"default": 0, "min": -1000, "max": 1000, "step": 1}), "batch_index": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX, "step": 1}),
"strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ), "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ),
}, },
"optional": { "optional": {
@@ -163,8 +163,8 @@ class LatentKeyframeInterpolationNode:
def INPUT_TYPES(s): def INPUT_TYPES(s):
return { return {
"required": { "required": {
"batch_index_from": ("INT", {"default": 0, "min": -10000, "max": 10000, "step": 1}), "batch_index_from": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX, "step": 1}),
"batch_index_to_excl": ("INT", {"default": 0, "min": -10000, "max": 10000, "step": 1}), "batch_index_to_excl": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX, "step": 1}),
"strength_from": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ), "strength_from": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ),
"strength_to": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ), "strength_to": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}, ),
"interpolation": ([SI.LINEAR, SI.EASE_IN, SI.EASE_OUT, SI.EASE_IN_OUT], ), "interpolation": ([SI.LINEAR, SI.EASE_IN, SI.EASE_OUT, SI.EASE_IN_OUT], ),
@@ -3,6 +3,7 @@ from torch import Tensor
import folder_paths import folder_paths
from nodes import VAEEncode from nodes import VAEEncode
import comfy.utils import comfy.utils
from comfy.sd import VAE
from .utils import TimestepKeyframeGroup from .utils import TimestepKeyframeGroup
from .control_sparsectrl import SparseMethod, SparseIndexMethod, SparseSettings, SparseSpreadMethod, PreprocSparseRGBWrapper from .control_sparsectrl import SparseMethod, SparseIndexMethod, SparseSettings, SparseSpreadMethod, PreprocSparseRGBWrapper
@@ -148,12 +149,15 @@ class RgbSparseCtrlPreprocessor:
CATEGORY = "Adv-ControlNet 🛂🅐🅒🅝/SparseCtrl/preprocess" CATEGORY = "Adv-ControlNet 🛂🅐🅒🅝/SparseCtrl/preprocess"
def preprocess_images(self, vae, image: Tensor, latent_size: Tensor): def preprocess_images(self, vae: VAE, image: Tensor, latent_size: Tensor):
# first, resize image to match latents # first, resize image to match latents
image = image.movedim(-1,1) image = image.movedim(-1,1)
image = comfy.utils.common_upscale(image, latent_size["samples"].shape[3] * 8, latent_size["samples"].shape[2] * 8, 'nearest-exact', "center") image = comfy.utils.common_upscale(image, latent_size["samples"].shape[3] * 8, latent_size["samples"].shape[2] * 8, 'nearest-exact', "center")
image = image.movedim(1,-1) image = image.movedim(1,-1)
# then, vae encode # then, vae encode
image = VAEEncode.vae_encode_crop_pixels(image) try:
image = vae.vae_encode_crop_pixels(image)
except Exception:
image = VAEEncode.vae_encode_crop_pixels(image)
encoded = vae.encode(image[:,:,:,:3]) encoded = vae.encode(image[:,:,:,:3])
return (PreprocSparseRGBWrapper(condhint=encoded),) return (PreprocSparseRGBWrapper(condhint=encoded),)
@@ -1,3 +1,4 @@
from copy import deepcopy
from typing import Callable, Union from typing import Callable, Union
import torch import torch
from torch import Tensor from torch import Tensor
@@ -10,6 +11,9 @@ from comfy.model_patcher import ModelPatcher
from .logger import logger from .logger import logger
BIGMIN = -(2**63-1)
BIGMAX = (2**63-1)
def load_torch_file_with_dict_factory(controlnet_data: dict[str, Tensor], orig_load_torch_file: Callable): def load_torch_file_with_dict_factory(controlnet_data: dict[str, Tensor], orig_load_torch_file: Callable):
def load_torch_file_with_dict(*args, **kwargs): def load_torch_file_with_dict(*args, **kwargs):
# immediately restore load_torch_file to original version # immediately restore load_torch_file to original version
@@ -34,6 +38,7 @@ class ControlWeightType:
CONTROLNET = "controlnet" CONTROLNET = "controlnet"
CONTROLLORA = "controllora" CONTROLLORA = "controllora"
CONTROLLLLITE = "controllllite" CONTROLLLLITE = "controllllite"
SVD_CONTROLNET = "svd_controlnet"
SPARSECTRL = "sparsectrl" SPARSECTRL = "sparsectrl"
@@ -259,6 +264,44 @@ def linear_conversion(x, x_min=0.0, x_max=1.0, new_min=0.0, new_max=1.0):
return (((x - x_min)/(x_max - x_min)) * (new_max - new_min)) + new_min return (((x - x_min)/(x_max - x_min)) * (new_max - new_min)) + new_min
# from https://stackoverflow.com/a/24621200
def deepcopy_with_sharing(obj, shared_attribute_names, memo=None):
'''
Deepcopy an object, except for a given list of attributes, which should
be shared between the original object and its copy.
obj is some object
shared_attribute_names: A list of strings identifying the attributes that
should be shared between the original and its copy.
memo is the dictionary passed into __deepcopy__. Ignore this argument if
not calling from within __deepcopy__.
'''
assert isinstance(shared_attribute_names, (list, tuple))
shared_attributes = {k: getattr(obj, k) for k in shared_attribute_names}
if hasattr(obj, '__deepcopy__'):
# Do hack to prevent infinite recursion in call to deepcopy
deepcopy_method = obj.__deepcopy__
obj.__deepcopy__ = None
for attr in shared_attribute_names:
del obj.__dict__[attr]
clone = deepcopy(obj)
for attr, val in shared_attributes.items():
setattr(obj, attr, val)
setattr(clone, attr, val)
if hasattr(obj, '__deepcopy__'):
# Undo hack
obj.__deepcopy__ = deepcopy_method
del clone.__deepcopy__
return clone
class WeightTypeException(TypeError): class WeightTypeException(TypeError):
"Raised when weight not compatible with AdvancedControlBase object" "Raised when weight not compatible with AdvancedControlBase object"
pass pass
@@ -46,7 +46,8 @@ NOTE: you can also use custom locations for models/motion loras by making use of
- Infinite animation length support via sliding context windows across whole unet (Context Options) and/or within motion module (View Options) - Infinite animation length support via sliding context windows across whole unet (Context Options) and/or within motion module (View Options)
- Scheduling Context Options to change across different points in the sampling process - Scheduling Context Options to change across different points in the sampling process
- FreeInit and FreeNoise support (FreeInit is under iteration opts, FreeNoise is in SampleSettings' noise_type dropdown) - FreeInit and FreeNoise support (FreeInit is under iteration opts, FreeNoise is in SampleSettings' noise_type dropdown)
- Mixable Motion LoRAs from [original AnimateDiff repository](https://github.com/guoyww/animatediff/) implemented. Caveat: only really work on v2-based motion models like ```mm_sd_v15_v2```, ```mm-p_0.5.pth```, and ```mm-p_0.75.pth``` - Mixable Motion LoRAs from [original AnimateDiff repository](https://github.com/guoyww/animatediff/) implemented. Caveat: the original loras really only work on v2-based motion models like ```mm_sd_v15_v2```, ```mm-p_0.5.pth```, and ```mm-p_0.75.pth```.
- UPDATE: New motion LoRAs without the v2 limitation can now be trained via the [AnimateDiff-MotionDirector repo](https://github.com/ExponentialML/AnimateDiff-MotionDirector). Shoutout to ExponentialML for implementing MotionDirector for AnimateDiff purposes!
- Prompt travel using BatchPromptSchedule node from [ComfyUI_FizzNodes](https://github.com/FizzleDorf/ComfyUI_FizzNodes) - Prompt travel using BatchPromptSchedule node from [ComfyUI_FizzNodes](https://github.com/FizzleDorf/ComfyUI_FizzNodes)
- Scale and Effect multival inputs to control motion amount and motion model influence on generation. - Scale and Effect multival inputs to control motion amount and motion model influence on generation.
- Can be float, list of floats, or masks - Can be float, list of floats, or masks
@@ -57,15 +58,17 @@ NOTE: you can also use custom locations for models/motion loras by making use of
- NOTE: You will need to use ```autoselect``` or ```linear (HotshotXL/default)``` beta_schedule, the sweetspot for context_length or total frames (when not using context) is 8 frames, and you will need to use an SDXL checkpoint. - NOTE: You will need to use ```autoselect``` or ```linear (HotshotXL/default)``` beta_schedule, the sweetspot for context_length or total frames (when not using context) is 8 frames, and you will need to use an SDXL checkpoint.
- AnimateDiff-SDXL support, with corresponding model. Currently, a beta version is out, which you can find info about at [AnimateDiff](https://github.com/guoyww/AnimateDiff/). - AnimateDiff-SDXL support, with corresponding model. Currently, a beta version is out, which you can find info about at [AnimateDiff](https://github.com/guoyww/AnimateDiff/).
- NOTE: You will need to use ```autoselect``` or ```linear (AnimateDiff-SDXL)``` beta_schedule. Other than that, same rules of thumb apply to AnimateDiff-SDXL as AnimateDiff. - NOTE: You will need to use ```autoselect``` or ```linear (AnimateDiff-SDXL)``` beta_schedule. Other than that, same rules of thumb apply to AnimateDiff-SDXL as AnimateDiff.
- [AnimateLCM](https://github.com/G-U-N/AnimateLCM) support
- NOTE: You will need to use ```autoselect``` or ```lcm``` or ```lcm[100_ots]``` beta_schedule. To use fully with LCM, be sure to use appropriate LCM lora, use the ```lcm``` sampler_name in KSampler nodes, and lower cfg to somewhere around 1.0 to 2.0. Don't forget to decrease steps (minimum = ~4 steps), since LCM converges faster (less steps). Increase step count to increase detail as desired.
- AnimateDiff Keyframes to change Scale and Effect at different points in the sampling process. - AnimateDiff Keyframes to change Scale and Effect at different points in the sampling process.
- fp8 support; requires newest ComfyUI and torch >= 2.1 (decreases VRAM usage, but changes outputs) - fp8 support; requires newest ComfyUI and torch >= 2.1 (decreases VRAM usage, but changes outputs)
- Mac M1/M2/M3 support - Mac M1/M2/M3 support
- Usage of Context Options and Sample Settings outside of AnimateDiff via Gen2 Use Evolved Sampling node - Usage of Context Options and Sample Settings outside of AnimateDiff via Gen2 Use Evolved Sampling node
## Upcoming Features ## Upcoming Features
- Maskable Motion LoRA
- Maskable SD LoRA (and perhaps maskable SD Models as well) - Maskable SD LoRA (and perhaps maskable SD Models as well)
- [PIA](https://github.com/open-mmlab/PIA) support - [PIA](https://github.com/open-mmlab/PIA) support
- Motion LoRA training (experimental)
- Anything else AnimateDiff-related that comes out - Anything else AnimateDiff-related that comes out
@@ -10,8 +10,10 @@ from .utils_motion import get_sorted_list_via_attr
class ContextFuseMethod: class ContextFuseMethod:
FLAT = "flat" FLAT = "flat"
PYRAMID = "pyramid" PYRAMID = "pyramid"
RELATIVE = "relative"
LIST = [PYRAMID, FLAT] LIST = [PYRAMID, FLAT]
LIST_STATIC = [PYRAMID, RELATIVE, FLAT]
class ContextType: class ContextType:
@@ -331,6 +333,7 @@ def create_weights_pyramid(length: int, **kwargs) -> list[float]:
FUSE_MAPPING = { FUSE_MAPPING = {
ContextFuseMethod.FLAT: create_weights_flat, ContextFuseMethod.FLAT: create_weights_flat,
ContextFuseMethod.PYRAMID: create_weights_pyramid, ContextFuseMethod.PYRAMID: create_weights_pyramid,
ContextFuseMethod.RELATIVE: create_weights_pyramid,
} }
@@ -13,7 +13,7 @@ from comfy.model_base import BaseModel
from .ad_settings import AnimateDiffSettings from .ad_settings import AnimateDiffSettings
from .context import ContextOptions, ContextOptions, ContextOptionsGroup from .context import ContextOptions, ContextOptions, ContextOptionsGroup
from .motion_module_ad import AnimateDiffModel, has_mid_block, normalize_ad_state_dict from .motion_module_ad import AnimateDiffModel, AnimateDiffFormat, has_mid_block, normalize_ad_state_dict
from .logger import logger from .logger import logger
from .utils_motion import ADKeyframe, ADKeyframeGroup, MotionCompatibilityError, get_combined_multival, normalize_min_max from .utils_motion import ADKeyframe, ADKeyframeGroup, MotionCompatibilityError, get_combined_multival, normalize_min_max
from .motion_lora import MotionLoraInfo, MotionLoraList from .motion_lora import MotionLoraInfo, MotionLoraList
@@ -365,7 +365,8 @@ def load_motion_module_gen1(model_name: str, model: ModelPatcher, motion_lora: M
ad_wrapper = AnimateDiffModel(mm_state_dict=mm_state_dict, mm_info=mm_info) ad_wrapper = AnimateDiffModel(mm_state_dict=mm_state_dict, mm_info=mm_info)
ad_wrapper.to(model.model_dtype()) ad_wrapper.to(model.model_dtype())
ad_wrapper.to(model.offload_device) ad_wrapper.to(model.offload_device)
load_result = ad_wrapper.load_state_dict(mm_state_dict) is_animatelcm = mm_info.mm_format==AnimateDiffFormat.ANIMATELCM
load_result = ad_wrapper.load_state_dict(mm_state_dict, strict=not is_animatelcm)
# TODO: report load_result of motion_module loading? # TODO: report load_result of motion_module loading?
# wrap motion_module into a ModelPatcher, to allow motion lora patches # wrap motion_module into a ModelPatcher, to allow motion lora patches
motion_model = MotionModelPatcher(model=ad_wrapper, load_device=model.load_device, offload_device=model.offload_device) motion_model = MotionModelPatcher(model=ad_wrapper, load_device=model.load_device, offload_device=model.offload_device)
@@ -389,7 +390,11 @@ def load_motion_module_gen2(model_name: str, motion_model_settings: AnimateDiffS
ad_wrapper = AnimateDiffModel(mm_state_dict=mm_state_dict, mm_info=mm_info) ad_wrapper = AnimateDiffModel(mm_state_dict=mm_state_dict, mm_info=mm_info)
ad_wrapper.to(comfy.model_management.unet_dtype()) ad_wrapper.to(comfy.model_management.unet_dtype())
ad_wrapper.to(comfy.model_management.unet_offload_device()) ad_wrapper.to(comfy.model_management.unet_offload_device())
load_result = ad_wrapper.load_state_dict(mm_state_dict) is_animatelcm = mm_info.mm_format==AnimateDiffFormat.ANIMATELCM
load_result = ad_wrapper.load_state_dict(mm_state_dict, strict=not is_animatelcm)
# TODO: manually check load_results for AnimateLCM models
if is_animatelcm:
pass
# TODO: report load_result of motion_module loading? # TODO: report load_result of motion_module loading?
# wrap motion_module into a ModelPatcher, to allow motion lora patches # wrap motion_module into a ModelPatcher, to allow motion lora patches
motion_model = MotionModelPatcher(model=ad_wrapper, load_device=comfy.model_management.get_torch_device(), motion_model = MotionModelPatcher(model=ad_wrapper, load_device=comfy.model_management.get_torch_device(),
@@ -15,7 +15,7 @@ from comfy.utils import repeat_to_batch_size
import comfy.ops import comfy.ops
import comfy.model_management import comfy.model_management
from .context import ContextOptions, get_context_weights, get_context_windows from .context import ContextFuseMethod, ContextOptions, get_context_weights, get_context_windows
from .utils_motion import CrossAttentionMM, MotionCompatibilityError, extend_to_batch_size, prepare_mask_batch from .utils_motion import CrossAttentionMM, MotionCompatibilityError, extend_to_batch_size, prepare_mask_batch
from .utils_model import BetaSchedules, ModelTypeSD from .utils_model import BetaSchedules, ModelTypeSD
from .logger import logger from .logger import logger
@@ -31,6 +31,7 @@ def zero_module(module):
class AnimateDiffFormat: class AnimateDiffFormat:
ANIMATEDIFF = "AnimateDiff" ANIMATEDIFF = "AnimateDiff"
HOTSHOTXL = "HotshotXL" HOTSHOTXL = "HotshotXL"
ANIMATELCM = "AnimateLCM"
class AnimateDiffVersion: class AnimateDiffVersion:
@@ -58,6 +59,14 @@ def is_hotshotxl(mm_state_dict: dict[str, Tensor]) -> bool:
return False return False
def is_animatelcm(mm_state_dict: dict[str, Tensor]) -> bool:
# use lack of ANY pos_encoder keys to determine if animatelcm model
for key in mm_state_dict.keys():
if "pos_encoder" in key:
return False
return True
def get_down_block_max(mm_state_dict: dict[str, Tensor]) -> int: def get_down_block_max(mm_state_dict: dict[str, Tensor]) -> int:
# keep track of biggest down_block count in module # keep track of biggest down_block count in module
biggest_block = 0 biggest_block = 0
@@ -81,11 +90,14 @@ def has_mid_block(mm_state_dict: dict[str, Tensor]):
return False return False
def get_position_encoding_max_len(mm_state_dict: dict[str, Tensor], mm_name: str) -> int: def get_position_encoding_max_len(mm_state_dict: dict[str, Tensor], mm_name: str, mm_format: str) -> Union[int, None]:
# use pos_encoder.pe entries to determine max length - [1, {max_length}, {320|640|1280}] # use pos_encoder.pe entries to determine max length - [1, {max_length}, {320|640|1280}]
for key in mm_state_dict.keys(): for key in mm_state_dict.keys():
if key.endswith("pos_encoder.pe"): if key.endswith("pos_encoder.pe"):
return mm_state_dict[key].size(1) # get middle dim return mm_state_dict[key].size(1) # get middle dim
# AnimateLCM models should have no pos_encoder entries, and assumed to be 64
if mm_format == AnimateDiffFormat.ANIMATELCM:
return 64
raise MotionCompatibilityError(f"No pos_encoder.pe found in mm_state_dict - {mm_name} is not a valid AnimateDiff motion module!") raise MotionCompatibilityError(f"No pos_encoder.pe found in mm_state_dict - {mm_name} is not a valid AnimateDiff motion module!")
@@ -98,6 +110,11 @@ def find_hotshot_module_num(key: str) -> Union[int, None]:
def normalize_ad_state_dict(mm_state_dict: dict[str, Tensor], mm_name: str) -> Tuple[dict[str, Tensor], AnimateDiffInfo]: def normalize_ad_state_dict(mm_state_dict: dict[str, Tensor], mm_name: str) -> Tuple[dict[str, Tensor], AnimateDiffInfo]:
# from pathlib import Path
# with open(Path(__file__).parent.parent.parent / f"keys_{mm_name}.txt", "w") as afile:
# for key, value in mm_state_dict.items():
# afile.write(f"{key}:\t{value.shape}\n")
# remove all non-temporal keys (in case model has extra stuff in it) # remove all non-temporal keys (in case model has extra stuff in it)
for key in list(mm_state_dict.keys()): for key in list(mm_state_dict.keys()):
if "temporal" not in key: if "temporal" not in key:
@@ -115,11 +132,13 @@ def normalize_ad_state_dict(mm_state_dict: dict[str, Tensor], mm_name: str) -> T
mm_format = AnimateDiffFormat.ANIMATEDIFF mm_format = AnimateDiffFormat.ANIMATEDIFF
if is_hotshotxl(mm_state_dict): if is_hotshotxl(mm_state_dict):
mm_format = AnimateDiffFormat.HOTSHOTXL mm_format = AnimateDiffFormat.HOTSHOTXL
if is_animatelcm(mm_state_dict):
mm_format = AnimateDiffFormat.ANIMATELCM
# determine the model's version # determine the model's version
mm_version = AnimateDiffVersion.V1 mm_version = AnimateDiffVersion.V1
if has_mid_block(mm_state_dict): if has_mid_block(mm_state_dict):
mm_version = AnimateDiffVersion.V2 mm_version = AnimateDiffVersion.V2
elif sd_type==ModelTypeSD.SD1_5 and get_position_encoding_max_len(mm_state_dict, mm_name)==32: elif sd_type==ModelTypeSD.SD1_5 and get_position_encoding_max_len(mm_state_dict, mm_name, mm_format)==32:
mm_version = AnimateDiffVersion.V3 mm_version = AnimateDiffVersion.V3
info = AnimateDiffInfo(sd_type=sd_type, mm_format=mm_format, mm_version=mm_version, mm_name=mm_name) info = AnimateDiffInfo(sd_type=sd_type, mm_format=mm_format, mm_version=mm_version, mm_name=mm_name)
# convert to AnimateDiff format, if needed # convert to AnimateDiff format, if needed
@@ -157,7 +176,8 @@ class AnimateDiffModel(nn.Module):
self.down_blocks: Iterable[MotionModule] = nn.ModuleList([]) self.down_blocks: Iterable[MotionModule] = nn.ModuleList([])
self.up_blocks: Iterable[MotionModule] = nn.ModuleList([]) self.up_blocks: Iterable[MotionModule] = nn.ModuleList([])
self.mid_block: Union[MotionModule, None] = None self.mid_block: Union[MotionModule, None] = None
self.encoding_max_len = get_position_encoding_max_len(mm_state_dict, mm_info.mm_name) self.encoding_max_len = get_position_encoding_max_len(mm_state_dict, mm_info.mm_name, mm_info.mm_format)
self.has_position_encoding = self.encoding_max_len is not None
# determine ops to use (to support fp8 properly) # determine ops to use (to support fp8 properly)
if comfy.model_management.unet_manual_cast(comfy.model_management.unet_dtype(), comfy.model_management.get_torch_device()) is None: if comfy.model_management.unet_manual_cast(comfy.model_management.unet_dtype(), comfy.model_management.get_torch_device()) is None:
ops = comfy.ops.disable_weight_init ops = comfy.ops.disable_weight_init
@@ -170,20 +190,31 @@ class AnimateDiffModel(nn.Module):
layer_channels = (320, 640, 1280, 1280) layer_channels = (320, 640, 1280, 1280)
# fill out down/up blocks and middle block, if present # fill out down/up blocks and middle block, if present
for c in layer_channels: for c in layer_channels:
self.down_blocks.append(MotionModule(c, temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.DOWN, ops=ops)) self.down_blocks.append(MotionModule(c, temporal_position_encoding=self.has_position_encoding,
temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.DOWN, ops=ops))
for c in reversed(layer_channels): for c in reversed(layer_channels):
self.up_blocks.append(MotionModule(c, temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.UP, ops=ops)) self.up_blocks.append(MotionModule(c, temporal_position_encoding=self.has_position_encoding,
temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.UP, ops=ops))
if has_mid_block(mm_state_dict): if has_mid_block(mm_state_dict):
self.mid_block = MotionModule(1280, temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.MID, ops=ops) self.mid_block = MotionModule(1280, temporal_position_encoding=self.has_position_encoding,
temporal_position_encoding_max_len=self.encoding_max_len, block_type=BlockType.MID, ops=ops)
self.AD_video_length: int = 24 self.AD_video_length: int = 24
def get_device_debug(self): def get_device_debug(self):
return self.down_blocks[0].motion_modules[0].temporal_transformer.proj_in.weight.device return self.down_blocks[0].motion_modules[0].temporal_transformer.proj_in.weight.device
def is_length_valid_for_encoding_max_len(self, length: int):
if self.encoding_max_len is None:
return True
return length <= self.encoding_max_len
def get_best_beta_schedule(self, log=False) -> str: def get_best_beta_schedule(self, log=False) -> str:
to_return = None to_return = None
if self.mm_info.sd_type == ModelTypeSD.SD1_5: if self.mm_info.sd_type == ModelTypeSD.SD1_5:
to_return = BetaSchedules.SQRT_LINEAR if self.mm_info.mm_format == AnimateDiffFormat.ANIMATELCM:
to_return = BetaSchedules.LCM # while LCM_100 is the intended schedule, I find LCM to have much less flicker
else:
to_return = BetaSchedules.SQRT_LINEAR
elif self.mm_info.sd_type == ModelTypeSD.SDXL: elif self.mm_info.sd_type == ModelTypeSD.SDXL:
if self.mm_info.mm_format == AnimateDiffFormat.HOTSHOTXL: if self.mm_info.mm_format == AnimateDiffFormat.HOTSHOTXL:
to_return = BetaSchedules.LINEAR to_return = BetaSchedules.LINEAR
@@ -352,22 +383,28 @@ class AnimateDiffModel(nn.Module):
class MotionModule(nn.Module): class MotionModule(nn.Module):
def __init__(self, in_channels, temporal_position_encoding_max_len=24, block_type: str=BlockType.DOWN, ops=comfy.ops.disable_weight_init): def __init__(self,
in_channels,
temporal_position_encoding=True,
temporal_position_encoding_max_len=24,
block_type: str=BlockType.DOWN,
ops=comfy.ops.disable_weight_init
):
super().__init__() super().__init__()
if block_type == BlockType.MID: if block_type == BlockType.MID:
# mid blocks contain only a single VanillaTemporalModule # mid blocks contain only a single VanillaTemporalModule
self.motion_modules: Iterable[VanillaTemporalModule] = nn.ModuleList([get_motion_module(in_channels, temporal_position_encoding_max_len, ops=ops)]) self.motion_modules: Iterable[VanillaTemporalModule] = nn.ModuleList([get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=ops)])
else: else:
# down blocks contain two VanillaTemporalModules # down blocks contain two VanillaTemporalModules
self.motion_modules: Iterable[VanillaTemporalModule] = nn.ModuleList( self.motion_modules: Iterable[VanillaTemporalModule] = nn.ModuleList(
[ [
get_motion_module(in_channels, temporal_position_encoding_max_len, ops=ops), get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=ops),
get_motion_module(in_channels, temporal_position_encoding_max_len, ops=ops) get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=ops)
] ]
) )
# up blocks contain one additional VanillaTemporalModule # up blocks contain one additional VanillaTemporalModule
if block_type == BlockType.UP: if block_type == BlockType.UP:
self.motion_modules.append(get_motion_module(in_channels, temporal_position_encoding_max_len, ops=ops)) self.motion_modules.append(get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=ops))
def set_video_length(self, video_length: int, full_length: int): def set_video_length(self, video_length: int, full_length: int):
for motion_module in self.motion_modules: for motion_module in self.motion_modules:
@@ -398,8 +435,8 @@ class MotionModule(nn.Module):
motion_module.reset_temp_vars() motion_module.reset_temp_vars()
def get_motion_module(in_channels, temporal_position_encoding_max_len, ops=comfy.ops.disable_weight_init): def get_motion_module(in_channels, temporal_position_encoding, temporal_position_encoding_max_len, ops=comfy.ops.disable_weight_init):
return VanillaTemporalModule(in_channels=in_channels, temporal_position_encoding_max_len=temporal_position_encoding_max_len, ops=ops) return VanillaTemporalModule(in_channels=in_channels, temporal_position_encoding=temporal_position_encoding, temporal_position_encoding_max_len=temporal_position_encoding_max_len, ops=ops)
class VanillaTemporalModule(nn.Module): class VanillaTemporalModule(nn.Module):
@@ -776,11 +813,9 @@ class TemporalTransformerBlock(nn.Module):
hidden_states = rearrange(hidden_states, "(b f) d c -> b f d c", f=video_length) hidden_states = rearrange(hidden_states, "(b f) d c -> b f d c", f=video_length)
value_final = torch.zeros_like(hidden_states) value_final = torch.zeros_like(hidden_states)
count_final = torch.zeros_like(hidden_states) count_final = torch.zeros_like(hidden_states)
# bias_final = [0.0] * video_length
batched_conds = hidden_states.size(1) // video_length batched_conds = hidden_states.size(1) // video_length
for sub_idxs in views: for sub_idxs in views:
weights = get_context_weights(len(sub_idxs), view_options.fuse_method) * batched_conds
weights_tensor = torch.Tensor(weights).to(device=hidden_states.device).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
sub_hidden_states = rearrange(hidden_states[:, sub_idxs], "b f d c -> (b f) d c") sub_hidden_states = rearrange(hidden_states[:, sub_idxs], "b f d c -> (b f) d c")
for attention_block, norm in zip(self.attention_blocks, self.norms): for attention_block, norm in zip(self.attention_blocks, self.norms):
norm_hidden_states = norm(sub_hidden_states).to(sub_hidden_states.dtype) norm_hidden_states = norm(sub_hidden_states).to(sub_hidden_states.dtype)
@@ -797,14 +832,35 @@ class TemporalTransformerBlock(nn.Module):
) )
sub_hidden_states = rearrange(sub_hidden_states, "(b f) d c -> b f d c", f=len(sub_idxs)) sub_hidden_states = rearrange(sub_hidden_states, "(b f) d c -> b f d c", f=len(sub_idxs))
# if view_options.fuse_method == ContextFuseMethod.RELATIVE:
# for pos, idx in enumerate(sub_idxs):
# # bias is the influence of a specific index in relation to the whole context window
# bias = 1 - abs(idx - (sub_idxs[0] + sub_idxs[-1]) / 2) / ((sub_idxs[-1] - sub_idxs[0] + 1e-2) / 2)
# bias = max(1e-2, bias)
# # take weighted averate relative to total bias of current idx
# bias_total = bias_final[idx]
# prev_weight = torch.tensor([bias_total / (bias_total + bias)],
# dtype=value_final.dtype, device=value_final.device).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
# #prev_weight = torch.cat([prev_weight]*value_final.shape[1], dim=1)
# new_weight = torch.tensor([bias / (bias_total + bias)],
# dtype=value_final.dtype, device=value_final.device).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
# #new_weight = torch.cat([new_weight]*value_final.shape[1], dim=1)
# test = value_final[:, idx:idx+1, :, :]
# value_final[:, idx:idx+1, :, :] = value_final[:, idx:idx+1, :, :] * prev_weight + sub_hidden_states[:, pos:pos+1, : ,:] * new_weight
# bias_final[idx] = bias_total + bias
# else:
weights = get_context_weights(len(sub_idxs), view_options.fuse_method) * batched_conds
weights_tensor = torch.Tensor(weights).to(device=hidden_states.device).unsqueeze(0).unsqueeze(-1).unsqueeze(-1)
value_final[:, sub_idxs] += sub_hidden_states * weights_tensor value_final[:, sub_idxs] += sub_hidden_states * weights_tensor
count_final[:, sub_idxs] += weights_tensor count_final[:, sub_idxs] += weights_tensor
# get weighted average of sub_hidden_states # get weighted average of sub_hidden_states, if fuse method requires it
# if view_options.fuse_method != ContextFuseMethod.RELATIVE:
hidden_states = value_final / count_final hidden_states = value_final / count_final
hidden_states = rearrange(hidden_states, "b f d c -> (b f) d c") hidden_states = rearrange(hidden_states, "b f d c -> (b f) d c")
del value_final del value_final
del count_final del count_final
# del bias_final
hidden_states = self.ff(self.ff_norm(hidden_states)) + hidden_states hidden_states = self.ff(self.ff_norm(hidden_states)) + hidden_states
@@ -1,65 +1,28 @@
from pathlib import Path
import torch
import comfy.sample as comfy_sample import comfy.sample as comfy_sample
from comfy.model_patcher import ModelPatcher
from .logger import logger
from .utils_model import BetaSchedules, get_available_motion_loras, get_available_motion_models, get_motion_lora_path
from .motion_lora import MotionLoraInfo, MotionLoraList
from .model_injection import InjectionParams, ModelPatcherAndInjector, AnimateDiffSettings, load_motion_module_gen1
from .sample_settings import SampleSettings, SeedNoiseGeneration
from .sampling import motion_sample_factory from .sampling import motion_sample_factory
from .nodes_gen1 import (AnimateDiffLoaderGen1, LegacyAnimateDiffLoaderWithContext, AnimateDiffModelSettings, from .nodes_gen1 import (AnimateDiffLoaderGen1, LegacyAnimateDiffLoaderWithContext, AnimateDiffModelSettings,
AnimateDiffModelSettingsSimple, AnimateDiffModelSettingsAdvanced, AnimateDiffModelSettingsAdvancedAttnStrengths) AnimateDiffModelSettingsSimple, AnimateDiffModelSettingsAdvanced, AnimateDiffModelSettingsAdvancedAttnStrengths)
from .nodes_gen2 import UseEvolvedSamplingNode, ApplyAnimateDiffModelNode, ApplyAnimateDiffModelBasicNode, LoadAnimateDiffModelNode, ADKeyframeNode from .nodes_gen2 import UseEvolvedSamplingNode, ApplyAnimateDiffModelNode, ApplyAnimateDiffModelBasicNode, LoadAnimateDiffModelNode, ADKeyframeNode
from .nodes_multival import MultivalDynamicNode, MultivalFloatNode, MultivalScaledMaskNode from .nodes_multival import MultivalDynamicNode, MultivalScaledMaskNode
from .nodes_sample import FreeInitOptionsNode, NoiseLayerAddWeightedNode, SampleSettingsNode, NoiseLayerAddNode, NoiseLayerReplaceNode, IterationOptionsNode from .nodes_sample import (FreeInitOptionsNode, NoiseLayerAddWeightedNode, SampleSettingsNode, NoiseLayerAddNode, NoiseLayerReplaceNode, IterationOptionsNode,
CustomCFGNode, CustomCFGKeyframeNode)
from .nodes_sigma_schedule import (SigmaScheduleNode, RawSigmaScheduleNode, WeightedAverageSigmaScheduleNode, InterpolatedWeightedAverageSigmaScheduleNode, SplitAndCombineSigmaScheduleNode)
from .nodes_context import (LegacyLoopedUniformContextOptionsNode, LoopedUniformContextOptionsNode, LoopedUniformViewOptionsNode, StandardUniformContextOptionsNode, StandardStaticContextOptionsNode, BatchedContextOptionsNode, from .nodes_context import (LegacyLoopedUniformContextOptionsNode, LoopedUniformContextOptionsNode, LoopedUniformViewOptionsNode, StandardUniformContextOptionsNode, StandardStaticContextOptionsNode, BatchedContextOptionsNode,
StandardStaticViewOptionsNode, StandardUniformViewOptionsNode, ViewAsContextOptionsNode) StandardStaticViewOptionsNode, StandardUniformViewOptionsNode, ViewAsContextOptionsNode)
from .nodes_ad_settings import AnimateDiffSettingsNode, ManualAdjustPENode, SweetspotStretchPENode, FullStretchPENode from .nodes_ad_settings import AnimateDiffSettingsNode, ManualAdjustPENode, SweetspotStretchPENode, FullStretchPENode
from .nodes_extras import AnimateDiffUnload, EmptyLatentImageLarge, CheckpointLoaderSimpleWithNoiseSelect from .nodes_extras import AnimateDiffUnload, EmptyLatentImageLarge, CheckpointLoaderSimpleWithNoiseSelect
from .nodes_deprecated import AnimateDiffLoader_Deprecated, AnimateDiffLoaderAdvanced_Deprecated, AnimateDiffCombine_Deprecated from .nodes_deprecated import AnimateDiffLoader_Deprecated, AnimateDiffLoaderAdvanced_Deprecated, AnimateDiffCombine_Deprecated
from .nodes_lora import AnimateDiffLoraLoader, MaskedLoraLoader
from .logger import logger
# override comfy_sample.sample with animatediff-support version # override comfy_sample.sample with animatediff-support version
comfy_sample.sample = motion_sample_factory(comfy_sample.sample) comfy_sample.sample = motion_sample_factory(comfy_sample.sample)
comfy_sample.sample_custom = motion_sample_factory(comfy_sample.sample_custom, is_custom=True) comfy_sample.sample_custom = motion_sample_factory(comfy_sample.sample_custom, is_custom=True)
class AnimateDiffLoraLoader:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"lora_name": (get_available_motion_loras(),),
"strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}),
},
"optional": {
"prev_motion_lora": ("MOTION_LORA",),
}
}
RETURN_TYPES = ("MOTION_LORA",)
CATEGORY = "Animate Diff 🎭🅐🅓"
FUNCTION = "load_motion_lora"
def load_motion_lora(self, lora_name: str, strength: float, prev_motion_lora: MotionLoraList=None):
if prev_motion_lora is None:
prev_motion_lora = MotionLoraList()
else:
prev_motion_lora = prev_motion_lora.clone()
# check if motion lora with name exists
lora_path = get_motion_lora_path(lora_name)
if not Path(lora_path).is_file():
raise FileNotFoundError(f"Motion lora with name '{lora_name}' not found.")
# create motion lora info to be loaded in AnimateDiff Loader
lora_info = MotionLoraInfo(name=lora_name, strength=strength)
prev_motion_lora.add_lora(lora_info)
return (prev_motion_lora,)
NODE_CLASS_MAPPINGS = { NODE_CLASS_MAPPINGS = {
# Unencapsulated # Unencapsulated
"ADE_AnimateDiffLoRALoader": AnimateDiffLoraLoader, "ADE_AnimateDiffLoRALoader": AnimateDiffLoraLoader,
@@ -91,6 +54,14 @@ NODE_CLASS_MAPPINGS = {
"ADE_AdjustPESweetspotStretch": SweetspotStretchPENode, "ADE_AdjustPESweetspotStretch": SweetspotStretchPENode,
"ADE_AdjustPEFullStretch": FullStretchPENode, "ADE_AdjustPEFullStretch": FullStretchPENode,
"ADE_AdjustPEManual": ManualAdjustPENode, "ADE_AdjustPEManual": ManualAdjustPENode,
# Sample Settings
"ADE_CustomCFG": CustomCFGNode,
"ADE_CustomCFGKeyframe": CustomCFGKeyframeNode,
"ADE_SigmaSchedule": SigmaScheduleNode,
"ADE_RawSigmaSchedule": RawSigmaScheduleNode,
"ADE_SigmaScheduleWeightedAverage": WeightedAverageSigmaScheduleNode,
"ADE_SigmaScheduleWeightedAverageInterp": InterpolatedWeightedAverageSigmaScheduleNode,
"ADE_SigmaScheduleSplitAndCombine": SplitAndCombineSigmaScheduleNode,
# Extras Nodes # Extras Nodes
"ADE_AnimateDiffUnload": AnimateDiffUnload, "ADE_AnimateDiffUnload": AnimateDiffUnload,
"ADE_EmptyLatentImageLarge": EmptyLatentImageLarge, "ADE_EmptyLatentImageLarge": EmptyLatentImageLarge,
@@ -107,6 +78,8 @@ NODE_CLASS_MAPPINGS = {
"ADE_ApplyAnimateDiffModelSimple": ApplyAnimateDiffModelBasicNode, "ADE_ApplyAnimateDiffModelSimple": ApplyAnimateDiffModelBasicNode,
"ADE_ApplyAnimateDiffModel": ApplyAnimateDiffModelNode, "ADE_ApplyAnimateDiffModel": ApplyAnimateDiffModelNode,
"ADE_LoadAnimateDiffModel": LoadAnimateDiffModelNode, "ADE_LoadAnimateDiffModel": LoadAnimateDiffModelNode,
# MaskedLoraLoader
#"ADE_MaskedLoadLora": MaskedLoraLoader,
# Deprecated Nodes # Deprecated Nodes
"AnimateDiffLoaderV1": AnimateDiffLoader_Deprecated, "AnimateDiffLoaderV1": AnimateDiffLoader_Deprecated,
"ADE_AnimateDiffLoaderV1Advanced": AnimateDiffLoaderAdvanced_Deprecated, "ADE_AnimateDiffLoaderV1Advanced": AnimateDiffLoaderAdvanced_Deprecated,
@@ -143,6 +116,14 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"ADE_AdjustPESweetspotStretch": "Adjust PE [Sweetspot Stretch] 🎭🅐🅓", "ADE_AdjustPESweetspotStretch": "Adjust PE [Sweetspot Stretch] 🎭🅐🅓",
"ADE_AdjustPEFullStretch": "Adjust PE [Full Stretch] 🎭🅐🅓", "ADE_AdjustPEFullStretch": "Adjust PE [Full Stretch] 🎭🅐🅓",
"ADE_AdjustPEManual": "Adjust PE [Manual] 🎭🅐🅓", "ADE_AdjustPEManual": "Adjust PE [Manual] 🎭🅐🅓",
# Sample Settings
"ADE_CustomCFG": "Custom CFG 🎭🅐🅓",
"ADE_CustomCFGKeyframe": "Custom CFG Keyframe 🎭🅐🅓",
"ADE_SigmaSchedule": "Create Sigma Schedule 🎭🅐🅓",
"ADE_RawSigmaSchedule": "Create Raw Sigma Schedule 🎭🅐🅓",
"ADE_SigmaScheduleWeightedAverage": "Sigma Schedule Weighted Mean 🎭🅐🅓",
"ADE_SigmaScheduleWeightedAverageInterp": "Sigma Schedule Interpolated Mean 🎭🅐🅓",
"ADE_SigmaScheduleSplitAndCombine": "Sigma Schedule Split Combine 🎭🅐🅓",
# Extras Nodes # Extras Nodes
"ADE_AnimateDiffUnload": "AnimateDiff Unload 🎭🅐🅓", "ADE_AnimateDiffUnload": "AnimateDiff Unload 🎭🅐🅓",
"ADE_EmptyLatentImageLarge": "Empty Latent Image (Big Batch) 🎭🅐🅓", "ADE_EmptyLatentImageLarge": "Empty Latent Image (Big Batch) 🎭🅐🅓",
@@ -159,8 +140,10 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"ADE_ApplyAnimateDiffModelSimple": "Apply AnimateDiff Model 🎭🅐🅓②", "ADE_ApplyAnimateDiffModelSimple": "Apply AnimateDiff Model 🎭🅐🅓②",
"ADE_ApplyAnimateDiffModel": "Apply AnimateDiff Model (Adv.) 🎭🅐🅓②", "ADE_ApplyAnimateDiffModel": "Apply AnimateDiff Model (Adv.) 🎭🅐🅓②",
"ADE_LoadAnimateDiffModel": "Load AnimateDiff Model 🎭🅐🅓②", "ADE_LoadAnimateDiffModel": "Load AnimateDiff Model 🎭🅐🅓②",
# MaskedLoraLoader
#"ADE_MaskedLoadLora": "Load LoRA (Masked) 🎭🅐🅓",
# Deprecated Nodes # Deprecated Nodes
"AnimateDiffLoaderV1": "AnimateDiff Loader [DEPRECATED] 🎭🅐🅓", "AnimateDiffLoaderV1": "AnimateDiff Loader [DEPRECATED] 🎭🅐🅓",
"ADE_AnimateDiffLoaderV1Advanced": "AnimateDiff Loader (Advanced) [DEPRECATED] 🎭🅐🅓", "ADE_AnimateDiffLoaderV1Advanced": "AnimateDiff Loader (Advanced) [DEPRECATED] 🎭🅐🅓",
"ADE_AnimateDiffCombine": "DO NOT USE, USE VideoCombine from ComfyUI-VideoHelperSuite instead! AnimateDiff Combine [DEPRECATED, DO NOT USE] 🎭🅐🅓", "ADE_AnimateDiffCombine": "AnimateDiff Combine [DEPRECATED, Use Video Combine (VHS) Instead!] 🎭🅐🅓",
} }
@@ -145,7 +145,7 @@ class StandardStaticContextOptionsNode:
"context_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}), "context_overlap": ("INT", {"default": 4, "min": 0, "max": OVERLAP_MAX}),
}, },
"optional": { "optional": {
"fuse_method": (ContextFuseMethod.LIST,), "fuse_method": (ContextFuseMethod.LIST_STATIC,),
"use_on_equal_length": ("BOOLEAN", {"default": False},), "use_on_equal_length": ("BOOLEAN", {"default": False},),
"start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}), "start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}),
"guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}), "guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}),
@@ -12,7 +12,7 @@ from PIL.PngImagePlugin import PngInfo
import folder_paths import folder_paths
from comfy.model_patcher import ModelPatcher from comfy.model_patcher import ModelPatcher
from .context import ContextSchedules, ContextOptions from .context import ContextOptionsGroup, ContextOptions, ContextSchedules
from .logger import logger from .logger import logger
from .utils_model import Folders, BetaSchedules, get_available_motion_models from .utils_model import Folders, BetaSchedules, get_available_motion_models
from .model_injection import ModelPatcherAndInjector, InjectionParams, MotionModelGroup, load_motion_module_gen1 from .model_injection import ModelPatcherAndInjector, InjectionParams, MotionModelGroup, load_motion_module_gen1
@@ -109,16 +109,18 @@ class AnimateDiffLoaderAdvanced_Deprecated:
model_name=model_name, model_name=model_name,
apply_v2_properly=False, apply_v2_properly=False,
) )
# set context settings context_group = ContextOptionsGroup()
params.set_context( context_group.add(
ContextOptions( ContextOptions(
context_length=context_length, context_length=context_length,
context_stride=context_stride, context_stride=context_stride,
context_overlap=context_overlap, context_overlap=context_overlap,
context_schedule=context_schedule, context_schedule=context_schedule,
closed_loop=closed_loop, closed_loop=closed_loop,
)
) )
) # set context settings
params.set_context(context_options=context_group)
# inject for use in sampling code # inject for use in sampling code
model = ModelPatcherAndInjector(model) model = ModelPatcherAndInjector(model)
model.motion_models = MotionModelGroup(motion_model) model.motion_models = MotionModelGroup(motion_model)
@@ -6,13 +6,13 @@ from comfy.model_patcher import ModelPatcher
from comfy.sd import load_checkpoint_guess_config from comfy.sd import load_checkpoint_guess_config
from .logger import logger from .logger import logger
from .utils_model import IsChangedHelper, BetaSchedules from .utils_model import BetaSchedules
from .model_injection import get_vanilla_model_patcher from .model_injection import get_vanilla_model_patcher
class AnimateDiffUnload: class AnimateDiffUnload:
def __init__(self) -> None: def __init__(self) -> None:
self.change = IsChangedHelper() pass
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
@@ -81,13 +81,20 @@ class AnimateDiffLoaderGen1:
model.sample_settings = sample_settings if sample_settings is not None else SampleSettings() model.sample_settings = sample_settings if sample_settings is not None else SampleSettings()
model.motion_injection_params = params model.motion_injection_params = params
# save model sampling from BetaSchedule as object patch if model.sample_settings.custom_cfg is not None:
# if autoselect, get suggested beta_schedule from motion model logger.info("[Sample Settings] custom_cfg is set; will override any KSampler cfg values or patches.")
if beta_schedule == BetaSchedules.AUTOSELECT and not model.motion_models.is_empty():
beta_schedule = model.motion_models[0].model.get_best_beta_schedule(log=True) if model.sample_settings.sigma_schedule is not None:
new_model_sampling = BetaSchedules.to_model_sampling(beta_schedule, model) logger.info("[Sample Settings] sigma_schedule is set; will override beta_schedule.")
if new_model_sampling is not None: model.add_object_patch("model_sampling", model.sample_settings.sigma_schedule.clone().model_sampling)
model.add_object_patch("model_sampling", new_model_sampling) else:
# save model sampling from BetaSchedule as object patch
# if autoselect, get suggested beta_schedule from motion model
if beta_schedule == BetaSchedules.AUTOSELECT and not model.motion_models.is_empty():
beta_schedule = model.motion_models[0].model.get_best_beta_schedule(log=True)
new_model_sampling = BetaSchedules.to_model_sampling(beta_schedule, model)
if new_model_sampling is not None:
model.add_object_patch("model_sampling", new_model_sampling)
del motion_model del motion_model
return (model,) return (model,)
@@ -59,13 +59,20 @@ class UseEvolvedSamplingNode:
model.sample_settings = sample_settings if sample_settings is not None else SampleSettings() model.sample_settings = sample_settings if sample_settings is not None else SampleSettings()
model.motion_injection_params = params model.motion_injection_params = params
# save model_sampling from BetaSchedule as object patch if model.sample_settings.custom_cfg is not None:
# if autoselect, get suggested beta_schedule from motion model logger.info("[Sample Settings] custom_cfg is set; will override any KSampler cfg values or patches.")
if beta_schedule == BetaSchedules.AUTOSELECT and not model.motion_models.is_empty():
beta_schedule = model.motion_models[0].model.get_best_beta_schedule(log=True) if model.sample_settings.sigma_schedule is not None:
new_model_sampling = BetaSchedules.to_model_sampling(beta_schedule, model) logger.info("[Sample Settings] sigma_schedule is set; will override beta_schedule.")
if new_model_sampling is not None: model.add_object_patch("model_sampling", model.sample_settings.sigma_schedule.clone().model_sampling)
model.add_object_patch("model_sampling", new_model_sampling) else:
# save model_sampling from BetaSchedule as object patch
# if autoselect, get suggested beta_schedule from motion model
if beta_schedule == BetaSchedules.AUTOSELECT and not model.motion_models.is_empty():
beta_schedule = model.motion_models[0].model.get_best_beta_schedule(log=True)
new_model_sampling = BetaSchedules.to_model_sampling(beta_schedule, model)
if new_model_sampling is not None:
model.add_object_patch("model_sampling", new_model_sampling)
del m_models del m_models
return (model,) return (model,)
@@ -4,7 +4,7 @@ from typing import Union
import torch import torch
from torch import Tensor from torch import Tensor
from .utils_motion import linear_conversion, normalize_min_max from .utils_motion import linear_conversion, normalize_min_max, extend_to_batch_size
class ScaleType: class ScaleType:
@@ -41,24 +41,64 @@ class MultivalDynamicNode:
if len(float_val) < mask_optional.shape[0]: if len(float_val) < mask_optional.shape[0]:
# copies last entry enough times to match mask shape # copies last entry enough times to match mask shape
float_val = float_val + float_val[-1]*(mask_optional.shape[0]-len(float_val)) float_val = float_val + float_val[-1]*(mask_optional.shape[0]-len(float_val))
if mask_optional.shape[0] < len(float_val):
mask_optional = extend_to_batch_size(mask_optional, len(float_val))
float_val = float_val[:mask_optional.shape[0]] float_val = float_val[:mask_optional.shape[0]]
float_val: Tensor = torch.tensor(float_val).unsqueeze(-1).unsqueeze(-1)
# now that inputs are normalized, figure out what value to actually return # now that inputs are normalized, figure out what value to actually return
if mask_optional is not None: if mask_optional is not None:
mask_optional = mask_optional.clone() mask_optional = mask_optional.clone()
mask_optional = mask_optional * float_val if float_is_iterable:
mask_optional = mask_optional[:] * float_val.to(mask_optional.dtype).to(mask_optional.device)
else:
mask_optional = mask_optional * float_val
return (mask_optional,) return (mask_optional,)
else: else:
if not float_is_iterable: if not float_is_iterable:
return (float_val,) return (float_val,)
# create a dummy mask of b,h,w=float_len,1,1 (sigle pixel) # create a dummy mask of b,h,w=float_len,1,1 (sigle pixel)
# purpose is for float input to work with mask code, without special cases # purpose is for float input to work with mask code, without special cases
float_len = len(float_val) if float_is_iterable else 1 float_len = float_val.shape[0] if float_is_iterable else 1
shape = (float_len,1,1) shape = (float_len,1,1)
mask_optional = torch.ones(shape) mask_optional = torch.ones(shape)
mask_optional = mask_optional * float_val mask_optional = mask_optional[:] * float_val.to(mask_optional.dtype).to(mask_optional.device)
return (mask_optional,) return (mask_optional,)
class MultivalScaledMaskNode:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"min_float_val": ("FLOAT", {"default": 0.0, "min": 0.0, "step": 0.001}),
"max_float_val": ("FLOAT", {"default": 1.0, "min": 0.0, "step": 0.001}),
"mask": ("MASK",),
},
"optional": {
"scaling": (ScaleType.LIST,),
}
}
RETURN_TYPES = ("MULTIVAL",)
CATEGORY = "Animate Diff 🎭🅐🅓/multival"
FUNCTION = "create_multival"
def create_multival(self, min_float_val: float, max_float_val: float, mask: Tensor, scaling: str=ScaleType.ABSOLUTE):
# TODO: allow min_float_val and max_float_val to be list[float]
if isinstance(min_float_val, Iterable):
raise ValueError(f"min_float_val must be type float (no lists allowed here), not {type(min_float_val).__name__}.")
if isinstance(max_float_val, Iterable):
raise ValueError(f"max_float_val must be type float (no lists allowed here), not {type(max_float_val).__name__}.")
if scaling == ScaleType.ABSOLUTE:
mask = linear_conversion(mask.clone(), new_min=min_float_val, new_max=max_float_val)
elif scaling == ScaleType.RELATIVE:
mask = normalize_min_max(mask.clone(), new_min=min_float_val, new_max=max_float_val)
else:
raise ValueError(f"scaling '{scaling}' not recognized.")
return MultivalDynamicNode.create_multival(self, mask_optional=mask)
class MultivalDynamicFloatInputNode: class MultivalDynamicFloatInputNode:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
@@ -94,36 +134,3 @@ class MultivalFloatNode:
def create_multival(self, float_val: Union[float, list[float]]=None): def create_multival(self, float_val: Union[float, list[float]]=None):
return MultivalDynamicNode.create_multival(self, float_val=float_val) return MultivalDynamicNode.create_multival(self, float_val=float_val)
class MultivalScaledMaskNode:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"min_float_val": ("FLOAT", {"default": 0.0, "min": 0.0, "step": 0.001}),
"max_float_val": ("FLOAT", {"default": 1.0, "min": 0.0, "step": 0.001}),
"mask": ("MASK",),
},
"optional": {
"scaling": (ScaleType.LIST,),
}
}
RETURN_TYPES = ("MULTIVAL",)
CATEGORY = "Animate Diff 🎭🅐🅓/multival"
FUNCTION = "create_multival"
def create_multival(self, min_float_val: float, max_float_val: float, mask: Tensor, scaling: str=ScaleType.ABSOLUTE):
if isinstance(min_float_val, Iterable):
raise ValueError(f"min_float_val must be type float (no lists allowed here), not {type(min_float_val).__name__}.")
if isinstance(max_float_val, Iterable):
raise ValueError(f"max_float_val must be type float (no lists allowed here), not {type(max_float_val).__name__}.")
if scaling == ScaleType.ABSOLUTE:
mask = linear_conversion(mask.clone(), new_min=min_float_val, new_max=max_float_val)
elif scaling == ScaleType.RELATIVE:
mask = normalize_min_max(mask.clone(), new_min=min_float_val, new_max=max_float_val)
else:
raise ValueError(f"scaling '{scaling}' not recognized.")
return MultivalDynamicNode.create_multival(self, mask_optional=mask)
@@ -1,8 +1,11 @@
from typing import Union
from torch import Tensor from torch import Tensor
from .freeinit import FreeInitFilter from .freeinit import FreeInitFilter
from .sample_settings import FreeInitOptions, IterationOptions, NoiseLayerAdd, NoiseLayerAddWeighted, NoiseLayerGroup, NoiseLayerReplace, NoiseLayerType, SeedNoiseGeneration, SampleSettings from .sample_settings import (FreeInitOptions, IterationOptions,
from .utils_model import BIGMIN, BIGMAX NoiseLayerAdd, NoiseLayerAddWeighted, NoiseLayerGroup, NoiseLayerReplace, NoiseLayerType,
SeedNoiseGeneration, SampleSettings, CustomCFGKeyframeGroup, CustomCFGKeyframe)
from .utils_model import BIGMIN, BIGMAX, SigmaSchedule
class SampleSettingsNode: class SampleSettingsNode:
@@ -20,18 +23,22 @@ class SampleSettingsNode:
"iteration_opts": ("ITERATION_OPTS",), "iteration_opts": ("ITERATION_OPTS",),
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}), "seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
"adapt_denoise_steps": ("BOOLEAN", {"default": False},), "adapt_denoise_steps": ("BOOLEAN", {"default": False},),
"custom_cfg": ("CUSTOM_CFG",),
"sigma_schedule": ("SIGMA_SCHEDULE",),
} }
} }
RETURN_TYPES = ("SAMPLE_SETTINGS",) RETURN_TYPES = ("SAMPLE_SETTINGS",)
RETURN_NAMES = ("settings",) RETURN_NAMES = ("settings",)
CATEGORY = "Animate Diff 🎭🅐🅓" CATEGORY = "Animate Diff 🎭🅐🅓"
FUNCTION = "create_settings" FUNCTION = "create_settings"
def create_settings(self, batch_offset: int, noise_type: str, seed_gen: str, seed_offset: int, noise_layers: NoiseLayerGroup=None, def create_settings(self, batch_offset: int, noise_type: str, seed_gen: str, seed_offset: int, noise_layers: NoiseLayerGroup=None,
iteration_opts: IterationOptions=None, seed_override: int=None, adapt_denoise_steps=False): iteration_opts: IterationOptions=None, seed_override: int=None, adapt_denoise_steps=False,
custom_cfg: CustomCFGKeyframeGroup=None, sigma_schedule: SigmaSchedule=None):
sampling_settings = SampleSettings(batch_offset=batch_offset, noise_type=noise_type, seed_gen=seed_gen, seed_offset=seed_offset, noise_layers=noise_layers, sampling_settings = SampleSettings(batch_offset=batch_offset, noise_type=noise_type, seed_gen=seed_gen, seed_offset=seed_offset, noise_layers=noise_layers,
iteration_opts=iteration_opts, seed_override=seed_override, adapt_denoise_steps=adapt_denoise_steps) iteration_opts=iteration_opts, seed_override=seed_override, adapt_denoise_steps=adapt_denoise_steps,
custom_cfg=custom_cfg, sigma_schedule=sigma_schedule)
return (sampling_settings,) return (sampling_settings,)
@@ -51,7 +58,7 @@ class NoiseLayerReplaceNode:
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}), "seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
} }
} }
RETURN_TYPES = ("NOISE_LAYERS",) RETURN_TYPES = ("NOISE_LAYERS",)
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers" CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
FUNCTION = "create_layers" FUNCTION = "create_layers"
@@ -86,7 +93,7 @@ class NoiseLayerAddNode:
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}), "seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
} }
} }
RETURN_TYPES = ("NOISE_LAYERS",) RETURN_TYPES = ("NOISE_LAYERS",)
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers" CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
FUNCTION = "create_layers" FUNCTION = "create_layers"
@@ -124,7 +131,7 @@ class NoiseLayerAddWeightedNode:
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}), "seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
} }
} }
RETURN_TYPES = ("NOISE_LAYERS",) RETURN_TYPES = ("NOISE_LAYERS",)
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers" CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
FUNCTION = "create_layers" FUNCTION = "create_layers"
@@ -156,7 +163,7 @@ class IterationOptionsNode:
"iter_seed_offset": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX}), "iter_seed_offset": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX}),
} }
} }
RETURN_TYPES = ("ITERATION_OPTS",) RETURN_TYPES = ("ITERATION_OPTS",)
CATEGORY = "Animate Diff 🎭🅐🅓/iteration opts" CATEGORY = "Animate Diff 🎭🅐🅓/iteration opts"
FUNCTION = "create_iter_opts" FUNCTION = "create_iter_opts"
@@ -185,7 +192,7 @@ class FreeInitOptionsNode:
"iter_seed_offset": ("INT", {"default": 1, "min": BIGMIN, "max": BIGMAX}), "iter_seed_offset": ("INT", {"default": 1, "min": BIGMIN, "max": BIGMAX}),
} }
} }
RETURN_TYPES = ("ITERATION_OPTS",) RETURN_TYPES = ("ITERATION_OPTS",)
CATEGORY = "Animate Diff 🎭🅐🅓/iteration opts" CATEGORY = "Animate Diff 🎭🅐🅓/iteration opts"
FUNCTION = "create_iter_opts" FUNCTION = "create_iter_opts"
@@ -198,3 +205,51 @@ class FreeInitOptionsNode:
filter=filter, d_s=d_s, d_t=d_t, n=n_butterworth, init_type=init_type, filter=filter, d_s=d_s, d_t=d_t, n=n_butterworth, init_type=init_type,
iter_batch_offset=iter_batch_offset, iter_seed_offset=iter_seed_offset) iter_batch_offset=iter_batch_offset, iter_seed_offset=iter_seed_offset)
return (iter_opts,) return (iter_opts,)
class CustomCFGNode:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"cfg_multival": ("MULTIVAL",),
}
}
RETURN_TYPES = ("CUSTOM_CFG",)
CATEGORY = "Animate Diff 🎭🅐🅓/sample settings"
FUNCTION = "create_custom_cfg"
def create_custom_cfg(self, cfg_multival: Union[float, Tensor]):
keyframe = CustomCFGKeyframe(cfg_multival=cfg_multival)
cfg_custom = CustomCFGKeyframeGroup()
cfg_custom.add(keyframe)
return (cfg_custom,)
class CustomCFGKeyframeNode:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"cfg_multival": ("MULTIVAL",),
"start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}),
"guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}),
},
"optional": {
"prev_custom_cfg": ("CUSTOM_CFG",),
}
}
RETURN_TYPES = ("CUSTOM_CFG",)
CATEGORY = "Animate Diff 🎭🅐🅓/sample settings"
FUNCTION = "create_custom_cfg"
def create_custom_cfg(self, cfg_multival: Union[float, Tensor], start_percent: float=0.0, guarantee_steps: int=1,
prev_custom_cfg: CustomCFGKeyframeGroup=None):
if not prev_custom_cfg:
prev_custom_cfg = CustomCFGKeyframeGroup()
prev_custom_cfg = prev_custom_cfg.clone()
keyframe = CustomCFGKeyframe(cfg_multival=cfg_multival, start_percent=start_percent, guarantee_steps=guarantee_steps)
prev_custom_cfg.add(keyframe)
return (prev_custom_cfg,)
@@ -1,13 +1,17 @@
from collections.abc import Iterable from collections.abc import Iterable
from typing import Union
import torch import torch
from torch import Tensor from torch import Tensor
import comfy.sample import comfy.sample
import comfy.samplers import comfy.samplers
from comfy.model_patcher import ModelPatcher from comfy.model_patcher import ModelPatcher
from comfy.model_base import BaseModel
from . import freeinit from . import freeinit
from .context import ContextOptions, ContextOptionsGroup from .context import ContextOptions, ContextOptionsGroup
from .utils_model import SigmaSchedule
from .utils_motion import extend_to_batch_size, get_sorted_list_via_attr, prepare_mask_batch
from .logger import logger from .logger import logger
@@ -48,7 +52,8 @@ class NoiseNormalize:
class SampleSettings: class SampleSettings:
def __init__(self, batch_offset: int=0, noise_type: str=None, seed_gen: str=None, seed_offset: int=0, noise_layers: 'NoiseLayerGroup'=None, def __init__(self, batch_offset: int=0, noise_type: str=None, seed_gen: str=None, seed_offset: int=0, noise_layers: 'NoiseLayerGroup'=None,
iteration_opts=None, seed_override:int=None, negative_cond_flipflop=False, adapt_denoise_steps: bool=False): iteration_opts=None, seed_override:int=None, negative_cond_flipflop=False, adapt_denoise_steps: bool=False,
custom_cfg: 'CustomCFGKeyframeGroup'=None, sigma_schedule: SigmaSchedule=None):
self.batch_offset = batch_offset self.batch_offset = batch_offset
self.noise_type = noise_type if noise_type is not None else NoiseLayerType.DEFAULT self.noise_type = noise_type if noise_type is not None else NoiseLayerType.DEFAULT
self.seed_gen = seed_gen if seed_gen is not None else SeedNoiseGeneration.COMFY self.seed_gen = seed_gen if seed_gen is not None else SeedNoiseGeneration.COMFY
@@ -58,6 +63,8 @@ class SampleSettings:
self.seed_override = seed_override self.seed_override = seed_override
self.negative_cond_flipflop = negative_cond_flipflop self.negative_cond_flipflop = negative_cond_flipflop
self.adapt_denoise_steps = adapt_denoise_steps self.adapt_denoise_steps = adapt_denoise_steps
self.custom_cfg = custom_cfg.clone() if custom_cfg else custom_cfg
self.sigma_schedule = sigma_schedule
def prepare_noise(self, seed: int, latents: Tensor, noise: Tensor, extra_seed_offset=0, extra_args:dict={}, force_create_noise=True): def prepare_noise(self, seed: int, latents: Tensor, noise: Tensor, extra_seed_offset=0, extra_args:dict={}, force_create_noise=True):
if self.seed_override is not None: if self.seed_override is not None:
@@ -82,10 +89,18 @@ class SampleSettings:
# noise prepared now # noise prepared now
return noise return noise
def pre_run(self, model: ModelPatcher):
if self.custom_cfg is not None:
self.custom_cfg.reset()
def cleanup(self):
if self.custom_cfg is not None:
self.custom_cfg.reset()
def clone(self): def clone(self):
return SampleSettings(batch_offset=self.batch_offset, noise_type=self.noise_type, seed_gen=self.seed_gen, seed_offset=self.seed_offset, return SampleSettings(batch_offset=self.batch_offset, noise_type=self.noise_type, seed_gen=self.seed_gen, seed_offset=self.seed_offset,
noise_layers=self.noise_layers.clone(), iteration_opts=self.iteration_opts, seed_override=self.seed_override, noise_layers=self.noise_layers.clone(), iteration_opts=self.iteration_opts, seed_override=self.seed_override,
negative_cond_flipflop=self.negative_cond_flipflop, adapt_denoise_steps=self.adapt_denoise_steps) negative_cond_flipflop=self.negative_cond_flipflop, adapt_denoise_steps=self.adapt_denoise_steps, custom_cfg=self.custom_cfg, sigma_schedule=self.sigma_schedule)
class NoiseLayer: class NoiseLayer:
@@ -435,3 +450,106 @@ class FreeInitOptions(IterationOptions):
return cached_latents, noised_latents return cached_latents, noised_latents
else: else:
raise ValueError(f"FreeInit init_type '{self.init_type}' is not recognized.") raise ValueError(f"FreeInit init_type '{self.init_type}' is not recognized.")
class CustomCFGKeyframe:
def __init__(self, cfg_multival: Union[float, Tensor], start_percent=0.0, guarantee_steps=1):
self.cfg_multival = cfg_multival
# scheduling
self.start_percent = float(start_percent)
self.start_t = 999999999.9
self.guarantee_steps = guarantee_steps
def clone(self):
c = CustomCFGKeyframe(cfg_multival=self.cfg_multival,
start_percent=self.start_percent, guarantee_steps=self.guarantee_steps)
c.start_t = self.start_t
return c
class CustomCFGKeyframeGroup:
def __init__(self):
self.keyframes: list[CustomCFGKeyframe] = []
self._current_keyframe: CustomCFGKeyframe = None
self._current_used_steps: int = 0
self._current_index: int = 0
def reset(self):
self._current_keyframe = None
self._current_used_steps = 0
self._current_index = 0
self._set_first_as_current()
def add(self, keyframe: CustomCFGKeyframe):
# add to end of list, then sort
self.keyframes.append(keyframe)
self.keyframes = get_sorted_list_via_attr(self.keyframes, "start_percent")
self._set_first_as_current()
def _set_first_as_current(self):
if len(self.keyframes) > 0:
self._current_keyframe = self.keyframes[0]
else:
self._current_keyframe = None
def has_index(self, index: int) -> int:
return index >=0 and index < len(self.keyframes)
def is_empty(self) -> bool:
return len(self.keyframes) == 0
def clone(self):
cloned = CustomCFGKeyframeGroup()
for keyframe in self.keyframes:
cloned.keyframes.append(keyframe)
cloned._set_first_as_current()
return cloned
def initialize_timesteps(self, model: BaseModel):
for keyframe in self.keyframes:
keyframe.start_t = model.model_sampling.percent_to_sigma(keyframe.start_percent)
def prepare_current_keyframe(self, t: Tensor):
curr_t: float = t[0]
prev_index = self._current_index
# if met guaranteed steps, look for next keyframe in case need to switch
if self._current_used_steps >= self._current_keyframe.guarantee_steps:
# if has next index, loop through and see if need t oswitch
if self.has_index(self._current_index+1):
for i in range(self._current_index+1, len(self.keyframes)):
eval_c = self.keyframes[i]
# check if start_t is greater or equal to curr_t
# NOTE: t is in terms of sigmas, not percent, so bigger number = earlier step in sampling
if eval_c.start_t >= curr_t:
self._current_index = i
self._current_keyframe = eval_c
self._current_used_steps = 0
# if guarantee_steps greater than zero, stop searching for other keyframes
if self._current_keyframe.guarantee_steps > 0:
break
# if eval_c is outside the percent range, stop looking further
else: break
# update steps current context is used
self._current_used_steps += 1
def patch_model(self, model: ModelPatcher) -> ModelPatcher:
def evolved_custom_cfg(args):
cond: Tensor = args["cond"]
uncond: Tensor = args["uncond"]
# cond scale is based purely off of CustomCFG - cond_scale input in sampler is ignored!
cond_scale = self.cfg_multival
if isinstance(cond_scale, Tensor):
cond_scale = prepare_mask_batch(cond_scale.to(cond.dtype).to(cond.device), cond.shape)
cond_scale = extend_to_batch_size(cond_scale, cond.shape[0])
return uncond + (cond - uncond) * cond_scale
model = model.clone()
model.set_model_sampler_cfg_function(evolved_custom_cfg)
return model
# properties shadow those of CustomCFGKeyframe
@property
def cfg_multival(self):
if self._current_keyframe != None:
return self._current_keyframe.cfg_multival
return None
@@ -16,7 +16,7 @@ from comfy.controlnet import ControlBase
import comfy.ops import comfy.ops
from .context import ContextFuseMethod, ContextSchedules, get_context_weights, get_context_windows from .context import ContextFuseMethod, ContextSchedules, get_context_weights, get_context_windows
from .sample_settings import IterationOptions, SeedNoiseGeneration, prepare_mask_ad from .sample_settings import IterationOptions, SampleSettings, SeedNoiseGeneration, prepare_mask_ad
from .utils_model import ModelTypeSD, wrap_function_to_inject_xformers_bug_info from .utils_model import ModelTypeSD, wrap_function_to_inject_xformers_bug_info
from .model_injection import InjectionParams, ModelPatcherAndInjector, MotionModelGroup, MotionModelPatcher from .model_injection import InjectionParams, ModelPatcherAndInjector, MotionModelGroup, MotionModelPatcher
from .motion_module_ad import AnimateDiffFormat, AnimateDiffInfo, AnimateDiffVersion, VanillaTemporalModule from .motion_module_ad import AnimateDiffFormat, AnimateDiffInfo, AnimateDiffVersion, VanillaTemporalModule
@@ -30,6 +30,7 @@ class AnimateDiffHelper_GlobalState:
def __init__(self): def __init__(self):
self.motion_models: MotionModelGroup = None self.motion_models: MotionModelGroup = None
self.params: InjectionParams = None self.params: InjectionParams = None
self.sample_settings: SampleSettings = None
self.reset() self.reset()
def initialize(self, model): def initialize(self, model):
@@ -40,6 +41,8 @@ class AnimateDiffHelper_GlobalState:
self.motion_models.initialize_timesteps(model) self.motion_models.initialize_timesteps(model)
if self.params.context_options is not None: if self.params.context_options is not None:
self.params.context_options.initialize_timesteps(model) self.params.context_options.initialize_timesteps(model)
if self.sample_settings.custom_cfg is not None:
self.sample_settings.custom_cfg.initialize_timesteps(model)
def reset(self): def reset(self):
self.initialized = False self.initialized = False
@@ -53,6 +56,9 @@ class AnimateDiffHelper_GlobalState:
if self.params is not None: if self.params is not None:
del self.params del self.params
self.params = None self.params = None
if self.sample_settings is not None:
del self.sample_settings
self.sample_settings = None
def update_with_inject_params(self, params: InjectionParams): def update_with_inject_params(self, params: InjectionParams):
self.params = params self.params = params
@@ -147,8 +153,9 @@ def get_additional_models_factory(orig_get_additional_models: Callable, motion_m
def apply_params_to_motion_models(motion_models: MotionModelGroup, params: InjectionParams): def apply_params_to_motion_models(motion_models: MotionModelGroup, params: InjectionParams):
params = params.clone() params = params.clone()
if params.context_options.context_schedule == ContextSchedules.VIEW_AS_CONTEXT: for context in params.context_options.contexts:
params.context_options._current_context.context_length = params.full_length if context.context_schedule == ContextSchedules.VIEW_AS_CONTEXT:
context.context_length = params.full_length
# TODO: check (and message) should be different based on use_on_equal_length setting # TODO: check (and message) should be different based on use_on_equal_length setting
if params.context_options.context_length: if params.context_options.context_length:
pass pass
@@ -167,7 +174,7 @@ def apply_params_to_motion_models(motion_models: MotionModelGroup, params: Injec
# if no context_length, treat video length as intended AD frame window # if no context_length, treat video length as intended AD frame window
if not params.context_options.context_length: if not params.context_options.context_length:
for motion_model in motion_models.models: for motion_model in motion_models.models:
if params.full_length > motion_model.model.encoding_max_len: if not motion_model.model.is_length_valid_for_encoding_max_len(params.full_length):
raise ValueError(f"Without a context window, AnimateDiff model {motion_model.model.mm_info.mm_name} has upper limit of {motion_model.model.encoding_max_len} frames, but received {params.full_length} latents.") raise ValueError(f"Without a context window, AnimateDiff model {motion_model.model.mm_info.mm_name} has upper limit of {motion_model.model.encoding_max_len} frames, but received {params.full_length} latents.")
motion_models.set_video_length(params.full_length, params.full_length) motion_models.set_video_length(params.full_length, params.full_length)
# otherwise, treat context_length as intended AD frame window # otherwise, treat context_length as intended AD frame window
@@ -175,7 +182,7 @@ def apply_params_to_motion_models(motion_models: MotionModelGroup, params: Injec
for motion_model in motion_models.models: for motion_model in motion_models.models:
view_options = params.context_options.view_options view_options = params.context_options.view_options
context_length = view_options.context_length if view_options else params.context_options.context_length context_length = view_options.context_length if view_options else params.context_options.context_length
if context_length > motion_model.model.encoding_max_len: if not motion_model.model.is_length_valid_for_encoding_max_len(context_length):
raise ValueError(f"AnimateDiff model {motion_model.model.mm_info.mm_name} has upper limit of {motion_model.model.encoding_max_len} frames for a context window, but received context length of {params.context_options.context_length}.") raise ValueError(f"AnimateDiff model {motion_model.model.mm_info.mm_name} has upper limit of {motion_model.model.encoding_max_len} frames for a context window, but received context length of {params.context_options.context_length}.")
motion_models.set_video_length(params.context_options.context_length, params.full_length) motion_models.set_video_length(params.context_options.context_length, params.full_length)
# inject model # inject model
@@ -202,10 +209,10 @@ class FunctionInjectionHolder:
if params.unlimited_area_hack: if params.unlimited_area_hack:
model.model.memory_required = unlimited_memory_required model.model.memory_required = unlimited_memory_required
if model.motion_models is not None: if model.motion_models is not None:
# only apply groupnorm hack if not [v3 or (AnimateDiff SD1.5 and v2 and should apply v2 properly)] # only apply groupnorm hack if not [v3 or ([not Hotshot] and SD1.5 and v2 and apply_v2_properly)]
info: AnimateDiffInfo = model.motion_models[0].model.mm_info info: AnimateDiffInfo = model.motion_models[0].model.mm_info
if not (info.mm_version == AnimateDiffVersion.V3 or (info.mm_format == AnimateDiffFormat.ANIMATEDIFF and info.sd_type == ModelTypeSD.SD1_5 and if not (info.mm_version == AnimateDiffVersion.V3 or
info.mm_version == AnimateDiffVersion.V2 and params.apply_v2_properly)): (info.mm_format not in [AnimateDiffFormat.HOTSHOTXL] and info.sd_type == ModelTypeSD.SD1_5 and info.mm_version == AnimateDiffVersion.V2 and params.apply_v2_properly)):
torch.nn.GroupNorm.forward = groupnorm_mm_factory(params) torch.nn.GroupNorm.forward = groupnorm_mm_factory(params)
comfy.ops.manual_cast.GroupNorm.forward_comfy_cast_weights = groupnorm_mm_factory(params, manual_cast=True) comfy.ops.manual_cast.GroupNorm.forward_comfy_cast_weights = groupnorm_mm_factory(params, manual_cast=True)
# if mps device (Apple Silicon), disable batched conds to avoid black images with groupnorm hack # if mps device (Apple Silicon), disable batched conds to avoid black images with groupnorm hack
@@ -245,6 +252,8 @@ def motion_sample_factory(orig_comfy_sample: Callable, is_custom: bool=False) ->
cached_noise = None cached_noise = None
function_injections = FunctionInjectionHolder() function_injections = FunctionInjectionHolder()
try: try:
if model.sample_settings.custom_cfg is not None:
model = model.sample_settings.custom_cfg.patch_model(model)
# clone params from model # clone params from model
params = model.motion_injection_params.clone() params = model.motion_injection_params.clone()
# get amount of latents passed in, and store in params # get amount of latents passed in, and store in params
@@ -279,6 +288,7 @@ def motion_sample_factory(orig_comfy_sample: Callable, is_custom: bool=False) ->
ADGS.current_step = ADGS.start_step + step + 1 ADGS.current_step = ADGS.start_step + step + 1
kwargs["callback"] = ad_callback kwargs["callback"] = ad_callback
ADGS.motion_models = model.motion_models ADGS.motion_models = model.motion_models
ADGS.sample_settings = model.sample_settings
# apply adapt_denoise_steps # apply adapt_denoise_steps
args = list(args) args = list(args)
@@ -331,6 +341,8 @@ def motion_sample_factory(orig_comfy_sample: Callable, is_custom: bool=False) ->
if model.motion_models is not None: if model.motion_models is not None:
model.motion_models.pre_run(model) model.motion_models.pre_run(model)
if model.sample_settings is not None:
model.sample_settings.pre_run(model)
latents = wrap_function_to_inject_xformers_bug_info(orig_comfy_sample)(model, noise, *args, **kwargs) latents = wrap_function_to_inject_xformers_bug_info(orig_comfy_sample)(model, noise, *args, **kwargs)
return latents return latents
finally: finally:
@@ -352,8 +364,11 @@ def evolved_sampling_function(model, x, timestep, uncond, cond, cond_scale, mode
ADGS.motion_models.prepare_current_keyframe(t=timestep) ADGS.motion_models.prepare_current_keyframe(t=timestep)
if ADGS.params.context_options is not None: if ADGS.params.context_options is not None:
ADGS.params.context_options.prepare_current_context(t=timestep) ADGS.params.context_options.prepare_current_context(t=timestep)
if ADGS.sample_settings.custom_cfg is not None:
ADGS.sample_settings.custom_cfg.prepare_current_keyframe(t=timestep)
if math.isclose(cond_scale, 1.0) and model_options.get("disable_cfg1_optimization", False) == False: # never use cfg1 optimization if using custom_cfg (since can have timesteps and such)
if ADGS.sample_settings.custom_cfg is None and math.isclose(cond_scale, 1.0) and model_options.get("disable_cfg1_optimization", False) == False:
uncond_ = None uncond_ = None
else: else:
uncond_ = uncond uncond_ = uncond
@@ -454,6 +469,7 @@ def sliding_calc_cond_uncond_batch(model, cond, uncond, x_in: Tensor, timestep,
cond_final = torch.zeros_like(x_in) cond_final = torch.zeros_like(x_in)
uncond_final = torch.zeros_like(x_in) uncond_final = torch.zeros_like(x_in)
out_count_final = torch.zeros((x_in.shape[0], 1, 1, 1), device=x_in.device) out_count_final = torch.zeros((x_in.shape[0], 1, 1, 1), device=x_in.device)
bias_final = [0.0] * x_in.shape[0]
# perform calc_cond_uncond_batch per context window # perform calc_cond_uncond_batch per context window
for ctx_idxs in context_windows: for ctx_idxs in context_windows:
@@ -477,16 +493,36 @@ def sliding_calc_cond_uncond_batch(model, cond, uncond, x_in: Tensor, timestep,
sub_cond_out, sub_uncond_out = comfy.samplers.calc_cond_uncond_batch(model, sub_cond, sub_uncond, sub_x, sub_timestep, model_options) sub_cond_out, sub_uncond_out = comfy.samplers.calc_cond_uncond_batch(model, sub_cond, sub_uncond, sub_x, sub_timestep, model_options)
# add conds and counts based on weights of fuse method if ADGS.params.context_options.fuse_method == ContextFuseMethod.RELATIVE:
weights = get_context_weights(len(ctx_idxs), ADGS.params.context_options.fuse_method) * batched_conds full_length = ADGS.params.full_length
weights_tensor = torch.Tensor(weights).to(device=x_in.device).unsqueeze(-1).unsqueeze(-1).unsqueeze(-1) for pos, idx in enumerate(ctx_idxs):
cond_final[full_idxs] += sub_cond_out * weights_tensor # bias is the influence of a specific index in relation to the whole context window
uncond_final[full_idxs] += sub_uncond_out * weights_tensor bias = 1 - abs(idx - (ctx_idxs[0] + ctx_idxs[-1]) / 2) / ((ctx_idxs[-1] - ctx_idxs[0] + 1e-2) / 2)
out_count_final[full_idxs] += weights_tensor bias = max(1e-2, bias)
# take weighted average relative to total bias of current idx
# and account for batched_conds
for n in range(batched_conds):
bias_total = bias_final[(full_length*n)+idx]
prev_weight = (bias_total / (bias_total + bias))
new_weight = (bias / (bias_total + bias))
cond_final[(full_length*n)+idx] = cond_final[(full_length*n)+idx] * prev_weight + sub_cond_out[(full_length*n)+pos] * new_weight
uncond_final[(full_length*n)+idx] = uncond_final[(full_length*n)+idx] * prev_weight + sub_uncond_out[(full_length*n)+pos] * new_weight
bias_final[(full_length*n)+idx] = bias_total + bias
else:
# add conds and counts based on weights of fuse method
weights = get_context_weights(len(ctx_idxs), ADGS.params.context_options.fuse_method) * batched_conds
weights_tensor = torch.Tensor(weights).to(device=x_in.device).unsqueeze(-1).unsqueeze(-1).unsqueeze(-1)
cond_final[full_idxs] += sub_cond_out * weights_tensor
uncond_final[full_idxs] += sub_uncond_out * weights_tensor
out_count_final[full_idxs] += weights_tensor
if ADGS.params.context_options.fuse_method == ContextFuseMethod.RELATIVE:
# normalize cond and uncond via division by context usage counts # already normalized, so return as is
cond_final /= out_count_final del out_count_final
uncond_final /= out_count_final return cond_final, uncond_final
del out_count_final else:
return cond_final, uncond_final # normalize cond and uncond via division by context usage counts
cond_final /= out_count_final
uncond_final /= out_count_final
del out_count_final
return cond_final, uncond_final
@@ -3,72 +3,169 @@ from pathlib import Path
from typing import Callable, Union from typing import Callable, Union
from collections.abc import Iterable from collections.abc import Iterable
from time import time from time import time
import copy
import torch
import numpy as np import numpy as np
import folder_paths import folder_paths
from comfy.model_base import SD21UNCLIP, SDXL, BaseModel, SDXLRefiner, SVD_img2vid, model_sampling from comfy.model_base import SD21UNCLIP, SDXL, BaseModel, SDXLRefiner, SVD_img2vid, model_sampling, ModelType
from comfy.model_management import xformers_enabled from comfy.model_management import xformers_enabled
from comfy.model_patcher import ModelPatcher from comfy.model_patcher import ModelPatcher
import comfy.model_sampling
import comfy_extras.nodes_model_advanced
class IsChangedHelper:
def __init__(self): BIGMIN = -(2**53-1)
self.val = 0 BIGMAX = (2**53-1)
def no_change(self):
return self.val
def change(self):
self.val = (self.val + 1) % 100
class ModelSamplingConfig: class ModelSamplingConfig:
def __init__(self, beta_schedule: str): def __init__(self, beta_schedule: str, linear_start: float=None, linear_end: float=None):
self.sampling_settings = {"beta_schedule": beta_schedule} self.sampling_settings = {"beta_schedule": beta_schedule}
if linear_start is not None:
self.sampling_settings["linear_start"] = linear_start
if linear_end is not None:
self.sampling_settings["linear_end"] = linear_end
self.beta_schedule = beta_schedule # keeping this for backwards compatibility self.beta_schedule = beta_schedule # keeping this for backwards compatibility
class ModelSamplingType:
EPS = "eps"
V_PREDICTION = "v_prediction"
LCM = "lcm"
_NON_LCM_LIST = [EPS, V_PREDICTION]
_FULL_LIST = [EPS, V_PREDICTION, LCM]
MAP = {
EPS: ModelType.EPS,
V_PREDICTION: ModelType.V_PREDICTION,
LCM: comfy_extras.nodes_model_advanced.LCM,
}
@classmethod
def from_alias(cls, alias: str):
return cls.MAP[alias]
def factory_model_sampling_discrete_distilled(original_timesteps=50):
class ModelSamplingDiscreteDistilledEvolved(comfy_extras.nodes_model_advanced.ModelSamplingDiscreteDistilled):
def __init__(self, *args, **kwargs):
self.original_timesteps = original_timesteps # normal LCM has 50
super().__init__(*args, **kwargs)
return ModelSamplingDiscreteDistilledEvolved
# based on code in comfy_extras/nodes_model_advanced.py
def evolved_model_sampling(model_config: ModelSamplingConfig, model_type: ModelType, alias: str, original_timesteps: int=None):
# if LCM, need to handle manually
if BetaSchedules.is_lcm(alias) or original_timesteps is not None:
sampling_type = comfy_extras.nodes_model_advanced.LCM
if original_timesteps is not None:
sampling_base = factory_model_sampling_discrete_distilled(original_timesteps=original_timesteps)
elif alias == BetaSchedules.LCM_100:
sampling_base = factory_model_sampling_discrete_distilled(original_timesteps=100)
elif alias == BetaSchedules.LCM_25:
sampling_base = factory_model_sampling_discrete_distilled(original_timesteps=25)
else:
sampling_base = comfy_extras.nodes_model_advanced.ModelSamplingDiscreteDistilled
class ModelSamplingAdvancedEvolved(sampling_base, sampling_type):
pass
# NOTE: if I want to support zsnr, this is where I would add that code
return ModelSamplingAdvancedEvolved(model_config)
# otherwise, use vanilla model_sampling function
return model_sampling(model_config, model_type)
class BetaSchedules: class BetaSchedules:
AUTOSELECT = "autoselect" AUTOSELECT = "autoselect"
SQRT_LINEAR = "sqrt_linear (AnimateDiff)" SQRT_LINEAR = "sqrt_linear (AnimateDiff)"
LINEAR_ADXL = "linear (AnimateDiff-SDXL)" LINEAR_ADXL = "linear (AnimateDiff-SDXL)"
LINEAR = "linear (HotshotXL/default)" LINEAR = "linear (HotshotXL/default)"
AVG_LINEAR_SQRT_LINEAR = "avg(sqrt_linear,linear)"
LCM_AVG_LINEAR_SQRT_LINEAR = "lcm avg(sqrt_linear,linear)"
LCM = "lcm"
LCM_100 = "lcm[100_ots]"
LCM_25 = "lcm[25_ots]"
LCM_SQRT_LINEAR = "lcm >> sqrt_linear"
USE_EXISTING = "use existing" USE_EXISTING = "use existing"
SQRT = "sqrt" SQRT = "sqrt"
COSINE = "cosine" COSINE = "cosine"
SQUAREDCOS_CAP_V2 = "squaredcos_cap_v2" SQUAREDCOS_CAP_V2 = "squaredcos_cap_v2"
RAW_LINEAR = "linear"
RAW_SQRT_LINEAR = "sqrt_linear"
ALIAS_LIST = [AUTOSELECT, SQRT_LINEAR, LINEAR_ADXL, LINEAR, RAW_BETA_SCHEDULE_LIST = [RAW_LINEAR, RAW_SQRT_LINEAR, SQRT, COSINE, SQUAREDCOS_CAP_V2]
USE_EXISTING, SQRT, COSINE, SQUAREDCOS_CAP_V2]
ALIAS_LCM_LIST = [LCM, LCM_100, LCM_25, LCM_SQRT_LINEAR]
ALIAS_ACTIVE_LIST = [SQRT_LINEAR, LINEAR_ADXL, LINEAR, AVG_LINEAR_SQRT_LINEAR, LCM_AVG_LINEAR_SQRT_LINEAR, LCM, LCM_100, LCM_SQRT_LINEAR, # LCM_25 is purposely omitted
SQRT, COSINE, SQUAREDCOS_CAP_V2]
ALIAS_LIST = [AUTOSELECT, USE_EXISTING] + ALIAS_ACTIVE_LIST
ALIAS_MAP = { ALIAS_MAP = {
SQRT_LINEAR: "sqrt_linear", SQRT_LINEAR: "sqrt_linear",
LINEAR_ADXL: "linear", # also linear, but has different linear_end (0.020) LINEAR_ADXL: "linear", # also linear, but has different linear_end (0.020)
LINEAR: "linear", LINEAR: "linear",
LCM_100: "linear", # distilled, 100 original timesteps
LCM_25: "linear", # distilled, 25 original timesteps
LCM: "linear", # distilled
LCM_SQRT_LINEAR: "sqrt_linear", # distilled, sqrt_linear
SQRT: "sqrt", SQRT: "sqrt",
COSINE: "cosine", COSINE: "cosine",
SQUAREDCOS_CAP_V2: "squaredcos_cap_v2", SQUAREDCOS_CAP_V2: "squaredcos_cap_v2",
RAW_LINEAR: "linear",
RAW_SQRT_LINEAR: "sqrt_linear"
} }
@classmethod
def is_lcm(cls, alias: str):
return alias in cls.ALIAS_LCM_LIST
@classmethod @classmethod
def to_name(cls, alias: str): def to_name(cls, alias: str):
return cls.ALIAS_MAP[alias] return cls.ALIAS_MAP[alias]
@classmethod @classmethod
def to_config(cls, alias: str) -> ModelSamplingConfig: def to_config(cls, alias: str) -> ModelSamplingConfig:
return ModelSamplingConfig(cls.to_name(alias)) linear_start = None
linear_end = None
@classmethod
def to_model_sampling(cls, alias: str, model: ModelPatcher):
if alias == cls.USE_EXISTING:
return None
ms_obj = model_sampling(cls.to_config(alias), model_type=model.model.model_type)
if alias == cls.LINEAR_ADXL: if alias == cls.LINEAR_ADXL:
# uses linear_end=0.020 # uses linear_end=0.020
ms_obj._register_schedule(given_betas=None, beta_schedule=cls.to_name(alias), timesteps=1000, linear_start=0.00085, linear_end=0.020, cosine_s=8e-3) linear_end = 0.020
return ModelSamplingConfig(cls.to_name(alias), linear_start=linear_start, linear_end=linear_end)
@classmethod
def _to_model_sampling(cls, alias: str, model_type: ModelType, config_override: ModelSamplingConfig=None, original_timesteps: int=None):
if alias == cls.USE_EXISTING:
return None
elif config_override != None:
return evolved_model_sampling(config_override, model_type=model_type, alias=alias, original_timesteps=original_timesteps)
elif alias == cls.AVG_LINEAR_SQRT_LINEAR:
ms_linear = evolved_model_sampling(cls.to_config(cls.LINEAR), model_type=model_type, alias=cls.LINEAR)
ms_sqrt_linear = evolved_model_sampling(cls.to_config(cls.SQRT_LINEAR), model_type=model_type, alias=cls.SQRT_LINEAR)
avg_sigmas = (ms_linear.sigmas + ms_sqrt_linear.sigmas) / 2
ms_linear.set_sigmas(avg_sigmas)
return ms_linear
elif alias == cls.LCM_AVG_LINEAR_SQRT_LINEAR:
ms_linear = evolved_model_sampling(cls.to_config(cls.LCM), model_type=model_type, alias=cls.LCM)
ms_sqrt_linear = evolved_model_sampling(cls.to_config(cls.LCM_SQRT_LINEAR), model_type=model_type, alias=cls.LCM_SQRT_LINEAR)
avg_sigmas = (ms_linear.sigmas + ms_sqrt_linear.sigmas) / 2
ms_linear.set_sigmas(avg_sigmas)
return ms_linear
# average out the sigmas
ms_obj = evolved_model_sampling(cls.to_config(alias), model_type=model_type, alias=alias, original_timesteps=original_timesteps)
return ms_obj return ms_obj
@classmethod
def to_model_sampling(cls, alias: str, model: ModelPatcher):
return cls._to_model_sampling(alias=alias, model_type=model.model.model_type)
@staticmethod @staticmethod
def get_alias_list_with_first_element(first_element: str): def get_alias_list_with_first_element(first_element: str):
new_list = BetaSchedules.ALIAS_LIST.copy() new_list = BetaSchedules.ALIAS_LIST.copy()
@@ -77,16 +174,65 @@ class BetaSchedules:
return new_list return new_list
class BetaScheduleCache: class SigmaSchedule:
def __init__(self, model: ModelPatcher): def __init__(self, model_sampling: comfy.model_sampling.ModelSamplingDiscrete, model_type: ModelType):
self.model_sampling = model.model.model_sampling self.model_sampling = model_sampling
#self.config = config
self.model_type = model_type
self.original_timesteps = getattr(self.model_sampling, "original_timesteps", None)
def is_lcm(self):
return self.original_timesteps is not None
def use_cached_beta_schedule_and_clean(self, model: ModelPatcher): def total_sigmas(self):
model.model.model_sampling = self.model_sampling return len(self.model_sampling.sigmas)
self.clean()
def clone(self) -> 'SigmaSchedule':
new_model_sampling = copy.deepcopy(self.model_sampling)
#new_config = copy.deepcopy(self.config)
return SigmaSchedule(model_sampling=new_model_sampling, model_type=self.model_type)
def clean(self): # def clone(self):
self.model_sampling = None # pass
@staticmethod
def apply_zsnr(new_model_sampling: comfy.model_sampling.ModelSamplingDiscrete):
new_model_sampling.set_sigmas(comfy_extras.nodes_model_advanced.rescale_zero_terminal_snr_sigmas(new_model_sampling.sigmas))
# def get_lcmified(self, original_timesteps=50, zsnr=False) -> 'SigmaSchedule':
# new_model_sampling = evolved_model_sampling(model_config=self.config, model_type=self.model_type, alias=None, original_timesteps=original_timesteps)
# if zsnr:
# new_model_sampling.set_sigmas(comfy_extras.nodes_model_advanced.rescale_zero_terminal_snr_sigmas(new_model_sampling.sigmas))
# return SigmaSchedule(model_sampling=new_model_sampling, config=self.config, model_type=self.model_type, is_lcm=True)
class InterpolationMethod:
LINEAR = "linear"
EASE_IN = "ease_in"
EASE_OUT = "ease_out"
EASE_IN_OUT = "ease_in_out"
_LIST = [LINEAR, EASE_IN, EASE_OUT, EASE_IN_OUT]
@classmethod
def get_weights(cls, num_from: float, num_to: float, length: int, method: str, reverse=False):
diff = num_to - num_from
if method == cls.LINEAR:
weights = torch.linspace(num_from, num_to, length)
elif method == cls.EASE_IN:
index = torch.linspace(0, 1, length)
weights = diff * np.power(index, 2) + num_from
elif method == cls.EASE_OUT:
index = torch.linspace(0, 1, length)
weights = diff * (1 - np.power(1 - index, 2)) + num_from
elif method == cls.EASE_IN_OUT:
index = torch.linspace(0, 1, length)
weights = diff * ((1 - np.cos(index * np.pi)) / 2) + num_from
else:
raise ValueError(f"Unrecognized interpolation method '{method}'.")
if reverse:
weights = weights.flip(dims=(0,))
return weights
class Folders: class Folders:
@@ -167,8 +313,6 @@ def calculate_model_hash(model: ModelPatcher):
m.update(buf.cpu().numpy().view(np.uint8)) m.update(buf.cpu().numpy().view(np.uint8))
return m.hexdigest() return m.hexdigest()
BIGMIN = -(2**63-1)
BIGMAX = (2**63-1)
class ModelTypeSD: class ModelTypeSD:
SD1_5 = "SD1.5" SD1_5 = "SD1.5"
@@ -285,6 +285,7 @@ app.registerExtension({
words[v] = { words[v] = {
text: v, text: v,
info: () => new EmbeddingInfoDialog(emb).show("embeddings", emb), info: () => new EmbeddingInfoDialog(emb).show("embeddings", emb),
use_replacer: false,
}; };
} }
@@ -303,6 +304,7 @@ app.registerExtension({
words[v] = { words[v] = {
text: v, text: v,
info: () => new LoraInfoDialog(lora).show("loras", lora), info: () => new LoraInfoDialog(lora).show("loras", lora),
use_replacer: false,
}; };
} }
@@ -576,7 +576,8 @@ export class TextAreaAutoComplete {
onclick: () => { onclick: () => {
this.el.focus(); this.el.focus();
let value = wordInfo.value ?? wordInfo.text; let value = wordInfo.value ?? wordInfo.text;
if (TextAreaAutoComplete.replacer) { const use_replacer = wordInfo.use_replacer ?? true;
if (TextAreaAutoComplete.replacer && use_replacer) {
value = TextAreaAutoComplete.replacer(value); value = TextAreaAutoComplete.replacer(value);
} }
this.helper.insertAtCursor(value + this.separator, -before.length, wordInfo.caretOffset); this.helper.insertAtCursor(value + this.separator, -before.length, wordInfo.caretOffset);
@@ -1,74 +0,0 @@
import { app } from "../../../scripts/app.js";
// Adds mapping of touch events to mouse events for mobile. This isnt great but it is somewhat usable
app.registerExtension({
name: "pysssss.TouchEvents",
setup() {
let touchStart = null;
let touchType = 0;
function fireEvent(originalEvent, type) {
const fakeEvent = document.createEvent("MouseEvent");
const touch = originalEvent.changedTouches[0];
fakeEvent.initMouseEvent(
type,
true,
true,
window,
1,
touch.screenX,
touch.screenY,
touch.clientX,
touch.clientY,
false,
false,
false,
false,
0,
null
);
touch.target.dispatchEvent(fakeEvent);
if (fakeEvent.defaultPrevented) {
originalEvent.preventDefault();
}
}
document.addEventListener(
"touchstart",
(e) => {
// Support tap as click if it completes within a delay
if (touchStart) {
clearTimeout(touchStart);
}
touchStart = setTimeout(() => {
touchStart = null;
}, 100);
// Left or right button down
touchType = e.touches.length === 1 ? 0 : 2;
fireEvent(e, "mousedown");
},
true
);
document.addEventListener("touchmove", (e) => fireEvent(e, "mousemove"), true);
document.addEventListener(
"touchend",
(e) => {
const isClick = touchStart;
if (isClick) {
// We are within the touch start delay so fire this as a click
clearTimeout(touchStart);
fireEvent(e, "click");
}
fireEvent(e, "mouseup");
touchType = 0;
},
true
);
},
});
@@ -25,8 +25,6 @@ s_param = '-s' if "python_embeded" in sys.executable else ''
def get_cuda_home_path(): def get_cuda_home_path():
if "CUDA_HOME" in os.environ: if "CUDA_HOME" in os.environ:
return os.environ["CUDA_HOME"] return os.environ["CUDA_HOME"]
if platform.system() == "Windows":
return str(Path(__file__).parent / "nvrtc_dlls") #https://github.com/cupy/cupy/issues/7776
import torch import torch
torch_lib_path = Path(torch.__file__).parent / "lib" torch_lib_path = Path(torch.__file__).parent / "lib"
torch_lib_path = str(torch_lib_path.resolve()) torch_lib_path = str(torch_lib_path.resolve())
@@ -41,8 +41,7 @@ class AMT_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}) "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -57,7 +56,7 @@ class AMT_VFI:
clear_cache_after_n_frames: typing.SupportsInt = 1, clear_cache_after_n_frames: typing.SupportsInt = 1,
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
model_path = load_file_from_direct_url(MODEL_TYPE, f"https://huggingface.co/lalala125/AMT/resolve/main/{ckpt_name}") model_path = load_file_from_direct_url(MODEL_TYPE, f"https://huggingface.co/lalala125/AMT/resolve/main/{ckpt_name}")
ckpt_config = CKPT_CONFIGS[ckpt_name] ckpt_config = CKPT_CONFIGS[ckpt_name]
@@ -81,7 +80,7 @@ class AMT_VFI:
args = [interpolation_model] args = [interpolation_model]
out = generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, out = generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, dtype=torch.float32)
out = padder.unpad(out) out = padder.unpad(out)
out = postprocess_frames(out) out = postprocess_frames(out)
return (out,) return (out,)
@@ -20,8 +20,7 @@ class CAIN_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}) "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -36,7 +35,7 @@ class CAIN_VFI:
clear_cache_after_n_frames: typing.SupportsInt = 1, clear_cache_after_n_frames: typing.SupportsInt = 1,
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
from .cain_arch import CAIN from .cain_arch import CAIN
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name) model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
@@ -60,6 +59,6 @@ class CAIN_VFI:
args = [interpolation_model] args = [interpolation_model]
out = postprocess_frames( out = postprocess_frames(
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float32)
) )
return (out,) return (out,)
@@ -50,8 +50,7 @@ class EISAI_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}), "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -66,7 +65,7 @@ class EISAI_VFI:
clear_cache_after_n_frames = 10, clear_cache_after_n_frames = 10,
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
interpolation_model = EISAI(MODEL_FILE_NAMES) interpolation_model = EISAI(MODEL_FILE_NAMES)
interpolation_model.eval().to(get_torch_device()) interpolation_model.eval().to(get_torch_device())
@@ -80,6 +79,6 @@ class EISAI_VFI:
args = [interpolation_model, scale] args = [interpolation_model, scale]
out = postprocess_frames( out = postprocess_frames(
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, dtype=torch.float32)
) )
return (out,) return (out,)
@@ -52,8 +52,7 @@ class FILM_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}), "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -68,14 +67,14 @@ class FILM_VFI:
clear_cache_after_n_frames = 10, clear_cache_after_n_frames = 10,
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
interpolation_states = optional_interpolation_states interpolation_states = optional_interpolation_states
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name) model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
model = torch.jit.load(model_path, map_location='cpu') model = torch.jit.load(model_path, map_location='cpu')
model.eval() model.eval()
model = model.to(DEVICE) model = model.to(DEVICE)
dtype = torch.float16 if cache_in_fp16 else torch.float32 dtype = torch.float32
frames = preprocess_frames(frames) frames = preprocess_frames(frames)
number_of_frames_processed_since_last_cleared_cuda_cache = 0 number_of_frames_processed_since_last_cleared_cuda_cache = 0
@@ -37,8 +37,7 @@ class FLAVR_VFI:
"duplicate_first_last_frames": ("BOOLEAN", {"default": False}) "duplicate_first_last_frames": ("BOOLEAN", {"default": False})
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -55,7 +54,7 @@ class FLAVR_VFI:
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
duplicate_first_last_frames: bool = False, duplicate_first_last_frames: bool = False,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
if multiplier != 2: if multiplier != 2:
warnings.warn("Currently, FLAVR only supports 2x interpolation. The process will continue but please set multiplier=2 afterward") warnings.warn("Currently, FLAVR only supports 2x interpolation. The process will continue but please set multiplier=2 afterward")
@@ -105,7 +104,7 @@ class FLAVR_VFI:
print("Done cache clearing") print("Done cache clearing")
gc.collect() gc.collect()
dtype = torch.float16 if cache_in_fp16 else torch.float32 dtype = torch.float32
output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames] #Ensure all frames are in cpu output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames] #Ensure all frames are in cpu
out = torch.cat(output_frames, dim=0) out = torch.cat(output_frames, dim=0)
out = padder.unpad(out) out = padder.unpad(out)
@@ -87,8 +87,7 @@ class GMFSS_Fortuna_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}), "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -103,7 +102,7 @@ class GMFSS_Fortuna_VFI:
clear_cache_after_n_frames = 10, clear_cache_after_n_frames = 10,
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
""" """
Perform video frame interpolation using a given checkpoint model. Perform video frame interpolation using a given checkpoint model.
@@ -139,6 +138,6 @@ class GMFSS_Fortuna_VFI:
args = [interpolation_model, scale] args = [interpolation_model, scale]
out = postprocess_frames( out = postprocess_frames(
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, dtype=torch.float32)
) )
return (out,) return (out,)
@@ -20,8 +20,7 @@ class IFRNet_VFI:
"scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0}), "scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0}),
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -37,7 +36,7 @@ class IFRNet_VFI:
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
scale_factor: typing.SupportsFloat = 1.0, scale_factor: typing.SupportsFloat = 1.0,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
from .IFRNet_S_arch import IRFNet_S from .IFRNet_S_arch import IRFNet_S
from .IFRNet_L_arch import IRFNet_L from .IFRNet_L_arch import IRFNet_L
@@ -53,6 +52,6 @@ class IFRNet_VFI:
args = [interpolation_model, scale_factor] args = [interpolation_model, scale_factor]
out = postprocess_frames( out = postprocess_frames(
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, dtype=torch.float32)
) )
return (out,) return (out,)
@@ -21,8 +21,7 @@ class IFUnet_VFI:
"ensemble": ("BOOLEAN", {"default":True}) "ensemble": ("BOOLEAN", {"default":True})
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -39,7 +38,7 @@ class IFUnet_VFI:
scale_factor: typing.SupportsFloat = 1.0, scale_factor: typing.SupportsFloat = 1.0,
ensemble: bool = True, ensemble: bool = True,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
from .IFUNet_arch import IFUNetModel from .IFUNet_arch import IFUNetModel
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name) model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
@@ -54,7 +53,7 @@ class IFUnet_VFI:
args = [interpolation_model, scale_factor, ensemble] args = [interpolation_model, scale_factor, ensemble]
out = postprocess_frames( out = postprocess_frames(
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, dtype=torch.float32)
) )
return (out,) return (out,)
@@ -22,8 +22,7 @@ class M2M_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}), "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -38,7 +37,7 @@ class M2M_VFI:
clear_cache_after_n_frames: typing.SupportsInt = 1, clear_cache_after_n_frames: typing.SupportsInt = 1,
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
from .M2M_arch import M2M_PWC from .M2M_arch import M2M_PWC
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name) model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
@@ -56,6 +55,6 @@ class M2M_VFI:
args = [interpolation_model] args = [interpolation_model]
out = postprocess_frames( out = postprocess_frames(
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, dtype=torch.float32)
) )
return (out,) return (out,)
@@ -217,8 +217,6 @@ def cuda_kernel(strFunction: str, strKernel: str, objVariables: typing.Dict, **r
def get_cuda_home_path(): def get_cuda_home_path():
if "CUDA_HOME" in os.environ: if "CUDA_HOME" in os.environ:
return os.environ["CUDA_HOME"] return os.environ["CUDA_HOME"]
if platform.system() == "Windows":
return str(Path(__file__).parent.parent.parent.parent / "nvrtc_dlls") #https://github.com/cupy/cupy/issues/7776
import torch import torch
torch_lib_path = Path(torch.__file__).parent / "lib" torch_lib_path = Path(torch.__file__).parent / "lib"
torch_lib_path = str(torch_lib_path.resolve()) torch_lib_path = str(torch_lib_path.resolve())
@@ -6,6 +6,7 @@ import typing
from comfy.model_management import get_torch_device from comfy.model_management import get_torch_device
import re import re
from functools import cmp_to_key from functools import cmp_to_key
from packaging import version
MODEL_TYPE = pathlib.Path(__file__).parent.name MODEL_TYPE = pathlib.Path(__file__).parent.name
CKPT_NAME_VER_DICT = { CKPT_NAME_VER_DICT = {
@@ -19,14 +20,13 @@ CKPT_NAME_VER_DICT = {
"rife47.pth": "4.7", "rife47.pth": "4.7",
"rife48.pth": "4.7", "rife48.pth": "4.7",
"rife49.pth": "4.7", "rife49.pth": "4.7",
"sudo_rife4_269.662_testV1_scale1.pth": "4.0"
#Arch 4.10 doesn't work due to state dict mismatch #Arch 4.10 doesn't work due to state dict mismatch
#TODO: Investigating and fix it #TODO: Investigating and fix it
#"rife410.pth": "4.10", #"rife410.pth": "4.10",
#"rife411.pth": "4.10", #"rife411.pth": "4.10",
#"rife412.pth": "4.10" #"rife412.pth": "4.10"
} }
ver_re = re.compile(r'\d+')
ver_cmp_key = cmp_to_key(lambda a,b: int(ver_re.search(a)[0]) > int(ver_re.search(b)[0]))
class RIFE_VFI: class RIFE_VFI:
@classmethod @classmethod
@@ -34,7 +34,7 @@ class RIFE_VFI:
return { return {
"required": { "required": {
"ckpt_name": ( "ckpt_name": (
sorted(list(CKPT_NAME_VER_DICT.keys()), key=ver_cmp_key), sorted(list(CKPT_NAME_VER_DICT.keys()), key=lambda ckpt_name: version.parse(CKPT_NAME_VER_DICT[ckpt_name])),
{"default": "rife47.pth"} {"default": "rife47.pth"}
), ),
"frames": ("IMAGE", ), "frames": ("IMAGE", ),
@@ -45,8 +45,7 @@ class RIFE_VFI:
"scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0}) "scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0})
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -64,7 +63,7 @@ class RIFE_VFI:
ensemble = False, ensemble = False,
scale_factor = 1.0, scale_factor = 1.0,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
""" """
Perform video frame interpolation using a given checkpoint model. Perform video frame interpolation using a given checkpoint model.
@@ -103,6 +102,6 @@ class RIFE_VFI:
args = [interpolation_model, scale_list, fast_mode, ensemble] args = [interpolation_model, scale_list, fast_mode, ensemble]
out = postprocess_frames( out = postprocess_frames(
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, dtype=torch.float32)
) )
return (out,) return (out,)
@@ -21,8 +21,7 @@ class SepconvVFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}) "multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -37,7 +36,7 @@ class SepconvVFI:
clear_cache_after_n_frames = 10, clear_cache_after_n_frames = 10,
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
from .sepconv_enhanced import Network from .sepconv_enhanced import Network
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name) model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
@@ -52,6 +51,6 @@ class SepconvVFI:
args = [interpolation_model] args = [interpolation_model]
out = postprocess_frames( out = postprocess_frames(
generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args, generic_frame_loop(frames, clear_cache_after_n_frames, multiplier, return_middle_frame, *args,
interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float16 if cache_in_fp16 else torch.float32) interpolation_states=optional_interpolation_states, use_timestep=False, dtype=torch.float32)
) )
return (out,) return (out,)
@@ -22,8 +22,7 @@ class STMFNet_VFI:
"duplicate_first_last_frames": ("BOOLEAN", {"default": False}) "duplicate_first_last_frames": ("BOOLEAN", {"default": False})
}, },
"optional": { "optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ), "optional_interpolation_states": ("INTERPOLATION_STATES", )
"cache_in_fp16": ("BOOLEAN", {"default": True})
} }
} }
@@ -40,7 +39,7 @@ class STMFNet_VFI:
multiplier: typing.SupportsInt = 2, multiplier: typing.SupportsInt = 2,
duplicate_first_last_frames: bool = False, duplicate_first_last_frames: bool = False,
optional_interpolation_states: InterpolationStateList = None, optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True **kwargs
): ):
from .stmfnet_arch import STMFNet_Model from .stmfnet_arch import STMFNet_Model
if multiplier != 2: if multiplier != 2:
@@ -91,7 +90,7 @@ class STMFNet_VFI:
print("Comfy-VFI: Done cache clearing") print("Comfy-VFI: Done cache clearing")
gc.collect() gc.collect()
dtype = torch.float16 if cache_in_fp16 else torch.float32 dtype = torch.float32
output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames] #Ensure all frames are in cpu output_frames = [frame.cpu().to(dtype=dtype) for frame in output_frames] #Ensure all frames are in cpu
out = torch.cat(output_frames, dim=0) out = torch.cat(output_frames, dim=0)
# clear cache for courtesy # clear cache for courtesy
@@ -144,15 +144,18 @@ def generic_frame_loop(
return [*first_half, *second_half] return [*first_half, *second_half]
assert_batch_size(frames) # Too lazy to include model name lol assert_batch_size(frames) # Too lazy to include model name lol
output_frames = [] # List to store processed frames in the correct order output_frames = torch.zeros(multiplier*frames.shape[0], *frames.shape[1:], dtype=dtype, device="cpu")
out_len = 0
number_of_frames_processed_since_last_cleared_cuda_cache = 0 number_of_frames_processed_since_last_cleared_cuda_cache = 0
for frame_itr in range(len(frames) - 1): # Skip the final frame since there are no frames after it for frame_itr in range(len(frames) - 1): # Skip the final frame since there are no frames after it
#Ensure that input frames are in fp32 - the same dtype as model frame0 = frames[frame_itr:frame_itr+1]
frame0 = frames[frame_itr:frame_itr+1].float() output_frames[out_len] = frame0 # Start with first frame
frame1 = frames[frame_itr+1:frame_itr+2].float() out_len += 1
output_frames.append(frame0.to(dtype=dtype)) # Start with first frame # Ensure that input frames are in fp32 - the same dtype as model
frame0 = frame0.to(dtype=torch.float32)
frame1 = frames[frame_itr+1:frame_itr+2].to(dtype=torch.float32)
if interpolation_states is not None and interpolation_states.is_frame_skipped(frame_itr): if interpolation_states is not None and interpolation_states.is_frame_skipped(frame_itr):
continue continue
@@ -175,8 +178,10 @@ def generic_frame_loop(
middle_frames = non_timestep_inference(frame0.to(DEVICE), frame1.to(DEVICE), multiplier - 1) middle_frames = non_timestep_inference(frame0.to(DEVICE), frame1.to(DEVICE), multiplier - 1)
middle_frame_batches.extend(torch.cat(middle_frames, dim=0).detach().cpu().to(dtype=dtype)) middle_frame_batches.extend(torch.cat(middle_frames, dim=0).detach().cpu().to(dtype=dtype))
# Extend output array by batch # Copy middle frames to output
output_frames.extend(middle_frame_batches) for middle_frame in middle_frame_batches:
output_frames[out_len] = middle_frame
out_len += 1
number_of_frames_processed_since_last_cleared_cuda_cache += 1 number_of_frames_processed_since_last_cleared_cuda_cache += 1
# Try to avoid a memory overflow by clearing cuda cache regularly # Try to avoid a memory overflow by clearing cuda cache regularly
@@ -189,14 +194,14 @@ def generic_frame_loop(
gc.collect() gc.collect()
print(f"Comfy-VFI done! {len(output_frames)} frames generated at resolution: {output_frames[0].shape}") print(f"Comfy-VFI done! {len(output_frames)} frames generated at resolution: {output_frames[0].shape}")
output_frames.append(frames[-1:].to(dtype=dtype)) # Append final frame # Append final frame
output_frames = [frame.cpu() for frame in output_frames] #Ensure all frames are in cpu output_frames[out_len] = frames[-1:]
out = torch.cat(output_frames, dim=0) out_len += 1
# clear cache for courtesy # clear cache for courtesy
print("Comfy-VFI: Final clearing cache...", end = ' ') print("Comfy-VFI: Final clearing cache...", end = ' ')
soft_empty_cache() soft_empty_cache()
print("Done cache clearing") print("Done cache clearing")
return out return output_frames[:out_len]
""" def generic_4frame_loop( """ def generic_4frame_loop(
frames, frames,
@@ -7,6 +7,8 @@ This custom node helps to conveniently enhance images through Detector, Detailer
## NOTICE ## NOTICE
* V4.77: Compatibility patch applied. Requires ComfyUI version (Oct. 8th) or later.
* V4.73.3: ControlNetApply (SEGS) supports AnimateDiff
* V4.20.1: Due to the feature update in `RegionalSampler`, the parameter order has changed, causing malfunctions in previously created `RegionalSamplers`. Please adjust the parameters accordingly. * V4.20.1: Due to the feature update in `RegionalSampler`, the parameter order has changed, causing malfunctions in previously created `RegionalSamplers`. Please adjust the parameters accordingly.
* V4.12: `MASKS` is changed to `MASK`. * V4.12: `MASKS` is changed to `MASK`.
* V4.7.2 isn't compatible with old version of `ControlNet Auxiliary Preprocessor`. If you will use `MediaPipe FaceMesh to SEGS` update to latest version(Sep. 17th). * V4.7.2 isn't compatible with old version of `ControlNet Auxiliary Preprocessor`. If you will use `MediaPipe FaceMesh to SEGS` update to latest version(Sep. 17th).
@@ -41,8 +43,9 @@ This custom node helps to conveniently enhance images through Detector, Detailer
* ControlNet * ControlNet
* ControlNetApply (SEGS) - To apply ControlNet in SEGS, you need to use the Preprocessor Provider node from the Inspire Pack to utilize this node. * ControlNetApply (SEGS) - To apply ControlNet in SEGS, you need to use the Preprocessor Provider node from the Inspire Pack to utilize this node.
* `SEGSPreprocessor` and `Image` can be selectively applied. If an `Image` is given, `SEGSPreprocessor` will be ignored. * `segs_preprocessor` and `control_image` can be selectively applied. If an `control_image` is given, `segs_preprocessor` will be ignored.
* If set to `Image`, you can preview the cropped cnet image through `SEGSPreview (CNET Image)`. Images generated by `SEGSPreprocessor` should be verified through the `cnet_pil` output of each Detailer. * If set to `control_image`, you can preview the cropped cnet image through `SEGSPreview (CNET Image)`. Images generated by `segs_preprocessor` should be verified through the `cnet_images` output of each Detailer.
* The `segs_preprocessor` operates by applying preprocessing on-the-fly based on the cropped image during the detailing process, while `control_image` will be cropped and used as input to `ControlNetApply (SEGS)`.
* ControlNetClear (SEGS) - Clear applied ControlNet in SEGS * ControlNetClear (SEGS) - Clear applied ControlNet in SEGS
* Bitwise(SEGS & SEGS) - Performs a 'bitwise and' operation between two SEGS. * Bitwise(SEGS & SEGS) - Performs a 'bitwise and' operation between two SEGS.
@@ -89,6 +92,7 @@ This custom node helps to conveniently enhance images through Detector, Detailer
* SEGS Filter (label) - This node filters SEGS based on the label of the detected areas. * SEGS Filter (label) - This node filters SEGS based on the label of the detected areas.
* SEGS Filter (ordered) - This node sorts SEGS based on size and position and retrieves SEGs within a certain range. * SEGS Filter (ordered) - This node sorts SEGS based on size and position and retrieves SEGs within a certain range.
* SEGS Filter (range) - This node retrieves only SEGs from SEGS that have a size and position within a certain range. * SEGS Filter (range) - This node retrieves only SEGs from SEGS that have a size and position within a certain range.
* SEGS Assign (label) - Assign labels sequentially to SEGS. This node is useful when used with `[LAB]` of FaceDetailer.
* SEGSConcat - Concatenate segs1 and segs2. If source shape of segs1 and segs2 are different from segs2 will be ignored. * SEGSConcat - Concatenate segs1 and segs2. If source shape of segs1 and segs2 are different from segs2 will be ignored.
* Picker (SEGS) - Among the input SEGS, you can select a specific SEG through a dialog. If no SEG is selected, it outputs an empty SEGS. Increasing the batch_size of SEGSDetailer can be used for the purpose of selecting from the candidates. * Picker (SEGS) - Among the input SEGS, you can select a specific SEG through a dialog. If no SEG is selected, it outputs an empty SEGS. Increasing the batch_size of SEGSDetailer can be used for the purpose of selecting from the candidates.
* Set Default Image For SEGS - Set a default image for SEGS. SEGS with images set this way do not need to have a fallback image set. When override is set to false, the original image is preserved. * Set Default Image For SEGS - Set a default image for SEGS. SEGS with images set this way do not need to have a fallback image set. When override is set to false, the original image is preserved.
@@ -122,8 +126,9 @@ This custom node helps to conveniently enhance images through Detector, Detailer
* You need to install the [BlenderNeko/ComfyUI_TiledKSampler](https://github.com/BlenderNeko/ComfyUI_TiledKSampler) node extension. * You need to install the [BlenderNeko/ComfyUI_TiledKSampler](https://github.com/BlenderNeko/ComfyUI_TiledKSampler) node extension.
* PK_HOOK * PK_HOOK
* DenoiseScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the denoise to target_denoise as the step progresses. * DenoiseScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the denoise to target_denoise as the iterative-step progresses.
* CfgScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the cfg to target_cfg as the step progresses. * CfgScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the cfg to target_cfg as the iterative-step progresses.
* StepsScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the sampling-steps to target_steps as the iterative-step progresses.
* NoiseInjectionHookProvider - During each iteration of IterativeUpscale, noise is injected into the latent space while varying the strength according to a schedule. * NoiseInjectionHookProvider - During each iteration of IterativeUpscale, noise is injected into the latent space while varying the strength according to a schedule.
* You need to install the [BlenderNeko/ComfyUI_Noise](https://github.com/BlenderNeko/ComfyUI_Noise) node extension. * You need to install the [BlenderNeko/ComfyUI_Noise](https://github.com/BlenderNeko/ComfyUI_Noise) node extension.
* The seed serves as the initial value required for generating noise, and it increments by 1 with each iteration as the process unfolds. * The seed serves as the initial value required for generating noise, and it increments by 1 with each iteration as the process unfolds.
@@ -155,7 +160,8 @@ This takes latent as input and outputs latent as the result.
* You need to install the [BlenderNeko/ComfyUI_TiledKSampler](https://github.com/BlenderNeko/ComfyUI_TiledKSampler) node extension. * You need to install the [BlenderNeko/ComfyUI_TiledKSampler](https://github.com/BlenderNeko/ComfyUI_TiledKSampler) node extension.
* TwoAdvancedSamplersForMask - TwoSamplersForMask is similar to TwoAdvancedSamplersForMask, but they differ in their operation. TwoSamplersForMask performs sampling in the mask area only after all the samples in the base area are finished. On the other hand, TwoAdvancedSamplersForMask performs sampling in both the base area and the mask area sequentially at each step. * TwoAdvancedSamplersForMask - TwoSamplersForMask is similar to TwoAdvancedSamplersForMask, but they differ in their operation. TwoSamplersForMask performs sampling in the mask area only after all the samples in the base area are finished. On the other hand, TwoAdvancedSamplersForMask performs sampling in both the base area and the mask area sequentially at each step.
* KSamplerAdvancedProvider - This is a wrapper that enables KSampler to be used in TwoAdvancedSamplersForMask. * KSamplerAdvancedProvider - This is a wrapper that enables KSampler to be used in TwoAdvancedSamplersForMask, RegionalSampler.
* sigma_factor: By multiplying the denoise schedule by the sigma_factor, you can adjust the amount of denoising based on the configured denoise.
* TwoSamplersForMaskUpscalerProvider - This is an Upscaler that extends TwoSamplersForMask to be used in Iterative Upscale. * TwoSamplersForMaskUpscalerProvider - This is an Upscaler that extends TwoSamplersForMask to be used in Iterative Upscale.
* TwoSamplersForMaskUpscalerProviderPipe - pipe version of TwoSamplersForMaskUpscalerProvider. * TwoSamplersForMaskUpscalerProviderPipe - pipe version of TwoSamplersForMaskUpscalerProvider.
@@ -176,6 +176,7 @@ NODE_CLASS_MAPPINGS = {
"PixelKSampleHookCombine": PixelKSampleHookCombine, "PixelKSampleHookCombine": PixelKSampleHookCombine,
"DenoiseScheduleHookProvider": DenoiseScheduleHookProvider, "DenoiseScheduleHookProvider": DenoiseScheduleHookProvider,
"StepsScheduleHookProvider": StepsScheduleHookProvider,
"CfgScheduleHookProvider": CfgScheduleHookProvider, "CfgScheduleHookProvider": CfgScheduleHookProvider,
"NoiseInjectionHookProvider": NoiseInjectionHookProvider, "NoiseInjectionHookProvider": NoiseInjectionHookProvider,
"UnsamplerHookProvider": UnsamplerHookProvider, "UnsamplerHookProvider": UnsamplerHookProvider,
@@ -285,6 +286,7 @@ NODE_CLASS_MAPPINGS = {
"ImpactCombineConditionings": CombineConditionings, "ImpactCombineConditionings": CombineConditionings,
"ImpactConcatConditionings": ConcatConditionings, "ImpactConcatConditionings": ConcatConditionings,
"ImpactSEGSLabelAssign": SEGSLabelAssign,
"ImpactSEGSLabelFilter": SEGSLabelFilter, "ImpactSEGSLabelFilter": SEGSLabelFilter,
"ImpactSEGSRangeFilter": SEGSRangeFilter, "ImpactSEGSRangeFilter": SEGSRangeFilter,
"ImpactSEGSOrderedFilter": SEGSOrderedFilter, "ImpactSEGSOrderedFilter": SEGSOrderedFilter,
@@ -384,6 +386,7 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"ImpactKSamplerBasicPipe": "KSampler (pipe)", "ImpactKSamplerBasicPipe": "KSampler (pipe)",
"ImpactKSamplerAdvancedBasicPipe": "KSampler (Advanced/pipe)", "ImpactKSamplerAdvancedBasicPipe": "KSampler (Advanced/pipe)",
"ImpactSEGSLabelAssign": "SEGS Assign (label)",
"ImpactSEGSLabelFilter": "SEGS Filter (label)", "ImpactSEGSLabelFilter": "SEGS Filter (label)",
"ImpactSEGSRangeFilter": "SEGS Filter (range)", "ImpactSEGSRangeFilter": "SEGS Filter (range)",
"ImpactSEGSOrderedFilter": "SEGS Filter (ordered)", "ImpactSEGSOrderedFilter": "SEGS Filter (ordered)",
@@ -65,7 +65,7 @@ class SEGSDetailerForAnimateDiff:
else: else:
cropped_image_frames = torch.concat((cropped_image_frames, cropped_image), dim=0) cropped_image_frames = torch.concat((cropped_image_frames, cropped_image), dim=0)
cropped_image_frames = cropped_image_frames.numpy() cropped_image_frames = cropped_image_frames.cpu().numpy()
enhanced_image_tensor, cnet_images = core.enhance_detail_for_animatediff(cropped_image_frames, model, clip, vae, guide_size, guide_size_for, max_size, enhanced_image_tensor, cnet_images = core.enhance_detail_for_animatediff(cropped_image_frames, model, clip, vae, guide_size, guide_size_for, max_size,
seg.bbox, seed, steps, cfg, sampler_name, scheduler, seg.bbox, seed, steps, cfg, sampler_name, scheduler,
positive, negative, denoise, seg.cropped_mask, positive, negative, denoise, seg.cropped_mask,
@@ -79,7 +79,7 @@ class SEGSDetailerForAnimateDiff:
if enhanced_image_tensor is None: if enhanced_image_tensor is None:
new_cropped_image = cropped_image_frames new_cropped_image = cropped_image_frames
else: else:
new_cropped_image = enhanced_image_tensor.numpy() new_cropped_image = enhanced_image_tensor.cpu().numpy()
new_seg = SEG(new_cropped_image, seg.cropped_mask, seg.confidence, seg.crop_region, seg.bbox, seg.label, None) new_seg = SEG(new_cropped_image, seg.cropped_mask, seg.confidence, seg.crop_region, seg.bbox, seg.label, None)
new_segs.append(new_seg) new_segs.append(new_seg)
@@ -2,7 +2,7 @@ import configparser
import os import os
version_code = [4, 73, 3] version_code = [4, 78]
version = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '') version = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
dependency_version = 20 dependency_version = 20
@@ -370,7 +370,7 @@ def enhance_detail_for_animatediff(image_frames, model, clip, vae, guide_size, g
cnet_images = None cnet_images = None
if control_net_wrapper is not None: if control_net_wrapper is not None:
positive, negative, cnet_images = control_net_wrapper.apply(positive, negative, torch.from_numpy(image_frames), noise_mask) positive, negative, cnet_images = control_net_wrapper.apply(positive, negative, torch.from_numpy(image_frames), noise_mask, use_acn=True)
if len(upscaled_mask) != len(image_frames) and len(upscaled_mask) > 1: if len(upscaled_mask) != len(image_frames) and len(upscaled_mask) > 1:
print(f"[Impact Pack] WARN: DetailerForAnimateDiff - The number of the mask frames({len(upscaled_mask)}) and the image frames({len(image_frames)}) are different. Combine the mask frames and apply.") print(f"[Impact Pack] WARN: DetailerForAnimateDiff - The number of the mask frames({len(upscaled_mask)}) and the image frames({len(image_frames)}) are different. Combine the mask frames and apply.")
@@ -1505,26 +1505,36 @@ class ControlNetWrapper:
else: else:
self.control_image = None self.control_image = None
def apply(self, positive, negative, image, mask=None): def apply(self, positive, negative, image, mask=None, use_acn=False):
cnet_tensors = [] cnet_image_list = []
prev_cnet_tensors = [] prev_cnet_images = []
if self.prev_control_net is not None: if self.prev_control_net is not None:
positive, negative, prev_cnet_tensors = self.prev_control_net.apply(positive, negative, image, mask) positive, negative, prev_cnet_images = self.prev_control_net.apply(positive, negative, image, mask, use_acn=use_acn)
if self.control_image is not None: if self.control_image is not None:
cnet_tensor = self.control_image cnet_image = self.control_image
elif self.preprocessor is not None: elif self.preprocessor is not None:
cnet_tensor = self.preprocessor.apply(image, mask) cnet_image = self.preprocessor.apply(image, mask)
else: else:
cnet_tensor = image cnet_image = image
cnet_tensors.extend(prev_cnet_tensors) cnet_image_list.extend(prev_cnet_images)
cnet_tensors.append(cnet_tensor) cnet_image_list.append(cnet_image)
positive = nodes.ControlNetApply().apply_controlnet(positive, self.control_net, cnet_tensor, self.strength)[0] if use_acn:
if "ACN_AdvancedControlNetApply" in nodes.NODE_CLASS_MAPPINGS:
acn = nodes.NODE_CLASS_MAPPINGS['ACN_AdvancedControlNetApply']()
positive, negative, _ = acn.apply_controlnet(positive=positive, negative=negative, control_net=self.control_net, image=cnet_image,
strength=self.strength, start_percent=0.0, end_percent=1.0)
else:
utils.try_install_custom_node('https://github.com/BlenderNeko/ComfyUI_TiledKSampler',
"To use 'ControlNetWrapper' for AnimateDiff, 'ComfyUI-Advanced-ControlNet' extension is required.")
raise Exception("'ACN_AdvancedControlNetApply' node isn't installed.")
else:
positive = nodes.ControlNetApply().apply_controlnet(positive, self.control_net, cnet_image, self.strength)[0]
return positive, negative, cnet_tensors return positive, negative, cnet_image_list
class ControlNetAdvancedWrapper: class ControlNetAdvancedWrapper:
@@ -1543,26 +1553,36 @@ class ControlNetAdvancedWrapper:
else: else:
self.control_image = None self.control_image = None
def apply(self, positive, negative, image, mask=None): def apply(self, positive, negative, image, mask=None, use_acn=False):
cnet_tensors = [] cnet_image_list = []
prev_cnet_tensors = [] prev_cnet_images = []
if self.prev_control_net is not None: if self.prev_control_net is not None:
positive, negative, prev_cnet_tensors = self.prev_control_net.apply(positive, negative, image, mask) positive, negative, prev_cnet_images = self.prev_control_net.apply(positive, negative, image, mask)
if self.control_image is not None: if self.control_image is not None:
cnet_tensor = self.control_image cnet_image = self.control_image
elif self.preprocessor is not None: elif self.preprocessor is not None:
cnet_tensor = self.preprocessor.apply(image, mask) cnet_image = self.preprocessor.apply(image, mask)
else: else:
cnet_tensor = image cnet_image = image
cnet_tensors.extend(prev_cnet_tensors) cnet_image_list.extend(prev_cnet_images)
cnet_tensors.append(cnet_tensor) cnet_image_list.append(cnet_image)
conditioning = nodes.ControlNetApplyAdvanced().apply_controlnet(positive, negative, self.control_net, cnet_tensor, self.strength, self.start_percent, self.end_percent) if use_acn:
if "ACN_AdvancedControlNetApply" in nodes.NODE_CLASS_MAPPINGS:
acn = nodes.NODE_CLASS_MAPPINGS['ACN_AdvancedControlNetApply']()
positive, negative, _ = acn.apply_controlnet(positive=positive, negative=negative, control_net=self.control_net, image=cnet_image,
strength=self.strength, start_percent=self.start_percent, end_percent=self.end_percent)
else:
utils.try_install_custom_node('https://github.com/BlenderNeko/ComfyUI_TiledKSampler',
"To use 'ControlNetAdvancedWrapper' for AnimateDiff, 'ComfyUI-Advanced-ControlNet' extension is required.")
raise Exception("'ACN_AdvancedControlNetApply' node isn't installed.")
else:
positive, negative = nodes.ControlNetApplyAdvanced().apply_controlnet(positive, negative, self.control_net, cnet_image, self.strength, self.start_percent, self.end_percent)
return conditioning[0], conditioning[1], cnet_tensors return positive, negative, cnet_image_list
# REQUIREMENTS: BlenderNeko/ComfyUI_TiledKSampler # REQUIREMENTS: BlenderNeko/ComfyUI_TiledKSampler
@@ -109,11 +109,14 @@ class SimpleCfgScheduleHook(PixelKSampleHook):
super().__init__() super().__init__()
self.target_cfg = target_cfg self.target_cfg = target_cfg
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise):
denoise): if self.total_step > 1:
progress = self.cur_step / self.total_step progress = self.cur_step / (self.total_step - 1)
gap = self.target_cfg - cfg gap = self.target_cfg - cfg
current_cfg = cfg + gap * progress current_cfg = int(cfg + gap * progress)
else:
current_cfg = self.target_cfg
return model, seed, steps, current_cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise return model, seed, steps, current_cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise
@@ -122,14 +125,33 @@ class SimpleDenoiseScheduleHook(PixelKSampleHook):
super().__init__() super().__init__()
self.target_denoise = target_denoise self.target_denoise = target_denoise
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise):
denoise): if self.total_step > 1:
progress = self.cur_step / self.total_step progress = self.cur_step / (self.total_step - 1)
gap = self.target_denoise - denoise gap = self.target_denoise - denoise
current_denoise = denoise + gap * progress current_denoise = denoise + gap * progress
else:
current_denoise = self.target_denoise
return model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, current_denoise return model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, current_denoise
class SimpleStepsScheduleHook(PixelKSampleHook):
def __init__(self, target_steps):
super().__init__()
self.target_steps = target_steps
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise):
if self.total_step > 1:
progress = self.cur_step / (self.total_step - 1)
gap = self.target_steps - steps
current_steps = int(steps + gap * progress)
else:
current_steps = self.target_steps
return model, seed, current_steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent, denoise
class DetailerHook(PixelKSampleHook): class DetailerHook(PixelKSampleHook):
def cycle_latent(self, latent): def cycle_latent(self, latent):
return latent return latent
@@ -147,9 +169,14 @@ class SimpleDetailerDenoiseSchedulerHook(DetailerHook):
self.target_denoise = target_denoise self.target_denoise = target_denoise
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, denoise): def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, denoise):
progress = self.cur_step / self.total_step if self.total_step > 1:
gap = self.target_denoise - denoise progress = self.cur_step / (self.total_step - 1)
current_denoise = denoise + gap * progress gap = self.target_denoise - denoise
current_denoise = denoise + gap * progress
else:
# ignore hook if total cycle <= 1
current_denoise = denoise
return model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, current_denoise return model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, current_denoise
@@ -237,8 +237,10 @@ class DetailerForEach:
else: else:
cropped_mask = None cropped_mask = None
if wildcard_chooser is not None: if wildcard_chooser is not None and wmode != "LAB":
seg_seed, wildcard_item = wildcard_chooser.get(seg) seg_seed, wildcard_item = wildcard_chooser.get(seg)
elif wildcard_chooser is not None and wmode == "LAB":
seg_seed, wildcard_item = None, wildcard_chooser.get(seg)
else: else:
seg_seed, wildcard_item = None, None seg_seed, wildcard_item = None, None
@@ -272,7 +274,7 @@ class DetailerForEach:
# Convert enhanced_pil_alpha to RGBA mode # Convert enhanced_pil_alpha to RGBA mode
enhanced_image_alpha = tensor_convert_rgba(enhanced_image) enhanced_image_alpha = tensor_convert_rgba(enhanced_image)
new_seg_image = enhanced_image.numpy() # alpha should not be applied to seg_image new_seg_image = enhanced_image.numpy() # alpha should not be applied to seg_image
# Apply the mask # Apply the mask
mask = tensor_resize(mask, *tensor_get_size(enhanced_image)) mask = tensor_resize(mask, *tensor_get_size(enhanced_image))
tensor_putalpha(enhanced_image_alpha, mask) tensor_putalpha(enhanced_image_alpha, mask)
@@ -780,6 +782,30 @@ class DenoiseScheduleHookProvider:
return (hook, ) return (hook, )
class StepsScheduleHookProvider:
schedules = ["simple"]
@classmethod
def INPUT_TYPES(s):
return {"required": {
"schedule_for_iteration": (s.schedules,),
"target_steps": ("INT", {"default": 20, "min": 1, "max": 10000}),
},
}
RETURN_TYPES = ("PK_HOOK",)
FUNCTION = "doit"
CATEGORY = "ImpactPack/Upscale"
def doit(self, schedule_for_iteration, target_steps):
hook = None
if schedule_for_iteration == "simple":
hook = hooks.SimpleStepsScheduleHook(target_steps)
return (hook, )
class DetailerHookCombine: class DetailerHookCombine:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
@@ -1104,7 +1130,7 @@ class IterativeLatentUpscale:
new_h = h*upscale_factor new_h = h*upscale_factor
core.update_node_status(unique_id, f"Final step | x{upscale_factor:.2f}", 1.0) core.update_node_status(unique_id, f"Final step | x{upscale_factor:.2f}", 1.0)
print(f"IterativeLatentUpscale[Final]: {new_w:.1f}x{new_h:.1f} (scale:{upscale_factor:.2f}) ") print(f"IterativeLatentUpscale[Final]: {new_w:.1f}x{new_h:.1f} (scale:{upscale_factor:.2f}) ")
step_info = steps, steps step_info = steps-1, steps
current_latent = upscaler.upscale_shape(step_info, current_latent, new_w, new_h, temp_prefix) current_latent = upscaler.upscale_shape(step_info, current_latent, new_w, new_h, temp_prefix)
core.update_node_status(unique_id, "", None) core.update_node_status(unique_id, "", None)
@@ -1451,7 +1477,7 @@ class SegsBitwiseAndMask:
def doit(self, segs, mask): def doit(self, segs, mask):
return (core.segs_bitwise_and_mask(segs, mask), ) return (core.segs_bitwise_and_mask(segs, mask), )
class SegsBitwiseAndMaskForEach: class SegsBitwiseAndMaskForEach:
@classmethod @classmethod
@@ -1626,7 +1652,7 @@ class SubtractMask:
"mask2": ("MASK", ), "mask2": ("MASK", ),
} }
} }
RETURN_TYPES = ("MASK",) RETURN_TYPES = ("MASK",)
FUNCTION = "doit" FUNCTION = "doit"
@@ -1757,7 +1783,7 @@ class ImageReceiver:
return hash(image_data) return hash(image_data)
else: else:
return hash(image) return hash(image)
from server import PromptServer from server import PromptServer
@@ -119,18 +119,18 @@ def separated_sample(model, add_noise, seed, steps, cfg, sampler_name, scheduler
def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise, def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise,
refiner_ratio=None, refiner_model=None, refiner_clip=None, refiner_positive=None, refiner_negative=None): refiner_ratio=None, refiner_model=None, refiner_clip=None, refiner_positive=None, refiner_negative=None, sigma_factor=1.0):
if refiner_ratio is None or refiner_model is None or refiner_clip is None or refiner_positive is None or refiner_negative is None: if refiner_ratio is None or refiner_model is None or refiner_clip is None or refiner_positive is None or refiner_negative is None:
refined_latent = nodes.KSampler().sample(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise)[0] refined_latent = nodes.KSampler().sample(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise * sigma_factor)[0]
else: else:
advanced_steps = math.floor(steps / denoise) advanced_steps = math.floor(steps / denoise)
start_at_step = advanced_steps - steps start_at_step = advanced_steps - steps
end_at_step = start_at_step + math.floor(steps * (1.0 - refiner_ratio)) end_at_step = start_at_step + math.floor(steps * (1.0 - refiner_ratio))
print(f"pre: {start_at_step} .. {end_at_step} / {advanced_steps}") # print(f"pre: {start_at_step} .. {end_at_step} / {advanced_steps}")
temp_latent = separated_sample(model, True, seed, advanced_steps, cfg, sampler_name, scheduler, temp_latent = separated_sample(model, True, seed, advanced_steps, cfg, sampler_name, scheduler,
positive, negative, latent_image, start_at_step, end_at_step, True) positive, negative, latent_image, start_at_step, end_at_step, True, sigma_ratio=sigma_factor)
if 'noise_mask' in latent_image: if 'noise_mask' in latent_image:
# noise_latent = \ # noise_latent = \
@@ -141,9 +141,9 @@ def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive,
latent_compositor = nodes.NODE_CLASS_MAPPINGS['LatentCompositeMasked']() latent_compositor = nodes.NODE_CLASS_MAPPINGS['LatentCompositeMasked']()
temp_latent = latent_compositor.composite(latent_image, temp_latent, 0, 0, False, latent_image['noise_mask'])[0] temp_latent = latent_compositor.composite(latent_image, temp_latent, 0, 0, False, latent_image['noise_mask'])[0]
print(f"post: {end_at_step} .. {advanced_steps + 1} / {advanced_steps}") # print(f"post: {end_at_step} .. {advanced_steps + 1} / {advanced_steps}")
refined_latent = separated_sample(refiner_model, False, seed, advanced_steps, cfg, sampler_name, scheduler, refined_latent = separated_sample(refiner_model, False, seed, advanced_steps, cfg, sampler_name, scheduler,
refiner_positive, refiner_negative, temp_latent, end_at_step, advanced_steps + 1, False) refiner_positive, refiner_negative, temp_latent, end_at_step, advanced_steps + 1, False, sigma_ratio=sigma_factor)
return refined_latent return refined_latent
@@ -151,18 +151,19 @@ def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive,
class KSamplerAdvancedWrapper: class KSamplerAdvancedWrapper:
params = None params = None
def __init__(self, model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=None): def __init__(self, model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=None, sigma_factor=1.0):
self.params = model, cfg, sampler_name, scheduler, positive, negative self.params = model, cfg, sampler_name, scheduler, positive, negative, sigma_factor
self.sampler_opt = sampler_opt self.sampler_opt = sampler_opt
def clone_with_conditionings(self, positive, negative): def clone_with_conditionings(self, positive, negative):
model, cfg, sampler_name, scheduler, _, _ = self.params model, cfg, sampler_name, scheduler, _, _, _ = self.params
return KSamplerAdvancedWrapper(model, cfg, sampler_name, scheduler, positive, negative, self.sampler_opt) return KSamplerAdvancedWrapper(model, cfg, sampler_name, scheduler, positive, negative, self.sampler_opt)
def sample_advanced(self, add_noise, seed, steps, latent_image, start_at_step, end_at_step, return_with_leftover_noise, hook=None, def sample_advanced(self, add_noise, seed, steps, latent_image, start_at_step, end_at_step, return_with_leftover_noise, hook=None,
recovery_mode="ratio additional", recovery_sampler="AUTO", recovery_sigma_ratio=1.0): recovery_mode="ratio additional", recovery_sampler="AUTO", recovery_sigma_ratio=1.0):
model, cfg, sampler_name, scheduler, positive, negative = self.params model, cfg, sampler_name, scheduler, positive, negative, sigma_factor = self.params
# steps, start_at_step, end_at_step = self.compensate_denoise(steps, start_at_step, end_at_step)
if hook is not None: if hook is not None:
model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent = hook.pre_ksample_advanced(model, add_noise, seed, steps, cfg, sampler_name, scheduler, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent = hook.pre_ksample_advanced(model, add_noise, seed, steps, cfg, sampler_name, scheduler,
@@ -183,7 +184,7 @@ class KSamplerAdvancedWrapper:
if sigma_ratio > 0: if sigma_ratio > 0:
latent_image = separated_sample(model, add_noise, seed, steps, cfg, sampler_name, scheduler, latent_image = separated_sample(model, add_noise, seed, steps, cfg, sampler_name, scheduler,
positive, negative, latent_image, start_at_step, end_at_step, positive, negative, latent_image, start_at_step, end_at_step,
return_with_leftover_noise, sigma_ratio=sigma_ratio, sampler_opt=self.sampler_opt) return_with_leftover_noise, sigma_ratio=sigma_ratio * sigma_factor, sampler_opt=self.sampler_opt)
except ValueError as e: except ValueError as e:
if str(e) == 'sigma_min and sigma_max must not be 0': if str(e) == 'sigma_min and sigma_max must not be 0':
print(f"\nWARN: sampling skipped - sigma_min and sigma_max are 0") print(f"\nWARN: sampling skipped - sigma_min and sigma_max are 0")
@@ -207,7 +208,7 @@ class KSamplerAdvancedWrapper:
try: try:
latent_image = separated_sample(model, add_noise, seed, steps, cfg, recovery_sampler, scheduler, latent_image = separated_sample(model, add_noise, seed, steps, cfg, recovery_sampler, scheduler,
positive, negative, latent_image, start_at_step-compensate, end_at_step, positive, negative, latent_image, start_at_step-compensate, end_at_step,
return_with_leftover_noise, sigma_ratio=recovery_sigma_ratio, sampler_opt=self.sampler_opt) return_with_leftover_noise, sigma_ratio=recovery_sigma_ratio * sigma_factor, sampler_opt=self.sampler_opt)
except ValueError as e: except ValueError as e:
if str(e) == 'sigma_min and sigma_max must not be 0': if str(e) == 'sigma_min and sigma_max must not be 0':
print(f"\nWARN: sampling skipped - sigma_min and sigma_max are 0") print(f"\nWARN: sampling skipped - sigma_min and sigma_max are 0")
@@ -1,5 +1,6 @@
import folder_paths import folder_paths
from impact.core import * from impact.core import *
import os
import mmcv import mmcv
from mmdet.apis import (inference_detector, init_detector) from mmdet.apis import (inference_detector, init_detector)
@@ -415,6 +415,44 @@ class SEGSLabelFilter:
return SEGSLabelFilter.filter(segs, labels) return SEGSLabelFilter.filter(segs, labels)
class SEGSLabelAssign:
@classmethod
def INPUT_TYPES(s):
return {"required": {
"segs": ("SEGS", ),
"labels": ("STRING", {"multiline": True, "placeholder": "List the label to be assigned in order of segs, separated by commas"}),
},
}
RETURN_TYPES = ("SEGS",)
RETURN_NAMES = ("SEGS",)
FUNCTION = "doit"
CATEGORY = "ImpactPack/Util"
@staticmethod
def assign(segs, labels):
labels = [label.strip() for label in labels]
if len(labels) != len(segs[1]):
print(f'Warning (SEGSLabelAssign): length of labels ({len(labels)}) != length of segs ({len(segs[1])})')
labeled_segs = []
idx = 0
for x in segs[1]:
if len(labels) > idx:
x = x._replace(label=labels[idx])
labeled_segs.append(x)
idx += 1
return ((segs[0], labeled_segs), )
def doit(self, segs, labels):
labels = labels.split(',')
return SEGSLabelAssign.assign(segs, labels)
class SEGSOrderedFilter: class SEGSOrderedFilter:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
@@ -67,6 +67,7 @@ class KSamplerAdvancedProvider:
"cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0}), "cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0}),
"sampler_name": (comfy.samplers.KSampler.SAMPLERS, ), "sampler_name": (comfy.samplers.KSampler.SAMPLERS, ),
"scheduler": (comfy.samplers.KSampler.SCHEDULERS, ), "scheduler": (comfy.samplers.KSampler.SCHEDULERS, ),
"sigma_factor": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}),
"basic_pipe": ("BASIC_PIPE", ) "basic_pipe": ("BASIC_PIPE", )
}, },
"optional": { "optional": {
@@ -79,9 +80,9 @@ class KSamplerAdvancedProvider:
CATEGORY = "ImpactPack/Sampler" CATEGORY = "ImpactPack/Sampler"
def doit(self, cfg, sampler_name, scheduler, basic_pipe, sampler_opt=None): def doit(self, cfg, sampler_name, scheduler, basic_pipe, sigma_factor=1.0, sampler_opt=None):
model, _, _, positive, negative = basic_pipe model, _, _, positive, negative = basic_pipe
sampler = KSamplerAdvancedWrapper(model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=sampler_opt) sampler = KSamplerAdvancedWrapper(model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=sampler_opt, sigma_factor=sigma_factor)
return (sampler, ) return (sampler, )
@@ -251,7 +252,7 @@ class ConcatConditionings:
RETURN_TYPES = ("CONDITIONING", ) RETURN_TYPES = ("CONDITIONING", )
FUNCTION = "doit" FUNCTION = "doit"
CATEGORY = "ImpactPack/__for_testing" CATEGORY = "ImpactPack/Util"
def doit(self, **kwargs): def doit(self, **kwargs):
conditioning_to = list(kwargs.values())[0] conditioning_to = list(kwargs.values())[0]
@@ -495,9 +495,16 @@ def to_latent_image(pixels, vae):
y = pixels.shape[2] y = pixels.shape[2]
if pixels.shape[1] != x or pixels.shape[2] != y: if pixels.shape[1] != x or pixels.shape[2] != y:
pixels = pixels[:, :x, :y, :] pixels = pixels[:, :x, :y, :]
pixels = nodes.VAEEncode.vae_encode_crop_pixels(pixels)
t = vae.encode(pixels[:, :, :, :3]) vae_encode = nodes.VAEEncode()
return {"samples": t} if hasattr(nodes.VAEEncode, "vae_encode_crop_pixels"):
# backward compatibility
print(f"[Impact Pack] ComfyUI is outdated.")
pixels = nodes.VAEEncode.vae_encode_crop_pixels(pixels)
t = vae.encode(pixels[:, :, :, :3])
return {"samples": t}
return vae_encode.encode(vae, pixels)[0]
def empty_pil_tensor(w=64, h=64): def empty_pil_tensor(w=64, h=64):
@@ -393,6 +393,47 @@ class CreateFadeMaskAdvanced:
if invert: if invert:
return (1.0 - torch.cat(out, dim=0),) return (1.0 - torch.cat(out, dim=0),)
return (torch.cat(out, dim=0),) return (torch.cat(out, dim=0),)
class ScaleBatchPromptSchedule:
RETURN_TYPES = ("STRING",)
FUNCTION = "scaleschedule"
CATEGORY = "KJNodes"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"input_str": ("STRING", {"forceInput": True,"default": "0:(0.0),\n7:(1.0),\n15:(0.0)\n"}),
"old_frame_count": ("INT", {"forceInput": True,"default": 1,"min": 1, "max": 4096, "step": 1}),
"new_frame_count": ("INT", {"forceInput": True,"default": 1,"min": 1, "max": 4096, "step": 1}),
},
}
def scaleschedule(self, old_frame_count, input_str, new_frame_count):
print("input_str:", input_str)
pattern = r'"(\d+)"\s*:\s*"(.*?)"(?:,|\Z)'
frame_strings = dict(re.findall(pattern, input_str))
# Calculate the scaling factor
scaling_factor = (new_frame_count - 1) / (old_frame_count - 1)
# Initialize a dictionary to store the new frame numbers and strings
new_frame_strings = {}
# Iterate over the frame numbers and strings
for old_frame, string in frame_strings.items():
# Calculate the new frame number
new_frame = int(round(int(old_frame) * scaling_factor))
# Store the new frame number and corresponding string
new_frame_strings[new_frame] = string
# Format the output string
output_str = ', '.join([f'"{k}":"{v}"' for k, v in sorted(new_frame_strings.items())])
print(output_str)
return (output_str,)
class CrossFadeImages: class CrossFadeImages:
@@ -1128,24 +1169,38 @@ class VRAM_Debug:
freemem_after = comfy.model_management.get_free_memory() freemem_after = comfy.model_management.get_free_memory()
print(freemem_after) print(freemem_after)
return (model, freemem_before, freemem_after) return (model, freemem_before, freemem_after)
class AnyType(str):
"""A special class that is always equal in not equal comparisons. Credit to pythongosssss"""
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class SomethingToString: class SomethingToString:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return { return {
"required": { "required": {
"input": ("*", {"forceinput": True, "default": ""}), "input": (any, {}),
}, },
"optional": {
"prefix": ("STRING", {"default": ""}),
"suffix": ("STRING", {"default": ""}),
}
} }
RETURN_TYPES = ("STRING",) RETURN_TYPES = ("STRING",)
FUNCTION = "stringify" FUNCTION = "stringify"
CATEGORY = "KJNodes" CATEGORY = "KJNodes"
def stringify(self, input): def stringify(self, input, prefix="", suffix=""):
if isinstance(input, (int, float, bool)): if isinstance(input, (int, float, bool)):
stringified = str(input) stringified = str(input)
print(stringified) if prefix: # Check if prefix is not empty
stringified = prefix + stringified # Add the prefix
if suffix: # Check if suffix is not empty
stringified = stringified + suffix # Add the suffix
else: else:
return return
return (stringified,) return (stringified,)
@@ -2140,7 +2195,7 @@ class BatchCLIPSeg:
model.to(device) # Ensure the model is on the correct device model.to(device) # Ensure the model is on the correct device
images = images.to(device) images = images.to(device)
processor = CLIPSegProcessor.from_pretrained("CIDAS/clipseg-rd64-refined") processor = CLIPSegProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
pbar = comfy.utils.ProgressBar(images.shape[0])
for image in images: for image in images:
image = (image* 255).type(torch.uint8) image = (image* 255).type(torch.uint8)
prompt = text prompt = text
@@ -2165,7 +2220,7 @@ class BatchCLIPSeg:
# Remove the extra dimensions # Remove the extra dimensions
resized_tensor = resized_tensor[0, 0, :, :] resized_tensor = resized_tensor[0, 0, :, :]
pbar.update(1)
out.append(resized_tensor) out.append(resized_tensor)
results = torch.stack(out).cpu() results = torch.stack(out).cpu()
@@ -2319,12 +2374,7 @@ class OffsetMask:
return mask, return mask,
class AnyType(str):
"""A special class that is always equal in not equal comparisons. Credit to pythongosssss"""
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class WidgetToString: class WidgetToString:
@classmethod @classmethod
def IS_CHANGED(cls, **kwargs): def IS_CHANGED(cls, **kwargs):
@@ -3266,13 +3316,14 @@ class OffsetMaskByNormalizedAmplitude:
return offsetmask, return offsetmask,
class ImageTransformByNormalizedAmplitude: class ImageTransformByNormalizedAmplitude:
@classmethod @classmethod
def INPUT_TYPES(s): def INPUT_TYPES(s):
return {"required": { return {"required": {
"normalized_amp": ("NORMALIZED_AMPLITUDE",), "normalized_amp": ("NORMALIZED_AMPLITUDE",),
"zoom_scale": ("FLOAT", { "default": 0.0, "min": -1.0, "max": 1.0, "step": 0.001, "display": "number" }), "zoom_scale": ("FLOAT", { "default": 0.0, "min": -1.0, "max": 1.0, "step": 0.001, "display": "number" }),
"x_offset": ("INT", { "default": 0, "min": (1 -MAX_RESOLUTION), "max": MAX_RESOLUTION, "step": 1, "display": "number" }),
"y_offset": ("INT", { "default": 0, "min": (1 -MAX_RESOLUTION), "max": MAX_RESOLUTION, "step": 1, "display": "number" }),
"cumulative": ("BOOLEAN", { "default": False }), "cumulative": ("BOOLEAN", { "default": False }),
"image": ("IMAGE",), "image": ("IMAGE",),
}} }}
@@ -3281,7 +3332,7 @@ class ImageTransformByNormalizedAmplitude:
FUNCTION = "amptransform" FUNCTION = "amptransform"
CATEGORY = "KJNodes" CATEGORY = "KJNodes"
def amptransform(self, image, normalized_amp, zoom_scale, cumulative): def amptransform(self, image, normalized_amp, zoom_scale, cumulative, x_offset, y_offset):
# Ensure normalized_amp is an array and within the range [0, 1] # Ensure normalized_amp is an array and within the range [0, 1]
normalized_amp = np.clip(normalized_amp, 0.0, 1.0) normalized_amp = np.clip(normalized_amp, 0.0, 1.0)
transformed_images = [] transformed_images = []
@@ -3325,6 +3376,17 @@ class ImageTransformByNormalizedAmplitude:
# Convert the tensor back to BxHxWxC format # Convert the tensor back to BxHxWxC format
tensor_img = tensor_img.permute(1, 2, 0) tensor_img = tensor_img.permute(1, 2, 0)
# Offset the image based on the amplitude
offset_amp = amp * 10 # Calculate the offset magnitude based on the amplitude
shift_x = min(x_offset * offset_amp, img.shape[1] - 1) # Calculate the shift in x direction
shift_y = min(y_offset * offset_amp, img.shape[0] - 1) # Calculate the shift in y direction
# Apply the offset to the image tensor
if shift_x != 0:
tensor_img = torch.roll(tensor_img, shifts=int(shift_x), dims=1)
if shift_y != 0:
tensor_img = torch.roll(tensor_img, shifts=int(shift_y), dims=0)
# Add to the list # Add to the list
transformed_images.append(tensor_img) transformed_images.append(tensor_img)
@@ -3460,7 +3522,7 @@ class GLIGENTextBoxApplyBatch:
interpolated_coords = interpolate_coordinates_with_curves(coordinates_dict, batch_size) interpolated_coords = interpolate_coordinates_with_curves(coordinates_dict, batch_size)
if interpolation == 'straight': if interpolation == 'straight':
interpolated_coords = interpolate_coordinates(coordinates_dict, batch_size) interpolated_coords = interpolate_coordinates(coordinates_dict, batch_size)
plot_image_tensor = plot_to_tensor(coordinates_dict, interpolated_coords, 512, 512, height) plot_image_tensor = plot_to_tensor(coordinates_dict, interpolated_coords, 512, 512, height)
for t in conditioning_to: for t in conditioning_to:
n = [t[0], t[1].copy()] n = [t[0], t[1].copy()]
@@ -3471,6 +3533,7 @@ class GLIGENTextBoxApplyBatch:
x_position, y_position = interpolated_coords[i] x_position, y_position = interpolated_coords[i]
position_param = (cond_pooled, height // 8, width // 8, y_position // 8, x_position // 8) position_param = (cond_pooled, height // 8, width // 8, y_position // 8, x_position // 8)
position_params_batch[i].append(position_param) # Append position_param to the correct sublist position_params_batch[i].append(position_param) # Append position_param to the correct sublist
print("x ",x_position, "y ", y_position)
prev = [] prev = []
if "gligen" in n[1]: if "gligen" in n[1]:
prev = n[1]['gligen'][2] prev = n[1]['gligen'][2]
@@ -3484,6 +3547,101 @@ class GLIGENTextBoxApplyBatch:
return (c, plot_image_tensor,) return (c, plot_image_tensor,)
class ImageUpscaleWithModelBatched:
@classmethod
def INPUT_TYPES(s):
return {"required": { "upscale_model": ("UPSCALE_MODEL",),
"images": ("IMAGE",),
"per_batch": ("INT", {"default": 16, "min": 1, "max": 4096, "step": 1}),
}}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "upscale"
CATEGORY = "KJNodes"
def upscale(self, upscale_model, images, per_batch):
device = comfy.model_management.get_torch_device()
upscale_model.to(device)
in_img = images.movedim(-1,-3).to(device)
steps = in_img.shape[0]
pbar = comfy.utils.ProgressBar(steps)
t = []
for start_idx in range(0, in_img.shape[0], per_batch):
sub_images = upscale_model(in_img[start_idx:start_idx+per_batch])
t.append(sub_images.cpu())
# Calculate the number of images processed in this batch
batch_count = sub_images.shape[0]
# Update the progress bar by the number of images processed in this batch
pbar.update(batch_count)
upscale_model.cpu()
t = torch.cat(t, dim=0).permute(0, 2, 3, 1).cpu()
return (t,)
import torchvision
from torch import nn
from safetensors import safe_open
class EfficientNetEncoder(nn.Module):
def __init__(self, c_latent=16):
super().__init__()
self.backbone = torchvision.models.efficientnet_v2_s(weights='DEFAULT').features.eval()
self.mapper = nn.Sequential(
nn.Conv2d(1280, c_latent, kernel_size=1, bias=False),
nn.BatchNorm2d(c_latent, affine=False), # then normalize them to have mean 0 and std 1
)
def forward(self, x):
return self.mapper(self.backbone(x))
class EffnetEncode:
@classmethod
def INPUT_TYPES(s):
return {"required": {
"image": ("IMAGE",),
}}
RETURN_TYPES = ("LATENT",)
FUNCTION = "encode"
CATEGORY = "KJNodes"
def encode(self, image):
device = comfy.model_management.get_torch_device()
image = image.permute(0, 3, 1, 2).to(device)
effnet_preprocess = torchvision.transforms.Compose([
torchvision.transforms.Normalize(
mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)
)
])
image = effnet_preprocess(image)
effnet = EfficientNetEncoder()
effnet_checkpoint = os.path.join(folder_paths.models_dir,"vae", "Stable-cascade","effnet_encoder.safetensors")
if not os.path.exists(effnet_checkpoint):
try:
from huggingface_hub import snapshot_download
download_to = os.path.join(folder_paths.models_dir,'vae', "Stable-cascade")
snapshot_download(repo_id="stabilityai/stable-cascade", allow_patterns=["effnet_encoder.safetensors"],
local_dir=download_to, local_dir_use_symlinks=False)
except:
raise Exception("Model not found and download failed. (https://huggingface.co/stabilityai/stable-cascade, effnet_encoder.safetensors)")
effnet_state_dict = {}
with safe_open(effnet_checkpoint, framework="pt", device="cpu") as f:
for key in f.keys():
effnet_state_dict[key] = f.get_tensor(key)
effnet.load_state_dict(effnet_state_dict if 'state_dict' not in effnet_checkpoint else effnet_checkpoint['state_dict'])
effnet.eval().requires_grad_(False).to(device)
t = effnet(image).cpu()
return ({"samples":t}, )
NODE_CLASS_MAPPINGS = { NODE_CLASS_MAPPINGS = {
"INTConstant": INTConstant, "INTConstant": INTConstant,
@@ -3548,7 +3706,10 @@ NODE_CLASS_MAPPINGS = {
"GetLatentsFromBatchIndexed": GetLatentsFromBatchIndexed, "GetLatentsFromBatchIndexed": GetLatentsFromBatchIndexed,
"StringConstant": StringConstant, "StringConstant": StringConstant,
"GLIGENTextBoxApplyBatch": GLIGENTextBoxApplyBatch, "GLIGENTextBoxApplyBatch": GLIGENTextBoxApplyBatch,
"CondPassThrough": CondPassThrough "CondPassThrough": CondPassThrough,
"ImageUpscaleWithModelBatched": ImageUpscaleWithModelBatched,
"ScaleBatchPromptSchedule": ScaleBatchPromptSchedule,
"EffnetEncode": EffnetEncode
} }
NODE_DISPLAY_NAME_MAPPINGS = { NODE_DISPLAY_NAME_MAPPINGS = {
"INTConstant": "INT Constant", "INTConstant": "INT Constant",
@@ -3612,5 +3773,8 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"GetLatentsFromBatchIndexed": "GetLatentsFromBatchIndexed", "GetLatentsFromBatchIndexed": "GetLatentsFromBatchIndexed",
"StringConstant": "StringConstant", "StringConstant": "StringConstant",
"GLIGENTextBoxApplyBatch": "GLIGENTextBoxApplyBatch", "GLIGENTextBoxApplyBatch": "GLIGENTextBoxApplyBatch",
"CondPassThrough": "CondPassThrough" "CondPassThrough": "CondPassThrough",
"ImageUpscaleWithModelBatched": "ImageUpscaleWithModelBatched",
"ScaleBatchPromptSchedule": "ScaleBatchPromptSchedule",
"EffnetEncode": "EffnetEncode"
} }
@@ -29,7 +29,7 @@ except:
print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.")
version = [2, 7] version = [2, 7, 2]
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
print(f"### Loading: ComfyUI-Manager ({version_str})") print(f"### Loading: ComfyUI-Manager ({version_str})")
@@ -307,16 +307,19 @@ def print_comfyui_version():
global comfy_ui_commit_datetime global comfy_ui_commit_datetime
global comfy_ui_hash global comfy_ui_hash
is_detached = False
try: try:
repo = git.Repo(os.path.dirname(folder_paths.__file__)) repo = git.Repo(os.path.dirname(folder_paths.__file__))
comfy_ui_revision = len(list(repo.iter_commits('HEAD'))) comfy_ui_revision = len(list(repo.iter_commits('HEAD')))
current_branch = repo.active_branch.name
comfy_ui_hash = repo.head.commit.hexsha
comfy_ui_hash = repo.head.commit.hexsha
cm_global.variables['comfyui.revision'] = comfy_ui_revision cm_global.variables['comfyui.revision'] = comfy_ui_revision
comfy_ui_commit_datetime = repo.head.commit.committed_datetime comfy_ui_commit_datetime = repo.head.commit.committed_datetime
cm_global.variables['comfyui.commit_datetime'] = comfy_ui_commit_datetime
is_detached = repo.head.is_detached
current_branch = repo.active_branch.name
try: try:
if comfy_ui_commit_datetime.date() < comfy_ui_required_commit_datetime.date(): if comfy_ui_commit_datetime.date() < comfy_ui_required_commit_datetime.date():
@@ -343,7 +346,10 @@ def print_comfyui_version():
else: else:
print(f"### ComfyUI Revision: {comfy_ui_revision} on '{current_branch}' [{comfy_ui_hash[:8]}] | Released on '{comfy_ui_commit_datetime.date()}'") print(f"### ComfyUI Revision: {comfy_ui_revision} on '{current_branch}' [{comfy_ui_hash[:8]}] | Released on '{comfy_ui_commit_datetime.date()}'")
except: except:
print("### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)") if is_detached:
print(f"### ComfyUI Revision: {comfy_ui_revision} [{comfy_ui_hash[:8]}] *DETACHED | Released on '{comfy_ui_commit_datetime.date()}'")
else:
print("### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)")
print_comfyui_version() print_comfyui_version()
@@ -199,6 +199,11 @@
"id":"https://github.com/abyz22/image_control", "id":"https://github.com/abyz22/image_control",
"tags":"BMAB", "tags":"BMAB",
"description": "This extension provides some alternative functionalities of the [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab) extension." "description": "This extension provides some alternative functionalities of the [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab) extension."
},
{
"id":"https://github.com/blepping/ComfyUI-sonar",
"tags":"sonar",
"description": "This extension provides some alternative functionalities of the [a/stable-diffusion-webui-sonar](https://github.com/Kahsolt/stable-diffusion-webui-sonar) extension."
} }
] ]
} }
@@ -446,7 +446,7 @@
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Custom node to convert the lantents between SDXL and SD v1.5 directly without the VAE decoding/encoding step." "description": "Custom node to convert the lantents between SDXL and SD v1.5 directly without the VAE decoding/encoding step."
}, },
{ {
"author": "city96", "author": "city96",
"title": "SD-Advanced-Noise", "title": "SD-Advanced-Noise",
@@ -456,7 +456,7 @@
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes: LatentGaussianNoise, MathEncode. An experimental custom node that generates latent noise directly by utilizing the linear characteristics of the latent space." "description": "Nodes: LatentGaussianNoise, MathEncode. An experimental custom node that generates latent noise directly by utilizing the linear characteristics of the latent space."
}, },
{ {
"author": "city96", "author": "city96",
"title": "SD-Latent-Upscaler", "title": "SD-Latent-Upscaler",
@@ -467,7 +467,7 @@
"pip": ["huggingface-hub"], "pip": ["huggingface-hub"],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Upscaling stable diffusion latents using a small neural network." "description": "Upscaling stable diffusion latents using a small neural network."
}, },
{ {
"author": "city96", "author": "city96",
"title": "ComfyUI_DiT [WIP]", "title": "ComfyUI_DiT [WIP]",
@@ -478,7 +478,7 @@
"pip": ["huggingface-hub"], "pip": ["huggingface-hub"],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Testbed for [a/DiT(Scalable Diffusion Models with Transformers)](https://github.com/facebookresearch/DiT). [w/None of this code is stable, expect breaking changes if for some reason you want to use this.]" "description": "Testbed for [a/DiT(Scalable Diffusion Models with Transformers)](https://github.com/facebookresearch/DiT). [w/None of this code is stable, expect breaking changes if for some reason you want to use this.]"
}, },
{ {
"author": "city96", "author": "city96",
"title": "ComfyUI_ColorMod", "title": "ComfyUI_ColorMod",
@@ -488,7 +488,7 @@
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "This extension currently has two sets of nodes - one set for editing the contrast/color of images and another set for saving images as 16 bit PNG files." "description": "This extension currently has two sets of nodes - one set for editing the contrast/color of images and another set for saving images as 16 bit PNG files."
}, },
{ {
"author": "city96", "author": "city96",
"title": "Extra Models for ComfyUI", "title": "Extra Models for ComfyUI",
@@ -904,6 +904,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "ComfyUI reference implementation for IPAdapter models. The code is mostly taken from the original IPAdapter repository and laksjdjf's implementation, all credit goes to them. I just made the extension closer to ComfyUI philosophy." "description": "ComfyUI reference implementation for IPAdapter models. The code is mostly taken from the original IPAdapter repository and laksjdjf's implementation, all credit goes to them. I just made the extension closer to ComfyUI philosophy."
}, },
{
"author": "cubiq",
"title": "ComfyUI InstantID (Native Support)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID",
"files": [
"https://github.com/cubiq/ComfyUI_InstantID"
],
"install_type": "git-clone",
"description": "Native [a/InstantID](https://github.com/InstantID/InstantID) support for ComfyUI.\nThis extension differs from the many already available as it doesn't use diffusers but instead implements InstantID natively and it fully integrates with ComfyUI.\nPlease note this still could be considered beta stage, looking forward to your feedback."
},
{ {
"author": "shockz0rz", "author": "shockz0rz",
"title": "InterpolateEverything", "title": "InterpolateEverything",
@@ -1497,6 +1507,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "A few nodes to mix sigmas and a custom scheduler that uses phi, then one using eval() to be able to schedule with custom formulas." "description": "A few nodes to mix sigmas and a custom scheduler that uses phi, then one using eval() to be able to schedule with custom formulas."
}, },
{
"author": "Extraltodeus",
"title": "ComfyUI-AutomaticCFG",
"reference": "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG",
"files": [
"https://github.com/Extraltodeus/ComfyUI-AutomaticCFG"
],
"install_type": "git-clone",
"description": "My own version 'from scratch' of a self-rescaling CFG. It isn't much but it's honest work.\nTLDR: set your CFG at 8 to try it. No burned images and artifacts anymore. CFG is also a bit more sensitive because it's a proportion around 8. Low scale like 4 also gives really nice results since your CFG is not the CFG anymore. Also in general even with relatively low settings it seems to improve the quality."
},
{ {
"author": "JPS", "author": "JPS",
"title": "JPS Custom Nodes for ComfyUI", "title": "JPS Custom Nodes for ComfyUI",
@@ -2297,6 +2317,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Node to use [a/DDColor](https://github.com/piddnad/DDColor) in ComfyUI." "description": "Node to use [a/DDColor](https://github.com/piddnad/DDColor) in ComfyUI."
}, },
{
"author": "Kijai",
"title": "Animatediff MotionLoRA Trainer",
"reference": "https://github.com/kijai/ComfyUI-ADMotionDirector",
"files": [
"https://github.com/kijai/ComfyUI-ADMotionDirector"
],
"install_type": "git-clone",
"description": "This is a trainer for AnimateDiff MotionLoRAs, based on the implementation of MotionDirector by ExponentialML."
},
{ {
"author": "hhhzzyang", "author": "hhhzzyang",
"title": "Comfyui-Lama", "title": "Comfyui-Lama",
@@ -3010,6 +3040,36 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Easily use Stable Video Diffusion inside ComfyUI!" "description": "Easily use Stable Video Diffusion inside ComfyUI!"
}, },
{
"author": "thecooltechguy",
"title": "ComfyUI-ComfyRun",
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyRun",
"files": [
"https://github.com/thecooltechguy/ComfyUI-ComfyRun"
],
"install_type": "git-clone",
"description": "The easiest way to run & share any ComfyUI workflow [a/https://comfyrun.com](https://comfyrun.com)"
},
{
"author": "thecooltechguy",
"title": "ComfyUI-MagicAnimate",
"reference": "https://github.com/thecooltechguy/ComfyUI-MagicAnimate",
"files": [
"https://github.com/thecooltechguy/ComfyUI-MagicAnimate"
],
"install_type": "git-clone",
"description": "Easily use Magic Animate within ComfyUI!\n[w/WARN: This extension requires 15GB disk space.]"
},
{
"author": "thecooltechguy",
"title": "ComfyUI-ComfyWorkflows",
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows",
"files": [
"https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows"
],
"install_type": "git-clone",
"description": "The best way to run, share, & discover thousands of ComfyUI workflows."
},
{ {
"author": "Danand", "author": "Danand",
"title": "ComfyUI-ComfyCouple", "title": "ComfyUI-ComfyCouple",
@@ -3130,6 +3190,36 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "QWen-VL-Plus & QWen-VL-Max in ComfyUI" "description": "QWen-VL-Plus & QWen-VL-Max in ComfyUI"
}, },
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-SVD-ZHO (WIP)",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO"
],
"install_type": "git-clone",
"description": "My Workflows + Auxiliary nodes for Stable Video Diffusion (SVD)"
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI SegMoE",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/SegMoE: Segmind Mixture of Diffusion Experts](https://github.com/segmind/segmoe) for ComfyUI"
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI YoloWorld-EfficientSAM",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/YOLO-World + EfficientSAM](https://huggingface.co/spaces/SkalskiP/YOLO-World) & [a/YOLO-World](https://github.com/AILab-CVC/YOLO-World) for ComfyUI"
},
{ {
"author": "kenjiqq", "author": "kenjiqq",
"title": "qq-nodes-comfyui", "title": "qq-nodes-comfyui",
@@ -3872,36 +3962,6 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "A ComfyUI extension for chatting with your images. Runs on your own system, no external services used, no filter. Uses the [a/LLaVA multimodal LLM](https://llava-vl.github.io/) so you can give instructions or ask questions in natural language. It's maybe as smart as GPT3.5, and it can see." "description": "A ComfyUI extension for chatting with your images. Runs on your own system, no external services used, no filter. Uses the [a/LLaVA multimodal LLM](https://llava-vl.github.io/) so you can give instructions or ask questions in natural language. It's maybe as smart as GPT3.5, and it can see."
}, },
{
"author": "thecooltechguy",
"title": "ComfyUI-ComfyRun",
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyRun",
"files": [
"https://github.com/thecooltechguy/ComfyUI-ComfyRun"
],
"install_type": "git-clone",
"description": "The easiest way to run & share any ComfyUI workflow [a/https://comfyrun.com](https://comfyrun.com)"
},
{
"author": "thecooltechguy",
"title": "ComfyUI-MagicAnimate",
"reference": "https://github.com/thecooltechguy/ComfyUI-MagicAnimate",
"files": [
"https://github.com/thecooltechguy/ComfyUI-MagicAnimate"
],
"install_type": "git-clone",
"description": "Easily use Magic Animate within ComfyUI!\n[w/WARN: This extension requires 15GB disk space.]"
},
{
"author": "thecooltechguy",
"title": "ComfyUI-ComfyWorkflows",
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows",
"files": [
"https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows"
],
"install_type": "git-clone",
"description": "The best way to run, share, & discover thousands of ComfyUI workflows."
},
{ {
"author": "styler00dollar", "author": "styler00dollar",
"title": "ComfyUI-sudo-latent-upscale", "title": "ComfyUI-sudo-latent-upscale",
@@ -3993,6 +4053,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "This is a custom node of ComfyUI that downloads and loads models from the input URL. The model is temporarily downloaded into memory and not saved to storage.\nThis could be useful when trying out models or when using various models on machines with limited storage. Since the model is downloaded into memory, expect higher memory usage than usual." "description": "This is a custom node of ComfyUI that downloads and loads models from the input URL. The model is temporarily downloaded into memory and not saved to storage.\nThis could be useful when trying out models or when using various models on machines with limited storage. Since the model is downloaded into memory, expect higher memory usage than usual."
}, },
{
"author": "pkpkTech",
"title": "ComfyUI-SaveQueues",
"reference": "https://github.com/pkpkTech/ComfyUI-SaveQueues",
"files": [
"https://github.com/pkpkTech/ComfyUI-SaveQueues"
],
"install_type": "git-clone",
"description": "Add a button to the menu to save and load the running queue and the pending queues.\nThis is intended to be used when you want to exit ComfyUI with queues still remaining."
},
{ {
"author": "Crystian", "author": "Crystian",
"title": "Crystools", "title": "Crystools",
@@ -4184,6 +4254,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes:3D Pose Editor" "description": "Nodes:3D Pose Editor"
}, },
{
"author": "chaojie",
"title": "ComfyUI-DynamiCrafter",
"reference": "https://github.com/chaojie/ComfyUI-DynamiCrafter",
"files": [
"https://github.com/chaojie/ComfyUI-DynamiCrafter"
],
"install_type": "git-clone",
"description": "Better Dynamic, Higher Resolution, and Stronger Coherence!"
},
{ {
"author": "chaojie", "author": "chaojie",
"title": "ComfyUI-Panda3d", "title": "ComfyUI-Panda3d",
@@ -4311,8 +4391,9 @@
"files": [ "files": [
"https://github.com/MrForExample/ComfyUI-3D-Pack" "https://github.com/MrForExample/ComfyUI-3D-Pack"
], ],
"nodename_pattern": "^\\[Comfy3D\\]",
"install_type": "git-clone", "install_type": "git-clone",
"description": "An extensive node suite that enables ComfyUI to process 3D inputs (Mesh & UV Texture, etc) using cutting edge algorithms (3DGS, NeRF, etc.)" "description": "An extensive node suite that enables ComfyUI to process 3D inputs (Mesh & UV Texture, etc) using cutting edge algorithms (3DGS, NeRF, etc.)\nNOTE: Pre-built python wheels can be download from [a/https://github.com/remsky/ComfyUI3D-Assorted-Wheels](https://github.com/remsky/ComfyUI3D-Assorted-Wheels)"
}, },
{ {
"author": "Mr.ForExample", "author": "Mr.ForExample",
@@ -4321,6 +4402,7 @@
"files": [ "files": [
"https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved"
], ],
"nodename_pattern": "^\\[AnimateAnyone\\]",
"install_type": "git-clone", "install_type": "git-clone",
"description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀\n[w/The torch environment may be compromised due to version issues as some torch-related packages are being reinstalled.]" "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀\n[w/The torch environment may be compromised due to version issues as some torch-related packages are being reinstalled.]"
}, },
@@ -4334,6 +4416,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes: MS kosmos-2 Interrogator, Save Image w/o Metadata, Image Scale Bounding Box. An implementation of Microsoft [a/kosmos-2](https://huggingface.co/microsoft/kosmos-2-patch14-224) image to text transformer." "description": "Nodes: MS kosmos-2 Interrogator, Save Image w/o Metadata, Image Scale Bounding Box. An implementation of Microsoft [a/kosmos-2](https://huggingface.co/microsoft/kosmos-2-patch14-224) image to text transformer."
}, },
{
"author": "Hangover3832",
"title": "ComfyUI-Hangover-Moondream",
"reference": "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream",
"files": [
"https://github.com/Hangover3832/ComfyUI-Hangover-Moondream"
],
"install_type": "git-clone",
"description": "Moondream is a lightweight multimodal large languge model.\nIMPORTANT:According to the creator, Moondream is for research purposes only, commercial use is not allowed!\n[w/WARN:Additional python code will be downloaded from huggingface and executed. You have to trust this creator if you want to use this node!]"
},
{ {
"author": "tzwm", "author": "tzwm",
"title": "ComfyUI Profiler", "title": "ComfyUI Profiler",
@@ -4534,6 +4626,26 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes: Format String, Join String List, Load Preset, Load Preset (Advanced), Const String, Const String (multi line). Add useful nodes related to prompt." "description": "Nodes: Format String, Join String List, Load Preset, Load Preset (Advanced), Const String, Const String (multi line). Add useful nodes related to prompt."
}, },
{
"author": "nkchocoai",
"title": "ComfyUI-TextOnSegs",
"reference": "https://github.com/nkchocoai/ComfyUI-TextOnSegs",
"files": [
"https://github.com/nkchocoai/ComfyUI-TextOnSegs"
],
"install_type": "git-clone",
"description": "Add a node for drawing text with CR Draw Text of ComfyUI_Comfyroll_CustomNodes to the area of SEGS detected by Ultralytics Detector of ComfyUI-Impact-Pack."
},
{
"author": "nkchocoai",
"title": "ComfyUI-SaveImageWithMetaData",
"reference": "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData",
"files": [
"https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData"
],
"install_type": "git-clone",
"description": "Add a node to save images with metadata (PNGInfo) extracted from the input values of each node.\nSince the values are extracted dynamically, values output by various extension nodes can be added to metadata."
},
{ {
"author": "JaredTherriault", "author": "JaredTherriault",
"title": "ComfyUI-JNodes", "title": "ComfyUI-JNodes",
@@ -4774,6 +4886,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Better TAESD previews, BlehHyperTile." "description": "Better TAESD previews, BlehHyperTile."
}, },
{
"author": "blepping",
"title": "ComfyUI-sonar",
"reference": "https://github.com/blepping/ComfyUI-sonar",
"files": [
"https://github.com/blepping/ComfyUI-sonar"
],
"install_type": "git-clone",
"description": "A janky implementation of Sonar sampling (momentum-based sampling) for ComfyUI."
},
{ {
"author": "JerryOrbachJr", "author": "JerryOrbachJr",
"title": "ComfyUI-RandomSize", "title": "ComfyUI-RandomSize",
@@ -4854,6 +4976,26 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes:segformer_clothes, segformer_agnostic, segformer_remove_bg, stabel_vition. Nodes for model dress up." "description": "Nodes:segformer_clothes, segformer_agnostic, segformer_remove_bg, stabel_vition. Nodes for model dress up."
}, },
{
"author": "StartHua",
"title": "Comfyui_joytag",
"reference": "https://github.com/StartHua/Comfyui_joytag",
"files": [
"https://github.com/StartHua/Comfyui_joytag"
],
"install_type": "git-clone",
"description": "JoyTag is a state of the art AI vision model for tagging images, with a focus on sex positivity and inclusivity. It uses the Danbooru tagging schema, but works across a wide range of images, from hand drawn to photographic.\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/fancyfeast/joytag/tree/main](https://huggingface.co/fancyfeast/joytag/tree/main)"
},
{
"author": "StartHua",
"title": "comfyui_segformer_b2_clothes",
"reference": "https://github.com/StartHua/Comfyui_segformer_b2_clothes",
"files": [
"https://github.com/StartHua/Comfyui_segformer_b2_clothes"
],
"install_type": "git-clone",
"description": "SegFormer model fine-tuned on ATR dataset for clothes segmentation but can also be used for human segmentation!\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/mattmdjaga/segformer_b2_clothes](https://huggingface.co/mattmdjaga/segformer_b2_clothes)"
},
{ {
"author": "ricklove", "author": "ricklove",
"title": "comfyui-ricklove", "title": "comfyui-ricklove",
@@ -4916,7 +5058,7 @@
}, },
{ {
"author": "TemryL", "author": "TemryL",
"title": "ComfyS3: Amazon S3 Integration for ComfyUI", "title": "ComfyS3",
"reference": "https://github.com/TemryL/ComfyS3", "reference": "https://github.com/TemryL/ComfyS3",
"files": [ "files": [
"https://github.com/TemryL/ComfyS3" "https://github.com/TemryL/ComfyS3"
@@ -4954,8 +5096,198 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Clip text encoder with BREAK formatting like A1111 (uses conditioning concat)" "description": "Clip text encoder with BREAK formatting like A1111 (uses conditioning concat)"
}, },
{
"author": "MarkoCa1",
"title": "ComfyUI_Segment_Mask",
"reference": "https://github.com/MarkoCa1/ComfyUI_Segment_Mask",
"files": [
"https://github.com/MarkoCa1/ComfyUI_Segment_Mask"
],
"install_type": "git-clone",
"description": "Mask cutout based on Segment Anything."
},
{
"author": "antrobot",
"title": "antrobots ComfyUI Nodepack",
"reference": "https://github.com/antrobot1234/antrobots-comfyUI-nodepack",
"files": [
"https://github.com/antrobot1234/antrobots-comfyUI-nodepack"
],
"install_type": "git-clone",
"description": "A small node pack containing various things I felt like ought to be in base comfy-UI. Currently includes Some image handling nodes to help with inpainting, a version of KSampler (advanced) that allows for denoise, and a node that can swap it's inputs. Remember to make an issue if you experience any bugs or errors!"
},
{
"author": "bilal-arikan",
"title": "ComfyUI_TextAssets",
"reference": "https://github.com/bilal-arikan/ComfyUI_TextAssets",
"files": [
"https://github.com/bilal-arikan/ComfyUI_TextAssets"
],
"install_type": "git-clone",
"description": "With this node you can upload text files to input folder from your local computer."
},
{
"author": "kadirnar",
"title": "ComfyUI-Transformers",
"reference": "https://github.com/kadirnar/ComfyUI-Transformers",
"files": [
"https://github.com/kadirnar/ComfyUI-Transformers"
],
"install_type": "git-clone",
"description": "ComfyUI-Transformers is a cutting-edge project combining the power of computer vision and natural language processing to create intuitive and user-friendly interfaces. Our goal is to make technology more accessible and engaging."
},
{
"author": "digitaljohn",
"title": "ComfyUI-ProPost",
"reference": "https://github.com/digitaljohn/comfyui-propost",
"files": [
"https://github.com/digitaljohn/comfyui-propost"
],
"install_type": "git-clone",
"description": "A set of custom ComfyUI nodes for performing basic post-processing effects including Film Grain and Vignette. These effects can help to take the edge off AI imagery and make them feel more natural."
},
{
"author": "DonBaronFactory",
"title": "ComfyUI-Cre8it-Nodes",
"reference": "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes",
"files": [
"https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes"
],
"install_type": "git-clone",
"description": "Nodes:CRE8IT Serial Prompter, CRE8IT Apply Serial Prompter, CRE8IT Image Sizer. A few simple nodes to facilitate working wiht ComfyUI Workflows"
},
{
"author": "deforum",
"title": "Deforum Nodes",
"reference": "https://github.com/XmYx/deforum-comfy-nodes",
"files": [
"https://github.com/XmYx/deforum-comfy-nodes"
],
"install_type": "git-clone",
"description": "Official Deforum animation pipeline tools that provide a unique way to create frame-by-frame generative motion art."
},
{
"author": "adbrasi",
"title": "ComfyUI-TrashNodes-DownloadHuggingface",
"reference": "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface",
"files": [
"https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface"
],
"install_type": "git-clone",
"description": "ComfyUI-TrashNodes-DownloadHuggingface is a ComfyUI node designed to facilitate the download of models you have just trained and uploaded to Hugging Face. This node is particularly useful for users who employ Google Colab for training and need to quickly download their models for deployment."
},
{
"author": "mbrostami",
"title": "ComfyUI-HF",
"reference": "https://github.com/mbrostami/ComfyUI-HF",
"files": [
"https://github.com/mbrostami/ComfyUI-HF"
],
"install_type": "git-clone",
"description": "ComfyUI Node to work with Hugging Face repositories"
},
{
"author": "Billius-AI",
"title": "ComfyUI-Path-Helper",
"reference": "https://github.com/Billius-AI/ComfyUI-Path-Helper",
"files": [
"https://github.com/Billius-AI/ComfyUI-Path-Helper"
],
"install_type": "git-clone",
"description": "Nodes:Create Project Root, Add Folder, Add Folder Advanced, Add File Name Prefix, Add File Name Prefix Advanced, ShowPath"
},
{
"author": "Franck-Demongin",
"title": "NX_PromptStyler",
"reference": "https://github.com/Franck-Demongin/NX_PromptStyler",
"files": [
"https://github.com/Franck-Demongin/NX_PromptStyler"
],
"install_type": "git-clone",
"description": "A custom node for ComfyUI to create a prompt based on a list of keywords saved in CSV files."
},
{
"author": "xiaoxiaodesha",
"title": "hd-nodes-comfyui",
"reference": "https://github.com/xiaoxiaodesha/hd_node",
"files": [
"https://github.com/xiaoxiaodesha/hd_node"
],
"install_type": "git-clone",
"description": "Nodes:Combine HDMasks, Cover HDMasks, HD FaceIndex, HD SmoothEdge, HD GetMaskArea, HD Image Levels, HD Ultimate SD Upscale"
},
{
"author": "ShmuelRonen",
"title": "ComfyUI-SVDResizer",
"reference": "https://github.com/ShmuelRonen/ComfyUI-SVDResizer",
"files": [
"https://github.com/ShmuelRonen/ComfyUI-SVDResizer"
],
"install_type": "git-clone",
"description": "SVDResizer is a helper for resizing the source image, according to the sizes enabled in Stable Video Diffusion. The rationale behind the possibility of changing the size of the image in steps between the ranges of 576 and 1024, is the use of the greatest common denominator of these two numbers which is 64. SVD is lenient with resizing that adheres to this rule, so the chance of coherent video that is not the standard size of 576X1024 is greater. It is advisable to keep the value 1024 constant and play with the second size to maintain the stability of the result."
},
{
"author": "redhottensors",
"title": "ComfyUI-Prediction",
"reference": "https://github.com/redhottensors/ComfyUI-Prediction",
"files": [
"https://github.com/redhottensors/ComfyUI-Prediction"
],
"install_type": "git-clone",
"description": "Fully customizable Classifier Free Guidance for ComfyUI."
},
{
"author": "Mamaaaamooooo",
"title": "Batch Rembg for ComfyUI",
"reference": "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes",
"files": [
"https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes"
],
"install_type": "git-clone",
"description": "Remove background of plural images."
},
{
"author": "jordoh",
"title": "ComfyUI Deepface",
"reference": "https://github.com/jordoh/ComfyUI-Deepface",
"files": [
"https://github.com/jordoh/ComfyUI-Deepface"
],
"install_type": "git-clone",
"description": "ComfyUI nodes wrapping the [a/deepface](https://github.com/serengil/deepface) library."
},
{
"author": "yuvraj108c",
"title": "ComfyUI-Pronodes",
"reference": "https://github.com/yuvraj108c/ComfyUI-Pronodes",
"files": [
"https://github.com/yuvraj108c/ComfyUI-Pronodes"
],
"install_type": "git-clone",
"description": "A collection of nice utility nodes for ComfyUI"
},
{
"author": "GavChap",
"title": "ComfyUI-CascadeResolutions",
"reference": "https://github.com/GavChap/ComfyUI-CascadeResolutions",
"files": [
"https://github.com/GavChap/ComfyUI-CascadeResolutions"
],
"install_type": "git-clone",
"description": "Nodes:Cascade Resolutions"
},
{
"author": "yuvraj108c",
"title": "ComfyUI-Vsgan",
"reference": "https://github.com/yuvraj108c/ComfyUI-Vsgan",
"files": [
"https://github.com/yuvraj108c/ComfyUI-Vsgan"
],
"install_type": "git-clone",
"description": "Nodes:Upscale Video Tensorrt"
},
{ {
"author": "Ser-Hilary", "author": "Ser-Hilary",
@@ -5228,7 +5560,17 @@
"install_type": "copy", "install_type": "copy",
"description": "A node which takes in x, y, width, height, total width, and total height, in order to accurately represent the area of an image which is covered by area-based conditioning." "description": "A node which takes in x, y, width, height, total width, and total height, in order to accurately represent the area of an image which is covered by area-based conditioning."
}, },
{
"author": "AshMartian",
"title": "Dir Gir",
"reference": "https://github.com/AshMartian/ComfyUI-DirGir",
"files": [
"https://github.com/AshMartian/ComfyUI-DirGir/raw/main/dir_picker.py",
"https://github.com/AshMartian/ComfyUI-DirGir/raw/main/dir_loop.py"
],
"install_type": "copy",
"description": "A collection of ComfyUI directory automation utility nodes. Directory Get It Right adds a GUI directory browser, and smart directory loop/iteration node that supports regex and file extension filtering."
},
{ {
"author": "theally", "author": "theally",
File diff suppressed because it is too large Load Diff
@@ -1052,7 +1052,7 @@ class ManagerMenuDialog extends ComfyDialog {
onclick: (e) => { onclick: (e) => {
const last_visited_site = localStorage.getItem("wg_last_visited") const last_visited_site = localStorage.getItem("wg_last_visited")
if (!!last_visited_site) { if (!!last_visited_site) {
window.open(last_visited_site, "comfyui-workflow-gallery"); window.open(last_visited_site, last_visited_site);
} else { } else {
this.handleWorkflowGalleryButtonClick(e) this.handleWorkflowGalleryButtonClick(e)
} }
@@ -1179,7 +1179,7 @@ class ManagerMenuDialog extends ComfyDialog {
callback: () => { callback: () => {
const url = "https://openart.ai/workflows/dev"; const url = "https://openart.ai/workflows/dev";
localStorage.setItem("wg_last_visited", url); localStorage.setItem("wg_last_visited", url);
window.open(url, "comfyui-workflow-gallery"); window.open(url, url);
modifyButtonStyle(url); modifyButtonStyle(url);
}, },
}, },
@@ -1188,7 +1188,7 @@ class ManagerMenuDialog extends ComfyDialog {
callback: () => { callback: () => {
const url = "https://youml.com/?from=comfyui-share"; const url = "https://youml.com/?from=comfyui-share";
localStorage.setItem("wg_last_visited", url); localStorage.setItem("wg_last_visited", url);
window.open(url, "comfyui-workflow-gallery"); window.open(url, url);
modifyButtonStyle(url); modifyButtonStyle(url);
}, },
}, },
@@ -1197,7 +1197,16 @@ class ManagerMenuDialog extends ComfyDialog {
callback: () => { callback: () => {
const url = "https://comfyworkflows.com/"; const url = "https://comfyworkflows.com/";
localStorage.setItem("wg_last_visited", url); localStorage.setItem("wg_last_visited", url);
window.open(url, "comfyui-workflow-gallery"); window.open(url, url);
modifyButtonStyle(url);
},
},
{
title: "Open 'flowt.ai'",
callback: () => {
const url = "https://flowt.ai/";
localStorage.setItem("wg_last_visited", url);
window.open(url, url);
modifyButtonStyle(url); modifyButtonStyle(url);
}, },
}, },
@@ -270,6 +270,138 @@
"filename": "easynegative.safetensors", "filename": "easynegative.safetensors",
"url": "https://civitai.com/api/download/models/9208" "url": "https://civitai.com/api/download/models/9208"
}, },
{
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_b.safetensors",
"type": "checkpoints",
"base": "Stable Cascade",
"save_path": "checkpoints/Stable-Cascade",
"description": "[4.55GB] Stable Cascade stage_b checkpoints",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stable_cascade_stage_b.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_b.safetensors"
},
{
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_c.safetensors",
"type": "checkpoints",
"base": "Stable Cascade",
"save_path": "checkpoints/Stable-Cascade",
"description": "[9.22GB] Stable Cascade stage_c checkpoints",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stable_cascade_stage_c.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_c.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_a.safetensors (VAE)",
"type": "VAE",
"base": "Stable Cascade",
"save_path": "vae/Stable-Cascade",
"description": "[73.7MB] Stable Cascade: stage_a",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_a.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_a.safetensors"
},
{
"name": "stabilityai/Stable Cascade: effnet_encoder.safetensors (VAE)",
"type": "VAE",
"base": "Stable Cascade",
"save_path": "vae/Stable-Cascade",
"description": "[81.5MB] Stable Cascade: effnet_encoder.\nVAE encoder for stage_c latent.",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "effnet_encoder.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/effnet_encoder.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[6.25GB] Stable Cascade: stage_b",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_bf16.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[3.13GB] Stable Cascade: stage_b/bf16",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[2.8GB] Stable Cascade: stage_b/lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_lite.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[1.4GB] Stable Cascade: stage_b/bf16,lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_lite_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[14.4GB] Stable Cascade: stage_c",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_bf16.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[7.18GB] Stable Cascade: stage_c/bf16",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[4.12GB] Stable Cascade: stage_c/lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_lite.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[2.06GB] Stable Cascade: stage_c/bf16,lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_lite_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: text_encoder (CLIP)",
"type": "clip",
"base": "Stable Cascade",
"save_path": "clip/Stable-Cascade",
"description": "[1.39GB] Stable Cascade: text_encoder",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "model.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/text_encoder/model.safetensors"
},
{ {
"name": "SDXL-Turbo 1.0 (fp16)", "name": "SDXL-Turbo 1.0 (fp16)",
"type": "checkpoints", "type": "checkpoints",
@@ -667,8 +799,8 @@
"save_path": "default", "save_path": "default",
"description": "TemporalNet was a ControlNet model designed to enhance the temporal consistency of generated outputs", "description": "TemporalNet was a ControlNet model designed to enhance the temporal consistency of generated outputs",
"reference": "https://huggingface.co/CiaraRowles/TemporalNet2", "reference": "https://huggingface.co/CiaraRowles/TemporalNet2",
"filename": "temporalnetversion2.ckpt", "filename": "temporalnetversion2.safetensors",
"url": "https://huggingface.co/CiaraRowles/TemporalNet2/resolve/main/temporalnetversion2.ckpt" "url": "https://huggingface.co/CiaraRowles/TemporalNet2/resolve/main/temporalnetversion2.safetensors"
}, },
{ {
"name": "CiaraRowles/TemporalNet1XL (1.0)", "name": "CiaraRowles/TemporalNet1XL (1.0)",
@@ -1246,56 +1378,220 @@
}, },
{ {
"name": "animatediff/mmd_sd_v14.ckpt (comfyui-animatediff)", "name": "animatediff/mmd_sd_v14.ckpt (comfyui-animatediff) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/comfyui-animatediff/models", "save_path": "AnimateDiff",
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sd_v14.ckpt", "filename": "mm_sd_v14.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt"
}, },
{ {
"name": "animatediff/mm_sd_v15.ckpt (comfyui-animatediff)", "name": "animatediff/mm_sd_v15.ckpt (comfyui-animatediff) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/comfyui-animatediff/models", "save_path": "AnimateDiff",
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sd_v15.ckpt", "filename": "mm_sd_v15.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt"
}, },
{ {
"name": "animatediff/mmd_sd_v14.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/mmd_sd_v14.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models", "save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sd_v14.ckpt", "filename": "mm_sd_v14.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt"
}, },
{ {
"name": "animatediff/mm_sd_v15.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/mm_sd_v15.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models", "save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sd_v15.ckpt", "filename": "mm_sd_v15.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt"
}, },
{ {
"name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models", "save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sd_v15_v2.ckpt", "filename": "mm_sd_v15_v2.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt"
}, },
{
"name": "animatediff/v3_sd15_mm.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v3_sd15_mm.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_mm.ckpt"
},
{
"name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SDXL",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sdxl_v10_beta.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt"
},
{
"name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
"filename": "mm-Stabilized_high.pth",
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth"
},
{
"name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
"filename": "mm-Stabilized_mid.pth",
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth"
},
{
"name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/CiaraRowles/TemporalDiff",
"filename": "temporaldiff-v1-animatediff.ckpt",
"url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt"
},
{
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_PanLeft.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt"
},
{
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_PanRight.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt"
},
{
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_RollingAnticlockwise.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt"
},
{
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_RollingClockwise.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt"
},
{
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_TiltDown.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt"
},
{
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_TiltUp.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt"
},
{
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_ZoomIn.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt"
},
{
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_ZoomOut.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt"
},
{
"name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_32_frames.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt"
},
{
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_16_64_frames.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt"
},
{
"name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_16_64_frames_v1.1.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt"
},
{ {
"name": "animatediff/v3_sd15_sparsectrl_rgb.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v3_sd15_sparsectrl_rgb.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "controlnet", "type": "controlnet",
@@ -1316,16 +1612,6 @@
"filename": "v3_sd15_sparsectrl_scribble.ckpt", "filename": "v3_sd15_sparsectrl_scribble.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_scribble.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_scribble.ckpt"
}, },
{
"name": "animatediff/v3_sd15_mm.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v3_sd15_mm.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_mm.ckpt"
},
{ {
"name": "animatediff/v3_sd15_adapter.ckpt", "name": "animatediff/v3_sd15_adapter.ckpt",
"type": "lora", "type": "lora",
@@ -1337,158 +1623,6 @@
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_adapter.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_adapter.ckpt"
}, },
{
"name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SDXL",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sdxl_v10_beta.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt"
},
{
"name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
"filename": "mm-Stabilized_high.pth",
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth"
},
{
"name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
"filename": "mm-Stabilized_mid.pth",
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth"
},
{
"name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/CiaraRowles/TemporalDiff",
"filename": "temporaldiff-v1-animatediff.ckpt",
"url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt"
},
{
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_PanLeft.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt"
},
{
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_PanRight.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt"
},
{
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_RollingAnticlockwise.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt"
},
{
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_RollingClockwise.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt"
},
{
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_TiltDown.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt"
},
{
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_TiltUp.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt"
},
{
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_ZoomIn.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt"
},
{
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_ZoomOut.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt"
},
{
"name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_32_frames.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt"
},
{
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_16_64_frames.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt"
},
{
"name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_16_64_frames_v1.1.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt"
},
{ {
"name": "TencentARC/motionctrl.pth", "name": "TencentARC/motionctrl.pth",
"type": "checkpoints", "type": "checkpoints",
@@ -1810,6 +1944,97 @@
"reference": "https://huggingface.co/TencentARC/PhotoMaker", "reference": "https://huggingface.co/TencentARC/PhotoMaker",
"filename": "photomaker-v1.bin", "filename": "photomaker-v1.bin",
"url": "https://huggingface.co/TencentARC/PhotoMaker/resolve/main/photomaker-v1.bin" "url": "https://huggingface.co/TencentARC/PhotoMaker/resolve/main/photomaker-v1.bin"
},
{
"name": "1k3d68.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 1k3d68.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "1k3d68.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/1k3d68.onnx"
},
{
"name": "2d106det.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 2d106det.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "2d106det.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/2d106det.onnx"
},
{
"name": "genderage.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 genderage.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "genderage.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/genderage.onnx"
},
{
"name": "glintr100.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 glintr100.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "glintr100.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/glintr100.onnx"
},
{
"name": "scrfd_10g_bnkps.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 scrfd_10g_bnkps.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "scrfd_10g_bnkps.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/scrfd_10g_bnkps.onnx"
},
{
"name": "ip-adapter.bin",
"type": "instantid",
"base": "SDXL",
"save_path": "instantid",
"description": "InstantId main model based on IpAdapter",
"reference": "https://huggingface.co/InstantX/InstantID",
"filename": "ip-adapter.bin",
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin"
},
{
"name": "diffusion_pytorch_model.safetensors",
"type": "controlnet",
"base": "SDXL",
"save_path": "controlnet/instantid",
"description": "InstantId controlnet model",
"reference": "https://huggingface.co/InstantX/InstantID",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors"
},
{
"name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_cpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit"
},
{
"name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_gpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit"
} }
] ]
} }
@@ -9,7 +9,56 @@
"description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel." "description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel."
}, },
{
"author": "huizhang0110",
"title": "ComfyUI_Easy_Nodes_hui",
"reference": "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui",
"files": [
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui"
],
"install_type": "git-clone",
"description": "Nodes:EasyEmptyLatentImage"
},
{
"author": "tuckerdarby",
"title": "ComfyUI-TDNodes [WIP]",
"reference": "https://github.com/tuckerdarby/ComfyUI-TDNodes",
"files": [
"https://github.com/tuckerdarby/ComfyUI-TDNodes"
],
"install_type": "git-clone",
"description": "Nodes:KSampler (RAVE), KSampler (TF), Object Tracker, KSampler Batched, Video Tracker Prompt, TemporalNet Preprocessor, Instance Tracker Prompt, Instance Diffusion Loader, Hand Tracker Node"
},
{
"author": "shadowcz007",
"title": "comfyui-musicgen",
"reference": "https://github.com/shadowcz007/comfyui-musicgen",
"files": [
"https://github.com/shadowcz007/comfyui-musicgen"
],
"install_type": "git-clone",
"description": "Nodes:Musicgen"
},
{
"author": "Extraltodeus",
"title": "ComfyUI-variableCFGandAntiBurn [WIP]",
"reference": "https://github.com/Extraltodeus/ComfyUI-variableCFGandAntiBurn",
"files": [
"https://github.com/Extraltodeus/ComfyUI-variableCFGandAntiBurn"
],
"install_type": "git-clone",
"description": "Nodes:Continuous CFG rescaler (pre CFG), Intermediary latent merge (post CFG), Intensity/Brightness limiter (post CFG), Dynamic renoising (post CFG), Automatic CFG scale (pre/post CFG), CFG multiplier per channel (pre CFG), Self-Attention Guidance delayed activation mod (post CFG)"
},
{
"author": "shadowcz007",
"title": "comfyui-CLIPSeg",
"reference": "https://github.com/shadowcz007/comfyui-CLIPSeg",
"files": [
"https://github.com/shadowcz007/comfyui-CLIPSeg"
],
"install_type": "git-clone",
"description": "Download [a/CLIPSeg](https://huggingface.co/CIDAS/clipseg-rd64-refined/tree/main), move to : models/clipseg"
},
{ {
"author": "dezi-ai", "author": "dezi-ai",
"title": "ComfyUI Animate LCM", "title": "ComfyUI Animate LCM",
@@ -18,17 +67,47 @@
"https://github.com/dezi-ai/ComfyUI-AnimateLCM" "https://github.com/dezi-ai/ComfyUI-AnimateLCM"
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes: Configurator for AnimateLCM, Renderer for AnimateLCM to render the video." "description": "ComfyUI implementation for [a/AnimateLCM](https://animatelcm.github.io/) [[a/paper](https://arxiv.org/abs/2402.00769)].\b[w/This extension includes a large number of nodes imported from the existing custom nodes, increasing the likelihood of conflicts.]"
}, },
{ {
"author": "blepping", "author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-sonar (WIP)", "title": "ComfyUI-BRIA_AI-RMBG",
"reference": "https://github.com/blepping/ComfyUI-sonar", "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG",
"files": [ "files": [
"https://github.com/blepping/ComfyUI-sonar" "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG"
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Extremely WIP and untested implementation of Sonar sampling. Currently it may not be even close to working properly. Only supports Euler and Euler Ancestral sampling. See [a/stable-diffusion-webui-sonar](https://github.com/Kahsolt/stable-diffusion-webui-sonar) for a more in-depth explanation." "description": "Unofficial [a/BRIA Background Removal v1.4](https://huggingface.co/briaai/RMBG-1.4) of BRIA RMBG Model for ComfyUI"
},
{
"author": "stutya",
"title": "ComfyUI-Terminal [UNSAFE]",
"reference": "https://github.com/stutya/ComfyUI-Terminal",
"files": [
"https://github.com/stutya/ComfyUI-Terminal"
],
"install_type": "git-clone",
"description": "Run Terminal Commands from ComfyUI.\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]"
},
{
"author": "marcueberall",
"title": "ComfyUI-BuildPath",
"reference": "https://github.com/marcueberall/ComfyUI-BuildPath",
"files": [
"https://github.com/marcueberall/ComfyUI-BuildPath"
],
"install_type": "git-clone",
"description": "Nodes: Build Path Adv."
},
{
"author": "LotzF",
"title": "ComfyUI simple ChatGPT completion [UNSAFE]",
"reference": "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion",
"files": [
"https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion"
],
"install_type": "git-clone",
"description": "A simple node to request ChatGPT completions. [w/Do not share your workflows including the API key! I'll take no responsibility for your leaked keys.]"
}, },
{ {
"author": "kappa54m", "author": "kappa54m",
@@ -120,16 +199,6 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "WIP" "description": "WIP"
}, },
{
"author": "kadirnar",
"title": "ComfyUI-Transformers",
"reference": "https://github.com/kadirnar/ComfyUI-Transformers",
"files": [
"https://github.com/kadirnar/ComfyUI-Transformers"
],
"install_type": "git-clone",
"description": "Nodes:DepthEstimation."
},
{ {
"author": "MrAdamBlack", "author": "MrAdamBlack",
"title": "CheckProgress [WIP]", "title": "CheckProgress [WIP]",
@@ -10,6 +10,26 @@
}, },
{
"author": "ccvv804",
"title": "ComfyUI StableCascade using diffusers for Low VRAM [DEPRECATED]",
"reference": "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM",
"files": [
"https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM"
],
"install_type": "git-clone",
"description": "Works with RTX 4070ti 12GB.\nSimple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
},
{
"author": "kijai",
"title": "ComfyUI StableCascade using diffusers [DEPRECATED]",
"reference": "https://github.com/kijai/ComfyUI-DiffusersStableCascade",
"files": [
"https://github.com/kijai/ComfyUI-DiffusersStableCascade"
],
"install_type": "git-clone",
"description": "Simple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
},
{ {
"author": "solarpush", "author": "solarpush",
"title": "comfyui_sendimage_node [REMOVED]", "title": "comfyui_sendimage_node [REMOVED]",
@@ -10,6 +10,367 @@
}, },
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI YoloWorld-EfficientSAM",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/YOLO-World + EfficientSAM](https://huggingface.co/spaces/SkalskiP/YOLO-World) & [a/YOLO-World](https://github.com/AILab-CVC/YOLO-World) for ComfyUI"
},
{
"author": "nkchocoai",
"title": "ComfyUI-SaveImageWithMetaData",
"reference": "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData",
"files": [
"https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData"
],
"install_type": "git-clone",
"description": "Add a node to save images with metadata (PNGInfo) extracted from the input values of each node.\nSince the values are extracted dynamically, values output by various extension nodes can be added to metadata."
},
{
"author": "yuvraj108c",
"title": "ComfyUI-Vsgan",
"reference": "https://github.com/yuvraj108c/ComfyUI-Vsgan",
"files": [
"https://github.com/yuvraj108c/ComfyUI-Vsgan"
],
"install_type": "git-clone",
"description": "Nodes:Upscale Video Tensorrt"
},
{
"author": "Kijai",
"title": "Animatediff MotionLoRA Trainer",
"reference": "https://github.com/kijai/ComfyUI-ADMotionDirector",
"files": [
"https://github.com/kijai/ComfyUI-ADMotionDirector"
],
"install_type": "git-clone",
"description": "This is a trainer for AnimateDiff MotionLoRAs, based on the implementation of MotionDirector by ExponentialML."
},
{
"author": "GavChap",
"title": "ComfyUI-CascadeResolutions",
"reference": "https://github.com/GavChap/ComfyUI-CascadeResolutions",
"files": [
"https://github.com/GavChap/ComfyUI-CascadeResolutions"
],
"install_type": "git-clone",
"description": "Nodes:Cascade Resolutions"
},
{
"author": "blepping",
"title": "ComfyUI-sonar",
"reference": "https://github.com/blepping/ComfyUI-sonar",
"files": [
"https://github.com/blepping/ComfyUI-sonar"
],
"install_type": "git-clone",
"description": "A janky implementation of Sonar sampling (momentum-based sampling) for ComfyUI."
},
{
"author": "StartHua",
"title": "comfyui_segformer_b2_clothes",
"reference": "https://github.com/StartHua/Comfyui_segformer_b2_clothes",
"files": [
"https://github.com/StartHua/Comfyui_segformer_b2_clothes"
],
"install_type": "git-clone",
"description": "SegFormer model fine-tuned on ATR dataset for clothes segmentation but can also be used for human segmentation!\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/mattmdjaga/segformer_b2_clothes](https://huggingface.co/mattmdjaga/segformer_b2_clothes)"
},
{
"author": "AshMartian",
"title": "Dir Gir",
"reference": "https://github.com/AshMartian/ComfyUI-DirGir",
"files": [
"https://github.com/AshMartian/ComfyUI-DirGir/raw/main/dir_picker.py",
"https://github.com/AshMartian/ComfyUI-DirGir/raw/main/dir_loop.py"
],
"install_type": "copy",
"description": "A collection of ComfyUI directory automation utility nodes. Directory Get It Right adds a GUI directory browser, and smart directory loop/iteration node that supports regex and file extension filtering."
},
{
"author": "ccvv804",
"title": "ComfyUI StableCascade using diffusers for Low VRAM",
"reference": "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM",
"files": [
"https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM"
],
"install_type": "git-clone",
"description": "Works with RTX 4070ti 12GB.\nSimple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
},
{
"author": "yuvraj108c",
"title": "ComfyUI-Pronodes",
"reference": "https://github.com/yuvraj108c/ComfyUI-Pronodes",
"files": [
"https://github.com/yuvraj108c/ComfyUI-Pronodes"
],
"install_type": "git-clone",
"description": "A collection of nice utility nodes for ComfyUI"
},
{
"author": "pkpkTech",
"title": "ComfyUI-SaveQueues",
"reference": "https://github.com/pkpkTech/ComfyUI-SaveQueues",
"files": [
"https://github.com/pkpkTech/ComfyUI-SaveQueues"
],
"install_type": "git-clone",
"description": "Add a button to the menu to save and load the running queue and the pending queues.\nThis is intended to be used when you want to exit ComfyUI with queues still remaining."
},
{
"author": "jordoh",
"title": "ComfyUI Deepface",
"reference": "https://github.com/jordoh/ComfyUI-Deepface",
"files": [
"https://github.com/jordoh/ComfyUI-Deepface"
],
"install_type": "git-clone",
"description": "ComfyUI nodes wrapping the [a/deepface](https://github.com/serengil/deepface) library."
},
{
"author": "kijai",
"title": "ComfyUI StableCascade using diffusers",
"reference": "https://github.com/kijai/ComfyUI-DiffusersStableCascade",
"files": [
"https://github.com/kijai/ComfyUI-DiffusersStableCascade"
],
"install_type": "git-clone",
"description": "Simple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
},
{
"author": "Extraltodeus",
"title": "ComfyUI-AutomaticCFG",
"reference": "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG",
"files": [
"https://github.com/Extraltodeus/ComfyUI-AutomaticCFG"
],
"install_type": "git-clone",
"description": "My own version 'from scratch' of a self-rescaling CFG. It isn't much but it's honest work.\nTLDR: set your CFG at 8 to try it. No burned images and artifacts anymore. CFG is also a bit more sensitive because it's a proportion around 8. Low scale like 4 also gives really nice results since your CFG is not the CFG anymore. Also in general even with relatively low settings it seems to improve the quality."
},
{
"author": "Mamaaaamooooo",
"title": "Batch Rembg for ComfyUI",
"reference": "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes",
"files": [
"https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes"
],
"install_type": "git-clone",
"description": "Remove background of plural images."
},
{
"author": "ShmuelRonen",
"title": "ComfyUI-SVDResizer",
"reference": "https://github.com/ShmuelRonen/ComfyUI-SVDResizer",
"files": [
"https://github.com/ShmuelRonen/ComfyUI-SVDResizer"
],
"install_type": "git-clone",
"description": "SVDResizer is a helper for resizing the source image, according to the sizes enabled in Stable Video Diffusion. The rationale behind the possibility of changing the size of the image in steps between the ranges of 576 and 1024, is the use of the greatest common denominator of these two numbers which is 64. SVD is lenient with resizing that adheres to this rule, so the chance of coherent video that is not the standard size of 576X1024 is greater. It is advisable to keep the value 1024 constant and play with the second size to maintain the stability of the result."
},
{
"author": "xiaoxiaodesha",
"title": "hd-nodes-comfyui",
"reference": "https://github.com/xiaoxiaodesha/hd_node",
"files": [
"https://github.com/xiaoxiaodesha/hd_node"
],
"install_type": "git-clone",
"description": "Nodes:Combine HDMasks, Cover HDMasks, HD FaceIndex, HD SmoothEdge, HD GetMaskArea, HD Image Levels, HD Ultimate SD Upscale"
},
{
"author": "StartHua",
"title": "Comfyui_joytag",
"reference": "https://github.com/StartHua/Comfyui_joytag",
"files": [
"https://github.com/StartHua/Comfyui_joytag"
],
"install_type": "git-clone",
"description": "JoyTag is a state of the art AI vision model for tagging images, with a focus on sex positivity and inclusivity. It uses the Danbooru tagging schema, but works across a wide range of images, from hand drawn to photographic.\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/fancyfeast/joytag/tree/main](https://huggingface.co/fancyfeast/joytag/tree/main)"
},
{
"author": "redhottensors",
"title": "ComfyUI-Prediction",
"reference": "https://github.com/redhottensors/ComfyUI-Prediction",
"files": [
"https://github.com/redhottensors/ComfyUI-Prediction"
],
"install_type": "git-clone",
"description": "Fully customizable Classifier Free Guidance for ComfyUI."
},
{
"author": "nkchocoai",
"title": "ComfyUI-TextOnSegs",
"reference": "https://github.com/nkchocoai/ComfyUI-TextOnSegs",
"files": [
"https://github.com/nkchocoai/ComfyUI-TextOnSegs"
],
"install_type": "git-clone",
"description": "Add a node for drawing text with CR Draw Text of ComfyUI_Comfyroll_CustomNodes to the area of SEGS detected by Ultralytics Detector of ComfyUI-Impact-Pack."
},
{
"author": "cubiq",
"title": "ComfyUI InstantID (Native Support)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID",
"files": [
"https://github.com/cubiq/ComfyUI_InstantID"
],
"install_type": "git-clone",
"description": "Native [a/InstantID](https://github.com/InstantID/InstantID) support for ComfyUI.\nThis extension differs from the many already available as it doesn't use diffusers but instead implements InstantID natively and it fully integrates with ComfyUI.\nPlease note this still could be considered beta stage, looking forward to your feedback."
},
{
"author": "Franck-Demongin",
"title": "NX_PromptStyler",
"reference": "https://github.com/Franck-Demongin/NX_PromptStyler",
"files": [
"https://github.com/Franck-Demongin/NX_PromptStyler"
],
"install_type": "git-clone",
"description": "A custom node for ComfyUI to create a prompt based on a list of keywords saved in CSV files."
},
{
"author": "Billius-AI",
"title": "ComfyUI-Path-Helper",
"reference": "https://github.com/Billius-AI/ComfyUI-Path-Helper",
"files": [
"https://github.com/Billius-AI/ComfyUI-Path-Helper"
],
"install_type": "git-clone",
"description": "Nodes:Create Project Root, Add Folder, Add Folder Advanced, Add File Name Prefix, Add File Name Prefix Advanced, ShowPath"
},
{
"author": "mbrostami",
"title": "ComfyUI-HF",
"reference": "https://github.com/mbrostami/ComfyUI-HF",
"files": [
"https://github.com/mbrostami/ComfyUI-HF"
],
"install_type": "git-clone",
"description": "ComfyUI Node to work with Hugging Face repositories"
},
{
"author": "digitaljohn",
"title": "ComfyUI-ProPost",
"reference": "https://github.com/digitaljohn/comfyui-propost",
"files": [
"https://github.com/digitaljohn/comfyui-propost"
],
"install_type": "git-clone",
"description": "A set of custom ComfyUI nodes for performing basic post-processing effects including Film Grain and Vignette. These effects can help to take the edge off AI imagery and make them feel more natural."
},
{
"author": "deforum",
"title": "Deforum Nodes",
"reference": "https://github.com/XmYx/deforum-comfy-nodes",
"files": [
"https://github.com/XmYx/deforum-comfy-nodes"
],
"install_type": "git-clone",
"description": "Official Deforum animation pipeline tools that provide a unique way to create frame-by-frame generative motion art."
},
{
"author": "adbrasi",
"title": "ComfyUI-TrashNodes-DownloadHuggingface",
"reference": "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface",
"files": [
"https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface"
],
"install_type": "git-clone",
"description": "ComfyUI-TrashNodes-DownloadHuggingface is a ComfyUI node designed to facilitate the download of models you have just trained and uploaded to Hugging Face. This node is particularly useful for users who employ Google Colab for training and need to quickly download their models for deployment."
},
{
"author": "DonBaronFactory",
"title": "ComfyUI-Cre8it-Nodes",
"reference": "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes",
"files": [
"https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes"
],
"install_type": "git-clone",
"description": "Nodes:CRE8IT Serial Prompter, CRE8IT Apply Serial Prompter, CRE8IT Image Sizer. A few simple nodes to facilitate working wiht ComfyUI Workflows"
},
{
"author": "dezi-ai",
"title": "ComfyUI Animate LCM",
"reference": "https://github.com/dezi-ai/ComfyUI-AnimateLCM",
"files": [
"https://github.com/dezi-ai/ComfyUI-AnimateLCM"
],
"install_type": "git-clone",
"description": "ComfyUI implementation for [a/AnimateLCM](https://animatelcm.github.io/) [[a/paper](https://arxiv.org/abs/2402.00769)]."
},
{
"author": "kadirnar",
"title": "ComfyUI-Transformers",
"reference": "https://github.com/kadirnar/ComfyUI-Transformers",
"files": [
"https://github.com/kadirnar/ComfyUI-Transformers"
],
"install_type": "git-clone",
"description": "ComfyUI-Transformers is a cutting-edge project combining the power of computer vision and natural language processing to create intuitive and user-friendly interfaces. Our goal is to make technology more accessible and engaging."
},
{
"author": "chaojie",
"title": "ComfyUI-DynamiCrafter",
"reference": "https://github.com/chaojie/ComfyUI-DynamiCrafter",
"files": [
"https://github.com/chaojie/ComfyUI-DynamiCrafter"
],
"install_type": "git-clone",
"description": "Better Dynamic, Higher Resolution, and Stronger Coherence!"
},
{
"author": "bilal-arikan",
"title": "ComfyUI_TextAssets",
"reference": "https://github.com/bilal-arikan/ComfyUI_TextAssets",
"files": [
"https://github.com/bilal-arikan/ComfyUI_TextAssets"
],
"install_type": "git-clone",
"description": "With this node you can upload text files to input folder from your local computer."
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI SegMoE",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/SegMoE: Segmind Mixture of Diffusion Experts](https://github.com/segmind/segmoe) for ComfyUI"
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-SVD-ZHO (WIP)",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO"
],
"install_type": "git-clone",
"description": "My Workflows + Auxiliary nodes for Stable Video Diffusion (SVD)"
},
{
"author": "MarkoCa1",
"title": "ComfyUI_Segment_Mask",
"reference": "https://github.com/MarkoCa1/ComfyUI_Segment_Mask",
"files": [
"https://github.com/MarkoCa1/ComfyUI_Segment_Mask"
],
"install_type": "git-clone",
"description": "Mask cutout based on Segment Anything."
},
{
"author": "antrobot",
"title": "antrobots-comfyUI-nodepack",
"reference": "https://github.com/antrobot1234/antrobots-comfyUI-nodepack",
"files": [
"https://github.com/antrobot1234/antrobots-comfyUI-nodepack"
],
"install_type": "git-clone",
"description": "A small node pack containing various things I felt like ought to be in base comfy-UI. Currently includes Some image handling nodes to help with inpainting, a version of KSampler (advanced) that allows for denoise, and a node that can swap it's inputs. Remember to make an issue if you experience any bugs or errors!"
},
{ {
"author": "dfl", "author": "dfl",
"title": "comfyui-clip-with-break", "title": "comfyui-clip-with-break",
@@ -52,7 +413,7 @@
}, },
{ {
"author": "davask", "author": "davask",
"title": "MarasIT Nodes", "title": "🐰 MarasIT Nodes",
"reference": "https://github.com/davask/ComfyUI-MarasIT-Nodes", "reference": "https://github.com/davask/ComfyUI-MarasIT-Nodes",
"files": [ "files": [
"https://github.com/davask/ComfyUI-MarasIT-Nodes" "https://github.com/davask/ComfyUI-MarasIT-Nodes"
@@ -359,396 +720,6 @@
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Just a simple substring node that takes text and length as input, and outputs the first length characters." "description": "Just a simple substring node that takes text and length as input, and outputs the first length characters."
},
{
"author": "Nlar",
"title": "ComfyUI_CartoonSegmentation",
"reference": "https://github.com/Nlar/ComfyUI_CartoonSegmentation",
"files": [
"https://github.com/Nlar/ComfyUI_CartoonSegmentation"
],
"install_type": "git-clone",
"description": "Front end ComfyUI nodes for CartoonSegmentation Based upon the work of the CartoonSegmentation repository this project will provide a front end to some of the features."
},
{
"author": "Acly",
"title": "ComfyUI Inpaint Nodes",
"reference": "https://github.com/Acly/comfyui-inpaint-nodes",
"files": [
"https://github.com/Acly/comfyui-inpaint-nodes"
],
"install_type": "git-clone",
"description": "Experimental nodes for better inpainting with ComfyUI. Adds two nodes which allow using [a/Fooocus](https://github.com/Acly/comfyui-inpaint-nodes) inpaint model. It's a small and flexible patch which can be applied to any SDXL checkpoint and will transform it into an inpaint model. This model can then be used like other inpaint models, and provides the same benefits. [a/Read more](https://github.com/lllyasviel/Fooocus/discussions/414)"
},
{
"author": "Abdullah Ozmantar",
"title": "InstaSwap Face Swap Node for ComfyUI",
"reference": "https://github.com/abdozmantar/ComfyUI-InstaSwap",
"files": [
"https://github.com/abdozmantar/ComfyUI-InstaSwap"
],
"install_type": "git-clone",
"description": "A quick and easy ComfyUI custom nodes for ultra-quality, lightning-speed face swapping of humans."
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI PhotoMaker (ZHO)",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/PhotoMaker](https://github.com/TencentARC/PhotoMaker) for ComfyUI"
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-InstantID",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/InstantID](https://github.com/InstantID/InstantID) for ComfyUI"
},
{
"author": "FlyingFireCo",
"title": "tiled_ksampler",
"reference": "https://github.com/FlyingFireCo/tiled_ksampler",
"files": [
"https://github.com/FlyingFireCo/tiled_ksampler"
],
"install_type": "git-clone",
"description": "Nodes:Tiled KSampler, Asymmetric Tiled KSampler, Circular VAEDecode."
},
{
"author": "abdozmantar",
"title": "InstaSwap Face Swap Node for ComfyUI",
"reference": "https://github.com/abdozmantar/ComfyUI-InstaSwap",
"files": [
"https://github.com/abdozmantar/ComfyUI-InstaSwap"
],
"install_type": "git-clone",
"description": "Fastest Face Swap Extension Node for ComfyUI, Single node and FastTrack: Lightning-Speed Facial Transformation for your projects."
},
{
"author": "pkpkTech",
"title": "ComfyUI-ngrok",
"reference": "https://github.com/pkpkTech/ComfyUI-ngrok",
"files": [
"https://github.com/pkpkTech/ComfyUI-ngrok"
],
"install_type": "git-clone",
"description": "Use ngrok to allow external access to ComfyUI.\nNOTE: Need to manually modify a token inside the __init__.py file."
},
{
"author": "Daniel Lewis",
"title": "ComfyUI-TTS",
"reference": "https://github.com/daniel-lewis-ab/ComfyUI-TTS",
"files": [
"https://github.com/daniel-lewis-ab/ComfyUI-TTS"
],
"install_type": "git-clone",
"description": "Text To Speech (TTS) for ComfyUI"
},
{
"author": "thecooltechguy",
"title": "ComfyUI-ComfyWorkflows",
"reference": "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows",
"files": [
"https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows"
],
"install_type": "git-clone",
"description": "The best way to run, share, & discover thousands of ComfyUI workflows."
},
{
"author": "Shraknard",
"title": "ComfyUI-Remover",
"reference": "https://github.com/Shraknard/ComfyUI-Remover",
"files": [
"https://github.com/Shraknard/ComfyUI-Remover"
],
"install_type": "git-clone",
"description": "Custom node for ComfyUI that makes parts of the image transparent (face, background...)"
},
{
"author": "adriflex",
"title": "ComfyUI_Blender_Texdiff",
"reference": "https://github.com/adriflex/ComfyUI_Blender_Texdiff",
"files": [
"https://github.com/adriflex/ComfyUI_Blender_Texdiff"
],
"install_type": "git-clone",
"description": "Nodes:Blender viewport color, Blender Viewport depth"
},
{
"author": "chaojie",
"title": "ComfyUI-RAFT",
"reference": "https://github.com/chaojie/ComfyUI-RAFT",
"files": [
"https://github.com/chaojie/ComfyUI-RAFT"
],
"install_type": "git-clone",
"description": "This is an ComfyUI implementation of RAFT to generate motion brush"
},
{
"author": "DimaChaichan",
"title": "LAizypainter-Exporter-ComfyUI",
"reference": "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI",
"files": [
"https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI"
],
"install_type": "git-clone",
"description": "This exporter is a plugin for ComfyUI, which can export tasks for [a/LAizypainter](https://github.com/DimaChaichan/LAizypainter).\nLAizypainter is a Photoshop plugin with which you can send tasks directly to a Stable Diffusion server. More information about a [a/Task](https://github.com/DimaChaichan/LAizypainter?tab=readme-ov-file#task)"
},
{
"author": "Qais Malkawi",
"title": "ComfyUI-Qais-Helper",
"reference": "https://github.com/QaisMalkawi/ComfyUI-QaisHelper",
"files": [
"https://github.com/QaisMalkawi/ComfyUI-QaisHelper"
],
"install_type": "git-clone",
"description": "This Extension adds a few custom QOL nodes that ComfyUI lacks by default."
},
{
"author": "longgui0318",
"title": "comfyui-mask-util",
"reference": "https://github.com/longgui0318/comfyui-mask-util",
"files": [
"https://github.com/longgui0318/comfyui-mask-util"
],
"install_type": "git-clone",
"description": "Nodes:Split Masks"
},
{
"author": "shiimizu",
"title": "ComfyUI PhotoMaker Plus",
"reference": "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus",
"files": [
"https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus"
],
"install_type": "git-clone",
"description": "ComfyUI reference implementation for [a/PhotoMaker](https://github.com/TencentARC/PhotoMaker) models. [w/WARN:The repository name has been changed. For those who have previously installed it, please delete custom_nodes/ComfyUI-PhotoMaker from disk and reinstall this.]"
},
{
"author": "darkpixel",
"title": "DarkPrompts",
"reference": "https://github.com/darkpixel/darkprompts",
"files": [
"https://github.com/darkpixel/darkprompts"
],
"install_type": "git-clone",
"description": "Slightly better random prompt generation tools that allow combining and picking prompts from both file and text input sources."
},
{
"author": "Taremin",
"title": "WebUI Monaco Prompt",
"reference": "https://github.com/Taremin/webui-monaco-prompt",
"files": [
"https://github.com/Taremin/webui-monaco-prompt"
],
"install_type": "git-clone",
"description": "Make it possible to edit the prompt using the Monaco Editor, an editor implementation used in VSCode.\nNOTE: This extension supports both ComfyUI and A1111 simultaneously."
},
{
"author": "JcandZero",
"title": "ComfyUI_GLM4Node",
"reference": "https://github.com/JcandZero/ComfyUI_GLM4Node",
"files": [
"https://github.com/JcandZero/ComfyUI_GLM4Node"
],
"install_type": "git-clone",
"description": "GLM4 Vision Integration"
},
{
"author": "miosp",
"title": "ComfyUI-FBCNN",
"reference": "https://github.com/Miosp/ComfyUI-FBCNN",
"files": [
"https://github.com/Miosp/ComfyUI-FBCNN"
],
"install_type": "git-clone",
"description": "A node for JPEG de-artifacting using [a/FBCNN](https://github.com/jiaxi-jiang/FBCNN)."
},
{
"author": "chaojie",
"title": "ComfyUI-LightGlue",
"reference": "https://github.com/chaojie/ComfyUI-LightGlue",
"files": [
"https://github.com/chaojie/ComfyUI-LightGlue"
],
"install_type": "git-clone",
"description": "This is an ComfyUI implementation of LightGlue to generate motion brush"
},
{
"author": "Mr.ForExample",
"title": "ComfyUI-AnimateAnyone-Evolved",
"reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved",
"files": [
"https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved"
],
"install_type": "git-clone",
"description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀\n[w/The torch environment may be compromised due to version issues as some torch-related packages are being reinstalled.]"
},
{
"author": "chaojie",
"title": "ComfyUI-I2VGEN-XL",
"reference": "https://github.com/chaojie/ComfyUI-I2VGEN-XL",
"files": [
"https://github.com/chaojie/ComfyUI-I2VGEN-XL"
],
"install_type": "git-clone",
"description": "This is an implementation of [a/i2vgen-xl](https://github.com/ali-vilab/i2vgen-xl)"
},
{
"author": "Inzaniak",
"title": "Ranbooru for ComfyUI",
"reference": "https://github.com/Inzaniak/comfyui-ranbooru",
"files": [
"https://github.com/Inzaniak/comfyui-ranbooru"
],
"install_type": "git-clone",
"description": "Ranbooru is an extension for the comfyUI. The purpose of this extension is to add a node that gets a random set of tags from boorus pictures. This is mostly being used to help me test my checkpoints on a large variety of"
},
{
"author": "Taremin",
"title": "ComfyUI String Tools",
"reference": "https://github.com/Taremin/comfyui-string-tools",
"files": [
"https://github.com/Taremin/comfyui-string-tools"
],
"install_type": "git-clone",
"description": " This extension provides the StringToolsConcat node, which concatenates multiple texts, and the StringToolsRandomChoice node, which selects one randomly from multiple texts."
},
{
"author": "dave-palt",
"title": "comfyui_DSP_imagehelpers",
"reference": "https://github.com/dave-palt/comfyui_DSP_imagehelpers",
"files": [
"https://github.com/dave-palt/comfyui_DSP_imagehelpers"
],
"install_type": "git-clone",
"description": "Nodes: DSP Image Concat"
},
{
"author": "chaojie",
"title": "ComfyUI-Moore-AnimateAnyone",
"reference": "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone",
"files": [
"https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone"
],
"install_type": "git-clone",
"description": "Nodes: Run python tools/download_weights.py first to download weights automatically"
},
{
"author": "chflame163",
"title": "ComfyUI Layer Style",
"reference": "https://github.com/chflame163/ComfyUI_LayerStyle",
"files": [
"https://github.com/chflame163/ComfyUI_LayerStyle"
],
"install_type": "git-clone",
"description": "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress."
},
{
"author": "kijai",
"title": "ComfyUI-DDColor",
"reference": "https://github.com/kijai/ComfyUI-DDColor",
"files": [
"https://github.com/kijai/ComfyUI-DDColor"
],
"install_type": "git-clone",
"description": "Node to use [a/DDColor](https://github.com/piddnad/DDColor) in ComfyUI."
},
{
"author": "prozacgod",
"title": "ComfyUI Multi-Workspace",
"reference": "https://github.com/prozacgod/comfyui-pzc-multiworkspace",
"files": [
"https://github.com/prozacgod/comfyui-pzc-multiworkspace"
],
"install_type": "git-clone",
"description": "A simple, quick, and dirty implementation of multiple workspaces within ComfyUI."
},
{
"author": "Siberpone",
"title": "Lazy Pony Prompter",
"reference": "https://github.com/Siberpone/lazy-pony-prompter",
"files": [
"https://github.com/Siberpone/lazy-pony-prompter"
],
"install_type": "git-clone",
"description": "A pony prompt helper extension for AUTOMATIC1111's Stable Diffusion Web UI and ComfyUI that utilizes the full power of your favorite booru query syntax. Currently supports [a/Derpibooru](https://derpibooru/org) and [a/E621](https://e621.net/)."
},
{
"author": "chaojie",
"title": "ComfyUI-MotionCtrl-SVD",
"reference": "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD",
"files": [
"https://github.com/chaojie/ComfyUI-MotionCtrl-SVD"
],
"install_type": "git-clone",
"description": "Nodes: Download the weights of MotionCtrl-SVD [a/motionctrl_svd.ckpt](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl_svd.ckpt) and put it to ComfyUI/models/checkpoints"
},
{
"author": "JaredTherriault",
"title": "ComfyUI-JNodes",
"reference": "https://github.com/JaredTherriault/ComfyUI-JNodes",
"files": [
"https://github.com/JaredTherriault/ComfyUI-JNodes"
],
"install_type": "git-clone",
"description": "python and web UX improvements for ComfyUI.\n[w/'DynamicPrompts.js' and 'EditAttention.js' from the core, along with 'ImageFeed.js' and 'favicon.js' from the custom scripts of pythongosssss, are not compatible. Therefore, manual deletion of these files is required to use this web extension.]"
},
{
"author": "nkchocoai",
"title": "ComfyUI-SizeFromPresets",
"reference": "https://github.com/nkchocoai/ComfyUI-SizeFromPresets",
"files": [
"https://github.com/nkchocoai/ComfyUI-SizeFromPresets"
],
"install_type": "git-clone",
"description": "Add a node that outputs width and height of the size selected from the preset (.csv)."
},
{
"author": "HAL41",
"title": "ComfyUI aichemy nodes",
"reference": "https://github.com/HAL41/ComfyUI-aichemy-nodes",
"files": [
"https://github.com/HAL41/ComfyUI-aichemy-nodes"
],
"install_type": "git-clone",
"description": "Simple node to handle scaling of YOLOv8 segmentation masks"
},
{
"author": "abyz22",
"title": "image_control",
"reference": "https://github.com/abyz22/image_control",
"files": [
"https://github.com/abyz22/image_control"
],
"install_type": "git-clone",
"description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor. Please check workflow in [a/https://github.com/abyz22/image_control](https://github.com/abyz22/image_control)"
},
{
"author": "foxtrot-roger",
"title": "RF Nodes",
"reference": "https://github.com/foxtrot-roger/comfyui-rf-nodes",
"files": [
"https://github.com/foxtrot-roger/comfyui-rf-nodes"
],
"install_type": "git-clone",
"description": "A bunch of nodes that can be useful to manipulate primitive types (numbers, text, ...) Also some helpers to generate text and timestamps."
},
{
"author": "LarryJane491",
"title": "Lora-Training-in-Comfy",
"reference": "https://github.com/LarryJane491/Lora-Training-in-Comfy",
"files": [
"https://github.com/LarryJane491/Lora-Training-in-Comfy"
],
"install_type": "git-clone",
"description": "This custom node lets you train LoRA directly in ComfyUI! By default, it saves directly in your ComfyUI lora folder. That means you just have to refresh after training (...and select the LoRA) to test it!"
} }
] ]
} }
@@ -1,5 +1,208 @@
{ {
"models": [ "models": [
{
"name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_cpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit"
},
{
"name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_gpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit"
},
{
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_b.safetensors",
"type": "checkpoints",
"base": "Stable Cascade",
"save_path": "checkpoints/Stable-Cascade",
"description": "[4.55GB] Stable Cascade stage_b checkpoints",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stable_cascade_stage_b.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_b.safetensors"
},
{
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_c.safetensors",
"type": "checkpoints",
"base": "Stable Cascade",
"save_path": "checkpoints/Stable-Cascade",
"description": "[9.22GB] Stable Cascade stage_c checkpoints",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stable_cascade_stage_c.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_c.safetensors"
},
{
"name": "stabilityai/Stable Cascade: effnet_encoder.safetensors (VAE)",
"type": "VAE",
"base": "Stable Cascade",
"save_path": "vae/Stable-Cascade",
"description": "[81.5MB] Stable Cascade: effnet_encoder.\nVAE encoder for stage_c latent.",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "effnet_encoder.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/effnet_encoder.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_a.safetensors (VAE)",
"type": "VAE",
"base": "Stable Cascade",
"save_path": "vae/Stable-Cascade",
"description": "[73.7MB] Stable Cascade: stage_a",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_a.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_a.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[6.25GB] Stable Cascade: stage_b",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_bf16.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[3.13GB] Stable Cascade: stage_b/bf16",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[2.8GB] Stable Cascade: stage_b/lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_lite.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[1.4GB] Stable Cascade: stage_b/bf16,lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_lite_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[14.4GB] Stable Cascade: stage_c",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_bf16.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[7.18GB] Stable Cascade: stage_c/bf16",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[4.12GB] Stable Cascade: stage_c/lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_lite.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[2.06GB] Stable Cascade: stage_c/bf16,lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_lite_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: text_encoder (CLIP)",
"type": "clip",
"base": "Stable Cascade",
"save_path": "clip/Stable-Cascade",
"description": "[1.39GB] Stable Cascade: text_encoder",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "model.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/text_encoder/model.safetensors"
},
{
"name": "1k3d68.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 1k3d68.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "1k3d68.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/1k3d68.onnx"
},
{
"name": "2d106det.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 2d106det.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "2d106det.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/2d106det.onnx"
},
{
"name": "genderage.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 genderage.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "genderage.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/genderage.onnx"
},
{
"name": "glintr100.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 glintr100.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "glintr100.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/glintr100.onnx"
},
{
"name": "scrfd_10g_bnkps.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/antelopev2",
"description": "Antelopev2 scrfd_10g_bnkps.onnx model for InstantId. (InstantId needs all Antelopev2 models)",
"reference": "https://github.com/cubiq/ComfyUI_InstantID#installation",
"filename": "scrfd_10g_bnkps.onnx",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/scrfd_10g_bnkps.onnx"
},
{ {
"name": "photomaker-v1.bin", "name": "photomaker-v1.bin",
"type": "photomaker", "type": "photomaker",
@@ -175,11 +378,11 @@
}, },
{ {
"name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models", "save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff", "reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_16_64_frames_v1.1.ckpt", "filename": "lt_long_mm_16_64_frames_v1.1.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt" "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt"
@@ -258,21 +461,21 @@
"url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt" "url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt"
}, },
{ {
"name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models", "save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff", "reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_32_frames.ckpt", "filename": "lt_long_mm_32_frames.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt" "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt"
}, },
{ {
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models", "save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff", "reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_16_64_frames.ckpt", "filename": "lt_long_mm_16_64_frames.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt" "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt"
@@ -420,363 +623,94 @@
}, },
{ {
"name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff", "type": "animatediff",
"base": "SDXL", "base": "SDXL",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models", "save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sdxl_v10_beta.ckpt", "filename": "mm_sdxl_v10_beta.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt"
}, },
{ {
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora", "type": "motion lora",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora", "save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_PanLeft.ckpt", "filename": "v2_lora_PanLeft.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt"
}, },
{ {
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora", "type": "motion lora",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora", "save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_PanRight.ckpt", "filename": "v2_lora_PanRight.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt"
}, },
{ {
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora", "type": "motion lora",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora", "save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_RollingAnticlockwise.ckpt", "filename": "v2_lora_RollingAnticlockwise.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt"
}, },
{ {
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora", "type": "motion lora",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora", "save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_RollingClockwise.ckpt", "filename": "v2_lora_RollingClockwise.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt"
}, },
{ {
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora", "type": "motion lora",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora", "save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_TiltDown.ckpt", "filename": "v2_lora_TiltDown.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt"
}, },
{ {
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora", "type": "motion lora",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora", "save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_TiltUp.ckpt", "filename": "v2_lora_TiltUp.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt"
}, },
{ {
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora", "type": "motion lora",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora", "save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_ZoomIn.ckpt", "filename": "v2_lora_ZoomIn.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt"
}, },
{ {
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved)", "name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora", "type": "motion lora",
"base": "SD1.x", "base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/motion_lora", "save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff", "reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_ZoomOut.ckpt", "filename": "v2_lora_ZoomOut.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt" "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt"
},
{
"name": "CiaraRowles/TemporalNet1XL (1.0)",
"type": "controlnet",
"base": "SD1.5",
"save_path": "controlnet/TemporalNet1XL",
"description": "This is TemporalNet1XL, it is a re-train of the controlnet TemporalNet1 with Stable Diffusion XL.",
"reference": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
},
{
"name": "LCM LoRA SD1.5",
"type": "lora",
"base": "SD1.5",
"save_path": "loras/lcm/SD1.5",
"description": "Latent Consistency LoRA for SD1.5",
"reference": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5",
"filename": "pytorch_lora_weights.safetensors",
"url": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5/resolve/main/pytorch_lora_weights.safetensors"
},
{
"name": "LCM LoRA SSD-1B",
"type": "lora",
"base": "SSD-1B",
"save_path": "loras/lcm/SSD-1B",
"description": "Latent Consistency LoRA for SSD-1B",
"reference": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b",
"filename": "pytorch_lora_weights.safetensors",
"url": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b/resolve/main/pytorch_lora_weights.safetensors"
},
{
"name": "LCM LoRA SDXL",
"type": "lora",
"base": "SSD-1B",
"save_path": "loras/lcm/SDXL",
"description": "Latent Consistency LoRA for SDXL",
"reference": "https://huggingface.co/latent-consistency/lcm-lora-sdxl",
"filename": "pytorch_lora_weights.safetensors",
"url": "https://huggingface.co/latent-consistency/lcm-lora-sdxl/resolve/main/pytorch_lora_weights.safetensors"
},
{
"name": "face_yolov8m-seg_60.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "face_yolov8m-seg_60.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8m-seg_60.pt"
},
{
"name": "face_yolov8n-seg2_60.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "face_yolov8n-seg2_60.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8n-seg2_60.pt"
},
{
"name": "hair_yolov8n-seg_60.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "hair_yolov8n-seg_60.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/hair_yolov8n-seg_60.pt"
},
{
"name": "skin_yolov8m-seg_400.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "skin_yolov8m-seg_400.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8m-seg_400.pt"
},
{
"name": "skin_yolov8n-seg_400.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "skin_yolov8n-seg_400.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_400.pt"
},
{
"name": "skin_yolov8n-seg_800.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "skin_yolov8n-seg_800.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_800.pt"
},
{
"name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/CiaraRowles/TemporalDiff",
"filename": "temporaldiff-v1-animatediff.ckpt",
"url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt"
},
{
"name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sd_v15_v2.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt"
},
{
"name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
"filename": "mm-Stabilized_high.pth",
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth"
},
{
"name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
"filename": "mm-Stabilized_mid.pth",
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth"
},
{
"name": "GFPGANv1.4.pth",
"type": "GFPGAN",
"base": "GFPGAN",
"save_path": "facerestore_models",
"description": "Face Restoration Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
"reference": "https://github.com/TencentARC/GFPGAN/releases",
"filename": "GFPGANv1.4.pth",
"url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/GFPGANv1.4.pth"
},
{
"name": "codeformer.pth",
"type": "CodeFormer",
"base": "CodeFormer",
"save_path": "facerestore_models",
"description": "Face Restoration Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
"reference": "https://github.com/sczhou/CodeFormer/releases",
"filename": "codeformer.pth",
"url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth"
},
{
"name": "detection_Resnet50_Final.pth",
"type": "facexlib",
"base": "facexlib",
"save_path": "facerestore_models",
"description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
"reference": "https://github.com/xinntao/facexlib",
"filename": "detection_Resnet50_Final.pth",
"url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth"
},
{
"name": "detection_mobilenet0.25_Final.pth",
"type": "facexlib",
"base": "facexlib",
"save_path": "facerestore_models",
"description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
"reference": "https://github.com/xinntao/facexlib",
"filename": "detection_mobilenet0.25_Final.pth",
"url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_mobilenet0.25_Final.pth"
},
{
"name": "yolov5l-face.pth",
"type": "facexlib",
"base": "facexlib",
"save_path": "facedetection",
"description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
"reference": "https://github.com/xinntao/facexlib",
"filename": "yolov5l-face.pth",
"url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/yolov5l-face.pth"
},
{
"name": "yolov5n-face.pth",
"type": "facexlib",
"base": "facexlib",
"save_path": "facedetection",
"description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.",
"reference": "https://github.com/xinntao/facexlib",
"filename": "yolov5n-face.pth",
"url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/yolov5n-face.pth"
},
{
"name": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1 (UNET/fp16)",
"type": "unet",
"base": "SDXL",
"save_path": "unet/xl-inpaint-0.1",
"description": "[5.14GB] Stable Diffusion XL inpainting model 0.1. You need UNETLoader instead of CheckpointLoader.",
"reference": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
"filename": "diffusion_pytorch_model.fp16.safetensors",
"url": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1/resolve/main/unet/diffusion_pytorch_model.fp16.safetensors"
},
{
"name": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1 (UNET)",
"type": "unet",
"base": "SDXL",
"save_path": "unet/xl-inpaint-0.1",
"description": "[10.3GB] Stable Diffusion XL inpainting model 0.1. You need UNETLoader instead of CheckpointLoader.",
"reference": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1/resolve/main/unet/diffusion_pytorch_model.safetensors"
},
{
"name": "Inswapper (face swap)",
"type": "insightface",
"base" : "inswapper",
"save_path": "insightface",
"description": "Checkpoint of the insightface swapper model (used by Comfy-Roop and comfy_mtb)",
"reference": "https://huggingface.co/deepinsight/inswapper/",
"filename": "inswapper_128.onnx",
"url": "https://huggingface.co/deepinsight/inswapper/resolve/main/inswapper_128.onnx"
},
{
"name": "CLIPVision model (stabilityai/clip_vision_g)",
"type": "clip_vision",
"base": "vit-g",
"save_path": "clip_vision",
"description": "[3.69GB] clip_g vision model",
"reference": "https://huggingface.co/stabilityai/control-lora",
"filename": "clip_vision_g.safetensors",
"url": "https://huggingface.co/stabilityai/control-lora/resolve/main/revision/clip_vision_g.safetensors"
},
{
"name": "CLIPVision model (IP-Adapter) CLIP-ViT-H-14-laion2B-s32B-b79K",
"type": "clip_vision",
"base": "ViT-H",
"save_path": "clip_vision",
"description": "[2.5GB] CLIPVision model (needed for IP-Adapter)",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/image_encoder/model.safetensors"
},
{
"name": "CLIPVision model (IP-Adapter) CLIP-ViT-bigG-14-laion2B-39B-b160k",
"type": "clip_vision",
"base": "ViT-G",
"save_path": "clip_vision",
"description": "[3.69GB] CLIPVision model (needed for IP-Adapter)",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "CLIP-ViT-bigG-14-laion2B-39B-b160k.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/image_encoder/model.safetensors"
} }
] ]
} }
@@ -99,6 +99,26 @@
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes:Load Image Dedup" "description": "Nodes:Load Image Dedup"
},
{
"author": "IvanRybakov",
"title": "comfyui-node-int-to-string-convertor",
"reference": "https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor",
"files": [
"https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor"
],
"install_type": "git-clone",
"description": "Nodes:Int To String Convertor"
},
{
"author": "yowipr",
"title": "ComfyUI-Manual",
"reference": "https://github.com/yowipr/ComfyUI-Manual",
"files": [
"https://github.com/yowipr/ComfyUI-Manual"
],
"install_type": "git-clone",
"description": "Nodes:M_Layer, M_Output"
} }
] ]
} }
@@ -3,6 +3,8 @@ import torch
import comfy.utils import comfy.utils
from .utils import BIGMIN, BIGMAX
class MergeStrategies: class MergeStrategies:
MATCH_A = "match A" MATCH_A = "match A"
@@ -36,7 +38,7 @@ class SplitLatents:
return { return {
"required": { "required": {
"latents": ("LATENT",), "latents": ("LATENT",),
"split_index": ("INT", {"default": 0, "step": 1, "min": -99999999999}), "split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
}, },
} }
@@ -61,7 +63,7 @@ class SplitImages:
return { return {
"required": { "required": {
"images": ("IMAGE",), "images": ("IMAGE",),
"split_index": ("INT", {"default": 0, "step": 1, "min": -99999999999}), "split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
}, },
} }
@@ -83,7 +85,7 @@ class SplitMasks:
return { return {
"required": { "required": {
"mask": ("MASK",), "mask": ("MASK",),
"split_index": ("INT", {"default": 0, "step": 1, "min": -99999999999}), "split_index": ("INT", {"default": 0, "step": 1, "min": BIGMIN, "max": BIGMAX}),
}, },
} }
@@ -258,7 +260,7 @@ class SelectEveryNthLatent:
return { return {
"required": { "required": {
"latents": ("LATENT",), "latents": ("LATENT",),
"select_every_nth": ("INT", {"default": 1, "min": 1, "step": 1}), "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
}, },
} }
@@ -279,7 +281,7 @@ class SelectEveryNthImage:
return { return {
"required": { "required": {
"images": ("IMAGE",), "images": ("IMAGE",),
"select_every_nth": ("INT", {"default": 1, "min": 1, "step": 1}), "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
}, },
} }
@@ -300,7 +302,7 @@ class SelectEveryNthMask:
return { return {
"required": { "required": {
"mask": ("MASK",), "mask": ("MASK",),
"select_every_nth": ("INT", {"default": 1, "min": 1, "step": 1}), "select_every_nth": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1}),
}, },
} }
@@ -378,7 +380,7 @@ class DuplicateLatents:
return { return {
"required": { "required": {
"latents": ("LATENT",), "latents": ("LATENT",),
"multiply_by": ("INT", {"default": 1, "min": 1, "step": 1}) "multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
} }
} }
@@ -403,7 +405,7 @@ class DuplicateImages:
return { return {
"required": { "required": {
"images": ("IMAGE",), "images": ("IMAGE",),
"multiply_by": ("INT", {"default": 1, "min": 1, "step": 1}) "multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
} }
} }
@@ -427,7 +429,7 @@ class DuplicateMasks:
return { return {
"required": { "required": {
"mask": ("MASK",), "mask": ("MASK",),
"multiply_by": ("INT", {"default": 1, "min": 1, "step": 1}) "multiply_by": ("INT", {"default": 1, "min": 1, "max": BIGMAX, "step": 1})
} }
} }

Some files were not shown because too many files have changed in this diff Show More