SANA-Video: Efficient Video Generation with Block Linear Diffusion Transformer

Authors: Junsong Chen*, Yuyang Zhao*, Jincheng Yu*, Ruihang Chu, Junyu Chen, Shuai Yang, Xianbang Wang, Yicheng Pan, Daquan Zhou, Huan Ling, Haozhe Liu, Hongwei Yi, Hao Zhang, Muyang Li, Yukang Chen, Han Cai, Sanja Fidler, Ping Luo, Song Han, Enze Xie Affiliations: NVIDIA, HKU, MIT, THU, PKU, KAUST Venue: ICLR 2026 Oral

1. Motivation (研究动机)

1.1 视频生成的计算瓶颈

当前视频生成模型面临严重的 计算效率 问题:

  • Token 数量巨大: 以 Wan 14B 为例, 生成一个 720p 5 秒视频需要处理超过 75,000 个 token, 在 H100 GPU 上需要 32 分钟
  • Self-attention 的二次复杂度: 传统 self-attention 的 复杂度在视频生成的大量 token 场景下成为主要瓶颈
  • 长视频生成更加困难: 超过 10 秒的长视频因为 full-sequence processing 和 KV cache 的线性增长, 几乎无法用现有模型实现
  • 训练成本高昂: MovieGen 等大模型需要巨量 GPU 资源, 限制了研究社区的参与

1.2 现有方法的局限

  • Causal Full Attention: 内存 , 计算 , 无法支持长视频
  • Causal Local Attention: 虽然降低了计算量到 , 但丧失了 global context 信息
  • KV Cache 方案: 传统 KV cache 随序列长度线性增长, 内存开销大

1.3 核心问题

Can we develop a high-quality and high-resolution video generator that is computationally efficient and runs very fast on both cloud and edge devices?

2. Idea (核心思想)

SANA-Video 提出了一个 小型但高效的 diffusion model (2B 参数), 通过两个核心设计实现高效视频生成:

  1. Linear DiT: 用 linear attention (ReLU kernel + RoPE) 替代传统 self-attention, 将复杂度从 降到 , 实现 4x 加速
  2. Block Linear Attention with Constant-Memory KV Cache: 利用 linear attention 的累积性质, 设计 constant-memory 的 KV cache, 支持分块自回归生成分钟级长视频
  3. 高效训练策略: 从 SANA T2I 模型 continue pre-training, 结合高效数据过滤, 进一步降低训练成本

3. Method (方法)

3.1 整体架构

Figure 2 解读: 这是 SANA-Video 的整体架构图。(a) 展示了基于 block causal KV cache 的分块自回归训练 pipeline。(b) 展示了模型的完整 pipeline: 输入视频经过 AutoEncoder 编码为 latent, 文本经过 Rewriter Small LLM 处理, 然后通过 N 个 Transformer block (包含 Linear Attention, Cross Attention, Mix-FFN) 进行去噪。(c) 展示了 Linear DiT module 的详细设计: Q, K, V 经过 Linear projection 和 ReLU 激活后, 对 Q 和 K 分别应用 3D RoPE, 然后通过 MatMul 计算注意力; Mix-FFN 部分包含 1x3x3 spatial ConvLayer 和 3x1x1 temporal ConvLayer, 总计算成本为

3.2 Linear Attention with RoPE

问题: 将 RoPE 集成到 Linear Attention

直接在 linear attention 中使用 RoPE 会导致数值不稳定 — softmax 和 ReLU similarity function 的差异使得 RoPE 变换可能让分母趋向零。

解决方案: RoPE(ReLU(x)) 而非 RoPE(x)

核心思想: 先 ReLU 再 RoPE, 确保分母中不含 RoPE (分母只对 key 做 求和), 保持非负性:

其中 分子中 Q 和 K 都有 RoPE 用于位置编码, 分母中去掉 RoPE 保证数值稳定性。

Figure 3 解读: (a) 比较了不同 attention map: Wan 的 vanilla softmax attention 具有清晰的局部模式; 无 PE 的 linear attention 过于 dense; 先 RoPE 后 ReLU 的结果也较密集; 而本文的 先 ReLU 后 RoPE 产生了更稀疏、更聚焦局部区域的注意力模式。(b) Pre/Post-RoPE QK sum 的训练 loss 对比, 从分母中去掉 RoPE (绿线) 保证了训练稳定性。

# Pseudocode: Linear Attention with RoPE
def linear_attention_with_rope(Q, K, V, rope_freqs):
    """
    Q, K, V: (B, N, H, D)  # batch, seq_len, heads, dim
    rope_freqs: 3D rotary position embeddings
    """
    # Step 1: ReLU activation (kernel function phi)
    Q_relu = relu(Q)  # phi(Q)
    K_relu = relu(K)  # phi(K)
 
    # Step 2: Apply 3D RoPE AFTER ReLU
    Q_rope = apply_3d_rope(Q_relu, rope_freqs)  # RoPE(phi(Q))
    K_rope = apply_3d_rope(K_relu, rope_freqs)  # RoPE(phi(K))
 
    # Step 3: Compute numerator with RoPE (positional encoding)
    # sum_j RoPE(phi(K_j))^T V_j  -> (B, H, D, D)
    KV = einsum('bnhd, bnhe -> bhde', K_rope, V)
    numerator = einsum('bnhd, bhde -> bnhe', Q_rope, KV)
 
    # Step 4: Compute denominator WITHOUT RoPE (numerical stability)
    # sum_j phi(K_j)^T  -> (B, H, D)
    K_sum = K_relu.sum(dim=1)  # no RoPE here!
    denominator = einsum('bnhd, bhd -> bnh', Q_relu, K_sum)
 
    # Step 5: Normalize
    output = numerator / (denominator.unsqueeze(-1) + eps)
    return output

代码映射: diffusion/model/nets/sana_blocks.py 中的 LiteLAReLURope 类实现了此机制。

3.3 Mix-FFN with Spatial-Temporal Convolution

Linear attention 的 attention map 较 dense, 缺乏局部关注能力。Mix-FFN 通过 convolution 弥补这一不足:

  • Spatial Conv: 1x3x3 ConvLayer 捕获空间局部特征
  • Temporal Conv: 3x1x1 ConvLayer (shortcut connection) 捕获时间维度的局部关系
  • Temporal conv 采用 zero-initialized shortcut, 不影响预训练权重
# Pseudocode: Spatial-Temporal Mix-FFN
def mix_ffn(x, T, H, W):
    """
    x: (B, T*H*W, D)  # flattened video tokens
    """
    # 1x1 conv (linear projection up)
    x_up = conv1x1_up(x)  # (B, T*H*W, 4D)
 
    # Reshape to 3D for convolutions
    x_3d = x_up.reshape(B, T, H, W, 4*D)
 
    # Spatial 1x3x3 convolution
    x_spatial = depthwise_conv3x3(x_3d)  # spatial local features
    x_spatial = silu(x_spatial)
 
    # Temporal 3x1x1 convolution with shortcut
    x_temporal = temporal_conv(x_3d)  # temporal local features
    x_out = x_spatial + x_temporal  # shortcut connection
 
    # 1x1 conv (linear projection down)
    output = conv1x1_down(x_out)  # (B, T*H*W, D)
    return output

代码映射: sana_blocks.py 中的 GLUMBConvTemp 类; temporal conv 通过 t_kernel_size 参数控制。

3.4 Block Linear Attention with Constant-Memory KV Cache

这是支持长视频生成的核心创新。

Figure 4 解读: (a) 对比了三种 attention 的计算机制: Vanilla Attention 需要完整的 attention matrix 和 的 KV cache; Linear Attention 将 K, V 先做外积再与 Q 相乘, 复杂度降为 ; Causal Linear Attention 维护 cumulative sum , 每个新 token 只需 的计算和固定内存。(b) Block Causal Mix-FFN 的处理方式: 在相邻 block 之间, 缓存上一个 block 的最后一个 token (Cached Token_{-1}), 并在当前 block 开头添加 Zero Padding, 确保 temporal convolution 的因果性。

Causal Linear Attention 的 KV Cache 重新推导

对于第 个 token 的 causal linear attention 输出:

其中 是 attention state。关键洞察: 只需存储:

  • Cumulative sum of states:
  • Cumulative sum of keys:

内存成本为 , 与序列长度 N 无关!

MetricCausal Full AttentionCausal Local AttentionCausal Linear Attention
Memory
Comp. Cost (N-th token)
Comp. Cost (N tokens)
Global ContextYesNoYes
# Pseudocode: Block Linear Attention Inference with KV Cache
def block_linear_inference(model, num_blocks, denoise_timesteps, noise_scheduler):
    """
    Algorithm 1 from the paper.
    KV cache stores: [sum_S, sum_phi_K, conv_cache_f]
    """
    kv_cache = [None, None, None]  # cumulative_S, cumulative_K, conv_cache
    output_blocks = []
 
    for i in range(num_blocks):  # M blocks
        # Initialize noise for this block
        x_noisy = sample_noise(shape)  # x^i_{t_T} ~ N(0, I)
 
        for j in reversed(range(len(denoise_timesteps))):  # T -> 1 denoising
            # Forward pass with KV cache
            x_denoised = model(x_noisy, denoise_timesteps[j], kv_cache)
 
            if j == 0:  # Last denoising step (fully denoised)
                output_blocks.append(x_denoised)
                # Update KV cache with this block's information
                # sum_S += phi(K_block)^T @ V_block
                # sum_phi_K += sum(phi(K_block))
                # conv_cache = last_token_of_block
                kv_cache = update_kv_cache(model, x_denoised, kv_cache)
            else:
                # Self-forcing: add noise to denoised output
                epsilon = sample_noise(shape)
                x_noisy = noise_scheduler(x_denoised, epsilon, denoise_timesteps[j-1])
 
    return concat(output_blocks)

代码映射: diffusion/model/nets/sana_multi_scale_video.py 中的 forward_long() 方法; diffusion/model/nets/sana_blocks.py 中的 CachedCausalAttentionCachedGLUMBConvTemp

Block Causal Mix-FFN

为了保证 temporal conv 的因果性:

  1. 训练时: 在每个 block 末尾 append 一个 all-zero token (Zero Padding), 防止信息泄露
  2. 推理时: 缓存上一个 block 的 最后一个 token (Token_{-1}), prepend 到当前 block 开头, 为 causal temporal convolution (kernel size 3) 提供前一个 block 的上下文

3.5 训练策略

Figure 5 解读: SANA-Video 的数据过滤 pipeline。从 Public Data 和 Synthetic Data 收集原始数据, 经过 Scene Cut 切分为短片段, 使用 Captioning (Qwen-2.5-VL-7B) 生成详细描述 (80-100 words), 然后通过 Motion (Unimatch/VMAF), Aesthetic (DOVER), Saturation (OpenCV) 三个维度进行过滤。最终的高质量数据用于 Pre-Training 和 SFT, SFT 阶段还包含 Human Selection 的约 5,000 个高质量视频。

Stage 1: VAE Adaptation (T2I)

  • 480P: 使用 Wan-VAE (F8T4C16)
  • 720P: 使用自研 DCAE-V (F32T4C32), spatial 下采样 32x, temporal 下采样 4x
  • VAE adaptation 仅需 5-10k steps 即可收敛

Stage 2: Continue Pre-Training from T2I

  • 从 SANA 1.6B T2I 模型初始化
  • 新增层 (temporal conv, 3D RoPE) zero-initialized, 保留预训练权重
  • Coarse-to-fine 训练: 先低分辨率短视频 (192P 2.5s) 再高分辨率长视频 (480P 5s)

Stage 3: Autoregressive Block Training (LongSANA)

两阶段:

  1. Monotonically Increasing SNR Sampler: 后续 block 的 timestep 单调递增 (即 noise level 更低), 比随机采样收敛更快
  2. Improved Self-Forcing: 利用 block linear attention 的 constant memory 特性, 可以 self-generate 更长视频 (如 1 min), 减少 training-inference gap

3.6 Deep Compression Video Autoencoder (DCAE-V)

AutoencoderRatioPSNRSSIMLPIPS
Wan2.1-VAE (F8T4C16)1634.410.950.01
Wan2.2-VAE (F16T4C48)2135.610.960.01
LTX-VAE (F32T8C128)6432.260.930.04
DCAE-V (F32T4C32)12833.250.940.03

DCAE-V 的压缩比高达 128x, 但重建质量与竞品相当。32 个 latent channels 与 T2I 模型对齐, 便于 continue pre-training。

4. Experimental Setup (实验设置)

4.1 模型配置

ModelWidthDepthFFNHeadsParam
SANA-Video-2B2240206720202056M
  • Backbone: 基于 SANA 架构, FFN 从 5600 增加到 6720, head dimension 从 32 增加到 112 以适配 3D RoPE
  • Text Encoder: 小型 decoder-only LLM
  • 训练: AdamW optimizer, weight decay 0.03, learning rate 5e-5, Accelerate FSDP
  • 硬件: 64 H100 GPUs, 约 12 天

4.2 Evaluation

  • Benchmark: VBench (Total Score, Quality, Semantic/I2V)
  • Efficiency Metric: 480P 81-frame 视频的生成延迟
  • Ablation: training loss curves + H100 latency profiles

5. Experimental Results (实验结果)

SANA-Video 的关键结果如下:

  • 比 Wan2.1 快 16x
  • 在 VBench 上达到可比性能
  • 在 RTX 5090 上用 NVFP4 量化可在 29 秒 内生成 720p 5 秒视频 (2.4x speedup)
  • 训练仅用 64 H100 GPU x 12 天 完成, 约为 MovieGen 的 1%