Nodes/ComfyUI-Actual-Denoise/Actual Denoise (step)
ComfyUI Node

Actual Denoise (step)

The same trick, aimed at KSampler (Advanced)

By mozhaa·Created 7 months ago·Updated 6 months ago· 20
Actual Denoise (step)
  • model
  • scheduler
  • start_at_step
  • steps
  • model
scheduler
actual_denoise1.000
steps20

If you're the type who runs KSampler (Advanced) and thinks in start_at_step / end_at_step instead of denoise, the plain Actual Denoise node is aimed a foot to your left. This is the version for you. Same problem, same fix, expressed in step numbers instead of denoise fractions: you get a consistent amount of noise when you change schedulers, without re-tuning your start step every time.

Why steps lie the same way

The underlying issue doesn't go away when you switch to the Advanced sampler. start_at_step tells KSampler where to drop in, but how much noise lives at that step is decided by the scheduler's curve. Step 6 of 20 on karras is not the same amount of noise as step 6 of 20 on exponential, and the model sees a very different starting image. If you've got a step-based img2img recipe that works on one scheduler and it quietly stops working when you swap schedulers, this is why.

Actual Denoise (step) inverts that. You set actual_denoise - "start at X% of maximum noise" - plus your steps, and it returns the start_at_step that lands on that exact noise for the scheduler you've chosen. Under the hood it's the same sigma-curve lookup as the denoise version: find the step where sigma first drops below actual_denoise × max_sigma on the 1000-point schedule, then scale to your step count with start_at_step = round(idx × steps / 1000).

A nice consequence worth knowing: the mapping is computed on that fixed 1000-point curve and then rescaled, so changing steps just re-proportions start_at_step and the actual noise stays put. Steps only change how the noise is split between steps, not how much arrives at the start. The author said exactly this in the pack's discussion thread, and it's true.

Inputs and outputs that matter

  • model - your checkpoint; defines the sigma curve.
  • scheduler - one of the nine stock schedulers (simple, karras, exponential, kl_optimal, beta, etc.).
  • actual_denoise - 0 to 1, step 0.001. 1.0 means start from pure noise; lower values mean a later, gentler entry.
  • steps - your total step count, default 20.

Outputs: scheduler, start_at_step (INT), steps (INT), and model (pass-through). Wire start_at_step into KSampler (Advanced), connect the steps output to end_at_step for a full run, and drop the model in as usual.

Installing it

No dependencies, no model files - the whole pack is one small Python file that only calls ComfyUI's own sampling code. Install via ComfyUI Manager by searching "Actual Denoise", or:

cd ComfyUI/custom_nodes
git clone https://github.com/mozhaa/ComfyUI-Actual-Denoise

Restart ComfyUI. The node lives under sampling/custom_sampling/schedulers.

Gotchas

The honest limit is the same as the rest of the pack: the mapping depends on the model (sigmas come from its model_sampling), so a value tuned on SDXL won't mean the same thing on a flow-matching model. And it fixes the noise amount, not the sampler's behavior - switch euler to dpmpp_2m and the output still changes, just not because the noise jumped around. If you instead want to translate step ranges you already trust from one scheduler to another, that's what Actual Denoise Inverse (step) is for - this node is the forward direction, from "actual noise" to a concrete step.

Categorysampling/custom_sampling/schedulers

Inputs (4)

NameTypeDefaultDescription
modelMODEL
schedulerCOMBO9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3
actual_denoiseFLOAT1.0000–1
stepsINT201–10000

Outputs (4)

NameTypeDescription
schedulersimple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal
start_at_stepINT
stepsINT
modelMODEL