136 lines
5.4 KiB
Markdown
136 lines
5.4 KiB
Markdown
# 🚫AnimateDiff Loader (Advanced) [DEPRECATED] 🎭🅐🅓
|
|
## Documentation
|
|
- Class name: ADE_AnimateDiffLoaderV1Advanced
|
|
- Category:
|
|
- Output node: False
|
|
- Repo Ref: https://github.com/comfyanonymous/ComfyUI
|
|
|
|
该节点旨在高级加载AnimateDiff模型,特别适用于处理弃用功能和遗留配置。它抽象地支持旧版AnimateDiff模型在当前工作流中的集成和利用,确保兼容性和对历史模型功能的访问。
|
|
|
|
# Input types
|
|
## Required
|
|
- model
|
|
- 指定要加载的AnimateDiff模型,重点关注特定遗留应用的弃用模型。
|
|
- Comfy dtype: MODEL
|
|
- Python dtype: str
|
|
- latents
|
|
- 定义在加载AnimateDiff模型期间应用的潜在配置,允许自定义模型的行为。
|
|
- Comfy dtype: LATENT
|
|
- Python dtype: str
|
|
- model_name
|
|
- 确定要加载的特定AnimateDiff模型的名称,使得能够精确选择遗留模型。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
- unlimited_area_hack
|
|
- 一个布尔标志,用于启用或禁用无限区域黑客,提供特定加载场景的解决方法。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
- context_length
|
|
- 指定在模型加载期间使用的上下文长度,影响模型处理输入的方式。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- context_stride
|
|
- 确定上下文的步幅,影响模型的加载和处理效率。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- context_overlap
|
|
- 定义在模型加载期间上下文段之间的重叠,优化模型对序列数据的理解。
|
|
- Comfy dtype: INT
|
|
- Python dtype: int
|
|
- context_schedule
|
|
- 选择上下文应用的计划,允许灵活适应各种加载需求。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
- closed_loop
|
|
- 一个布尔参数,指示模型加载是否应在闭环中操作,影响模型的初始化过程。
|
|
- Comfy dtype: BOOLEAN
|
|
- Python dtype: bool
|
|
- beta_schedule
|
|
- 选择在模型加载期间使用的beta计划,影响模型的适应性和性能。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
|
|
# Output types
|
|
- model
|
|
- 输出加载的AnimateDiff模型,准备进一步处理或应用。
|
|
- Comfy dtype: MODEL
|
|
- Python dtype: str
|
|
- latent
|
|
- 提供在模型加载期间应用的潜在配置,反映模型行为的定制化。
|
|
- Comfy dtype: LATENT
|
|
- Python dtype: str
|
|
|
|
# Usage tips
|
|
- Infra type: CPU
|
|
|
|
# Source code
|
|
```python
|
|
class AnimateDiffLoaderAdvanced_Deprecated:
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {
|
|
"required": {
|
|
"model": ("MODEL",),
|
|
"latents": ("LATENT",),
|
|
"model_name": (get_available_motion_models(),),
|
|
"unlimited_area_hack": ("BOOLEAN", {"default": False},),
|
|
"context_length": ("INT", {"default": 16, "min": 0, "max": 1000}),
|
|
"context_stride": ("INT", {"default": 1, "min": 1, "max": 1000}),
|
|
"context_overlap": ("INT", {"default": 4, "min": 0, "max": 1000}),
|
|
"context_schedule": (ContextSchedules.LEGACY_UNIFORM_SCHEDULE_LIST,),
|
|
"closed_loop": ("BOOLEAN", {"default": False},),
|
|
"beta_schedule": (BetaSchedules.get_alias_list_with_first_element(BetaSchedules.SQRT_LINEAR),),
|
|
},
|
|
}
|
|
|
|
RETURN_TYPES = ("MODEL", "LATENT")
|
|
CATEGORY = ""
|
|
FUNCTION = "load_mm_and_inject_params"
|
|
|
|
def load_mm_and_inject_params(self,
|
|
model: ModelPatcher,
|
|
latents: Dict[str, torch.Tensor],
|
|
model_name: str, unlimited_area_hack: bool,
|
|
context_length: int, context_stride: int, context_overlap: int, context_schedule: str, closed_loop: bool,
|
|
beta_schedule: str,
|
|
):
|
|
# load motion module
|
|
motion_model = load_motion_module_gen1(model_name, model)
|
|
# get total frames
|
|
init_frames_len = len(latents["samples"]) # deprecated - no longer used for anything lol
|
|
# set injection params
|
|
params = InjectionParams(
|
|
unlimited_area_hack=unlimited_area_hack,
|
|
apply_mm_groupnorm_hack=True,
|
|
model_name=model_name,
|
|
apply_v2_properly=False,
|
|
)
|
|
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.create_from(model, hooks_only=True)
|
|
model.motion_models = MotionModelGroup(motion_model)
|
|
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)
|
|
|
|
del motion_model
|
|
return (model, latents)
|
|
|