AsymFlow Sampler Patch (Lakonik signal-shift)
Put your sampler steps where they actually do something — a flow-matching shift patch with no retraining
- model
- model
Every model since SD3 is trained with flow matching, and flow matching has a quirk: the schedule tells your sampler where along the noise-to-image path each step lands, and the default schedule isn't necessarily the best one for your resolution or your checkpoint. That's the knob AsymFlowSamplerPatch turns. It's a MODEL-in, MODEL-out patch - you drop it between your model loader and the KSampler, and it changes how the sampler walks the path. No retraining, no LoRA, no checkpoint surgery.
The display name says it all: "AsymFlow Sampler Patch (Lakonik signal-shift)". The AsymFlow name comes from the 2026 flow-modeling line of work on asymmetric sampling; the "signal-shift" part is the family of tricks that rescale the flow schedule around a shift parameter - the same idea behind the popular Flux "shift" nodes and the advice floating around that Wan likes a sigma shift in the 8–12 range.
How it works
Flow matching draws a near-straight line from noise to data, and a step count that used to need 30–50 on SD1.5 collapsed to 4–8 on modern models (see the flow-matching panel in the KB for the why). But which part of the path you sample densely still matters. This patch replaces the model's flow schedule with a shifted signal-ratio mapping:
r = sqrt(t / (1 - t))
sigma = r / (shift + r)
With shift = 1 you get the plain linear flow schedule. Raise shift and more steps land at high noise - the phase where global composition, pose and layout get decided. For high-resolution or Flux-like models, that's usually where you want the resolution spent. The implementation mirrors how ComfyUI's own ModelSamplingSD3/Flux nodes work: it clones your model, builds a fresh model_sampling instance from the model config, copies the prediction-type behavior over, and patches it in. The source lives in nodes/asymflow_sampler.py if you want the gory details.
The inputs
- model - the
MODELfrom any loader (DiffusionModel, UnetLoader, GGUF loader, whatever). - shift - default 3.0.
1.0= linear flow; higher = more high-noise steps. Start at 3 and A/B against your default. - multiplier - default 1000. Scales the timestep discretization. If you're on a Flux-tools workflow that already uses a 1000-timestep discretization you can usually leave it.
Output is a single patched model, which you feed to your normal sampler. That's the whole thing.
Installing it
Part of the ComfyUI-CustomNodePacks umbrella. ComfyUI Manager → search "CustomNodePacks", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Code2Collapse/ComfyUI-CustomNodePacks.git
Restart ComfyUI. This node needs nothing beyond core ComfyUI - no model downloads. (Resist the urge to pip install -r requirements.txt from the pack root: ComfyUI bundles torch/numpy, and a blanket install is how people brick their environment. Install only what's missing.)
Gotchas
The node raises a runtime error if it can't find ComfyUI's model_sampling module - which just means it needs a real ComfyUI runtime, not a bare Python script. The more practical gotcha is tuning: shift isn't free. Too high and you over-invest in the noisy phase, and you can get mushy detail or longer samplers for no visible gain. Bump it in small steps, keep a fixed seed, and compare on the same prompt. If you're on a flow model you already know handles high resolutions well, this is the cheapest quality experiment you can run today.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| shift | FLOAT | 3.000.05–20 | AsymFlow signal-shift. shift=1 -> linear flow. >1 spends more steps at high noise (recommended for high-resolution / Flux-like models). |
| multiplier | INT | 10001–10000 | Discretization multiplier (timesteps scale). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |