Support empty uncond
Cut your render time in half (the support empty uncond trick)
- model
- MODEL
Here's a trick most people don't know: for roughly the last third of a generation, the negative prompt barely matters. The image is already locked in; the model is just polishing details. So why keep paying for the unconditional forward pass every single step? The Support empty uncond node exists to let you stop running the negative prediction partway through - and it can genuinely halve the time spent on those final steps.
The catch is the black image. If you truncate the negative conditioning and the sampler reaches a step with no uncond prediction, the CFG formula uncond + (cond - uncond) * scale has nothing to subtract against, and ComfyUI effectively multiplies your positive prediction by your CFG scale over nothing. Result: solid black output. Support empty uncond patches the model so that when it detects an empty uncond slot, it fixes the arithmetic for you. Its single input, method, gives you two ways:
- divide by CFG - divide the positive prediction by the CFG scale, exactly undoing what the CFG step is about to do.
- from cond - copy the positive prediction into the negative slot, giving CFG a reference to subtract against.
Both avoid the black frame; they differ in how the final steps behave. "from cond" keeps the guidance shape intact with a neutral negative, while "divide by CFG" is the version the README pairs with the speed-boost workflow.
To actually get the speed win you have to combine it with a conditioning range node. The README's recipe: put your negative conditioning through ComfyUI's ConditioningSetTimestepRange (menu → advanced → conditioning) and set it to end around 65%, so the negative stops generating after that point. The author suggests only using the negative conditioning cutoff for the last ~35% of the generation. Wire Support empty uncond on the same model, and the sampler stops computing the negative pass for those steps.
You need the right companion node for this pack's version, though: Conditioning set timestep from sigma (also in this pack) is the sigma-based twin of ConditioningSetTimestepRange, and it's what you'll want if you think in noise levels rather than step percentages. Same pack, so no extra install.
Two gotchas worth knowing before you wire it up. First, if you chain this node with other pre-CFG nodes, the README is explicit: use it only once, and as the last pre-CFG node in the chain - earlier nodes need a real negative to do their job. Second, this trick only saves time on workflows that actually run the unconditional pass, which means CFG above 1 on non-distilled models. On a distilled model at CFG 1 there's no uncond pass to skip, so the whole trick is moot.
Install is the pack standard: ComfyUI Manager → search pre_cfg_comfy_nodes_for_ComfyUI, or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI
Restart ComfyUI. No models to download, no heavy dependencies - it's just a model patch.
It's a "free lunch" node in the best sense: same output, less compute, once you've got the range node set. Start with a short test generation and watch the step timing - the speedup is most obvious on 30-step SDXL runs.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| method | COMBO | 2 options: from cond, divide by CFG |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |