FreeU (Advanced Plus)
FreeU, With Every Knob Exposed
- model
- MODEL
FreeU is that rare thing in image diffusion: a free quality boost. No extra model, no training, no new weights - the 2023 paper literally calls it "Free Lunch in Diffusion U-Net." The stock ComfyUI node gives you four knobs (b1, b2, s1, s2) and nothing else. WAS_FreeU is what happens when WASasquatch - the person behind the WAS Node Suite - decides four knobs aren't enough.
You reach for it when you want detail and contrast out of an SD1.5 or SDXL checkpoint without a LoRA, and you want to decide which part of the model does the work, not take the one-size-fits-all preset.
What it actually does
Diffusion UNets process features in blocks with specific channel counts - 1280 channels and 640 channels in the big down/up-sampling stages of SD-class models. FreeU's trick is two-part: it boosts a slice of those channels (the b side, which carries detail) and it shapes the high-frequency part of the signal in Fourier space (the s side, which is where sharpness lives).
The node clones your model in memory and registers block patches on it. When those 1280/640-channel features pass through, it:
- Slices off
slice_b1/slice_b2channels (defaults 640 and 320), multiplies byb1/b2, then blends the result back in usingb1_mode/b2_modeatb1_blend/b2_blendstrength. - Runs the spectral path through a Fourier filter: FFT, shape the frequency mask with the
multiscale_modepreset (Default, Sharpen, Edge-Enhancement, Bandpass, and the "Multi-" variants), scale it bys1/s2atthresholdradius, then IFFT back.
The inputs that matter
Honestly, 90% of the value is in a few of these:
- model - feed it the output of your Load Checkpoint. It clones it, so your actual model file is untouched.
- target_block -
input_block,middle_block,output_block, orall. Output block is where FreeU does most of its visible work;allis the "just make it better" setting. - b1 / b2 - the gain on the detail slice. Higher = stronger, and where people usually tune. Community wisdom for SD1.5/SDXL: b1 around 1.0–1.2, b2 around 1.2–1.6.
- s1 / s2 - the Fourier scale, i.e. how much the frequency mask is boosted. s1 = 0.9 and s2 = 0.2 are the paper's defaults, and staying ≤ 1 keeps things sane.
- slice_b1 / slice_b2 - how many channels of the block get boosted. Leave them unless you're chasing a specific artifact.
- multiscale_mode / multiscale_strength - the frequency shaping preset and how hard it's applied.
Defaultis safe; Sharpen is a fun experiment.
Optional extras: b1_mode / b2_mode (blending modes from plain inject through stable_slerp and linear dodge), threshold (mask radius), and use_override_scales + override_scales, which lets you type your own radius, scale pairs (one per line, #, // and ! are comments) instead of using a preset.
The output is a single patched MODEL, and it wires straight into your KSampler's model input - nothing else changes in the graph.
Installing it
It ships in the FreeU_Advanced pack alongside FreeU V2 and the Flux-focused Post-CFG SHIFT node. Easiest path:
- ComfyUI Manager → Install Custom Nodes → search FreeU_Advanced → install, restart.
- Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/FreeU_Advanced
Then restart ComfyUI. There's no requirements.txt in the pack and no model to download - it's pure PyTorch (torch FFT), which you already have. This is one of those rare installs that just works. One note: the category is _for_testing, so look under the test section of the node menu if it doesn't show up in search.
Where people get burned
- Nothing visibly changes. The patches only fire on blocks with exactly 1280/640-channel features. Feed it a transformer-only architecture or a distilled model with different channel counts and it silently does nothing. Not a bug.
- Flat or washed-out output. Exotic multiscale presets can gray things out. Switch to a stable preset (
Sharpen,Pass-Through) or dropthreshold/s1/s2. - It's a quality knob, not a free pass. Push b2 too far and you get crunchy, oversharpened detail. A/B it - the whole point of the advanced version is that you can turn things down to where the stock node can't.
FreeU is a "free lunch," but the portion size is still your call.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| target_block | COMBO | Which UNet block(s) to patch. | |
| multiscale_mode | COMBO | Frequency shaping preset used by Fourier_filter. | |
| multiscale_strength | FLOAT | 1.0000–1 | Intensity of multi-scale shaping [0-1]. |
| slice_b1 | INT | 64064–1280 | Slice width (channels) affected in 1280-channel features. |
| slice_b2 | INT | 32064–640 | Slice width (channels) affected in 640-channel features. |
| b1 | FLOAT | 1.1000–10 | Gain multiplier applied to the b1 slice (1280-ch). |
| b2 | FLOAT | 1.2000–10 | Gain multiplier applied to the b2 slice (640-ch). |
| s1 | FLOAT | 0.9000–10 | Fourier scale at threshold for 1280-ch features. |
| s2 | FLOAT | 0.2000–10 | Fourier scale at threshold for 640-ch features. |
| b1_modeopt | COMBO | Blending mode for b1 path. | |
| b1_blendopt | FLOAT | 1.0000–100 | Blend strength for b1 path. |
| b2_modeopt | COMBO | Blending mode for b2 path. | |
| b2_blendopt | FLOAT | 1.0000–100 | Blend strength for b2 path. |
| thresholdopt | INT | 11–10 | Base radius for the Fourier mask. |
| use_override_scalesopt | COMBO | Enable manual override of scale presets. | |
| override_scalesopt | STRING | # OVERRIDE SCALES # Sharpen # 10, 1.5 | Custom scale lines: '<radius>, <scale>'. Comments with #,//,! |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |