Nodes/ComfyUI-VariationLab/VariationLab: Step Explorer
ComfyUI Node

VariationLab: Step Explorer

How many steps does your model actually need?

By Legorobotdude·Created about a year ago·Updated about a year ago· 1
VariationLab: Step Explorer
  • model
  • positive
  • negative
  • latent
  • vae
  • images
  • latents
seed0
steps_start5
steps_end50
step_count5
cfg7.0
sampler_nameeuler
schedulernormal
denoise1.00

Every model has a step count where it's done, and a bunch more steps where it's just pretending. VariationLab: Step Explorer (class StepExplorer) answers the question "how many steps do I actually need" by rendering a batch of images across a step range in one queue item - same seed throughout, so every frame starts from identical noise and only the step count changes. It's the fastest way to find the minimum viable steps for a prompt and stop paying for steps nobody can see.

What it does

Hook it up exactly like a KSampler: model, positive/negative conditioning, latent, VAE. Give it steps_start and steps_end plus how many points you want between them, and it builds the list with numpy.linspace(..., dtype=int) - rounded to whole steps, so with the defaults (5 to 50 over 5 points) you get 5, 16, 27, 38 and 50. The noise is prepared once from your seed, then each step count runs through ComfyUI's regular sampling loop and all the decoded frames come back stacked.

The inputs that matter:

  • steps_start / steps_end - the range (max 500).
  • step_count - how many points in between, up to 20.
  • cfg - the CFG for every variant, default 7.
  • seed - lock it so the sweep is comparable.

Outputs are images (an IMAGE batch, one frame per step count) and latents (the pre-decode batch).

Reading the results

Ground rules that'll save you confusion. On SD 1.5 and SDXL-lineage models, quality mostly plateaus around 20–30 steps depending on sampler - beyond that you're buying noise-level tweaks at real time cost. The interesting case is low-step territory: CFG and steps aren't independent, and too-high CFG at too few steps is a classic way to ruin the end of a render - the image looks fine mid-generation and falls apart at the finish. If you're testing distilled models (Turbo/Lightning/Z-Image-style), the whole game changes: those are designed for 4–8 steps at CFG 1, so keep your range small and don't expect the "more is better" curve to apply. Sweeping steps 1–100 on a model that wants 8 is mostly a waste of GPU.

Two practical notes. First, the batch output again: Preview shows one frame, Save Image writes a file per variant, and a grid/contact-sheet node is what you want for the actual side-by-side. Second, every extra step costs real time, so this node is genuinely useful as a "trim my workflow" tool - find the knee of the curve and set your production KSampler just past it. ComfyUI's built-in XY Plot can sweep steps too, with a nicer grid; this node's trade-off is that it's a single self-contained node with the seed handling baked in.

Install

ComfyUI Manager: search ComfyUI-VariationLab, install, restart. Or manually:

cd ComfyUI/custom_nodes
git clone https://github.com/Legorobotdude/ComfyUI-VariationLab
# then restart ComfyUI

Heads-up: the pack's README prints a placeholder clone URL (yourusername/...) that will fail if you copy it - use the real repo above or Manager. Dependencies are just numpy and torch, both already present in ComfyUI, so there's no pip step and nothing to download. It lands under the "VariationLab" category.

Troubleshooting

This pack swallows errors: if anything fails inside the loop, the node returns a tiny 64×64 black image and only prints the real traceback to your terminal. Black tile = read the console. If the sweep runs but a frame looks unfinished or corrupted, check the interplay - too-high CFG against too-few steps is the usual suspect, and dropping the CFG is the first thing to try rather than blaming the node.

CategoryVariationLab

Inputs (13)

NameTypeDefaultDescription
modelMODEL
positiveCONDITIONING
negativeCONDITIONING
latentLATENT
vaeVAE
seedINT00–18446744073709550000
steps_startINT51–500
steps_endINT501–500
step_countINT52–20
cfgFLOAT7.00–100
sampler_nameCOMBOeuler34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28
schedulerCOMBOnormal9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3
denoiseFLOAT1.000–1

Outputs (2)

NameTypeDescription
imagesIMAGE
latentsLATENT