Eric ERNIE-Image UltraGen
The honest workaround for ERNIE's resolution ceiling
- pipeline
- prompt_embeds
- s1_negative_embeds
- s2_negative_embeds
- final_image
- stage1_preview
ERNIE-Image was trained up to 1024×1024, and above ~1.5 MP it falls apart - the community's measured verdict is that it "mangles bodies more than Z-Image" once you push past the ceiling. So how do you get a bigger, detail-rich image out of a model with a hard resolution cap? You don't ask it to draw big. You ask it to draw small, and then re-denoise.
Eric ERNIE-Image UltraGen is a two-stage hierarchical generator built around exactly that: Stage 1 lays down the composition at a small latent, then the latent is upscaled and Stage 2 re-denoises it to add detail. It's a hi-res-fix-style workflow, but done entirely in latent space - no external upscaler in the graph, no pixel-space tricks.
The two stages
Stage 1 (composition) runs a full text-to-image pass at a small resolution - s1_initial_mp defaults to 0.4 MP, and the tooltip recommends 0.3–0.5. This is where you want strong structure, so SFT users crank s1_guidance_scale to 6–9 and s1_shift_value to 6–8 (the tooltip notes that range "keeps all steps structural"). Turbo users stay at CFG 1.0 with 6–8 steps. The output is kept as latents, not decoded to pixels - except the node decodes a stage1_preview for you, which is genuinely useful for tuning S1 without waiting on S2.
Stage 2 (detail) upscales those latents by scale_factor (2.5× default - on 0.4 MP that lands you right at ~1 MP, squarely inside the training envelope) and re-noises them at s2_denoise before a partial-denoise pass. That knob is the dial between "light refinement that preserves S1's composition" (0.45) and "heavy re-generation with new detail" (0.65+) - at 1.0 it ignores S1 entirely. The noising uses the flow-matching form x_noisy = (1-σ)x + σ·noise, and the node matches the scheduler's actual sigma so the noise level lines up exactly.
The inputs that matter
- s1_initial_mp - how small you start. 0.3–0.5 MP.
- scale_factor - 2.5 on 0.4 MP ≈ 1 MP final. The tooltip is refreshingly blunt: "Higher risks body horror."
- s2_denoise - the refinement/re-generation tradeoff above. 0.65–0.85 is the sensible band.
- upscale_method -
bislerpis the default and the author's pick: slerp-interpolation preserves latent vector norms and angular relationships, which reads as sharper and more coherent thanbicubic. Trust it unless you have a reason not to. - s1_guidance_scale / s1_shift_value / s2_guidance_scale / s2_shift_value - the two stage profiles; the tooltips hand you the SFT vs Turbo numbers so you don't have to guess.
- max_final_mp - caps the final output (8 MP default). Just because it goes to 8 doesn't mean ERNIE handles it well; the model's own ceiling still applies to the detail pass.
Outputs and wiring
Two image outputs: final_image and stage1_preview. Wire final_image to PreviewImage/SaveImage; the preview is optional but worth one look per workflow while you tune S1. It also accepts the pack's prompt_embeds and per-stage negative embeddings if you're using the Encode node.
The honest context
The community's verdict on ERNIE-Image is that it wins at one thing - structured layout and text-in-image (infographics, posters, multi-panel comics) - and that its cleanest use is Turbo at ~1.5 MP. UltraGen is the pack author's answer to the "I want more detail than a 1 MP preset" itch, and for the structured-layout pocket it's genuinely useful: two stages let you lock composition first, then refine, which is exactly what text-heavy layouts want. It is not the tool for photorealism - the KB is consistent that Z-Image reads as a photograph more often, and no amount of stage-splitting changes what ERNIE is. And if your S2 output starts repeating artifacts, that's the model's 2D RoPE going out of distribution, not a setting you missed - dial max_final_mp back toward the training ceiling.
Install is the pack's standard one-time setup: Manager search "Eric ERNIE-Image", or clone https://github.com/EricRollei/Ernie_Image_Real_Diffusers into custom_nodes, restart, and point the loader at a downloaded checkpoint.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| pipeline | ERNIE_PIPELINE | — | |
| prompt | STRING | Ignored when prompt_embeds connected. | |
| resolution | COMBO | 5:4 | Aspect ratio for both stages. |
| seed | INT | 00–18446744073709550000 | — |
| use_pe | BOOLEAN | false | — |
| s1_initial_mp | FLOAT | 0.400.2–1 | Stage 1 megapixels. 0.3-0.5 MP recommended. |
| s1_denoise | FLOAT | 1.000.05–1 | Stage 1 denoise strength - fraction of σ=[1.0→0] covered. 0.15 → stops at σ=0.85 (just lays in composition). |
| s1_steps | INT | 65–100 | Stage 1 steps. 6-8 for Turbo, 20-30 for SFT. |
| s1_guidance_scale | FLOAT | 1.00–20 | Stage 1 CFG. 1.0 for Turbo, 6-9 for SFT. |
| s1_sigma_schedule | COMBO | fixed shift | 'fixed shift' with s1_shift_value 6-8 keeps all steps structural. 'karras'/'beta' add detail-range emphasis on top of shift. |
| s1_shift_value | FLOAT | 6.00.1–16 | Stage 1 shift. 6-8 recommended. 1.0 = uniform. |
| scale_factor | FLOAT | 2.51–8 | Linear upscale factor. 2.5× on 0.4 MP ≈ 1 MP. Higher risks body horror. |
| s2_denoise | FLOAT | 0.850.1–1 | Noise level added to upscaled S1 latent before S2 denoise. 0.45 = 45% noise (light refinement, preserves S1 composition). 0.65+ = heavier re-generation with more new detail. 1.0 = full re-generation (ignores S1). |
| s2_steps | INT | 95–100 | Stage 2 detail steps. 6-10 for Turbo, 20+ for SFT. |
| s2_guidance_scale | FLOAT | 1.00–20 | Stage 2 CFG. 1.0 for Turbo, 2-3 for SFT. |
| s2_sigma_schedule | COMBO | fixed shift | 'fixed shift' with s2_shift_value for consistent noise schedule. 'beta' allocates more steps to fine-detail range. 'karras' emphasizes both extremes. |
| s2_shift_value | FLOAT | 5.00.1–8 | Stage 2 shift. 5.0 tested well with Turbo at 2.5× scale. |
| max_final_mp | FLOAT | 8.00.5–16 | Megapixel cap on final output. |
| upscale_method | COMBO | bislerp | bislerp (slerp-interpolation) preserves latent vector norms and angular relationships — sharper and more coherent than bicubic. |
| guidance_rescale | FLOAT | 0.000–1 | Rescale CFG output toward unit variance. Reduces saturation at high guidance_scale. 0.0 = off. 0.5-0.7 recommended for S1 cfg 6-9. Applied to both stages. |
| vae_decode_fp32 | BOOLEAN | true | Upcast VAE to float32 for decode. Prevents bf16/fp16 quantization of fine textures. Applies to both S1 preview and S2 final decode. |
| s1_negative_promptopt | STRING | Stage 1 negative prompt. | |
| s2_negative_promptopt | STRING | Stage 2 negative. Leave empty to reuse Stage 1. | |
| prompt_embedsopt | ERNIE_EMBEDS | Pre-computed positive embeddings. | |
| s1_negative_embedsopt | ERNIE_EMBEDS | Pre-computed Stage 1 negative embeddings. | |
| s2_negative_embedsopt | ERNIE_EMBEDS | Pre-computed Stage 2 negative embeddings. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| final_image | IMAGE | — |
| stage1_preview | IMAGE | — |