Nodes/ComfyUI Rogala Nodes/SamplerSchedulerIterator
ComfyUI Node

SamplerSchedulerIterator

Run every sampler × scheduler pair and let the queue do the work

By Rogala·Created 6 months ago·Updated 4 months ago· 20
SamplerSchedulerIterator
    • sampler_name
    • scheduler
    • external_text

    When you're comparing samplers, the workflow is always the same: render with euler/karras, write down the result, change one dropdown, render again, lose track of which cell was which. SamplerSchedulerIterator automates the whole loop. It sits in your graph, hands a sampler + scheduler pair to your KSampler, and on the next queue run hands it the next pair - cartesian product style - then stops the queue when it runs out. Set it once, queue it, come back to a full comparison grid.

    It's from the ComfyUI-rogala pack (the author's first node, and the one that started the whole pack). The iteration isn't limited to samplers, either: because it's just sampler × scheduler, you're really testing how each sampler behaves under each noise schedule, which is the comparison that actually matters on a new model checkpoint.

    How it works

    The node has no input pins - its whole state lives in two JSON files under custom_nodes/ComfyUI-rogala/config/:

    • sampler_scheduler.json - a reference list of every sampler and scheduler your ComfyUI build knows about. Generated, do not edit.
    • sampler_scheduler_user.json - your list, the combinations you actually want to test. This is the one you edit.

    Each run emits one pair, increments a counter (the node title updates live: Iterator: Step 3 / 12), and after the last combination the queue stops on its own. The counter lives in a small JS widget, and an IS_CHANGED hook makes sure the sampler actually re-runs instead of being cached as "unchanged" - that's the kind of detail that makes or breaks an iterator node.

    Configure your test set by editing sampler_scheduler_user.json:

    {
        "samplers": ["euler", "dpmpp_2m", "dpmpp_3m_sde"],
        "schedulers": ["karras", "simple"]
    }
    

    That's 3 × 2 = 6 runs. Copy exact sampler names from sampler_scheduler.json - unknown names are silently ignored, no error, just a skipped combination.

    Outputs

    Three pins: sampler_name (a SAMPLER value, connect to your KSampler's sampler_name), scheduler (SCHEDULER, connect to scheduler), and external_text - a string like "euler | karras" designed to feed AlignedTextOverlayImages or AlignedTextOverlayVideo from the same pack. That's the label-on-every-grid-cell trick: the overlay node burns the current pair onto each output so your comparison images are self-documenting.

    Installing it

    Part of ComfyUI-rogala:

    cd ComfyUI/custom_nodes
    git clone https://github.com/rogala/ComfyUI-rogala
    

    Restart, look under rogala → Samplers → Sampler Scheduler Iterator. ComfyUI Manager works too - search "rogala". No dependencies.

    Where people get burned

    Press Refresh before first use. The README hammers this: the Refresh button reads all installed samplers and schedulers from your live ComfyUI and writes the reference file, and it resets the counter to 0. Skip it and the node has nothing to resolve names against. Second gotcha: the counter is per-node and only resets via Refresh - if your grid run got interrupted partway, you'll want to refresh to start clean rather than counting runs manually. And remember unknown names fail silently; typo a sampler and you'll get six "identical" outputs and no error message to explain why. That silent-skip behavior is the one thing I'd change about the node, but once you know it's there, a quick copy-paste from the generated JSON avoids the whole class of bug.

    Categoryrogala/Samplers

    Inputs (0)

    No inputs

    Outputs (3)

    NameTypeDescription
    sampler_nameeuler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2
    schedulersimple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal
    external_textSTRING