Diffusers documentation
SanaWMLTX2RefinerTransformer3DModel
SanaWMLTX2RefinerTransformer3DModel
Чанково-каузальный авто-регрессивный рефинер DiT, используемый как второй этап SanaWMPipeline, управляемый SanaWMLTX2Refiner.
Архитектурно он идентичен LTX2VideoTransformer3DModel — те же аргументы конфигурации, те же подмодули, те же имена параметров — поэтому опубликованный чекпоинт LTX-2 загружается в него без изменений. Прямой проход (forward pass) отличается:
- обрабатывается только видеопоток (ветви кросс-внимания аудио и аудио/видео пропускаются),
- self-attention выполняется с использованием явного скользящего окна KV-кэша (
SanaWMRefinerKVCache), содержащего attention sink и недавнюю уточнённую историю, поэтому вычисления на блок ограничены, а общая стоимость уточнения линейно масштабируется с длиной видео, - вызывающая сторона предоставляет видео RoPE, что позволяет каждому авто-регрессивному окну сохранять абсолютный индекс каждого кадра в исходном видео (см. SanaWMLTX2RefinerTransformer3DModel.build_rotary_emb_for_absolute_positions()).
Модель можно загрузить с помощью:
import torch
from diffusers import SanaWMLTX2RefinerTransformer3DModel
transformer = SanaWMLTX2RefinerTransformer3DModel.from_pretrained(
"Efficient-Large-Model/SANA-WM_bidirectional-diffusers",
subfolder="refiner/transformer",
torch_dtype=torch.bfloat16,
)SanaWMLTX2RefinerTransformer3DModel
класс diffusers.SanaWMLTX2RefinerTransformer3DModel
< source >( in_channels: int = 128out_channels: int | None = 128patch_size: int = 1patch_size_t: int = 1num_attention_heads: int = 32attention_head_dim: int = 128cross_attention_dim: int = 4096vae_scale_factors: tuple = (8, 32, 32)pos_embed_max_pos: int = 20base_height: int = 2048base_width: int = 2048gated_attn: bool = Falsecross_attn_mod: bool = Falseaudio_in_channels: int = 128audio_out_channels: int | None = 128audio_patch_size: int = 1audio_patch_size_t: int = 1audio_num_attention_heads: int = 32audio_attention_head_dim: int = 64audio_cross_attention_dim: int = 2048audio_scale_factor: int = 4audio_pos_embed_max_pos: int = 20audio_sampling_rate: int = 16000audio_hop_length: int = 160audio_gated_attn: bool = Falseaudio_cross_attn_mod: bool = Falsenum_layers: int = 48activation_fn: str = 'gelu-approximate'qk_norm: str = 'rms_norm_across_heads'norm_elementwise_affine: bool = Falsenorm_eps: float = 1e-06caption_channels: int = 3840attention_bias: bool = Trueattention_out_bias: bool = Truerope_theta: float = 10000.0rope_double_precision: bool = Truecausal_offset: int = 1timestep_scale_multiplier: int = 1000cross_attn_timestep_scale_multiplier: int = 1000rope_type: str = 'interleaved'use_prompt_embeddings = Trueperturbed_attn: bool = Falseff_bias: bool = Trueaudio_ff_bias: bool = Trueuse_prompt_adaln_single: bool = Trueuse_keyframes_abs_pos_embedding: bool = False )
Параметры
- in_channels (
int, по умолчанию128) — Количество каналов на входе. - out_channels (
int, по умолчанию128) — Количество каналов на выходе. - patch_size (
int, по умолчанию1) — Размер пространственных патчей, используемых в слое встраивания патчей. - patch_size_t (
int, по умолчанию1) — Размер временных патчей, используемых в слое встраивания патчей. - num_attention_heads (
int, по умолчанию32) — Количество голов, используемых для многоголовного внимания. - attention_head_dim (
int, по умолчанию128) — Количество каналов в каждой голове. - cross_attention_dim (
int, по умолчанию4096) — Количество каналов для головок кросс-внимания. - num_layers (
int, по умолчанию48) — Количество блоков Transformer, используемых в модели. - activation_fn (
str, по умолчанию"gelu-approximate") — Функция активации, используемая в полносвязном слое. - qk_norm (
str, по умолчанию"rms_norm_across_heads") — Слой нормализации, который следует использовать. - rope_type (
str, по умолчанию"interleaved") — Какой способ применения RoPE использовать ("interleaved"или"split").
Chunk-causal autoregressive refiner transformer, используемый на этапе 2 SANA-WM.
Архитектурно идентичен LTX2VideoTransformer3DModel — те же аргументы конфигурации, те же подмодули, те же имена параметров — поэтому опубликованный чекпоинт LTX-2 загружается в него без изменений. Отличается только прямой проход:
- обрабатывается только видеопоток (ветви кросс-внимания аудио и аудио/видео пропускаются),
- self-attention выполняется с использованием явного скользящего окна KV-кэша (
SanaWMRefinerKVCache), содержащего attention sink и недавнюю уточнённую историю, поэтому стоимость уточнения ограничена для каждого AR-блока и линейно масштабируется с длиной видео, - вызывающая сторона предоставляет видео RoPE, что позволяет каждому AR-окну сохранять абсолютный индекс каждого кадра в исходном видео (см. build_rotary_emb_for_absolute_positions()).
Остальные аргументы полностью соответствуют аргументам LTX2VideoTransformer3DModel. Аргументы и подмодули, связанные с аудио, сохраняются исключительно для того, чтобы аудио-веса в чекпоинте корректно восстанавливались; они не используются в прямом проходе рефинера.
build_rotary_emb_for_absolute_positions
< source >( batch_size: intframe_positions: listheight: intwidth: intdevice: devicefps: float ) → tuple[torch.Tensor, torch.Tensor]
Параметры
- batch_size (
int) — Размер батча, для которого нужно рассылать координаты. - frame_positions (
list[int]) — Абсолютные индексы латентных кадров, охватываемых этим окном. - height (
int), width (int) — Пространственное разрешение латентовых представлений. - device (
torch.device) — Устройство, на котором будут построены координаты. - fps (
float) — Частота кадров видео, определяющая масштабирование временного RoPE в LTX-2.
Возвращает
tuple[torch.Tensor, torch.Tensor]
кортеж RoPE (cos, sin).
Создайте видео-RoPE для явного списка абсолютных индексов латентных кадров.
SanaWMLTX2AudioVideoRotaryPosEmbed.prepare_video_coords предполагает непрерывный torch.arange(num_frames),
что приемлемо для двунаправленного вывода. Уточнитель с AR-окном скользящего типа, напротив, должен сохранять
абсолютный индекс каждого кадра в исходном видео, чтобы RoPE корректно учитывал временную фазу в окне [sink + recent + active].
forward
< source >( hidden_states: Tensorencoder_hidden_states: Tensortimestep: Tensorvideo_rotary_emb: tupleencoder_attention_mask: typing.Optional[torch.Tensor] = Nonekv_cache: diffusers.models.transformers.transformer_sana_wm_refiner.SanaWMRefinerKVCache | None = Nonekv_cache_mode: str | None = Noneattention_kwargs: dict | None = Nonereturn_dict: bool = True ) → Transformer2DModelOutput or tuple
Параметры
- hidden_states (
torch.Tensor) — Патчифицированные латенты видео активного блока, с формой(batch_size, num_video_tokens, in_channels). - encoder_hidden_states (
torch.Tensor) — Текстовые эмбеддинги формы(batch_size, text_seq_len, caption_channels). - timestep (
torch.Tensor) — Шаг с формой(batch_size, num_video_tokens), уже масштабированный множителемself.config.timestep_scale_multiplier. - video_rotary_emb (
tuple[torch.Tensor, torch.Tensor]) —(cos, sin)RoPE для абсолютных позиций кадров активного блока, как возвращаемые функцией build_rotary_emb_for_absolute_positions(). - encoder_attention_mask (
torch.Tensor, необязательный) — Маска внимания для текста с мультипликативным применением, форма(batch_size, text_seq_len). - kv_cache (
SanaWMRefinerKVCache, optional) — скользящее окно KV-кэша, содержащее attention sink и недавнюю уточнённую историю для каждого слоя, а также общийsink_peRoPE. Обязателен, если заданkv_cache_mode. - kv_cache_mode (
str, необязательный) — Одно из значений:"inject": внимание к[sink + history + current]K/V (шаги денойзинга)."capture_pre_rope": без префикса; записывает K/V до применения RoPE для данного прохода в кэш (используется один раз для инициализации attention sink из исходных латентов первого этапа)."inject_and_capture_post_rope": обращается к[sink + history + current]K/V и записывает post-RoPE K/V этого блока в кэш, чтобы его можно было добавить в историю.
Если
None, блок выполняет обычное полное само-внимание только по текущим токенам. - attention_kwargs (
dict, необязательный) — Необязательные аргументы, передаваемые в обработку масштаба LoRA. - return_dict (
bool, необязательный, по умолчаниюTrue) — Определяет, следует ли возвращать Transformer2DModelOutput вместо обычного кортежа.
Возвращает
Transformer2DModelOutput или tuple
предсказанная скорость для активного блока, с формой (batch_size, num_video_tokens, out_channels).
Прямой проход только по видео через один блок AR.
SanaWMRefinerKVCache
класс diffusers.models.transformers.transformer_sana_wm_refiner.SanaWMRefinerKVCache
< source >( num_layers: int )
Контейнер, содержащий по одному SanaWMRefinerKVLayerCache на каждый блок трансформера, а также общий sink RoPE.
Это реализует контракт KV-кэша rf_shifted_sink, с которым обучался рефинер второго этапа SANA-WM. Рефинирование является блочно-каузальным: block_size латентных кадров денойзируются за один раз, при этом внимание обращается к ограниченному окну [attention sink + recent history + active block] K/V.
sink_pe: кортеж (cos, sin) RoPE для sink-кадров, пересобираемый для каждого AR-окна при сдвигеsink_rope_offset, чтобы sink располагался непосредственно перед ограниченным рабочим кэшем. Общий для всех слоёв, поскольку RoPE не зависит от слоя.
SanaWMRefinerKVLayerCache
класс diffusers.models.transformers.transformer_sana_wm_refiner.SanaWMRefinerKVLayerCache
< source >( )
Кэш KV для каждого слоя для этапа 2 SANA-WM, использующего чанк-каузальный AR-рефинер.
Хранит две половины префикса скользящего окна, на которые обращается само-внимание уточнителя, а также слот для чтения обратно K/V, захваченных последним проходом. Все тензоры имеют размерность (batch_size, num_tokens, inner_dim) (то есть до разворачивания по головам), что соответствует раскладке, которую само-внимание уточнителя использует для конкатенации.
sink_k_pre/sink_v: pre-RoPE K/V кадров attention-sink, захваченные один раз из исходных латентов первого этапа. Они хранятся в формате pre-RoPE, чтобы каждое AR-окно могло повторно применить RoPE со своим сдвинутым смещением sink (SanaWMRefinerKVCache.sink_pe).history_k/history_v: post-RoPE K/V для уже уточнённых последних кадров, готовые к конкатенации как есть.captured_k_pre/captured_v_preиcaptured_k_post/captured_v_post: слоты для чтения, заполняемые режимами захватаkv_cache_mode.
Снимите K/V после RoPE, полученные последним прямым проходом.
Достаньте K/V до применения RoPE, полученные в последнем прямом проходе.
Возвращает K/V недавней истории после применения RoPE или None, если пусто.
Возвращает sink K/V до применения RoPE или None, если он не был захвачен (или пуст).
Сохраните K/V после применения RoPE, полученные в текущем прямом проходе.
Сохраните K/V до применения RoPE, полученные в текущем прямом проходе.
Сохраните K/V недавней истории после применения RoPE.
Сохраните K/V sink до применения RoPE.
Transformer2DModelOutput
класс diffusers.models.modeling_outputs.Transformer2DModelOutput
< source >( sample: torch.Tensor )
Параметры
- sample (
torch.Tensorформы(batch_size, num_channels, height, width)или(batch size, num_vector_embeds - 1, num_latent_pixels), если Transformer2DModel дискретный) — Выходные скрытые состояния, обусловленные входомencoder_hidden_states. Если модель дискретная, возвращает распределения вероятностей для латентных пикселей без шума.
Вывод Transformer2DModel.