FreeU v2
A free quality boost — if your model still likes FreeU
- model_shifts
FreeU is one of those rare things in the diffusion world: a genuine free lunch. No extra model, no extra pass, no bigger latent - just a patch to the UNet that makes many images sharper and more detailed at no real cost. Sage's FreeU v2 node doesn't reinvent that, and it doesn't even apply it directly. It packages the settings into a model_shifts bundle that the pack's loader applies for you.
The catch, and it's a real one: FreeU was tuned for the SD 1.5/SDXL generation of models. The community's enthusiasm never died - FreeU still gets discussed by the thousands of posts a month - but the newer flow-matching architectures (Flux, Z-Image, and friends) largely ignore it or actively dislike it. So think of this as a tool for the older checkpoint you still love, not a universal "make everything better" button.
How it works
Under the hood this is the ComfyUI FreeU_V2 parameters you already know, just relocated. The node takes five settings - freeu_v2 (master on/off), b1, b2, s1, s2 - and returns them as a model_shifts bundle. When you feed that bundle into Sage's Load Models (Sage_LoadModelFromInfo), the loader sees the FreeU settings and patches the UNet with them before sampling begins. The mechanism is the standard FreeU trick: it amplifies the backbone features while damping the skip-connection features in the early and middle UNet stages, which recovers detail the model would otherwise smear.
The inputs that matter
There are five, and only two are worth touching at first:
freeu_v2- the enable switch. This is what you actually flip on and off when you're A/B testing whether FreeU helps a given checkpoint.b1/b2- backbone scales (defaults 1.3 / 1.4). These amplify the main UNet path.s1/s2- skip scales (defaults 0.9 / 0.2). These damp the skip connections.
The defaults are the stock FreeU v2 values, and for SD 1.5/SDXL they're a fine starting point. If you find the image overcooked - too much contrast or weird halos - lower b1/b2 toward 1.0 before you touch anything else. The single output, model_shifts, wires into the model_shifts input on the Load Models node.
Wiring it up
The full chain looks like:
Sage_FreeU2 ──model_shifts──▶ Sage_LoadModelFromInfo ──model/clip/vae──▶ sampler
If you also want a timestep shift on the same model, the pack's Model Shifts node combines both in one dropdown - this node is the FreeU-only slice of that.
Installing
Same as every Sage Utils node:
cd ComfyUI/custom_nodes
git clone https://github.com/arcum42/ComfyUI_SageUtils.git
cd ComfyUI_SageUtils && pip install -r requirements.txt
Then restart ComfyUI, or grab "Sage Utils" from ComfyUI Manager. No models to download - FreeU is pure code.
Where people get burned
Two traps. First, forgetting the master switch: freeu_v2 defaults to false, and the bundle still flows through the loader. If you set all the b/s values and see nothing change, check the enable toggle - that's the most common "it's broken" report for this node. Second, the model-shift architecture mismatch: if you're running a distilled flow-matching model, FreeU can hurt more than help, so test it per-checkpoint rather than assuming. When it works, it's free quality; when it doesn't, one toggle and it's out of the way.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| freeu_v2 | BOOLEAN | false | Enable FreeU v2 adjustments. |
| b1 | FLOAT | 1.300–10 | FreeU v2 b1 parameter. |
| b2 | FLOAT | 1.400–10 | FreeU v2 b2 parameter. |
| s1 | FLOAT | 0.900–10 | FreeU v2 s1 parameter. |
| s2 | FLOAT | 0.200–10 | FreeU v2 s2 parameter. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model_shifts | MODEL_SHIFTS | FreeU v2 model settings output for the loader. |