Saya Lazy Checkpoint Loader
Load a checkpoint on demand — and skip the CLIP and VAE you don't need
- model
- clip
- vae
- loaded_json
A normal CheckpointLoaderSimple gives you the whole bundle whether you asked for it or not: model, CLIP, and the checkpoint's VAE, all loaded, all sitting in VRAM. SayaLazyCheckpointLoader is the version that asks first. "Lazy" here means it loads exactly one checkpoint, and only the pieces of it you tick. In a big graph that's the difference between an idle pipeline holding a couple of gigabytes of CLIP it never uses, and a pipeline that stays lean until a phase actually runs.
It's the loader at the start of each pass in the pack's six-pass image pipeline, and that context is what the design is for: every phase loads its own checkpoint, runs, and unloads when the phase completes, so a workflow that would otherwise need a 24 GB card's worth of models resident can hop between models pass by pass. But it works perfectly well standalone - if you've ever loaded a checkpoint just for its UNet and resented the CLIP that came along for the ride, this is your node.
The controls are simple and the two booleans are where the value hides:
- ckpt_name - dropdown of your
models/checkpoints. - vae_name -
none,use checkpoint VAE, or any standalone VAE you have inmodels/vae. Choosinguse checkpoint VAEis shorthand for "give me the one baked into this checkpoint." - load_clip (default on) - clear it and you get the model without any CLIP encoder loaded.
- load_checkpoint_vae (default on) - clear it and the checkpoint's VAE isn't extracted either.
Outputs are model, clip, vae, and loaded_json. Here's the subtlety that surprises people: the clip and vae outputs can be None. If you said no CLIP, the clip socket carries nothing; if you said none for the VAE and unchecked the checkpoint VAE, vae is None too. That's not a bug, it's the feature - but it means anything downstream of those sockets has to tolerate an empty input, so route them only to nodes that need them. loaded_json is a small string telling you what actually got loaded ({"checkpoint": ..., "clip_loaded": true, ...}), which is a nice sanity check when a phase misbehaves and you suspect a loader choice.
The source adds one quietly smart touch: the node's cache key includes the checkpoint and VAE files' modification time and size. Swap the file on disk and ComfyUI re-runs the loader instead of serving you the cached, now-stale model.
Troubleshooting is mostly about names. If it can't find what you picked it raises RuntimeError ("checkpoint introuvable"), so the dropdown and the file on disk must agree - mind subfolders. The loader is forgiving where it can be: it tries both URL-encoded names (the %20 junk some savers bake into workflows) and case-insensitive matches against your models/checkpoints list before giving up.
Installation is the shared pack story - Manager search saya-comfy-couple-plus, or:
cd ComfyUI/custom_nodes
git clone https://github.com/alphaziod/saya-comfy-couple-plus
then restart. Extra deps are just numpy and Pillow; torch comes from ComfyUI; nothing downloads. The README documents the couple nodes, not this pipeline machinery, and the code is explicit that it's still being refined - keep backups, and after an update fully restart so ComfyUI rebuilds the node's sockets if the port layout changed.
If you're on a card where every gigabyte counts, or you're building the phase-isolated workflow this pack is really about, the lazy loader is the difference between a graph that fits and one that OOMs on node two.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| ckpt_name | COMBO | 1 options: none | |
| vae_name | COMBO | 2 options: none, use checkpoint VAE | |
| load_clip | BOOLEAN | true | — |
| load_checkpoint_vae | BOOLEAN | true | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| clip | CLIP | — |
| vae | VAE | — |
| loaded_json | STRING | — |