PiD Conditioning
Attach the latent so the pixel decoder knows what it's decoding
- positive
- latent
- CONDITIONING
PiD Conditioning is the bridge between your normal diffusion pipeline and PiD - Nvidia's Pixel Diffusion Decoder, the thing that made the community do a double take when "Nvidia solved VAE?" hit Reddit at +778. PiD replaces the VAE decoder with a conditional pixel-diffusion module that decodes and upscales in one step: 512×512 latents to 2048×2048 output in under a second on a 5090. And this node is how you hand PiD the latent it needs to work with.
The key thing to understand - because half the hype articles got it wrong - is that PiD does not remove the latent space. Your model still generates in a latent. PiD just gets you out of it better. Which means the decoder needs three things: the latent itself, the format it's in, and a noise level to work from. This node bundles all three into a conditioning.
How it works
PiD Conditioning attaches a latent and a degrade_sigma scalar to your positive conditioning's metadata. Under the hood it converts the latent into the right latent format (process_in), then writes lq_latent and degrade_sigma fields that the PiD decoder reads.
The inputs:
- positive - your text conditioning from CLIPTextEncode.
- latent - from VAEEncode or a KSampler. The node's own tooltip: "latent (from VAEEncode or a KSampler)."
- latent_format - default "flux". Flux1 (16-ch) and Flux2 (128-ch) latents are auto-detected from the channel count under "flux"; for SD3 (16-ch), SDXL (4-ch), or QwenImage (16-ch) you pick manually. Getting this wrong produces garbage, so trust the tooltip.
- degrade_sigma - 0 to 1, default 0. 0 means "clean latent"; raise it to denoise corrupted or early-terminated latents.
One output, CONDITIONING, which then feeds the PiD decode node with the model.
Where people get burned
- Wrong latent_format. The auto-detect only covers Flux's two channel counts. Drop an SDXL latent in with "flux" selected and the decoder misreads it. The channel numbers are in the tooltip for a reason.
- Over-trusting the output. PiD can hallucinate detail that was never in the latent - the community's canonical tell: "It's sharp but Balenciaga becomes HfgFgdfgdifhg." Text and fine detail get reinterpreted. The consensus is to treat PiD as a fast, faithful-ish upscaler for already-well-resolved input, not a VAE replacement for precision work. If the input latent is noisy or blurry, raise
degrade_sigma; if it's already clean, leave it at 0. - Early-termination interplay. PiD accepts partially-denoised latents from an early-stopped sampler, which is where
degrade_sigmaearns its keep - that's the documented "denoise corrupted latent outputs" path. But it's also where hallucination risk is highest.
ComfyUI shipped PiD nodes within days of the announcement, and this one lives in core (comfy_extras/nodes_pid.py). The PiD model weights go wherever your other diffusion models live. For the "decode everything at 4× without a separate upscaler" crowd, it's a genuinely new thing; just keep the text-fidelity caveat in your head.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | — | |
| latent | LATENT | latent (from VAEEncode or a KSampler). | |
| latent_format | COMBO | flux | Flux1 (16-ch) and Flux2 (128-ch) latents are auto-detected from channel dim under 'flux'. For SD3 (16-ch), SDXL (4-ch), or QwenImage (16-ch), select manually. |
| degrade_sigma | FLOAT | 0.000–1 | 0 = clean latent. Increase to denoise corrupted latent outputs. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| CONDITIONING | CONDITIONING | — |