DP Advanced Sampler
A KSampler with hires upscale and tiling baked in
- model
- vae
- positive
- negative
- latent_image
- sampled_latent
- sampled_image
- upscaled_latent
- upscaled_image
- sampler_info
If you're tired of wiring a KSampler, then an upscale latent, then a second KSampler for the hires pass, then a tiled setup when the image gets too big for VRAM - this node collapses all of that into one box. It samples, and then optionally upscales and re-samples, and then optionally does that upscale in overlapping tiles so a huge target size doesn't blow up your card. One node, three jobs.
It's part of Desert Pixel Nodes, a sprawling 105+ node personal pack from DesertPixelAi. The pack isn't a name you'll see argued about on r/comfyui - it's more the kind of thing people quietly fold into their own graphs - but this sampler is the most-searched node in it, and it's easy to see why: the all-in-one hires-fix-plus-tiling combo is genuinely convenient.
How it works
The first half is an ordinary KSampler. You give it a model, a latent_image, your positive and negative conditioning, and the usual seed / steps / cfg / sampler_name / scheduler / denoise. It denoises and hands you back a latent - and because you also wire in a vae, it decodes and hands you a finished image too.
Turn on enable_upscale and it runs a second pass: it scales the latent up by scale_by (1.5x by default) and re-samples with its own separate upscale_steps, upscale_cfg, upscale_sampler_name, upscale_scheduler, and upscale_denoise. That's a classic hires fix - upscale_denoise around 0.5 is the sweet spot, low enough to keep the composition, high enough to add detail. two_step_upscale splits that into two gentler jumps instead of one big one.
Turn on enable_split and the upscale pass runs in tiles: split_rows × split_columns chunks with overlap_pixels of blend between them. This is the same trick as Ultimate SD Upscale or Tiled Diffusion - it lets you hit 4K on a modest GPU by never holding the whole image in VRAM at once.
The inputs and outputs that matter
For a first run, the ones you actually touch: steps, cfg, sampler_name/scheduler, and denoise. Leave the upscale and split blocks off until the base image looks right.
Outputs: sampled_latent and sampled_image are your base result; upscaled_latent and upscaled_image are populated only when upscale is on. sampler_info is a text string of the settings you used - pipe it into a save node to stamp your parameters onto the file.
How to install it
Easiest path is ComfyUI Manager: Install Custom Nodes, search Desert Pixel, install, restart. Manual works too:
cd ComfyUI/custom_nodes
git clone https://github.com/DesertPixelAi/ComfyUI-Desert-Pixel-Nodes
then restart ComfyUI. If the repo ships a requirements.txt, pip install -r it first. No model files to download - this node uses whatever checkpoint and VAE you already have. The nodes land under the DP category in the node browser.
Common issues & troubleshooting
Your sampler choice matters more than the node. This is a plain KSampler under the hood, so the same rules apply: DPM++ 2M Karras is the safe default for SD 1.5 and SDXL, but on a flow-matching model like Flux or Z-Image, Karras and exponential schedulers fail outright - use Euler-family on beta or simple instead. Check what your checkpoint is before carrying a habit across.
Tiled upscale gives you patchwork. The split upscale has no ControlNet Tile condition holding the tiles to the source, so at high denoise each tile can invent its own details and the seams show. Keep upscale_denoise modest (0.35–0.5), bump overlap_pixels up, and don't ask a single pass to both quadruple the size and hallucinate detail.
Nothing comes out of the upscaled outputs. They're empty unless enable_upscale is on. If you wired upscaled_image into your save node and got nothing, that's the switch.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 8.00–100 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latent_image | LATENT | — | |
| denoise | FLOAT | 1.000–1 | — |
| enable_upscale | BOOLEAN | false | — |
| two_step_upscale | BOOLEAN | false | — |
| scale_by | FLOAT | 1.500.01–8 | — |
| upscale_steps | INT | 101–10000 | — |
| upscale_cfg | FLOAT | 7.00–100 | — |
| upscale_sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| upscale_scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| upscale_denoise | FLOAT | 0.500–1 | — |
| enable_split | BOOLEAN | false | — |
| split_rows | INT | 21–8 | — |
| split_columns | INT | 41–8 | — |
| overlap_pixels | INT | 00–128 | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| sampled_latent | LATENT | — |
| sampled_image | IMAGE | — |
| upscaled_latent | LATENT | — |
| upscaled_image | IMAGE | — |
| sampler_info | STRING | — |