Spectrum Forecast
25 sampling steps for the price of 13 transformer passes
- model
- model
Every sampler step runs the entire denoiser, which is why a 30-step run of a 20B model feels like a coffee break. Spectrum Forecast patches the model so only some steps actually run it; the rest are forecast from the steps that did, so a 25-step run pays for roughly 13 full passes.
That sounds like TeaCache, and it isn't: caching speedups reuse output from similar steps and mostly hope, while this fits a curve over the steps you did run and evaluates a cheap polynomial instead of a transformer. No extra weights, no distilled checkpoint - and no benefit until you tune two numbers.
Where the forecast happens
On the architectures the pack has hooks for - MOSS-Image, FLUX.1, Fibo 2, Qwen-Image, Wan, MiniMax H3 - it patches every transformer block via ComfyUI's dit block patches. On a full step every block runs and the node keeps a copy of the last block's output feature; on a forecast step every block is skipped and that feature is written into the last block's slot from a fit, so only the output head does any work.
The fit is the interesting part: a ridge-regularised Chebyshev polynomial over the most recent full steps - 8 by default - evaluated at the current step's coordinate. Pick the coordinate (step, sigma, log-snr), the degree (4 is the sweet spot; 2 smoother, 6 follows closer) and the ridge weight (0.1; 0 fits the sampled steps exactly and lets the curve wobble).
On any other model, or with target set to model output, it forecasts the model's whole prediction instead - the cheaper, dumber version generic Spectrum ports got known for, and for the quality it costs. Leave block output where it is unless the node says it found no block hooks.
The three numbers that decide quality
start_percent(0.3) - everything before this runs in full. It's your warm-up: composition is being decided here, and a forecast in the first steps is how you get a mangled image out the other end.end_percent(0.95) - everything after it runs in full. Keep that last step real. Late-step forecast bias shows softer micro-detail rather than anything obviously broken, which is the failure you stare at for ten minutes. Images looking plastic at default? Try 0.9.interval(2) andgrowth(2) - the spacing of full passes.intervalis the gap at the edges;growthis how much it widens per full run;tapernarrows it back toward the end. Growth 2 on 25 steps gives 13 full passes, growth 1 gives 14, growth 0 gives 17.
The optional group is for when something's wrong, not before. tolerance cross-checks each forecast against a straight-line estimate and runs the step in full if they disagree by more than your setting (0.1 = 10%); at 0 it never checks. history is how many full steps the fit remembers.
Install
Same install as everything else in the pack.
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
ComfyUI Manager → WAS Node Suite v3 is the recommended route. Needs ComfyUI 0.14.0+ and Python 3.10+, and installs no packages, now or on later starts - the old advice about this pack's requirements fighting your ComfyUI belongs to v2.
Wire it as Load Diffusion Model → LoRA stack → Spectrum Forecast → sampler: MODEL in, MODEL out, one output. If you also want the texture back, chain Adaptive Detail from the same pack after it - they were built to sit in that order, and the pack ships a demo workflow doing exactly that on a 25-step euler / sgm_uniform run at CFG 3.
What goes wrong
Runs under ten steps get nothing. Below ten steps every step runs in full and the node says so, so your 4-step Turbo or 8-step Lightning chain isn't the use case - there's nothing to fit with barely any points, and speed LoRAs change exactly the dynamics this method reads.
Samplers that evaluate the model twice per step defeat it. On detecting a second call at the same sigma, every step runs in full and the report notes "the sampler calls the model twice a step; all ran in full." Use euler and friends.
Watch the run report, not just the picture. It publishes a per-run summary: an F/. pattern of which steps ran full, how many times fewer passes you got, and mean/worst forecast error. Climbing error means you're forecasting too much; a ratio of 1.0x means nothing was forecast.
Not every model is a good fit. A model whose blocks don't run in the order the pack expects logs "this model's blocks did not run as listed; every step runs in full" and quietly does nothing. A model missing from that hook table falls back to output-level forecasting - usable, but you'll see the loss in fine texture first.
It's cheap to A/B: same seed, same prompt, one run with the node bypassed. If you can't see the difference at viewing size, you're paying for a curve fit you don't need.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | The diffusion model to sample, after any LoRAs and patches. | |
| start_percent | FLOAT | 0.300–1 | Sampling percent where forecasting starts. Every step before it runs in full: 0.3 is the first 8 of 25 steps, 0.2 the first 5. |
| end_percent | FLOAT | 0.950–1 | Sampling percent where forecasting ends. Every step after it runs in full: 0.95 is the last of 25 steps, 1.0 forecasts to the end. |
| interval | FLOAT | 2.001–8 | Steps from one full run to the next where the window starts, and where it ends when tapering: 2 runs every other step. |
| growth | FLOAT | 2.000–8 | Steps added to the interval after each full run: 2.0 runs 13 of 25 steps in full, 1.0 runs 14, 0 keeps the interval fixed and runs 17. |
| taper | BOOLEAN | true | On, the interval widens toward the middle of the window and narrows again toward end_percent. Off, it widens all the way to end_percent. |
| toleranceopt | FLOAT | 0.000–1 | How far the curved and the straight-line forecasts of a step may disagree before it runs in full instead: 0.1 for 10%. 0 never checks. |
| targetopt | COMBO | block output | What is forecast: block output, the last block's output; block residual, its change over the step's own input; model output, the whole prediction. |
| coordinateopt | COMBO | step | What the fit runs over: `step` for the step number, `sigma` for the noise level, `log-snr` for the log signal-to-noise ratio. |
| degreeopt | INT | 41–8 | Highest Chebyshev degree of the fit: 4; 2 is smoother, 6 follows more closely. |
| ridgeopt | FLOAT | 0.100–10 | Ridge weight of the fit: 0.1; 0 fits the full steps exactly, 1 smooths more. |
| historyopt | INT | 83–64 | Most recent full steps the fit is taken over: 8; fewer uses less memory. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | The model, sampling with forecast steps. Connect it to the sampler. |