DenoiseScheduleHookProvider
Ease denoise toward a target across an iterative upscale
- PK_HOOK
Impact Pack's Iterative Upscale splits a scale factor into a series of steps and resamples at each one. Left alone, every one of those steps uses whatever fixed denoise you set on the upscaler provider. DenoiseScheduleHookProvider builds a PK_HOOK that changes that: it gradually shifts denoise from wherever the upscaler starts toward a target_denoise as the iterations progress, per the README, "gradually changes the denoise to target_denoise as the iterative-step progresses."
A PK_HOOK (Pixel-KSample Hook) is the upscale-side counterpart to a detailer's DETAILER_HOOK - a small plug-in behavior attached to an upscaler-provider node's hook slot that modifies something about each iteration as the loop runs. This one's job is denoise, specifically.
Why ramp denoise instead of holding it fixed
Early upscale steps are working from a coarser base and can usually tolerate more change; later steps are closer to the final image and a high denoise there risks drifting away from what you already built up. A common pattern is starting at a moderate denoise and easing it down toward a lower target_denoise as the passes accumulate, so the image keeps refining without the later steps overwriting what the earlier ones got right.
The inputs and output
schedule_for_iteration- currently a single choice,simple. This picks the interpolation style used to move from the current denoise totarget_denoiseacross the iteration count;simpleis the only option exposed.target_denoise(FLOAT, default 0.2, range 0–1, step 0.01) - the denoise value the schedule moves toward by the final iteration. A default this low tells you the built-in assumption: ease denoise down as the upscale progresses, landing on a light final touch rather than a heavy one.
Output is a single PK_HOOK - wire it into the hook slot of an upscaler-provider node (PixelKSampleUpscalerProvider, PixelKSampleUpscalerProviderPipe, or the tiled/masked variants). If you also want to schedule CFG or steps at the same time, build those hooks separately and merge them first with PixelKSampleHookCombine - most upscaler providers only expose one hook input.
How to install it
Ships with the Impact Pack. ComfyUI Manager: search ComfyUI Impact Pack, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Impact-Pack comfyui-impact-pack
cd comfyui-impact-pack
python -m pip install -r requirements.txt # ComfyUI's python; python_embeded on portable
then restart. No models - this is pure scheduling logic.
Common issues & troubleshooting
Denoise doesn't seem to change across iterations. Confirm the hook is actually wired into the upscaler provider node's hook input, not into Iterative Upscale itself - that top-level node doesn't take a PK_HOOK directly, only the provider feeding it does.
Want to ramp CFG or steps too. This node only touches denoise. Its siblings are CfgScheduleHookProvider for CFG and StepsScheduleHookProvider for steps - build each separately, then fuse them with PixelKSampleHookCombine before the single hook slot on your upscaler provider.
Later passes look washed out or over-smoothed. If target_denoise is too low relative to where you started, the tail end of the upscale barely changes anything and can leave earlier-pass artifacts baked in. Raise the target slightly, or reconsider whether a flat denoise would serve you better for this particular upscale.
Is this worth the setup? For most iterative upscales a fixed denoise on the provider node is simpler and fine. Reach for this hook when you're specifically seeing over-aggressive changes on later passes and want the schedule handled automatically rather than hand-tuning one static value.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| schedule_for_iteration | COMBO | 1 options: simple | |
| target_denoise | FLOAT | 0.200–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| PK_HOOK | PK_HOOK | — |