You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
LTX-2.5's diffusion-based video VAE decoder can silently produce neutral-gray frame tails or rectangular gray tiles when AUTO tiling selects a chunked stage-5 tile whose channels-last activation reaches the 2**32 flattened-element boundary.
This is not generated by stage 1 or stage 2. The same finite stage-2 latent decodes cleanly with a smaller explicit tile and reproduces the gray tail with the original AUTO tile.
I reproduced this on an A100 80 GB with the official LTX-2.5 split checkpoints and ltx_pipelines.ti2vid_two_stages_hq.
Official LTX-2.5 transformer, text encoder, video VAE, audio VAE, distilled
LoRA, and spatial upsampler
This appears distinct from #37: that report was specific to RTX 5090/ComfyUI, whereas this reproduces on A100 and aligns exactly with a deterministic stage-5 flattened-index boundary.
Reproduction
Run the shipped two-stage HQ pipeline with any image/prompt at 1920x1088 and vary --num-frames:
The boundary lands 49.8% into frame 128, matching the observed approximately 48.6% gray area. Later frames are fully gray.
For a width-1056 tile, stage-5 width is 264. Frame 233 starts at:
233 * 272 * 264 * 256 = 4,283,203,584
The same boundary lands 36.0% into the tile, matching the observed approximately 36.0% gray left tile. Subsequent left tiles are gray.
The gray value is also diagnostic: the unwritten pixel accumulator remains raw zero; mapping decoder output from [-1, 1] to [0, 1] turns zero into 0.5, encoded/decoded as approximately RGB [125, 123, 121] in the tested BT.709 H.264 path.
All three decode cleanly for all 241 frames with a safe 112-frame temporal tile. The same stage-2 latent decoded with the original AUTO configuration reproduces gray from frame 233. This isolates the corruption to final DiffVAE decoding rather than either diffusion stage, RNG, or model weights.
Capping each candidate by the real content extent matters because a size candidate may be rounded beyond a shorter clip or axis.
I also recommend logging the resolved AUTO tiling configuration. Without it, a run can change behavior with GPU free memory / allocator history and the exact runtime tile cannot be reconstructed from CLI arguments.
Validation of the proposed guard
Frames
Old AUTO width
Guarded AUTO width
Old first gray
Guarded result
145
1920
1056
128
clean
241
1056
768
233
clean
145-frame guarded maximum near-gray fraction: 0.0245%
241-frame guarded maximum near-gray fraction: 0.0306%
Four independent 241-frame / 10-second scenes generated cleanly with the
guarded AUTO configuration frames=248, height=1088, width=768
All outputs passed complete ffmpeg decode
Merge suggestion
I suggest a focused PR containing only:
the chunked stage-5 2**32 shape guard in AUTO tiling;
unit tests immediately below, immediately above, and with candidates rounded
beyond actual content extent;
logging of the resolved AUTO tile.
This is low-risk: it only removes unsafe candidate shapes; it does not change model weights, sampling, explicit user-provided tiling, or non-chunked DiffVAE modes.
During investigation I also found a separate long-clip issue in the fallback Triton NA launch grid: assigning T*H to CUDA grid-Y can exceed 65,535. Swapping T*H to grid-X fixes that launch-limit failure, but I recommend reviewing/merging it as a separate PR because it is not the direct cause of the silent gray tail described here.
I have a tested local implementation and regression tests for both changes and can prepare focused PR(s) if maintainers agree with this direction.
Summary
LTX-2.5's diffusion-based video VAE decoder can silently produce neutral-gray frame tails or rectangular gray tiles when AUTO tiling selects a chunked stage-5 tile whose channels-last activation reaches the
2**32flattened-element boundary.This is not generated by stage 1 or stage 2. The same finite stage-2 latent decodes cleanly with a smaller explicit tile and reproduces the gray tail with the original AUTO tile.
I reproduced this on an A100 80 GB with the official LTX-2.5 split checkpoints and
ltx_pipelines.ti2vid_two_stages_hq.Environment
fd4ded7f2d88d3da713abcdd4ad41ecc4a9314caLoRA, and spatial upsampler
This appears distinct from #37: that report was specific to RTX 5090/ComfyUI, whereas this reproduces on A100 and aligns exactly with a deterministic stage-5 flattened-index boundary.
Reproduction
Run the shipped two-stage HQ pipeline with any image/prompt at 1920x1088 and vary
--num-frames:python -m ltx_pipelines.ti2vid_two_stages_hq \ --transformer-path /path/to/ltx-2.5-22b-dev-transformer-bf16.safetensors \ --text-encoder-path /path/to/gemma4-12b-with-proj-ltx-2.5-bf16.safetensors \ --video-vae-path /path/to/ltx-2.5-video-vae-bf16.safetensors \ --audio-vae-path /path/to/ltx-2.5-audio-vae-bf16.safetensors \ --distilled-lora /path/to/ltx-2.5-22b-distilled-lora-450-bf16.safetensors \ --spatial-upsampler-path /path/to/ltx-2.5-latent-spatial-upscaler-x2-bf16-1.0.safetensors \ --prompt "..." \ --image input.png 0 1.0 0 \ --output-path out.mp4 \ --num-frames 241 --frame-rate 24 \ --height 1088 --width 1920 \ --seed 4242 --max-batch-size 1 \ --distilled-lora-strength-stage-1 0.25 \ --distilled-lora-strength-stage-2 1.0Observed duration scan before the fix:
AUTO is resolved from free memory at decode time, so duration alone is not the invariant: different allocator state can select a different tile.
Boundary evidence / root cause
The chunked stage-5 activation is channels-last
[T, H, W, C]withC=256and spatial patch size 4.For a full-width 1920x1088 tile, stage-5 spatial dimensions are 480x272. Frame 128 starts at:
The boundary lands 49.8% into frame 128, matching the observed approximately 48.6% gray area. Later frames are fully gray.
For a width-1056 tile, stage-5 width is 264. Frame 233 starts at:
The same boundary lands 36.0% into the tile, matching the observed approximately 36.0% gray left tile. Subsequent left tiles are gray.
The gray value is also diagnostic: the unwritten pixel accumulator remains raw zero; mapping decoder output from
[-1, 1]to[0, 1]turns zero into 0.5, encoded/decoded as approximately RGB[125, 123, 121]in the tested BT.709 H.264 path.Stage isolation
For a 241-frame run I saved and validated:
[1, 128, 31, 17, 30][1, 128, 31, 34, 60][1, 128, 31, 34, 60]All three decode cleanly for all 241 frames with a safe 112-frame temporal tile. The same stage-2 latent decoded with the original AUTO configuration reproduces gray from frame 233. This isolates the corruption to final DiffVAE decoding rather than either diffusion stage, RNG, or model weights.
Suggested minimal fix
In
recommended_decode_tiling_config, reject chunked stage-5 candidates whose effective activation reaches2**32flattened elements:Capping each candidate by the real content extent matters because a size candidate may be rounded beyond a shorter clip or axis.
I also recommend logging the resolved AUTO tiling configuration. Without it, a run can change behavior with GPU free memory / allocator history and the exact runtime tile cannot be reconstructed from CLI arguments.
Validation of the proposed guard
guarded AUTO configuration
frames=248, height=1088, width=768Merge suggestion
I suggest a focused PR containing only:
2**32shape guard in AUTO tiling;beyond actual content extent;
This is low-risk: it only removes unsafe candidate shapes; it does not change model weights, sampling, explicit user-provided tiling, or non-chunked DiffVAE modes.
During investigation I also found a separate long-clip issue in the fallback Triton NA launch grid: assigning
T*Hto CUDA grid-Y can exceed 65,535. SwappingT*Hto grid-X fixes that launch-limit failure, but I recommend reviewing/merging it as a separate PR because it is not the direct cause of the silent gray tail described here.I have a tested local implementation and regression tests for both changes and can prepare focused PR(s) if maintainers agree with this direction.
case03_pastry_hands_ltx25_seed4242_20260812_10s_paired_v1_gridswap_retry2.mp4