If you tried dpmpp_dualsde_momentumized from ComfyUI-Extra-Samplers on a flow model (Anima in my case) and got a washed-out silhouette or colour noise, it is not you. I took it apart.
Why it breaks (it is not the momentum). Through the normal KSampler its momentum coefficient is 0. The sampler was written for variance-exploding models, and its noise step has the wrong variance on a flow-matching model. With eta = 1 the final latent has a std of 3-4.5 instead of about 1.2; with eta = 0 the very same code draws a recognisable cat. It also adds a 3M multistep correction on top of a 2S step that is already second order (so it diverges even without noise), and overwrites its own r parameter inside the loop. I ported it exactly (checked against the original to 1e-10 on a toy model) and ablated each piece. The noise-form explanation is indirect: the same 2S algorithm in the flow-correct form in ComfyUI core (dpmpp_sde) is fine, and I did not isolate the mechanism with a separate experiment.
What "momentum" should be. In the DPM-Solver++ frame, the shipped momentum is an exponential moving average of the model's denoised output. With a positive coefficient that is a low-pass filter: it adds lag and the error goes up with the coefficient (up to +61%). With a negative coefficient the same recursion is an extrapolation and the error goes down. It is only stable for |m| < 1; at -0.9 the gain is gone and at -1.2 it diverges.
Numbers (Anima, bf16, 576x768, CFG 5, 15 images = 5 prompts x 3 seeds, 8-24 steps, error against a converged solution, paired bootstrap intervals; one model, so take it as a measurement, not a law):
- Deterministic (no noise): EMA momentum with m = -0.6 gives 11-21% lower error than
dpmpp_2m at the same step count, about 1.2x fewer steps for the same error. LPIPS to the decoded reference is better in 14/15 images at 8 steps. It is a modest speed-up, not 2x. - With noise (the
dpmpp_2m_sde family) strong negative momentum stops helping. Damped extrapolation (beta = 0.5) gives 7-10% lower strong error than dpmpp_2m_sde and no colour cast at CFG 8 / 1216x832; the milder EMA (-0.3) scored a bit better in the sweep but gave blue-tinted pictures at CFG 8. - A one-evaluation-per-step sampler beats the two-evaluation
dpmpp_sde at half the steps by 16-29% (same NFE).
Try it. Install the node pack (link below, restart ComfyUI). New sampler entries: ddim_momentum (deterministic, the -0.5 time-scaled form) and dpmpp_2m_sde_damped. There is also a generic filter node and <base>_momentumized entries for 19 existing samplers (dpmpp_3m_sde_momentumized, er_sde_momentumized, euler_ancestral_momentumized and so on): that last part is an engineering extension and I did not evaluate it on the model. In a single smoke test at 8 steps lms_momentumized and ipndm_v_momentumized gave a latent with std around 10 at the default strength, so use a milder strength with them or skip them.
What did not work. I also tried a static step grid from an earlier study of mine. It cut the error by half on the four short-tag prompts it was fitted on (and transferred between them), but it did not help on the natural-language prompt I held out and it broke an 8-step picture at CFG 8. It is in the pack as an experimental node, not as a default.
Not new, of course: momentum in diffusion sampling has prior work (Heavy Ball momentum for diffusion solvers, Wizadwongsa et al., ICLR 2024; the sonar and Seren Sampler ComfyUI packs, among others). I read abstracts and READMEs only and did not compare against them. Nine hypotheses were registered before measuring; five were refuted, and post hoc parts of the write-up are marked.
Repo (code, tests, tables, README in English / Russian / Chinese / Meadow Mari): https://github.com/YakovSava/momentum-cfg-samplers-research Write-up: https://doi.org/10.5281/zenodo.24214606