SPEED Sampler
Most of the image, most of the steps, at half the price
- SAMPLER
SPEED stands for Spectral Progressive Diffusion, and the pitch is simple: a diffusion model doesn't need to think at full resolution while the image is still noise soup. Sample the early steps on a small latent, then grow it partway through - so the expensive high-res compute only happens once there's actually fine detail to resolve. Community implementations of the technique were claiming around 1.8x speedups on flow-matching models in 2026, and WAS Node Suite v3 ships a proper, polished version of it as a node. It's a genuinely good trick and one of the more interesting samplers to land in a while.
How it works
WASSpeedSampler is a sampler node - it doesn't take a latent or a model, it outputs a SAMPLER that you feed into the SAMPLER socket of SamplerCustom. You give it a scales list like 0.5,1.0 (the default): sample at half resolution, then grow once to full. The "spectral" part is the point. When the latent grows, the detail isn't just bilinearly stretched - it's grown in a spectral basis (a DCT by default; FFT and DWT are options too) so the frequencies that newly appear are actually resolved rather than interpolated mush. DWT is cheaper but can only double, so every step in your scales list has to be exactly twice the last; DCT and FFT accept any ratio.
When to grow is scheduled from the model's power spectrum, P(ω) = A · ω^−β. That's what amplitude and beta mean, and the defaults (203.6 and 1.915) are FLUX.1-dev's measured values - Wan 2.1 T2V has its own preset in the code. delta is how much leftover noise counts as "burying" a frequency: bigger delta holds the small grid longer and saves more, but leaves less of the schedule to resolve detail in. The default is deliberately conservative, growing after about a sixth of the steps.
The settings that matter
Only a couple of knobs need touching for a first run:
- scales - the resolution ladder, ending in
1.0. A single1.0disables growth entirely and samples normally, which is a handy way to A/B against plain sampling with the same seed. - delta - how aggressive the downsampling phase is. Start at the default and nudge up only if you want more savings.
- amplitude / beta - ideally measured, not guessed. Encode real content through the model's VAE and fit them with the pack's Latent Power Spectrum node; a measured A runs larger than a published one, so take both from the same place.
manual_sigmasoverrides all three if you want to pick growth points by hand. - seed - seeds the noise that fills the frequencies each transition adds. Changing it varies fine detail without moving the composition.
Where people get burned
The big one: this needs a flow-matching model. FLUX, Wan, Anima and friends qualify; SD1.5/SDXL-class epsilon samplers do not, and won't behave. Second, this is a fast sampler, not a free one - the technique is known to occasionally drift semantics or throw artifacts on some outputs, so eyeball your first batch before you trust it for a production run. And stateful solvers (ones that carry state between steps) restart that state at every resolution transition, so the simple solvers like euler behave most predictably here - that's why it's the default.
Installing it
Part of WAS Node Suite v3 (WASasquatch's was-node-suite-comfyui, MIT). Search "WAS Node Suite v3" in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
Restart ComfyUI. You need ComfyUI 0.14.0+ and Python 3.10+; the v3 suite runs on zero extra pip dependencies, so there's nothing else to install for this node.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| base_sampler | COMBO | euler | The solver each segment runs. A solver that carries state between steps starts that state again at every transition, so the simpler ones behave most predictably here. |
| scales | STRING | 0.5,1.0 | Fractions of the full resolution to sample at, increasing, ending at 1.0. `0.5,1.0` starts at half size and grows once. A single `1.0` disables growth and samples normally throughout. |
| transform | COMBO | dct | The basis the latent grows in. `dct` and `fft` handle any ratio between scales; `dwt` is cheaper but only ever doubles, so every step in the list has to be exactly twice the one before it. |
| delta | FLOAT | 0.0100.0001–0.5 | How much leftover noise counts as burying a frequency. Larger values hold the small grid for more steps, saving more but leaving less of the schedule to resolve detail in. The default is conservative: it grows after about a sixth of the steps. |
| amplitude | FLOAT | 203.6150–1000000 | The A of the model's power spectrum, eg 203.6 for FLUX.1-dev. Only meaningful alongside delta: a measured A runs larger than a published one, so take both from the same place. |
| beta | FLOAT | 1.9150–10 | How fast the model's spectrum falls away with frequency. Unlike the amplitude this is a property of the model rather than of the scale its latents happen to be in, so a measured one is directly comparable to a published one. The default belongs to FLUX.1-dev. |
| seed | INT | 00–4294967295 | Seeds the noise that fills the frequencies each transition adds. Changing it varies the fine detail without moving the composition. Any whole number; `0` is as good a seed as any. |
| manual_sigmasopt | STRING | Sigmas to grow at, one per transition, decreasing. Leave this empty to have them worked out from the amplitude and beta instead, which is the usual way round. Setting them ignores delta, amplitude and beta. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SAMPLER | SAMPLER | Feeds the SAMPLER socket of SamplerCustom. |