Nodes/ComfyUI-Spectrum-sdxl/Calibrated Spectrum Adaptive Forecaster (SDXL) [LEGACY]
ComfyUI Node

Calibrated Spectrum Adaptive Forecaster (SDXL) [LEGACY]

The Spectrum node's honest legacy fork — migrate off it

By ruwwww·Created 6 months ago·Updated 4 months ago· 63
Calibrated Spectrum Adaptive Forecaster (SDXL) [LEGACY]
  • model
  • MODEL
w0.30
m3
lam0.10
window_size2
flex_window0.00
warmup_steps5
stop_caching_step-1
steps30
enable_calibrationtrue
calibration_strength0.50
debugfalse

This is the older sibling of the pack's main SpectrumSDXL node, and the author would like you to stop using it. Both do the same thing - patch your loaded MODEL so the sampler skips a chunk of UNet evaluations and predicts their output instead, roughly halving SDXL render time. But this one does it with an extra "calibration" step that the Spectrum paper never proposed, and the README is refreshingly blunt about why it exists: the original implementation was "vibe-coded" from scratch because the author couldn't find the official forecaster code at the time. Calibration was his own invention, bolted on to make the forecasts behave.

Once he found and ported the real forecaster (it now lives in SpectrumSDXL), this node became what it says on the tin: [LEGACY], kept around so old saved workflows don't hard-break.

What it does differently

Mechanically it's the same game: run real UNet forwards on some steps, record the output, fit a Chebyshev + ridge regression forecaster per image, and predict the skipped steps (with a w blend against a local Taylor extrapolation). The difference is the residual correction it applies on top of the forecast - a "calibration" pass that nudges predictions based on how far the last forecast missed. Interesting idea, zero grounding in the paper.

Its three extra knobs, all legacy:

  • enable_calibration (default true) - turns the residual correction on or off. Off, you're essentially running the plain forecaster, minus the faithful math.
  • calibration_strength (default 0.5) - how hard the residual correction pushes the forecast. The README's comparison grids suggest 0.5-0.8 keeps the image looking close to a normal 30-step render.
  • debug (default false) - prints per-step forecaster stats to the console. Useful when you're chasing the rainbow artifacts or latent explosions this kind of low-precision forecasting can throw.

Everything else is the same input set as SpectrumSDXL: model, w, m, lam, window_size, flex_window, warmup_steps, stop_caching_step, and steps. Output is a single MODEL to feed the KSampler.

Should you use it?

Short answer: only if a saved workflow already has it. It's the pack's least-searched node (a couple dozen impressions total), and the author explicitly says the faithful SpectrumSDXL gives "more stable and principled results." Migration is trivial - swap the node, copy your w/m/lam/window_size/warmup_steps/stop_caching_step/steps values across, and drop the calibration knobs. If you'd been relying on calibration_strength to keep output stable, use stop_caching_step (set to your KSampler total minus 3) in the new node instead - that's the principled way to protect the final detail steps.

Install

Same pack, same route as its sibling. ComfyUI Manager, search ComfyUI-Spectrum-sdxl, or:

cd ComfyUI/custom_nodes
git clone https://github.com/ruwwww/ComfyUI-Spectrum-sdxl

Restart ComfyUI. No Python dependencies beyond what ComfyUI already has, no model downloads - both nodes ship in the same repository and appear together in the node list.

Troubleshooting

The shared gotchas apply: keep steps matched to your KSampler's total or the forecast drifts; raise lam (0.3-1.0) if you see rainbow streaks or black output in fp16/fp8; and don't stack it with DMD2/LCM/Lightning LoRAs at their native 4-8 step counts, where there aren't enough steps to skip and the cache overhead can make things slower than a plain run. If output looks softened at the end, that's forecasting through the refinement tail - the calibration knobs were your band-aid for it, and stop_caching_step in the current node is the proper fix.

One last thing worth knowing before you inherit this node from an old workflow: it predates the fix in the README where the author admits the whole approach was non-faithful. Treat its results as "vibe, calibrated," not as Spectrum. The real thing is one node away.

Categorysampling

Inputs (12)

NameTypeDefaultDescription
modelMODELLEGACY: This node is non-faithful and uses 'vibe-coded' logic. Please use the 'SpectrumSDXL' if you want a faithful implementation.
wFLOAT0.300–1Blending weight between predicted (Chebyshev) and local (Taylor) features. Lower (0.3-0.5) preserves sharpness, higher relies on global smoothing.
mINT31–8Number of Chebyshev basis functions (forecast complexity). Lower values (3-4) are more stable for SDXL.
lamFLOAT0.100–2Ridge regularization strength. Prevents latent explosions and rainbow artifacts in low-precision modes.
window_sizeINT21–10Initial forecasting window size (number of skipped steps).
flex_windowFLOAT0.000–2Increment added to window size after each actual UNet pass. Higher = aggressive acceleration.
warmup_stepsINT50–20Initial full-model steps before forecasting begins. Gives the model time to establish composition.
stop_caching_stepINT-1-1–100The exact step where Spectrum stops and returns to native UNet. Essential for final detail recovery. Set to Total Steps - 3.
stepsINT3010–500Match this value with your KSampler total steps for stable forecast accuracy and drift reduction.
enable_calibrationBOOLEANtrueLEGACY: Applies residual correction to forecasts. Not part of the official algorithm.
calibration_strengthFLOAT0.500–1LEGACY: Strength of the residual blending.
debugBOOLEANfalsePrint detailed stats to the console for debugging.

Outputs (1)

NameTypeDescription
MODELMODEL