Actual Denoise Inverse (step)
Turn your start_at_step into an actual noise number
- model
- scheduler
- actual_denoise
- model
Somewhere between "step 4 of 20" and "start at 30% noise" is a unit conversion nobody warns you about. If you've got a step-based img2img recipe - say, start at step 6 of 20 for a light touch - it's tuned to one scheduler's curve, and the moment you switch schedulers that step number means a different amount of actual noise. Actual Denoise Inverse (step) is the converter: given your step range, it tells you what fraction of the maximum noise that start actually corresponds to on the scheduler you're using.
How it works
The math is one read on a sigma curve. It takes start_at_step / steps as a fraction of the trajectory, looks up the sigma at that fraction on the chosen scheduler's 1000-point schedule, and returns sigma_at_fraction / max_sigma as actual_denoise. Start at step 0 and you get 1.0 (full noise). Start at the final step and you get ~0 (no change at all). Everything between is the honest answer to "how aggressive is this entry, really?"
It's the exact inverse of Actual Denoise (step), which takes an actual_denoise and produces a start_at_step. Together they form the step-flavored version of the pack's chained workflow: run this node with the scheduler you've already tuned on and your familiar step range, feed the resulting actual_denoise into Actual Denoise (step) set to the scheduler you want right now, and wire its start_at_step and steps into KSampler (Advanced). You keep the step numbers you trust; only the second node's scheduler changes. It's a lot of translation nodes for one habit, but it's the difference between "tune for twenty minutes" and "change one dropdown."
Inputs and outputs that matter
model- your checkpoint; defines the sigma curve being read.scheduler- the reference scheduler. This is the curve your step habits were calibrated against, so set it to the one you actually tuned on, not the one you're switching to.start_at_step- default 0, clamped tosteps.steps- default 20.
Outputs: scheduler (pass-through), actual_denoise (FLOAT - the thing you feed into Actual Denoise (step)), and model (pass-through).
Installing it
Same zero-dependency pack as the rest: no Python packages, no model downloads. ComfyUI Manager → search "Actual Denoise" → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/mozhaa/ComfyUI-Actual-Denoise
Restart and it appears under sampling/custom_sampling/schedulers.
Gotchas
Keep the reference-scheduler logic straight: the scheduler on this node defines the translation, not the render. And remember the pack's standing caveat - the mapping is computed from your model's sigma schedule, so a value that means one thing on SDXL won't carry the same meaning to a flow-matching checkpoint. It still computes; the "actual noise" framing is just most honest on the DDPM models this pack was built around. If you never touch KSampler (Advanced), you don't need this node at all - but if you do, it's the difference between guessing your entry step and knowing it.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| start_at_step | INT | 00–10000 | — |
| steps | INT | 201–10000 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| scheduler | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal | — |
| actual_denoise | FLOAT | — |
| model | MODEL | — |