ComfyUI Node

FSampler

Richardson extrapolation to skip steps without wrecking the image

By obisin·Created 11 months ago·Updated 6 months ago· 132
FSampler
  • model
  • positive
  • negative
  • latent_image
  • LATENT
seed0
steps25
cfg1.00
schedulersimple
samplereuler
skip_modenone
add_noise0.00
denoise1.00
verbosefalse

Here's the honest version of what FSampler does: it patches your model so that during sampling it skips some denoising steps and mathematically predicts what they would have produced, using the history of previous steps. The math is finite-difference extrapolation - the "F" in the name - and the pitch is that you get most of the quality of a full-step run at a fraction of the time. In an era where the community keeps asking how to squeeze renders down, this is that impulse turned into a node.

It's a MODEL node, not a sampler: it takes your diffusion model and returns a patched model, which you then feed to a normal KSampler. If it reminds you of the "skip step" tricks floating around image and video workflows, you've got the right mental model.

How it works

The node attaches an extrapolation hook to the model. As the sampler runs, it maintains a history buffer of the last few model outputs; when a step is marked to skip, instead of running the denoiser it extrapolates the next state from that history. Two things control the quality:

  • extrapolation_mode - linear keeps 2 steps of history (fast, good for standard schedules); quadratic keeps 3 (smoother, better on non-linear schedules). Linear is the recommended default.
  • skip_strategy - conservative runs N-1 steps and skips 1; aggressive runs 1 and skips N-1. The tooltips are blunt: conservative for images at 15–50 steps, aggressive for audio/video where you have 1000+ steps and each one is expensive. This is the single most important choice you make.

The inputs that matter

Beyond those two, you get skip_interval (2–100) and the two safety rails:

  • skip_interval - in conservative mode, 3 means "run 2, skip 1"; in aggressive mode, 5 means "run 1, skip 4." High intervals on low step counts cause artifacts - that's the warning on the input, and it's real.
  • start_percentage (default 0.1) - wait until this % of generation is done before skipping. The first 10% sets the composition; skipping there burns you.
  • end_percentage (default 0.9) - stop skipping after this %. The tail renders fine detail, and you want real steps there, not guesses.

So the defaults already protect both ends of the trajectory. The node's whole design philosophy is "skip the boring middle, compute the edges."

The gotcha

This is a speed heuristic, not a free lunch. The safe operating envelope is exactly what the tooltips describe: conservative + interval 2 + 15–50 image steps, or aggressive on very long audio/video runs where one skipped step is a rounding error in the total. Crank skip_interval on a 10-step turbo render and you'll get exactly the artifacts it warns about. Use it to shave time off a long render you've already validated, not to discover whether your seed is good - the savings aren't worth the interpretation headache at draft stage.

Installing

FSampler is part of MD Nodes:

cd path/to/ComfyUI/custom_nodes
git clone https://github.com/MDMAchine/ComfyUI_MD_Nodes.git
cd ComfyUI_MD_Nodes && pip install -r requirements.txt

Or via ComfyUI Manager (search MD Nodes), then restart. The pack's requirements are heavy - audio libraries, matplotlib, pynvml, Ollama clients - so even a pure-optimization user pays the full install tax.

Bottom line: it's a legitimately clever idea (Richardson extrapolation is real numerical-analysis machinery) wrapped in a conservative/default-safety package. Reach for it on long renders you're tired of waiting on; respect the step-count guidance; and don't expect magic on low-step workflows.

Categorysampling/custom_sampling

Inputs (13)

NameTypeDefaultDescription
modelMODEL
positiveCONDITIONING
negativeCONDITIONING
latent_imageLATENT
seedINT00–18446744073709550000
stepsINT251–150
cfgFLOAT1.000–100
schedulerCOMBOsimple19 options: simple, normal, sgm_uniform, ddim_uniform, beta, linear_quadratic, +13
samplerCOMBOeuler11 options: euler, res_2m, res_2s, ddim, dpmpp_2m, dpmpp_2s, +5
skip_modeCOMBOnone11 options: none, h2/s2, h2/s3, h2/s4, h2/s5, h3/s3, +5
add_noiseFLOAT0.000–1Ancestral noise ratio (eta). 0.0 = ODE (no noise), >0 enables ancestral noise with dynamic sigma_up each step. Noise type is fixed to gaussian in this simple node.
denoiseFLOAT1.000–1Denoise fraction (KSampler-style). 1.0 = full schedule; <1.0 samples the last portion of the schedule only.
verboseBOOLEANfalse

Outputs (1)

NameTypeDescription
LATENTLATENT