Smooth Step Lora Loader
An experimental second knob for undertrained LoRAs
- model
- clip
- MODEL
- CLIP
Every LoRA loader you've used does the same thing: take the weight delta the LoRA learned, multiply it by a strength number, add it back into the model. Turn the knob up, the effect gets stronger, trigger word and all. Smooth Step Lora Loader does that too, but it bolts on a second knob that works completely differently, and it's worth understanding why before you touch it.
The author (neph1, who posts as neph1010 on Reddit) built it out of a specific frustration: LoRA training on a 3060 takes forever, and the results are often undertrained, meaning the LoRA has picked up the concept you wanted plus a pile of noise you didn't. Ordinary strength scaling can't tell the two apart; cranking it up amplifies both equally. So they borrowed an idea from a post about cleaning up textual inversions and applied a smoothstep function to the LoRA's own weights before merging them into the model: values above the mean get pushed up, values below the mean get pushed down. The bet is that whatever the LoRA actually learned well sits above its own average weight value, and the contamination - overfit noise, unwanted correlations - sits below it and gets quietly suppressed.
Does it work? The README sets the right expectation: "I'm not sure it worked out that way... it does something, and I've had some positive results from it, even though not consistently, as it varies from seed to seed." Treat this as an experiment you run, not a fix you apply. On narrow, single-concept LoRAs it can sharpen things nicely. On a broad LoRA it can shift what gets rendered in ways that aren't predictable ahead of time - the author's own test grid, run against the fairly broad ad-detail-xl LoRA, shows the output changing shape as smooth-step strength climbs, not just intensifying.
The inputs that matter
model/clip- the same pair you'd feed any LoRA loader, straight from your checkpoint.lora_name- pick the file from yourlorasfolder, same as always.strength_model/strength_clip- the ordinary LoRA strength dials (default 1, range -10 to 10). Leavestrength_smooth_stepat its default and this node behaves exactly like a stock LoraLoader.strength_smooth_step- the new knob (default 0, range -10 to 11). Zero means the normalization is off. Push it up and the smoothstep pass kicks in on top of whatever strength you set above.
Both outputs are the standard MODEL and CLIP - wire MODEL into your sampler and CLIP into your CLIPTextEncode nodes, exactly like any other LoRA loader in the chain. It sits in the "loaders" category in the node menu, same neighborhood as CheckpointLoader and the stock LoraLoader.
As of v1.1.0 the node's been updated to handle more LoRA types, including video ones - the author specifically tested it against LTX-Video, so it's not stuck being an SDXL-only toy even though that's where it was born.
How to install it
Standard drill: search "comfyui-smooth-step-lora-loader" in ComfyUI Manager, or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/neph1/comfyui-smooth-step-lora-loader
then restart ComfyUI. No model downloads, no extra Python dependencies called out in the README - it's pure math on top of tensors you've already got loaded, so there's nothing to fetch and nothing that can go stale.
Common issues & troubleshooting
It's a one-person experimental node - set expectations accordingly. The author's own explainer thread on r/StableDiffusion pulled just three comments. That's not a knock on the idea, but there's no big community thread to search if something looks off; you're mostly working from the README and the repo issues.
Everything that trips up a normal LoRA trips this one up first. A mismatched base architecture, a missing trigger word, or strength_model set too high will bite you here exactly like they would with any LoRA loader - smooth step is a second-order tweak on a LoRA that's already loading correctly, not a fix for one that isn't. Get your baseline right with strength_smooth_step at 0 before touching the second dial, otherwise you can't tell which knob caused what.
Results won't be consistent across seeds, and that's expected, not a bug. The README says so plainly. If you crank strength_smooth_step and get a great result on one seed and a mediocre one on the next, that's the nature of the technique - run a few seeds before judging it.
There's a separate non-ComfyUI path worth knowing about but not chasing: a gist meant to be dropped into kohya_ss's sd-scripts/networks folder, for training the same normalization in rather than applying it at inference. Ignore it unless you're already deep in a kohya setup.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| lora_name | COMBO | 1 options: None | |
| strength_model | FLOAT | 1.00-10–10 | — |
| strength_clip | FLOAT | 1.00-10–10 | — |
| strength_smooth_step | FLOAT | 0.00-10–11 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |
| CLIP | CLIP | — |