ReNoise Sampler
Edit Images (or Video) at Full Strength Without the Reconstruction Falling Apart
- latent
- model
- inv_sampler
- sampler
- sigmas
If you've ever pushed img2img denoise past ~0.6 and watched your input image come back as a wobbly distant relative of itself, you've hit the problem this node is built for. ReNoise Sampler is the ComfyUI port of ReNoise, the 2024 paper ("real image inversion through iterative noising") that got a real following because it makes high-strength edits actually hold together. It's from the same author who ported Frame Interpolation and InstanceDiffusion into ComfyUI - someone who ships research papers as usable nodes. The README shows it off on vid2vid, with Veevee + ReNoise clips.
What it actually does
To edit an image you first need to find the exact latent noise that would generate it - that's inversion. Naive inversion drifts: your input gets reconstructed wrong, and the error only grows the more you change it. ReNoise's fix is to run several "renoise" passes at each inversion step - repeatedly noising and denoising the estimate and averaging the predicted noise - then regularize that noise (autocorrelation and KL terms borrowed from pix2pix-zero) and finish with a noise-correction pass that solves for the exact per-step noise. The result is a latent that reconstructs your image properly even at denoising strengths near 1.0. That matters twice over for video: if every frame inverts differently, you get flicker, so a stable inversion is the difference between a smooth restyle and a strobe light.
The node doesn't generate anything by itself. It builds two custom samplers and a sigma schedule and hands them to you:
inv_sampler(SAMPLER) - run the inversion pass with this.sampler(SAMPLER) - run the actual denoise/generation pass with this.sigmas(SIGMAS) - feed into aSamplerCustom.
You wire all three into SamplerCustom nodes, which is why the pack's example workflow lives entirely on SamplerCustom rather than the normal KSampler.
The inputs you'll actually touch
There are a lot of knobs here, but the pack ships sane defaults and you mostly need these:
modelandlatent- your checkpoint and the VAE-encoded input image. Use the patched model fromReNoiseModelSamplingPredfor the inversion side (see that node's article - it's required, not optional).inversion_strength(default 0.3) - effectively your edit strength. The whole selling point is that you can push this toward 1.0 where ordinary img2img falls apart.inversion_steps(default 4) - the paper's trick is that you don't need hundreds of DDIM inversion steps; a handful of careful ones do the job. 4 is a good place to start.renoise_steps(default 9) - how many noising passes per step, the "iterative" in the name. More = better reconstruction, slower.noise_seed- seeds the noise list used through inversion; same seed, same reconstruction.scheduler- one of the nine standard ComfyUI schedules (normal, karras, exponential, …).sampleris locked toeuler_ancestral, and that's intentional: ReNoise is built around the ancestral Euler step.
The rest - avg_latent_estimations and the four avg_*_start/end windows, plus the noise_reg_* autocorrelation/KL regularization knobs and perform_noise_correction (leave that on) - are the paper's tuning internals exposed raw. Defaults are sensible; touch them only if you're chasing a specific artifact.
Installing it
The README's only hard requirement beyond ComfyUI itself is diffusers, which ComfyUI core doesn't bundle:
python -m pip install diffusers
Then install the pack via ComfyUI Manager (search "ReNoise") or:
cd ComfyUI/custom_nodes
git clone https://github.com/logtd/ComfyUI-ReNoise
Restart ComfyUI, and load the example workflow from the repo's example_workflows folder to see the full graph.
Gotchas
- Nodes fail to load → diffusers isn't installed in ComfyUI's Python environment. That import error is the #1 report for this pack.
pip install diffusersfixes it. - It's WIP and old. Marked WIP in the README, last touched in 2024, and the source hardcodes a single CUDA GPU at fp16 (
cuda:0, float16 latents). Built for the SD 1.5/SDXL era. If you're on newer architectures or Apple Silicon, expect rough edges. - "Why is my edit so subtle?" - you left
inversion_strengthat its 0.3 default. That's the dial that determines how much actually changes; the node just makes the high end survivable.
Reach for this when you want big, clean img2img restyles or per-frame video edits that don't shimmer. It's fiddly and unpolished - but it's one of the few ComfyUI paths to full-strength edits that don't destroy your input.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| scheduler | COMBO | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 | |
| sampler | COMBO | 1 options: euler_ancestral | |
| noise_seed | INT | 00–18446744073709550000 | — |
| inversion_strength | FLOAT | 0.300–1 | — |
| inversion_steps | INT | 41–10000 | — |
| renoise_steps | INT | 90–10000 | — |
| avg_latent_estimations | BOOLEAN | true | — |
| avg_first_step_start | INT | 00–10000 | — |
| avg_first_step_end | INT | 50–10000 | — |
| avg_step_start | INT | 80–10000 | — |
| avg_step_end | INT | 100–10000 | — |
| noise_reg_lambda_ac | FLOAT | 20.00–1000 | — |
| noise_reg_lambda_kl | FLOAT | 0.070–1000 | — |
| noise_reg_steps | INT | 40–10000 | — |
| noise_reg_ac_rolls | INT | 50–10000 | — |
| perform_noise_correction | BOOLEAN | true | — |
| latent | LATENT | — | |
| model | MODEL | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| inv_sampler | SAMPLER | — |
| sampler | SAMPLER | — |
| sigmas | SIGMAS | — |