FreeU V2 (PPM)
The detail-boosting hack, with more knobs
- model
- MODEL
FreeU is the free-lunch trick from 2023: reweight the U-Net's internal features at inference time and you get sharper, better-looking images for zero extra compute and zero training. No model download, no cost - just a model patch. FreeU2PPM is pamparamm's version of the V2 node, with a bunch of extra controls bolted on for people who like to actually tune the thing instead of trusting the defaults.
What it's doing
Quick mechanism, no hand-waving. A U-Net has two data paths: the "backbone" features that carry the denoising work, and the "skip connections" that shuttle high-frequency detail from the encoder to the decoder. FreeU's insight was that the skip connections were dumping in too much high-frequency noise, and gently amplifying the backbone while dialing back the skip features cleans up the result. That's the b (backbone) and s (skip) parameters you'll see everywhere.
The catch that FreeU has always had: it's model-dependent and a bit of a dark art. The "right" values for SD1.5 aren't the ones for SDXL, and the ones a checkpoint author baked in aren't necessarily best for your prompt. That's exactly why this node hands you the full knob set instead of two sliders.
The inputs that matter
There are a lot of them; here's what's actually worth touching. Defaults in parens:
- b1 (1.1) / b2 (1.2) - backbone amplification for two feature stages. The "make it pop" dials. Nudge up for more detail, but too far and you get oversaturation and fried textures.
- s1 (0.9) / s2 (0.2) - skip-connection scaling. Lower = more denoising of that high-frequency junk.
- start_percent (0) / end_percent (1) - when in the sampling run the effect applies. This is the useful bit most FreeU nodes don't give you: run it only during, say, the first 60% and let the tail sample clean.
The rest are for tinkerers: input_block / middle_block / output_block (booleans, all off by default) pick which U-Net blocks get patched, slice_b1 (640) / slice_b2 (320) control how the backbone channels are split for the boost, and threshold (optional, default 1) gates it further. Honestly, if you're new, leave those at defaults and only ever touch b1/b2/s1/s2 and the start/end percents. Output is a single patched MODEL you feed to your sampler.
Install
No dependencies or model files:
- ComfyUI Manager: search "ComfyUI-ppm", install, restart.
- Manual:
cd ComfyUI/custom_nodes && git clone https://github.com/pamparamm/ComfyUI-ppm, then restart.
Should you use it, and the gotchas
Straight talk: FreeU is a bit overhyped and it's very much a 2023/2024-era SD1.5-and-SDXL thing. On modern flow-matching models (Flux, Z-Image, Anima) it's not the move - those architectures don't have the same skip-connection behavior FreeU exploits, and the category on this node is literally _for_testing, which tells you how experimental the maintainers consider it. Note also that it's V2, using the improved V2 scaling that's less prone to the color shifts the original FreeU could cause.
Where it earns its slot: SDXL and SD1.5 workflows where you want a touch more crispness without an upscaler or a detailer pass. It's free, so it's low-risk to A/B - render with it bypassed, render with it on, keep whichever you prefer. Don't stack it on top of a checkpoint that already has FreeU-style tuning baked in; you'll double up and fry the output.
Two failure modes to watch. First, cranking b1/b2 gives you that over-sharpened, HDR-sick look - back off if faces start looking plastic. Second, the pack-wide rule applies: if the node starts erroring after you update ComfyUI-ppm, delete it from the graph and re-add it. Beyond that it's about as safe as a node gets - worst case, it does nothing you like and you bypass it.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| input_block | BOOLEAN | false | — |
| middle_block | BOOLEAN | false | — |
| output_block | BOOLEAN | false | — |
| slice_b1 | INT | 64064–1280 | — |
| slice_b2 | INT | 32064–640 | — |
| b1 | FLOAT | 1.1000–10 | — |
| b2 | FLOAT | 1.2000–10 | — |
| s1 | FLOAT | 0.9000–10 | — |
| s2 | FLOAT | 0.2000–10 | — |
| start_percent | FLOAT | 0.000–1 | — |
| end_percent | FLOAT | 1.000–1 | — |
| thresholdopt | INT | 11–10 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |