Diffusers documentation
SanaWMLTX2RefinerTransformer3DModel
SanaWMLTX2RefinerTransformer3DModel
El refiner DiT autoregresivo causal por bloques utilizado como etapa 2 de SanaWMPipeline, impulsado por SanaWMLTX2Refiner.
Es arquitectónicamente idéntico a LTX2VideoTransformer3DModel: mismos argumentos de configuración, mismos submódulos, mismos nombres de parámetros, por lo que un checkpoint de LTX-2 publicado se carga en él sin cambios. El paso hacia adelante (forward pass) difiere:
- solo se ejecuta el flujo de video (se omiten las ramas de atención cruzada de audio y audio/video),
- self-attention se ejecuta contra una caché KV de ventana deslizante explícita (
SanaWMRefinerKVCache) que mantiene el sink de atención junto con el historial refinado reciente, de modo que el cómputo por bloque está acotado y el coste total de refinamiento escala linealmente con la longitud del video, - el llamador proporciona el RoPE del video, lo que permite que cada ventana autoregresiva conserve el índice absoluto de cada fotograma en el video de origen (ver SanaWMLTX2RefinerTransformer3DModel.build_rotary_emb_for_absolute_positions()).
El modelo se puede cargar con:
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
clase 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[int, int, int] = (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 )
Parámetros
- in_channels (
int, por defecto128) — El número de canales en la entrada. - out_channels (
int, por defecto128) — El número de canales en la salida. - patch_size (
int, por defecto1) — El tamaño de los parches espaciales que se usarán en la capa de incrustación de parches. - patch_size_t (
int, por defecto1) — El tamaño de los parches temporales a utilizar en la capa de incrustación de parches. - num_attention_heads (
int, por defecto32) — El número de cabezas a utilizar para la atención multi-cabeza. - attention_head_dim (
int, por defecto128) — El número de canales en cada cabeza. - cross_attention_dim (
int, por defecto4096) — El número de canales para las cabezas de atención cruzada. - num_layers (
int, por defecto48) — El número de capas de bloques Transformer a utilizar. - activation_fn (
str, por defecto"gelu-approximate") — Función de activación a utilizar en la red feed-forward. - qk_norm (
str, por defecto"rms_norm_across_heads") — La capa de normalización a utilizar. - rope_type (
str, por defecto"interleaved") — Qué aplicación de RoPE utilizar ("interleaved"o"split").
El transformer autoregresivo de refinamiento con causalidad por bloques utilizado como etapa 2 de SANA-WM.
Arquitectónicamente idéntico a LTX2VideoTransformer3DModel: mismos argumentos de configuración, mismos submódulos, mismos nombres de parámetros, por lo que un checkpoint de LTX-2 publicado se carga en él sin cambios. Lo que difiere es la pasada hacia adelante:
- solo se ejecuta el flujo de video (se omiten las ramas de atención cruzada de audio y audio/video),
- self-attention se ejecuta contra una caché KV de ventana deslizante explícita (
SanaWMRefinerKVCache) que mantiene el sumidero de atención junto con el historial refinado reciente, de modo que el costo de refinamiento está acotado por bloque AR y escala linealmente con la longitud del video, - el llamador proporciona el RoPE del video, lo que permite que cada ventana de AR conserve el índice absoluto de cada cuadro en el video de origen (consulte build_rotary_emb_for_absolute_positions()).
Los argumentos restantes replican uno a uno los de LTX2VideoTransformer3DModel. Los argumentos y submódulos del lado de audio se conservan únicamente para que los pesos de audio del checkpoint se conserven al serializar y deserializar; no se utilizan en la propagación hacia adelante del refiner.
build_rotary_emb_for_absolute_positions
< source >( batch_size: intframe_positions: list[int]height: intwidth: intdevice: devicefps: float ) → tuple[torch.Tensor, torch.Tensor]
Parámetros
- batch_size (
int) — Tamaño del lote al que se deben difundir las coordenadas. - frame_positions (
list[int]) — Índices absolutos de fotogramas latentes cubiertos por esta ventana. - height (
int), width (int) — Resolución espacial latente. - device (
torch.device) — Dispositivo en el que se construirán las coordenadas. - fps (
float) — Frecuencia de fotogramas del vídeo, que determina la escalada temporal de RoPE en LTX-2.
Devuelve
tuple[torch.Tensor, torch.Tensor]
la tupla RoPE (cos, sin).
Construya el RoPE de video para una lista explícita de índices absolutos de fotogramas latentes.
SanaWMLTX2AudioVideoRotaryPosEmbed.prepare_video_coords asume un torch.arange(num_frames) contiguo,
lo cual es adecuado para la inferencia bidireccional. El refinador AR de ventana deslizante, en cambio, necesita mantener el
índice absoluto de cada fotograma en el video de origen, de modo que RoPE capture la fase temporal correcta a lo largo de la ventana [sink + recent + active].
forward
< source >( hidden_states: Tensorencoder_hidden_states: Tensortimestep: Tensorvideo_rotary_emb: tuple[torch.Tensor, torch.Tensor]encoder_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
Parámetros
- hidden_states (
torch.Tensor) — Latentes de video parcheados del bloque activo, de forma(batch_size, num_video_tokens, in_channels). - encoder_hidden_states (
torch.Tensor) — Incrustaciones de texto de forma(batch_size, text_seq_len, caption_channels). - timestep (
torch.Tensor) — Paso temporal de forma(batch_size, num_video_tokens), ya escalado porself.config.timestep_scale_multiplier. - video_rotary_emb (
tuple[torch.Tensor, torch.Tensor]) — El RoPE(cos, sin)para las posiciones absolutas del marco activo, tal como lo devuelve build_rotary_emb_for_absolute_positions(). - encoder_attention_mask (
torch.Tensor, opcional) — Máscara de atención multiplicativa para el texto, de forma(batch_size, text_seq_len). - kv_cache (
SanaWMRefinerKVCache, opcional) — Cache KV de ventana deslizante que almacena el attention sink por capa y el historial refinado reciente, además del RoPE compartidosink_pe. Obligatorio siempre que se establezcakv_cache_mode. - kv_cache_mode (
str, opcional) — Uno de:"inject": prestar atención a[sink + history + current]K/V (los pasos de desruido)."capture_pre_rope": sin prefijo; registra los K/V pre-RoPE de esta pasada hacia adelante en la caché (se usa una vez para sembrar el sumidero de atención a partir de los latentes crudos de la etapa 1)."inject_and_capture_post_rope": atiende a[sink + history + current]K/V y registra los K/V post-RoPE de este bloque en la caché para que puedan agregarse al historial.
Cuando es
None, el bloque ejecuta una autoatención completa simple solo sobre los tokens actuales. - attention_kwargs (
dict, opcional) — Kwargs opcionales que se reenvían al manejo de la escala de LoRA. - return_dict (
bool, opcional, valor predeterminadoTrue) — Si se debe devolver un Transformer2DModelOutput en lugar de una tupla simple.
Devuelve
Transformer2DModelOutput o tuple
la velocidad predicha para el bloque activo, de forma (batch_size, num_video_tokens, out_channels).
Paso de propagación hacia adelante solo de video sobre un solo bloque AR.
SanaWMRefinerKVCache
clase diffusers.models.transformers.transformer_sana_wm_refiner.SanaWMRefinerKVCache
< source >( num_layers: int )
Contenedor que mantiene una instancia de SanaWMRefinerKVLayerCache por bloque de transformador, además del RoPE de sink compartido.
Esto implementa el contrato de KV-cache rf_shifted_sink con el que se entrenó el refinador de la etapa 2 de SANA-WM. El refinamiento es causal por bloques: block_size marcos latentes se desruidan a la vez mientras atienden a una ventana acotada de [attention sink + historial reciente + bloque activo] K/V.
sink_pe: la tupla RoPE (cos, sin) para los cuadros de sink, reconstruida en cada ventana AR en el desplazamiento deslizantesink_rope_offsetpara que el sink se sitúe inmediatamente antes de la caché de trabajo acotada. Compartida entre capas porque RoPE no depende de la capa.
SanaWMRefinerKVLayerCache
clase diffusers.models.transformers.transformer_sana_wm_refiner.SanaWMRefinerKVLayerCache
< source >( )
Cache KV por capa para el refinador AR causal por bloques de la etapa 2 de SANA-WM.
Contiene las dos mitades del prefijo de ventana deslizante al que atiende la autoatención del refiner, además de un espacio para leer de nuevo los K/V que capturó la última forward. Todos los tensores son (batch_size, num_tokens, inner_dim) (es decir, antes del unflatten por cabeza), coincidiendo con el layout que la autoatención del refiner concatena.
sink_k_pre/sink_v: pre-RoPE K/V de los fotogramas de attention-sink, capturados una sola vez desde los latentes crudos de la etapa 1. Se almacenan pre-RoPE para que cada ventana AR pueda volver a aplicar RoPE en su propio desplazamiento de offset de sink (SanaWMRefinerKVCache.sink_pe).history_k/history_v: K/V post-RoPE de los fotogramas recientes ya refinados, listos para concatenarse tal cual.captured_k_pre/captured_v_preycaptured_k_post/captured_v_post: ranuras de lectura escritas por los modos de capturakv_cache_mode.
Extrae los K/V posteriores a RoPE capturados por la última pasada hacia adelante.
Extrae los K/V pre-RoPE capturados por el último paso de adelante.
Devuelve el K/V de historial reciente posterior a RoPE, o None si está vacío.
Devuelve el K/V de sink pre-RoPE, o None si no se ha capturado (o está vacío).
Almacene el K/V posterior a RoPE generado por la propagación hacia adelante actual.
Almacene los K/V pre-RoPE generados por la propagación hacia adelante actual.
Almacene el K/V del historial reciente posterior a RoPE.
Almacene el K/V del sink pre-RoPE.
Transformer2DModelOutput
clase diffusers.models.modeling_outputs.Transformer2DModelOutput
< source >( sample: torch.Tensor )
Parámetros
- sample (
torch.Tensorde forma(batch_size, num_channels, height, width)o(batch size, num_vector_embeds - 1, num_latent_pixels)si Transformer2DModel es discreto) — La salida de estados ocultos condicionada a la entradaencoder_hidden_states. Si es discreto, devuelve distribuciones de probabilidad para los píxeles latentes sin ruido.
La salida de Transformer2DModel.