Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
f142e56
Align LTX-2.3 two-stage artifacts and official helpers
mickqian Apr 5, 2026
c46a1e5
Align LTX-2.3 two-stage default resolution
mickqian Apr 5, 2026
53d1a1f
init
mickqian Apr 5, 2026
629d32e
Use bundled LTX-2.3 overlay metadata
mickqian Apr 5, 2026
7297253
Align LTX-2.3 stage2 RNG with official
mickqian Apr 5, 2026
9c3c1ca
Align LTX-2.3 stage2 noise layout
mickqian Apr 5, 2026
8e1252a
Revert LTX-2.3 stage2 noise layout change
mickqian Apr 6, 2026
89df1b0
Align LTX-2.3 native latent dtype with official
mickqian Apr 6, 2026
d3ff749
Fix LTX2 AV gate timestep scaling
mickqian Apr 6, 2026
99bf97e
Keep LTX-2.3 overlay transformer config official
mickqian Apr 6, 2026
eb5efab
Revert "Keep LTX-2.3 overlay transformer config official"
mickqian Apr 6, 2026
667f244
Fuse LTX2 two-stage distilled LoRA in stage2
mickqian Apr 6, 2026
7ef914c
Quantize LTX2 video RoPE coords to hidden dtype
mickqian Apr 6, 2026
ae6f33e
Pass hidden dtype into LTX2 timestep AdaLN
mickqian Apr 6, 2026
d6f0281
Make LTX2 token timesteps explicit
mickqian Apr 6, 2026
ac8d171
upd
mickqian Apr 6, 2026
b5553e1
Use sigma for LTX2 prompt AdaLN
mickqian Apr 6, 2026
00488d1
Align LTX-2.3 two-stage stage2 RNG semantics
mickqian Apr 7, 2026
1031d9e
upd
mickqian Apr 7, 2026
bb1483c
upd
mickqian Apr 7, 2026
e242e82
upd
mickqian Apr 7, 2026
995b8f2
Merge remote-tracking branch 'origin/main' into ltx-2.3-two-stage
mickqian Apr 7, 2026
f3f08ff
upd
mickqian Apr 7, 2026
636e0e1
upd
mickqian Apr 7, 2026
7dc75fd
upd
mickqian Apr 7, 2026
a310dac
upd
mickqian Apr 7, 2026
453c17f
upd
mickqian Apr 8, 2026
59ab216
upd
mickqian Apr 8, 2026
aa23d7f
Merge remote-tracking branch 'origin/main' into ltx-2.3-two-stage
mickqian Apr 8, 2026
f5a7d01
Merge remote-tracking branch 'origin/main' into ltx-2.3-two-stage
mickqian Apr 8, 2026
65aeb83
upd
mickqian Apr 8, 2026
75be441
upd
mickqian Apr 8, 2026
bd23693
upd
mickqian Apr 8, 2026
53184d7
Fix LTX two-stage CI regressions
mickqian Apr 8, 2026
70ea79a
lint
mickqian Apr 8, 2026
d495ba8
Fix LTX-2 AV gate scaling regression
mickqian Apr 8, 2026
0e8e5a3
Preserve legacy LTX-2 timestep semantics
mickqian Apr 8, 2026
f2d1a2e
upd
mickqian Apr 8, 2026
471e10d
lint
mickqian Apr 8, 2026
f7fa676
Fix LTX-2.3 TI2V SP shard metadata
mickqian Apr 8, 2026
7f0778e
Prefer TP for LTX-2.3 one-stage on 2 GPUs
mickqian Apr 8, 2026
9640a67
Cover LTX-2.3 CLI parallelism defaults
mickqian Apr 8, 2026
840d121
Keep LTX audio-to-video cross-attn local under SP
mickqian Apr 8, 2026
8332423
Keep LTX audio branch local under SP
mickqian Apr 8, 2026
cfbca57
Shard LTX audio latents for sequence parallel
mickqian Apr 8, 2026
d37f56a
Revert LTX SP skip-attention experiments
mickqian Apr 8, 2026
d68fa4b
Mask LTX2 SP padding tokens in attention
mickqian Apr 8, 2026
4cdf4c7
Align LTX SP qk RMSNorm math
mickqian Apr 8, 2026
2899999
Revert "Align LTX SP qk RMSNorm math"
mickqian Apr 8, 2026
b8e356c
Fix LTX-2.3 attention backend defaults and USP masks
mickqian Apr 9, 2026
ff215cf
WIP audio-replicated path for LTX2.3 TI2V SP
mickqian Apr 9, 2026
ebe88a8
Refine audio-replicated TI2V SP path
mickqian Apr 9, 2026
e0952d0
Fix rank-local TI2V gating for SP audio replication
mickqian Apr 9, 2026
84fc4d7
Test LTX-2.3 SP audio replication gating
mickqian Apr 9, 2026
4a14530
Restore LTX-2.3 TI2V SP video-to-audio attention
mickqian Apr 9, 2026
74fac7d
Preserve LTX TI2V SP video valid-token metadata
mickqian Apr 9, 2026
15bd98a
Align LTX prompt attention mask semantics
mickqian Apr 9, 2026
d52c078
Align LTX-2.3 AV cross-modality sigma semantics
mickqian Apr 9, 2026
ac28473
Use explicit SP video rope offsets for LTX
mickqian Apr 9, 2026
284dbd4
Try exact KV gather for LTX23 SP self-attn
mickqian Apr 9, 2026
549badd
Shard LTX image latents before SP
mickqian Apr 9, 2026
681864f
Disable LTX23 audio replication for SP TI2V
mickqian Apr 9, 2026
13e75e9
Revert early LTX image latent sharding
mickqian Apr 9, 2026
6bb6b29
Align LTX SP cross-attn anchor rope semantics
mickqian Apr 9, 2026
fd1db64
Revert "Align LTX SP cross-attn anchor rope semantics"
mickqian Apr 9, 2026
2fdbbcc
Try exact SP self-attention for LTX23 TI2V
mickqian Apr 9, 2026
f4d2bd1
Extend exact SP attention to LTX AV cross-attn
mickqian Apr 9, 2026
81d6c6c
Revert "Extend exact SP attention to LTX AV cross-attn"
mickqian Apr 9, 2026
834f1d9
Revert "Try exact SP self-attention for LTX23 TI2V"
mickqian Apr 9, 2026
28c87a2
Align LTX TI2V image crop semantics
mickqian Apr 9, 2026
225ef12
Revert "Align LTX TI2V image crop semantics"
mickqian Apr 9, 2026
7ab67a8
Use VAE image encoder for LTX23 one-stage TI2V
mickqian Apr 9, 2026
f557932
Keep LTX23 one-stage on official guider path
mickqian Apr 9, 2026
1d6d58f
Use official guider defaults for LTX23 one-stage
mickqian Apr 9, 2026
b808e7b
Remove LTX23 single-GPU SDPA override
mickqian Apr 9, 2026
e4534ca
Prefer FA for LTX23 one-stage on 1 GPU
mickqian Apr 9, 2026
6ad9224
Remove LTX23 SP audio latent sharding
mickqian Apr 10, 2026
666fd2d
Restore legacy LTX23 TI2V SP semantics
mickqian Apr 10, 2026
24162fb
Revert "Restore legacy LTX23 TI2V SP semantics"
mickqian Apr 10, 2026
9c1f8ff
Restore legacy LTX23 SP rope coords
mickqian Apr 10, 2026
cbc9924
Revert "Restore legacy LTX23 SP rope coords"
mickqian Apr 10, 2026
16d3671
Revert "Remove LTX23 SP audio latent sharding"
mickqian Apr 10, 2026
72a9653
Restore legacy LTX23 SP AV timesteps
mickqian Apr 10, 2026
0eb4b62
Revert "Restore legacy LTX23 SP AV timesteps"
mickqian Apr 10, 2026
64cbebd
Restore legacy LTX23 SP prompt masks
mickqian Apr 10, 2026
cf3b426
Revert "Restore legacy LTX23 SP prompt masks"
mickqian Apr 10, 2026
efca682
Disable LTX23 SP TI2V masks
mickqian Apr 10, 2026
259635c
Revert "Disable LTX23 SP TI2V masks"
mickqian Apr 10, 2026
3bb29b0
Restore legacy LTX23 SP rope coords
mickqian Apr 10, 2026
bccedf1
Revert "Restore legacy LTX23 SP rope coords"
mickqian Apr 10, 2026
6ae6e33
Keep LTX23 SP TI2V on CFG path
mickqian Apr 10, 2026
c1643b1
Revert "Keep LTX23 SP TI2V on CFG path"
mickqian Apr 10, 2026
1a32927
Use condition encoder for LTX23 SP TI2V
mickqian Apr 10, 2026
8ae3d91
Revert "Use condition encoder for LTX23 SP TI2V"
mickqian Apr 10, 2026
7c6c1d8
Restore replicated audio path for LTX23 SP TI2V
mickqian Apr 10, 2026
f6e1f06
Restore legacy LTX23 SP TI2V runtime path
mickqian Apr 10, 2026
e0bc7cc
Restore legacy LTX23 SP AV timesteps on legacy path
mickqian Apr 10, 2026
7bab1f6
Revert "Restore legacy LTX23 SP AV timesteps on legacy path"
mickqian Apr 10, 2026
c7a690b
Revert "Restore legacy LTX23 SP TI2V runtime path"
mickqian Apr 10, 2026
56688ab
Revert "Restore replicated audio path for LTX23 SP TI2V"
mickqian Apr 10, 2026
2e596b4
Restore SP defaults for LTX-2.3 on 2 GPUs
mickqian Apr 10, 2026
334521a
lint
mickqian Apr 10, 2026
e0d07eb
Merge remote-tracking branch 'origin/main' into ltx-2.3-two-stage
mickqian Apr 10, 2026
bdb6cfc
lint
mickqian Apr 10, 2026
cfe2e8c
Merge branch 'main' into ltx-2.3-two-stage
mickqian Apr 11, 2026
261ffb5
fix accuracy
mickqian Apr 11, 2026
7bb3f5a
Merge remote-tracking branch 'origin/main' into ltx-2.3-two-stage
mickqian Apr 11, 2026
3dc3b39
fix accuracy
mickqian Apr 11, 2026
3f42d6f
upd
mickqian Apr 11, 2026
544c941
upd
mickqian Apr 11, 2026
bee61a1
upd
mickqian Apr 11, 2026
f834eea
fix ltx 2.3 one stage regression
mickqian Apr 12, 2026
67fef89
upd
mickqian Apr 12, 2026
738e056
remove ut
mickqian Apr 12, 2026
2eb6d14
upd
mickqian Apr 12, 2026
f41a7f9
upd
mickqian Apr 12, 2026
8c5c6e8
refactor
mickqian Apr 12, 2026
54787e5
Restore LTX-2.3 one-stage legacy semantics
mickqian Apr 12, 2026
2ec753f
Avoid getattr in LTX denoising stage
mickqian Apr 12, 2026
77a327d
Format LTX denoising kwargs for black
mickqian Apr 12, 2026
b1fa4b4
Skip LTX-2.3 two-stage I2V consistency until GT lands
mickqian Apr 12, 2026
a0637e6
upd
mickqian Apr 12, 2026
ffa63bc
upd
mickqian Apr 12, 2026
32dfe98
upd
mickqian Apr 12, 2026
a44be9a
upd
mickqian Apr 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions docs/diffusion/compatibility_matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@ default parameters when initializing and generating videos.
| TurboWan2.1 T2V 14B | `IPostYellow/TurboWan2.1-T2V-14B-Diffusers` | 480p | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ⭕ |
| TurboWan2.1 T2V 14B 720P | `IPostYellow/TurboWan2.1-T2V-14B-720P-Diffusers` | 720p | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ⭕ |
| TurboWan2.2 I2V A14B | `IPostYellow/TurboWan2.2-I2V-A14B-Diffusers` | 720p | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ⭕ |
| LTX-2 | `Lightricks/LTX-2` | 768×512<br>1536×1024 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| LTX-2.3 | `Lightricks/LTX-2.3` | 768×512<br>1536×1024 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| LTX-2 (one and two stages) | `Lightricks/LTX-2` | 768×512<br>1536×1024 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| LTX-2.3 (one and two stages) | `Lightricks/LTX-2.3` | 768×512<br>1536×1024 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |

**Note**:

1. Wan2.2 TI2V 5B has some quality issues when performing I2V generation. We are working on fixing this issue.
2. SageSLA is based on SpargeAttn. Install it first with `pip install git+https://github.com/thu-ml/SpargeAttn.git --no-build-isolation`
3. LTX-2 two-stage generation uses `--pipeline-class-name LTX2TwoStagePipeline`. The spatial upsampler and distilled LoRA are auto-resolved from the model snapshot by default, and can still be overridden with `--spatial-upsampler-path` and `--distilled-lora-path`.
4. `Lightricks/LTX-2.3` is supported through the bundled native overlay materialization path. One-stage generation uses the default `LTX2Pipeline`; two-stage generation uses `--pipeline-class-name LTX2TwoStagePipeline`.
5. For LTX models, the `Resolutions` column uses output video `width×height` semantics, matching `sglang generate --width ... --height ...`. One-stage generation is validated at `768×512`; two-stage generation is validated at `1536×1024`.
3. LTX-2 and LTX-2.3 two-stage generation uses `--pipeline-class-name LTX2TwoStagePipeline`. The spatial upsampler and distilled LoRA are auto-resolved from the model snapshot by default, and can still be overridden with `--spatial-upsampler-path` and `--distilled-lora-path`.
- For LTX models, the `Resolutions` column uses output video `width×height` semantics, matching `sglang generate --width ... --height ...`.

### Image Generation Models

Expand Down
36 changes: 36 additions & 0 deletions python/sglang/multimodal_gen/configs/pipeline_configs/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,42 @@ def gather_latents_for_sp(self, latents, batch=None):
latents = sequence_model_parallel_all_gather(latents, dim=2)
return latents

def can_shard_audio_latents_for_sp(self, audio_latents) -> bool:
"""Return whether this pipeline uses packed audio latents that can be SP-sharded."""
return False

def shard_audio_latents_for_sp(self, batch, audio_latents):
"""Shard packed audio latents for SP. Pipelines without packed audio latents should return the input unchanged."""
return audio_latents, False

def gather_audio_latents_for_sp(self, audio_latents, batch):
"""Gather SP-sharded audio latents back to full sequence length."""
return audio_latents

def prepare_video_rope_coords_for_sp(
self,
model,
batch,
latent_model_input,
*,
num_frames,
height,
width,
):
"""Prepare model-side video RoPE coordinates for the local SP shard when the pipeline requires them."""
return None

def prepare_audio_rope_coords_for_sp(
self,
model,
batch,
audio_latent_model_input,
*,
num_frames,
):
"""Prepare model-side audio RoPE coordinates for the local SP shard when the pipeline requires them."""
return None

def gather_noise_pred_for_sp(self, batch, noise_pred):
noise_pred = self.gather_latents_for_sp(noise_pred)
raw_latent_shape = getattr(batch, "raw_latent_shape", None)
Expand Down
105 changes: 105 additions & 0 deletions python/sglang/multimodal_gen/configs/pipeline_configs/ltx_2.py
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ def shard_latents_for_sp(self, batch, latents):
latent_frames, tokens_per_frame = (
self._infer_video_latent_frames_and_tokens_per_frame(batch, seq_len)
)
orig_latent_frames = int(latent_frames)

# Pad whole frames so `latent_frames` is divisible by `sp_world_size`.
pad_frames = (sp_world_size - (latent_frames % sp_world_size)) % sp_world_size
Expand All @@ -360,6 +361,9 @@ def shard_latents_for_sp(self, batch, latents):

local_frames = int(latent_frames) // int(sp_world_size)
start_frame = int(sp_rank) * int(local_frames)
valid_local_frames = max(
min(int(orig_latent_frames) - int(start_frame), int(local_frames)), 0
)
start = int(start_frame) * int(tokens_per_frame)
end = int(start) + int(local_frames) * int(tokens_per_frame)
latents = latents[:, start:end, :]
Expand All @@ -368,6 +372,9 @@ def shard_latents_for_sp(self, batch, latents):
batch.sp_video_latent_num_frames = int(local_frames)
batch.sp_video_start_frame = int(start_frame)
batch.sp_video_tokens_per_frame = int(tokens_per_frame)
batch.sp_video_valid_token_count = int(valid_local_frames) * int(
tokens_per_frame
)

return latents, True

Expand All @@ -379,6 +386,104 @@ def gather_latents_for_sp(self, latents, batch=None):
return sequence_model_parallel_all_gather(latents.contiguous(), dim=1)
return super().gather_latents_for_sp(latents, batch=batch)

def shard_audio_latents_for_sp(self, batch, audio_latents):
sp_world_size = get_sp_world_size()
if sp_world_size <= 1:
return audio_latents, False
if not (isinstance(audio_latents, torch.Tensor) and audio_latents.ndim == 3):
return audio_latents, False

sp_rank = get_sp_parallel_rank()
seq_len = int(audio_latents.shape[1])
batch.sp_audio_orig_num_frames = int(seq_len)

pad_frames = (sp_world_size - (seq_len % sp_world_size)) % sp_world_size
if pad_frames:
pad = torch.zeros(
(audio_latents.shape[0], pad_frames, audio_latents.shape[2]),
device=audio_latents.device,
dtype=audio_latents.dtype,
)
audio_latents = torch.cat([audio_latents, pad], dim=1)
seq_len += int(pad_frames)

local_frames = seq_len // sp_world_size
start_frame = sp_rank * local_frames
end_frame = start_frame + local_frames
valid_local_frames = max(
min(
int(batch.sp_audio_orig_num_frames) - int(start_frame),
int(local_frames),
),
0,
)
audio_latents = audio_latents[:, start_frame:end_frame, :]

batch.sp_audio_latent_num_frames = int(local_frames)
batch.sp_audio_start_frame = int(start_frame)
batch.sp_audio_valid_token_count = int(valid_local_frames)
return audio_latents, True

def can_shard_audio_latents_for_sp(self, audio_latents) -> bool:
return (
get_sp_world_size() > 1
and isinstance(audio_latents, torch.Tensor)
and audio_latents.ndim == 3
)

def gather_audio_latents_for_sp(self, audio_latents, batch):
if get_sp_world_size() <= 1:
return audio_latents
if not (isinstance(audio_latents, torch.Tensor) and audio_latents.ndim == 3):
return audio_latents

audio_latents = sequence_model_parallel_all_gather(
audio_latents.contiguous(), dim=1
)
orig_num_frames = int(batch.sp_audio_orig_num_frames)
if orig_num_frames > 0:
audio_latents = audio_latents[:, :orig_num_frames, :]
return audio_latents

def prepare_video_rope_coords_for_sp(
self,
model,
batch,
latent_model_input,
*,
num_frames,
height,
width,
):
if not batch.did_sp_shard_latents:
return None
return model.rope.prepare_video_coords(
batch_size=int(latent_model_input.shape[0]),
num_frames=num_frames,
height=height,
width=width,
device=latent_model_input.device,
fps=batch.fps,
start_frame=int(batch.sp_video_start_frame),
)

def prepare_audio_rope_coords_for_sp(
self,
model,
batch,
audio_latent_model_input,
*,
num_frames,
):
if not batch.did_sp_shard_audio_latents:
return None
return model.audio_rope.prepare_audio_coords(
batch_size=int(audio_latent_model_input.shape[0]),
num_frames=num_frames,
device=audio_latent_model_input.device,
start_frame=int(batch.sp_audio_start_frame),
)

def maybe_pack_audio_latents(self, latents, batch_size, batch):
# If already packed (3D shape [B, T, C*F]), skip packing
if latents.dim() == 3:
Expand Down
Loading
Loading