115 lines
3.9 KiB
Markdown
115 lines
3.9 KiB
Markdown
|
|
# Documentation
|
|
- Class name: CheckpointLoaderSimpleShared __Inspire
|
|
- Category: InspirePack/Backend
|
|
- Output node: False
|
|
|
|
CheckpointLoaderSimpleShared节点旨在以共享方式管理模型检查点的加载和缓存。它通过在从磁盘加载检查点之前检查检查点是否已缓存,从而实现加载检查点的高效重用。该节点支持只读和覆盖模式,以适应不同的使用场景。
|
|
|
|
# Input types
|
|
## Required
|
|
- ckpt_name
|
|
- 要加载的检查点的名称。此参数对于识别要检索和加载的检查点文件至关重要。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
- key_opt
|
|
- 可用于在缓存中唯一标识检查点的可选键。这允许更灵活的缓存策略,例如在不同的键下缓存相同的检查点。
|
|
- Comfy dtype: STRING
|
|
- Python dtype: str
|
|
## Optional
|
|
- mode
|
|
- 指定缓存模式,如"只读"或"覆盖缓存",这决定了如何处理与缓存相关的检查点。
|
|
- Comfy dtype: COMBO[STRING]
|
|
- Python dtype: str
|
|
|
|
# Output types
|
|
- model
|
|
- 从检查点加载的模型。
|
|
- Comfy dtype: MODEL
|
|
- Python dtype: torch.nn.Module
|
|
- clip
|
|
- 与检查点关联的CLIP模型(如果可用)。
|
|
- Comfy dtype: CLIP
|
|
- Python dtype: torch.nn.Module
|
|
- vae
|
|
- 与检查点关联的VAE模型(如果可用)。
|
|
- Comfy dtype: VAE
|
|
- Python dtype: torch.nn.Module
|
|
- cache key
|
|
- 检查点在缓存中的键。这对后续操作的引用很有用。
|
|
- Comfy dtype: STRING
|
|
- Python dtype: str
|
|
|
|
|
|
## Usage tips
|
|
- Infra type: `CPU`
|
|
- Common nodes: unknown
|
|
|
|
|
|
## Source code
|
|
```python
|
|
class CheckpointLoaderSimpleShared(nodes.CheckpointLoaderSimple):
|
|
@classmethod
|
|
def INPUT_TYPES(s):
|
|
return {"required": {
|
|
"ckpt_name": (folder_paths.get_filename_list("checkpoints"), ),
|
|
"key_opt": ("STRING", {"multiline": False, "placeholder": "If empty, use 'ckpt_name' as the key."}),
|
|
},
|
|
"optional": {
|
|
"mode": (['Auto', 'Override Cache', 'Read Only'],),
|
|
}}
|
|
|
|
RETURN_TYPES = ("MODEL", "CLIP", "VAE", "STRING")
|
|
RETURN_NAMES = ("model", "clip", "vae", "cache key")
|
|
FUNCTION = "doit"
|
|
|
|
CATEGORY = "InspirePack/Backend"
|
|
|
|
def doit(self, ckpt_name, key_opt, mode='Auto'):
|
|
if mode == 'Read Only':
|
|
if key_opt.strip() == '':
|
|
raise Exception("[CheckpointLoaderSimpleShared] key_opt cannot be omit if mode is 'Read Only'")
|
|
key = key_opt.strip()
|
|
elif key_opt.strip() == '':
|
|
key = ckpt_name
|
|
else:
|
|
key = key_opt.strip()
|
|
|
|
if key not in cache or mode == 'Override Cache':
|
|
res = self.load_checkpoint(ckpt_name)
|
|
update_cache(key, "ckpt", (False, res))
|
|
cache_kind = 'ckpt'
|
|
print(f"[Inspire Pack] CheckpointLoaderSimpleShared: Ckpt '{ckpt_name}' is cached to '{key}'.")
|
|
else:
|
|
cache_kind, (_, res) = cache[key]
|
|
print(f"[Inspire Pack] CheckpointLoaderSimpleShared: Cached ckpt '{key}' is loaded. (Loading skip)")
|
|
|
|
if cache_kind == 'ckpt':
|
|
model, clip, vae = res
|
|
elif cache_kind == 'unclip_ckpt':
|
|
model, clip, vae, _ = res
|
|
else:
|
|
raise Exception(f"[CheckpointLoaderSimpleShared] Unexpected cache_kind '{cache_kind}'")
|
|
|
|
return model, clip, vae, key
|
|
|
|
@staticmethod
|
|
def IS_CHANGED(ckpt_name, key_opt, mode='Auto'):
|
|
if mode == 'Read Only':
|
|
if key_opt.strip() == '':
|
|
raise Exception("[CheckpointLoaderSimpleShared] key_opt cannot be omit if mode is 'Read Only'")
|
|
key = key_opt.strip()
|
|
elif key_opt.strip() == '':
|
|
key = ckpt_name
|
|
else:
|
|
key = key_opt.strip()
|
|
|
|
if mode == 'Read Only':
|
|
return (None, cache_weak_hash(key))
|
|
elif mode == 'Override Cache':
|
|
return (ckpt_name, key)
|
|
|
|
return (None, cache_weak_hash(key))
|
|
|
|
```
|