Skip to content

LTX-2.5 tiled decode fuses the three separable blend masks; upstream applies them one axis at a time #2815

Description

@localai-org-maint-bot

Row: LTX25-A24-VIDEO-VAE-BF16

AccumulateTemporalGroup in src/vllm/model_executor/models/ltx2_video_vae_tiled.cpp
multiplies the three 1-D trapezoidal masks together and scales the decoded tile
once:

const float mth = mt * MaskAt(tile.out_h, hi);
const float m = mth * MaskAt(tile.out_w, wi);
... decoded.data[...] * m ...

Upstream's scale_by_masks_1d (Lightricks/LTX-2 @ fd4ded7f,
packages/ltx-core/src/ltx_core/tiling.py:423-435) applies them ONE AXIS AT A
TIME, in axis order, so the arithmetic is ((x * mt) * mh) * mw and not
x * ((mt * mh) * mw). The two disagree in the last bit.

At f32 the difference is a relative ~1e-7 and sits far under the suite's 5e-6
golden band, which is why every existing tiling case is green. At upstream's own
bfloat16 it is a whole word: measured on a shallow tiling fixture, upstream
re-run with the port's fused product lands max|diff| = 0.001953125 from
upstream's own answer, which is exactly the distance the port sits at.

The weights denominator is not affected: it accumulates the same masks over a
tensor of ones, and ((1 * mt) * mh) * mw is bit-identical to (mt * mh) * mw.

Found while adding the bf16 gate the fresh review of #2808 asked for, and fixed
in the same flow there.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions