Sampler DPM++ 2M Sharp
Your old DPM++ 2M with one very specific new knob
- SAMPLER
What this thing actually is
If you went looking for a KSampler and got handed a node with two widgets and one output, you're not confused - this is a sampler provider. It outputs a SAMPLER object that you wire into SamplerCustom or SamplerCustomAdvanced, the same way ComfyUI's built-in KSamplerSelect does. The sampling happens downstream; this node just decides how the steps get solved.
Why bother? Because the sampler conversation moved. DPM++ 2M Karras was the universal safe default for years, and on SD 1.5, SDXL and their finetunes it still is. Then flow-matching models arrived and the shortlist went sideways - Karras is close to an "universal failure" on Z-Image and Flux. What replaced it isn't one new name but a space of high-order solvers, mostly living in RES4LYF - 69 samplers, a pack that now out-mentions DPM++ 2M Karras in community threads four to one.
This pack is the targeted version of that instinct: plain DPM++ 2M, one extra parameter, plus an SDE variant, SEEDS_2 and four RES choices, without installing RES4LYF at all. The author's framing is blunt - "a better sampler for Qwen Image 2.1" - and the repo ships no benchmark. Believe the mechanism, not the marketing.
How the sharpening works
DPM++ 2M is a multistep solver. It keeps the previous step's denoised prediction around and extrapolates from it:
denoised_d = (1 + 1/(2r)) * denoised - (1/(2r)) * old_denoised
That cached old_denoised is the lever. This pack stores it multiplied by an adjustment factor of 1 + sharpness * (i / N)^2 - a quadratic ramp across the run, so the first step is untouched and later (low-sigma, detail-forming) steps get pushed hardest. Inflating the history widens the gap between current and previous prediction, which makes the multistep correction more aggressive. It's sharpening, technically: more contrast in the extrapolation.
Two consequences worth knowing. First, it costs nothing - same step count, same number of model calls, just arithmetic on a cached tensor. Second, sharpness = 0.0 makes the factor exactly 1, which makes dpmpp_2m_sharp byte-for-byte the stock DPM++ 2M. That's your A/B baseline, and it's free.
The dpmpp_2m_sde_gpu_sharp variant applies the same history trick to ComfyUI's SDE sampler, keeping its seeded GPU Brownian noise (generated on the GPU rather than shipped from CPU, so it stays reproducible per seed). At zero sharpness it matches ordinary DPM++ 2M SDE GPU.
The inputs and output
sharpness (float, default 0.15) is the whole point. The tooltip: "Progressively scales denoised history, or the first-stage prediction used in RES 2S and SEEDS_2 corrections. 0 disables sharpening. Ignored by samplers without _sharp." Start at the default. Nudge up to 0.3 if you want to see what it does, and treat the range above ~1 as a special-effects zone - the max is 100, which is not an invitation.
sampler_name (optional combo, default dpmpp_2m_sharp) picks which solver you get. Reading the source, the seven options are dpmpp_2m_sharp, dpmpp_2m_sde_gpu_sharp, seeds_2_sharp, res_2s_nc, res_2m_nc, res_2s_nc_sharp, res_2m_nc_sharp. The four RES ones are RES4LYF's 2S/2M paths bundled locally; the _nc pair deliberately skips the final clean-latent correction, so it ends at the minimum positive sigma with a little residual noise left in the latent. The two _nc variants without _sharp ignore sharpness entirely - setting it and seeing nothing change is expected, not broken.
One output: SAMPLER. Wire it into SamplerCustomAdvanced's sampler slot alongside your model, positive/negative conditioning, latent and sigma schedule. Use its output, not denoised_output - as the README notes, denoised_output comes from the preview prediction rather than the latent actually handed downstream, which matters if you're comparing NC variants.
Installing it
ComfyUI Manager: search DPM++ 2M Sharp for Qwen Image 2.1, or from the CLI:
comfy node install dpmpp-2m-sharp
Manual, from your ComfyUI directory:
cd ComfyUI/custom_nodes
git clone https://github.com/envy-ai/ComfyUI-DPMpp-2M-Sharp
Restart ComfyUI. That's the whole install. There is no requirements.txt and no dependencies entry in pyproject.toml - it runs on the torch and tqdm ComfyUI already ships - and no model files to download. The "Qwen Image 2.1" in the display name says what it was tuned against, not what it needs. RES4LYF isn't required either; res.py bundles those paths, under RES4LYF's AGPL-3.0 rider forbidding use in a commercial image-generation service without a separate licence. The DPM++/SEEDS halves are plain GPL-3.0.
Where people get stuck
The node isn't there after install. It imports comfy_api.latest at the top, so an older ComfyUI build fails on load - update ComfyUI first. And it lives under model/sampling/samplers, not next to KSampler.
Your sampler is missing from the KSampler dropdown. On load the pack registers dpmpp_2m_sde_gpu_sharp, seeds_2_sharp and the four RES names into ComfyUI's global sampler list, so they do show up in a plain KSampler (fixed at sharpness = 0.15). If they don't appear, you haven't restarted since installing.
A shared workflow won't load with missing-node errors. Standard fix: Manager → Install Missing Custom Nodes. The node ID is stable as SamplerDPMPP_2M_Sharp, so old workflows keep resolving.
It doesn't look different. At 0.15 the change is meant to be subtle, and the author explicitly declines to claim a comparative win. On SD 1.5 or SDXL this buys you close to nothing - DPM++ 2M Karras is still correct there. The interesting case is a modern flow-matching model where you know the schedule you like and just want a sharper DPM++ inside it.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| sharpness | FLOAT | 0.150–100 | Progressively scales denoised history, or the first-stage prediction used in RES 2S and SEEDS_2 corrections. 0 disables sharpening. Ignored by samplers without _sharp. |
| sampler_nameopt | COMBO | dpmpp_2m_sharp | RES _nc variants skip the final clean-latent correction, retaining a small amount of residual noise. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SAMPLER | SAMPLER | — |