DEV Community

AI-KSK
AI-KSK

Posted on

LTX 2.3 three-stage sampling: correct as you upscale, and why every pass re-injects the image

The difference between this pipeline and a normal upscale is one sentence in the episode: it does not generate and then enlarge, it enlarges while correcting. After each latent upscale, the image conditioning is applied again through an image-to-video node, so the face, the composition and the reference style are pulled back into place at the new resolution. That is what lets a distillation-only flow keep identity across a three-pass render instead of drifting.

Evidence note: the graph ships as JSON and is parsed below — node count, checkpoint, LoRA, sigma chains, latents, upscaler. The claims about tail-end decay, the 0.15 MP first pass, the 1.1 upscaler being the better local choice and the 18-value blur caveat are the author's reported findings in 字幕.srt.

Where this fits

You have one image and want a 10-second clip that keeps the character recognisable all the way to the end — specifically, you want to stop the late-frame decay that plagues single-pass renders. The author's demo results are all ten-second clips.

The graph

Item Value
Nodes 145
Checkpoint ltx-2.3-22b-dev.safetensors
LoRA ltx-2.3-22b-distilled-lora-384.safetensors @ 0.5
Samplers euler_ancestral_cfg_pp (first) then euler_cfg_pp (second, third)
CFG 1 on every CFGGuider
First-pass sigmas 1.0, 0.99375, 0.9875, 0.98125, 0.975, 0.909375, 0.725, 0.421875, 0.0
Later-pass sigmas 0.85, 0.7250, 0.4219, 0.0
Latents 320x288x*97* frames; audio 97 frames @ 25 fps
Upscaler ltx-2.3-spatial-upscaler-x2-1.0.safetensors (author recommends 1.1 locally)
RunningHub https://www.runninghub.ai/post/2033775150256103426/?inviteCode=rh-v1111

Fetched once: HTTP 200, title matches.

Note the node count: 145 for a three-pass pipeline, because the graph carries three near-identical sampling assemblies. That is the cost of this approach in file size and in wiring complexity.

Step by step

  1. Load the first image in Load Image.
  2. Write the positive prompt. Look up the LTX 2.3 prompt guide — the author says following the documented format gives noticeably better results.
  3. No negative prompt needed here. This is a distillation flow at CFG 1, and the NAG node that would make a negative prompt effective is not wired in yet. He says the flow currently asks only for the positive prompt.
  4. Set fps to 24 and total frames to 241. That is the ten-second setting.
  5. Run. The first pass builds motion on a low-resolution latent canvas; passes two and three each double the latent and re-render with the upscale model's sigma — about 3 actual steps per refinement pass.
  6. Size: he constrains the initial image to 0.15 megapixels through the megapixel scale node, and takes the width/height from a node upstream rather than setting them by hand.
  7. Optional: feed a higher-resolution result or the final video into the upscale graph again if you want more, but the shipped flow already lands near 1080p — the demo output is 2048x1024.

How each pass actually works

  • The first pass starts from the low-resolution image latent as the canvas, and builds a matching audio latent — both are required for the audio-visual model.
  • Frame count and fps come out of the latent dimensions.
  • After the first pass, the audio-visual latent is separated, the video latent is upscaled by 2x, and the pair is recombined for the second pass.
  • The image-to-video node appears in every pass and re-references the same image, which was cleanly scaled to a 1536 edge. That is the mechanism behind "correct as you upscale".
  • After the third pass, decode.

Two knobs and one caveat

  1. The boolean in the image-to-video node turns the flow into text-to-video: flip it and the first image is ignored.
  2. The 18 value blurs the reference image — higher is blurrier. It is there to keep the conditioning from being too literal.
  3. The caveat that matters: if you strip the flow down to one or two passes, that 18 value can make the result more static, because the blur no longer gets corrected by a later refinement pass. Cut passes and you should re-tune it.

What changed versus two-pass / one-pass-plus-upscale

  • Two-stage sampling and single-stage-plus-spatial-upscale are described as fundamentally different: they enlarge, this one re-conditions after each enlargement.
  • The upscaler in the official LTX 2.3 release has been updated to 1.1; the author recommends the 1.1 spatial upscaler for local runs, especially for long clips. The shipped JSON still references 1.0.
  • The graph was adapted from a Reddit user's workflow, with the author's own changes.

Limits

  • The upscaler version in the JSON (1.0) is behind the 1.1 the author recommends for local use.
  • No negative-prompt path yet at CFG 1.
  • 145 nodes means three duplicated sampling blocks — more to maintain than a single-pass graph.
  • The 18 blur needs re-tuning if you change the pass count.
  • RunningHub was described as frequently overloaded during this period; the author ran some results locally.
  • Identity retention is strong but not absolute; the demo images with thin detail come out nearly identical, which he notes is a limitation of the source, not a feature.

Episode resources

Top comments (0)