Extraltodeus / ComfyUI-AutomaticCFG

If your image was a pizza and the CFG the temperature of your oven: this is a thermostat that ensures it is always cooked like you want. Also adds a 30% speed increase. For ComfyUI / StableDiffusion
https://www.patreon.com/extraltodeus
344 stars 23 forks source link
comfy comfyui comfyui-nodes generative-ai stable-diffusion

Abandon this boat and jump on this one!

If you liked other functionnalities, I've re-created most in this repository.

In short:

My own version "from scratch" of a self-rescaling CFG / anti-burn. It ain't much but it's honest work.

No more burns and 160% faster gens with the warp drive node.

Now includes custom attention modifiers and interesting presets as well as temperature scaling.

Also just tested and it works with pixart sigma.

Works with SD3 for as long as you don't use any boost feature / cutting the uncond (it's the same thing). 20 steps works nicely.

Note:

The presets are interpreted with eval(). Make sure that you thrust whoever sent a preset to you as it may be used to execute malicious code.

Update:

Usage:

77889aa6-a2f6-48bf-8cde-17c9cbfda5fa

That's it!

For 100 steps this is where the sigma are reaching 1:

image

Note: the warp drive node improves the speed a lot more. The average speed is 160% the normal one if used with the AYS scheduler (check the workflow images).

There seem to be a slight improvement in quality when using the boost with my other node CLIP Vector Sculptor text encode using the "mean" normalization option.

Just a note:

Your CFG won't be your CFG anymore. It is turned into a way to guide the CFG/final intensity/brightness/saturation. So don't hesitate to change your habits while trying!

The rest of the explaination:

While this node is connected, this will turn your sampler's CFG scale into something else. This methods works by rescaling the CFG at each step by evaluating the potential average min/max values. Aiming at a desired output intensity (by intensity I mean overall brightness/saturation/sharpness). The base intensity has been arbitrarily chosen by me and your sampler's CFG scale will make this target vary. I have set the "central" CFG at 8. Meaning that at 4 you will aim at half of the desired range while at 16 it will be doubled. This makes it feel slightly like the usual when you're around the normal values.

The CFG behavior during the sampling being automatically set for each channel makes it behave differently and therefores gives different outputs than the usual. From my observations by printing the results while testing, it seems to be going from around 16 at the beginning, to something like 4 near the middle and ends up near ~7. These values might have changed since I've done a thousand tests with different ways but that's to give you an idea, it's just me eyeballing the CLI's output.

I use the upper and lower 25% topk mean value as a reference to have some margin of manoeuver.

It makes the sampling generate overall better quality images. I get much less if not any artifacts anymore and my more creative prompts also tends to give more random, in a good way, different results.

I attribute this more random yet positive behavior to the fact that it seems to be starting high and then since it becomes lower, it self-corrects and improvise, taking advantage of the sampling process a lot more.

It is dead simple to use and made sampling more fun from my perspective :)

You will find it in the model_patches category.

TLDR: set your CFG at 8 to try it. No burned images and artifacts anymore. CFG is also a bit more sensitive because it's a proportion around 8.

Low scale like 4 also gives really nice results since your CFG is not the CFG anymore.

Updates:

Updated:

05.04.24:

15.04.24

16.04.24

17.04.24

01.05.24

03.05.24

14.05.24:

Examples

10 steps with only 2 having the negative enabled. So ~170% faster. 2.5 seconds on a RTX4070

03640UI_00001_

cherry-picked 24 steps uncond fully disabled (these images are also workflows):

03619UI_00001_

03621UI_00001_

03604UI_00001_

Pro tip:

Did you know that my first activity is to write creative model merging functions?

While the code is too much of a mess to be shared, I do expose and share my models. You can find them in this gallery! 😁


Thanks to ComfyUI for existing and making such things so simple!