Sampler SPEED (Spectral Progressive Diffusion)
Start small, finish sharp — SPEED's progressive-resolution sampler
- SAMPLER
Most of the time you spend in ComfyUI isn't thinking - it's watching the progress bar crawl. SPEED attacks that from a different angle than every speedup you've seen before: no distilled checkpoint, no LoRA, no torch.compile. Just a smarter way to run the denoiser you already have.
Sampler SPEED (the class is SamplerSPEED) is a community port of Spectral Progressive Diffusion, a paper by Howard Xiao et al. The idea: diffusion models waste a lot of compute in the early steps, when the output is still a blurry blob of noise and no one can tell whether it's 512×512 or 64×64. So SPEED starts the latent at a fraction of full resolution, denoises there while the image is finding its composition, then "expands" the latent up and keeps going at full detail. The speedup comes from doing the cheap early steps at small resolution.
How it actually works
The node wraps any ComfyUI k-diffusion sampler (euler by default) and segments the denoising schedule. It starts by DCT-truncating the incoming latent down to the smallest entry in scales, runs the base sampler on that coarse latent, and at each transition point expands the latent in the spectral domain - DCT by default, with DWT and FFT as alternatives - then aligns the timestep so the next segment continues as if nothing happened.
The spectral part is the trick. Naively upscaling a latent mid-denoise (say, with bicubic) smears the low-frequency structure that the model already committed to. Transforming to a spectral basis and padding the high-frequency coefficients preserves that structure, which is why the quality doesn't just fall off a cliff. One honest tradeoff, straight from the author's tooltip: because the schedule is segmented, multistep solvers restart at each SPEED transition. Stick with euler unless you have a reason not to.
This is not distillation - no training happens, no new weights appear. That's why it technically works with any model; the author only tested it on Anima (the README's benchmark shows ~1.3x on FLUX, and the reddit thread reported up to ~1.8x). Just keep expectations realistic: the author calls it "vibecoded," and official code wasn't out when this shipped.
The inputs that matter
There are nine of them, and a beginner realistically touches four:
scales- the resolution ladder, comma-separated and ending in1.0. Default0.5,1.0;0.25,0.5,1.0saves more time but risks more drift.mode/model_preset/delta- together these control when transitions happen.delta_optimal(default) computes transition timings automatically from the model's power spectrum; presets exist forfluxandwan21, withcustomfor anything else. Smallerdeltadelays transitions; it's the main quality-vs-speed knob.base_sampler- the underlying ODE solver (eulerdefault).transform- the spectral basis. DCT accepts any ratio; DWT requires consecutive scales to differ by exactly 2×; FFT accepts anything.
The output is a single SAMPLER, which you wire into a SamplerCustomAdvanced node. That's the whole graph change.
Installing it
Either search "ComfyUI-SPEED" in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/ruwwww/ComfyUI-SPEED
Then restart ComfyUI. There's no requirements.txt - it only needs numpy, torch, and scipy, which ComfyUI's embedded Python already ships. No model downloads, no API keys, no heavy dependencies.
Where people get burned
The author's own launch thread (121 upvotes) is refreshingly honest: it can produce artifacts and semantic drift on some outputs. Before you trust a prompt's result, generate the same seed with plain euler and compare - that's also the only real way to measure whether the speedup is worth it for your model.
A few things worth knowing:
torch.compiledidn't help - the author measured it making sampling slower. Skip it.- If the node doesn't show up after installing, update ComfyUI first: this pack uses the newer
comfy_apinode-definition API, and older builds won't register it. - In
manualmode,manual_sigmasmust be strictly decreasing and one entry per transition (so forscales=0.25,0.5,1.0, you supply two thresholds like0.95,0.85). - The
fluxandwan21presets are measured for those architectures. For an SDXL or SD 1.5 model, usecustomwith the paper's A/β values or just go manual.
Right now this is an experiment you try on a Friday, not the thing you rebuild your pipeline around. But it's a genuinely different idea - same model, same steps, less wasted compute - and worth a side-by-side before you dismiss it.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| base_sampler | COMBO | euler | Underlying ODE solver. Any comfy k_diffusion sampler is supported. Multistep solvers restart at each SPEED transition because we segment the schedule. |
| transform | COMBO | dct | Spectral basis used at each transition. DCT (default) supports any scale ratio; DWT requires consecutive scales to differ by exactly 2x; FFT accepts any ratio. |
| mode | COMBO | delta_optimal | `delta_optimal` computes transitions from `scales`, `delta`, and the selected power-spectrum preset. `manual` uses user-specified sigma thresholds. |
| model_preset | COMBO | flux | Power-spectrum preset for delta-optimal mode. `flux` and `wan21` use measured (A, beta). `custom` uses the manual A / beta inputs below. |
| scales | STRING | 0.5,1.0 | Comma-separated resolution fractions ending at 1.0. Used in delta_optimal mode. Example: `0.5,1.0` or `0.25,0.5,1.0`. |
| delta | FLOAT | 0.0100.0001–0.5 | Noise-dominated tolerance. Smaller values transition later. |
| manual_sigmas | STRING | 0.85 | Comma-separated sigma thresholds, one per transition (length S-1 to match `scales`). Used in `manual` mode. Example for scales=`0.25,0.5,1.0`: `0.95,0.85`. |
| spectrum_A | FLOAT | 203.6150–1000000 | Power-spectrum amplitude A (used when model_preset=custom). |
| spectrum_beta | FLOAT | 1.9150–10 | Power-spectrum decay exponent beta (used when model_preset=custom). |
| seed | INT | 00–2147483647 | Seed for the spectral-noise padding at each transition. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SAMPLER | SAMPLER | — |