---
title: flux
---

<div class="python-reference">
<a id="fastvideo.models.dits.flux-classes"></a>
<a id="fastvideo.models.dits.flux-functions"></a>
<a id="fastvideo.models.dits.flux"></a>

<h2 id="fastvideo.models.dits.flux.apply_rotary_emb"><code>fastvideo.models.dits.flux.apply_rotary_emb</code></h2>
<pre class="doc-signature"><code>apply_rotary_emb(x: torch.Tensor, freqs_cis: torch.Tensor | tuple&#91;torch.Tensor, torch.Tensor&#93;, use_real: bool = True, use_real_unbind_dim: int = -1, sequence_dim: int = 2) -&gt; torch.Tensor</code></pre>
<p>Apply rotary embeddings to input tensors using the given frequency tensor. This function applies rotary embeddings
to the given query or key 'x' tensors using the provided frequency tensor 'freqs_cis'. The input tensors are
reshaped as complex numbers, and the frequency tensor is reshaped for broadcasting compatibility. The resulting
tensors contain rotary embeddings and are returned as real tensors.
Args:
    x (<code>torch.Tensor</code>):
        Query or key tensor to apply rotary embeddings. [B, H, S, D] if sequence_dim=2 else [B, S, H, D].
    freqs_cis (<code>Tuple[torch.Tensor]</code>): Precomputed frequency tensor for complex exponentials. ([S, D], [S, D],)
    sequence_dim: 1 = sequence at dim 1 (cos [1,S,1,D], x [B,S,H,D]); 2 = sequence at dim 2 (cos [1,1,S,D], x [B,H,S,D]).
Returns:
    Tuple[torch.Tensor, torch.Tensor]: Tuple of modified query tensor and key tensor with rotary embeddings.</p>
<h2 id="fastvideo.models.dits.flux.get_1d_rotary_pos_embed"><code>fastvideo.models.dits.flux.get_1d_rotary_pos_embed</code></h2>
<pre class="doc-signature"><code>get_1d_rotary_pos_embed(dim: int, pos: torch.FloatTensor | int, theta: float = 10000.0, theta_rescale_factor: float = 1.0, interpolation_factor: float = 1.0, dtype: torch.dtype = torch.float32, use_real: bool = True, freqs_dtype: torch.dtype | None = None) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;</code></pre>
<p>Precompute the frequency tensor for complex exponential (cis) with given dimensions.
(Note: <code>cis</code> means <code>cos + i * sin</code>, where i is the imaginary unit.)</p>
<p>This function calculates a frequency tensor with complex exponential using the given dimension 'dim'
and the end index 'end'. The 'theta' parameter scales the frequencies.</p>
<h3>Parameters</h3>
<dl>
<dt><code>dim: int</code></dt><dd><p>Dimension of the frequency tensor.</p></dd>
<dt><code>pos: int or torch.FloatTensor</code></dt><dd><p>Position indices for the frequency tensor. [S] or scalar</p></dd>
<dt><code>theta: float</code></dt><dd><p>Scaling factor for frequency computation. Defaults to 10000.0.</p></dd>
<dt><code>theta_rescale_factor: float</code></dt><dd><p>Rescale factor for theta. Defaults to 1.0.</p></dd>
<dt><code>interpolation_factor: float</code></dt><dd><p>Factor to scale positions. Defaults to 1.0.</p></dd>
<dt><code>use_real: bool</code></dt><dd><p>If True, output full head_dim with repeated cos/sin for 
rotate_half style RoPE. If False, output half head_dim for complex style. Defaults to True.</p></dd>
</dl>
<h3>Returns</h3>
<dl>
<dt><code>tuple[torch.Tensor, torch.Tensor]</code></dt><dd><p>freqs_cos, freqs_sin: Precomputed frequency tensor with real and imaginary parts separately. 
Shape is [S, D] if use_real=True, [S, D/2] if use_real=False.</p></dd>
</dl>
<h2 id="fastvideo.models.dits.flux.DistributedAttention"><code>fastvideo.models.dits.flux.DistributedAttention</code></h2>
<pre class="doc-signature"><code>DistributedAttention(num_heads: int, head_size: int, num_kv_heads: int | None = None, softmax_scale: float | None = None, causal: bool = False, supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None, prefix: str = &#x27;&#x27;, **extra_impl_args)</code></pre>
<p>Distributed attention layer.</p>

<h3 id="fastvideo.models.dits.flux.DistributedAttention.forward"><code>fastvideo.models.dits.flux.DistributedAttention.forward</code></h3>
<pre class="doc-signature"><code>forward(q: torch.Tensor, k: torch.Tensor, v: torch.Tensor, original_seq_len: int | None = None, replicated_q: torch.Tensor | None = None, replicated_k: torch.Tensor | None = None, replicated_v: torch.Tensor | None = None, freqs_cis: tuple&#91;torch.Tensor, torch.Tensor&#93; | None = None, attn_metadata: AttentionMetadata | None = None) -&gt; tuple&#91;torch.Tensor, torch.Tensor | None&#93;</code></pre>
<p>Forward pass for distributed attention.</p>
<h4>Parameters</h4>
<dl>
<dt><code>q: torch.Tensor</code></dt><dd><p>Query tensor [batch_size, seq_len, num_heads, head_dim]</p></dd>
<dt><code>k: torch.Tensor</code></dt><dd><p>Key tensor [batch_size, seq_len, num_heads, head_dim]</p></dd>
<dt><code>v: torch.Tensor</code></dt><dd><p>Value tensor [batch_size, seq_len, num_heads, head_dim]</p></dd>
<dt><code>original_seq_len: int</code></dt><dd><p>Original (unpadded) full sequence length</p></dd>
<dt><code>replicated_q: Optional[torch.Tensor]</code></dt><dd><p>Replicated query tensor, typically for text tokens</p></dd>
<dt><code>replicated_k: Optional[torch.Tensor]</code></dt><dd><p>Replicated key tensor</p></dd>
<dt><code>replicated_v: Optional[torch.Tensor]</code></dt><dd><p>Replicated value tensor</p></dd>
</dl>
<h4>Returns</h4>
<dl>
<dt><code>tuple[torch.Tensor, torch.Tensor | None]</code></dt><dd><p>Tuple[torch.Tensor, Optional[torch.Tensor]]: A tuple containing:
- o (torch.Tensor): Output tensor after attention for the main sequence
- replicated_o (Optional[torch.Tensor]): Output tensor for replicated tokens, if provided</p></dd>
</dl>
<h2 id="fastvideo.models.dits.flux.DiTConfig"><code>fastvideo.models.dits.flux.DiTConfig</code></h2>
<pre class="doc-signature"><code>DiTConfig(arch_config: DiTArchConfig = DiTArchConfig(), prefix: str = &#x27;&#x27;, quant_config: QuantizationConfig | None = None, *, _resolved_attention_backend: AttentionBackendEnum | None = None)</code></pre>


<h3 id="fastvideo.models.dits.flux.DiTConfig.add_cli_args"><code>fastvideo.models.dits.flux.DiTConfig.add_cli_args</code></h3>
<pre class="doc-signature"><code>add_cli_args(parser: Any, prefix: str = &#x27;dit-config&#x27;) -&gt; Any</code></pre>
<p>Add CLI arguments for DiTConfig fields</p>
<h2 id="fastvideo.models.dits.flux.get_forward_context"><code>fastvideo.models.dits.flux.get_forward_context</code></h2>
<pre class="doc-signature"><code>get_forward_context() -&gt; ForwardContext</code></pre>
<p>Get the current forward context.</p>
<h2 id="fastvideo.models.dits.flux.set_forward_context"><code>fastvideo.models.dits.flux.set_forward_context</code></h2>
<pre class="doc-signature"><code>set_forward_context(current_timestep, attn_metadata, forward_batch: Optional&#91;ForwardBatch&#93; = None)</code></pre>
<p>A context manager that stores the current forward context,
can be attention metadata, etc.
Here we can inject common logic for every model forward pass.</p>
<h2 id="fastvideo.models.dits.flux.ReplicatedLinear"><code>fastvideo.models.dits.flux.ReplicatedLinear</code></h2>
<pre class="doc-signature"><code>ReplicatedLinear(input_size: int, output_size: int, bias: bool = True, skip_bias_add: bool = False, params_dtype: torch.dtype | None = None, quant_config: QuantizationConfig | None = None, prefix: str = &#x27;&#x27;)</code></pre>
<p>Replicated linear layer.</p>
<h3>Parameters</h3>
<dl>
<dt><code>input_size: int</code></dt><dd><p>input dimension of the linear layer.</p></dd>
<dt><code>output_size: int</code></dt><dd><p>output dimension of the linear layer.</p></dd>
<dt><code>bias: bool</code></dt><dd><p>If true, add bias.</p></dd>
<dt><code>skip_bias_add: bool</code></dt><dd><p>If true, skip adding bias but instead return it.</p></dd>
<dt><code>params_dtype: torch.dtype | None</code></dt><dd><p>Data type for the parameters.</p></dd>
<dt><code>quant_config: QuantizationConfig | None</code></dt><dd><p>Quantization configure.</p></dd>
<dt><code>prefix: str</code></dt><dd><p>The name of the layer in the state dict, including all parents
            (e.g. model.layers.0.qkv_proj)</p></dd>
</dl>

<h3 id="fastvideo.models.dits.flux.ReplicatedLinear.weight_loader"><code>fastvideo.models.dits.flux.ReplicatedLinear.weight_loader</code></h3>
<pre class="doc-signature"><code>weight_loader(param: Parameter, loaded_weight: torch.Tensor) -&gt; None</code></pre>

<h3 id="fastvideo.models.dits.flux.ReplicatedLinear.forward"><code>fastvideo.models.dits.flux.ReplicatedLinear.forward</code></h3>
<pre class="doc-signature"><code>forward(x: torch.Tensor) -&gt; tuple&#91;torch.Tensor, Parameter | None&#93;</code></pre>

<h3 id="fastvideo.models.dits.flux.ReplicatedLinear.extra_repr"><code>fastvideo.models.dits.flux.ReplicatedLinear.extra_repr</code></h3>
<pre class="doc-signature"><code>extra_repr() -&gt; str</code></pre>

<h3 id="fastvideo.models.dits.flux.ReplicatedLinear.get_shape_mapping"><code>fastvideo.models.dits.flux.ReplicatedLinear.get_shape_mapping</code></h3>
<pre class="doc-signature"><code>get_shape_mapping() -&gt; dict</code></pre>
<p>Get the mapping from (input_shape, output_shape) to layer types.</p>
<h3 id="fastvideo.models.dits.flux.ReplicatedLinear.reset_shape_tracking"><code>fastvideo.models.dits.flux.ReplicatedLinear.reset_shape_tracking</code></h3>
<pre class="doc-signature"><code>reset_shape_tracking() -&gt; None</code></pre>
<p>Clear tracked shapes and layer type mappings.</p>
<h3 id="fastvideo.models.dits.flux.ReplicatedLinear.print_shape_summary"><code>fastvideo.models.dits.flux.ReplicatedLinear.print_shape_summary</code></h3>
<pre class="doc-signature"><code>print_shape_summary() -&gt; None</code></pre>
<p>Log a summary of all unique shapes and their layer types.</p>
<h2 id="fastvideo.models.dits.flux.Timesteps"><code>fastvideo.models.dits.flux.Timesteps</code></h2>
<pre class="doc-signature"><code>Timesteps(num_channels: int, flip_sin_to_cos: bool, downscale_freq_shift: float, scale: int = 1)</code></pre>


<h3 id="fastvideo.models.dits.flux.Timesteps.forward"><code>fastvideo.models.dits.flux.Timesteps.forward</code></h3>
<pre class="doc-signature"><code>forward(timesteps: torch.Tensor) -&gt; torch.Tensor</code></pre>

<h2 id="fastvideo.models.dits.flux.BaseDiT"><code>fastvideo.models.dits.flux.BaseDiT</code></h2>
<pre class="doc-signature"><code>BaseDiT(config: DiTConfig, hf_config: dict&#91;str, Any&#93;, **kwargs)</code></pre>


<h3 id="fastvideo.models.dits.flux.BaseDiT.forward"><code>fastvideo.models.dits.flux.BaseDiT.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor, encoder_hidden_states: torch.Tensor | list&#91;torch.Tensor&#93;, timestep: torch.LongTensor, encoder_hidden_states_image: torch.Tensor | list&#91;torch.Tensor&#93; | None = None, guidance = None, **kwargs) -&gt; torch.Tensor</code></pre>

<h3 id="fastvideo.models.dits.flux.BaseDiT.preprocess_loaded_weight"><code>fastvideo.models.dits.flux.BaseDiT.preprocess_loaded_weight</code></h3>
<pre class="doc-signature"><code>preprocess_loaded_weight(name: str, tensor: torch.Tensor) -&gt; torch.Tensor</code></pre>
<p>Adapt a checkpoint tensor before sharding; default models are unchanged.</p>
<h3 id="fastvideo.models.dits.flux.BaseDiT.inference_config_overrides"><code>fastvideo.models.dits.flux.BaseDiT.inference_config_overrides</code></h3>
<pre class="doc-signature"><code>inference_config_overrides() -&gt; dict&#91;str, Any&#93;</code></pre>
<p>Extra <code>config.json</code> keys a deployable checkpoint of this model needs.</p>
<h3 id="fastvideo.models.dits.flux.BaseDiT.inference_export_expected_shape"><code>fastvideo.models.dits.flux.BaseDiT.inference_export_expected_shape</code></h3>
<pre class="doc-signature"><code>inference_export_expected_shape(output_key: str, base_shape: tuple&#91;int, ...&#93;) -&gt; tuple&#91;int, ...&#93;</code></pre>
<p>The exported shape of <em>output_key</em> given the base checkpoint's shape.</p>
<h2 id="fastvideo.models.dits.flux.CombinedTimestepTextProjEmbeddings"><code>fastvideo.models.dits.flux.CombinedTimestepTextProjEmbeddings</code></h2>
<pre class="doc-signature"><code>CombinedTimestepTextProjEmbeddings(embedding_dim: int, pooled_projection_dim: int)</code></pre>


<h3 id="fastvideo.models.dits.flux.CombinedTimestepTextProjEmbeddings.forward"><code>fastvideo.models.dits.flux.CombinedTimestepTextProjEmbeddings.forward</code></h3>
<pre class="doc-signature"><code>forward(timestep: torch.Tensor, pooled_projection: torch.Tensor) -&gt; torch.Tensor</code></pre>

<h2 id="fastvideo.models.dits.flux.SD3AdaLayerNormContinuous"><code>fastvideo.models.dits.flux.SD3AdaLayerNormContinuous</code></h2>
<pre class="doc-signature"><code>SD3AdaLayerNormContinuous(embedding_dim: int, conditioning_embedding_dim: int, elementwise_affine: bool = True, eps: float = 1e-05, bias: bool = True, norm_type: str = &#x27;layer_norm&#x27;)</code></pre>


<h3 id="fastvideo.models.dits.flux.SD3AdaLayerNormContinuous.forward"><code>fastvideo.models.dits.flux.SD3AdaLayerNormContinuous.forward</code></h3>
<pre class="doc-signature"><code>forward(x: torch.Tensor, conditioning_embedding: torch.Tensor) -&gt; torch.Tensor</code></pre>

<h2 id="fastvideo.models.dits.flux.SD3AdaLayerNormZero"><code>fastvideo.models.dits.flux.SD3AdaLayerNormZero</code></h2>
<pre class="doc-signature"><code>SD3AdaLayerNormZero(embedding_dim: int, norm_type: str = &#x27;layer_norm&#x27;, bias: bool = True)</code></pre>


<h3 id="fastvideo.models.dits.flux.SD3AdaLayerNormZero.forward"><code>fastvideo.models.dits.flux.SD3AdaLayerNormZero.forward</code></h3>
<pre class="doc-signature"><code>forward(x: torch.Tensor, emb: torch.Tensor) -&gt; tuple&#91;torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor&#93;</code></pre>

<h2 id="fastvideo.models.dits.flux.SD3FeedForward"><code>fastvideo.models.dits.flux.SD3FeedForward</code></h2>
<pre class="doc-signature"><code>SD3FeedForward(dim: int, dim_out: int | None = None, mult: int = 4, dropout: float = 0.0, activation_fn: str = &#x27;geglu&#x27;, final_dropout: bool = False, inner_dim: int | None = None, bias: bool = True)</code></pre>


<h3 id="fastvideo.models.dits.flux.SD3FeedForward.forward"><code>fastvideo.models.dits.flux.SD3FeedForward.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor) -&gt; torch.Tensor</code></pre>

<h2 id="fastvideo.models.dits.flux.SD3TextProjection"><code>fastvideo.models.dits.flux.SD3TextProjection</code></h2>
<pre class="doc-signature"><code>SD3TextProjection(in_features: int, hidden_size: int, out_features: int | None = None, act_fn: str = &#x27;silu&#x27;)</code></pre>


<h3 id="fastvideo.models.dits.flux.SD3TextProjection.forward"><code>fastvideo.models.dits.flux.SD3TextProjection.forward</code></h3>
<pre class="doc-signature"><code>forward(caption: torch.Tensor) -&gt; torch.Tensor</code></pre>

<h2 id="fastvideo.models.dits.flux.SD3TimestepEmbedding"><code>fastvideo.models.dits.flux.SD3TimestepEmbedding</code></h2>
<pre class="doc-signature"><code>SD3TimestepEmbedding(in_channels: int, time_embed_dim: int, act_fn: str = &#x27;silu&#x27;)</code></pre>


<h3 id="fastvideo.models.dits.flux.SD3TimestepEmbedding.forward"><code>fastvideo.models.dits.flux.SD3TimestepEmbedding.forward</code></h3>
<pre class="doc-signature"><code>forward(sample: torch.Tensor) -&gt; torch.Tensor</code></pre>

<h2 id="fastvideo.models.dits.flux.AttentionBackendEnum"><code>fastvideo.models.dits.flux.AttentionBackendEnum</code></h2>
<pre class="doc-signature"><code>AttentionBackendEnum()</code></pre>

<h2 id="fastvideo.models.dits.flux.FluxTransformer2DModelOutput"><code>fastvideo.models.dits.flux.FluxTransformer2DModelOutput</code></h2>
<pre class="doc-signature"><code>FluxTransformer2DModelOutput(sample: torch.Tensor)</code></pre>


<details><summary>Source</summary><pre><code>@dataclass
class FluxTransformer2DModelOutput:
    sample: torch.Tensor</code></pre></details>
<h2 id="fastvideo.models.dits.flux.FluxPosEmbed"><code>fastvideo.models.dits.flux.FluxPosEmbed</code></h2>
<pre class="doc-signature"><code>FluxPosEmbed(theta: int, axes_dim: list&#91;int&#93;)</code></pre>
<p>1D RoPE axes concatenated per Diffusers <code>FluxPosEmbed</code>.</p>

<details><summary>Source</summary><pre><code>class FluxPosEmbed(nn.Module):
    &quot;&quot;&quot;1D RoPE axes concatenated per Diffusers `FluxPosEmbed`.&quot;&quot;&quot;

    def __init__(self, theta: int, axes_dim: list&#91;int&#93;) -&gt; None:
        super().__init__()
        self.theta = theta
        self.axes_dim = axes_dim

    def forward(self, ids: torch.Tensor) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
        n_axes = ids.shape&#91;-1&#93;
        cos_out: list&#91;torch.Tensor&#93; = &#91;&#93;
        sin_out: list&#91;torch.Tensor&#93; = &#91;&#93;
        pos = ids.float()
        is_mps = ids.device.type == &quot;mps&quot;
        is_npu = ids.device.type == &quot;npu&quot;
        freqs_dtype = torch.float32 if (is_mps or is_npu) else torch.float64
        for i in range(n_axes):
            cos, sin = get_1d_rotary_pos_embed(
                self.axes_dim&#91;i&#93;,
                pos&#91;:, i&#93;,
                theta=self.theta,
                use_real=True,
                freqs_dtype=freqs_dtype,
            )
            cos_out.append(cos)
            sin_out.append(sin)
        freqs_cos = torch.cat(cos_out, dim=-1).to(ids.device)
        freqs_sin = torch.cat(sin_out, dim=-1).to(ids.device)
        return freqs_cos, freqs_sin</code></pre></details>
<h3 id="fastvideo.models.dits.flux.FluxPosEmbed.forward"><code>fastvideo.models.dits.flux.FluxPosEmbed.forward</code></h3>
<pre class="doc-signature"><code>forward(ids: torch.Tensor) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;</code></pre>

<details><summary>Source</summary><pre><code>def forward(self, ids: torch.Tensor) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
    n_axes = ids.shape&#91;-1&#93;
    cos_out: list&#91;torch.Tensor&#93; = &#91;&#93;
    sin_out: list&#91;torch.Tensor&#93; = &#91;&#93;
    pos = ids.float()
    is_mps = ids.device.type == &quot;mps&quot;
    is_npu = ids.device.type == &quot;npu&quot;
    freqs_dtype = torch.float32 if (is_mps or is_npu) else torch.float64
    for i in range(n_axes):
        cos, sin = get_1d_rotary_pos_embed(
            self.axes_dim&#91;i&#93;,
            pos&#91;:, i&#93;,
            theta=self.theta,
            use_real=True,
            freqs_dtype=freqs_dtype,
        )
        cos_out.append(cos)
        sin_out.append(sin)
    freqs_cos = torch.cat(cos_out, dim=-1).to(ids.device)
    freqs_sin = torch.cat(sin_out, dim=-1).to(ids.device)
    return freqs_cos, freqs_sin</code></pre></details>
<h2 id="fastvideo.models.dits.flux.FluxCombinedTimestepGuidanceTextProjEmbeddings"><code>fastvideo.models.dits.flux.FluxCombinedTimestepGuidanceTextProjEmbeddings</code></h2>
<pre class="doc-signature"><code>FluxCombinedTimestepGuidanceTextProjEmbeddings(embedding_dim: int, pooled_projection_dim: int)</code></pre>


<details><summary>Source</summary><pre><code>class FluxCombinedTimestepGuidanceTextProjEmbeddings(nn.Module):

    def __init__(self, embedding_dim: int, pooled_projection_dim: int) -&gt; None:
        super().__init__()
        self.time_proj = Timesteps(
            num_channels=256,
            flip_sin_to_cos=True,
            downscale_freq_shift=0,
        )
        self.timestep_embedder = SD3TimestepEmbedding(
            in_channels=256,
            time_embed_dim=embedding_dim,
            act_fn=&quot;silu&quot;,
        )
        self.guidance_embedder = SD3TimestepEmbedding(
            in_channels=256,
            time_embed_dim=embedding_dim,
            act_fn=&quot;silu&quot;,
        )
        self.text_embedder = SD3TextProjection(
            pooled_projection_dim,
            embedding_dim,
            act_fn=&quot;silu&quot;,
        )

    def forward(
        self,
        timestep: torch.Tensor,
        guidance: torch.Tensor,
        pooled_projection: torch.Tensor,
    ) -&gt; torch.Tensor:
        timesteps_proj = self.time_proj(timestep)
        timesteps_emb = self.timestep_embedder(timesteps_proj.to(dtype=pooled_projection.dtype))
        guidance_proj = self.time_proj(guidance)
        guidance_emb = self.guidance_embedder(guidance_proj.to(dtype=pooled_projection.dtype))
        time_guidance_emb = timesteps_emb + guidance_emb
        pooled_projections = self.text_embedder(pooled_projection)
        return time_guidance_emb + pooled_projections</code></pre></details>
<h3 id="fastvideo.models.dits.flux.FluxCombinedTimestepGuidanceTextProjEmbeddings.forward"><code>fastvideo.models.dits.flux.FluxCombinedTimestepGuidanceTextProjEmbeddings.forward</code></h3>
<pre class="doc-signature"><code>forward(timestep: torch.Tensor, guidance: torch.Tensor, pooled_projection: torch.Tensor) -&gt; torch.Tensor</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    timestep: torch.Tensor,
    guidance: torch.Tensor,
    pooled_projection: torch.Tensor,
) -&gt; torch.Tensor:
    timesteps_proj = self.time_proj(timestep)
    timesteps_emb = self.timestep_embedder(timesteps_proj.to(dtype=pooled_projection.dtype))
    guidance_proj = self.time_proj(guidance)
    guidance_emb = self.guidance_embedder(guidance_proj.to(dtype=pooled_projection.dtype))
    time_guidance_emb = timesteps_emb + guidance_emb
    pooled_projections = self.text_embedder(pooled_projection)
    return time_guidance_emb + pooled_projections</code></pre></details>
<h2 id="fastvideo.models.dits.flux.FluxAdaLayerNormZeroSingle"><code>fastvideo.models.dits.flux.FluxAdaLayerNormZeroSingle</code></h2>
<pre class="doc-signature"><code>FluxAdaLayerNormZeroSingle(embedding_dim: int, bias: bool = True)</code></pre>


<details><summary>Source</summary><pre><code>class FluxAdaLayerNormZeroSingle(nn.Module):

    def __init__(self, embedding_dim: int, bias: bool = True) -&gt; None:
        super().__init__()
        self.silu = nn.SiLU()
        self.linear = ReplicatedLinear(embedding_dim, 3 * embedding_dim, bias=bias)
        self.norm = nn.LayerNorm(embedding_dim, elementwise_affine=False, eps=1e-6)

    def forward(
        self,
        x: torch.Tensor,
        emb: torch.Tensor,
    ) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
        emb, _ = self.linear(self.silu(emb))
        shift_msa, scale_msa, gate_msa = emb.chunk(3, dim=1)
        x = self.norm(x) * (1 + scale_msa&#91;:, None&#93;) + shift_msa&#91;:, None&#93;
        return x, gate_msa</code></pre></details>
<h3 id="fastvideo.models.dits.flux.FluxAdaLayerNormZeroSingle.forward"><code>fastvideo.models.dits.flux.FluxAdaLayerNormZeroSingle.forward</code></h3>
<pre class="doc-signature"><code>forward(x: torch.Tensor, emb: torch.Tensor) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    x: torch.Tensor,
    emb: torch.Tensor,
) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
    emb, _ = self.linear(self.silu(emb))
    shift_msa, scale_msa, gate_msa = emb.chunk(3, dim=1)
    x = self.norm(x) * (1 + scale_msa&#91;:, None&#93;) + shift_msa&#91;:, None&#93;
    return x, gate_msa</code></pre></details>
<h2 id="fastvideo.models.dits.flux.FluxJointAttention"><code>fastvideo.models.dits.flux.FluxJointAttention</code></h2>
<pre class="doc-signature"><code>FluxJointAttention(dim: int, num_attention_heads: int, attention_head_dim: int, supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None)</code></pre>
<p>Joint attention: text tokens precede image tokens (Diffusers order).</p>

<details><summary>Source</summary><pre><code>class FluxJointAttention(nn.Module):
    &quot;&quot;&quot;Joint attention: text tokens precede image tokens (Diffusers order).&quot;&quot;&quot;

    def __init__(
        self,
        dim: int,
        num_attention_heads: int,
        attention_head_dim: int,
        supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None,
    ) -&gt; None:
        super().__init__()
        self.heads = num_attention_heads
        self.head_dim = attention_head_dim
        self.inner_dim = num_attention_heads * attention_head_dim

        self.norm_q = nn.RMSNorm(attention_head_dim, eps=1e-6)
        self.norm_k = nn.RMSNorm(attention_head_dim, eps=1e-6)
        self.norm_added_q = nn.RMSNorm(attention_head_dim, eps=1e-6)
        self.norm_added_k = nn.RMSNorm(attention_head_dim, eps=1e-6)

        self.to_q = ReplicatedLinear(dim, self.inner_dim, bias=True)
        self.to_k = ReplicatedLinear(dim, self.inner_dim, bias=True)
        self.to_v = ReplicatedLinear(dim, self.inner_dim, bias=True)
        self.add_q_proj = ReplicatedLinear(dim, self.inner_dim, bias=True)
        self.add_k_proj = ReplicatedLinear(dim, self.inner_dim, bias=True)
        self.add_v_proj = ReplicatedLinear(dim, self.inner_dim, bias=True)

        self.to_out = nn.ModuleList(&#91;
            ReplicatedLinear(self.inner_dim, dim, bias=True),
            nn.Dropout(0.0),
        &#93;)
        self.to_add_out = ReplicatedLinear(self.inner_dim, dim, bias=True)

        self.attn = DistributedAttention(
            num_heads=num_attention_heads,
            head_size=attention_head_dim,
            causal=False,
            supported_attention_backends=supported_attention_backends,
        )

    def forward(
        self,
        hidden_states: torch.Tensor,
        encoder_hidden_states: torch.Tensor,
        image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;,
    ) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
        batch_size = hidden_states.shape&#91;0&#93;
        text_seq_len = encoder_hidden_states.shape&#91;1&#93;
        img_seq_len = hidden_states.shape&#91;1&#93;

        q, _ = self.to_q(hidden_states)
        k, _ = self.to_k(hidden_states)
        v, _ = self.to_v(hidden_states)
        q = q.view(batch_size, img_seq_len, self.heads, self.head_dim)
        k = k.view(batch_size, img_seq_len, self.heads, self.head_dim)
        v = v.view(batch_size, img_seq_len, self.heads, self.head_dim)
        q = self.norm_q(q)
        k = self.norm_k(k)

        enc_q, _ = self.add_q_proj(encoder_hidden_states)
        enc_k, _ = self.add_k_proj(encoder_hidden_states)
        enc_v, _ = self.add_v_proj(encoder_hidden_states)
        enc_q = enc_q.view(batch_size, text_seq_len, self.heads, self.head_dim)
        enc_k = enc_k.view(batch_size, text_seq_len, self.heads, self.head_dim)
        enc_v = enc_v.view(batch_size, text_seq_len, self.heads, self.head_dim)
        enc_q = self.norm_added_q(enc_q)
        enc_k = self.norm_added_k(enc_k)

        q = torch.cat(&#91;enc_q, q&#93;, dim=1)
        k = torch.cat(&#91;enc_k, k&#93;, dim=1)
        v = torch.cat(&#91;enc_v, v&#93;, dim=1)

        q = apply_rotary_emb(q, image_rotary_emb, sequence_dim=1)
        k = apply_rotary_emb(k, image_rotary_emb, sequence_dim=1)

        joint_out, _ = self.attn(q, k, v)
        joint_out = joint_out.reshape(batch_size, text_seq_len + img_seq_len, self.inner_dim)

        enc_out = joint_out&#91;:, :text_seq_len&#93;
        img_out = joint_out&#91;:, text_seq_len:&#93;

        img_out, _ = self.to_out&#91;0&#93;(img_out)
        img_out = self.to_out&#91;1&#93;(img_out)
        enc_out, _ = self.to_add_out(enc_out)
        return img_out, enc_out</code></pre></details>
<h3 id="fastvideo.models.dits.flux.FluxJointAttention.forward"><code>fastvideo.models.dits.flux.FluxJointAttention.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor, encoder_hidden_states: torch.Tensor, image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    hidden_states: torch.Tensor,
    encoder_hidden_states: torch.Tensor,
    image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;,
) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
    batch_size = hidden_states.shape&#91;0&#93;
    text_seq_len = encoder_hidden_states.shape&#91;1&#93;
    img_seq_len = hidden_states.shape&#91;1&#93;

    q, _ = self.to_q(hidden_states)
    k, _ = self.to_k(hidden_states)
    v, _ = self.to_v(hidden_states)
    q = q.view(batch_size, img_seq_len, self.heads, self.head_dim)
    k = k.view(batch_size, img_seq_len, self.heads, self.head_dim)
    v = v.view(batch_size, img_seq_len, self.heads, self.head_dim)
    q = self.norm_q(q)
    k = self.norm_k(k)

    enc_q, _ = self.add_q_proj(encoder_hidden_states)
    enc_k, _ = self.add_k_proj(encoder_hidden_states)
    enc_v, _ = self.add_v_proj(encoder_hidden_states)
    enc_q = enc_q.view(batch_size, text_seq_len, self.heads, self.head_dim)
    enc_k = enc_k.view(batch_size, text_seq_len, self.heads, self.head_dim)
    enc_v = enc_v.view(batch_size, text_seq_len, self.heads, self.head_dim)
    enc_q = self.norm_added_q(enc_q)
    enc_k = self.norm_added_k(enc_k)

    q = torch.cat(&#91;enc_q, q&#93;, dim=1)
    k = torch.cat(&#91;enc_k, k&#93;, dim=1)
    v = torch.cat(&#91;enc_v, v&#93;, dim=1)

    q = apply_rotary_emb(q, image_rotary_emb, sequence_dim=1)
    k = apply_rotary_emb(k, image_rotary_emb, sequence_dim=1)

    joint_out, _ = self.attn(q, k, v)
    joint_out = joint_out.reshape(batch_size, text_seq_len + img_seq_len, self.inner_dim)

    enc_out = joint_out&#91;:, :text_seq_len&#93;
    img_out = joint_out&#91;:, text_seq_len:&#93;

    img_out, _ = self.to_out&#91;0&#93;(img_out)
    img_out = self.to_out&#91;1&#93;(img_out)
    enc_out, _ = self.to_add_out(enc_out)
    return img_out, enc_out</code></pre></details>
<h2 id="fastvideo.models.dits.flux.FluxSingleStreamAttention"><code>fastvideo.models.dits.flux.FluxSingleStreamAttention</code></h2>
<pre class="doc-signature"><code>FluxSingleStreamAttention(dim: int, num_attention_heads: int, attention_head_dim: int, supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None)</code></pre>
<p>Self-attention on concatenated text+image sequence (single blocks).</p>

<details><summary>Source</summary><pre><code>class FluxSingleStreamAttention(nn.Module):
    &quot;&quot;&quot;Self-attention on concatenated text+image sequence (single blocks).&quot;&quot;&quot;

    def __init__(
        self,
        dim: int,
        num_attention_heads: int,
        attention_head_dim: int,
        supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None,
    ) -&gt; None:
        super().__init__()
        self.heads = num_attention_heads
        self.head_dim = attention_head_dim
        self.inner_dim = num_attention_heads * attention_head_dim

        self.norm_q = nn.RMSNorm(attention_head_dim, eps=1e-6)
        self.norm_k = nn.RMSNorm(attention_head_dim, eps=1e-6)
        self.to_q = ReplicatedLinear(dim, self.inner_dim, bias=True)
        self.to_k = ReplicatedLinear(dim, self.inner_dim, bias=True)
        self.to_v = ReplicatedLinear(dim, self.inner_dim, bias=True)
        self.attn = DistributedAttention(
            num_heads=num_attention_heads,
            head_size=attention_head_dim,
            causal=False,
            supported_attention_backends=supported_attention_backends,
        )

    def forward(
        self,
        hidden_states: torch.Tensor,
        image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;,
    ) -&gt; torch.Tensor:
        batch_size, seq_len, _ = hidden_states.shape
        q, _ = self.to_q(hidden_states)
        k, _ = self.to_k(hidden_states)
        v, _ = self.to_v(hidden_states)
        q = q.view(batch_size, seq_len, self.heads, self.head_dim)
        k = k.view(batch_size, seq_len, self.heads, self.head_dim)
        v = v.view(batch_size, seq_len, self.heads, self.head_dim)
        q = self.norm_q(q)
        k = self.norm_k(k)
        q = apply_rotary_emb(q, image_rotary_emb, sequence_dim=1)
        k = apply_rotary_emb(k, image_rotary_emb, sequence_dim=1)
        out, _ = self.attn(q, k, v)
        return out.reshape(batch_size, seq_len, self.inner_dim)</code></pre></details>
<h3 id="fastvideo.models.dits.flux.FluxSingleStreamAttention.forward"><code>fastvideo.models.dits.flux.FluxSingleStreamAttention.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor, image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;) -&gt; torch.Tensor</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    hidden_states: torch.Tensor,
    image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;,
) -&gt; torch.Tensor:
    batch_size, seq_len, _ = hidden_states.shape
    q, _ = self.to_q(hidden_states)
    k, _ = self.to_k(hidden_states)
    v, _ = self.to_v(hidden_states)
    q = q.view(batch_size, seq_len, self.heads, self.head_dim)
    k = k.view(batch_size, seq_len, self.heads, self.head_dim)
    v = v.view(batch_size, seq_len, self.heads, self.head_dim)
    q = self.norm_q(q)
    k = self.norm_k(k)
    q = apply_rotary_emb(q, image_rotary_emb, sequence_dim=1)
    k = apply_rotary_emb(k, image_rotary_emb, sequence_dim=1)
    out, _ = self.attn(q, k, v)
    return out.reshape(batch_size, seq_len, self.inner_dim)</code></pre></details>
<h2 id="fastvideo.models.dits.flux.FluxTransformerBlock"><code>fastvideo.models.dits.flux.FluxTransformerBlock</code></h2>
<pre class="doc-signature"><code>FluxTransformerBlock(dim: int, num_attention_heads: int, attention_head_dim: int, supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None)</code></pre>


<details><summary>Source</summary><pre><code>class FluxTransformerBlock(nn.Module):

    def __init__(
        self,
        dim: int,
        num_attention_heads: int,
        attention_head_dim: int,
        supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None,
    ) -&gt; None:
        super().__init__()
        self.norm1 = SD3AdaLayerNormZero(dim)
        self.norm1_context = SD3AdaLayerNormZero(dim)
        self.attn = FluxJointAttention(
            dim=dim,
            num_attention_heads=num_attention_heads,
            attention_head_dim=attention_head_dim,
            supported_attention_backends=supported_attention_backends,
        )
        self.norm2 = nn.LayerNorm(dim, elementwise_affine=False, eps=1e-6)
        self.ff = SD3FeedForward(
            dim=dim,
            dim_out=dim,
            activation_fn=&quot;gelu-approximate&quot;,
        )
        self.norm2_context = nn.LayerNorm(dim, elementwise_affine=False, eps=1e-6)
        self.ff_context = SD3FeedForward(
            dim=dim,
            dim_out=dim,
            activation_fn=&quot;gelu-approximate&quot;,
        )

    def forward(
        self,
        hidden_states: torch.Tensor,
        encoder_hidden_states: torch.Tensor,
        temb: torch.Tensor,
        image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;,
        joint_attention_kwargs: dict&#91;str, Any&#93; | None = None,
    ) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
        del joint_attention_kwargs
        norm_hidden_states, gate_msa, shift_mlp, scale_mlp, gate_mlp = self.norm1(hidden_states, emb=temb)
        (norm_encoder_hidden_states, c_gate_msa, c_shift_mlp, c_scale_mlp,
         c_gate_mlp) = self.norm1_context(encoder_hidden_states, emb=temb)

        attn_output, context_attn_output = self.attn(
            hidden_states=norm_hidden_states,
            encoder_hidden_states=norm_encoder_hidden_states,
            image_rotary_emb=image_rotary_emb,
        )

        attn_output = gate_msa.unsqueeze(1) * attn_output
        hidden_states = hidden_states + attn_output

        norm_hidden_states = self.norm2(hidden_states)
        norm_hidden_states = norm_hidden_states * (1 + scale_mlp&#91;:, None&#93;) + shift_mlp&#91;:, None&#93;
        ff_output = self.ff(norm_hidden_states)
        hidden_states = hidden_states + gate_mlp.unsqueeze(1) * ff_output

        context_attn_output = c_gate_msa.unsqueeze(1) * context_attn_output
        encoder_hidden_states = encoder_hidden_states + context_attn_output

        norm_encoder_hidden_states = self.norm2_context(encoder_hidden_states)
        norm_encoder_hidden_states = norm_encoder_hidden_states * (1 + c_scale_mlp&#91;:, None&#93;) + c_shift_mlp&#91;:, None&#93;
        context_ff_output = self.ff_context(norm_encoder_hidden_states)
        encoder_hidden_states = encoder_hidden_states + (c_gate_mlp.unsqueeze(1) * context_ff_output)
        if encoder_hidden_states.dtype == torch.float16:
            encoder_hidden_states = encoder_hidden_states.clip(-65504, 65504)

        return encoder_hidden_states, hidden_states</code></pre></details>
<h3 id="fastvideo.models.dits.flux.FluxTransformerBlock.forward"><code>fastvideo.models.dits.flux.FluxTransformerBlock.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor, encoder_hidden_states: torch.Tensor, temb: torch.Tensor, image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;, joint_attention_kwargs: dict&#91;str, Any&#93; | None = None) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    hidden_states: torch.Tensor,
    encoder_hidden_states: torch.Tensor,
    temb: torch.Tensor,
    image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;,
    joint_attention_kwargs: dict&#91;str, Any&#93; | None = None,
) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
    del joint_attention_kwargs
    norm_hidden_states, gate_msa, shift_mlp, scale_mlp, gate_mlp = self.norm1(hidden_states, emb=temb)
    (norm_encoder_hidden_states, c_gate_msa, c_shift_mlp, c_scale_mlp,
     c_gate_mlp) = self.norm1_context(encoder_hidden_states, emb=temb)

    attn_output, context_attn_output = self.attn(
        hidden_states=norm_hidden_states,
        encoder_hidden_states=norm_encoder_hidden_states,
        image_rotary_emb=image_rotary_emb,
    )

    attn_output = gate_msa.unsqueeze(1) * attn_output
    hidden_states = hidden_states + attn_output

    norm_hidden_states = self.norm2(hidden_states)
    norm_hidden_states = norm_hidden_states * (1 + scale_mlp&#91;:, None&#93;) + shift_mlp&#91;:, None&#93;
    ff_output = self.ff(norm_hidden_states)
    hidden_states = hidden_states + gate_mlp.unsqueeze(1) * ff_output

    context_attn_output = c_gate_msa.unsqueeze(1) * context_attn_output
    encoder_hidden_states = encoder_hidden_states + context_attn_output

    norm_encoder_hidden_states = self.norm2_context(encoder_hidden_states)
    norm_encoder_hidden_states = norm_encoder_hidden_states * (1 + c_scale_mlp&#91;:, None&#93;) + c_shift_mlp&#91;:, None&#93;
    context_ff_output = self.ff_context(norm_encoder_hidden_states)
    encoder_hidden_states = encoder_hidden_states + (c_gate_mlp.unsqueeze(1) * context_ff_output)
    if encoder_hidden_states.dtype == torch.float16:
        encoder_hidden_states = encoder_hidden_states.clip(-65504, 65504)

    return encoder_hidden_states, hidden_states</code></pre></details>
<h2 id="fastvideo.models.dits.flux.FluxSingleTransformerBlock"><code>fastvideo.models.dits.flux.FluxSingleTransformerBlock</code></h2>
<pre class="doc-signature"><code>FluxSingleTransformerBlock(dim: int, num_attention_heads: int, attention_head_dim: int, mlp_ratio: float = 4.0, supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None)</code></pre>


<details><summary>Source</summary><pre><code>class FluxSingleTransformerBlock(nn.Module):

    def __init__(
        self,
        dim: int,
        num_attention_heads: int,
        attention_head_dim: int,
        mlp_ratio: float = 4.0,
        supported_attention_backends: tuple&#91;AttentionBackendEnum, ...&#93; | None = None,
    ) -&gt; None:
        super().__init__()
        mlp_hidden_dim = int(dim * mlp_ratio)
        self.norm = FluxAdaLayerNormZeroSingle(dim)
        self.proj_mlp = ReplicatedLinear(dim, mlp_hidden_dim, bias=True)
        self.act_mlp = nn.GELU(approximate=&quot;tanh&quot;)
        self.proj_out = ReplicatedLinear(dim + mlp_hidden_dim, dim, bias=True)
        self.attn = FluxSingleStreamAttention(
            dim=dim,
            num_attention_heads=num_attention_heads,
            attention_head_dim=attention_head_dim,
            supported_attention_backends=supported_attention_backends,
        )

    def forward(
        self,
        hidden_states: torch.Tensor,
        encoder_hidden_states: torch.Tensor,
        temb: torch.Tensor,
        image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;,
        joint_attention_kwargs: dict&#91;str, Any&#93; | None = None,
    ) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
        del joint_attention_kwargs
        text_seq_len = encoder_hidden_states.shape&#91;1&#93;
        hidden_states = torch.cat(&#91;encoder_hidden_states, hidden_states&#93;, dim=1)
        residual = hidden_states
        norm_hidden_states, gate = self.norm(hidden_states, emb=temb)
        mlp_hidden_states = self.act_mlp(self.proj_mlp(norm_hidden_states)&#91;0&#93;)
        attn_output = self.attn(
            hidden_states=norm_hidden_states,
            image_rotary_emb=image_rotary_emb,
        )
        hidden_states = torch.cat(&#91;attn_output, mlp_hidden_states&#93;, dim=2)
        gate = gate.unsqueeze(1)
        hidden_states = gate * self.proj_out(hidden_states)&#91;0&#93;
        hidden_states = residual + hidden_states
        if hidden_states.dtype == torch.float16:
            hidden_states = hidden_states.clip(-65504, 65504)
        encoder_hidden_states = hidden_states&#91;:, :text_seq_len&#93;
        hidden_states = hidden_states&#91;:, text_seq_len:&#93;
        return encoder_hidden_states, hidden_states</code></pre></details>
<h3 id="fastvideo.models.dits.flux.FluxSingleTransformerBlock.forward"><code>fastvideo.models.dits.flux.FluxSingleTransformerBlock.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor, encoder_hidden_states: torch.Tensor, temb: torch.Tensor, image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;, joint_attention_kwargs: dict&#91;str, Any&#93; | None = None) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    hidden_states: torch.Tensor,
    encoder_hidden_states: torch.Tensor,
    temb: torch.Tensor,
    image_rotary_emb: tuple&#91;torch.Tensor, torch.Tensor&#93;,
    joint_attention_kwargs: dict&#91;str, Any&#93; | None = None,
) -&gt; tuple&#91;torch.Tensor, torch.Tensor&#93;:
    del joint_attention_kwargs
    text_seq_len = encoder_hidden_states.shape&#91;1&#93;
    hidden_states = torch.cat(&#91;encoder_hidden_states, hidden_states&#93;, dim=1)
    residual = hidden_states
    norm_hidden_states, gate = self.norm(hidden_states, emb=temb)
    mlp_hidden_states = self.act_mlp(self.proj_mlp(norm_hidden_states)&#91;0&#93;)
    attn_output = self.attn(
        hidden_states=norm_hidden_states,
        image_rotary_emb=image_rotary_emb,
    )
    hidden_states = torch.cat(&#91;attn_output, mlp_hidden_states&#93;, dim=2)
    gate = gate.unsqueeze(1)
    hidden_states = gate * self.proj_out(hidden_states)&#91;0&#93;
    hidden_states = residual + hidden_states
    if hidden_states.dtype == torch.float16:
        hidden_states = hidden_states.clip(-65504, 65504)
    encoder_hidden_states = hidden_states&#91;:, :text_seq_len&#93;
    hidden_states = hidden_states&#91;:, text_seq_len:&#93;
    return encoder_hidden_states, hidden_states</code></pre></details>
<h2 id="fastvideo.models.dits.flux.FluxTransformer2DModel"><code>fastvideo.models.dits.flux.FluxTransformer2DModel</code></h2>
<pre class="doc-signature"><code>FluxTransformer2DModel(config: DiTConfig, hf_config: dict&#91;str, Any&#93;, **kwargs)</code></pre>
<p>FastVideo FLUX transformer; load Diffusers FLUX safetensors 1:1.</p>

<details><summary>Source</summary><pre><code>class FluxTransformer2DModel(BaseDiT):
    &quot;&quot;&quot;FastVideo FLUX transformer; load Diffusers FLUX safetensors 1:1.&quot;&quot;&quot;

    _fsdp_shard_conditions = &#91;
        lambda n, m: (n.startswith(&quot;transformer_blocks.&quot;) or n.startswith(&quot;single_transformer_blocks.&quot;)) and n.split(
            &quot;.&quot;)&#91;-1&#93;.isdigit(),
    &#93;
    _compile_conditions = _fsdp_shard_conditions
    # HF weight names already match this module layout (cf. SGLang regex maps).
    param_names_mapping: dict&#91;str, Any&#93; = &#123;&#125;
    reverse_param_names_mapping: dict&#91;str, Any&#93; = &#123;&#125;
    lora_param_names_mapping: dict&#91;str, Any&#93; = &#123;&#125;
    _supported_attention_backends = (
        AttentionBackendEnum.FLASH_ATTN,
        AttentionBackendEnum.TORCH_SDPA,
    )

    def __init__(self, config: DiTConfig, hf_config: dict&#91;str, Any&#93;, **kwargs) -&gt; None:
        del kwargs
        super().__init__(config=config, hf_config=hf_config)
        self.fastvideo_config = config
        self.hf_config = hf_config
        arch = config.arch_config

        out_ch = arch.out_channels
        self.out_channels = out_ch if out_ch is not None else arch.in_channels
        self.inner_dim = arch.num_attention_heads * arch.attention_head_dim
        self.hidden_size = self.inner_dim
        self.num_attention_heads = arch.num_attention_heads
        self.num_channels_latents = arch.in_channels

        axes_list = list(arch.axes_dims_rope)
        self.pos_embed = FluxPosEmbed(theta=10000, axes_dim=axes_list)
        if arch.guidance_embeds:
            self.time_text_embed = FluxCombinedTimestepGuidanceTextProjEmbeddings(
                embedding_dim=self.inner_dim,
                pooled_projection_dim=arch.pooled_projection_dim,
            )
        else:
            self.time_text_embed = CombinedTimestepTextProjEmbeddings(
                embedding_dim=self.inner_dim,
                pooled_projection_dim=arch.pooled_projection_dim,
            )
        self.context_embedder = ReplicatedLinear(arch.joint_attention_dim, self.inner_dim)
        self.x_embedder = ReplicatedLinear(arch.in_channels, self.inner_dim)

        self.transformer_blocks = nn.ModuleList(&#91;
            FluxTransformerBlock(
                dim=self.inner_dim,
                num_attention_heads=arch.num_attention_heads,
                attention_head_dim=arch.attention_head_dim,
                supported_attention_backends=self._supported_attention_backends,
            ) for _ in range(arch.num_layers)
        &#93;)
        self.single_transformer_blocks = nn.ModuleList(&#91;
            FluxSingleTransformerBlock(
                dim=self.inner_dim,
                num_attention_heads=arch.num_attention_heads,
                attention_head_dim=arch.attention_head_dim,
                supported_attention_backends=self._supported_attention_backends,
            ) for _ in range(arch.num_single_layers)
        &#93;)

        self.norm_out = SD3AdaLayerNormContinuous(
            self.inner_dim,
            self.inner_dim,
            elementwise_affine=False,
            eps=1e-6,
            bias=True,
            norm_type=&quot;layer_norm&quot;,
        )
        self.proj_out = ReplicatedLinear(
            self.inner_dim,
            arch.patch_size * arch.patch_size * self.out_channels,
            bias=True,
        )
        self.gradient_checkpointing = False
        self.__post_init__()

    def forward(
        self,
        hidden_states: torch.Tensor,
        encoder_hidden_states: torch.Tensor | None = None,
        pooled_projections: torch.Tensor | None = None,
        timestep: torch.LongTensor | torch.Tensor | None = None,
        img_ids: torch.Tensor | None = None,
        txt_ids: torch.Tensor | None = None,
        guidance: torch.Tensor | None = None,
        joint_attention_kwargs: dict&#91;str, Any&#93; | None = None,
        return_dict: bool = True,
        controlnet_block_samples: Any | None = None,
        controlnet_single_block_samples: Any | None = None,
        controlnet_blocks_repeat: bool = False,
        **kwargs: Any,
    ) -&gt; FluxTransformer2DModelOutput | tuple&#91;torch.Tensor, ...&#93;:
        del kwargs
        if encoder_hidden_states is None:
            raise ValueError(&quot;encoder_hidden_states must be provided&quot;)
        if pooled_projections is None:
            raise ValueError(&quot;pooled_projections must be provided&quot;)
        if timestep is None:
            raise ValueError(&quot;timestep must be provided&quot;)
        if img_ids is None or txt_ids is None:
            raise ValueError(&quot;img_ids and txt_ids must be provided&quot;)

        arch = self.fastvideo_config.arch_config
        if arch.guidance_embeds and guidance is None:
            raise ValueError(&quot;guidance must be provided when guidance_embeds=True&quot;)

        if timestep.dim() == 0:
            timestep = timestep&#91;None&#93;
        if timestep.dim() &gt; 1:
            timestep = timestep.reshape(-1)
        if timestep.shape&#91;0&#93; == 1 and hidden_states.shape&#91;0&#93; &gt; 1:
            timestep = timestep.expand(hidden_states.shape&#91;0&#93;)

        try:
            get_forward_context()
            forward_context = nullcontext()
        except AssertionError:
            if timestep.numel() == 0:
                ts0 = 0
            elif torch.is_floating_point(timestep):
                ts0 = int(round(timestep&#91;0&#93;.item() * 1000))
            else:
                ts0 = int(timestep&#91;0&#93;.item())
            forward_context = set_forward_context(current_timestep=ts0, attn_metadata=None)

        with forward_context:
            hidden_states, _ = self.x_embedder(hidden_states)

            ts = timestep.to(hidden_states.dtype) * 1000
            g = None if guidance is None else guidance.to(hidden_states.dtype) * 1000

            if arch.guidance_embeds:
                assert g is not None
                temb = self.time_text_embed(ts, g, pooled_projections)
            else:
                temb = self.time_text_embed(timestep=ts, pooled_projection=pooled_projections)

            encoder_hidden_states, _ = self.context_embedder(encoder_hidden_states)

            if txt_ids.ndim == 3:
                txt_ids = txt_ids&#91;0&#93;
            if img_ids.ndim == 3:
                img_ids = img_ids&#91;0&#93;

            ids = torch.cat((txt_ids, img_ids), dim=0)
            image_rotary_emb = self.pos_embed(ids)

            jkwargs = joint_attention_kwargs or &#123;&#125;

            for idx, block in enumerate(self.transformer_blocks):
                encoder_hidden_states, hidden_states = block(
                    hidden_states=hidden_states,
                    encoder_hidden_states=encoder_hidden_states,
                    temb=temb,
                    image_rotary_emb=image_rotary_emb,
                    joint_attention_kwargs=jkwargs,
                )
                if controlnet_block_samples:
                    interval = len(self.transformer_blocks) / len(controlnet_block_samples)
                    interval = int(math.ceil(interval))
                    if controlnet_blocks_repeat:
                        hidden_states = hidden_states + controlnet_block_samples&#91;idx % len(controlnet_block_samples)&#93;
                    else:
                        hidden_states = hidden_states + controlnet_block_samples&#91;idx // interval&#93;

            for idx, block in enumerate(self.single_transformer_blocks):
                encoder_hidden_states, hidden_states = block(
                    hidden_states=hidden_states,
                    encoder_hidden_states=encoder_hidden_states,
                    temb=temb,
                    image_rotary_emb=image_rotary_emb,
                    joint_attention_kwargs=jkwargs,
                )
                if controlnet_single_block_samples:
                    interval = len(self.single_transformer_blocks) / len(controlnet_single_block_samples)
                    interval = int(math.ceil(interval))
                    hidden_states = hidden_states + controlnet_single_block_samples&#91;idx // interval&#93;

            hidden_states = self.norm_out(hidden_states, temb)
            output, _ = self.proj_out(hidden_states)

            if not return_dict:
                return (output, )
            return FluxTransformer2DModelOutput(sample=output)</code></pre></details>
<h3 id="fastvideo.models.dits.flux.FluxTransformer2DModel.forward"><code>fastvideo.models.dits.flux.FluxTransformer2DModel.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor, encoder_hidden_states: torch.Tensor | None = None, pooled_projections: torch.Tensor | None = None, timestep: torch.LongTensor | torch.Tensor | None = None, img_ids: torch.Tensor | None = None, txt_ids: torch.Tensor | None = None, guidance: torch.Tensor | None = None, joint_attention_kwargs: dict&#91;str, Any&#93; | None = None, return_dict: bool = True, controlnet_block_samples: Any | None = None, controlnet_single_block_samples: Any | None = None, controlnet_blocks_repeat: bool = False, **kwargs: Any) -&gt; FluxTransformer2DModelOutput | tuple&#91;torch.Tensor, ...&#93;</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    hidden_states: torch.Tensor,
    encoder_hidden_states: torch.Tensor | None = None,
    pooled_projections: torch.Tensor | None = None,
    timestep: torch.LongTensor | torch.Tensor | None = None,
    img_ids: torch.Tensor | None = None,
    txt_ids: torch.Tensor | None = None,
    guidance: torch.Tensor | None = None,
    joint_attention_kwargs: dict&#91;str, Any&#93; | None = None,
    return_dict: bool = True,
    controlnet_block_samples: Any | None = None,
    controlnet_single_block_samples: Any | None = None,
    controlnet_blocks_repeat: bool = False,
    **kwargs: Any,
) -&gt; FluxTransformer2DModelOutput | tuple&#91;torch.Tensor, ...&#93;:
    del kwargs
    if encoder_hidden_states is None:
        raise ValueError(&quot;encoder_hidden_states must be provided&quot;)
    if pooled_projections is None:
        raise ValueError(&quot;pooled_projections must be provided&quot;)
    if timestep is None:
        raise ValueError(&quot;timestep must be provided&quot;)
    if img_ids is None or txt_ids is None:
        raise ValueError(&quot;img_ids and txt_ids must be provided&quot;)

    arch = self.fastvideo_config.arch_config
    if arch.guidance_embeds and guidance is None:
        raise ValueError(&quot;guidance must be provided when guidance_embeds=True&quot;)

    if timestep.dim() == 0:
        timestep = timestep&#91;None&#93;
    if timestep.dim() &gt; 1:
        timestep = timestep.reshape(-1)
    if timestep.shape&#91;0&#93; == 1 and hidden_states.shape&#91;0&#93; &gt; 1:
        timestep = timestep.expand(hidden_states.shape&#91;0&#93;)

    try:
        get_forward_context()
        forward_context = nullcontext()
    except AssertionError:
        if timestep.numel() == 0:
            ts0 = 0
        elif torch.is_floating_point(timestep):
            ts0 = int(round(timestep&#91;0&#93;.item() * 1000))
        else:
            ts0 = int(timestep&#91;0&#93;.item())
        forward_context = set_forward_context(current_timestep=ts0, attn_metadata=None)

    with forward_context:
        hidden_states, _ = self.x_embedder(hidden_states)

        ts = timestep.to(hidden_states.dtype) * 1000
        g = None if guidance is None else guidance.to(hidden_states.dtype) * 1000

        if arch.guidance_embeds:
            assert g is not None
            temb = self.time_text_embed(ts, g, pooled_projections)
        else:
            temb = self.time_text_embed(timestep=ts, pooled_projection=pooled_projections)

        encoder_hidden_states, _ = self.context_embedder(encoder_hidden_states)

        if txt_ids.ndim == 3:
            txt_ids = txt_ids&#91;0&#93;
        if img_ids.ndim == 3:
            img_ids = img_ids&#91;0&#93;

        ids = torch.cat((txt_ids, img_ids), dim=0)
        image_rotary_emb = self.pos_embed(ids)

        jkwargs = joint_attention_kwargs or &#123;&#125;

        for idx, block in enumerate(self.transformer_blocks):
            encoder_hidden_states, hidden_states = block(
                hidden_states=hidden_states,
                encoder_hidden_states=encoder_hidden_states,
                temb=temb,
                image_rotary_emb=image_rotary_emb,
                joint_attention_kwargs=jkwargs,
            )
            if controlnet_block_samples:
                interval = len(self.transformer_blocks) / len(controlnet_block_samples)
                interval = int(math.ceil(interval))
                if controlnet_blocks_repeat:
                    hidden_states = hidden_states + controlnet_block_samples&#91;idx % len(controlnet_block_samples)&#93;
                else:
                    hidden_states = hidden_states + controlnet_block_samples&#91;idx // interval&#93;

        for idx, block in enumerate(self.single_transformer_blocks):
            encoder_hidden_states, hidden_states = block(
                hidden_states=hidden_states,
                encoder_hidden_states=encoder_hidden_states,
                temb=temb,
                image_rotary_emb=image_rotary_emb,
                joint_attention_kwargs=jkwargs,
            )
            if controlnet_single_block_samples:
                interval = len(self.single_transformer_blocks) / len(controlnet_single_block_samples)
                interval = int(math.ceil(interval))
                hidden_states = hidden_states + controlnet_single_block_samples&#91;idx // interval&#93;

        hidden_states = self.norm_out(hidden_states, temb)
        output, _ = self.proj_out(hidden_states)

        if not return_dict:
            return (output, )
        return FluxTransformer2DModelOutput(sample=output)</code></pre></details>
</div>
