Skip to content

[Bug]: LTX-2.3 multi-GPU Ulysses SP dummy run fails because audio latents are not padded to SP size #3853

@mglyn

Description

@mglyn

Your current environment

The output of python collect_env.py
uv is set
/root/vllm-omni/vllm_omni/version.py:55: RuntimeWarning: vLLM and vLLM-Omni appear to have mismatched major/minor versions:
 --> vLLM-Omni version 0.20.1.dev179+gb52a5ca40
 --> vLLM version 0.21.0
This will likely cause compatibility issues.
  warn_if_misaligned_vllm_version()
==============================
        System Info
==============================
OS                           : Ubuntu 24.04.1 LTS (x86_64)
GCC version                  : (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
Clang version                : Could not collect
CMake version                : version 3.31.4
Libc version                 : glibc-2.39

==============================
       PyTorch Info
==============================
PyTorch version              : 2.11.0+cu130
Is debug build               : False
CUDA used to build PyTorch   : 13.0
ROCM used to build PyTorch   : N/A

==============================
      Python Environment
==============================
Python version               : 3.12.3 (main, Nov  6 2024, 18:32:19) [GCC 13.2.0] (64-bit runtime)
Python platform              : Linux-5.4.0-216-generic-x86_64-with-glibc2.39

==============================
       CUDA / GPU Info
==============================
Is CUDA available            : True
CUDA runtime version         : 12.8.61
CUDA_MODULE_LOADING set to   : LAZY
GPU models and configuration : 
GPU 0: NVIDIA A100-SXM4-80GB
GPU 1: NVIDIA A100-SXM4-80GB
GPU 2: NVIDIA A100-SXM4-80GB
GPU 3: NVIDIA A100-SXM4-80GB
GPU 4: NVIDIA A100-SXM4-80GB
GPU 5: NVIDIA A100-SXM4-80GB
GPU 6: NVIDIA A100-SXM4-80GB
GPU 7: NVIDIA A100-SXM4-80GB

Nvidia driver version        : 580.159.03
cuDNN version                : Probably one of the following:
/usr/lib/x86_64-linux-gnu/libcudnn.so.9.7.0
/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.7.0
/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.7.0
/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.7.0
/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.7.0
/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.7.0
/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.7.0
/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.7.0
HIP runtime version          : N/A
MIOpen runtime version       : N/A
Is XNNPACK available         : True

==============================
          CPU Info
==============================
Architecture:                       x86_64
CPU op-mode(s):                     32-bit, 64-bit
Address sizes:                      43 bits physical, 48 bits virtual
Byte Order:                         Little Endian
CPU(s):                             192
On-line CPU(s) list:                0-191
Vendor ID:                          AuthenticAMD
BIOS Vendor ID:                     Advanced Micro Devices, Inc.
Model name:                         AMD EPYC 7642 48-Core Processor
BIOS Model name:                    AMD EPYC 7642 48-Core Processor                 Unknown CPU @ 2.3GHz
BIOS CPU family:                    107
CPU family:                         23
Model:                              49
Thread(s) per core:                 2
Core(s) per socket:                 48
Socket(s):                          2
Stepping:                           0
Frequency boost:                    enabled
CPU(s) scaling MHz:                 66%
CPU max MHz:                        2300.0000
CPU min MHz:                        1500.0000
BogoMIPS:                           4600.01
Flags:                              fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate ssbd mba ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr wbnoinvd arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip rdpid overflow_recov succor smca sme sev sev_es
Virtualization:                     AMD-V
L1d cache:                          3 MiB (96 instances)
L1i cache:                          3 MiB (96 instances)
L2 cache:                           48 MiB (96 instances)
L3 cache:                           512 MiB (32 instances)
NUMA node(s):                       2
NUMA node0 CPU(s):                  0-47,96-143
NUMA node1 CPU(s):                  48-95,144-191
Vulnerability Gather data sampling: Not affected
Vulnerability Itlb multihit:        Not affected
Vulnerability L1tf:                 Not affected
Vulnerability Mds:                  Not affected
Vulnerability Meltdown:             Not affected
Vulnerability Mmio stale data:      Not affected
Vulnerability Retbleed:             Vulnerable
Vulnerability Spec store bypass:    Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Vulnerability Spectre v1:           Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:           Mitigation; Retpolines; IBPB conditional; IBRS_FW; STIBP conditional; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected
Vulnerability Srbds:                Not affected
Vulnerability Tsx async abort:      Not affected

==============================
Versions of relevant libraries
==============================
[pip3] flashinfer-python==0.6.8.post1
[pip3] numpy==2.3.5
[pip3] nvidia-cublas==13.1.0.3
[pip3] nvidia-cuda-cupti==13.0.85
[pip3] nvidia-cuda-nvrtc==13.0.88
[pip3] nvidia-cuda-runtime==13.0.96
[pip3] nvidia-cudnn-cu13==9.19.0.56
[pip3] nvidia-cudnn-frontend==1.18.0
[pip3] nvidia-cufft==12.0.0.61
[pip3] nvidia-cufile==1.15.1.6
[pip3] nvidia-curand==10.4.0.35
[pip3] nvidia-cusolver==12.0.4.66
[pip3] nvidia-cusparse==12.6.3.3
[pip3] nvidia-cusparselt-cu13==0.8.0
[pip3] nvidia-cutlass-dsl==4.4.2
[pip3] nvidia-cutlass-dsl-libs-base==4.4.2
[pip3] nvidia-ml-py==13.595.45
[pip3] nvidia-nccl-cu13==2.28.9
[pip3] nvidia-nvjitlink==13.0.88
[pip3] nvidia-nvshmem-cu13==3.4.5
[pip3] nvidia-nvtx==13.0.85
[pip3] onnxruntime==1.26.0
[pip3] pyzmq==27.1.0
[pip3] tokenspeed-triton==3.7.10.post20260505
[pip3] torch==2.11.0
[pip3] torch-c-dlpack-ext==0.1.5
[pip3] torch-einops-utils==0.0.34
[pip3] torchaudio==2.11.0
[pip3] torchsde==0.2.6
[pip3] torchvision==0.26.0
[pip3] transformers==5.9.0
[pip3] triton==3.6.0
[pip3] x-transformers==2.19.3
[conda] Could not collect

==============================
         vLLM Info
==============================
ROCM Version                 : Could not collect
vLLM Version                 : 0.21.0
vLLM-Omni Version            : 0.20.1.dev179+gb52a5ca40 (git sha: b52a5ca40)
vLLM Build Flags:
  CUDA Archs: 7.5 8.0 8.6 9.0 10.0 12.0+PTX; ROCm: Disabled
GPU Topology:
        GPU0    GPU1    GPU2    GPU3    GPU4    GPU5    GPU6    GPU7    NIC0    NIC1    NIC2    NIC3       NIC4    NIC5    NIC6    NIC7    NIC8    NIC9    NIC10   NIC11   NIC12   NIC13   NIC14   NIC15      NIC16   NIC17   CPU Affinity    NUMA Affinity   GPU NUMA ID
GPU0     X      NV12    NV12    NV12    NV12    NV12    NV12    NV12    NODE    NODE    NODE    NODE       PXB     PXB     PXB     PXB     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS     SYS     0-47,96-143     0               N/A
GPU1    NV12     X      NV12    NV12    NV12    NV12    NV12    NV12    NODE    NODE    NODE    NODE       PXB     PXB     PXB     PXB     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS     SYS     0-47,96-143     0               N/A
GPU2    NV12    NV12     X      NV12    NV12    NV12    NV12    NV12    PXB     PXB     PXB     PXBNODE    NODE    NODE    NODE    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS     0-47,96-143     0               N/A
GPU3    NV12    NV12    NV12     X      NV12    NV12    NV12    NV12    PXB     PXB     PXB     PXBNODE    NODE    NODE    NODE    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS     0-47,96-143     0               N/A
GPU4    NV12    NV12    NV12    NV12     X      NV12    NV12    NV12    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    PXB     PXB     PXB     PXB     NODE       NODE    48-95,144-191   1               N/A
GPU5    NV12    NV12    NV12    NV12    NV12     X      NV12    NV12    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    PXB     PXB     PXB     PXB     NODE       NODE    48-95,144-191   1               N/A
GPU6    NV12    NV12    NV12    NV12    NV12    NV12     X      NV12    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     PXB     PXB     PXB     PXB     NODE    NODE    NODE    NODE    NODE       NODE    48-95,144-191   1               N/A
GPU7    NV12    NV12    NV12    NV12    NV12    NV12    NV12     X      SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     PXB     PXB     PXB     PXB     NODE    NODE    NODE    NODE    NODE       NODE    48-95,144-191   1               N/A
NIC0    NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYS      X      PIX     PIX     PIXNODE    NODE    NODE    NODE    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS
NIC1    NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYS     PIX      X      PIX     PIXNODE    NODE    NODE    NODE    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS
NIC2    NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYS     PIX     PIX      X      PIXNODE    NODE    NODE    NODE    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS
NIC3    NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYS     PIX     PIX     PIX      X NODE    NODE    NODE    NODE    SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS
NIC4    PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE        X      PIX     PXB     PXB     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS     SYS
NIC5    PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE       PIX      X      PXB     PXB     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS     SYS
NIC6    PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE       PXB     PXB      X      PIX     SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS     SYS
NIC7    PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE       PXB     PXB     PIX      X      SYS     SYS     SYS     SYS     SYS     SYS     SYS     SYSSYS     SYS
NIC8    SYS     SYS     SYS     SYS     NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS      X      PIX     PXB     PXB     NODE    NODE    NODE    NODE    NODE       NODE
NIC9    SYS     SYS     SYS     SYS     NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     PIX      X      PXB     PXB     NODE    NODE    NODE    NODE    NODE       NODE
NIC10   SYS     SYS     SYS     SYS     NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     PXB     PXB      X      PIX     NODE    NODE    NODE    NODE    NODE       NODE
NIC11   SYS     SYS     SYS     SYS     NODE    NODE    PXB     PXB     SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     PXB     PXB     PIX      X      NODE    NODE    NODE    NODE    NODE       NODE
NIC12   SYS     SYS     SYS     SYS     PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE     X      PIX     PXB     PXB     NODE       NODE
NIC13   SYS     SYS     SYS     SYS     PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    PIX      X      PXB     PXB     NODE       NODE
NIC14   SYS     SYS     SYS     SYS     PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    PXB     PXB      X      PIX     NODE       NODE
NIC15   SYS     SYS     SYS     SYS     PXB     PXB     NODE    NODE    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    PXB     PXB     PIX      X      NODE       NODE
NIC16   SYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    NODE    NODE    NODE    NODE     X PIX
NIC17   SYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    SYS     SYS     SYS     SYSSYS     SYS     SYS     SYS     NODE    NODE    NODE    NODE    NODE    NODE    NODE    NODE    PIX X 

Legend:

  X    = Self
  SYS  = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
  NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
  PHB  = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
  PXB  = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
  PIX  = Connection traversing at most a single PCIe bridge
  NV#  = Connection traversing a bonded set of # NVLinks

NIC Legend:

  NIC0: mlx5_0
  NIC1: mlx5_1
  NIC2: mlx5_2
  NIC3: mlx5_3
  NIC4: mlx5_4
  NIC5: mlx5_5
  NIC6: mlx5_6
  NIC7: mlx5_7
  NIC8: mlx5_8
  NIC9: mlx5_9
  NIC10: mlx5_10
  NIC11: mlx5_11
  NIC12: mlx5_12
  NIC13: mlx5_13
  NIC14: mlx5_14
  NIC15: mlx5_15
  NIC16: mlx5_16
  NIC17: mlx5_17

==============================
     Environment Variables
==============================
NVIDIA_VISIBLE_DEVICES=all
CUBLAS_VERSION=12.8.3.14
NVIDIA_REQUIRE_CUDA=cuda>=9.0
CUDA_CACHE_DISABLE=1
TORCH_CUDA_ARCH_LIST=7.5 8.0 8.6 9.0 10.0 12.0+PTX
NCCL_VERSION=2.25.1
NCCL_NVLS_ENABLE=0
NVIDIA_DRIVER_CAPABILITIES=compute,utility,video
TORCH_NCCL_USE_COMM_NONBLOCKING=0
NVIDIA_PRODUCT_NAME=PyTorch
CUDA_VERSION=12.8.0.038
PYTORCH_VERSION=2.6.0a0+ecf3bae
PYTORCH_BUILD_NUMBER=0
CUDNN_FRONTEND_VERSION=1.9.0
CUDNN_VERSION=9.7.0.66
PYTORCH_HOME=/opt/pytorch/pytorch
LD_LIBRARY_PATH=/root/.venv/lib/python3.12/site-packages/cv2/../../lib64:/usr/local/lib/python3.12/dist-packages/torch/lib:/usr/local/lib/python3.12/dist-packages/torch_tensorrt/lib:/usr/local/cuda/compat/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
NVIDIA_BUILD_ID=134983853
CUDA_DRIVER_VERSION=570.86.10
PYTORCH_BUILD_VERSION=2.6.0a0+ecf3bae
CUDA_HOME=/usr/local/cuda
CUDA_HOME=/usr/local/cuda
CUDA_MODULE_LOADING=LAZY
NVIDIA_REQUIRE_JETPACK_HOST_MOUNTS=
NVIDIA_PYTORCH_VERSION=25.01
TORCH_ALLOW_TF32_CUBLAS_OVERRIDE=1
PYTORCH_NVML_BASED_CUDA_CHECK=1
TORCHINDUCTOR_COMPILE_THREADS=1
TORCHINDUCTOR_CACHE_DIR=/tmp/torchinductor_root

Your code version

The commit id or version of vllm
0.21.0
The commit id or version of vllm-omni
0.20.1

🐛 Describe the bug

Startup repro command:

vllm serve LTX-2.3-diffusers \
    --omni --model-class-name LTX23Pipeline \
    --ulysses-degree 2 --ulysses-mode advanced_uaa --enforce-eager

Offline repro command:

python examples/offline_inference/text_to_video/text_to_video.py \
  --model LTX-2.3-diffusers \
  --model-class-name LTX23Pipeline \
  --prompt "A majestic bald eagle soaring over a misty mountain valley at dawn, golden sunlight breaking through clouds" \
  --negative-prompt "blurry, low quality, distorted, watermark" \
  --width 768 \
  --height 512 \
  --num-frames 128 \
  --fps 24 \
  --frame-rate 24 \
  --num-inference-steps 10 \
  --guidance-scale 4.0 \
  --seed 42 \
  --ulysses-degree 2 --ulysses-mode advanced_uaa --enforce-eager \
  --output results/ltx23_baseline/usp2_uaa_eager_128f.mp4

Describe the Bug

LTX-2.3 fails during the startup dummy run when Ulysses sequence parallelism is enabled.

The failure happens before serving starts:

RuntimeError: Orchestrator initialization failed: Dummy run failed: Tensor size along dim 1 (1) must be >= world_size (2). Tensor shape: torch.Size([2, 1, 128])

The stack shows the failure happens when the SP hook tries to shard transformer input audio_hidden_states:

pipeline_ltx2_3.py", line 869, in forward
    noise_pred_video, noise_pred_audio = self.transformer(

sequence_parallel.py", line 203, in pre_forward
    input_val = self._prepare_sp_input(input_val, spm, args_list, kwargs)

sequence_parallel.py", line 358, in _prepare_sp_input
    return sp_shard(x, sp_input.split_dim, validate=False)

sp_sharding.py", line 67, in sp_shard
    raise ValueError(

ValueError: Tensor size along dim 1 (1) must be >= world_size (2). Tensor shape: torch.Size([2, 1, 128])

Root Cause

The LTX-2.3 dummy run uses the default diffusion sampling params. num_frames defaults to 1, and LTX-2.3 derives audio latent length from video duration:

duration_s = num_frames / frame_rate
audio_num_frames = round(duration_s * audio_latents_per_second)

With the current defaults this produces audio_num_frames == 1.

The shared LTX transformer SP plan shards audio_hidden_states on sequence dimension:

"audio_hidden_states": SequenceParallelInput(split_dim=1, expected_dims=3, split_output=False)

So the dummy-run audio tensor reaches the SP hook as:

torch.Size([2, 1, 128])

and cannot be sharded across ulysses_degree=2.

LTX-2 Comparison

LTX2Pipeline.prepare_audio_latents() already pads audio latent length to sequence_parallel_size before the transformer, and unpads it before audio decode.

Relevant LTX-2 behavior:

  • compute padded_latent_length
  • if sequence_parallel_size > 1, round audio latent length up to a divisible length
  • validate provided audio_latents length against either original or padded length
  • append zero padding when provided latents are unpadded
  • use padded length for generated random audio latents
  • unpad back to the original audio length before unpack/decode

LTX23Pipeline.prepare_audio_latents() currently keeps:

padded_latent_length = original_latent_length

and does not apply the same SP padding. That is the code difference that makes LTX-2 startup pass while LTX-2.3 fails on the dummy run.

Validation With Patch

After applying the same audio latent SP padding behavior to LTX23Pipeline.prepare_audio_latents():

python -m pytest tests/diffusion/models/ltx2/test_ltx2_3_pipeline.py::TestAudioLatentSPPadding -q

Result:

3 passed

The offline LTX-2.3 generation command above also completed successfully with:

Parallel configuration: ulysses_degree=2, ring_degree=1
Frames: 128
Inference steps: 10
Saved generated video to results/ltx23_baseline/usp2_uaa_eager_128f.mp4

The dummy-run failure no longer occurs after padding audio_latents to the SP world size.

Expected Behavior

LTX-2.3 should use the same audio latent SP padding behavior as LTX-2:

  • dummy run with audio_num_frames == 1 and ulysses_degree=2 should pad audio latents to length 2
  • transformer input audio_hidden_states should be shardable
  • output audio latents should be unpadded back to the original length before unpack/decode

Before submitting a new issue...

  • Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the documentation page, which can answer lots of frequently asked questions.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions