6.2 KiB
6.2 KiB
Documentation
- Class name: ttN pipeLoraStack
- Category: ttN/pipe
- Output node: False
- Repo Ref: https://github.com/comfyanonymous/ComfyUI
ttN pipeLoraStack节点旨在通过堆叠LoRA调整来动态增强和修改模型和剪辑的功能,这些调整基于指定的配置。它允许用户通过应用学习到的仿射变换来自定义模型和剪辑的行为,使用户能够精确地微调他们的生成过程。
Input types
Required
- toggle
- 决定是否应用LoRA堆栈,作为启用或禁用堆叠过程的开关。
- Comfy dtype: COMBO[BOOLEAN]
- Python dtype: bool
- mode
- 指定LoRA调整的操作模式,区分简单和高级配置,用于应用模型和剪辑强度修改。
- Comfy dtype: COMBO[STRING]
- Python dtype: str
- num_loras
- 表示要应用的LoRA调整数量,允许堆叠多层修改。
- Comfy dtype: INT
- Python dtype: int
Optional
- optional_pipe
- 一个可选的管道配置,如果提供,可以用LoRA调整来增强;否则,将生成一个新的配置。
- Comfy dtype: PIPE_LINE
- Python dtype: dict or None
- model_override
- 允许在可选管道中覆盖模型组件,便于自定义模型调整。
- Comfy dtype: MODEL
- Python dtype: object or None
- clip_override
- 允许在可选管道中覆盖剪辑组件,便于自定义剪辑调整。
- Comfy dtype: CLIP
- Python dtype: object or None
- optional_lora_stack
- 一个预定义的LoRA调整列表,可以选择性地包含用于堆叠,提供了导入现有配置或添加到现有配置的方法。
- Comfy dtype: LORA_STACK
- Python dtype: list of tuples or None
- lora_i_name
- 指定要应用的第i个LoRA调整的名称,使能够识别和应用特定的LoRA变换。
- Comfy dtype: COMBO[STRING]
- Python dtype: str
- lora_i_strength
- 在简单模式下定义第i个LoRA调整对模型和剪辑的强度,允许统一的修改强度。
- Comfy dtype: FLOAT
- Python dtype: float
- lora_i_model_strength
- 在高级模式下指定应用于模型的第i个LoRA调整的强度,使模型变换能够有差异化的强度。
- Comfy dtype: FLOAT
- Python dtype: float
- lora_i_clip_strength
- 在高级模式下指定应用于剪辑的第i个LoRA调整的强度,使剪辑变换能够有差异化的强度。
- Comfy dtype: FLOAT
- Python dtype: float
Output types
- optional_pipe
- 返回应用LoRA堆栈后增强或新创建的管道配置。
- Comfy dtype: PIPE_LINE
- Python dtype: dict
- lora_stack
- 提供应用的LoRA调整列表,详细说明对模型和剪辑所做的修改。
- Comfy dtype: LORA_STACK
- Python dtype: list of tuples or None
Usage tips
- Infra type:
CPU - Common nodes: unknown
Source code
class ttN_pipeLoraStack:
version = '1.1.1'
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
inputs = {
"required": {
"toggle": ([True, False],),
"mode": (["simple", "advanced"],),
"num_loras": ("INT", {"default": 1, "min": 0, "max": 20}),
},
"optional": {
"optional_pipe": ("PIPE_LINE", {"default": None}),
"model_override": ("MODEL",),
"clip_override": ("CLIP",),
"optional_lora_stack": ("LORA_STACK",),
},
"hidden": {
"ttNnodeVersion": (ttN_pipeLoraStack.version),
},
}
for i in range(1, 21):
inputs["optional"][f"lora_{i}_name"] = (["None"] + folder_paths.get_filename_list("loras"),{"default": "None"})
inputs["optional"][f"lora_{i}_strength"] = ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01})
inputs["optional"][f"lora_{i}_model_strength"] = ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01})
inputs["optional"][f"lora_{i}_clip_strength"] = ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01})
return inputs
RETURN_TYPES = ("PIPE_LINE", "LORA_STACK",)
RETURN_NAMES = ("optional_pipe","lora_stack",)
FUNCTION = "stack"
CATEGORY = "ttN/pipe"
def stack(self, toggle, mode, num_loras, optional_pipe=None, lora_stack=None, model_override=None, clip_override=None, **kwargs):
if (toggle in [False, None, "False"]) or not kwargs:
return optional_pipe, None
loras = []
# Import Stack values
if lora_stack is not None:
loras.extend([l for l in lora_stack if l[0] != "None"])
# Import Lora values
for i in range(1, num_loras + 1):
lora_name = kwargs.get(f"lora_{i}_name")
if not lora_name or lora_name == "None":
continue
if mode == "simple":
lora_strength = float(kwargs.get(f"lora_{i}_strength"))
loras.append((lora_name, lora_strength, lora_strength))
elif mode == "advanced":
model_strength = float(kwargs.get(f"lora_{i}_model_strength"))
clip_strength = float(kwargs.get(f"lora_{i}_clip_strength"))
loras.append((lora_name, model_strength, clip_strength))
if not loras:
return optional_pipe, None
if loras and not optional_pipe:
return optional_pipe, loras
# Load Loras
model = model_override or optional_pipe.get("model")
clip = clip_override or optional_pipe.get("clip")
if not model or not clip:
return optional_pipe, loras
for lora in loras:
model, clip = loader.load_lora(lora[0], model, clip, lora[1], lora[2])
new_pipe = {
"model": model,
"positive": optional_pipe["positive"],
"negative": optional_pipe["negative"],
"vae": optional_pipe["vae"],
"clip": clip,
"samples": optional_pipe["samples"],
"images": optional_pipe["images"],
"seed": optional_pipe["seed"],
"loader_settings": optional_pipe["loader_settings"],
}
del optional_pipe
return new_pipe, loras