Skip to content

model

Classes

fastvideo.models.dits.matrixgame2.model.MatrixGame2CrossAttention

MatrixGame2CrossAttention(dim: int, num_heads: int, window_size=(-1, -1), qk_norm=True, eps=1e-06, parallel_attention=False, quant_config: QuantizationConfig | None = None, prefix: str = '')

Bases: WanSelfAttention

Source code in fastvideo/models/dits/wanvideo.py
def __init__(self,
             dim: int,
             num_heads: int,
             window_size=(-1, -1),
             qk_norm=True,
             eps=1e-6,
             parallel_attention=False,
             quant_config: QuantizationConfig | None = None,
             prefix: str = "") -> None:
    assert dim % num_heads == 0
    super().__init__()
    self.dim = dim
    self.num_heads = num_heads
    self.head_dim = dim // num_heads
    self.window_size = window_size
    self.qk_norm = qk_norm
    self.eps = eps
    self.parallel_attention = parallel_attention

    # layers
    self.to_q = ReplicatedLinear(dim, dim, quant_config=quant_config, prefix=f"{prefix}.to_q")
    self.to_k = ReplicatedLinear(dim, dim, quant_config=quant_config, prefix=f"{prefix}.to_k")
    self.to_v = ReplicatedLinear(dim, dim, quant_config=quant_config, prefix=f"{prefix}.to_v")
    self.to_out = ReplicatedLinear(dim, dim, quant_config=quant_config, prefix=f"{prefix}.to_out")
    self.norm_q = RMSNorm(dim, eps=eps) if qk_norm else nn.Identity()
    self.norm_k = RMSNorm(dim, eps=eps) if qk_norm else nn.Identity()

    # Scaled dot product attention
    self.attn = LocalAttention(
        num_heads=num_heads,
        head_size=self.head_dim,
        dropout_rate=0,
        softmax_scale=None,
        causal=False,
        supported_attention_backends=(AttentionBackendEnum.FLASH_ATTN,
                                      AttentionBackendEnum.TORCH_SDPA))

Methods:

fastvideo.models.dits.matrixgame2.model.MatrixGame2CrossAttention.forward
forward(x, context, context_lens=None, crossattn_cache=None)

Parameters:

Name Type Description Default
x Tensor

Shape [B, L1, C]

required
context Tensor

Shape [B, L2, C] - typically 257 image tokens

required
context_lens Tensor

Shape [B]

None
crossattn_cache dict

Optional cache for k/v during inference

None
Source code in fastvideo/models/dits/matrixgame2/model.py
def forward(self, x, context, context_lens=None, crossattn_cache=None):
    r"""
    Args:
        x(Tensor): Shape [B, L1, C]
        context(Tensor): Shape [B, L2, C] - typically 257 image tokens
        context_lens(Tensor): Shape [B]
        crossattn_cache(dict): Optional cache for k/v during inference
    """
    b, n, d = x.size(0), self.num_heads, self.head_dim

    # compute query, key, value
    q = self.norm_q(self.to_q(x)[0]).view(b, -1, n, d)

    if crossattn_cache is not None:
        if not crossattn_cache["is_init"]:
            crossattn_cache["is_init"] = True
            k = self.norm_k(self.to_k(context)[0]).view(b, -1, n, d)
            v = self.to_v(context)[0].view(b, -1, n, d)
            crossattn_cache["k"] = k
            crossattn_cache["v"] = v
        else:
            k = crossattn_cache["k"]
            v = crossattn_cache["v"]
    else:
        k = self.norm_k(self.to_k(context)[0]).view(b, -1, n, d)
        v = self.to_v(context)[0].view(b, -1, n, d)

    # compute attention
    x = self.attn(q, k, v)

    # output
    x = x.flatten(2)
    x, _ = self.to_out(x)
    return x

Functions: