EthanfelandClaude Opus 4.8 bc6f4e32ab Initial release: Lora Epoch Sweeper node
Sweep a folder of LoRA training epochs from a single queue:
- pick a step range + training-step interval, one image per epoch via list outputs
- groups multi-LoRA folders by basename, auto-picks the largest
- outputs step_label/lora_name strings for filename/labeling

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 22:57:41 +02:00

ComfyUI-Lora-Sweeper

A single ComfyUI node, Lora Epoch Sweeper, that points at a folder of LoRA training epochs (e.g. an ai-toolkit / kohya output dir where files look like my_lora_000002000.safetensors), lets you pick a step range and a training-step interval, and applies each selected epoch to your model.

Because the node emits lists, ComfyUI runs everything downstream of it once per epoch — so a single click on Queue generates one image per LoRA epoch.

Install

Clone into ComfyUI/custom_nodes/ and restart ComfyUI:

git clone https://github.com/ethanfel/ComfyUI-Lora-Sweeper ComfyUI/custom_nodes/ComfyUI-Lora-Sweeper

No extra dependencies.

The node: Lora Epoch Sweeper

Category: loaders/LoraSweeper

Inputs

Name Type Notes
model MODEL Base model each epoch is applied to.
clip CLIP (optional) Patched too if connected; otherwise model-only.
folder_path STRING Absolute path to the epoch folder. ~ is expanded; a bare name is also looked up inside the loras dir.
lora_basename STRING Which LoRA in the folder to sweep, when the folder holds several (substring of its name). Leave empty to auto-pick the LoRA with the most epochs.
start_step INT Lowest training step to include (inclusive).
end_step INT Highest step to include. 0 = no upper limit.
step_interval INT Thin the range to ~one checkpoint per this many training steps (e.g. 500). 0 = keep every epoch.
strength_model / strength_clip FLOAT LoRA strengths (same as the stock LoRA loader).
include_base BOOLEAN Also include the final suffix-less name.safetensors.
max_count INT Hard cap on number of epochs. 0 = unlimited.

step_interval targets the multiples of the interval inside your range and snaps each to the nearest available checkpoint — so with epochs saved every 250 steps, step_interval = 500 gives the round 500, 1000, 1500, …. Odd intervals that don't divide your save schedule still return well-spaced checkpoints.

Folders with several LoRAs

One folder often contains epochs from more than one training run, e.g.:

styleA_000000250.safetensors ... styleA_000004000.safetensors   (16 epochs)
styleB_000006750.safetensors                                    (1)
styleC_000002500.safetensors                                    (1)

The node groups files by LoRA name (everything before the _<step> suffix) and only sweeps one group. Set lora_basename to pick it (e.g. styleA), or leave it empty to auto-select the group with the most epochs. An ambiguous substring raises an error listing the matches.

Outputs (all lists, one entry per epoch)

Name Type Use
model MODEL Wire to KSampler.
clip CLIP Wire to your text encoders (or ignore).
step_label STRING The step number, e.g. "2000" ("final" for the base file).
lora_name STRING Filename without extension.

Example

A LoRA with epochs saved every 250 steps from 250 to 4000:

  • start_step = 1000, end_step = 3000, step_interval = 500 → sweeps 1000, 1500, 2000, 2500, 3000.

Wire it up:

Sweeper.model  -> KSampler.model
Sweeper.clip   -> CLIPTextEncode.clip   (if you use clip)
KSampler -> VAEDecode -> SaveImage

Press Queue once → you get one image per selected epoch.

Labeling each image with its step

On the SaveImage node, right-click → Convert filename_prefix to input, then connect step_label (or lora_name) to it. Each saved file is then named after the epoch it used. (Any text/label node that accepts a STRING input works the same way, since the output is list-aware.)

Notes

  • Each epoch is a separate patched model held in memory for the run; sweeping a large number of epochs at once uses more RAM. Use step_interval / max_count to thin big sweeps.
  • Step parsing expects the kohya/ai-toolkit _<digits>.safetensors suffix. Files without a numeric suffix are treated as the "final" checkpoint.

License

MIT

S
Description
No description provided
Readme MIT
31 KiB
Languages
Python 100%