Diffusers documentation
LTX2VideoDiffusionDecoderModel
LTX2VideoDiffusionDecoderModel
Bộ giải mã video khuếch tán được giới thiệu trong LTX-2.5 bởi Lightricks. Các giai đoạn chú ý lân cận (neighborhood-attention) sẽ tăng mẫu (upsample) ẩn (latent) thành một thể tích ngữ cảnh (context volume), và giai đoạn cuối cùng sẽ khử nhiễu (denoise) các pixel dựa trên ngữ cảnh đó.
Đây là một decoder, không phải autoencoder: quá trình encoding vẫn thuộc về AutoencoderKLLTX2Video, không gian latent mà thành phần này sử dụng không thay đổi, do đó các latent có thể hoán đổi giữa decoder convolutional và decoder này. Vì bản thân nó là một mô hình diffusion, nó được điều khiển bởi LTX2VideoDiffusionDecodePipeline thay vì được truyền vào như vae của một pipeline: chạy bất kỳ pipeline LTX-2 nào với output_type="latent", sau đó giải mã.
import torch
from diffusers import LTX2Pipeline, LTX2VideoDiffusionDecodePipeline, LTX2VideoDiffusionDecoderModel
pipe = LTX2Pipeline.from_pretrained("Lightricks/LTX-2.5-Diffusers", dtype=torch.bfloat16).to("cuda") # or "mps", "xpu", "cpu"
latents = pipe(prompt="a potter shaping a clay vase", output_type="latent").frames
decoder = LTX2VideoDiffusionDecoderModel.from_pretrained(
"Lightricks/LTX-2.5-Diffusers", subfolder="diffusion_decoder", dtype=torch.bfloat16
).to("cuda")
decode_pipe = LTX2VideoDiffusionDecodePipeline(diffusion_decoder=decoder, scheduler=pipe.scheduler)
# `denormalize=False`: `output_type="latent"` already applied the latent statistics, so applying them
# again here would scale every channel by its std a second time.
# The decoder also draws the noise it denoises, so decoding is only reproducible with a generator.
video = decode_pipe(
latents, generator=torch.Generator("cuda").manual_seed(0), denormalize=False
).frames[0]vae là một thành phần tùy chọn trong pipeline giải mã: nó chỉ được tham khảo để lấy thống kê latent khi denormalize=True, và bộ giải mã tự mang theo thống kê của riêng mình, nên một workflow chỉ giải mã không cần phải nạp thêm một autoencoder thứ hai.
Các backend chú ý
Cửa sổ neighborhood-attention được biểu diễn dưới dạng BlockMask, do đó decoder chạy trên backend attention flex theo mặc định và không cần phụ thuộc bổ sung. PyTorch không biên dịch flex_attention trừ khi bạn yêu cầu, và khi chưa được biên dịch, nó sẽ tạo ra ma trận điểm số đầy đủ — điều này không thực tế với độ dài chuỗi ở độ phân giải đầy đủ. Đối với các trường hợp đó, hãy biên dịch decoder hoặc chuyển sang các kernel của NATTEN, đây cũng là những gì bản triển khai gốc sử dụng. Processor lấy NATTEN từ Hub (shi-labs/natten) thông qua gói kernels, vì vậy nó cần pip install kernels thay vì một bản build NATTEN cục bộ:
from diffusers.models.autoencoders.ltx2_diffusion_decoder import LTX2VideoVaeNeighborhoodNattenProcessor
decoder.set_attn_processor(LTX2VideoVaeNeighborhoodNattenProcessor())Việc tải mã tải xuống kernel từ Hub, do đó bộ xử lý sẽ gây ra lỗi khi mã từ xa bị vô hiệu hóa toàn cục với DIFFUSERS_DISABLE_REMOTE_CODE=true.
Mọi module attention trong decoder đều là cùng một neighborhood attention (các khác biệt theo giai đoạn như kích thước kernel nằm trên module, không phải trên processor), do đó set_attn_processor thay thế tất cả chúng bằng một instance dùng chung.
Việc chuyển backend (decoder.set_attention_backend(...)) sang bất kỳ giá trị nào khác ngoài flex sẽ gây ra lỗi: không có backend nào khác chấp nhận BlockMask. Hãy sử dụng bộ xử lý NATTEN ở trên thay thế.
Gom lát
decoder.enable_tiling() giải mã theo các ô chồng lấn (tiles) sau đó trộn lại với nhau, nhờ đó giới hạn bộ nhớ đỉnh theo kích thước ô thay vì kích thước video. Các giai đoạn tăng mẫu sớm, có chi phí thấp, vẫn nhìn thấy toàn bộ latent — chỉ giai đoạn tăng mẫu cuối cùng và giai đoạn khuếch tán, vốn chiếm phần lớn bộ nhớ giải mã, mới chạy theo từng ô — do đó tiling chỉ làm thay đổi kết quả gần biên của các ô. Vì giai đoạn khuếch tán khử nhiễu từng ô riêng biệt, kết quả giải mã theo ô không tái tạo chính xác kết quả không theo ô; kích thước ô và mức chồng lấn mặc định khớp với cài đặt của bản tham chiếu. Cơ chế chú ý lân cận (neighborhood attention) từ chối bất kỳ lưới nào nhỏ hơn nhân (kernel) của nó, nên một ô phần dư ở cuối sẽ được gộp vào ô lân cận thay vì được giải mã riêng lẻ.
LTX2VideoDiffusionDecoderModel
lớp diffusers.LTX2VideoDiffusionDecoderModel
< source >( out_channels: int = 3latent_channels: int = 128patch_size: int = 4scaling_factor: float = 1.0decoder_head_dim: int = 64decoder_stage_channels: tuple = (2048, 1024, 512, 512, 256)decoder_stage_depths: tuple = (4, 6, 4, 2, 8)decoder_stage_kernels: tuple = ((3, 7, 7), (3, 7, 7), (3, 5, 5), (3, 5, 5))decoder_upsample_strides: tuple = ((1, 2, 2), (2, 1, 1), (2, 2, 2), (2, 2, 2))decoder_upsample_channel_reductions: tuple = (2, 2, 1, 2)decoder_stage5_kernel: tuple = (11, 11, 11)decoder_t_emb_dim: int = 384decoder_timestep_scale_multiplier: float = 1000.0decoder_model_output_type: str = 'x0'decoder_num_inference_steps: int = 1spatial_compression_ratio: int = 32temporal_compression_ratio: int = 8 )
Bộ giải mã video khuếch tán LTX-2, được giới thiệu trong LTX-2.5.
Đây là một decoder, không phải autoencoder: nó không có encoder và không thể tạo ra latents. Việc encoding vẫn do AutoencoderKLLTX2Video đảm nhận, không gian latent của nó được sử dụng nguyên vẹn ở đây, do đó latents có thể hoán đổi giữa decoder convolutional và decoder này.
Đây cũng là một mô hình khuếch tán chứ không phải là bộ giải mã tất định — nó khử nhiễu các pixel có điều kiện dựa trên một thể tích ngữ cảnh được xây dựng từ các ẩn (latents) — đó là lý do tại sao nó được điều khiển bởi LTX2VideoDiffusionDecodePipeline thay vì được truyền vào như vae của một pipeline.
Các thống kê ẩn được giữ ở đây dưới dạng buffer để pipeline giải mã có thể khử chuẩn hóa mà không cần tải một autoencoder thứ hai chỉ cho hai vector.
Mô hình này kế thừa từ ModelMixin. Hãy xem tài liệu của lớp cha để biết các phương thức chung được triển khai cho tất cả các mô hình (chẳng hạn như tải xuống hoặc lưu trữ).
decode
< source >( z: Tensorgenerator: typing.Optional[torch.Generator] = Nonenum_inference_steps: int | None = Nonereturn_dict: bool = True )
Giải mã một lô latents.
z được kỳ vọng đã được chuẩn hóa ngược (pipeline áp dụng latents_mean / latents_std), khớp với AutoencoderKLLTX2Video. Bộ giải mã này khử nhiễu, vì vậy hãy truyền generator để đảm bảo khả năng tái lập.
enable_tiling
< source >( tile_sample_min_height: int | None = Nonetile_sample_min_width: int | None = Nonetile_sample_min_num_frames: int | None = Nonetile_sample_stride_height: int | None = Nonetile_sample_stride_width: int | None = Nonetile_sample_stride_num_frames: int | None = None )
Tham số
- tile_sample_min_height (
int, tùy chọn) — Chiều cao của một tile đã giải mã, tính bằng pixel. - tile_sample_min_width (
int, tùy chọn) — Chiều rộng của một tile đã giải mã, tính bằng pixel. - tile_sample_min_num_frames (
int, tùy chọn) — Số lượng khung hình của một tile đã giải mã. - tile_sample_stride_height (
int, tùy chọn) — Khoảng cách tính bằng pixel giữa phần trên của hai gạch dọc liên tiếp; phần chênh lệch so vớitile_sample_min_heightlà vùng chồng lấn được trộn. - tile_sample_stride_width (
int, tùy chọn) — Khoảng cách tính bằng pixel giữa các cạnh trái của hai lát cắt ngang liên tiếp. - tile_sample_stride_num_frames (
int, tùy chọn) — Khoảng cách tính bằng số khung hình giữa điểm bắt đầu của hai lát cắt thời gian liên tiếp.
Bật giải mã dạng gạch (tiled decoding). Các giai đoạn lấy mẫu lên (upsampling) tất định trước giai đoạn cuối luôn xử lý toàn bộ latent (chúng chạy ở độ phân giải thấp và có chi phí thấp); giai đoạn cuối và các khối khuếch tán (diffusion blocks) của giai đoạn 5 — những thành phần chiếm phần lớn bộ nhớ giải mã — sẽ chạy trên các gạch chồng lấn, với các đường nối được trộn tuyến tính.
Tắt giải mã dạng gạch, quay lại giải mã toàn bộ video trong một lần duy nhất.
forward
< source >( z: Tensorgenerator: typing.Optional[torch.Generator] = Nonenum_inference_steps: int | None = Nonereturn_dict: bool = True ) → DecoderOutput or tuple
Tham số
- z (
torch.Tensor) — Latents có shape(B, C, F, H, W), được kỳ vọng đã được chuẩn hóa ngược (pipeline áp dụnglatents_mean/latents_std), khớp với AutoencoderKLLTX2Video. - generator (
torch.Generator, tùy chọn) — Bộ giải mã này khử nhiễu, vì vậy hãy truyền một generator để đảm bảo quá trình giải mã có thể tái lập được. - num_inference_steps (
int, tùy chọn) — Số bước khử nhiễu. Mặc định là giá trị cấu hìnhdecoder_num_inference_stepscủa bộ giải mã. - return_dict (
bool, tùy chọn, mặc định làTrue) — Có nên trả về một DecoderOutput thay vì một tuple thông thường hay không.
Trả về
DecoderOutput hoặc tuple
tiled_decode
< source >( z: Tensorgenerator: typing.Optional[torch.Generator] = Nonenum_inference_steps: int | None = None )
Giải mã một lô latents bằng giai đoạn cuối mang tính tất định và giai đoạn khuếch tán chạy theo từng ô.
Tiles nằm trên lưới đi vào giai đoạn cuối mang tính tất định, trong đó một cell ánh xạ tới một khối pixel đầu ra cố định; các kích thước tile_sample_* được chuyển đổi sang lưới đó, do đó chúng nên là bội số của kích thước cell (8 px theo không gian và 2 khung hình theo thời gian cho cấu hình production). Các tile thời gian tuân theo ánh xạ khung hình nhân quả: tile chứa t=0 loại bỏ khung hình đầu bị nhân đôi của quá trình upsample thời gian và chỉ tile chứa điểm kết thúc của video mới mang padding biên NATTEN.