LTX2.5
LTX2.5
SGLang Diffusion으로 LTX-2.5 비디오 + 오디오 생성을 실행합니다.
출처: 문서
본문
<DiffusionModelTags tags={["video", "audio", "text-to-video", "image-to-video", "two-stage", "auto-duration"]} />
1. 모델 소개 (Model Introduction)
LTX-2.5는 Lightricks가 만든 오픈 월드 모델로, 로컬 실행과 파인튜닝을 위해 설계되었습니다. 확립된 용도는 텍스트·이미지·비디오 입력에서 동기화된 고품질 비디오와 오디오를 생성하는 것입니다.
이는 Gemma-4-12B 텍스트 인코더, 별도의 비디오·오디오 VAE, 48kHz 스테레오를 출력하는 보코더와 짝을 이루는 22B DiT입니다. 비디오와 오디오는 나중에 더빙하는 대신 한 번에 함께 디노이징되므로 동기화가 유지됩니다.
--model-path로 Lightricks/LTX-2.5-Diffusers 를 사용하세요.
1.1 LTX-2.5의 새로운 기능 (New in LTX-2.5)
LTX-2 / LTX-2.3에는 없던 두 가지 기능:
둘 다 선택 사항이며 기본적으로 꺼져 있습니다.
1.2 구성 요소 (Components)
| 경로 (Path) | 구성 요소 (Component) | 사용처 (Used by) |
|---|---|---|
transformer/ |
증류된 DiT(기본값) | 항상 |
transformer_full/ |
전체/SFT DiT | --model-variant dev |
vae/ |
합성곱 비디오 VAE | 인코딩은 항상; 디코딩은 기본값 |
diffusion_decoder/ |
디퓨전 비디오 디코더, 디코더 전용 | --use-diffusion-decoder |
latent_upsampler/ |
공간 x2 잠재 업샘플러 | LTX2TwoStagePipeline |
duration_head/ |
캡션에서 클립 길이 예측 | --auto-duration |
audio_vae/, vocoder/, connectors/, text_encoder/, tokenizer/, scheduler/ |
공유됨 | 항상 |
인코딩은 항상 vae/를 사용하고 두 디코더는 같은 잠재를 소비하므로, 디코더 선택은 그 위쪽 단계를 바꾸지 않습니다.
2. SGLang-diffusion 설치 (Installation)
uv pip install "sglang[diffusion]" --prerelease=allow
플랫폼별 설정은 SGLang Diffusion 설치 가이드를 참고하세요.
NATTEN은 선택적 추가 항목이며 diffusion decoder를 사용할 계획일 때만 설치할 가치가 있습니다. 이유는 해당 섹션을 참고하세요.
3. 모델 배포 (Model Deployment)
3.1 기본 구성 (Basic Configuration)
sglang serve \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline
단일 고VRAM GPU에서는 추가 플래그가 필요 없습니다.
대화형 명령 생성기 (Interactive Command Generator): 대상을 선택하고 원하는 기능을 고르면 아래 명령이 업데이트됩니다. 서버 측 선택(pipeline class, weights variant, parallelism)은 sglang serve에 들어가고, 요청별 선택(auto-duration, diffusion decoder, resolution)은 sglang generate 호출이나 요청 본문에 속하므로 별도로 나열됩니다.
3.2 구성 팁 (Configuration Tips)
품질과 지연 목표에 따라 pipeline class를 선택하세요:
| 사용 사례 (Use case) | Pipeline class | 참고 (Notes) |
|---|---|---|
| 1단계 생성 (One-stage generation) | LTX2Pipeline |
가장 빠른 경로. T2V와 TI2V, auto-duration, diffusion decoder를 지원. |
| 2단계 생성 (Two-stage generation) | LTX2TwoStagePipeline |
절반 해상도 기본 단계, x2 잠재 업샘플, 짧은 리파인먼트. 최종 해상도를 전달. |
LTX-2.5에는 HQ pipeline class가 없고, 어떤 weights variant에도 --distilled-lora-path가 없습니다. LTX-2.5는 단계별로 LoRA를 병합하는 대신 가중치 자체를 증류하므로, 그 교체를 관리하는 --ltx2-two-stage-device-mode도 적용되지 않습니다.
이 페이지의 모든 기능(텍스트-투-비디오, 이미지 컨디셔닝, auto-duration, diffusion decoder, 두 weights variant 모두)은 두 pipeline class 모두에서 동작합니다.
가중치 선택:
--model-variant dev는transformer_full/에서 전체/SFT DiT를 서빙합니다. 기본값은 증류된 것입니다. 섹션 4.5를 참고하세요.
3.3 멀티 GPU 프리셋 (Multi-GPU presets)
| 대상 (Target) | 권장 서버 플래그 (Recommended server flags) | 참고 (Notes) |
|---|---|---|
| 1 고VRAM GPU | (추가 플래그 없음) | 960×544가 H200에서 여유롭게 맞습니다. |
| 1 타이트 VRAM GPU | --quantization fp8 |
DiT를 반으로 줄이고 최고 메모리를 ~18 GB 줄이며 속도는 유지. 섹션 3.4 참고. |
| 1 매우 타이트 GPU | --dit-layerwise-offload |
최고 메모리를 약 10 GB 줄이며 벽시계 시간은 약 4배. |
| 2 GPU, 긴 시퀀스 | --num-gpus 2 --ulysses-degree 2 |
시퀀스 병렬. 메모리/긴 시퀀스용 도구. |
| 2 GPU, 대형 DiT | --num-gpus 2 --tp-size 2 |
어텐션 헤드에 걸친 텐서 병렬. |
| 2 GPU, dev 가중치 | --num-gpus 2 --enable-cfg-parallel |
유도·비유도 분기를 GPU에 분할. 디노이징에서 1.77x 측정(960×544 / 57 프레임 / 30 스텝에서 15.1s → 8.5s). |
| 2 GPU, diffusion decoder | --num-gpus 2 --ulysses-degree 2 |
디코더 타일이 기본적으로 랭크 간 분할. 섹션 4.6.1 참고. |
3.4 fp8 양자화 (fp8 quantization)
--quantization fp8은 DiT의 선형 레이어를 로드하면서 양자화하므로 사전 양자화된 체크포인트가 필요 없습니다:
sglang serve \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--quantization fp8
960×544 / 49 프레임에서 트랜스포머는 bf16의 35.37 GB 대비 18.11 GB로 로드되고, 실행은 71.1 GB 대비 53.5 GB로 최고점에 달합니다. 디노이징 시간은 동일합니다. 이 크기의 증류 8-스텝 경로는 matmul 처리량보다 메모리 트래픽에 묶여 있으므로 fp8은 속도가 아니라 여유 공간을 사줍니다.
주어진 시드에 대해 다른 샘플을 기대하세요. 양자화는 디노이징 궤적을 살짝 바꾸고 diffusion이 이를 증폭하므로, 결과가 bf16과 다르되 더 나쁘지는 않습니다.
4. 모델 호출 (Model Invocation)
4.1 오디오가 있는 텍스트-투-비디오 (Text-to-video with audio)
sglang generate \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--prompt "A cinematic shot of a red fox walking through a snowy forest at dawn, the camera tracking alongside, snow crunching underfoot." \
--save-output
기본값: 960×544, 121 프레임, 24 fps. 비디오와 오디오는 함께 생성되어 하나의 MP4로 멀티플렉싱됩니다.
기본 DiT는 증류되어 스텝 수가 아닌 고정 8-시그마 스케줄로 실행되므로 여기서 --num-inference-steps와 --guidance-scale은 효과가 없습니다. 둘 중 하나를 제어하려면 --model-variant dev를 사용하세요.
4.2 이미지-투-비디오 (Image-to-video)
sglang generate \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--image-path ./inputs/start.png \
--prompt "The camera pushes forward as the subject turns toward the light." \
--save-output
컨디셔닝 이미지는 모델이 훈련된 압축과 일치하도록 재압축됩니다. LTX-2.5는 CRF 18이고 LTX-2 / 2.3은 33을 사용합니다. SGLang은 체크포인트에서 올바른 것을 선택하므로 아무것도 전달할 필요가 없습니다.
4.3 Auto-duration
<span style={{fontSize: "0.7em", verticalAlign: "middle", padding: "2px 8px", borderRadius: "9999px", background: "#16a34a", color: "#fff"}}>NEW
LTX-2.5는 인코딩된 캡션을 읽고 그것이 설명하는 장면의 자연스러운 길이를 회귀하는 작은 모듈인 duration head를 제공합니다. 프롬프트가 길이를 암시할 때("quick glance" vs "slow pan across the valley") 프레임 수를 추측하기보다 이를 사용하세요:
sglang generate \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--prompt "A red fox walking through a snowy forest at dawn." \
--auto-duration \
--save-output
예측은 --auto-duration-min-seconds / --auto-duration-max-seconds(기본값 1–20 s)로 클램프되고 VAE의 시간 그리드에 스냅되므로 결과는 항상 유효한 프레임 수입니다. --num-frames를 덮어씁니다.
온라인 서버에서는 동일한 LTX-2.5 전용 제어를 extra_body로 전달하세요:
from openai import OpenAI
client = OpenAI(api_key="EMPTY", base_url="http://localhost:30010/v1")
video = client.videos.create(
model="Lightricks/LTX-2.5-Diffusers",
prompt="A red fox walking through a snowy forest at dawn.",
extra_body={
"auto_duration": True,
"auto_duration_min_seconds": 2.0,
"auto_duration_max_seconds": 8.0,
},
)
4.4 2단계 (더 높은 품질) (Two-stage (higher quality))
1단계는 요청 해상도의 절반에서 실행되고, 잠재는 2배 업샘플링되며, 짧은 시그마 꼬리가 전체 해상도에서 리파인합니다. 최종 크기를 전달하세요:
sglang generate \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2TwoStagePipeline \
--prompt "A cinematic shot of a red fox walking through a snowy forest at dawn." \
--height 1088 --width 1920 \
--save-output
해상도는 64로 나누어져야 합니다. LTX-2.3과 달리 --distilled-lora-path가 필요 없습니다. LTX-2.5 트랜스포머는 이미 증류되어 있습니다.
4.5 dev 트랜스포머 (The dev transformer)
LTX-2.5는 두 개의 DiT를 제공합니다. model_index.json은 증류된 것을 가리키고, 전체/SFT 가중치는 transformer_full/에 있으며 의도적으로 인덱스에서 제외됩니다. --model-variant dev로 선택하세요:
sglang generate \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--model-variant dev \
--prompt "A cinematic shot of a red fox walking through a snowy forest at dawn." \
--num-inference-steps 30 --guidance-scale 3.0 \
--save-output
dev 변형은 증류되지 않으므로 SGLang은 고정된 증류 시그마 스케줄을 자동으로 버리고 scheduler/가 증류 DiT에 대해 끄는 동적 시프팅을 다시 활성화합니다. 증류 경로와 달리 스텝 수로 구동되며 CFG를 원하므로 --num-inference-steps와 --guidance-scale을 직접 전달하세요.
from_pretrained는 model_index.json이 나열한 것만 가져오므로 부분 스냅샷 다운로드는 transformer_full/(추가 38 GB)를 포함하지 않습니다.
4.6 Diffusion 디코더 (Diffusion decoder)
<span style={{fontSize: "0.7em", verticalAlign: "middle", padding: "2px 8px", borderRadius: "9999px", background: "#16a34a", color: "#fff"}}>NEW
LTX-2.5는 합성곱 VAE 디코더의 대안으로 diffusion 기반 비디오 디코더를 추가합니다. 잠재를 디컨볼루션하는 대신 잠재로 구축된 컨텍스트 볼륨에 조건화하여 픽셀을 디노이징하는데, 이는 합성곱 디코더가 부드럽게 지우는 경향이 있는 디테일을 복구합니다:
sglang generate \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--prompt "A red fox walking through a snowy forest at dawn." \
--use-diffusion-decoder \
--save-output
이는 그 자체로 diffusion 모델이며 VAE 디코더보다 느리게 디코딩하므로 기본적으로 꺼져 있습니다. 업스트림과 일치하며, LTX2Pipeline도 VAE로 디코딩합니다. 오프라인 generate 명령은 --use-diffusion-decoder가 있을 때 선택적 디코더를 자동으로 로드합니다.
온라인 서버의 경우 시작 시 디코더 로드를 선택하고 요청별로 use_diffusion_decoder: true로 선택하세요:
sglang serve \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--load-diffusion-decoder
video = client.videos.create(
model="Lightricks/LTX-2.5-Diffusers",
prompt="A red fox walking through a snowy forest at dawn.",
extra_body={"use_diffusion_decoder": True},
)
이렇게 하면 기본 서버 풋프린트는 유지하면서 VAE와 diffusion-decoder 요청이 하나의 서버를 공유할 수 있습니다. GPU 메모리가 제한될 때 --cpu-offload-components diffusion_decoder가 선택적 디코더를 사용 사이에 CPU에 유지합니다.
NATTEN은 특정 torch·CUDA 빌드에 고정된 사전 빌드 휠을 제공하므로, 버전만이 아니라 환경과 일치하는 것을 설치하세요. 조합은 natten.org에서 확인하세요. 예를 들어 torch 2.11 / CUDA 13.0의 경우:
uv pip install natten==0.21.6+torch2110cu130 -f https://whl.natten.org/
건너뛰어도 다른 것은 바뀌지 않습니다. 디코더는 여전히 같은 비디오를 생성하며, 단지 더 느릴 뿐입니다.
4.6.1 메모리와 멀티 GPU (Memory and multi-GPU)
디코딩 실행 방식을 결정하는 두 개의 플래그. 둘 다 기본적으로 켜져 있으므로 아래 숫자는 이미 얻는 것입니다. 하나를 끄고 싶을 때 중요합니다.
--diffusion-decoder-tiling은 디코더의 두 비싼 단계를 전체 볼륨 대신 겹치는 타일로 실행합니다. 속도가 아닌 메모리 제어입니다. 벽시계가 들고 여유 공간을 삽니다.
--diffusion-decoder-parallel-tiling은 그 타일을 디코드-병렬 랭크(한 복제본의 TP, SP, PP, CFG 랭크. 디코더는 그 모두에 복제되므로)에 분할합니다. 없으면 그 랭크 각각이 모든 타일을 디코딩하고 자체 동일 복사본을 유지합니다. 타일 경로에서만 적용되므로 타일링이 꺼지면 아무것도 하지 않고, 단일 랭크에서도 아무것도 하지 않습니다.
2xH200, 960×544, Ulysses degree 2에서의 디코딩 단계. "Peak"은 디코드만이 아니라 전체 프로세스입니다:
| 프레임 (Frames) | 타일링 (Tiling) | 병렬 타일링 (Parallel tiling) | 디코드 (Decode) | 최고 (Peak) |
|---|---|---|---|---|
| 121 | off | (n/a) | 3.38s | 103.2 GB |
| 121 | on | off | 5.68s | 78.2 GB |
| 121 | on | on | 4.08s | 79.3 GB |
| 49 | off | (n/a) | 1.93s | 84.0 GB |
| 49 | on | off | 2.79s | 78.2 GB |
| 49 | on | on | 2.12s | 78.2 GB |
읽는 방법:
- 타일링 없는 것이 맞을 때마다 가장 빠른 옵션입니다. 타일링은 121 프레임에서 절약하는 ~25 GB 때문에 존재하며, 이는 80 GB 카드에 맞는지 여부의 차이입니다.
- 병렬 타일링은 타일링 비용의 대부분을 회수합니다 — 121 프레임에서 1.39x, 49에서 1.32x — 그러나 타일링 없는 디코드를 이기지는 못합니다. 또한 gather 버퍼에 약 1 GB가 더 듭니다.
- 이점은 타일 수에 따라 커지므로 고해상도에서 더 큽니다. 1920×1088 / 49 프레임에서 디코드는 12.32s에서 7.86s, 1.57x로 갑니다.
타일이 몇 랭크에 분할되어도 출력은 비트 단위로 동일합니다. 모든 랭크가 같은 순서로 전체 그리드의 노이즈를 그리고 디코드만 공유됩니다. 타일링을 켜거나 끄는 것은 타일 경계 근처에서 결과를 약간 바꾸므로, 재현 가능한 프레임이 필요하면 하나를 선택하고 유지하세요:
# Fastest, if the untiled decode fits in VRAM
sglang serve \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--load-diffusion-decoder \
--diffusion-decoder-tiling false
# Memory-bound: keep tiling, and split the tiles over both GPUs
sglang serve \
--model-path Lightricks/LTX-2.5-Diffusers \
--pipeline-class-name LTX2Pipeline \
--load-diffusion-decoder \
--num-gpus 2 --ulysses-degree 2