Buckets:

hf-doc-build/doc / diffusers /main /ru /api /models /ltx2_diffusion_decoder.md
mishig's picture
|
download
raw
17 kB
# LTX2VideoDiffusionDecoderModel
Диффузионный декодер видео, представленный в LTX-2.5 от Lightricks. Стадии neighborhood-attention увеличивают разрешение латентного представления до контекстного объёма, а финальная стадия выполняет денуазинг пикселей с условием на этот контекст.
Это декодер, а не автоэнкодер: кодирование остаётся за [AutoencoderKLLTX2Video](/docs/diffusers/main/ru/api/models/autoencoderkl_ltx_2#diffusers.AutoencoderKLLTX2Video), чьё латентное пространство используется здесь без изменений, поэтому латенты взаимозаменяемы между свёрточным декодером и этим. Поскольку сам по себе это диффузионная модель, она управляется [LTX2VideoDiffusionDecodePipeline](/docs/diffusers/main/ru/api/pipelines/ltx2#diffusers.LTX2VideoDiffusionDecodePipeline), а не передаётся как `vae` пайплайна: запустите любой пайплайн LTX-2 с `output_type="latent"`, а затем декодируйте.
```python
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` — необязательный компонент конвейера декодирования: он используется только для получения латентных статистик, когда `denormalize=True`, а декодер хранит их самостоятельно, поэтому в сценарии, где выполняется только декодирование, не требуется загружать второй автоэнкодер.
## Бэкенды внимания
Окно neighborhood-attention представлено в виде `BlockMask`, поэтому декодер по умолчанию работает на бэкенде внимания `flex` и не требует дополнительных зависимостей. PyTorch не компилирует `flex_attention`, если вы явно не запросите этого, а без компиляции материализуется полная матрица скоростей, что непрактично для последовательностей полной разрешающей способности. Для таких случаев следует либо скомпилировать декодер, либо переключиться на ядра [NATTEN](https://github.com/SHI-Labs/NATTEN), которые также используются в исходной реализации. Процессор загружает NATTEN из Hub ([`shi-labs/natten`](https://huggingface.co/kernels/shi-labs/natten)) через пакет [`kernels`](https://github.com/huggingface/kernels), поэтому требуется `pip install kernels`, а не локальная сборка NATTEN:
```python
from diffusers.models.autoencoders.ltx2_diffusion_decoder import LTX2VideoVaeNeighborhoodNattenProcessor
decoder.set_attn_processor(LTX2VideoVaeNeighborhoodNattenProcessor())
```
Загрузка кода для скачивания ядра с Hub, поэтому процессор вызывает ошибку, если удалённый код глобально отключён с помощью `DIFFUSERS_DISABLE_REMOTE_CODE=true`.
Каждый модуль внимания в декодере использует одно и то же соседнее внимание (различия между этапами, такие как размер ядра, задаются на уровне модуля, а не процессора), поэтому `set_attn_processor` заменяет их все одним общим экземпляром.
Переключение *бэкенда* (`decoder.set_attention_backend(...)`) на что-либо, кроме `flex`, приводит к ошибке: ни один другой бэкенд не принимает `BlockMask`. Вместо этого используйте процессор NATTEN, описанный выше.
## Плиточная обработка
`decoder.enable_tiling()` выполняет декодирование в перекрывающихся тайлах, которые затем смешиваются обратно, ограничивая пиковое потребление памяти размером тайла, а не размером видео. Дешёвые начальные этапы апсемплинга по-прежнему обрабатывают полный латентный вектор — только последний этап апсемплинга и этап диффузии, которые определяют потребление памяти при декодировании, выполняются для каждого тайла — поэтому тайлинг изменяет результат только вблизи границ тайлов. Поскольку на этапе диффузии шум удаляется для каждого тайла отдельно, декодирование с тайлингом не воспроизводит результат без тайлинга точно; размеры тайла и перекрытия по умолчанию соответствуют эталонной реализации. Внимательность по соседству отклоняет любую сетку, меньшую, чем её ядро, поэтому оставшийся хвостовой тайл объединяется с соседним, а не декодируется самостоятельно.
## LTX2VideoDiffusionDecoderModel[[diffusers.LTX2VideoDiffusionDecoderModel]]
#### diffusers.LTX2VideoDiffusionDecoderModel[[diffusers.LTX2VideoDiffusionDecoderModel]]
```python
diffusers.LTX2VideoDiffusionDecoderModel(out_channels: int = 3, latent_channels: int = 128, patch_size: int = 4, scaling_factor: float = 1.0, decoder_head_dim: int = 64, decoder_stage_channels: tuple[int, ...] = (2048, 1024, 512, 512, 256), decoder_stage_depths: tuple[int, ...] = (4, 6, 4, 2, 8), decoder_stage_kernels: tuple[tuple[int, int, int], ...] = ((3, 7, 7), (3, 7, 7), (3, 5, 5), (3, 5, 5)), decoder_upsample_strides: tuple[tuple[int, int, int], ...] = ((1, 2, 2), (2, 1, 1), (2, 2, 2), (2, 2, 2)), decoder_upsample_channel_reductions: tuple[int, ...] = (2, 2, 1, 2), decoder_stage5_kernel: tuple[int, int, int] = (11, 11, 11), decoder_t_emb_dim: int = 384, decoder_timestep_scale_multiplier: float = 1000.0, decoder_model_output_type: str = 'x0', decoder_num_inference_steps: int = 1, spatial_compression_ratio: int = 32, temporal_compression_ratio: int = 8)
```
[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/ltx2_diffusion_decoder.py#L700)
Диффузионный декодер видео LTX-2, представленный в LTX-2.5.
Это декодер, а не автоэнкодер: у него нет энкодера, и он не может генерировать латенты. Кодирование остаётся за [AutoencoderKLLTX2Video](/docs/diffusers/main/ru/api/models/autoencoderkl_ltx_2#diffusers.AutoencoderKLLTX2Video), пространство латентов которого этот декодер использует без изменений, поэтому латенты взаимозаменяемы между свёрточным декодером и этим.
Это также диффузионная модель, а не детерминированный декодер — она выполняет денуазинг пикселей с условием на контекстный объём, построенный из латентов, — именно поэтому она управляется через [LTX2VideoDiffusionDecodePipeline](/docs/diffusers/main/ru/api/pipelines/ltx2#diffusers.LTX2VideoDiffusionDecodePipeline), а не передаётся как `vae` пайплайна.
Статистика латентных переменных передаётся здесь в виде буферов, чтобы конвейер декодирования мог денормализовать данные без загрузки второго автоэнкодера только ради двух векторов.
Эта модель наследуется от [ModelMixin](/docs/diffusers/main/ru/api/models/overview#diffusers.ModelMixin). См. документацию суперкласса для его универсальных методов, реализованных для всех моделей (например, загрузка или сохранение).
#### decode[[diffusers.LTX2VideoDiffusionDecoderModel.decode]]
```python
decode(z: Tensor, generator: typing.Optional[torch.Generator] = None, num_inference_steps: int | None = None, return_dict: bool = True)
```
[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/ltx2_diffusion_decoder.py#L988)
Декодировать пакет латентов.
Ожидается, что `z` уже денормализован (пайплайн применяет `latents_mean` / `latents_std`), что соответствует [AutoencoderKLLTX2Video](/docs/diffusers/main/ru/api/models/autoencoderkl_ltx_2#diffusers.AutoencoderKLLTX2Video). Этот декодер выполняет шумоподавление, поэтому для воспроизводимости передайте `generator`.
#### enable_tiling[[diffusers.LTX2VideoDiffusionDecoderModel.enable_tiling]]
```python
enable_tiling(tile_sample_min_height: int | None = None, tile_sample_min_width: int | None = None, tile_sample_min_num_frames: int | None = None, tile_sample_stride_height: int | None = None, tile_sample_stride_width: int | None = None, tile_sample_stride_num_frames: int | None = None)
```
[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/ltx2_diffusion_decoder.py#L787)
**Параметры:**
tile_sample_min_height (`int`, *optional*) : Высота одного декодированного тайла в пикселях.
tile_sample_min_width (`int`, *optional*) : Ширина одного декодированного тайла в пикселях.
tile_sample_min_num_frames (`int`, *необязательный*) : Количество кадров одного декодированного тайла.
tile_sample_stride_height (`int`, *optional*) : расстояние в пикселях между верхними краями двух последовательных вертикальных тайлов; разница с `tile_sample_min_height` составляет область перекрытия с плавным смешиванием.
tile_sample_stride_width (`int`, *optional*) : Расстояние в пикселях между левыми краями двух последовательных горизонтальных тайлов.
tile_sample_stride_num_frames (`int`, *optional*) : Расстояние в кадрах между началом двух последовательных временных тайлов.
Включите тайловое декодирование. Детерминированные этапы апсемплинга до последнего всегда обрабатывают полный латентный тензор (они выполняются в низком разрешении и не требуют значительных ресурсов); последний этап и диффузионные блоки этапа 5 — которые определяют потребление памяти при декодировании — выполняются на перекрывающихся тайлах, швы между которыми сглаживаются линейно.
#### disable_tiling[[diffusers.LTX2VideoDiffusionDecoderModel.disable_tiling]]
```python
disable_tiling()
```
[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/ltx2_diffusion_decoder.py#L824)
Отключите тайловое декодирование, чтобы вернуться к декодированию всего видео за один проход.
#### forward[[diffusers.LTX2VideoDiffusionDecoderModel.forward]]
```python
forward(z: Tensor, generator: typing.Optional[torch.Generator] = None, num_inference_steps: int | None = None, return_dict: bool = True)
```
[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/ltx2_diffusion_decoder.py#L1017)
**Параметры:**
z (`torch.Tensor`) : Латенты формы `(B, C, F, H, W)`, ожидаемо уже денормализованные (пайплайн применяет `latents_mean` / `latents_std`), соответствующие [AutoencoderKLLTX2Video](/docs/diffusers/main/ru/api/models/autoencoderkl_ltx_2#diffusers.AutoencoderKLLTX2Video).
generator (`torch.Generator`, *необязательный*) : Этот декодер выполняет шумоподавление, поэтому передайте генератор, чтобы сделать декодирование воспроизводимым.
num_inference_steps (`int`, *optional*) : Количество шагов денойзинга. По умолчанию используется значение конфигурации `decoder_num_inference_steps` декодера.
return_dict (`bool`, *необязательный*, по умолчанию `True`) : Нужно ли возвращать [DecoderOutput](/docs/diffusers/main/ru/api/models/autoencoderkl_qwenimage#diffusers.models.autoencoders.vae.DecoderOutput) вместо обычного кортежа.
**Возвращает:** [DecoderOutput](/docs/diffusers/main/ru/api/models/autoencoderkl_qwenimage#diffusers.models.autoencoders.vae.DecoderOutput) или `tuple`
#### tiled_decode[[diffusers.LTX2VideoDiffusionDecoderModel.tiled_decode]]
```python
tiled_decode(z: Tensor, generator: typing.Optional[torch.Generator] = None, num_inference_steps: int | None = None)
```
[Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/ltx2_diffusion_decoder.py#L855)
Декодировать пакет латентов с использованием последнего детерминированного этапа и этапа диффузии, выполняемого по тайлам.
Tiles размещаются на сетке, входящей в последний детерминированный этап, где одна ячейка соответствует фиксированному блоку выходных пикселей; размеры `tile_sample_*` преобразуются в эту сетку, поэтому они должны быть кратны размеру ячейки (8 пикселей пространственно и 2 кадра временно для производной конфигурации). Временные тайлы следуют причинному отображению кадров: тайл, содержащий t=0, отбрасывает дублирующий начальный кадр временного апсемплинга, а только тайл, содержащий конец видео, несёт пограничную отсечку NATTEN.

Xet Storage Details

Size:
17 kB
·
Xet hash:
d2dec77e65d87cb2b11cfe00ba4d96e3a3052f8325f16ec7312999d85e98f5ee

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.