Files
CavinHuang-comfyui-nodes-docs/docs/StableCascade_CheckpointLoader __Inspire.md
2024-07-04 08:39:03 +08:00

6.0 KiB

Documentation

本节点旨在高效管理和加载模型检查点,采用级联方式优化流程,利用缓存机制避免重复加载。它支持基于缓存可用性和特定需求的条件加载,从而在模型部署场景中提高性能和资源利用率。

Input types

Required

  • stage_b
    • 指定'b'阶段模型的检查点。该参数对于识别和加载正确的模型至关重要,并可选择利用缓存以提高效率。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str
  • key_opt_b
    • 'b'阶段检查点的可选键,用于在缓存中唯一标识它,实现精确的缓存管理和检索。
    • Comfy dtype: STRING
    • Python dtype: str
  • stage_c
    • 指定'c'阶段模型的检查点。与'stage_b'类似,它对于加载适当的模型至关重要,并可利用缓存进行优化。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str
  • key_opt_c
    • 作为'c'阶段检查点的可选键,支持特定的缓存操作并确保高效的模型管理。
    • Comfy dtype: STRING
    • Python dtype: str
  • cache_mode
    • 确定缓存策略(如none、stage_b、stage_c、all),影响检查点如何存储或从缓存中检索以优化加载时间。
    • Comfy dtype: COMBO[STRING]
    • Python dtype: str

Output types

  • b_model
    • 从'b'阶段检查点加载的模型,可供使用。
    • Comfy dtype: MODEL
    • Python dtype: torch.nn.Module
  • b_vae
    • 与'b'阶段模型相关的VAE组件。
    • Comfy dtype: VAE
    • Python dtype: torch.nn.Module
  • c_model
    • 从'c'阶段检查点加载的模型,可供使用。
    • Comfy dtype: MODEL
    • Python dtype: torch.nn.Module
  • c_vae
    • 与'c'阶段模型相关的VAE组件。
    • Comfy dtype: VAE
    • Python dtype: torch.nn.Module
  • c_clip_vision
    • 与'c'阶段模型一起加载的CLIP视觉组件,便于多模态操作。
    • Comfy dtype: CLIP_VISION
    • Python dtype: torch.nn.Module
  • clip
    • CLIP模型组件,支持包括文本和图像理解在内的各种任务。
    • Comfy dtype: CLIP
    • Python dtype: torch.nn.Module
  • key_b
    • 与'b'阶段模型关联的缓存键,反映其缓存状态或标识符。
    • Comfy dtype: STRING
    • Python dtype: str
  • key_c
    • 与'c'阶段模型关联的缓存键,反映其缓存状态或标识符。
    • Comfy dtype: STRING
    • Python dtype: str

Usage tips

  • Infra type: CPU
  • Common nodes: unknown

Source code

class StableCascade_CheckpointLoader:
    @classmethod
    def INPUT_TYPES(s):
        ckpts = folder_paths.get_filename_list("checkpoints")
        default_stage_b = ''
        default_stage_c = ''

        sc_ckpts = [x for x in ckpts if 'cascade' in x.lower()]
        sc_b_ckpts = [x for x in sc_ckpts if 'stage_b' in x.lower()]
        sc_c_ckpts = [x for x in sc_ckpts if 'stage_c' in x.lower()]

        if len(sc_b_ckpts) == 0:
            sc_b_ckpts = [x for x in ckpts if 'stage_b' in x.lower()]
        if len(sc_c_ckpts) == 0:
            sc_c_ckpts = [x for x in ckpts if 'stage_c' in x.lower()]

        if len(sc_b_ckpts) == 0:
            sc_b_ckpts = ckpts
        if len(sc_c_ckpts) == 0:
            sc_c_ckpts = ckpts

        if len(sc_b_ckpts) > 0:
            default_stage_b = sc_b_ckpts[0]
        if len(sc_c_ckpts) > 0:
            default_stage_c = sc_c_ckpts[0]

        return {"required": {
                        "stage_b": (ckpts, {'default': default_stage_b}),
                        "key_opt_b": ("STRING", {"multiline": False, "placeholder": "If empty, use 'stage_b' as the key."}),
                        "stage_c": (ckpts, {'default': default_stage_c}),
                        "key_opt_c": ("STRING", {"multiline": False, "placeholder": "If empty, use 'stage_c' as the key."}),
                        "cache_mode": (["none", "stage_b", "stage_c", "all"], {"default": "none"}),
                     }}

    RETURN_TYPES = ("MODEL", "VAE", "MODEL", "VAE", "CLIP_VISION", "CLIP", "STRING", "STRING")
    RETURN_NAMES = ("b_model", "b_vae", "c_model", "c_vae", "c_clip_vision", "clip", "key_b", "key_c")
    FUNCTION = "doit"

    CATEGORY = "InspirePack/Backend"

    def doit(self, stage_b, key_opt_b, stage_c, key_opt_c, cache_mode):
        if key_opt_b.strip() == '':
            key_b = stage_b
        else:
            key_b = key_opt_b.strip()

        if key_opt_c.strip() == '':
            key_c = stage_c
        else:
            key_c = key_opt_c.strip()

        if cache_mode in ['stage_b', "all"]:
            if key_b not in cache:
                res_b = nodes.CheckpointLoaderSimple().load_checkpoint(ckpt_name=stage_b)
                update_cache(key_b, "ckpt", (False, res_b))
                print(f"[Inspire Pack] StableCascade_CheckpointLoader: Ckpt '{stage_b}' is cached to '{key_b}'.")
            else:
                _, (_, res_b) = cache[key_b]
                print(f"[Inspire Pack] StableCascade_CheckpointLoader: Cached ckpt '{key_b}' is loaded. (Loading skip)")
            b_model, clip, b_vae = res_b
        else:
            b_model, clip, b_vae = nodes.CheckpointLoaderSimple().load_checkpoint(ckpt_name=stage_b)

        if cache_mode in ['stage_c', "all"]:
            if key_c not in cache:
                res_c = nodes.unCLIPCheckpointLoader().load_checkpoint(ckpt_name=stage_c)
                update_cache(key_c, "unclip_ckpt", (False, res_c))
                print(f"[Inspire Pack] StableCascade_CheckpointLoader: Ckpt '{stage_c}' is cached to '{key_c}'.")
            else:
                _, (_, res_c) = cache[key_c]
                print(f"[Inspire Pack] StableCascade_CheckpointLoader: Cached ckpt '{key_c}' is loaded. (Loading skip)")
            c_model, _, c_vae, clip_vision = res_c
        else:
            c_model, _, c_vae, clip_vision = nodes.unCLIPCheckpointLoader().load_checkpoint(ckpt_name=stage_c)

        return b_model, b_vae, c_model, c_vae, clip_vision, clip, key_b, key_c