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__/
*.py[cod]
/output/
/input/
!/input/example.png
/models/
/temp/
/custom_nodes/
!custom_nodes/example_node.py.example
extra_model_paths.yaml
/.vs
.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
- 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
- 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)
+1 -1
View File
@@ -97,7 +97,7 @@ class CLIPTextModel_(torch.nn.Module):
x = self.embeddings(input_tokens)
mask = 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"))
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]:
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)
if y is not None:
y = y.to(dtype)
@@ -318,9 +318,10 @@ def load_controlnet(ckpt_path, model=None):
return ControlLora(controlnet_data)
controlnet_config = None
supported_inference_dtypes = None
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, unet_dtype)
controlnet_config = comfy.model_detection.unet_config_from_diffusers_unet(controlnet_data)
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.bias"] = "middle_block_out.0.bias"
@@ -380,12 +381,20 @@ def load_controlnet(ckpt_path, model=None):
return net
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
model_config = comfy.model_detection.model_config_from_unet(controlnet_data, prefix, True)
supported_inference_dtypes = model_config.supported_inference_dtypes
controlnet_config = model_config.unet_config
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)
if manual_cast_dtype is not None:
controlnet_config["operations"] = comfy.ops.manual_cast
controlnet_config["dtype"] = unet_dtype
controlnet_config.pop("out_channels")
controlnet_config["hint_channels"] = controlnet_data["{}input_hint_block.0.weight".format(prefix)].shape[1]
control_model = comfy.cldm.cldm.ControlNet(**controlnet_config)
+27 -25
View File
@@ -2,7 +2,8 @@ import torch
from torch import nn
from .ldm.modules.attention import CrossAttention
from inspect import isfunction
import comfy.ops
ops = comfy.ops.manual_cast
def exists(val):
return val is not None
@@ -22,7 +23,7 @@ def default(val, d):
class GEGLU(nn.Module):
def __init__(self, dim_in, dim_out):
super().__init__()
self.proj = nn.Linear(dim_in, dim_out * 2)
self.proj = ops.Linear(dim_in, dim_out * 2)
def forward(self, x):
x, gate = self.proj(x).chunk(2, dim=-1)
@@ -35,14 +36,14 @@ class FeedForward(nn.Module):
inner_dim = int(dim * mult)
dim_out = default(dim_out, dim)
project_in = nn.Sequential(
nn.Linear(dim, inner_dim),
ops.Linear(dim, inner_dim),
nn.GELU()
) if not glu else GEGLU(dim, inner_dim)
self.net = nn.Sequential(
project_in,
nn.Dropout(dropout),
nn.Linear(inner_dim, dim_out)
ops.Linear(inner_dim, dim_out)
)
def forward(self, x):
@@ -57,11 +58,12 @@ class GatedCrossAttentionDense(nn.Module):
query_dim=query_dim,
context_dim=context_dim,
heads=n_heads,
dim_head=d_head)
dim_head=d_head,
operations=ops)
self.ff = FeedForward(query_dim, glu=True)
self.norm1 = nn.LayerNorm(query_dim)
self.norm2 = nn.LayerNorm(query_dim)
self.norm1 = ops.LayerNorm(query_dim)
self.norm2 = ops.LayerNorm(query_dim)
self.register_parameter('alpha_attn', 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
# feature
self.linear = nn.Linear(context_dim, query_dim)
self.linear = ops.Linear(context_dim, query_dim)
self.attn = CrossAttention(
query_dim=query_dim,
context_dim=query_dim,
heads=n_heads,
dim_head=d_head)
dim_head=d_head,
operations=ops)
self.ff = FeedForward(query_dim, glu=True)
self.norm1 = nn.LayerNorm(query_dim)
self.norm2 = nn.LayerNorm(query_dim)
self.norm1 = ops.LayerNorm(query_dim)
self.norm2 = ops.LayerNorm(query_dim)
self.register_parameter('alpha_attn', 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
# feature
self.linear = nn.Linear(context_dim, query_dim)
self.linear = ops.Linear(context_dim, query_dim)
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.norm1 = nn.LayerNorm(query_dim)
self.norm2 = nn.LayerNorm(query_dim)
self.norm1 = ops.LayerNorm(query_dim)
self.norm2 = ops.LayerNorm(query_dim)
self.register_parameter('alpha_attn', 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.linears = nn.Sequential(
nn.Linear(self.in_dim + self.position_dim, 512),
ops.Linear(self.in_dim + self.position_dim, 512),
nn.SiLU(),
nn.Linear(512, 512),
ops.Linear(512, 512),
nn.SiLU(),
nn.Linear(512, out_dim),
ops.Linear(512, out_dim),
)
self.null_positive_feature = torch.nn.Parameter(
@@ -215,16 +218,15 @@ class PositionNet(nn.Module):
def forward(self, boxes, masks, positive_embeddings):
B, N, _ = boxes.shape
dtype = self.linears[0].weight.dtype
masks = masks.unsqueeze(-1).to(dtype)
positive_embeddings = positive_embeddings.to(dtype)
masks = masks.unsqueeze(-1)
positive_embeddings = positive_embeddings
# 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
positive_null = self.null_positive_feature.view(1, 1, -1)
xyxy_null = self.null_position_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.to(device=boxes.device, dtype=boxes.dtype).view(1, 1, -1)
# replace padding with learnable null embedding
positive_embeddings = positive_embeddings * \
@@ -251,7 +253,7 @@ class Gligen(nn.Module):
def func(x, extra_options):
key = extra_options["transformer_index"]
module = self.module_list[key]
return module(x, objs)
return module(x, objs.to(device=x.device, dtype=x.dtype))
return func
def set_position(self, latent_image_shape, position_params, device):
@@ -37,3 +37,11 @@ class SDXL(LatentFormat):
class SD_X4(LatentFormat):
def __init__(self):
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)
sim.masked_fill_(~mask, max_neg_value)
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
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:
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(
query,
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}). '
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)
first_op_done = 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 = alphas / alphas[0]
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
# 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
else:
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):
+62 -3
View File
@@ -1,5 +1,7 @@
import torch
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.diffusionmodules.upscaling import ImageConcatWithNoiseAugmentation
import comfy.model_management
@@ -12,9 +14,10 @@ class ModelType(Enum):
EPS = 1
V_PREDICTION = 2
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):
@@ -27,6 +30,9 @@ def model_sampling(model_config, model_type):
elif model_type == ModelType.V_PREDICTION_EDM:
c = V_PREDICTION
s = ModelSamplingContinuousEDM
elif model_type == ModelType.STABLE_CASCADE:
c = EPS
s = StableCascadeSampling
class ModelSampling(s, c):
pass
@@ -35,7 +41,7 @@ def model_sampling(model_config, model_type):
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__()
unet_config = model_config.unet_config
@@ -48,7 +54,7 @@ class BaseModel(torch.nn.Module):
operations = comfy.ops.manual_cast
else:
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_sampling = model_sampling(model_config, model_type)
@@ -153,6 +159,10 @@ class BaseModel(torch.nn.Module):
if cross_attn is not None:
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
def load_model_weights(self, sd, unet_prefix=""):
@@ -423,3 +433,52 @@ class SD_X4Upscaler(BaseModel):
out['c_concat'] = comfy.conds.CONDNoiseShape(image)
out['y'] = comfy.conds.CONDRegular(noise_level)
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 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())
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 = {
"use_checkpoint": False,
"image_size": 32,
@@ -45,7 +74,6 @@ def detect_unet_config(state_dict, key_prefix, dtype):
else:
unet_config["adm_in_channels"] = None
unet_config["dtype"] = dtype
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]
@@ -159,8 +187,8 @@ def model_config_from_unet_config(unet_config):
print("no match", unet_config)
return None
def model_config_from_unet(state_dict, unet_key_prefix, dtype, use_base_if_no_match=False):
unet_config = detect_unet_config(state_dict, unet_key_prefix, dtype)
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)
model_config = model_config_from_unet_config(unet_config)
if model_config is None and use_base_if_no_match:
return comfy.supported_models_base.BASE(unet_config)
@@ -206,7 +234,7 @@ def convert_config(unet_config):
return new_config
def unet_config_from_diffusers_unet(state_dict, dtype):
def unet_config_from_diffusers_unet(state_dict, dtype=None):
match = {}
transformer_depth = []
@@ -313,8 +341,8 @@ def unet_config_from_diffusers_unet(state_dict, dtype):
return convert_config(unet_config)
return None
def model_config_from_diffusers_unet(state_dict, dtype):
unet_config = unet_config_from_diffusers_unet(state_dict, dtype)
def model_config_from_diffusers_unet(state_dict):
unet_config = unet_config_from_diffusers_unet(state_dict)
if unet_config is not None:
return model_config_from_unet_config(unet_config)
return None
@@ -487,7 +487,7 @@ def unet_inital_load_device(parameters, dtype):
else:
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:
return torch.bfloat16
if args.fp16_unet:
@@ -496,21 +496,32 @@ def unet_dtype(device=None, model_params=0):
return torch.float8_e4m3fn
if args.fp8_e5m2_unet:
return torch.float8_e5m2
if should_use_fp16(device=device, model_params=model_params):
return torch.float16
if should_use_fp16(device=device, model_params=model_params, manual_cast=True):
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
# 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:
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:
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
elif bf16_supported and torch.bfloat16 in supported_dtypes:
return torch.bfloat16
else:
return torch.float32
@@ -546,10 +557,8 @@ def text_encoder_dtype(device=None):
if is_device_cpu(device):
return torch.float16
if should_use_fp16(device, prioritize_performance=False):
return torch.float16
else:
return torch.float32
return torch.float16
def intermediate_device():
if args.gpu_only:
@@ -686,19 +695,22 @@ def mps_mode():
global cpu_state
return cpu_state == CPUState.MPS
def is_device_cpu(device):
def is_device_type(device, type):
if hasattr(device, 'type'):
if (device.type == 'cpu'):
if (device.type == type):
return True
return False
def is_device_cpu(device):
return is_device_type(device, 'cpu')
def is_device_mps(device):
if hasattr(device, 'type'):
if (device.type == 'mps'):
return True
return False
return is_device_type(device, 'mps')
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
if device is not None:
@@ -708,9 +720,9 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
if FORCE_FP16:
return True
if device is not None: #TODO
if device is not None:
if is_device_mps(device):
return False
return True
if FORCE_FP32:
return False
@@ -718,16 +730,22 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
if directml_enabled:
return False
if cpu_mode() or mps_mode():
return False #TODO ?
if mps_mode():
return True
if cpu_mode():
return False
if is_intel_xpu():
return True
if torch.cuda.is_bf16_supported():
if torch.version.hip:
return True
props = torch.cuda.get_device_properties("cuda")
if props.major >= 8:
return True
if props.major < 6:
return False
@@ -740,7 +758,7 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=True):
if x in props.name.lower():
fp16_works = True
if fp16_works:
if fp16_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
@@ -756,6 +774,43 @@ def should_use_fp16(device=None, model_params=0, prioritize_performance=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):
global cpu_state
if cpu_state == CPUState.MPS:
@@ -1,5 +1,4 @@
import torch
import numpy as np
from comfy.ldm.modules.diffusionmodules.util import make_beta_schedule
import math
@@ -42,8 +41,7 @@ class ModelSamplingDiscrete(torch.nn.Module):
else:
betas = make_beta_schedule(beta_schedule, timesteps, linear_start=linear_start, linear_end=linear_end, cosine_s=cosine_s)
alphas = 1. - betas
alphas_cumprod = torch.tensor(np.cumprod(alphas, axis=0), dtype=torch.float32)
# alphas_cumprod_prev = np.append(1., alphas_cumprod[:-1])
alphas_cumprod = torch.cumprod(alphas, dim=0)
timesteps, = betas.shape
self.num_timesteps = int(timesteps)
@@ -58,8 +56,8 @@ class ModelSamplingDiscrete(torch.nn.Module):
self.set_sigmas(sigmas)
def set_sigmas(self, sigmas):
self.register_buffer('sigmas', sigmas)
self.register_buffer('log_sigmas', sigmas.log())
self.register_buffer('sigmas', sigmas.float())
self.register_buffer('log_sigmas', sigmas.log().float())
@property
def sigma_min(self):
@@ -134,3 +132,56 @@ class ModelSamplingContinuousEDM(torch.nn.Module):
log_sigma_min = math.log(self.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 comfy.model_management
@@ -78,7 +96,11 @@ class disable_weight_init:
return None
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)
def forward(self, *args, **kwargs):
@@ -87,6 +109,28 @@ class disable_weight_init:
else:
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
def conv_nd(s, dims, *args, **kwargs):
if dims == 2:
@@ -112,3 +156,6 @@ class manual_cast(disable_weight_init):
class LayerNorm(disable_weight_init.LayerNorm):
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):
s = model.model_sampling
sigs = []
ss = len(s.sigmas) // steps
ss = max(len(s.sigmas) // steps, 1)
x = 1
while x < len(s.sigmas):
sigs += [float(s.sigmas[x])]
@@ -652,6 +652,7 @@ def sampler_object(name):
class KSampler:
SCHEDULERS = SCHEDULER_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={}):
self.model = model
@@ -670,7 +671,7 @@ class KSampler:
sigmas = None
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
discard_penultimate_sigma = True
+94 -32
View File
@@ -1,7 +1,11 @@
import torch
from enum import Enum
from comfy import model_management
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 comfy.utils
@@ -134,8 +138,11 @@ class CLIP:
tokens = self.tokenize(text)
return self.encode_from_tokens(tokens)
def load_sd(self, sd):
return self.cond_stage_model.load_sd(sd)
def load_sd(self, sd, full_model=False):
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):
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_decode = lambda shape, dtype: (2178 * shape[2] * shape[3] * 64) * model_management.dtype_size(dtype)
self.downscale_ratio = 8
self.upscale_ratio = 8
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 "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})
elif "taesd_decoder.1.weight" in sd:
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:
#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}
@@ -175,6 +213,7 @@ class VAE:
if 'encoder.down.2.downsample.conv.weight' not in sd: #Stable diffusion x4 upscaler VAE
ddconfig['ch_mult'] = [1, 2, 4]
self.downscale_ratio = 4
self.upscale_ratio = 4
self.first_stage_model = AutoencoderKL(ddconfig=ddconfig, embed_dim=4)
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)
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):
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)
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()
output = torch.clamp((
(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.downscale_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))
/ 3.0) / 2.0, min=0.0, max=1.0)
decode_fn = lambda a: self.first_stage_model.decode(a.to(self.vae_dtype).to(self.device)).float()
output = self.process_output(
(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.upscale_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)
return output
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)
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 * 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 = 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):
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:
print("Warning: Ran out of memory when regular VAE decoding, retrying with tiled VAE decoding.")
pixel_samples = self.decode_tiled_(samples_in)
@@ -252,6 +300,7 @@ class VAE:
return output.movedim(1,-1)
def encode(self, pixel_samples):
pixel_samples = self.vae_encode_crop_pixels(pixel_samples)
pixel_samples = pixel_samples.movedim(-1,1)
try:
memory_used = self.memory_used_encode(pixel_samples.shape, self.vae_dtype)
@@ -261,7 +310,7 @@ class VAE:
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)
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()
except model_management.OOM_EXCEPTION as e:
@@ -271,6 +320,7 @@ class VAE:
return samples
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)
pixel_samples = pixel_samples.movedim(-1,1)
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)
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 = []
for p in ckpt_paths:
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 = {}
if len(clip_data) == 1:
if "text_model.encoder.layers.30.mlp.fc1.weight" in clip_data[0]:
clip_target.clip = sdxl_clip.SDXLRefinerClipModel
clip_target.tokenizer = sdxl_clip.SDXLTokenizer
if clip_type == CLIPType.STABLE_CASCADE:
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]:
clip_target.clip = sd2_clip.SD2ClipModel
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
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()
manual_cast_dtype = model_management.unet_manual_cast(unet_dtype, load_device)
class WeightsLoader(torch.nn.Module):
pass
model_config = model_detection.model_config_from_unet(sd, "model.diffusion_model.", unet_dtype)
model_config.set_manual_cast(manual_cast_dtype)
model_config = model_detection.model_config_from_unet(sd, "model.diffusion_model.")
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)
if model_config is None:
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)
if output_clip:
w = WeightsLoader()
clip_target = model_config.clip_target()
if clip_target is not None:
clip = CLIP(clip_target, embedding_directory=embedding_directory)
w.cond_stage_model = clip.cond_stage_model
sd = model_config.process_clip_state_dict(sd)
load_model_weights(w, sd)
clip_sd = model_config.process_clip_state_dict(sd)
if len(clip_sd) > 0:
clip = CLIP(clip_target, embedding_directory=embedding_directory)
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()
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)
unet_dtype = model_management.unet_dtype(model_params=parameters)
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
model_config = model_detection.model_config_from_unet(sd, "", unet_dtype)
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, "")
if model_config is None:
return None
new_sd = sd
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:
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)
else:
print(diffusers_keys[k], k)
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.to(offload_device)
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,
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__()
assert layer in self.LAYERS
@@ -88,7 +88,7 @@ class SDClipModel(torch.nn.Module, ClipTokenWeightEncoder):
self.special_tokens = special_tokens
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.enable_attention_masks = False
self.enable_attention_masks = enable_attention_masks
self.layer_norm_hidden_state = layer_norm_hidden_state
if layer == "hidden":
@@ -64,3 +64,25 @@ class SDXLClipModel(torch.nn.Module):
class SDXLRefinerClipModel(sd1_clip.SD1ClipModel):
def __init__(self, device="cpu", dtype=None):
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()
replace_prefix = {}
replace_prefix["cond_stage_model."] = "cond_stage_model.clip_l."
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix)
replace_prefix["cond_stage_model."] = "clip_l."
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
return 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):
replace_prefix = {}
replace_prefix["conditioner.embedders.0.model."] = "cond_stage_model.model." #SD2 in sgm format
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix)
state_dict = utils.transformers_convert(state_dict, "cond_stage_model.model.", "cond_stage_model.clip_h.transformer.text_model.", 24)
replace_prefix["conditioner.embedders.0.model."] = "clip_h." #SD2 in sgm format
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, "clip_h.", "clip_h.transformer.text_model.", 24)
return 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):
keys_to_replace = {}
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)
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.transformers_convert(state_dict, "clip_g.", "clip_g.transformer.text_model.", 32)
state_dict = utils.state_dict_key_replace(state_dict, keys_to_replace)
return state_dict
@@ -179,13 +178,13 @@ class SDXL(supported_models_base.BASE):
keys_to_replace = {}
replace_prefix = {}
replace_prefix["conditioner.embedders.0.transformer.text_model"] = "cond_stage_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)
keys_to_replace["conditioner.embedders.1.model.text_projection"] = "cond_stage_model.clip_g.text_projection"
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"
replace_prefix["conditioner.embedders.0.transformer.text_model"] = "clip_l.transformer.text_model"
replace_prefix["conditioner.embedders.1.model."] = "clip_g."
state_dict = utils.state_dict_prefix_replace(state_dict, replace_prefix, filter_keys=True)
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)
return state_dict
@@ -306,5 +305,66 @@ class SD_X4Upscaler(SD20):
out = model_base.SD_X4Upscaler(self, device=device)
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]
@@ -22,13 +22,15 @@ class BASE:
sampling_settings = {}
latent_format = latent_formats.LatentFormat
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
@classmethod
def matches(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 True
@@ -54,6 +56,7 @@ class BASE:
return out
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
def process_unet_state_dict(self, state_dict):
@@ -63,7 +66,7 @@ class BASE:
return 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)
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)
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)
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
+4
View File
@@ -169,6 +169,8 @@ UNET_MAP_BASIC = {
}
def unet_to_diffusers(unet_config):
if "num_res_blocks" not in unet_config:
return {}
num_res_blocks = unet_config["num_res_blocks"]
channel_mult = unet_config["channel_mult"]
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)
for y in range(0, s.shape[2], tile_y - 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]
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))
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:
def __init__(self):
self.output_dir = folder_paths.get_output_directory()
@@ -170,6 +189,7 @@ class SaveAnimatedPNG:
NODE_CLASS_MAPPINGS = {
"ImageCrop": ImageCrop,
"RepeatImageBatch": RepeatImageBatch,
"ImageFromBatch": ImageFromBatch,
"SaveAnimatedWEBP": SaveAnimatedWEBP,
"SaveAnimatedPNG": SaveAnimatedPNG,
}
@@ -126,7 +126,7 @@ class LatentBatchSeedBehavior:
@classmethod
def INPUT_TYPES(s):
return {"required": { "samples": ("LATENT",),
"seed_behavior": (["random", "fixed"],),}}
"seed_behavior": (["random", "fixed"],{"default": "fixed"}),}}
RETURN_TYPES = ("LATENT",)
FUNCTION = "op"
@@ -99,6 +99,32 @@ class ModelSamplingDiscrete:
m.add_object_patch("model_sampling", model_sampling)
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:
@classmethod
def INPUT_TYPES(s):
@@ -171,5 +197,6 @@ class RescaleCFG:
NODE_CLASS_MAPPINGS = {
"ModelSamplingDiscrete": ModelSamplingDiscrete,
"ModelSamplingContinuousEDM": ModelSamplingContinuousEDM,
"ModelSamplingStableCascade": ModelSamplingStableCascade,
"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
[2024-02-03 21:05] ** 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-03 21:05] ** Python executable: /home/bt/dev/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-03 21:05]
** ComfyUI startup time: 2024-02-20 07:57:36.757969
[2024-02-20 07:57] ** Platform: Linux
[2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
[2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
[2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
[2024-02-20 07:57]
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-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:05]
[2024-02-03 21:05] ****** 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-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-03 21:05] Efficiency Nodes Warning: Failed to import python package 'simpleeval'; related nodes disabled.
[2024-02-03 21:05]
[2024-02-03 21:05] ### Loading: ComfyUI-Impact-Pack (V4.73.3)
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Check dependencies
[2024-02-03 21:05] ### 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-03 21:05] Collecting GitPython
[2024-02-03 21:05] Using cached GitPython-3.1.41-py3-none-any.whl (196 kB)
[2024-02-03 21:05] 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-03 21:05] 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-03 21:05] 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-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-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] 0.0 seconds: /home/salt/clone/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/ComfyUI-Manager
[2024-02-20 07:57]
[2024-02-20 07:57] ****** User settings have been changed to be stored on the server instead of browser storage. ******
[2024-02-20 07:57] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******
[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-20 07:57] Efficiency Nodes Warning: Failed to import python package 'simpleeval'; related nodes disabled.
[2024-02-20 07:57]
[2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (V4.78)
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check dependencies
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating subpack
[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-20 07:57] Collecting GitPython
[2024-02-20 07:57] Using cached GitPython-3.1.42-py3-none-any.whl (195 kB)
[2024-02-20 07:57] Collecting gitdb<5,>=4.0.1
[2024-02-20 07:57] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB)
[2024-02-20 07:57] Collecting smmap<6,>=3.0.1
[2024-02-20 07:57] Using cached smmap-5.0.1-py3-none-any.whl (24 kB)
[2024-02-20 07:57] Installing collected packages: smmap, gitdb, GitPython
[2024-02-20 07:57] Successfully installed GitPython-3.1.42 gitdb-4.0.11 smmap-5.0.1
[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-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-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] [2024-02-20 07:57] 100%|██████████| 51996128/51996128 [00:00<00:00, 95807035.85it/s]
[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-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] [2024-02-20 07:57] 100%|██████████| 22484536/22484536 [00:00<00:00, 80692120.55it/s]
[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-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-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-03 21:05] Collecting ultralytics!=8.0.177
[2024-02-03 21:05] Using cached ultralytics-8.1.9-py3-none-any.whl (709 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-03 21:05] Collecting seaborn>=0.11.0
[2024-02-03 21:05] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
[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-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-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-03 21:05] Collecting pandas>=1.1.4
[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-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-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-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-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-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-03 21:05] Collecting py-cpuinfo
[2024-02-03 21:05] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
[2024-02-03 21:05] Collecting thop>=0.1.1
[2024-02-03 21:05] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
[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-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-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-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-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-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-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-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-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-03 21:05] Collecting pytz>=2020.1
[2024-02-03 21:05] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
[2024-02-03 21:05] Collecting tzdata>=2022.7
[2024-02-03 21:05] Using cached tzdata-2023.4-py2.py3-none-any.whl (346 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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-03 21:05] 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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-03 21:05] req_path: /home/bt/dev/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-03 21:05] Collecting segment-anything
[2024-02-03 21:05] Using cached segment_anything-1.0-py3-none-any.whl (36 kB)
[2024-02-03 21:05] Collecting scikit-image
[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-03 21:06] Collecting piexif
[2024-02-03 21:06] Using cached piexif-1.1.3-py2.py3-none-any.whl (20 kB)
[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-03 21:06] Collecting opencv-python-headless
[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-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-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-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-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-03 21:06] Collecting lazy_loader>=0.3
[2024-02-03 21:06] Using cached lazy_loader-0.3-py3-none-any.whl (9.1 kB)
[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-03 21:06] Collecting tifffile>=2022.8.12
[2024-02-03 21:06] Using cached tifffile-2024.1.30-py3-none-any.whl (224 kB)
[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-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-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-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-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-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-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-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-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-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-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-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-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-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-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)
[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-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-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-03 21:06] Installing collected packages: segment-anything, tifffile, piexif, opencv-python-headless, lazy_loader, scikit-image
[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-03 21:06] ### ComfyUI-Impact-Pack: Check basic models
[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
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 111849469.49it/s]
[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-03 21:06] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
[2024-02-03 21:06] [Impact Pack] Wildcards loading done.
[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-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-03 21:06] WAS Node Suite: OpenCV Python FFMPEG support is enabled
[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-03 21:06] WAS Node Suite: Finished. Loaded 211 nodes successfully.
[2024-02-03 21:06]
"Opportunities don't happen. You create them." - Chris Grosser
[2024-02-03 21:06]
[2024-02-03 21:06] [VideoHelperSuite] - WARNING - Failed to import imageio_ffmpeg
[2024-02-03 21:06] FizzleDorf Custom Nodes: Loaded
[2024-02-03 21:06]
[2024-02-03 21:06] [rgthree] Loaded 33 epic nodes.
[2024-02-03 21:06] [rgthree] Will use rgthree's optimized recursive execution.
[2024-02-03 21:06]
[2024-02-03 21:06] Collecting requirements-parser
[2024-02-03 21:06] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
[2024-02-03 21:06] Collecting types-setuptools>=57.0.0
[2024-02-03 21:06] Using cached types_setuptools-69.0.0.20240125-py3-none-any.whl (51 kB)
[2024-02-03 21:06] Installing collected packages: types-setuptools, requirements-parser
[2024-02-03 21:06] Successfully installed requirements-parser-0.5.0 types-setuptools-69.0.0.20240125
[2024-02-03 21:06]
[2024-02-03 21:06] Command executed successfully!
[2024-02-03 21:06] [comfy_mtb] | INFO -> loaded 53 nodes successfuly
[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]
[2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 54791722/54791722 [00:00<00:00, 96343854.43it/s]
[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-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-20 07:57] Collecting ultralytics!=8.0.177
[2024-02-20 07:57] Using cached ultralytics-8.1.16-py3-none-any.whl (715 kB)
[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-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-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-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-20 07:57] Collecting seaborn>=0.11.0
[2024-02-20 07:57] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
[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-20 07:57] Collecting py-cpuinfo
[2024-02-20 07:57] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
[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-20 07:57] Collecting thop>=0.1.1
[2024-02-20 07:57] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
[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-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-20 07:57] Collecting pandas>=1.1.4
[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-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-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-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-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-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-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-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-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-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-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-20 07:57] Collecting tzdata>=2022.7
[2024-02-20 07:57] Using cached tzdata-2024.1-py2.py3-none-any.whl (345 kB)
[2024-02-20 07:57] Collecting pytz>=2020.1
[2024-02-20 07:57] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
[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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-20 07:57] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics
[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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt
[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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-20 07:57] ### ComfyUI-Impact-Pack: Check basic models
[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
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 98225271.16it/s]
[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-20 07:57] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
[2024-02-20 07:57] [Impact Pack] Wildcards loading done.
[2024-02-20 07:57]
[2024-02-20 07:57] [rgthree] Loaded 34 magnificent nodes.
[2024-02-20 07:57] [rgthree] Will use rgthree's optimized recursive execution.
[2024-02-20 07:57]
[2024-02-20 07:57] ### Loading: ComfyUI-Manager (V2.7.2)
[2024-02-20 07:57] ### ComfyUI Revision: 2005 [0d0fbabd] | Released on '2024-02-20'
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.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-20 07:58] [VideoHelperSuite] - WARNING - Failed to import imageio_ffmpeg
[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-20 07:58] FizzleDorf Custom Nodes: Loaded
[2024-02-20 07:58] Collecting requirements-parser
[2024-02-20 07:58] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
[2024-02-20 07:58] Collecting types-setuptools>=57.0.0
[2024-02-20 07:58] Using cached types_setuptools-69.1.0.20240217-py3-none-any.whl (51 kB)
[2024-02-20 07:58] Installing collected packages: types-setuptools, requirements-parser
[2024-02-20 07:58] Successfully installed requirements-parser-0.5.0 types-setuptools-69.1.0.20240217
[2024-02-20 07:58]
[2024-02-20 07:58] Command executed successfully!
[2024-02-20 07:58] [comfy_mtb] | INFO -> loaded 55 nodes successfuly
[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-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-20 07:58] WAS Node Suite: OpenCV Python FFMPEG support is enabled
[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-20 07:58] WAS Node Suite: Finished. Loaded 211 nodes successfully.
[2024-02-20 07:58]
"Creativity takes courage." - Henri Matisse
[2024-02-20 07:58]
[2024-02-20 07:58]
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-03 21:06] 0.0 seconds: /home/bt/dev/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/comfy-image-saver
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/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/ComfyUI-Custom-Scripts
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/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-03 21:06] 0.0 seconds: /home/bt/dev/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-VideoHelperSuite
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/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-Frame-Interpolation
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/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_controlnet_aux
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:06] 0.1 seconds: /home/bt/dev/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-03 21:06] 1.3 seconds: /home/bt/dev/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-03 21:06] 25.8 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
[2024-02-03 21:06]
[2024-02-03 21:06] Starting server
[2024-02-03 21:06]
[2024-02-03 21:06] 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/model-list.json
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
[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
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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-Logic
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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/comfy-image-saver
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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/Derfuu_ComfyUI_ModdedNodes
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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-VideoHelperSuite
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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_FizzNodes
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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-Frame-Interpolation
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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-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-20 07:58] 0.1 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes
[2024-02-20 07:58] 0.4 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-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-20 07:58] 0.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_segment_anything
[2024-02-20 07:58] 0.9 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb
[2024-02-20 07:58] 12.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rembg-comfyui-node
[2024-02-20 07:58] 14.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
[2024-02-20 07:58]
[2024-02-20 07:58] Starting server
[2024-02-20 07:58]
[2024-02-20 07:58] To see the GUI go to: http://127.0.0.1:8188
+253 -261
View File
@@ -1,267 +1,259 @@
** ComfyUI startup time: 2024-02-03 21:05:40.484447
[2024-02-03 21:05] ** 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-03 21:05] ** Python executable: /home/bt/dev/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-03 21:05]
** ComfyUI startup time: 2024-02-20 07:57:36.757364
[2024-02-20 07:57] ** Platform: Linux
[2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
[2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
[2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
[2024-02-20 07:57]
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-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:05]
[2024-02-03 21:05] ** ComfyUI startup time: 2024-02-03 21:05:40.485965
[2024-02-03 21:05] ** 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-03 21:05] ** Python executable: /home/bt/dev/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-03 21:05]
[2024-02-20 07:57] 0.0 seconds: /home/salt/clone/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/ComfyUI-Manager
[2024-02-20 07:57]
[2024-02-20 07:57] ** ComfyUI startup time: 2024-02-20 07:57:36.757969
[2024-02-20 07:57] ** Platform: Linux
[2024-02-20 07:57] ** Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
[2024-02-20 07:57] ** Python executable: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/venv/bin/python3
[2024-02-20 07:57] ** Log path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/comfyui.log
[2024-02-20 07:57]
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-03 21:05] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:05]
[2024-02-03 21:05] ****** 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-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-03 21:05] Efficiency Nodes Warning: Failed to import python package 'simpleeval'; related nodes disabled.
[2024-02-03 21:05]
[2024-02-03 21:05] ### Loading: ComfyUI-Impact-Pack (V4.73.3)
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
[2024-02-03 21:05] ### ComfyUI-Impact-Pack: Check dependencies
[2024-02-03 21:05] ### 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-03 21:05] Collecting GitPython
[2024-02-03 21:05] Using cached GitPython-3.1.41-py3-none-any.whl (196 kB)
[2024-02-03 21:05] 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-03 21:05] 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-03 21:05] 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-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-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] 0.0 seconds: /home/salt/clone/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/ComfyUI-Manager
[2024-02-20 07:57]
[2024-02-20 07:57] ****** User settings have been changed to be stored on the server instead of browser storage. ******
[2024-02-20 07:57] ****** For multi-user setups add the --multi-user CLI argument to enable multiple user profiles. ******
[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-20 07:57] Efficiency Nodes Warning: Failed to import python package 'simpleeval'; related nodes disabled.
[2024-02-20 07:57]
[2024-02-20 07:57] ### Loading: ComfyUI-Impact-Pack (V4.78)
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating dependencies [0 -> 20]
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Check dependencies
[2024-02-20 07:57] ### ComfyUI-Impact-Pack: Updating subpack
[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-20 07:57] Collecting GitPython
[2024-02-20 07:57] Using cached GitPython-3.1.42-py3-none-any.whl (195 kB)
[2024-02-20 07:57] Collecting gitdb<5,>=4.0.1
[2024-02-20 07:57] Using cached gitdb-4.0.11-py3-none-any.whl (62 kB)
[2024-02-20 07:57] Collecting smmap<6,>=3.0.1
[2024-02-20 07:57] Using cached smmap-5.0.1-py3-none-any.whl (24 kB)
[2024-02-20 07:57] Installing collected packages: smmap, gitdb, GitPython
[2024-02-20 07:57] Successfully installed GitPython-3.1.42 gitdb-4.0.11 smmap-5.0.1
[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-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-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] [2024-02-20 07:57] 100%|██████████| 51996128/51996128 [00:00<00:00, 95807035.85it/s]
[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-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] [2024-02-20 07:57] 100%|██████████| 22484536/22484536 [00:00<00:00, 80692120.55it/s]
[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-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-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-03 21:05] Collecting ultralytics!=8.0.177
[2024-02-03 21:05] Using cached ultralytics-8.1.9-py3-none-any.whl (709 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-03 21:05] Collecting seaborn>=0.11.0
[2024-02-03 21:05] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
[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-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-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-03 21:05] Collecting pandas>=1.1.4
[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-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-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-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-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-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-03 21:05] Collecting py-cpuinfo
[2024-02-03 21:05] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
[2024-02-03 21:05] Collecting thop>=0.1.1
[2024-02-03 21:05] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
[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-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-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-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-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-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-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-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-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-03 21:05] Collecting pytz>=2020.1
[2024-02-03 21:05] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
[2024-02-03 21:05] Collecting tzdata>=2022.7
[2024-02-03 21:05] Using cached tzdata-2023.4-py2.py3-none-any.whl (346 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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-03 21:05] 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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-03 21:05] req_path: /home/bt/dev/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-03 21:05] Collecting segment-anything
[2024-02-03 21:05] Using cached segment_anything-1.0-py3-none-any.whl (36 kB)
[2024-02-03 21:05] Collecting scikit-image
[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-03 21:06] Collecting piexif
[2024-02-03 21:06] Using cached piexif-1.1.3-py2.py3-none-any.whl (20 kB)
[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-03 21:06] Collecting opencv-python-headless
[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-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-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-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-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-03 21:06] Collecting lazy_loader>=0.3
[2024-02-03 21:06] Using cached lazy_loader-0.3-py3-none-any.whl (9.1 kB)
[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-03 21:06] Collecting tifffile>=2022.8.12
[2024-02-03 21:06] Using cached tifffile-2024.1.30-py3-none-any.whl (224 kB)
[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-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-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-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-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-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-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-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-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-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-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-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-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-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-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)
[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-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-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-03 21:06] Installing collected packages: segment-anything, tifffile, piexif, opencv-python-headless, lazy_loader, scikit-image
[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-03 21:06] ### ComfyUI-Impact-Pack: Check basic models
[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
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 111849469.49it/s]
[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-03 21:06] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
[2024-02-03 21:06] [Impact Pack] Wildcards loading done.
[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-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-03 21:06] WAS Node Suite: OpenCV Python FFMPEG support is enabled
[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-03 21:06] WAS Node Suite: Finished. Loaded 211 nodes successfully.
[2024-02-03 21:06]
"Opportunities don't happen. You create them." - Chris Grosser
[2024-02-03 21:06]
[2024-02-03 21:06] [VideoHelperSuite] - WARNING - Failed to import imageio_ffmpeg
[2024-02-03 21:06] FizzleDorf Custom Nodes: Loaded
[2024-02-03 21:06]
[2024-02-03 21:06] [rgthree] Loaded 33 epic nodes.
[2024-02-03 21:06] [rgthree] Will use rgthree's optimized recursive execution.
[2024-02-03 21:06]
[2024-02-03 21:06] Collecting requirements-parser
[2024-02-03 21:06] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
[2024-02-03 21:06] Collecting types-setuptools>=57.0.0
[2024-02-03 21:06] Using cached types_setuptools-69.0.0.20240125-py3-none-any.whl (51 kB)
[2024-02-03 21:06] Installing collected packages: types-setuptools, requirements-parser
[2024-02-03 21:06] Successfully installed requirements-parser-0.5.0 types-setuptools-69.0.0.20240125
[2024-02-03 21:06]
[2024-02-03 21:06] Command executed successfully!
[2024-02-03 21:06] [comfy_mtb] | INFO -> loaded 53 nodes successfuly
[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]
[2024-02-20 07:57] [2024-02-20 07:57] 100%|██████████| 54791722/54791722 [00:00<00:00, 96343854.43it/s]
[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-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-20 07:57] Collecting ultralytics!=8.0.177
[2024-02-20 07:57] Using cached ultralytics-8.1.16-py3-none-any.whl (715 kB)
[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-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-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-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-20 07:57] Collecting seaborn>=0.11.0
[2024-02-20 07:57] Using cached seaborn-0.13.2-py3-none-any.whl (294 kB)
[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-20 07:57] Collecting py-cpuinfo
[2024-02-20 07:57] Using cached py_cpuinfo-9.0.0-py3-none-any.whl (22 kB)
[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-20 07:57] Collecting thop>=0.1.1
[2024-02-20 07:57] Using cached thop-0.1.1.post2209072238-py3-none-any.whl (15 kB)
[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-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-20 07:57] Collecting pandas>=1.1.4
[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-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-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-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-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-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-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-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-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-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-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-20 07:57] Collecting tzdata>=2022.7
[2024-02-20 07:57] Using cached tzdata-2024.1-py2.py3-none-any.whl (345 kB)
[2024-02-20 07:57] Collecting pytz>=2020.1
[2024-02-20 07:57] Using cached pytz-2024.1-py2.py3-none-any.whl (505 kB)
[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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-20 07:57] Installing collected packages: pytz, py-cpuinfo, tzdata, pandas, seaborn, thop, ultralytics
[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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-20 07:57] req_path: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack/requirements.txt
[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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-20 07:57] ### ComfyUI-Impact-Pack: Check basic models
[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
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 375042383/375042383 [00:03<00:00, 98225271.16it/s]
[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-20 07:57] ### Loading: ComfyUI-Impact-Pack (Subpack: V0.4)
[2024-02-20 07:57] [Impact Pack] Wildcards loading done.
[2024-02-20 07:57]
[2024-02-20 07:57] [rgthree] Loaded 34 magnificent nodes.
[2024-02-20 07:57] [rgthree] Will use rgthree's optimized recursive execution.
[2024-02-20 07:57]
[2024-02-20 07:57] ### Loading: ComfyUI-Manager (V2.7.2)
[2024-02-20 07:57] ### ComfyUI Revision: 2005 [0d0fbabd] | Released on '2024-02-20'
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
[2024-02-20 07:57] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.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-20 07:58] [VideoHelperSuite] - WARNING - Failed to import imageio_ffmpeg
[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-20 07:58] FizzleDorf Custom Nodes: Loaded
[2024-02-20 07:58] Collecting requirements-parser
[2024-02-20 07:58] Using cached requirements_parser-0.5.0-py3-none-any.whl (18 kB)
[2024-02-20 07:58] Collecting types-setuptools>=57.0.0
[2024-02-20 07:58] Using cached types_setuptools-69.1.0.20240217-py3-none-any.whl (51 kB)
[2024-02-20 07:58] Installing collected packages: types-setuptools, requirements-parser
[2024-02-20 07:58] Successfully installed requirements-parser-0.5.0 types-setuptools-69.1.0.20240217
[2024-02-20 07:58]
[2024-02-20 07:58] Command executed successfully!
[2024-02-20 07:58] [comfy_mtb] | INFO -> loaded 55 nodes successfuly
[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-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-20 07:58] WAS Node Suite: OpenCV Python FFMPEG support is enabled
[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-20 07:58] WAS Node Suite: Finished. Loaded 211 nodes successfully.
[2024-02-20 07:58]
"Creativity takes courage." - Henri Matisse
[2024-02-20 07:58]
[2024-02-20 07:58]
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-03 21:06] 0.0 seconds: /home/bt/dev/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/comfy-image-saver
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/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/ComfyUI-Custom-Scripts
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/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-03 21:06] 0.0 seconds: /home/bt/dev/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-VideoHelperSuite
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/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-Frame-Interpolation
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/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_controlnet_aux
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved
[2024-02-03 21:06] 0.0 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Manager
[2024-02-03 21:06] 0.1 seconds: /home/bt/dev/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-03 21:06] 1.3 seconds: /home/bt/dev/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-03 21:06] 25.8 seconds: /home/bt/dev/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
[2024-02-03 21:06]
[2024-02-03 21:06] Starting server
[2024-02-03 21:06]
[2024-02-03 21:06] 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/model-list.json
[2024-02-03 21:06] [ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
[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
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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-Logic
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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/comfy-image-saver
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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/Derfuu_ComfyUI_ModdedNodes
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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-VideoHelperSuite
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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_FizzNodes
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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-Frame-Interpolation
[2024-02-20 07:58] 0.0 seconds: /home/salt/clone/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-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-20 07:58] 0.1 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes
[2024-02-20 07:58] 0.4 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/efficiency-nodes-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-20 07:58] 0.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfyui_segment_anything
[2024-02-20 07:58] 0.9 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/comfy_mtb
[2024-02-20 07:58] 12.8 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/rembg-comfyui-node
[2024-02-20 07:58] 14.0 seconds: /home/salt/clone/storyteller/storyteller-ml/workflows/comfy/ComfyUI/custom_nodes/ComfyUI-Impact-Pack
[2024-02-20 07:58]
[2024-02-20 07:58] Starting server
[2024-02-20 07:58]
[2024-02-20 07:58] To see the GUI go to: http://127.0.0.1:8188
@@ -1,5 +1,5 @@
# 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.
@@ -12,6 +12,8 @@ ControlNet preprocessors are available through [comfyui_controlnet_aux](https://
- 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)
- 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:
- [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_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,
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
@@ -64,7 +65,7 @@ class ControlNetAdvanced(ControlNet, AdvancedControlBase):
# 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['c_crossattn']
context = cond.get('crossattn_controlnet', cond['c_crossattn'])
# uses 'y' in new ComfyUI update
y = cond.get('y', None)
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)
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):
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)
@@ -282,27 +348,19 @@ class SparseCtrlAdvanced(ControlNetAdvanced):
return c
class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase):
# This ControlNet is more of an attention patch than a traditional controlnet
def __init__(self, patch: LLLitePatch, timestep_keyframes: TimestepKeyframeGroup, device=None):
class ReferenceAdvanced(ControlBase, AdvancedControlBase):
def __init__(self, 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 = patch.clone_with_control(self)
# TODO: save attn patches here
def patch_model(self, model: ModelPatcher):
model.set_model_attn1_patch(self.patch)
model.set_model_attn2_patch(self.patch)
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
# TODO: do model patching here
pass
def pre_run_advanced(self, *args, **kwargs):
AdvancedControlBase.pre_run_advanced(self, *args, **kwargs)
self.patch.set_control(self)
#logger.warn(f"in pre_run_advanced: {id(self)}")
# TODO: set control on patches
def get_control_advanced(self, x_noisy: Tensor, t, cond, batched_number: int):
# normal ControlNet stuff
@@ -332,24 +390,121 @@ class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase):
# done preparing; model patches will take care of everything now.
# return normal controlnet stuff
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):
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):
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_advanced(c)
return c
# deepcopy needs to properly keep track of objects to work between model.clone calls!
def __deepcopy__(self, *args, **kwargs):
return self
# def __deepcopy__(self, *args, **kwargs):
# self.cleanup_advanced()
# return self
# def get_models(self):
# # get_models is called once at the start of every KSampler run - use to reset already_patched status
# out = super().get_models()
# logger.error(f"in get_models! {id(self)}")
# return out
@@ -360,8 +515,9 @@ def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, mo
controlnet_type = ControlWeightType.DEFAULT
has_controlnet_key = False
has_motion_modules_key = False
has_temporal_res_block_key = False
for key in controlnet_data:
# LLLLite check
# LLLite check
if "lllite" in key:
controlnet_type = ControlWeightType.CONTROLLLLITE
break
@@ -370,14 +526,23 @@ def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, mo
has_motion_modules_key = True
elif "controlnet" in key:
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:
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.CONTROLLLLITE:
control = load_controllllite(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe)
elif controlnet_type == ControlWeightType.SPARSECTRL:
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
else:
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")
patch = LLLitePatch(modules=modules)
control = ControlLLLiteAdvanced(patch=patch, timestep_keyframes=timestep_keyframe)
patch_attn1 = LLLitePatch(modules=modules, patch_type=LLLitePatch.ATTN1)
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
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 .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):
@@ -38,12 +38,16 @@ def extra_options_to_module_prefix(extra_options):
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.control = control
self.patch_type = patch_type
#logger.error(f"create LLLitePatch: {id(self)},{control}")
def __call__(self, q, k, v, extra_options):
#logger.error(f"in __call__: {id(self)}")
# determine if have anything to run
if self.control.timestep_range is not None:
# 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)
return self
def set_control(self, control: Union[AdvancedControlBase, ControlBase]):
def set_control(self, control: Union[AdvancedControlBase, ControlBase]) -> 'LLLitePatch':
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):
#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):
#del self.control
#self.control = None
#total_cleaned = 0
for module in self.modules.values():
module.cleanup()
# total_cleaned += 1
#logger.info(f"cleaned modules: {total_cleaned}, {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
class LLLiteModule(torch.nn.Module):
@@ -159,6 +179,7 @@ class LLLiteModule(torch.nn.Module):
self.prev_sub_idxs = None
def cleanup(self):
del self.cond_emb
self.cond_emb = None
self.cx_shape = None
self.prev_batch = 0
@@ -167,9 +188,15 @@ class LLLiteModule(torch.nn.Module):
def forward(self, x: Tensor, control: Union[AdvancedControlBase, ControlBase]):
mask = 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:
# 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
if not self.is_conv2d:
# reshape / b,c,h,w -> b,h*w,c
@@ -211,6 +238,7 @@ class LLLiteModule(torch.nn.Module):
elif mask_tk is not None:
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 = self.mid(cx)
cx = self.up(cx)
@@ -4,7 +4,7 @@ import torch
import numpy as np
from PIL import Image, ImageOps
from .utils import ControlWeights, LatentKeyframeGroup, TimestepKeyframeGroup, TimestepKeyframe
from .utils import ControlWeights, LatentKeyframeGroup, TimestepKeyframeGroup, TimestepKeyframe, BIGMAX
from .logger import logger
@@ -16,8 +16,8 @@ class LoadImagesFromDirectory:
"directory": ("STRING", {"default": ""}),
},
"optional": {
"image_load_cap": ("INT", {"default": 0, "min": 0, "step": 1}),
"start_index": ("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, "max": BIGMAX, "step": 1}),
}
}
@@ -2,7 +2,7 @@ from typing import Union
import numpy as np
from collections.abc import Iterable
from .utils import LatentKeyframe, LatentKeyframeGroup
from .utils import LatentKeyframe, LatentKeyframeGroup, BIGMIN, BIGMAX
from .utils import StrengthInterpolation as SI
from .logger import logger
@@ -12,7 +12,7 @@ class LatentKeyframeNode:
def INPUT_TYPES(s):
return {
"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}, ),
},
"optional": {
@@ -163,8 +163,8 @@ class LatentKeyframeInterpolationNode:
def INPUT_TYPES(s):
return {
"required": {
"batch_index_from": ("INT", {"default": 0, "min": -10000, "max": 10000, "step": 1}),
"batch_index_to_excl": ("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": BIGMIN, "max": BIGMAX, "step": 1}),
"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}, ),
"interpolation": ([SI.LINEAR, SI.EASE_IN, SI.EASE_OUT, SI.EASE_IN_OUT], ),
@@ -3,6 +3,7 @@ from torch import Tensor
import folder_paths
from nodes import VAEEncode
import comfy.utils
from comfy.sd import VAE
from .utils import TimestepKeyframeGroup
from .control_sparsectrl import SparseMethod, SparseIndexMethod, SparseSettings, SparseSpreadMethod, PreprocSparseRGBWrapper
@@ -148,12 +149,15 @@ class RgbSparseCtrlPreprocessor:
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
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 = image.movedim(1,-1)
# 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])
return (PreprocSparseRGBWrapper(condhint=encoded),)
@@ -1,3 +1,4 @@
from copy import deepcopy
from typing import Callable, Union
import torch
from torch import Tensor
@@ -10,6 +11,9 @@ from comfy.model_patcher import ModelPatcher
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(*args, **kwargs):
# immediately restore load_torch_file to original version
@@ -34,6 +38,7 @@ class ControlWeightType:
CONTROLNET = "controlnet"
CONTROLLORA = "controllora"
CONTROLLLLITE = "controllllite"
SVD_CONTROLNET = "svd_controlnet"
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
# 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):
"Raised when weight not compatible with AdvancedControlBase object"
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)
- 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)
- 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)
- Scale and Effect multival inputs to control motion amount and motion model influence on generation.
- 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.
- 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.
- [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.
- fp8 support; requires newest ComfyUI and torch >= 2.1 (decreases VRAM usage, but changes outputs)
- Mac M1/M2/M3 support
- Usage of Context Options and Sample Settings outside of AnimateDiff via Gen2 Use Evolved Sampling node
## Upcoming Features
- Maskable Motion LoRA
- Maskable SD LoRA (and perhaps maskable SD Models as well)
- [PIA](https://github.com/open-mmlab/PIA) support
- Motion LoRA training (experimental)
- Anything else AnimateDiff-related that comes out
@@ -10,8 +10,10 @@ from .utils_motion import get_sorted_list_via_attr
class ContextFuseMethod:
FLAT = "flat"
PYRAMID = "pyramid"
RELATIVE = "relative"
LIST = [PYRAMID, FLAT]
LIST_STATIC = [PYRAMID, RELATIVE, FLAT]
class ContextType:
@@ -331,6 +333,7 @@ def create_weights_pyramid(length: int, **kwargs) -> list[float]:
FUSE_MAPPING = {
ContextFuseMethod.FLAT: create_weights_flat,
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 .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 .utils_motion import ADKeyframe, ADKeyframeGroup, MotionCompatibilityError, get_combined_multival, normalize_min_max
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.to(model.model_dtype())
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?
# 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)
@@ -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.to(comfy.model_management.unet_dtype())
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?
# 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(),
@@ -15,7 +15,7 @@ from comfy.utils import repeat_to_batch_size
import comfy.ops
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_model import BetaSchedules, ModelTypeSD
from .logger import logger
@@ -31,6 +31,7 @@ def zero_module(module):
class AnimateDiffFormat:
ANIMATEDIFF = "AnimateDiff"
HOTSHOTXL = "HotshotXL"
ANIMATELCM = "AnimateLCM"
class AnimateDiffVersion:
@@ -58,6 +59,14 @@ def is_hotshotxl(mm_state_dict: dict[str, Tensor]) -> bool:
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:
# keep track of biggest down_block count in module
biggest_block = 0
@@ -81,11 +90,14 @@ def has_mid_block(mm_state_dict: dict[str, Tensor]):
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}]
for key in mm_state_dict.keys():
if key.endswith("pos_encoder.pe"):
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!")
@@ -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]:
# 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)
for key in list(mm_state_dict.keys()):
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
if is_hotshotxl(mm_state_dict):
mm_format = AnimateDiffFormat.HOTSHOTXL
if is_animatelcm(mm_state_dict):
mm_format = AnimateDiffFormat.ANIMATELCM
# determine the model's version
mm_version = AnimateDiffVersion.V1
if has_mid_block(mm_state_dict):
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
info = AnimateDiffInfo(sd_type=sd_type, mm_format=mm_format, mm_version=mm_version, mm_name=mm_name)
# convert to AnimateDiff format, if needed
@@ -157,7 +176,8 @@ class AnimateDiffModel(nn.Module):
self.down_blocks: Iterable[MotionModule] = nn.ModuleList([])
self.up_blocks: Iterable[MotionModule] = nn.ModuleList([])
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)
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
@@ -170,20 +190,31 @@ class AnimateDiffModel(nn.Module):
layer_channels = (320, 640, 1280, 1280)
# fill out down/up blocks and middle block, if present
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):
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):
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
def get_device_debug(self):
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:
to_return = None
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:
if self.mm_info.mm_format == AnimateDiffFormat.HOTSHOTXL:
to_return = BetaSchedules.LINEAR
@@ -352,22 +383,28 @@ class AnimateDiffModel(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__()
if block_type == BlockType.MID:
# 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:
# down blocks contain two VanillaTemporalModules
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_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, temporal_position_encoding_max_len, ops=ops)
]
)
# up blocks contain one additional VanillaTemporalModule
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):
for motion_module in self.motion_modules:
@@ -398,8 +435,8 @@ class MotionModule(nn.Module):
motion_module.reset_temp_vars()
def get_motion_module(in_channels, 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)
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=temporal_position_encoding, temporal_position_encoding_max_len=temporal_position_encoding_max_len, ops=ops)
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)
value_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
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")
for attention_block, norm in zip(self.attention_blocks, self.norms):
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))
# 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
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 = rearrange(hidden_states, "b f d c -> (b f) d c")
del value_final
del count_final
# del bias_final
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
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 .nodes_gen1 import (AnimateDiffLoaderGen1, LegacyAnimateDiffLoaderWithContext, AnimateDiffModelSettings,
AnimateDiffModelSettingsSimple, AnimateDiffModelSettingsAdvanced, AnimateDiffModelSettingsAdvancedAttnStrengths)
from .nodes_gen2 import UseEvolvedSamplingNode, ApplyAnimateDiffModelNode, ApplyAnimateDiffModelBasicNode, LoadAnimateDiffModelNode, ADKeyframeNode
from .nodes_multival import MultivalDynamicNode, MultivalFloatNode, MultivalScaledMaskNode
from .nodes_sample import FreeInitOptionsNode, NoiseLayerAddWeightedNode, SampleSettingsNode, NoiseLayerAddNode, NoiseLayerReplaceNode, IterationOptionsNode
from .nodes_multival import MultivalDynamicNode, MultivalScaledMaskNode
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,
StandardStaticViewOptionsNode, StandardUniformViewOptionsNode, ViewAsContextOptionsNode)
from .nodes_ad_settings import AnimateDiffSettingsNode, ManualAdjustPENode, SweetspotStretchPENode, FullStretchPENode
from .nodes_extras import AnimateDiffUnload, EmptyLatentImageLarge, CheckpointLoaderSimpleWithNoiseSelect
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
comfy_sample.sample = motion_sample_factory(comfy_sample.sample)
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 = {
# Unencapsulated
"ADE_AnimateDiffLoRALoader": AnimateDiffLoraLoader,
@@ -91,6 +54,14 @@ NODE_CLASS_MAPPINGS = {
"ADE_AdjustPESweetspotStretch": SweetspotStretchPENode,
"ADE_AdjustPEFullStretch": FullStretchPENode,
"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
"ADE_AnimateDiffUnload": AnimateDiffUnload,
"ADE_EmptyLatentImageLarge": EmptyLatentImageLarge,
@@ -107,6 +78,8 @@ NODE_CLASS_MAPPINGS = {
"ADE_ApplyAnimateDiffModelSimple": ApplyAnimateDiffModelBasicNode,
"ADE_ApplyAnimateDiffModel": ApplyAnimateDiffModelNode,
"ADE_LoadAnimateDiffModel": LoadAnimateDiffModelNode,
# MaskedLoraLoader
#"ADE_MaskedLoadLora": MaskedLoraLoader,
# Deprecated Nodes
"AnimateDiffLoaderV1": AnimateDiffLoader_Deprecated,
"ADE_AnimateDiffLoaderV1Advanced": AnimateDiffLoaderAdvanced_Deprecated,
@@ -143,6 +116,14 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"ADE_AdjustPESweetspotStretch": "Adjust PE [Sweetspot Stretch] 🎭🅐🅓",
"ADE_AdjustPEFullStretch": "Adjust PE [Full Stretch] 🎭🅐🅓",
"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
"ADE_AnimateDiffUnload": "AnimateDiff Unload 🎭🅐🅓",
"ADE_EmptyLatentImageLarge": "Empty Latent Image (Big Batch) 🎭🅐🅓",
@@ -159,8 +140,10 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"ADE_ApplyAnimateDiffModelSimple": "Apply AnimateDiff Model 🎭🅐🅓②",
"ADE_ApplyAnimateDiffModel": "Apply AnimateDiff Model (Adv.) 🎭🅐🅓②",
"ADE_LoadAnimateDiffModel": "Load AnimateDiff Model 🎭🅐🅓②",
# MaskedLoraLoader
#"ADE_MaskedLoadLora": "Load LoRA (Masked) 🎭🅐🅓",
# Deprecated Nodes
"AnimateDiffLoaderV1": "AnimateDiff Loader [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}),
},
"optional": {
"fuse_method": (ContextFuseMethod.LIST,),
"fuse_method": (ContextFuseMethod.LIST_STATIC,),
"use_on_equal_length": ("BOOLEAN", {"default": False},),
"start_percent": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 1.0, "step": 0.001}),
"guarantee_steps": ("INT", {"default": 1, "min": 0, "max": BIGMAX}),
@@ -12,7 +12,7 @@ from PIL.PngImagePlugin import PngInfo
import folder_paths
from comfy.model_patcher import ModelPatcher
from .context import ContextSchedules, ContextOptions
from .context import ContextOptionsGroup, ContextOptions, ContextSchedules
from .logger import logger
from .utils_model import Folders, BetaSchedules, get_available_motion_models
from .model_injection import ModelPatcherAndInjector, InjectionParams, MotionModelGroup, load_motion_module_gen1
@@ -109,16 +109,18 @@ class AnimateDiffLoaderAdvanced_Deprecated:
model_name=model_name,
apply_v2_properly=False,
)
# set context settings
params.set_context(
context_group = ContextOptionsGroup()
context_group.add(
ContextOptions(
context_length=context_length,
context_stride=context_stride,
context_overlap=context_overlap,
context_schedule=context_schedule,
closed_loop=closed_loop,
)
)
)
# set context settings
params.set_context(context_options=context_group)
# inject for use in sampling code
model = ModelPatcherAndInjector(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 .logger import logger
from .utils_model import IsChangedHelper, BetaSchedules
from .utils_model import BetaSchedules
from .model_injection import get_vanilla_model_patcher
class AnimateDiffUnload:
def __init__(self) -> None:
self.change = IsChangedHelper()
pass
@classmethod
def INPUT_TYPES(s):
@@ -81,13 +81,20 @@ class AnimateDiffLoaderGen1:
model.sample_settings = sample_settings if sample_settings is not None else SampleSettings()
model.motion_injection_params = params
# 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)
if model.sample_settings.custom_cfg is not None:
logger.info("[Sample Settings] custom_cfg is set; will override any KSampler cfg values or patches.")
if model.sample_settings.sigma_schedule is not None:
logger.info("[Sample Settings] sigma_schedule is set; will override beta_schedule.")
model.add_object_patch("model_sampling", model.sample_settings.sigma_schedule.clone().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
return (model,)
@@ -59,13 +59,20 @@ class UseEvolvedSamplingNode:
model.sample_settings = sample_settings if sample_settings is not None else SampleSettings()
model.motion_injection_params = params
# 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)
if model.sample_settings.custom_cfg is not None:
logger.info("[Sample Settings] custom_cfg is set; will override any KSampler cfg values or patches.")
if model.sample_settings.sigma_schedule is not None:
logger.info("[Sample Settings] sigma_schedule is set; will override beta_schedule.")
model.add_object_patch("model_sampling", model.sample_settings.sigma_schedule.clone().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
return (model,)
@@ -4,7 +4,7 @@ from typing import Union
import torch
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:
@@ -41,24 +41,64 @@ class MultivalDynamicNode:
if len(float_val) < mask_optional.shape[0]:
# copies last entry enough times to match mask shape
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: Tensor = torch.tensor(float_val).unsqueeze(-1).unsqueeze(-1)
# now that inputs are normalized, figure out what value to actually return
if mask_optional is not None:
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,)
else:
if not float_is_iterable:
return (float_val,)
# 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
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)
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,)
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:
@classmethod
def INPUT_TYPES(s):
@@ -94,36 +134,3 @@ class MultivalFloatNode:
def create_multival(self, float_val: Union[float, list[float]]=None):
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 .freeinit import FreeInitFilter
from .sample_settings import FreeInitOptions, IterationOptions, NoiseLayerAdd, NoiseLayerAddWeighted, NoiseLayerGroup, NoiseLayerReplace, NoiseLayerType, SeedNoiseGeneration, SampleSettings
from .utils_model import BIGMIN, BIGMAX
from .sample_settings import (FreeInitOptions, IterationOptions,
NoiseLayerAdd, NoiseLayerAddWeighted, NoiseLayerGroup, NoiseLayerReplace, NoiseLayerType,
SeedNoiseGeneration, SampleSettings, CustomCFGKeyframeGroup, CustomCFGKeyframe)
from .utils_model import BIGMIN, BIGMAX, SigmaSchedule
class SampleSettingsNode:
@@ -20,18 +23,22 @@ class SampleSettingsNode:
"iteration_opts": ("ITERATION_OPTS",),
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
"adapt_denoise_steps": ("BOOLEAN", {"default": False},),
"custom_cfg": ("CUSTOM_CFG",),
"sigma_schedule": ("SIGMA_SCHEDULE",),
}
}
RETURN_TYPES = ("SAMPLE_SETTINGS",)
RETURN_NAMES = ("settings",)
CATEGORY = "Animate Diff 🎭🅐🅓"
FUNCTION = "create_settings"
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,
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,)
@@ -51,7 +58,7 @@ class NoiseLayerReplaceNode:
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
}
}
RETURN_TYPES = ("NOISE_LAYERS",)
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
FUNCTION = "create_layers"
@@ -86,7 +93,7 @@ class NoiseLayerAddNode:
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
}
}
RETURN_TYPES = ("NOISE_LAYERS",)
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
FUNCTION = "create_layers"
@@ -124,7 +131,7 @@ class NoiseLayerAddWeightedNode:
"seed_override": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff, "forceInput": True}),
}
}
RETURN_TYPES = ("NOISE_LAYERS",)
CATEGORY = "Animate Diff 🎭🅐🅓/noise layers"
FUNCTION = "create_layers"
@@ -156,7 +163,7 @@ class IterationOptionsNode:
"iter_seed_offset": ("INT", {"default": 0, "min": BIGMIN, "max": BIGMAX}),
}
}
RETURN_TYPES = ("ITERATION_OPTS",)
CATEGORY = "Animate Diff 🎭🅐🅓/iteration opts"
FUNCTION = "create_iter_opts"
@@ -185,7 +192,7 @@ class FreeInitOptionsNode:
"iter_seed_offset": ("INT", {"default": 1, "min": BIGMIN, "max": BIGMAX}),
}
}
RETURN_TYPES = ("ITERATION_OPTS",)
CATEGORY = "Animate Diff 🎭🅐🅓/iteration 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,
iter_batch_offset=iter_batch_offset, iter_seed_offset=iter_seed_offset)
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 typing import Union
import torch
from torch import Tensor
import comfy.sample
import comfy.samplers
from comfy.model_patcher import ModelPatcher
from comfy.model_base import BaseModel
from . import freeinit
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
@@ -48,7 +52,8 @@ class NoiseNormalize:
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,
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.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
@@ -58,6 +63,8 @@ class SampleSettings:
self.seed_override = seed_override
self.negative_cond_flipflop = negative_cond_flipflop
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):
if self.seed_override is not None:
@@ -82,10 +89,18 @@ class SampleSettings:
# noise prepared now
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):
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,
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:
@@ -435,3 +450,106 @@ class FreeInitOptions(IterationOptions):
return cached_latents, noised_latents
else:
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
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 .model_injection import InjectionParams, ModelPatcherAndInjector, MotionModelGroup, MotionModelPatcher
from .motion_module_ad import AnimateDiffFormat, AnimateDiffInfo, AnimateDiffVersion, VanillaTemporalModule
@@ -30,6 +30,7 @@ class AnimateDiffHelper_GlobalState:
def __init__(self):
self.motion_models: MotionModelGroup = None
self.params: InjectionParams = None
self.sample_settings: SampleSettings = None
self.reset()
def initialize(self, model):
@@ -40,6 +41,8 @@ class AnimateDiffHelper_GlobalState:
self.motion_models.initialize_timesteps(model)
if self.params.context_options is not None:
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):
self.initialized = False
@@ -53,6 +56,9 @@ class AnimateDiffHelper_GlobalState:
if self.params is not None:
del self.params
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):
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):
params = params.clone()
if params.context_options.context_schedule == ContextSchedules.VIEW_AS_CONTEXT:
params.context_options._current_context.context_length = params.full_length
for context in params.context_options.contexts:
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
if params.context_options.context_length:
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 not params.context_options.context_length:
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.")
motion_models.set_video_length(params.full_length, params.full_length)
# 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:
view_options = params.context_options.view_options
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}.")
motion_models.set_video_length(params.context_options.context_length, params.full_length)
# inject model
@@ -202,10 +209,10 @@ class FunctionInjectionHolder:
if params.unlimited_area_hack:
model.model.memory_required = unlimited_memory_required
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
if not (info.mm_version == AnimateDiffVersion.V3 or (info.mm_format == AnimateDiffFormat.ANIMATEDIFF and info.sd_type == ModelTypeSD.SD1_5 and
info.mm_version == AnimateDiffVersion.V2 and params.apply_v2_properly)):
if not (info.mm_version == AnimateDiffVersion.V3 or
(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)
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
@@ -245,6 +252,8 @@ def motion_sample_factory(orig_comfy_sample: Callable, is_custom: bool=False) ->
cached_noise = None
function_injections = FunctionInjectionHolder()
try:
if model.sample_settings.custom_cfg is not None:
model = model.sample_settings.custom_cfg.patch_model(model)
# clone params from model
params = model.motion_injection_params.clone()
# 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
kwargs["callback"] = ad_callback
ADGS.motion_models = model.motion_models
ADGS.sample_settings = model.sample_settings
# apply adapt_denoise_steps
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:
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)
return latents
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)
if ADGS.params.context_options is not None:
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
else:
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)
uncond_final = torch.zeros_like(x_in)
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
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)
# 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:
full_length = ADGS.params.full_length
for pos, idx in enumerate(ctx_idxs):
# bias is the influence of a specific index in relation to the whole context window
bias = 1 - abs(idx - (ctx_idxs[0] + ctx_idxs[-1]) / 2) / ((ctx_idxs[-1] - ctx_idxs[0] + 1e-2) / 2)
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
# 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
if ADGS.params.context_options.fuse_method == ContextFuseMethod.RELATIVE:
# already normalized, so return as is
del out_count_final
return cond_final, uncond_final
else:
# 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 collections.abc import Iterable
from time import time
import copy
import torch
import numpy as np
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_patcher import ModelPatcher
import comfy.model_sampling
import comfy_extras.nodes_model_advanced
class IsChangedHelper:
def __init__(self):
self.val = 0
def no_change(self):
return self.val
def change(self):
self.val = (self.val + 1) % 100
BIGMIN = -(2**53-1)
BIGMAX = (2**53-1)
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}
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
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:
AUTOSELECT = "autoselect"
SQRT_LINEAR = "sqrt_linear (AnimateDiff)"
LINEAR_ADXL = "linear (AnimateDiff-SDXL)"
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"
SQRT = "sqrt"
COSINE = "cosine"
SQUAREDCOS_CAP_V2 = "squaredcos_cap_v2"
RAW_LINEAR = "linear"
RAW_SQRT_LINEAR = "sqrt_linear"
ALIAS_LIST = [AUTOSELECT, SQRT_LINEAR, LINEAR_ADXL, LINEAR,
USE_EXISTING, SQRT, COSINE, SQUAREDCOS_CAP_V2]
RAW_BETA_SCHEDULE_LIST = [RAW_LINEAR, RAW_SQRT_LINEAR, 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 = {
SQRT_LINEAR: "sqrt_linear",
LINEAR_ADXL: "linear", # also linear, but has different linear_end (0.020)
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",
COSINE: "cosine",
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
def to_name(cls, alias: str):
return cls.ALIAS_MAP[alias]
@classmethod
def to_config(cls, alias: str) -> ModelSamplingConfig:
return ModelSamplingConfig(cls.to_name(alias))
@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)
linear_start = None
linear_end = None
if alias == cls.LINEAR_ADXL:
# 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
@classmethod
def to_model_sampling(cls, alias: str, model: ModelPatcher):
return cls._to_model_sampling(alias=alias, model_type=model.model.model_type)
@staticmethod
def get_alias_list_with_first_element(first_element: str):
new_list = BetaSchedules.ALIAS_LIST.copy()
@@ -77,16 +174,65 @@ class BetaSchedules:
return new_list
class BetaScheduleCache:
def __init__(self, model: ModelPatcher):
self.model_sampling = model.model.model_sampling
class SigmaSchedule:
def __init__(self, model_sampling: comfy.model_sampling.ModelSamplingDiscrete, model_type: ModelType):
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):
model.model.model_sampling = self.model_sampling
self.clean()
def total_sigmas(self):
return len(self.model_sampling.sigmas)
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):
self.model_sampling = None
# def clone(self):
# 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:
@@ -167,8 +313,6 @@ def calculate_model_hash(model: ModelPatcher):
m.update(buf.cpu().numpy().view(np.uint8))
return m.hexdigest()
BIGMIN = -(2**63-1)
BIGMAX = (2**63-1)
class ModelTypeSD:
SD1_5 = "SD1.5"
@@ -285,6 +285,7 @@ app.registerExtension({
words[v] = {
text: v,
info: () => new EmbeddingInfoDialog(emb).show("embeddings", emb),
use_replacer: false,
};
}
@@ -303,6 +304,7 @@ app.registerExtension({
words[v] = {
text: v,
info: () => new LoraInfoDialog(lora).show("loras", lora),
use_replacer: false,
};
}
@@ -576,7 +576,8 @@ export class TextAreaAutoComplete {
onclick: () => {
this.el.focus();
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);
}
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():
if "CUDA_HOME" in os.environ:
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
torch_lib_path = Path(torch.__file__).parent / "lib"
torch_lib_path = str(torch_lib_path.resolve())
@@ -41,8 +41,7 @@ class AMT_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -57,7 +56,7 @@ class AMT_VFI:
clear_cache_after_n_frames: typing.SupportsInt = 1,
multiplier: typing.SupportsInt = 2,
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}")
ckpt_config = CKPT_CONFIGS[ckpt_name]
@@ -81,7 +80,7 @@ class AMT_VFI:
args = [interpolation_model]
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 = postprocess_frames(out)
return (out,)
@@ -20,8 +20,7 @@ class CAIN_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -36,7 +35,7 @@ class CAIN_VFI:
clear_cache_after_n_frames: typing.SupportsInt = 1,
multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
from .cain_arch import CAIN
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
@@ -60,6 +59,6 @@ class CAIN_VFI:
args = [interpolation_model]
out = postprocess_frames(
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,)
@@ -50,8 +50,7 @@ class EISAI_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -66,7 +65,7 @@ class EISAI_VFI:
clear_cache_after_n_frames = 10,
multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
interpolation_model = EISAI(MODEL_FILE_NAMES)
interpolation_model.eval().to(get_torch_device())
@@ -80,6 +79,6 @@ class EISAI_VFI:
args = [interpolation_model, scale]
out = postprocess_frames(
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,)
@@ -52,8 +52,7 @@ class FILM_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -68,14 +67,14 @@ class FILM_VFI:
clear_cache_after_n_frames = 10,
multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
interpolation_states = optional_interpolation_states
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
model = torch.jit.load(model_path, map_location='cpu')
model.eval()
model = model.to(DEVICE)
dtype = torch.float16 if cache_in_fp16 else torch.float32
dtype = torch.float32
frames = preprocess_frames(frames)
number_of_frames_processed_since_last_cleared_cuda_cache = 0
@@ -37,8 +37,7 @@ class FLAVR_VFI:
"duplicate_first_last_frames": ("BOOLEAN", {"default": False})
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -55,7 +54,7 @@ class FLAVR_VFI:
multiplier: typing.SupportsInt = 2,
duplicate_first_last_frames: bool = False,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
if multiplier != 2:
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")
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
out = torch.cat(output_frames, dim=0)
out = padder.unpad(out)
@@ -87,8 +87,7 @@ class GMFSS_Fortuna_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -103,7 +102,7 @@ class GMFSS_Fortuna_VFI:
clear_cache_after_n_frames = 10,
multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
"""
Perform video frame interpolation using a given checkpoint model.
@@ -139,6 +138,6 @@ class GMFSS_Fortuna_VFI:
args = [interpolation_model, scale]
out = postprocess_frames(
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,)
@@ -20,8 +20,7 @@ class IFRNet_VFI:
"scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0}),
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -37,7 +36,7 @@ class IFRNet_VFI:
multiplier: typing.SupportsInt = 2,
scale_factor: typing.SupportsFloat = 1.0,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
from .IFRNet_S_arch import IRFNet_S
from .IFRNet_L_arch import IRFNet_L
@@ -53,6 +52,6 @@ class IFRNet_VFI:
args = [interpolation_model, scale_factor]
out = postprocess_frames(
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,)
@@ -21,8 +21,7 @@ class IFUnet_VFI:
"ensemble": ("BOOLEAN", {"default":True})
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -39,7 +38,7 @@ class IFUnet_VFI:
scale_factor: typing.SupportsFloat = 1.0,
ensemble: bool = True,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
from .IFUNet_arch import IFUNetModel
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
@@ -54,7 +53,7 @@ class IFUnet_VFI:
args = [interpolation_model, scale_factor, ensemble]
out = postprocess_frames(
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,)
@@ -22,8 +22,7 @@ class M2M_VFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000}),
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -38,7 +37,7 @@ class M2M_VFI:
clear_cache_after_n_frames: typing.SupportsInt = 1,
multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
from .M2M_arch import M2M_PWC
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
@@ -56,6 +55,6 @@ class M2M_VFI:
args = [interpolation_model]
out = postprocess_frames(
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,)
@@ -217,8 +217,6 @@ def cuda_kernel(strFunction: str, strKernel: str, objVariables: typing.Dict, **r
def get_cuda_home_path():
if "CUDA_HOME" in os.environ:
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
torch_lib_path = Path(torch.__file__).parent / "lib"
torch_lib_path = str(torch_lib_path.resolve())
@@ -6,6 +6,7 @@ import typing
from comfy.model_management import get_torch_device
import re
from functools import cmp_to_key
from packaging import version
MODEL_TYPE = pathlib.Path(__file__).parent.name
CKPT_NAME_VER_DICT = {
@@ -19,14 +20,13 @@ CKPT_NAME_VER_DICT = {
"rife47.pth": "4.7",
"rife48.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
#TODO: Investigating and fix it
#"rife410.pth": "4.10",
#"rife411.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:
@classmethod
@@ -34,7 +34,7 @@ class RIFE_VFI:
return {
"required": {
"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"}
),
"frames": ("IMAGE", ),
@@ -45,8 +45,7 @@ class RIFE_VFI:
"scale_factor": ([0.25, 0.5, 1.0, 2.0, 4.0], {"default": 1.0})
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -64,7 +63,7 @@ class RIFE_VFI:
ensemble = False,
scale_factor = 1.0,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
"""
Perform video frame interpolation using a given checkpoint model.
@@ -103,6 +102,6 @@ class RIFE_VFI:
args = [interpolation_model, scale_list, fast_mode, ensemble]
out = postprocess_frames(
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,)
@@ -21,8 +21,7 @@ class SepconvVFI:
"multiplier": ("INT", {"default": 2, "min": 2, "max": 1000})
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -37,7 +36,7 @@ class SepconvVFI:
clear_cache_after_n_frames = 10,
multiplier: typing.SupportsInt = 2,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
from .sepconv_enhanced import Network
model_path = load_file_from_github_release(MODEL_TYPE, ckpt_name)
@@ -52,6 +51,6 @@ class SepconvVFI:
args = [interpolation_model]
out = postprocess_frames(
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,)
@@ -22,8 +22,7 @@ class STMFNet_VFI:
"duplicate_first_last_frames": ("BOOLEAN", {"default": False})
},
"optional": {
"optional_interpolation_states": ("INTERPOLATION_STATES", ),
"cache_in_fp16": ("BOOLEAN", {"default": True})
"optional_interpolation_states": ("INTERPOLATION_STATES", )
}
}
@@ -40,7 +39,7 @@ class STMFNet_VFI:
multiplier: typing.SupportsInt = 2,
duplicate_first_last_frames: bool = False,
optional_interpolation_states: InterpolationStateList = None,
cache_in_fp16: bool = True
**kwargs
):
from .stmfnet_arch import STMFNet_Model
if multiplier != 2:
@@ -91,7 +90,7 @@ class STMFNet_VFI:
print("Comfy-VFI: Done cache clearing")
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
out = torch.cat(output_frames, dim=0)
# clear cache for courtesy
@@ -144,15 +144,18 @@ def generic_frame_loop(
return [*first_half, *second_half]
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
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].float()
frame1 = frames[frame_itr+1:frame_itr+2].float()
output_frames.append(frame0.to(dtype=dtype)) # Start with first frame
frame0 = frames[frame_itr:frame_itr+1]
output_frames[out_len] = frame0 # Start with first frame
out_len += 1
# 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):
continue
@@ -175,8 +178,10 @@ def generic_frame_loop(
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))
# Extend output array by batch
output_frames.extend(middle_frame_batches)
# Copy middle frames to output
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
# Try to avoid a memory overflow by clearing cuda cache regularly
@@ -189,14 +194,14 @@ def generic_frame_loop(
gc.collect()
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
output_frames = [frame.cpu() for frame in output_frames] #Ensure all frames are in cpu
out = torch.cat(output_frames, dim=0)
# Append final frame
output_frames[out_len] = frames[-1:]
out_len += 1
# clear cache for courtesy
print("Comfy-VFI: Final clearing cache...", end = ' ')
soft_empty_cache()
print("Done cache clearing")
return out
return output_frames[:out_len]
""" def generic_4frame_loop(
frames,
@@ -7,6 +7,8 @@ This custom node helps to conveniently enhance images through Detector, Detailer
## 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.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).
@@ -41,8 +43,9 @@ This custom node helps to conveniently enhance images through Detector, Detailer
* ControlNet
* 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.
* 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.
* `segs_preprocessor` and `control_image` can be selectively applied. If an `control_image` is given, `segs_preprocessor` will be ignored.
* 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
* 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 (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 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.
* 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.
@@ -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.
* PK_HOOK
* DenoiseScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the denoise to target_denoise as the step progresses.
* CfgScheduleHookProvider - IterativeUpscale provides a hook that gradually changes the cfg to target_cfg 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 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.
* 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.
@@ -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.
* 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.
* TwoSamplersForMaskUpscalerProviderPipe - pipe version of TwoSamplersForMaskUpscalerProvider.
@@ -176,6 +176,7 @@ NODE_CLASS_MAPPINGS = {
"PixelKSampleHookCombine": PixelKSampleHookCombine,
"DenoiseScheduleHookProvider": DenoiseScheduleHookProvider,
"StepsScheduleHookProvider": StepsScheduleHookProvider,
"CfgScheduleHookProvider": CfgScheduleHookProvider,
"NoiseInjectionHookProvider": NoiseInjectionHookProvider,
"UnsamplerHookProvider": UnsamplerHookProvider,
@@ -285,6 +286,7 @@ NODE_CLASS_MAPPINGS = {
"ImpactCombineConditionings": CombineConditionings,
"ImpactConcatConditionings": ConcatConditionings,
"ImpactSEGSLabelAssign": SEGSLabelAssign,
"ImpactSEGSLabelFilter": SEGSLabelFilter,
"ImpactSEGSRangeFilter": SEGSRangeFilter,
"ImpactSEGSOrderedFilter": SEGSOrderedFilter,
@@ -384,6 +386,7 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"ImpactKSamplerBasicPipe": "KSampler (pipe)",
"ImpactKSamplerAdvancedBasicPipe": "KSampler (Advanced/pipe)",
"ImpactSEGSLabelAssign": "SEGS Assign (label)",
"ImpactSEGSLabelFilter": "SEGS Filter (label)",
"ImpactSEGSRangeFilter": "SEGS Filter (range)",
"ImpactSEGSOrderedFilter": "SEGS Filter (ordered)",
@@ -65,7 +65,7 @@ class SEGSDetailerForAnimateDiff:
else:
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,
seg.bbox, seed, steps, cfg, sampler_name, scheduler,
positive, negative, denoise, seg.cropped_mask,
@@ -79,7 +79,7 @@ class SEGSDetailerForAnimateDiff:
if enhanced_image_tensor is None:
new_cropped_image = cropped_image_frames
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_segs.append(new_seg)
@@ -2,7 +2,7 @@ import configparser
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 '')
dependency_version = 20
@@ -370,7 +370,7 @@ def enhance_detail_for_animatediff(image_frames, model, clip, vae, guide_size, g
cnet_images = 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:
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:
self.control_image = None
def apply(self, positive, negative, image, mask=None):
cnet_tensors = []
prev_cnet_tensors = []
def apply(self, positive, negative, image, mask=None, use_acn=False):
cnet_image_list = []
prev_cnet_images = []
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:
cnet_tensor = self.control_image
cnet_image = self.control_image
elif self.preprocessor is not None:
cnet_tensor = self.preprocessor.apply(image, mask)
cnet_image = self.preprocessor.apply(image, mask)
else:
cnet_tensor = image
cnet_image = image
cnet_tensors.extend(prev_cnet_tensors)
cnet_tensors.append(cnet_tensor)
cnet_image_list.extend(prev_cnet_images)
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:
@@ -1543,26 +1553,36 @@ class ControlNetAdvancedWrapper:
else:
self.control_image = None
def apply(self, positive, negative, image, mask=None):
cnet_tensors = []
prev_cnet_tensors = []
def apply(self, positive, negative, image, mask=None, use_acn=False):
cnet_image_list = []
prev_cnet_images = []
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:
cnet_tensor = self.control_image
cnet_image = self.control_image
elif self.preprocessor is not None:
cnet_tensor = self.preprocessor.apply(image, mask)
cnet_image = self.preprocessor.apply(image, mask)
else:
cnet_tensor = image
cnet_image = image
cnet_tensors.extend(prev_cnet_tensors)
cnet_tensors.append(cnet_tensor)
cnet_image_list.extend(prev_cnet_images)
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
@@ -109,11 +109,14 @@ class SimpleCfgScheduleHook(PixelKSampleHook):
super().__init__()
self.target_cfg = target_cfg
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent,
denoise):
progress = self.cur_step / self.total_step
gap = self.target_cfg - cfg
current_cfg = cfg + gap * progress
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_cfg - cfg
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
@@ -122,14 +125,33 @@ class SimpleDenoiseScheduleHook(PixelKSampleHook):
super().__init__()
self.target_denoise = target_denoise
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, upscaled_latent,
denoise):
progress = self.cur_step / self.total_step
gap = self.target_denoise - denoise
current_denoise = denoise + gap * progress
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_denoise - denoise
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
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):
def cycle_latent(self, latent):
return latent
@@ -147,9 +169,14 @@ class SimpleDetailerDenoiseSchedulerHook(DetailerHook):
self.target_denoise = target_denoise
def pre_ksample(self, model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent, denoise):
progress = self.cur_step / self.total_step
gap = self.target_denoise - denoise
current_denoise = denoise + gap * progress
if self.total_step > 1:
progress = self.cur_step / (self.total_step - 1)
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
@@ -237,8 +237,10 @@ class DetailerForEach:
else:
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)
elif wildcard_chooser is not None and wmode == "LAB":
seg_seed, wildcard_item = None, wildcard_chooser.get(seg)
else:
seg_seed, wildcard_item = None, None
@@ -272,7 +274,7 @@ class DetailerForEach:
# Convert enhanced_pil_alpha to RGBA mode
enhanced_image_alpha = tensor_convert_rgba(enhanced_image)
new_seg_image = enhanced_image.numpy() # alpha should not be applied to seg_image
# Apply the mask
mask = tensor_resize(mask, *tensor_get_size(enhanced_image))
tensor_putalpha(enhanced_image_alpha, mask)
@@ -780,6 +782,30 @@ class DenoiseScheduleHookProvider:
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:
@classmethod
def INPUT_TYPES(s):
@@ -1104,7 +1130,7 @@ class IterativeLatentUpscale:
new_h = h*upscale_factor
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}) ")
step_info = steps, steps
step_info = steps-1, steps
current_latent = upscaler.upscale_shape(step_info, current_latent, new_w, new_h, temp_prefix)
core.update_node_status(unique_id, "", None)
@@ -1451,7 +1477,7 @@ class SegsBitwiseAndMask:
def doit(self, segs, mask):
return (core.segs_bitwise_and_mask(segs, mask), )
class SegsBitwiseAndMaskForEach:
@classmethod
@@ -1626,7 +1652,7 @@ class SubtractMask:
"mask2": ("MASK", ),
}
}
RETURN_TYPES = ("MASK",)
FUNCTION = "doit"
@@ -1757,7 +1783,7 @@ class ImageReceiver:
return hash(image_data)
else:
return hash(image)
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,
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:
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:
advanced_steps = math.floor(steps / denoise)
start_at_step = advanced_steps - steps
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,
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:
# noise_latent = \
@@ -141,9 +141,9 @@ def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive,
latent_compositor = nodes.NODE_CLASS_MAPPINGS['LatentCompositeMasked']()
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,
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
@@ -151,18 +151,19 @@ def ksampler_wrapper(model, seed, steps, cfg, sampler_name, scheduler, positive,
class KSamplerAdvancedWrapper:
params = None
def __init__(self, model, cfg, sampler_name, scheduler, positive, negative, sampler_opt=None):
self.params = model, cfg, sampler_name, scheduler, positive, negative
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, sigma_factor
self.sampler_opt = sampler_opt
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)
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):
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:
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:
latent_image = separated_sample(model, add_noise, seed, steps, cfg, sampler_name, scheduler,
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:
if str(e) == 'sigma_min and sigma_max must not be 0':
print(f"\nWARN: sampling skipped - sigma_min and sigma_max are 0")
@@ -207,7 +208,7 @@ class KSamplerAdvancedWrapper:
try:
latent_image = separated_sample(model, add_noise, seed, steps, cfg, recovery_sampler, scheduler,
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:
if str(e) == 'sigma_min and sigma_max must not be 0':
print(f"\nWARN: sampling skipped - sigma_min and sigma_max are 0")
@@ -1,5 +1,6 @@
import folder_paths
from impact.core import *
import os
import mmcv
from mmdet.apis import (inference_detector, init_detector)
@@ -415,6 +415,44 @@ class SEGSLabelFilter:
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:
@classmethod
def INPUT_TYPES(s):
@@ -67,6 +67,7 @@ class KSamplerAdvancedProvider:
"cfg": ("FLOAT", {"default": 8.0, "min": 0.0, "max": 100.0}),
"sampler_name": (comfy.samplers.KSampler.SAMPLERS, ),
"scheduler": (comfy.samplers.KSampler.SCHEDULERS, ),
"sigma_factor": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.01}),
"basic_pipe": ("BASIC_PIPE", )
},
"optional": {
@@ -79,9 +80,9 @@ class KSamplerAdvancedProvider:
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
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, )
@@ -251,7 +252,7 @@ class ConcatConditionings:
RETURN_TYPES = ("CONDITIONING", )
FUNCTION = "doit"
CATEGORY = "ImpactPack/__for_testing"
CATEGORY = "ImpactPack/Util"
def doit(self, **kwargs):
conditioning_to = list(kwargs.values())[0]
@@ -495,9 +495,16 @@ def to_latent_image(pixels, vae):
y = pixels.shape[2]
if pixels.shape[1] != x or pixels.shape[2] != y:
pixels = pixels[:, :x, :y, :]
pixels = nodes.VAEEncode.vae_encode_crop_pixels(pixels)
t = vae.encode(pixels[:, :, :, :3])
return {"samples": t}
vae_encode = nodes.VAEEncode()
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):
@@ -393,6 +393,47 @@ class CreateFadeMaskAdvanced:
if invert:
return (1.0 - 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:
@@ -1128,24 +1169,38 @@ class VRAM_Debug:
freemem_after = comfy.model_management.get_free_memory()
print(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:
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"input": ("*", {"forceinput": True, "default": ""}),
"input": (any, {}),
},
"optional": {
"prefix": ("STRING", {"default": ""}),
"suffix": ("STRING", {"default": ""}),
}
}
RETURN_TYPES = ("STRING",)
FUNCTION = "stringify"
CATEGORY = "KJNodes"
def stringify(self, input):
def stringify(self, input, prefix="", suffix=""):
if isinstance(input, (int, float, bool)):
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:
return
return (stringified,)
@@ -2140,7 +2195,7 @@ class BatchCLIPSeg:
model.to(device) # Ensure the model is on the correct device
images = images.to(device)
processor = CLIPSegProcessor.from_pretrained("CIDAS/clipseg-rd64-refined")
pbar = comfy.utils.ProgressBar(images.shape[0])
for image in images:
image = (image* 255).type(torch.uint8)
prompt = text
@@ -2165,7 +2220,7 @@ class BatchCLIPSeg:
# Remove the extra dimensions
resized_tensor = resized_tensor[0, 0, :, :]
pbar.update(1)
out.append(resized_tensor)
results = torch.stack(out).cpu()
@@ -2319,12 +2374,7 @@ class OffsetMask:
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:
@classmethod
def IS_CHANGED(cls, **kwargs):
@@ -3266,13 +3316,14 @@ class OffsetMaskByNormalizedAmplitude:
return offsetmask,
class ImageTransformByNormalizedAmplitude:
@classmethod
def INPUT_TYPES(s):
return {"required": {
"normalized_amp": ("NORMALIZED_AMPLITUDE",),
"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 }),
"image": ("IMAGE",),
}}
@@ -3281,7 +3332,7 @@ class ImageTransformByNormalizedAmplitude:
FUNCTION = "amptransform"
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]
normalized_amp = np.clip(normalized_amp, 0.0, 1.0)
transformed_images = []
@@ -3325,6 +3376,17 @@ class ImageTransformByNormalizedAmplitude:
# Convert the tensor back to BxHxWxC format
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
transformed_images.append(tensor_img)
@@ -3460,7 +3522,7 @@ class GLIGENTextBoxApplyBatch:
interpolated_coords = interpolate_coordinates_with_curves(coordinates_dict, batch_size)
if interpolation == 'straight':
interpolated_coords = interpolate_coordinates(coordinates_dict, batch_size)
plot_image_tensor = plot_to_tensor(coordinates_dict, interpolated_coords, 512, 512, height)
for t in conditioning_to:
n = [t[0], t[1].copy()]
@@ -3471,6 +3533,7 @@ class GLIGENTextBoxApplyBatch:
x_position, y_position = interpolated_coords[i]
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
print("x ",x_position, "y ", y_position)
prev = []
if "gligen" in n[1]:
prev = n[1]['gligen'][2]
@@ -3484,6 +3547,101 @@ class GLIGENTextBoxApplyBatch:
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 = {
"INTConstant": INTConstant,
@@ -3548,7 +3706,10 @@ NODE_CLASS_MAPPINGS = {
"GetLatentsFromBatchIndexed": GetLatentsFromBatchIndexed,
"StringConstant": StringConstant,
"GLIGENTextBoxApplyBatch": GLIGENTextBoxApplyBatch,
"CondPassThrough": CondPassThrough
"CondPassThrough": CondPassThrough,
"ImageUpscaleWithModelBatched": ImageUpscaleWithModelBatched,
"ScaleBatchPromptSchedule": ScaleBatchPromptSchedule,
"EffnetEncode": EffnetEncode
}
NODE_DISPLAY_NAME_MAPPINGS = {
"INTConstant": "INT Constant",
@@ -3612,5 +3773,8 @@ NODE_DISPLAY_NAME_MAPPINGS = {
"GetLatentsFromBatchIndexed": "GetLatentsFromBatchIndexed",
"StringConstant": "StringConstant",
"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.")
version = [2, 7]
version = [2, 7, 2]
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
print(f"### Loading: ComfyUI-Manager ({version_str})")
@@ -307,16 +307,19 @@ def print_comfyui_version():
global comfy_ui_commit_datetime
global comfy_ui_hash
is_detached = False
try:
repo = git.Repo(os.path.dirname(folder_paths.__file__))
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
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:
if comfy_ui_commit_datetime.date() < comfy_ui_required_commit_datetime.date():
@@ -343,7 +346,10 @@ def print_comfyui_version():
else:
print(f"### ComfyUI Revision: {comfy_ui_revision} on '{current_branch}' [{comfy_ui_hash[:8]}] | Released on '{comfy_ui_commit_datetime.date()}'")
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()
@@ -199,6 +199,11 @@
"id":"https://github.com/abyz22/image_control",
"tags":"BMAB",
"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",
"description": "Custom node to convert the lantents between SDXL and SD v1.5 directly without the VAE decoding/encoding step."
},
},
{
"author": "city96",
"title": "SD-Advanced-Noise",
@@ -456,7 +456,7 @@
],
"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."
},
},
{
"author": "city96",
"title": "SD-Latent-Upscaler",
@@ -467,7 +467,7 @@
"pip": ["huggingface-hub"],
"install_type": "git-clone",
"description": "Upscaling stable diffusion latents using a small neural network."
},
},
{
"author": "city96",
"title": "ComfyUI_DiT [WIP]",
@@ -478,7 +478,7 @@
"pip": ["huggingface-hub"],
"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.]"
},
},
{
"author": "city96",
"title": "ComfyUI_ColorMod",
@@ -488,7 +488,7 @@
],
"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."
},
},
{
"author": "city96",
"title": "Extra Models for ComfyUI",
@@ -904,6 +904,16 @@
"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."
},
{
"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",
"title": "InterpolateEverything",
@@ -1497,6 +1507,16 @@
"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."
},
{
"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",
"title": "JPS Custom Nodes for ComfyUI",
@@ -2297,6 +2317,16 @@
"install_type": "git-clone",
"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",
"title": "Comfyui-Lama",
@@ -3010,6 +3040,36 @@
"install_type": "git-clone",
"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",
"title": "ComfyUI-ComfyCouple",
@@ -3130,6 +3190,36 @@
"install_type": "git-clone",
"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",
"title": "qq-nodes-comfyui",
@@ -3872,36 +3962,6 @@
"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."
},
{
"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",
"title": "ComfyUI-sudo-latent-upscale",
@@ -3993,6 +4053,16 @@
"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."
},
{
"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",
"title": "Crystools",
@@ -4184,6 +4254,16 @@
"install_type": "git-clone",
"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",
"title": "ComfyUI-Panda3d",
@@ -4311,8 +4391,9 @@
"files": [
"https://github.com/MrForExample/ComfyUI-3D-Pack"
],
"nodename_pattern": "^\\[Comfy3D\\]",
"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",
@@ -4321,6 +4402,7 @@
"files": [
"https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved"
],
"nodename_pattern": "^\\[AnimateAnyone\\]",
"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.]"
},
@@ -4334,6 +4416,16 @@
"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."
},
{
"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",
"title": "ComfyUI Profiler",
@@ -4534,6 +4626,26 @@
"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."
},
{
"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",
"title": "ComfyUI-JNodes",
@@ -4774,6 +4886,16 @@
"install_type": "git-clone",
"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",
"title": "ComfyUI-RandomSize",
@@ -4854,6 +4976,26 @@
"install_type": "git-clone",
"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",
"title": "comfyui-ricklove",
@@ -4916,7 +5058,7 @@
},
{
"author": "TemryL",
"title": "ComfyS3: Amazon S3 Integration for ComfyUI",
"title": "ComfyS3",
"reference": "https://github.com/TemryL/ComfyS3",
"files": [
"https://github.com/TemryL/ComfyS3"
@@ -4954,8 +5096,198 @@
"install_type": "git-clone",
"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",
@@ -5228,7 +5560,17 @@
"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."
},
{
"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",
File diff suppressed because it is too large Load Diff
@@ -1052,7 +1052,7 @@ class ManagerMenuDialog extends ComfyDialog {
onclick: (e) => {
const last_visited_site = localStorage.getItem("wg_last_visited")
if (!!last_visited_site) {
window.open(last_visited_site, "comfyui-workflow-gallery");
window.open(last_visited_site, last_visited_site);
} else {
this.handleWorkflowGalleryButtonClick(e)
}
@@ -1179,7 +1179,7 @@ class ManagerMenuDialog extends ComfyDialog {
callback: () => {
const url = "https://openart.ai/workflows/dev";
localStorage.setItem("wg_last_visited", url);
window.open(url, "comfyui-workflow-gallery");
window.open(url, url);
modifyButtonStyle(url);
},
},
@@ -1188,7 +1188,7 @@ class ManagerMenuDialog extends ComfyDialog {
callback: () => {
const url = "https://youml.com/?from=comfyui-share";
localStorage.setItem("wg_last_visited", url);
window.open(url, "comfyui-workflow-gallery");
window.open(url, url);
modifyButtonStyle(url);
},
},
@@ -1197,7 +1197,16 @@ class ManagerMenuDialog extends ComfyDialog {
callback: () => {
const url = "https://comfyworkflows.com/";
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);
},
},
@@ -270,6 +270,138 @@
"filename": "easynegative.safetensors",
"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)",
"type": "checkpoints",
@@ -667,8 +799,8 @@
"save_path": "default",
"description": "TemporalNet was a ControlNet model designed to enhance the temporal consistency of generated outputs",
"reference": "https://huggingface.co/CiaraRowles/TemporalNet2",
"filename": "temporalnetversion2.ckpt",
"url": "https://huggingface.co/CiaraRowles/TemporalNet2/resolve/main/temporalnetversion2.ckpt"
"filename": "temporalnetversion2.safetensors",
"url": "https://huggingface.co/CiaraRowles/TemporalNet2/resolve/main/temporalnetversion2.safetensors"
},
{
"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",
"base": "SD1.x",
"save_path": "custom_nodes/comfyui-animatediff/models",
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"save_path": "AnimateDiff",
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "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",
"base": "SD1.x",
"save_path": "custom_nodes/comfyui-animatediff/models",
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"save_path": "AnimateDiff",
"description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "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",
"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)",
"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_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",
"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)",
"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_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",
"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)",
"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_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)",
"type": "controlnet",
@@ -1316,16 +1612,6 @@
"filename": "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",
"type": "lora",
@@ -1337,158 +1623,6 @@
"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",
"type": "checkpoints",
@@ -1810,6 +1944,97 @@
"reference": "https://huggingface.co/TencentARC/PhotoMaker",
"filename": "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."
},
{
"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",
"title": "ComfyUI Animate LCM",
@@ -18,17 +67,47 @@
"https://github.com/dezi-ai/ComfyUI-AnimateLCM"
],
"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",
"title": "ComfyUI-sonar (WIP)",
"reference": "https://github.com/blepping/ComfyUI-sonar",
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-BRIA_AI-RMBG",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG",
"files": [
"https://github.com/blepping/ComfyUI-sonar"
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG"
],
"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",
@@ -120,16 +199,6 @@
"install_type": "git-clone",
"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",
"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",
"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",
"title": "comfyui-clip-with-break",
@@ -52,7 +413,7 @@
},
{
"author": "davask",
"title": "MarasIT Nodes",
"title": "🐰 MarasIT Nodes",
"reference": "https://github.com/davask/ComfyUI-MarasIT-Nodes",
"files": [
"https://github.com/davask/ComfyUI-MarasIT-Nodes"
@@ -359,396 +720,6 @@
],
"install_type": "git-clone",
"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": [
{
"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",
"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",
"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)",
"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"
@@ -258,21 +461,21 @@
"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",
"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)",
"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)",
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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"
@@ -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",
"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)",
"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": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved)",
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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)",
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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)",
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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)",
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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)",
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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)",
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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)",
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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)",
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"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)",
"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": "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",
"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
from .utils import BIGMIN, BIGMAX
class MergeStrategies:
MATCH_A = "match A"
@@ -36,7 +38,7 @@ class SplitLatents:
return {
"required": {
"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 {
"required": {
"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 {
"required": {
"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 {
"required": {
"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 {
"required": {
"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 {
"required": {
"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 {
"required": {
"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 {
"required": {
"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 {
"required": {
"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