---
title: clip
---

<div class="python-reference">
<a id="fastvideo.models.encoders.clip-classes"></a>
<a id="fastvideo.models.encoders.clip-functions"></a>
<a id="fastvideo.models.encoders.clip.CLIPAttention-functions"></a>
<a id="fastvideo.models.encoders.clip.CLIPTextTransformer-functions"></a>
<a id="fastvideo.models.encoders.clip"></a>
<p>Minimal implementation of CLIPVisionModel intended to be only used
within a vision language model.</p>
<h2 id="fastvideo.models.encoders.clip.LocalAttention"><code>fastvideo.models.encoders.clip.LocalAttention</code></h2>
<pre class="doc-signature"><code>LocalAttention(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, default_backend: AttentionBackendEnum | None = None, **extra_impl_args)</code></pre>
<p>Attention layer.</p>

<h3 id="fastvideo.models.encoders.clip.LocalAttention.forward"><code>fastvideo.models.encoders.clip.LocalAttention.forward</code></h3>
<pre class="doc-signature"><code>forward(q: torch.Tensor, k: torch.Tensor, v: torch.Tensor, freqs_cis: tuple&#91;torch.Tensor, torch.Tensor&#93; | None = None) -&gt; torch.Tensor</code></pre>
<p>Apply local attention between query, key and value tensors.</p>
<h4>Parameters</h4>
<dl>
<dt><code>q: torch.Tensor</code></dt><dd><p>Query tensor of shape [batch_size, seq_len, num_heads, head_dim]</p></dd>
<dt><code>k: torch.Tensor</code></dt><dd><p>Key tensor of shape [batch_size, seq_len, num_heads, head_dim] </p></dd>
<dt><code>v: torch.Tensor</code></dt><dd><p>Value tensor of shape [batch_size, seq_len, num_heads, head_dim]</p></dd>
</dl>
<h4>Returns</h4>
<dl>
<dt><code>torch.Tensor</code></dt><dd><p>torch.Tensor: Output tensor after local attention</p></dd>
</dl>
<h2 id="fastvideo.models.encoders.clip.BaseEncoderOutput"><code>fastvideo.models.encoders.clip.BaseEncoderOutput</code></h2>
<pre class="doc-signature"><code>BaseEncoderOutput(last_hidden_state: torch.FloatTensor | None = None, pooler_output: torch.FloatTensor | None = None, hidden_states: tuple&#91;torch.FloatTensor, ...&#93; | None = None, attentions: tuple&#91;torch.FloatTensor, ...&#93; | None = None, attention_mask: torch.Tensor | None = None)</code></pre>


<h2 id="fastvideo.models.encoders.clip.CLIPTextConfig"><code>fastvideo.models.encoders.clip.CLIPTextConfig</code></h2>
<pre class="doc-signature"><code>CLIPTextConfig(arch_config: TextEncoderArchConfig = CLIPTextArchConfig(), prefix: str = &#x27;clip&#x27;, quant_config: QuantizationConfig | None = None, lora_config: Any | None = None, is_chat_model: bool = False, treat_empty_as_dot: bool = False, num_hidden_layers_override: int | None = None, require_post_norm: bool | None = None, enable_scale: bool = True, is_causal: bool = True, *, _resolved_attention_backend: AttentionBackendEnum | None = None, chat_template_enable_thinking: bool = False)</code></pre>


<h2 id="fastvideo.models.encoders.clip.CLIPVisionConfig"><code>fastvideo.models.encoders.clip.CLIPVisionConfig</code></h2>
<pre class="doc-signature"><code>CLIPVisionConfig(arch_config: ImageEncoderArchConfig = CLIPVisionArchConfig(), prefix: str = &#x27;clip&#x27;, quant_config: QuantizationConfig | None = None, lora_config: Any | None = None, num_hidden_layers_override: int | None = 31, require_post_norm: bool | None = None, enable_scale: bool = False, is_causal: bool = False, *, _resolved_attention_backend: AttentionBackendEnum | None = None)</code></pre>


<h2 id="fastvideo.models.encoders.clip.divide"><code>fastvideo.models.encoders.clip.divide</code></h2>
<pre class="doc-signature"><code>divide(numerator: int, denominator: int) -&gt; int</code></pre>
<p>Ensure that numerator is divisible by the denominator and return
the division value.</p>
<h2 id="fastvideo.models.encoders.clip.get_tp_world_size"><code>fastvideo.models.encoders.clip.get_tp_world_size</code></h2>
<pre class="doc-signature"><code>get_tp_world_size() -&gt; int</code></pre>
<p>Return world size for the tensor model parallel group.</p>
<h2 id="fastvideo.models.encoders.clip.get_act_fn"><code>fastvideo.models.encoders.clip.get_act_fn</code></h2>
<pre class="doc-signature"><code>get_act_fn(act_fn_name: str) -&gt; nn.Module</code></pre>
<p>Get an activation function by name.</p>
<h2 id="fastvideo.models.encoders.clip.ColumnParallelLinear"><code>fastvideo.models.encoders.clip.ColumnParallelLinear</code></h2>
<pre class="doc-signature"><code>ColumnParallelLinear(input_size: int, output_size: int, bias: bool = True, gather_output: bool = False, skip_bias_add: bool = False, params_dtype: torch.dtype | None = None, quant_config: QuantizationConfig | None = None, output_sizes: list&#91;int&#93; | None = None, prefix: str = &#x27;&#x27;)</code></pre>
<p>Linear layer with column parallelism.</p>
<p>The linear layer is defined as Y = XA + b. A is parallelized along
its second dimension as A = [A_1, ..., A_p].</p>
<h3>Parameters</h3>
<dl>
<dt><code>input_size: int</code></dt><dd><p>first dimension of matrix A.</p></dd>
<dt><code>output_size: int</code></dt><dd><p>second dimension of matrix A.</p></dd>
<dt><code>bias: bool</code></dt><dd><p>If true, add bias.</p></dd>
<dt><code>gather_output: bool</code></dt><dd><p>If true, call all-gather on output and make Y available
           to all GPUs, otherwise, every GPU will have its output
           which is Y_i = XA_i</p></dd>
<dt><code>skip_bias_add: bool</code></dt><dd><p>This was added to enable performance optimizations where
           bias can be fused with other element-wise operations. we
           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>output_sizes: list[int] | None</code></dt><dd><p>list of output sizes packed into one output, like for QKV
           the list would be size 3.</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.encoders.clip.ColumnParallelLinear.weight_loader"><code>fastvideo.models.encoders.clip.ColumnParallelLinear.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.encoders.clip.ColumnParallelLinear.weight_loader_v2"><code>fastvideo.models.encoders.clip.ColumnParallelLinear.weight_loader_v2</code></h3>
<pre class="doc-signature"><code>weight_loader_v2(param: Parameter, loaded_weight: torch.Tensor) -&gt; None</code></pre>

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

<h3 id="fastvideo.models.encoders.clip.ColumnParallelLinear.extra_repr"><code>fastvideo.models.encoders.clip.ColumnParallelLinear.extra_repr</code></h3>
<pre class="doc-signature"><code>extra_repr() -&gt; str</code></pre>

<h2 id="fastvideo.models.encoders.clip.QKVParallelLinear"><code>fastvideo.models.encoders.clip.QKVParallelLinear</code></h2>
<pre class="doc-signature"><code>QKVParallelLinear(hidden_size: int, head_size: int, total_num_heads: int, total_num_kv_heads: int | None = None, 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>Linear layers for the attention's QKV transformation.</p>
<p>Linear layers for the linear transformation of the query, key, and value
vectors in the attention layer. The weight matrix is concatenated along
the output dimension. The layer is parallelized along the head dimension.
When the number of key/value heads is smaller than the number of query
heads (e.g., multi-query/grouped-query attention), the key/value head may
be replicated while the query heads are partitioned.</p>
<h3>Parameters</h3>
<dl>
<dt><code>hidden_size: int</code></dt><dd><p>input hidden state size of the transformer.</p></dd>
<dt><code>head_size: int</code></dt><dd><p>size of each attention head.</p></dd>
<dt><code>total_num_heads: int</code></dt><dd><p>total number of attention query heads.</p></dd>
<dt><code>total_num_kv_heads: int | None</code></dt><dd><p>total number of attention key/value heads. If
                None, assume total_num_kv_heads = total_num_heads.</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>This was added to enable performance optimizations where
           bias can be fused with other element-wise operations. we
           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.encoders.clip.QKVParallelLinear.weight_loader_v2"><code>fastvideo.models.encoders.clip.QKVParallelLinear.weight_loader_v2</code></h3>
<pre class="doc-signature"><code>weight_loader_v2(param: BasevLLMParameter, loaded_weight: torch.Tensor, loaded_shard_id: str | None = None)</code></pre>

<h3 id="fastvideo.models.encoders.clip.QKVParallelLinear.weight_loader"><code>fastvideo.models.encoders.clip.QKVParallelLinear.weight_loader</code></h3>
<pre class="doc-signature"><code>weight_loader(param: Parameter, loaded_weight: torch.Tensor, loaded_shard_id: str | None = None)</code></pre>

<h2 id="fastvideo.models.encoders.clip.RowParallelLinear"><code>fastvideo.models.encoders.clip.RowParallelLinear</code></h2>
<pre class="doc-signature"><code>RowParallelLinear(input_size: int, output_size: int, bias: bool = True, input_is_parallel: bool = True, skip_bias_add: bool = False, params_dtype: torch.dtype | None = None, reduce_results: bool = True, quant_config: QuantizationConfig | None = None, prefix: str = &#x27;&#x27;)</code></pre>
<p>Linear layer with row parallelism.</p>
<p>The linear layer is defined as Y = XA + b. A is parallelized along
its first dimension and X along its second dimension as:
           -   -
          | A_1 |
          | .   |
      A = | .   |        X = [X_1, ..., X_p]
          | .   |
          | A_p |
           -   -
Arguments:
    input_size: first dimension of matrix A.
    output_size: second dimension of matrix A.
    bias: If true, add bias. Note that bias is not parallelized.
    input_is_parallel: If true, we assume that the input is already
                       split across the GPUs and we do not split
                       again.
    skip_bias_add: This was added to enable performance optimization where
                   bias can be fused with other element-wise operations.
                   We skip adding bias but instead return it.
    params_dtype: Data type for the parameters.
    quant_config: Quantization configure.</p>

<h3 id="fastvideo.models.encoders.clip.RowParallelLinear.weight_loader"><code>fastvideo.models.encoders.clip.RowParallelLinear.weight_loader</code></h3>
<pre class="doc-signature"><code>weight_loader(param: Parameter, loaded_weight: torch.Tensor)</code></pre>

<h3 id="fastvideo.models.encoders.clip.RowParallelLinear.weight_loader_v2"><code>fastvideo.models.encoders.clip.RowParallelLinear.weight_loader_v2</code></h3>
<pre class="doc-signature"><code>weight_loader_v2(param: BasevLLMParameter, loaded_weight: torch.Tensor)</code></pre>

<h3 id="fastvideo.models.encoders.clip.RowParallelLinear.forward"><code>fastvideo.models.encoders.clip.RowParallelLinear.forward</code></h3>
<pre class="doc-signature"><code>forward(input_) -&gt; tuple&#91;torch.Tensor, Parameter | None&#93;</code></pre>

<h3 id="fastvideo.models.encoders.clip.RowParallelLinear.extra_repr"><code>fastvideo.models.encoders.clip.RowParallelLinear.extra_repr</code></h3>
<pre class="doc-signature"><code>extra_repr() -&gt; str</code></pre>

<h2 id="fastvideo.models.encoders.clip.QuantizationConfig"><code>fastvideo.models.encoders.clip.QuantizationConfig</code></h2>
<pre class="doc-signature"><code>QuantizationConfig()</code></pre>
<p>Base class for quantization configs.</p>

<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.get_name"><code>fastvideo.models.encoders.clip.QuantizationConfig.get_name</code></h3>
<pre class="doc-signature"><code>get_name() -&gt; QuantizationMethods</code></pre>
<p>Name of the quantization method.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.get_supported_act_dtypes"><code>fastvideo.models.encoders.clip.QuantizationConfig.get_supported_act_dtypes</code></h3>
<pre class="doc-signature"><code>get_supported_act_dtypes() -&gt; list&#91;torch.dtype&#93;</code></pre>
<p>List of supported activation dtypes.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.get_min_capability"><code>fastvideo.models.encoders.clip.QuantizationConfig.get_min_capability</code></h3>
<pre class="doc-signature"><code>get_min_capability() -&gt; int</code></pre>
<p>Minimum GPU capability to support the quantization method.</p>
<p>E.g., 70 for Volta, 75 for Turing, 80 for Ampere.
This requirement is due to the custom CUDA kernels used by the
quantization method.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.get_config_filenames"><code>fastvideo.models.encoders.clip.QuantizationConfig.get_config_filenames</code></h3>
<pre class="doc-signature"><code>get_config_filenames() -&gt; list&#91;str&#93;</code></pre>
<p>List of filenames to search for in the model directory.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.from_config"><code>fastvideo.models.encoders.clip.QuantizationConfig.from_config</code></h3>
<pre class="doc-signature"><code>from_config(config: dict&#91;str, Any&#93;) -&gt; QuantizationConfig</code></pre>
<p>Create a config class from the model's quantization config.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.override_quantization_method"><code>fastvideo.models.encoders.clip.QuantizationConfig.override_quantization_method</code></h3>
<pre class="doc-signature"><code>override_quantization_method(hf_quant_cfg, user_quant) -&gt; QuantizationMethods | None</code></pre>
<p>Detects if this quantization method can support a given checkpoint
format by overriding the user specified quantization method -- 
this method should only be overwritten by subclasses in exceptional 
circumstances</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.get_from_keys"><code>fastvideo.models.encoders.clip.QuantizationConfig.get_from_keys</code></h3>
<pre class="doc-signature"><code>get_from_keys(config: dict&#91;str, Any&#93;, keys: list&#91;str&#93;) -&gt; Any</code></pre>
<p>Get a value from the model's quantization config.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.get_from_keys_or"><code>fastvideo.models.encoders.clip.QuantizationConfig.get_from_keys_or</code></h3>
<pre class="doc-signature"><code>get_from_keys_or(config: dict&#91;str, Any&#93;, keys: list&#91;str&#93;, default: Any) -&gt; Any</code></pre>
<p>Get a optional value from the model's quantization config.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.get_quant_method"><code>fastvideo.models.encoders.clip.QuantizationConfig.get_quant_method</code></h3>
<pre class="doc-signature"><code>get_quant_method(layer: torch.nn.Module, prefix: str) -&gt; QuantizeMethodBase | None</code></pre>
<p>Get the quantize method to use for the quantized layer.</p>
<h4>Parameters</h4>
<dl>
<dt><code>layer: torch.nn.Module</code></dt><dd><p>The layer for the quant method.</p></dd>
<dt><code>prefix: str</code></dt><dd><p>The full name of the layer in the state dict</p></dd>
</dl>
<p>Returns:
    The quantize method. None if the given layer doesn't support quant
    method.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.validate_runtime"><code>fastvideo.models.encoders.clip.QuantizationConfig.validate_runtime</code></h3>
<pre class="doc-signature"><code>validate_runtime(device: torch.device) -&gt; None</code></pre>
<p>Fail fast on a device the scheme cannot execute on.</p>
<p>Called once by loaders that select a serialized checkpoint scheme,
before any weight is read. The default accepts every device; schemes
with kernel or capability requirements override it.</p>
<h3 id="fastvideo.models.encoders.clip.QuantizationConfig.get_cache_scale"><code>fastvideo.models.encoders.clip.QuantizationConfig.get_cache_scale</code></h3>
<pre class="doc-signature"><code>get_cache_scale(name: str) -&gt; str | None</code></pre>

<h2 id="fastvideo.models.encoders.clip.init_logger"><code>fastvideo.models.encoders.clip.init_logger</code></h2>
<pre class="doc-signature"><code>init_logger(name: str) -&gt; _FastvideoLogger</code></pre>
<p>The main purpose of this function is to ensure that loggers are
retrieved in such a way that we can be sure the root fastvideo logger has
already been configured.</p>
<h2 id="fastvideo.models.encoders.clip.ImageEncoder"><code>fastvideo.models.encoders.clip.ImageEncoder</code></h2>
<pre class="doc-signature"><code>ImageEncoder(config: ImageEncoderConfig)</code></pre>


<h3 id="fastvideo.models.encoders.clip.ImageEncoder.forward"><code>fastvideo.models.encoders.clip.ImageEncoder.forward</code></h3>
<pre class="doc-signature"><code>forward(pixel_values: torch.Tensor, **kwargs) -&gt; BaseEncoderOutput</code></pre>

<h2 id="fastvideo.models.encoders.clip.TextEncoder"><code>fastvideo.models.encoders.clip.TextEncoder</code></h2>
<pre class="doc-signature"><code>TextEncoder(config: TextEncoderConfig)</code></pre>
<p>Base for native encoders with a model-specific forward output contract.</p>

<h3 id="fastvideo.models.encoders.clip.TextEncoder.forward"><code>fastvideo.models.encoders.clip.TextEncoder.forward</code></h3>
<pre class="doc-signature"><code>forward(*args: Any, **kwargs: Any) -&gt; TextEncoderOutputT</code></pre>

<h2 id="fastvideo.models.encoders.clip.resolve_visual_encoder_outputs"><code>fastvideo.models.encoders.clip.resolve_visual_encoder_outputs</code></h2>
<pre class="doc-signature"><code>resolve_visual_encoder_outputs(encoder_outputs: torch.Tensor | list&#91;torch.Tensor&#93;, feature_sample_layers: list&#91;int&#93; | None, post_layer_norm: torch.nn.LayerNorm | None, max_possible_layers: int) -&gt; torch.Tensor</code></pre>
<p>Given the outputs a visual encoder module that may correspond to the
output of the last layer, or a list of hidden states to be stacked,
handle post normalization and resolve it into a single output tensor.</p>
<h3>Parameters</h3>
<dl>
<dt><code>encoder_outputs: torch.Tensor | list[torch.Tensor]</code></dt><dd><p>Output of encoder's last layer or all hidden states.</p></dd>
<dt><code>feature_sample_layers: list[int] | None</code></dt><dd><p>Optional layer indices to grab from the encoder
outputs; if provided, encoder outputs must be a list.</p></dd>
<dt><code>post_layer_norm: torch.nn.LayerNorm | None</code></dt><dd><p>Post norm to apply to the output of the encoder.</p></dd>
<dt><code>max_possible_layers: int</code></dt><dd><p>Total layers in the fully loaded visual encoder.</p></dd>
</dl>
<h2 id="fastvideo.models.encoders.clip.default_weight_loader"><code>fastvideo.models.encoders.clip.default_weight_loader</code></h2>
<pre class="doc-signature"><code>default_weight_loader(param: torch.Tensor, loaded_weight: torch.Tensor) -&gt; None</code></pre>
<p>Default weight loader.</p>
<h2 id="fastvideo.models.encoders.clip.CLIPVisionEmbeddings"><code>fastvideo.models.encoders.clip.CLIPVisionEmbeddings</code></h2>
<pre class="doc-signature"><code>CLIPVisionEmbeddings(config: CLIPVisionConfig)</code></pre>


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

    def __init__(self, config: CLIPVisionConfig):
        super().__init__()
        self.config = config
        self.embed_dim = config.hidden_size
        self.image_size = config.image_size
        self.patch_size = config.patch_size
        assert self.image_size % self.patch_size == 0

        self.class_embedding = nn.Parameter(torch.randn(self.embed_dim))

        self.patch_embedding = nn.Conv2d(
            in_channels=config.num_channels,
            out_channels=self.embed_dim,
            kernel_size=self.patch_size,
            stride=self.patch_size,
            bias=False,
        )

        self.num_patches = (self.image_size // self.patch_size)**2
        self.num_positions = self.num_patches + 1
        self.position_embedding = nn.Embedding(self.num_positions, self.embed_dim)
        self.register_buffer(&quot;position_ids&quot;, torch.arange(self.num_positions).expand((1, -1)), persistent=False)

    def forward(self, pixel_values: torch.Tensor) -&gt; torch.Tensor:
        batch_size = pixel_values.shape&#91;0&#93;
        target_dtype = self.patch_embedding.weight.dtype
        patch_embeds = self.patch_embedding(pixel_values.to(dtype=target_dtype))  # shape = &#91;*, width, grid, grid&#93;
        patch_embeds = patch_embeds.flatten(2).transpose(1, 2)

        class_embeds = self.class_embedding.expand(batch_size, 1, -1)
        embeddings = torch.cat(&#91;class_embeds, patch_embeds&#93;, dim=1)
        embeddings = embeddings + self.position_embedding(self.position_ids)

        return embeddings</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPVisionEmbeddings.forward"><code>fastvideo.models.encoders.clip.CLIPVisionEmbeddings.forward</code></h3>
<pre class="doc-signature"><code>forward(pixel_values: torch.Tensor) -&gt; torch.Tensor</code></pre>

<details><summary>Source</summary><pre><code>def forward(self, pixel_values: torch.Tensor) -&gt; torch.Tensor:
    batch_size = pixel_values.shape&#91;0&#93;
    target_dtype = self.patch_embedding.weight.dtype
    patch_embeds = self.patch_embedding(pixel_values.to(dtype=target_dtype))  # shape = &#91;*, width, grid, grid&#93;
    patch_embeds = patch_embeds.flatten(2).transpose(1, 2)

    class_embeds = self.class_embedding.expand(batch_size, 1, -1)
    embeddings = torch.cat(&#91;class_embeds, patch_embeds&#93;, dim=1)
    embeddings = embeddings + self.position_embedding(self.position_ids)

    return embeddings</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPTextEmbeddings"><code>fastvideo.models.encoders.clip.CLIPTextEmbeddings</code></h2>
<pre class="doc-signature"><code>CLIPTextEmbeddings(config: CLIPTextConfig)</code></pre>


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

    def __init__(self, config: CLIPTextConfig):
        super().__init__()
        self.config = config
        embed_dim = config.hidden_size

        self.token_embedding = nn.Embedding(config.vocab_size, embed_dim)
        self.position_embedding = nn.Embedding(config.max_position_embeddings, embed_dim)

        # position_ids (1, len position emb) is contiguous in memory and exported when serialized
        self.register_buffer(&quot;position_ids&quot;,
                             torch.arange(config.max_position_embeddings).expand((1, -1)),
                             persistent=False)

    def forward(
        self,
        input_ids: torch.LongTensor | None = None,
        position_ids: torch.LongTensor | None = None,
        inputs_embeds: torch.FloatTensor | None = None,
    ) -&gt; torch.Tensor:
        if input_ids is not None:
            seq_length = input_ids.shape&#91;-1&#93;
        elif inputs_embeds is not None:
            seq_length = inputs_embeds.shape&#91;-2&#93;
        else:
            raise ValueError(&quot;Either input_ids or inputs_embeds must be provided.&quot;)

        max_position_embedding = self.position_embedding.weight.shape&#91;0&#93;

        if seq_length &gt; max_position_embedding:
            raise ValueError(f&quot;Sequence length must be less than max_position_embeddings (got `sequence length`: &quot;
                             f&quot;&#123;seq_length&#125; and max_position_embeddings: &#123;max_position_embedding&#125;&quot;)

        if position_ids is None:
            position_ids = self.position_ids&#91;:, :seq_length&#93;

        if inputs_embeds is None:
            inputs_embeds = self.token_embedding(input_ids)

        position_embeddings = self.position_embedding(position_ids)
        embeddings = inputs_embeds + position_embeddings

        return embeddings</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPTextEmbeddings.forward"><code>fastvideo.models.encoders.clip.CLIPTextEmbeddings.forward</code></h3>
<pre class="doc-signature"><code>forward(input_ids: torch.LongTensor | None = None, position_ids: torch.LongTensor | None = None, inputs_embeds: torch.FloatTensor | None = None) -&gt; torch.Tensor</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    input_ids: torch.LongTensor | None = None,
    position_ids: torch.LongTensor | None = None,
    inputs_embeds: torch.FloatTensor | None = None,
) -&gt; torch.Tensor:
    if input_ids is not None:
        seq_length = input_ids.shape&#91;-1&#93;
    elif inputs_embeds is not None:
        seq_length = inputs_embeds.shape&#91;-2&#93;
    else:
        raise ValueError(&quot;Either input_ids or inputs_embeds must be provided.&quot;)

    max_position_embedding = self.position_embedding.weight.shape&#91;0&#93;

    if seq_length &gt; max_position_embedding:
        raise ValueError(f&quot;Sequence length must be less than max_position_embeddings (got `sequence length`: &quot;
                         f&quot;&#123;seq_length&#125; and max_position_embeddings: &#123;max_position_embedding&#125;&quot;)

    if position_ids is None:
        position_ids = self.position_ids&#91;:, :seq_length&#93;

    if inputs_embeds is None:
        inputs_embeds = self.token_embedding(input_ids)

    position_embeddings = self.position_embedding(position_ids)
    embeddings = inputs_embeds + position_embeddings

    return embeddings</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPAttention"><code>fastvideo.models.encoders.clip.CLIPAttention</code></h2>
<pre class="doc-signature"><code>CLIPAttention(config: CLIPVisionConfig | CLIPTextConfig, quant_config: QuantizationConfig | None = None, prefix: str = &#x27;&#x27;)</code></pre>
<p>Multi-headed attention from 'Attention Is All You Need' paper</p>

<details><summary>Source</summary><pre><code>class CLIPAttention(nn.Module):
    &quot;&quot;&quot;Multi-headed attention from &#x27;Attention Is All You Need&#x27; paper&quot;&quot;&quot;

    def __init__(
        self,
        config: CLIPVisionConfig | CLIPTextConfig,
        quant_config: QuantizationConfig | None = None,
        prefix: str = &quot;&quot;,
    ):
        super().__init__()
        self.config = config
        self.embed_dim = config.hidden_size
        self.num_heads = config.num_attention_heads
        self.head_dim = self.embed_dim // self.num_heads
        if self.head_dim * self.num_heads != self.embed_dim:
            raise ValueError(&quot;embed_dim must be divisible by num_heads &quot;
                             f&quot;(got `embed_dim`: &#123;self.embed_dim&#125; and `num_heads`:&quot;
                             f&quot; &#123;self.num_heads&#125;).&quot;)
        self.scale = self.head_dim**-0.5 if config.enable_scale else None
        self.dropout = config.attention_dropout

        self.qkv_proj = QKVParallelLinear(
            hidden_size=self.embed_dim,
            head_size=self.head_dim,
            total_num_heads=self.num_heads,
            quant_config=quant_config,
            prefix=f&quot;&#123;prefix&#125;.qkv_proj&quot;,
        )

        self.out_proj = RowParallelLinear(
            input_size=self.embed_dim,
            output_size=self.embed_dim,
            quant_config=quant_config,
            prefix=f&quot;&#123;prefix&#125;.out_proj&quot;,
        )

        self.tp_size = get_tp_world_size()
        self.num_heads_per_partition = divide(self.num_heads, self.tp_size)

        self.attn = LocalAttention(self.num_heads_per_partition,
                                   self.head_dim,
                                   self.num_heads_per_partition,
                                   softmax_scale=self.scale,
                                   causal=config.is_causal,
                                   supported_attention_backends=config._supported_attention_backends)

    def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int):
        return tensor.view(bsz, seq_len, self.num_heads, self.head_dim).transpose(1, 2).contiguous()

    def forward(
        self,
        hidden_states: torch.Tensor,
    ):
        &quot;&quot;&quot;Input shape: Batch x Time x Channel&quot;&quot;&quot;

        qkv_states, _ = self.qkv_proj(hidden_states)
        query_states, key_states, value_states = qkv_states.chunk(3, dim=-1)
        # use flash_attn_func
        query_states = query_states.reshape(query_states.shape&#91;0&#93;, query_states.shape&#91;1&#93;, self.num_heads_per_partition,
                                            self.head_dim)
        key_states = key_states.reshape(key_states.shape&#91;0&#93;, key_states.shape&#91;1&#93;, self.num_heads_per_partition,
                                        self.head_dim)
        value_states = value_states.reshape(value_states.shape&#91;0&#93;, value_states.shape&#91;1&#93;, self.num_heads_per_partition,
                                            self.head_dim)
        attn_output = self.attn(query_states, key_states, value_states)
        attn_output = attn_output.reshape(attn_output.shape&#91;0&#93;, attn_output.shape&#91;1&#93;,
                                          self.num_heads_per_partition * self.head_dim)
        attn_output, _ = self.out_proj(attn_output)

        return attn_output, None</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPAttention.forward"><code>fastvideo.models.encoders.clip.CLIPAttention.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor)</code></pre>
<p>Input shape: Batch x Time x Channel</p>
<details><summary>Source</summary><pre><code>def forward(
    self,
    hidden_states: torch.Tensor,
):
    &quot;&quot;&quot;Input shape: Batch x Time x Channel&quot;&quot;&quot;

    qkv_states, _ = self.qkv_proj(hidden_states)
    query_states, key_states, value_states = qkv_states.chunk(3, dim=-1)
    # use flash_attn_func
    query_states = query_states.reshape(query_states.shape&#91;0&#93;, query_states.shape&#91;1&#93;, self.num_heads_per_partition,
                                        self.head_dim)
    key_states = key_states.reshape(key_states.shape&#91;0&#93;, key_states.shape&#91;1&#93;, self.num_heads_per_partition,
                                    self.head_dim)
    value_states = value_states.reshape(value_states.shape&#91;0&#93;, value_states.shape&#91;1&#93;, self.num_heads_per_partition,
                                        self.head_dim)
    attn_output = self.attn(query_states, key_states, value_states)
    attn_output = attn_output.reshape(attn_output.shape&#91;0&#93;, attn_output.shape&#91;1&#93;,
                                      self.num_heads_per_partition * self.head_dim)
    attn_output, _ = self.out_proj(attn_output)

    return attn_output, None</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPMLP"><code>fastvideo.models.encoders.clip.CLIPMLP</code></h2>
<pre class="doc-signature"><code>CLIPMLP(config: CLIPVisionConfig | CLIPTextConfig, quant_config: QuantizationConfig | None = None, prefix: str = &#x27;&#x27;)</code></pre>


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

    def __init__(
        self,
        config: CLIPVisionConfig | CLIPTextConfig,
        quant_config: QuantizationConfig | None = None,
        prefix: str = &quot;&quot;,
    ) -&gt; None:
        super().__init__()
        self.config = config
        self.activation_fn = get_act_fn(config.hidden_act)
        self.fc1 = ColumnParallelLinear(config.hidden_size,
                                        config.intermediate_size,
                                        bias=True,
                                        quant_config=quant_config,
                                        prefix=f&quot;&#123;prefix&#125;.fc1&quot;)
        self.fc2 = RowParallelLinear(config.intermediate_size,
                                     config.hidden_size,
                                     bias=True,
                                     quant_config=quant_config,
                                     prefix=f&quot;&#123;prefix&#125;.fc2&quot;)

    def forward(self, hidden_states: torch.Tensor) -&gt; torch.Tensor:
        hidden_states, _ = self.fc1(hidden_states)
        hidden_states = self.activation_fn(hidden_states)
        hidden_states, _ = self.fc2(hidden_states)

        return hidden_states</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPMLP.forward"><code>fastvideo.models.encoders.clip.CLIPMLP.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor) -&gt; torch.Tensor</code></pre>

<details><summary>Source</summary><pre><code>def forward(self, hidden_states: torch.Tensor) -&gt; torch.Tensor:
    hidden_states, _ = self.fc1(hidden_states)
    hidden_states = self.activation_fn(hidden_states)
    hidden_states, _ = self.fc2(hidden_states)

    return hidden_states</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPEncoderLayer"><code>fastvideo.models.encoders.clip.CLIPEncoderLayer</code></h2>
<pre class="doc-signature"><code>CLIPEncoderLayer(config: CLIPTextConfig | CLIPVisionConfig, quant_config: QuantizationConfig | None = None, prefix: str = &#x27;&#x27;)</code></pre>


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

    def __init__(
        self,
        config: CLIPTextConfig | CLIPVisionConfig,
        quant_config: QuantizationConfig | None = None,
        prefix: str = &quot;&quot;,
    ) -&gt; None:
        super().__init__()
        self.self_attn = CLIPAttention(
            config,
            quant_config=quant_config,
            prefix=f&quot;&#123;prefix&#125;.self_attn&quot;,
        )
        self.layer_norm1 = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
        self.mlp = CLIPMLP(config, quant_config=quant_config, prefix=f&quot;&#123;prefix&#125;.mlp&quot;)
        self.layer_norm2 = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)

    def forward(self, hidden_states: torch.Tensor) -&gt; torch.Tensor:

        residual = hidden_states

        hidden_states = self.layer_norm1(hidden_states)
        hidden_states, _ = self.self_attn(hidden_states=hidden_states)
        hidden_states = residual + hidden_states

        residual = hidden_states
        hidden_states = self.layer_norm2(hidden_states)
        hidden_states = self.mlp(hidden_states)
        hidden_states = residual + hidden_states

        return hidden_states</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPEncoderLayer.forward"><code>fastvideo.models.encoders.clip.CLIPEncoderLayer.forward</code></h3>
<pre class="doc-signature"><code>forward(hidden_states: torch.Tensor) -&gt; torch.Tensor</code></pre>

<details><summary>Source</summary><pre><code>def forward(self, hidden_states: torch.Tensor) -&gt; torch.Tensor:

    residual = hidden_states

    hidden_states = self.layer_norm1(hidden_states)
    hidden_states, _ = self.self_attn(hidden_states=hidden_states)
    hidden_states = residual + hidden_states

    residual = hidden_states
    hidden_states = self.layer_norm2(hidden_states)
    hidden_states = self.mlp(hidden_states)
    hidden_states = residual + hidden_states

    return hidden_states</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPEncoder"><code>fastvideo.models.encoders.clip.CLIPEncoder</code></h2>
<pre class="doc-signature"><code>CLIPEncoder(config: CLIPVisionConfig | CLIPTextConfig, quant_config: QuantizationConfig | None = None, num_hidden_layers_override: int | None = None, prefix: str = &#x27;&#x27;)</code></pre>
<p>Transformer encoder consisting of <code>config.num_hidden_layers</code> self
attention layers. Each layer is a [<code>CLIPEncoderLayer</code>].</p>
<h3>Parameters</h3>
<dl>
<dt><code>config: CLIPVisionConfig | CLIPTextConfig</code></dt><dd><p>CLIPConfig</p></dd>
</dl>

<details><summary>Source</summary><pre><code>class CLIPEncoder(nn.Module):
    &quot;&quot;&quot;
    Transformer encoder consisting of `config.num_hidden_layers` self
    attention layers. Each layer is a &#91;`CLIPEncoderLayer`&#93;.

    Args:
        config: CLIPConfig
    &quot;&quot;&quot;

    def __init__(
        self,
        config: CLIPVisionConfig | CLIPTextConfig,
        quant_config: QuantizationConfig | None = None,
        num_hidden_layers_override: int | None = None,
        prefix: str = &quot;&quot;,
    ) -&gt; None:
        super().__init__()

        self.config = config

        if num_hidden_layers_override is None:
            num_hidden_layers = config.num_hidden_layers
        else:
            num_hidden_layers = num_hidden_layers_override
        self.layers = nn.ModuleList(&#91;
            CLIPEncoderLayer(config=config, quant_config=quant_config, prefix=f&quot;&#123;prefix&#125;.layers.&#123;layer_idx&#125;&quot;)
            for layer_idx in range(num_hidden_layers)
        &#93;)

    def forward(self, inputs_embeds: torch.Tensor, return_all_hidden_states: bool) -&gt; torch.Tensor | list&#91;torch.Tensor&#93;:
        hidden_states_pool = &#91;inputs_embeds&#93;
        hidden_states = inputs_embeds

        for encoder_layer in self.layers:
            hidden_states = encoder_layer(hidden_states)
            if return_all_hidden_states:
                hidden_states_pool.append(hidden_states)
        # If we have multiple feature sample layers, we return all hidden
        # states in order and grab the ones we need by index.
        if return_all_hidden_states:
            return hidden_states_pool
        return &#91;hidden_states&#93;</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPEncoder.forward"><code>fastvideo.models.encoders.clip.CLIPEncoder.forward</code></h3>
<pre class="doc-signature"><code>forward(inputs_embeds: torch.Tensor, return_all_hidden_states: bool) -&gt; torch.Tensor | list&#91;torch.Tensor&#93;</code></pre>

<details><summary>Source</summary><pre><code>def forward(self, inputs_embeds: torch.Tensor, return_all_hidden_states: bool) -&gt; torch.Tensor | list&#91;torch.Tensor&#93;:
    hidden_states_pool = &#91;inputs_embeds&#93;
    hidden_states = inputs_embeds

    for encoder_layer in self.layers:
        hidden_states = encoder_layer(hidden_states)
        if return_all_hidden_states:
            hidden_states_pool.append(hidden_states)
    # If we have multiple feature sample layers, we return all hidden
    # states in order and grab the ones we need by index.
    if return_all_hidden_states:
        return hidden_states_pool
    return &#91;hidden_states&#93;</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPTextTransformer"><code>fastvideo.models.encoders.clip.CLIPTextTransformer</code></h2>
<pre class="doc-signature"><code>CLIPTextTransformer(config: CLIPTextConfig, quant_config: QuantizationConfig | None = None, num_hidden_layers_override: int | None = None, prefix: str = &#x27;&#x27;)</code></pre>


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

    def __init__(self,
                 config: CLIPTextConfig,
                 quant_config: QuantizationConfig | None = None,
                 num_hidden_layers_override: int | None = None,
                 prefix: str = &quot;&quot;):
        super().__init__()
        self.config = config
        embed_dim = config.hidden_size

        self.embeddings = CLIPTextEmbeddings(config)

        self.encoder = CLIPEncoder(config,
                                   quant_config=quant_config,
                                   num_hidden_layers_override=num_hidden_layers_override,
                                   prefix=prefix)

        self.final_layer_norm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)

        # For `pooled_output` computation
        self.eos_token_id = config.eos_token_id

    def forward(
        self,
        input_ids: torch.Tensor | None,
        position_ids: torch.Tensor | None = None,
        attention_mask: torch.Tensor | None = None,
        inputs_embeds: torch.Tensor | None = None,
        output_hidden_states: bool | None = None,
    ) -&gt; BaseEncoderOutput:
        r&quot;&quot;&quot;
        Returns:

        &quot;&quot;&quot;
        output_hidden_states = (output_hidden_states
                                if output_hidden_states is not None else self.config.output_hidden_states)

        if input_ids is None:
            raise ValueError(&quot;You have to specify input_ids&quot;)

        input_shape = input_ids.size()
        input_ids = input_ids.view(-1, input_shape&#91;-1&#93;)

        hidden_states = self.embeddings(input_ids=input_ids, position_ids=position_ids)

        # CLIP&#x27;s text model uses causal mask, prepare it here.
        # https://github.com/openai/CLIP/blob/cfcffb90e69f37bf2ff1e988237a0fbe41f33c04/clip/model.py#L324
        # causal_attention_mask = _create_4d_causal_attention_mask(
        #     input_shape, hidden_states.dtype, device=hidden_states.device
        # )

        # # expand attention_mask
        # if attention_mask is not None and not self._use_flash_attention_2:
        #     raise NotImplementedError(&quot;attention_mask is not supported for CLIPTextTransformer&quot;)
        #     # &#91;bsz, seq_len&#93; -&gt; &#91;bsz, 1, tgt_seq_len, src_seq_len&#93;
        #     attention_mask = _prepare_4d_attention_mask(attention_mask, hidden_states.dtype)

        encoder_outputs = self.encoder(
            inputs_embeds=hidden_states,
            # attention_mask=attention_mask,
            # causal_attention_mask=causal_attention_mask,
            # output_attentions=output_attentions,
            return_all_hidden_states=output_hidden_states,
            # return_dict=return_dict,
        )

        last_hidden_state = encoder_outputs&#91;-1&#93;
        last_hidden_state = self.final_layer_norm(last_hidden_state)

        if self.eos_token_id == 2:
            # The `eos_token_id` was incorrect before PR #24773: Let&#x27;s keep what have been done here.
            # A CLIP model with such `eos_token_id` in the config can&#x27;t work correctly with extra new tokens added
            # ------------------------------------------------------------
            # text_embeds.shape = &#91;batch_size, sequence_length, transformer.width&#93;
            # take features from the eot embedding (eot_token is the highest number in each sequence)
            # casting to torch.int for onnx compatibility: argmax doesn&#x27;t support int64 inputs with opset 14
            pooled_output = last_hidden_state&#91;
                torch.arange(last_hidden_state.shape&#91;0&#93;, device=last_hidden_state.device),
                input_ids.to(dtype=torch.int, device=last_hidden_state.device).argmax(dim=-1),
            &#93;
        else:
            # The config gets updated `eos_token_id` from PR #24773 (so the use of exta new tokens is possible)
            pooled_output = last_hidden_state&#91;
                torch.arange(last_hidden_state.shape&#91;0&#93;, device=last_hidden_state.device),
                # We need to get the first position of `eos_token_id` value (`pad_token_ids` might equal to `eos_token_id`)
                # Note: we assume each sequence (along batch dim.) contains an  `eos_token_id` (e.g. prepared by the tokenizer)
                (input_ids.to(dtype=torch.int, device=last_hidden_state.device) == self.eos_token_id).int().argmax(
                    dim=-1),
            &#93;

        return BaseEncoderOutput(
            last_hidden_state=last_hidden_state,
            pooler_output=pooled_output,
            hidden_states=encoder_outputs,
            # attentions=encoder_outputs.attentions,
        )</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPTextTransformer.forward"><code>fastvideo.models.encoders.clip.CLIPTextTransformer.forward</code></h3>
<pre class="doc-signature"><code>forward(input_ids: torch.Tensor | None, position_ids: torch.Tensor | None = None, attention_mask: torch.Tensor | None = None, inputs_embeds: torch.Tensor | None = None, output_hidden_states: bool | None = None) -&gt; BaseEncoderOutput</code></pre>
<p>Returns:</p>
<details><summary>Source</summary><pre><code>def forward(
    self,
    input_ids: torch.Tensor | None,
    position_ids: torch.Tensor | None = None,
    attention_mask: torch.Tensor | None = None,
    inputs_embeds: torch.Tensor | None = None,
    output_hidden_states: bool | None = None,
) -&gt; BaseEncoderOutput:
    r&quot;&quot;&quot;
    Returns:

    &quot;&quot;&quot;
    output_hidden_states = (output_hidden_states
                            if output_hidden_states is not None else self.config.output_hidden_states)

    if input_ids is None:
        raise ValueError(&quot;You have to specify input_ids&quot;)

    input_shape = input_ids.size()
    input_ids = input_ids.view(-1, input_shape&#91;-1&#93;)

    hidden_states = self.embeddings(input_ids=input_ids, position_ids=position_ids)

    # CLIP&#x27;s text model uses causal mask, prepare it here.
    # https://github.com/openai/CLIP/blob/cfcffb90e69f37bf2ff1e988237a0fbe41f33c04/clip/model.py#L324
    # causal_attention_mask = _create_4d_causal_attention_mask(
    #     input_shape, hidden_states.dtype, device=hidden_states.device
    # )

    # # expand attention_mask
    # if attention_mask is not None and not self._use_flash_attention_2:
    #     raise NotImplementedError(&quot;attention_mask is not supported for CLIPTextTransformer&quot;)
    #     # &#91;bsz, seq_len&#93; -&gt; &#91;bsz, 1, tgt_seq_len, src_seq_len&#93;
    #     attention_mask = _prepare_4d_attention_mask(attention_mask, hidden_states.dtype)

    encoder_outputs = self.encoder(
        inputs_embeds=hidden_states,
        # attention_mask=attention_mask,
        # causal_attention_mask=causal_attention_mask,
        # output_attentions=output_attentions,
        return_all_hidden_states=output_hidden_states,
        # return_dict=return_dict,
    )

    last_hidden_state = encoder_outputs&#91;-1&#93;
    last_hidden_state = self.final_layer_norm(last_hidden_state)

    if self.eos_token_id == 2:
        # The `eos_token_id` was incorrect before PR #24773: Let&#x27;s keep what have been done here.
        # A CLIP model with such `eos_token_id` in the config can&#x27;t work correctly with extra new tokens added
        # ------------------------------------------------------------
        # text_embeds.shape = &#91;batch_size, sequence_length, transformer.width&#93;
        # take features from the eot embedding (eot_token is the highest number in each sequence)
        # casting to torch.int for onnx compatibility: argmax doesn&#x27;t support int64 inputs with opset 14
        pooled_output = last_hidden_state&#91;
            torch.arange(last_hidden_state.shape&#91;0&#93;, device=last_hidden_state.device),
            input_ids.to(dtype=torch.int, device=last_hidden_state.device).argmax(dim=-1),
        &#93;
    else:
        # The config gets updated `eos_token_id` from PR #24773 (so the use of exta new tokens is possible)
        pooled_output = last_hidden_state&#91;
            torch.arange(last_hidden_state.shape&#91;0&#93;, device=last_hidden_state.device),
            # We need to get the first position of `eos_token_id` value (`pad_token_ids` might equal to `eos_token_id`)
            # Note: we assume each sequence (along batch dim.) contains an  `eos_token_id` (e.g. prepared by the tokenizer)
            (input_ids.to(dtype=torch.int, device=last_hidden_state.device) == self.eos_token_id).int().argmax(
                dim=-1),
        &#93;

    return BaseEncoderOutput(
        last_hidden_state=last_hidden_state,
        pooler_output=pooled_output,
        hidden_states=encoder_outputs,
        # attentions=encoder_outputs.attentions,
    )</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPTextModel"><code>fastvideo.models.encoders.clip.CLIPTextModel</code></h2>
<pre class="doc-signature"><code>CLIPTextModel(config: CLIPTextConfig)</code></pre>


<details><summary>Source</summary><pre><code>class CLIPTextModel(TextEncoder):

    def __init__(
        self,
        config: CLIPTextConfig,
    ) -&gt; None:
        super().__init__(config)
        self.text_model = CLIPTextTransformer(config=config, quant_config=config.quant_config, prefix=config.prefix)

    def forward(
        self,
        input_ids: torch.Tensor | None,
        position_ids: torch.Tensor | None = None,
        attention_mask: torch.Tensor | None = None,
        inputs_embeds: torch.Tensor | None = None,
        output_hidden_states: bool | None = None,
        **kwargs,
    ) -&gt; BaseEncoderOutput:

        outputs: BaseEncoderOutput = self.text_model(
            input_ids=input_ids,
            attention_mask=attention_mask,
            position_ids=position_ids,
            output_hidden_states=output_hidden_states,
        )
        return outputs

    def load_weights(self, weights: Iterable&#91;tuple&#91;str, torch.Tensor&#93;&#93;) -&gt; set&#91;str&#93;:

        # Define mapping for stacked parameters
        stacked_params_mapping = &#91;
            # (param_name, shard_name, shard_id)
            (&quot;qkv_proj&quot;, &quot;q_proj&quot;, &quot;q&quot;),
            (&quot;qkv_proj&quot;, &quot;k_proj&quot;, &quot;k&quot;),
            (&quot;qkv_proj&quot;, &quot;v_proj&quot;, &quot;v&quot;),
        &#93;
        params_dict = dict(self.named_parameters())
        loaded_params: set&#91;str&#93; = set()

        weights = list(weights)
        # Some checkpoints (Kandinsky6&#x27;s, for one) save CLIP&#x27;s
        # inner CLIPTextTransformer&#x27;s own state_dict() directly, without the
        # `text_model.` prefix this class&#x27;s `self.text_model` wrapper puts on
        # every parameter -- unlike other checkpoints already loaded through
        # this class (e.g. Kandinsky5&#x27;s), whose keys already include it.
        # Detect and normalize once, up front, rather than guessing per key.
        needs_text_model_prefix = bool(weights) and not any(name.startswith(&quot;text_model.&quot;) for name, _ in weights)

        for name, loaded_weight in weights:
            if needs_text_model_prefix:
                name = f&quot;text_model.&#123;name&#125;&quot;
            # Handle q_proj, k_proj, v_proj -&gt; qkv_proj mapping
            for param_name, weight_name, shard_id in stacked_params_mapping:
                if weight_name in name:
                    # Replace the weight name with the parameter name
                    model_param_name = name.replace(weight_name, param_name)

                    if model_param_name in params_dict:
                        param = params_dict&#91;model_param_name&#93;
                        weight_loader = param.weight_loader
                        weight_loader(param, loaded_weight, shard_id)
                        loaded_params.add(model_param_name)
                    break
            else:
                # Use default weight loader for all other parameters
                if name in params_dict:
                    param = params_dict&#91;name&#93;
                    weight_loader = getattr(param, &quot;weight_loader&quot;, default_weight_loader)
                    weight_loader(param, loaded_weight)
                    loaded_params.add(name)

        return loaded_params</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPTextModel.forward"><code>fastvideo.models.encoders.clip.CLIPTextModel.forward</code></h3>
<pre class="doc-signature"><code>forward(input_ids: torch.Tensor | None, position_ids: torch.Tensor | None = None, attention_mask: torch.Tensor | None = None, inputs_embeds: torch.Tensor | None = None, output_hidden_states: bool | None = None, **kwargs) -&gt; BaseEncoderOutput</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    input_ids: torch.Tensor | None,
    position_ids: torch.Tensor | None = None,
    attention_mask: torch.Tensor | None = None,
    inputs_embeds: torch.Tensor | None = None,
    output_hidden_states: bool | None = None,
    **kwargs,
) -&gt; BaseEncoderOutput:

    outputs: BaseEncoderOutput = self.text_model(
        input_ids=input_ids,
        attention_mask=attention_mask,
        position_ids=position_ids,
        output_hidden_states=output_hidden_states,
    )
    return outputs</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPTextModel.load_weights"><code>fastvideo.models.encoders.clip.CLIPTextModel.load_weights</code></h3>
<pre class="doc-signature"><code>load_weights(weights: Iterable&#91;tuple&#91;str, torch.Tensor&#93;&#93;) -&gt; set&#91;str&#93;</code></pre>

<details><summary>Source</summary><pre><code>def load_weights(self, weights: Iterable&#91;tuple&#91;str, torch.Tensor&#93;&#93;) -&gt; set&#91;str&#93;:

    # Define mapping for stacked parameters
    stacked_params_mapping = &#91;
        # (param_name, shard_name, shard_id)
        (&quot;qkv_proj&quot;, &quot;q_proj&quot;, &quot;q&quot;),
        (&quot;qkv_proj&quot;, &quot;k_proj&quot;, &quot;k&quot;),
        (&quot;qkv_proj&quot;, &quot;v_proj&quot;, &quot;v&quot;),
    &#93;
    params_dict = dict(self.named_parameters())
    loaded_params: set&#91;str&#93; = set()

    weights = list(weights)
    # Some checkpoints (Kandinsky6&#x27;s, for one) save CLIP&#x27;s
    # inner CLIPTextTransformer&#x27;s own state_dict() directly, without the
    # `text_model.` prefix this class&#x27;s `self.text_model` wrapper puts on
    # every parameter -- unlike other checkpoints already loaded through
    # this class (e.g. Kandinsky5&#x27;s), whose keys already include it.
    # Detect and normalize once, up front, rather than guessing per key.
    needs_text_model_prefix = bool(weights) and not any(name.startswith(&quot;text_model.&quot;) for name, _ in weights)

    for name, loaded_weight in weights:
        if needs_text_model_prefix:
            name = f&quot;text_model.&#123;name&#125;&quot;
        # Handle q_proj, k_proj, v_proj -&gt; qkv_proj mapping
        for param_name, weight_name, shard_id in stacked_params_mapping:
            if weight_name in name:
                # Replace the weight name with the parameter name
                model_param_name = name.replace(weight_name, param_name)

                if model_param_name in params_dict:
                    param = params_dict&#91;model_param_name&#93;
                    weight_loader = param.weight_loader
                    weight_loader(param, loaded_weight, shard_id)
                    loaded_params.add(model_param_name)
                break
        else:
            # Use default weight loader for all other parameters
            if name in params_dict:
                param = params_dict&#91;name&#93;
                weight_loader = getattr(param, &quot;weight_loader&quot;, default_weight_loader)
                weight_loader(param, loaded_weight)
                loaded_params.add(name)

    return loaded_params</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPTextModelWithProjection"><code>fastvideo.models.encoders.clip.CLIPTextModelWithProjection</code></h2>
<pre class="doc-signature"><code>CLIPTextModelWithProjection(config: CLIPTextConfig)</code></pre>


<details><summary>Source</summary><pre><code>class CLIPTextModelWithProjection(CLIPTextModel):

    def __init__(self, config: CLIPTextConfig) -&gt; None:
        super().__init__(config)
        self.text_projection = nn.Linear(config.hidden_size, config.projection_dim, bias=False)

    def forward(
        self,
        input_ids: torch.Tensor | None,
        position_ids: torch.Tensor | None = None,
        attention_mask: torch.Tensor | None = None,
        inputs_embeds: torch.Tensor | None = None,
        output_hidden_states: bool | None = None,
        **kwargs,
    ) -&gt; BaseEncoderOutput:
        outputs = super().forward(
            input_ids=input_ids,
            position_ids=position_ids,
            attention_mask=attention_mask,
            inputs_embeds=inputs_embeds,
            output_hidden_states=output_hidden_states,
            **kwargs,
        )
        pooled = outputs.pooler_output
        if pooled is not None:
            pooled = self.text_projection(pooled)
        return BaseEncoderOutput(
            last_hidden_state=outputs.last_hidden_state,
            pooler_output=pooled,
            hidden_states=outputs.hidden_states,
            attentions=outputs.attentions,
            attention_mask=outputs.attention_mask,
        )</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPTextModelWithProjection.forward"><code>fastvideo.models.encoders.clip.CLIPTextModelWithProjection.forward</code></h3>
<pre class="doc-signature"><code>forward(input_ids: torch.Tensor | None, position_ids: torch.Tensor | None = None, attention_mask: torch.Tensor | None = None, inputs_embeds: torch.Tensor | None = None, output_hidden_states: bool | None = None, **kwargs) -&gt; BaseEncoderOutput</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    input_ids: torch.Tensor | None,
    position_ids: torch.Tensor | None = None,
    attention_mask: torch.Tensor | None = None,
    inputs_embeds: torch.Tensor | None = None,
    output_hidden_states: bool | None = None,
    **kwargs,
) -&gt; BaseEncoderOutput:
    outputs = super().forward(
        input_ids=input_ids,
        position_ids=position_ids,
        attention_mask=attention_mask,
        inputs_embeds=inputs_embeds,
        output_hidden_states=output_hidden_states,
        **kwargs,
    )
    pooled = outputs.pooler_output
    if pooled is not None:
        pooled = self.text_projection(pooled)
    return BaseEncoderOutput(
        last_hidden_state=outputs.last_hidden_state,
        pooler_output=pooled,
        hidden_states=outputs.hidden_states,
        attentions=outputs.attentions,
        attention_mask=outputs.attention_mask,
    )</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPVisionTransformer"><code>fastvideo.models.encoders.clip.CLIPVisionTransformer</code></h2>
<pre class="doc-signature"><code>CLIPVisionTransformer(config: CLIPVisionConfig, quant_config: QuantizationConfig | None = None, num_hidden_layers_override: int | None = None, require_post_norm: bool | None = None, prefix: str = &#x27;&#x27;)</code></pre>


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

    def __init__(
        self,
        config: CLIPVisionConfig,
        quant_config: QuantizationConfig | None = None,
        num_hidden_layers_override: int | None = None,
        require_post_norm: bool | None = None,
        prefix: str = &quot;&quot;,
    ) -&gt; None:
        super().__init__()

        self.config = config
        embed_dim = config.hidden_size

        self.embeddings = CLIPVisionEmbeddings(config)

        # NOTE: This typo of &quot;layrnorm&quot; is not fixed on purpose to match
        # the original transformers code and name of the model weights.
        self.pre_layrnorm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)

        self.encoder = CLIPEncoder(
            config=config,
            quant_config=quant_config,
            num_hidden_layers_override=num_hidden_layers_override,
            prefix=f&quot;&#123;prefix&#125;.encoder&quot;,
        )

        num_hidden_layers = config.num_hidden_layers
        if len(self.encoder.layers) &gt; config.num_hidden_layers:
            raise ValueError(f&quot;The original encoder only has &#123;num_hidden_layers&#125; &quot;
                             f&quot;layers, but you requested &#123;len(self.encoder.layers)&#125; layers.&quot;)

        # If possible, skip post_layernorm to conserve memory
        if require_post_norm is None:
            require_post_norm = len(self.encoder.layers) == num_hidden_layers

        if require_post_norm:
            self.post_layernorm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)
        else:
            self.post_layernorm = None

    def forward(
        self,
        pixel_values: torch.Tensor,
        feature_sample_layers: list&#91;int&#93; | None = None,
    ) -&gt; torch.Tensor:

        hidden_states = self.embeddings(pixel_values)
        hidden_states = self.pre_layrnorm(hidden_states)

        return_all_hidden_states = feature_sample_layers is not None

        # Produces either the last layer output or all of the hidden states,
        # depending on if we have feature_sample_layers or not
        encoder_outputs = self.encoder(inputs_embeds=hidden_states, return_all_hidden_states=return_all_hidden_states)

        if not return_all_hidden_states:
            encoder_outputs = encoder_outputs&#91;0&#93;

        # Handle post-norm (if applicable) and stacks feature layers if needed
        encoder_outputs = resolve_visual_encoder_outputs(encoder_outputs, feature_sample_layers, self.post_layernorm,
                                                         self.config.num_hidden_layers)

        return encoder_outputs</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPVisionTransformer.forward"><code>fastvideo.models.encoders.clip.CLIPVisionTransformer.forward</code></h3>
<pre class="doc-signature"><code>forward(pixel_values: torch.Tensor, feature_sample_layers: list&#91;int&#93; | None = None) -&gt; torch.Tensor</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    pixel_values: torch.Tensor,
    feature_sample_layers: list&#91;int&#93; | None = None,
) -&gt; torch.Tensor:

    hidden_states = self.embeddings(pixel_values)
    hidden_states = self.pre_layrnorm(hidden_states)

    return_all_hidden_states = feature_sample_layers is not None

    # Produces either the last layer output or all of the hidden states,
    # depending on if we have feature_sample_layers or not
    encoder_outputs = self.encoder(inputs_embeds=hidden_states, return_all_hidden_states=return_all_hidden_states)

    if not return_all_hidden_states:
        encoder_outputs = encoder_outputs&#91;0&#93;

    # Handle post-norm (if applicable) and stacks feature layers if needed
    encoder_outputs = resolve_visual_encoder_outputs(encoder_outputs, feature_sample_layers, self.post_layernorm,
                                                     self.config.num_hidden_layers)

    return encoder_outputs</code></pre></details>
<h2 id="fastvideo.models.encoders.clip.CLIPVisionModel"><code>fastvideo.models.encoders.clip.CLIPVisionModel</code></h2>
<pre class="doc-signature"><code>CLIPVisionModel(config: CLIPVisionConfig)</code></pre>


<details><summary>Source</summary><pre><code>class CLIPVisionModel(ImageEncoder):
    config_class = CLIPVisionConfig
    main_input_name = &quot;pixel_values&quot;
    packed_modules_mapping = &#123;&quot;qkv_proj&quot;: &#91;&quot;q_proj&quot;, &quot;k_proj&quot;, &quot;v_proj&quot;&#93;&#125;

    def __init__(self, config: CLIPVisionConfig) -&gt; None:
        super().__init__(config)
        self.vision_model = CLIPVisionTransformer(config=config,
                                                  quant_config=config.quant_config,
                                                  num_hidden_layers_override=config.num_hidden_layers_override,
                                                  require_post_norm=config.require_post_norm,
                                                  prefix=f&quot;&#123;config.prefix&#125;.vision_model&quot;)

    def forward(
        self,
        pixel_values: torch.Tensor,
        feature_sample_layers: list&#91;int&#93; | None = None,
        **kwargs,
    ) -&gt; BaseEncoderOutput:
        last_hidden_state = self.vision_model(pixel_values, feature_sample_layers)
        return BaseEncoderOutput(last_hidden_state=last_hidden_state)

    @property
    def device(self):
        return next(self.parameters()).device

    # (TODO) Add prefix argument for filtering out weights to be loaded
    #        ref: https://github.com/vllm-project/vllm/pull/7186#discussion_r1734163986
    def load_weights(self, weights: Iterable&#91;tuple&#91;str, torch.Tensor&#93;&#93;) -&gt; set&#91;str&#93;:

        params_dict = dict(self.named_parameters())
        loaded_params: set&#91;str&#93; = set()
        layer_count = len(self.vision_model.encoder.layers)

        for name, loaded_weight in weights:
            if name.startswith(&quot;visual_projection&quot;):
                continue
            # post_layernorm is not needed in CLIPVisionModel
            if (name.startswith(&quot;vision_model.post_layernorm&quot;) and self.vision_model.post_layernorm is None):
                continue

            # omit layers when num_hidden_layers_override is set
            if name.startswith(&quot;vision_model.encoder.layers&quot;):
                layer_idx = int(name.split(&quot;.&quot;)&#91;3&#93;)
                if layer_idx &gt;= layer_count:
                    continue

            for (param_name, weight_name, shard_id) in self.config.arch_config.stacked_params_mapping:
                if weight_name not in name:
                    continue
                name = name.replace(weight_name, param_name)

                param = params_dict&#91;name&#93;
                weight_loader = param.weight_loader
                weight_loader(param, loaded_weight, shard_id)
                break
            else:
                param = params_dict&#91;name&#93;
                weight_loader = getattr(param, &quot;weight_loader&quot;, default_weight_loader)
                weight_loader(param, loaded_weight)
            loaded_params.add(name)
        return loaded_params</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPVisionModel.forward"><code>fastvideo.models.encoders.clip.CLIPVisionModel.forward</code></h3>
<pre class="doc-signature"><code>forward(pixel_values: torch.Tensor, feature_sample_layers: list&#91;int&#93; | None = None, **kwargs) -&gt; BaseEncoderOutput</code></pre>

<details><summary>Source</summary><pre><code>def forward(
    self,
    pixel_values: torch.Tensor,
    feature_sample_layers: list&#91;int&#93; | None = None,
    **kwargs,
) -&gt; BaseEncoderOutput:
    last_hidden_state = self.vision_model(pixel_values, feature_sample_layers)
    return BaseEncoderOutput(last_hidden_state=last_hidden_state)</code></pre></details>
<h3 id="fastvideo.models.encoders.clip.CLIPVisionModel.load_weights"><code>fastvideo.models.encoders.clip.CLIPVisionModel.load_weights</code></h3>
<pre class="doc-signature"><code>load_weights(weights: Iterable&#91;tuple&#91;str, torch.Tensor&#93;&#93;) -&gt; set&#91;str&#93;</code></pre>

<details><summary>Source</summary><pre><code>def load_weights(self, weights: Iterable&#91;tuple&#91;str, torch.Tensor&#93;&#93;) -&gt; set&#91;str&#93;:

    params_dict = dict(self.named_parameters())
    loaded_params: set&#91;str&#93; = set()
    layer_count = len(self.vision_model.encoder.layers)

    for name, loaded_weight in weights:
        if name.startswith(&quot;visual_projection&quot;):
            continue
        # post_layernorm is not needed in CLIPVisionModel
        if (name.startswith(&quot;vision_model.post_layernorm&quot;) and self.vision_model.post_layernorm is None):
            continue

        # omit layers when num_hidden_layers_override is set
        if name.startswith(&quot;vision_model.encoder.layers&quot;):
            layer_idx = int(name.split(&quot;.&quot;)&#91;3&#93;)
            if layer_idx &gt;= layer_count:
                continue

        for (param_name, weight_name, shard_id) in self.config.arch_config.stacked_params_mapping:
            if weight_name not in name:
                continue
            name = name.replace(weight_name, param_name)

            param = params_dict&#91;name&#93;
            weight_loader = param.weight_loader
            weight_loader(param, loaded_weight, shard_id)
            break
        else:
            param = params_dict&#91;name&#93;
            weight_loader = getattr(param, &quot;weight_loader&quot;, default_weight_loader)
            weight_loader(param, loaded_weight)
        loaded_params.add(name)
    return loaded_params</code></pre></details>
</div>
