Nodes/comfyui-rapidfire/MultiModelCheckpointIterator
ComfyUI Node

MultiModelCheckpointIterator

Sweep Every Model in Your Folder, One Run at a Time

By Zeks·Created 2 years ago·Updated 11 months ago· 3
MultiModelCheckpointIterator
  • latent_image
  • LATENT
  • settings
◄used_model_count2►
◄ckpt_name1▾►
◄ckpt_name2_list►
◄ckpt_name3▾►
◄positive—►
◄negative—►
◄lora_name►
◄noise_seed0►
◄rescaled_steps8►
◄rescale_multiplier0.70►
◄total_steps_original25►
◄total_steps_shift_second0►
◄total_steps_shift_third0►
◄sampler_name▾►
◄scheduler▾►
◄starting_cfg8.0►
◄cfg_shift0.0►
◄steps_end_first15►
◄steps_shift_second0►
◄steps_end_second0►
◄steps_shift_third0►
◄token_normalization▾►
◄weight_interpretation▾►
◄detached_seedfalse►
◄detached_checkpointfalse►
◄reset_rngfalse►
◄random_checkpointfalse►
◄load_settings►

MultiModelAdvancedKsampler lets you chain three checkpoints. This is the version that automates the boring part: instead of picking a second checkpoint by hand and queueing runs, you paste a whole list of checkpoints into ckpt_name2_list and each queue run uses the next one. Model 1 and model 3 stay fixed; the middle of the chain is the sweep variable.

If you've ever found yourself manually swapping a checkpoint between every queue run while testing "which anime merge works with my base?", this node removes the hands. It's the grid-search sampler - the tool for building a model comparison sheet without touching the workflow between runs.

How it works

Same chaining machinery as the Advanced sampler: optional rescaled-CFG warm-up, model 1 samples up to steps_end_first, then the selected model 2 takes over, then model 3 finishes. The difference is the iterator. ckpt_name2_list takes one checkpoint filename per line, and on each execution the node picks the next entry (cycling with % len), holding its position in node state so the next run continues down the list. Two toggles shape the sweep:

  • detached_checkpoint - required for iterating at all; it's the switch that says "use the list, not a fixed model."
  • random_checkpoint - when on, it picks a random entry instead of sequential. There's also reset_rng to reset the iteration index back to the start.

The chosen checkpoint is baked into the settings output (serialized as ckpt_name2), so your saver records exactly which model produced each image. Note the settings output is the only model-identity signal here - unlike the "First" variant, this node doesn't expose a used_ckpt_name string, so route the settings into MultiModelPromptSaver to keep the mapping honest.

The inputs that matter

  • ckpt_name1 / ckpt_name3 - the fixed bookends of the chain (dropdowns).
  • ckpt_name2_list - one checkpoint per line; the sweep list.
  • detached_checkpoint / random_checkpoint / reset_rng - iteration behavior.
  • load_settings - replay a full configuration from a previous settings output, exactly like the Advanced node.

Outputs: LATENT (decode as usual) and settings (the serialized config for this run).

Install and the trap

Part of comfyui-rapidfire, no extra dependencies. Install via ComfyUI Manager (search "comfyui-rapidfire") or:

cd ComfyUI/custom_nodes
git clone https://github.com/Zeks/comfyui-rapidfire

then restart.

The trap: iteration state lives on the node instance. If you reload the workflow or restart ComfyUI, the index resets and your sweep starts over - and if the list changes length mid-sweep, % len silently skips or repeats. For reproducible sweep runs, either leave random_checkpoint on (order stops mattering) or plan to run the sweep in one sitting. Also remember this is a chaining sampler: if you only want to compare single models, a plain KSampler batch is the simpler tool, and this node only earns its complexity when model 2 is genuinely the middle of a three-model chain.

Categorysampling

Inputs (29)

NameTypeDefaultDescription
used_model_countINT21–3—
ckpt_name1COMBO0 options:
ckpt_name2_listSTRING—
ckpt_name3COMBO0 options:
positiveSTRING—
negativeSTRING—
lora_nameSTRING—
noise_seedINT00–18446744073709550000—
rescaled_stepsINT80–100—
rescale_multiplierFLOAT0.700–1—
total_steps_originalINT251–100—
total_steps_shift_secondINT0-50–100—
total_steps_shift_thirdINT0-50–100—
sampler_nameCOMBO44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
starting_cfgFLOAT8.00–100—
cfg_shiftFLOAT0.0-10–100—
steps_end_firstINT150–100—
steps_shift_secondINT0-20–100—
steps_end_secondINT00–100—
steps_shift_thirdINT0-20–100—
token_normalizationCOMBO4 options: none, mean, length, length+mean
weight_interpretationCOMBO5 options: comfy, A1111, compel, comfy++, down_weight
detached_seedBOOLEANfalse—
detached_checkpointBOOLEANfalse—
reset_rngBOOLEANfalse—
random_checkpointBOOLEANfalse—
latent_imageLATENT—
load_settingsoptSTRING—

Outputs (2)

NameTypeDescription
LATENTLATENT—
settingsSTRING—