HiFlow
Upscale a FLUX image you like without retraining or a second model
- model
- vae
- positive
- negative
- latent_image
- High-Res Latent
You've got a FLUX render at 1024 that you love, and you want it at 2K or 4K with the composition intact and detail that's new, not the same pixels smeared bigger. That's HiFlow's reason to exist. In the ComfyUI-DyPE pack, the DyPE/SEGA/SPA nodes patch the model so your KSampler run can generate at high res from noise; HiFlow takes a different lane and refines a base latent upward - an upscale of an image you already made. Flow models only: FLUX, Qwen-Image, Krea-2, Z-Image, AuraFlow.
It's not tiled diffusion, it needs no ControlNet Tile, and it isn't a separate upscaler model like Flux-ControlNet-Upscaler - you don't download one, it runs whatever flow checkpoint is loaded. "Training-free" means no LoRA, no fine-tune, just a smarter way to sample the model you've got.
How it works
Rectified-flow models denoise along an almost-straight path from noise to image, and HiFlow exploits that. It first runs the base-resolution sampling once at native resolution and records the model's clean prediction at every step - the "reference trajectory." Each upscale stage then walks the bigger canvas from noise and keeps itself glued to that time-matched reference through three alignments: initialization (start the stage from the right point), direction (nudge low frequencies toward the reference via a Butterworth low-pass filter) and acceleration (match the reference's rhythm of when detail appears). Net effect: composition and structure carry over essentially verbatim, while high-frequency detail gets re-synthesized at the new size. It's the HiFlow paper (arXiv:2504.06232, NeurIPS 2025) in one node.
The wiring and inputs that matter
The chain is short: model loader → HiFlow → VAE Decode, with vae, positive and negative plugged in. Feed latent_image a base latent at native resolution (an EmptySD3LatentImage works). Because the node records the trajectory itself, it does its own sampling - an empty latent plus a noise_seed reproduces the whole from-noise reference run internally. No separate KSampler stage needed.
The inputs that matter:
scale_factor- output size relative to the input latent.2doubles each side; upscales run in 2× doubling stages (so1.5still gives one 2× stage).steps/steps_per_stage- 30 base steps whose clean predictions form the reference; 16 guided steps per upscale stage.tau- the noise level where each stage enters. Lower keeps more of the base image's structure; higher re-imagines more (paper cascade: 0.6, 0.3, 0.3).cfgvsguidance- guidance for the base stage vs. the guided stages. FLUX-dev defaults: 3.5 and 4.5.denoise- only matters for a content latent (img2img style):1.0regenerates from pure noise, lower keeps more of your input. Ignored for an empty latent.
The output is a single High-Res Latent - decode it with your VAE. If you're pushing FLUX, chaining the pack's DyPE (ntk) before the loader adds RoPE extrapolation so attention stretches properly at the scaled size.
Install
Via ComfyUI Manager, search ComfyUI-DyPE and install; or manually:
cd ComfyUI/custom_nodes/
git clone https://github.com/wildminder/ComfyUI-DyPE.git
Then restart ComfyUI. This one's refreshingly light: the requirements are just torch and numpy, which ComfyUI already ships - no extra dependency download, and no model files to fetch. All eight pack nodes live under the WMNodes/image menu.
Gotchas worth knowing
First, the honest warning from the README: HiFlow inherits the reference's structure - including its mistakes. Generate a base you actually like, because it will faithfully upscale a bad face. Lower tau to preserve more of what's good; don't expect HiFlow to fix a bad base.
A few real failure modes, grounded in the changelog rather than folklore:
- Non-flow model wired in → a clear error points you to the pack's PixelRush node, the sibling cascade for SDXL/SD1.5-style models.
- Guidance-free models (Z-Image, Chroma) or empty negatives → leave
cfgat 1.0. CFG is auto-skipped when the negative carries no tokens, so an empty negative is fine. - 3D-latent image models (Qwen-Image, Krea-2) work as single-frame latents - earlier builds crashed on them. Actual multi-frame video input is still rejected by design.
- Burned or blurry output on an older install? Update the pack. HiFlow is the pack's newest node (v2.10+, September 2026) and took hard patches in its first week: the base stage used to sample an all-zeros latent as "noise" (the burned output), and the img2img noise mix was in the wrong space (drastic changes at any usable
denoise). Fixed by v2.12.1.
Finally, the honest hardware note: every 2× stage decodes and re-encodes at 4× the pixels, and you're running diffusion at that scale - a 1K base to 4K is doable on 24 GB but slow. And when picking between pack members: generating from pure noise at high res is DyPE's job; keeping an image you already love intact at high res on a flow model is exactly why HiFlow exists.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | The flow model. | |
| vae | VAE | VAE (used by pixel upsampling). | |
| positive | CONDITIONING | Positive conditioning. | |
| negative | CONDITIONING | Negative conditioning. | |
| latent_image | LATENT | Base latent at the model's native resolution (e.g. from EmptySD3LatentImage). The cascade noises it to the first sigma itself — an empty latent + noise_seed reproduces the reference pipeline's from-noise start. | |
| noise_seed | INT | 00–4294967295 | Seed for the base-stage noise and each stage's initialization noise (one shared generator). |
| denoise | FLOAT | 1.000.05–1 | Img2img strength for a CONTENT latent (KSampler convention): 1.0 regenerates from pure noise; lower keeps more of the input image (0.6 enters at ~37% content). Ignored for an empty latent — that always runs the full schedule. |
| cfg | FLOAT | 3.50–20 | Classifier-free guidance for the BASE stage (FLUX-dev default 3.5). Guidance-free models (Z-Image, Chroma) or empty negatives: leave at 1.0 — CFG is auto-skipped when the negative carries no tokens. |
| steps | INT | 301–200 | Base-stage sampling steps (paper: 30). The per-step clean predictions form the reference trajectory. |
| guidance | FLOAT | 4.50–20 | Classifier-free guidance for the guided upscale stages (paper uses 4.5-6). Same auto-skip rule as cfg. |
| steps_per_stage | INT | 161–50 | Guided-stage sampling steps per cascade stage (upper bound; repo default 16/10). |
| tau | FLOAT | 0.600.05–0.95 | Stage-entry noise level (paper cascade: 0.6, 0.3, 0.3). Lower = stronger content preservation. |
| filter_ratio | FLOAT | 0.200.05–0.95 | Normalized Butterworth low-pass cutoff D (direction alignment). Paper 0.4, repo default 0.2. |
| alpha_scale | FLOAT | 1.000–2 | Direction-alignment strength multiplier (repo first-stage value 1.0). |
| beta_scale | FLOAT | 0.500–2 | Acceleration-alignment strength multiplier (repo default 0.5). |
| upsampling | COMBO | latent | Per-step reference upsample: latent bicubic (repo default) or pixel decode->sharpen->encode. The stage-initialization anchor is always the pixel round-trip of the previous final image. |
| scale_factor | FLOAT | 2.000.25–8 | Output scale relative to the input latent: 2 = double resolution per side, 1 = unchanged, 0.5 = half. Upscales run 2x doubling stages (so scales between 1 and 2 give one 2x stage); scales below 1 run a single refinement stage at the smaller size. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| High-Res Latent | LATENT | — |