diff --git a/docs/source/en/internal/rope_utils.md b/docs/source/en/internal/rope_utils.md index 49e5efc3a4b7..797bd2bc8ea8 100644 --- a/docs/source/en/internal/rope_utils.md +++ b/docs/source/en/internal/rope_utils.md @@ -44,13 +44,13 @@ from transformers import LlamaConfig config = LlamaConfig() config.rope_parameters = { "rope_type": "default", # type of RoPE to use - "rope_theta": 10000.0 # base frequency parameter + # rope_theta is optional — omitting it uses the model’s default_theta (typically 10000.0) } # If we want to apply a scaled RoPE type, we need to pass extra parameters config.rope_parameters = { "rope_type": "linear", - "rope_theta": 10000.0, + "rope_theta": 10000.0, # can be omitted to fall back to default_theta "factor": 8.0 # scale factor for context extension } ``` diff --git a/src/transformers/cache_utils.py b/src/transformers/cache_utils.py index ac324ebb62b4..07bbe218afb5 100644 --- a/src/transformers/cache_utils.py +++ b/src/transformers/cache_utils.py @@ -1548,3 +1548,7 @@ def is_sliding(self): @property def is_compileable(self) -> bool: return self.self_attention_cache.is_compileable + + +# Deprecated alias: SlidingWindowCache was removed in transformers v5. StaticCache is the replacement. +SlidingWindowCache = StaticCache diff --git a/src/transformers/configuration_utils.py b/src/transformers/configuration_utils.py index 97d6b94b57aa..aa72112b831d 100755 --- a/src/transformers/configuration_utils.py +++ b/src/transformers/configuration_utils.py @@ -298,7 +298,10 @@ def __post_init__(self, **kwargs): def __init_subclass__(cls, *args, **kwargs): super().__init_subclass__(*args, **kwargs) cls_has_custom_init = "__init__" in cls.__dict__ - cls = dataclass(cls, repr=False) + # kw_only=True ensures fields without defaults in subclasses can follow + # parent fields that have defaults (Python dataclass ordering rule). + # Config fields are always passed as keyword arguments, so this is safe. + cls = dataclass(cls, repr=False, kw_only=True) if not cls_has_custom_init: # Wrap all subclasses to accept arbitrary kwargs for BC diff --git a/src/transformers/initialization.py b/src/transformers/initialization.py index 779ac3a87e5c..b0ebb053086b 100644 --- a/src/transformers/initialization.py +++ b/src/transformers/initialization.py @@ -300,3 +300,34 @@ def empty_func(*args, **kwargs): finally: # Set back the original PreTrainedModel.tie_weights = original_tie_weights + + +@contextmanager +def meta_device_safe_creation_ops(): + """ + During meta-device model initialisation, ``torch.linspace`` produces meta + tensors that have no data. Custom models loaded from the Hub (remote code) + often call ``.item()`` on these tensors to compute scalar hyperparameters + (e.g. stochastic-depth / drop-path schedules). Native transformers models + already pass ``device="cpu"`` explicitly for such calls (see e.g. + ``modeling_swin.py``, ``modeling_pvt_v2.py``), but remote-code models + written before v5 do not. + + This context manager patches ``torch.linspace`` to default to + ``device="cpu"`` when no explicit device is requested, matching the best + practice already used throughout transformers. Calls that supply an + explicit ``device`` argument (e.g. ``device=self.logits.device``) are left + untouched. ``torch.arange`` is intentionally NOT patched because it is + used in RoPE computations where the device must match model parameters. + """ + original_linspace = torch.linspace + + def _safe_linspace(*args, **kwargs): + kwargs.setdefault("device", "cpu") + return original_linspace(*args, **kwargs) + + torch.linspace = _safe_linspace + try: + yield + finally: + torch.linspace = original_linspace diff --git a/src/transformers/modeling_rope_utils.py b/src/transformers/modeling_rope_utils.py index 7a2bb8c8ea24..38798d2019f8 100644 --- a/src/transformers/modeling_rope_utils.py +++ b/src/transformers/modeling_rope_utils.py @@ -143,7 +143,7 @@ def _compute_linear_scaling_rope_parameters( The model configuration. This function assumes that the config will provide at least the following properties: - * rope_theta (`float`): The base wavelength from which the inverse frequencies will be derived. + * rope_theta (`float`, *optional*): The base wavelength from which the inverse frequencies will be derived. Defaults to `config.default_theta` if omitted. * hidden_size (`int`): The numerator when deriving a head_dim, if not provided directly. * num_attention_heads (`int`): The denominator when deriving a head_dim, if not provided directly. @@ -199,7 +199,7 @@ def _compute_proportional_rope_parameters( The model configuration. This function assumes that the config will provide at least the following properties: - * rope_theta (`float`): The base wavelength from which the inverse frequencies will be derived. + * rope_theta (`float`, *optional*): The base wavelength from which the inverse frequencies will be derived. Defaults to `config.default_theta` if omitted. * hidden_size (`int`): The numerator when deriving a head_dim, if not provided directly. * num_attention_heads (`int`): The denominator when deriving a head_dim, if not provided directly. @@ -268,7 +268,7 @@ def _compute_dynamic_ntk_parameters( The model configuration. This function assumes that the config will provide at least the following properties: - * rope_theta (`float`): The base wavelength from which the inverse frequencies will be derived. + * rope_theta (`float`, *optional*): The base wavelength from which the inverse frequencies will be derived. Defaults to `config.default_theta` if omitted. * hidden_size (`int`): The numerator when deriving a head_dim, if not provided directly. * num_attention_heads (`int`): The denominator when deriving a head_dim, if not provided directly. * max_position_embeddings (`int`): The default sequence length used to update the dynamic RoPE at @@ -339,7 +339,7 @@ def _compute_yarn_parameters( The model configuration. This function assumes that the config will provide at least the following properties: - * rope_theta (`float`): The base wavelength from which the inverse frequencies will be derived. + * rope_theta (`float`, *optional*): The base wavelength from which the inverse frequencies will be derived. Defaults to `config.default_theta` if omitted. * hidden_size (`int`): The numerator when deriving a head_dim, if not provided directly. * num_attention_heads (`int`): The denominator when deriving a head_dim, if not provided directly. * max_position_embeddings (`int`): The maximum length of the positional embeddings. @@ -474,7 +474,7 @@ def _compute_longrope_parameters( The model configuration. This function assumes that the config will provide at least the following properties: - * rope_theta (`float`): The base wavelength from which the inverse frequencies will be derived. + * rope_theta (`float`, *optional*): The base wavelength from which the inverse frequencies will be derived. Defaults to `config.default_theta` if omitted. * hidden_size (`int`): The numerator when deriving a head_dim, if not provided directly. * num_attention_heads (`int`): The denominator when deriving a head_dim, if not provided directly. * max_position_embeddings (`int`): The maximum length of the positional embeddings. @@ -561,7 +561,7 @@ def _compute_llama3_parameters( The model configuration. This function assumes that the config will provide at least the following properties: - * rope_theta (`float`): The base wavelength from which the inverse frequencies will be derived. + * rope_theta (`float`, *optional*): The base wavelength from which the inverse frequencies will be derived. Defaults to `config.default_theta` if omitted. * hidden_size (`int`): The numerator when deriving a head_dim, if not provided directly. * num_attention_heads (`int`): The denominator when deriving a head_dim, if not provided directly. * rope_parameters (`dict[str, float | int]`): The standard RoPE scaling parameters, from which the following @@ -642,8 +642,9 @@ def _compute_llama3_parameters( class RopeParameters(TypedDict): """ Args: - rope_theta (`float`): - The base period of the RoPE embeddings. + rope_theta (`float`, *optional*, defaults to `RotaryEmbeddingConfigMixin.default_theta`): + The base period of the RoPE embeddings. Optional in serialized configs — if omitted, + the model's `default_theta` (typically 10000.0) is used. rope_type (`str`, *optional*, defaults to "default"): The sub-variant of RoPE to use. Can be one of ['default', 'linear', 'dynamic', 'yarn', 'longrope', 'llama3'], with 'default' being the original RoPE implementation. @@ -680,7 +681,7 @@ class RopeParameters(TypedDict): Only used with 'llama3'. Scaling factor applied to high frequency components of the RoPE """ - rope_theta: float + rope_theta: float | None rope_type: str | None partial_rotary_factor: float | None factor: float | None @@ -801,34 +802,44 @@ def validate_rope(self: "PreTrainedConfig"): ) def _validate_default_rope_parameters(self, rope_parameters: dict, ignore_keys: set | None = None): - required_keys = {"rope_type", "rope_theta"} + required_keys = {"rope_type"} + optional_keys = {"rope_theta"} received_keys = set(rope_parameters.keys()) rope_type = rope_parameters["rope_type"] - self._check_received_keys(rope_type, received_keys, required_keys, ignore_keys=ignore_keys) + self._check_received_keys( + rope_type, received_keys, required_keys, optional_keys=optional_keys, ignore_keys=ignore_keys + ) def _validate_linear_rope_parameters(self, rope_parameters: dict, ignore_keys: set | None = None): - required_keys = {"rope_type", "factor", "rope_theta"} + required_keys = {"rope_type", "factor"} + optional_keys = {"rope_theta"} received_keys = set(rope_parameters.keys()) rope_type = rope_parameters["rope_type"] - self._check_received_keys(rope_type, received_keys, required_keys, ignore_keys=ignore_keys) + self._check_received_keys( + rope_type, received_keys, required_keys, optional_keys=optional_keys, ignore_keys=ignore_keys + ) factor = rope_parameters["factor"] if factor is None or not isinstance(factor, float) or factor < 1.0: logger.warning(f"`rope_parameters`'s factor field must be a float >= 1, got {factor}") def _validate_dynamic_rope_parameters(self, rope_parameters: dict, ignore_keys: set | None = None): - required_keys = {"rope_type", "factor", "rope_theta"} + required_keys = {"rope_type", "factor"} + optional_keys = {"rope_theta"} received_keys = set(rope_parameters.keys()) rope_type = rope_parameters["rope_type"] - self._check_received_keys(rope_type, received_keys, required_keys, ignore_keys=ignore_keys) + self._check_received_keys( + rope_type, received_keys, required_keys, optional_keys=optional_keys, ignore_keys=ignore_keys + ) factor = rope_parameters["factor"] if factor is None or not isinstance(factor, float) or factor < 1.0: logger.warning(f"`rope_parameters`'s factor field must be a float >= 1, got {factor}") def _validate_yarn_rope_parameters(self, rope_parameters: dict, ignore_keys: set | None = None): - required_keys = {"rope_type", "factor", "rope_theta", "original_max_position_embeddings"} + required_keys = {"rope_type", "factor", "original_max_position_embeddings"} optional_keys = { + "rope_theta", "attention_factor", "beta_fast", "beta_slow", @@ -878,8 +889,8 @@ def _validate_yarn_rope_parameters(self, rope_parameters: dict, ignore_keys: set ) def _validate_longrope_rope_parameters(self, rope_parameters: dict, ignore_keys: set | None = None): - required_keys = {"rope_type", "short_factor", "long_factor", "rope_theta", "original_max_position_embeddings"} - optional_keys = {"attention_factor", "factor"} + required_keys = {"rope_type", "short_factor", "long_factor", "original_max_position_embeddings"} + optional_keys = {"rope_theta", "attention_factor", "factor"} received_keys = set(rope_parameters.keys()) rope_type = rope_parameters["rope_type"] self._check_received_keys(rope_type, received_keys, required_keys, optional_keys, ignore_keys=ignore_keys) diff --git a/src/transformers/modeling_utils.py b/src/transformers/modeling_utils.py index f72b230d9a20..27fcc3eaae1b 100644 --- a/src/transformers/modeling_utils.py +++ b/src/transformers/modeling_utils.py @@ -3618,7 +3618,10 @@ def get_init_context( elif is_quantized: init_contexts.extend([torch.device("meta"), set_quantized_state()]) else: - init_contexts.append(torch.device("meta")) + # meta_device_safe_creation_ops patches torch.linspace to default to CPU + # so that custom models calling .item() during __init__ (e.g. drop-path + # schedules) don't crash on meta tensors. + init_contexts.extend([torch.device("meta"), init.meta_device_safe_creation_ops()]) return init_contexts @@ -4612,7 +4615,7 @@ def mark_tied_weights_as_initialized(self, loading_info): later as they will be tied (overwritten) anyway. This is very important as most embeddings are tied, and they are huge params (vocabularies are often 256k), so running inits on them is very costly.""" - for tied_param in self.all_tied_weights_keys.keys(): + for tied_param in getattr(self, "all_tied_weights_keys", {}).keys(): param = self.get_parameter(tied_param) param._is_hf_initialized = True diff --git a/src/transformers/models/aimv2/modeling_aimv2.py b/src/transformers/models/aimv2/modeling_aimv2.py index 04bec1abe0e6..6a3f18b05e60 100644 --- a/src/transformers/models/aimv2/modeling_aimv2.py +++ b/src/transformers/models/aimv2/modeling_aimv2.py @@ -258,15 +258,12 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -283,7 +280,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/altclip/modeling_altclip.py b/src/transformers/models/altclip/modeling_altclip.py index 5454d012a5a6..cf1667d17ad0 100755 --- a/src/transformers/models/altclip/modeling_altclip.py +++ b/src/transformers/models/altclip/modeling_altclip.py @@ -455,15 +455,16 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) queries = self.q_proj(hidden_states) keys = self.k_proj(hidden_states) values = self.v_proj(hidden_states) - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + queries = queries.view(hidden_shape).transpose(1, 2) + keys = keys.view(hidden_shape).transpose(1, 2) + values = values.view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -480,7 +481,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/audioflamingo3/modeling_audioflamingo3.py b/src/transformers/models/audioflamingo3/modeling_audioflamingo3.py index 70ce6893469b..1fbbc733c308 100644 --- a/src/transformers/models/audioflamingo3/modeling_audioflamingo3.py +++ b/src/transformers/models/audioflamingo3/modeling_audioflamingo3.py @@ -130,18 +130,15 @@ def forward( # for the decoder is_cross_attention = key_value_states is not None - # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) # Scaling is susceptible to floating point arithmetics' inprecisions # which can lead to different results (this is dependent from model # to model, e.g. audioflamingo3 is one such case). We therefore keep the # original order of scaling to follow the original implementation # and enforce no scaling (1.0) in the attention call below. - query_states = self.q_proj(hidden_states) * self.scaling - query_states = query_states.view(*q_input_shape) - query_states = query_states.transpose(1, 2).contiguous() + query_states = (self.q_proj(hidden_states) * self.scaling).view(hidden_shape).transpose(1, 2).contiguous() # Check is encoder-decoder model is being used. Otherwise we'll get `DynamicCache` if past_key_values is not None and isinstance(past_key_values, EncoderDecoderCache): @@ -160,10 +157,12 @@ def forward( key_states = past_key_values.layers[self.layer_idx].keys value_states = past_key_values.layers[self.layer_idx].values else: - key_states = self.k_proj(current_states).view(bsz, -1, self.num_heads, self.head_dim) - value_states = self.v_proj(current_states).view(bsz, -1, self.num_heads, self.head_dim) - key_states = key_states.transpose(1, 2).contiguous() - value_states = value_states.transpose(1, 2).contiguous() + # Use the query's batch dimension for kv view so that a different-batch + # encoder output (e.g. in tests) gets absorbed into the sequence axis, + # preserving backward-compatible behaviour. + kv_shape = (input_shape[0], -1, self.num_heads, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2).contiguous() + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2).contiguous() if past_key_values is not None: key_states, value_states = past_key_values.update(key_states, value_states, self.layer_idx) @@ -183,7 +182,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/bart/modeling_bart.py b/src/transformers/models/bart/modeling_bart.py index d5f3e73b1e4b..74119889c527 100755 --- a/src/transformers/models/bart/modeling_bart.py +++ b/src/transformers/models/bart/modeling_bart.py @@ -199,14 +199,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -228,8 +226,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -252,7 +251,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/beit/modeling_beit.py b/src/transformers/models/beit/modeling_beit.py index 0a169bf55a1d..d68efdd8738d 100755 --- a/src/transformers/models/beit/modeling_beit.py +++ b/src/transformers/models/beit/modeling_beit.py @@ -254,22 +254,11 @@ def forward( interpolate_pos_encoding: bool = False, resolution: tuple[int] | None = None, ) -> tuple[torch.Tensor] | tuple[torch.Tensor, torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) @@ -320,22 +309,11 @@ def forward( f"{self.__class__.__name__} does not support `output_attentions=True`. The returned attention weights will " "be `None`. If you want to get attention weights, please set `attn_implementation='eager'` when loading the model." ) - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) attn_bias = None if self.has_relative_position_bias: diff --git a/src/transformers/models/bert/modeling_bert.py b/src/transformers/models/bert/modeling_bert.py index cc4adf29ebac..2692076b895f 100755 --- a/src/transformers/models/bert/modeling_bert.py +++ b/src/transformers/models/bert/modeling_bert.py @@ -240,14 +240,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -255,8 +253,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -280,7 +279,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/bert_generation/modeling_bert_generation.py b/src/transformers/models/bert_generation/modeling_bert_generation.py index f93227718f92..04f39cd63d5d 100755 --- a/src/transformers/models/bert_generation/modeling_bert_generation.py +++ b/src/transformers/models/bert_generation/modeling_bert_generation.py @@ -187,14 +187,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -202,8 +200,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -227,7 +226,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/big_bird/modeling_big_bird.py b/src/transformers/models/big_bird/modeling_big_bird.py index 09e9a24d3846..dbca90bbdf20 100755 --- a/src/transformers/models/big_bird/modeling_big_bird.py +++ b/src/transformers/models/big_bird/modeling_big_bird.py @@ -162,12 +162,9 @@ def forward( past_key_values=None, **kwargs: Unpack[TransformersKwargs], ): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_cross_attention = encoder_hidden_states is not None current_states = encoder_hidden_states if is_cross_attention else hidden_states @@ -177,16 +174,9 @@ def forward( key_layer = past_key_values.layers[self.layer_idx].keys value_layer = past_key_values.layers[self.layer_idx].values else: - key_layer = ( - self.key(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + kv_shape = (*current_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(current_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_layer to cache to be re-used for fast auto-regressive generation diff --git a/src/transformers/models/bigbird_pegasus/modeling_bigbird_pegasus.py b/src/transformers/models/bigbird_pegasus/modeling_bigbird_pegasus.py index a0259aa0939a..30538b86ebf3 100755 --- a/src/transformers/models/bigbird_pegasus/modeling_bigbird_pegasus.py +++ b/src/transformers/models/bigbird_pegasus/modeling_bigbird_pegasus.py @@ -139,12 +139,9 @@ def forward( past_key_values=None, **kwargs: Unpack[TransformersKwargs], ): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_cross_attention = encoder_hidden_states is not None current_states = encoder_hidden_states if is_cross_attention else hidden_states @@ -154,16 +151,9 @@ def forward( key_layer = past_key_values.layers[self.layer_idx].keys value_layer = past_key_values.layers[self.layer_idx].values else: - key_layer = ( - self.key(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + kv_shape = (*current_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(current_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_layer to cache to be re-used for fast auto-regressive generation @@ -1243,14 +1233,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -1272,8 +1260,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -1296,7 +1285,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/biogpt/modeling_biogpt.py b/src/transformers/models/biogpt/modeling_biogpt.py index e1a7e2e3fdaf..8cf57e649c7a 100755 --- a/src/transformers/models/biogpt/modeling_biogpt.py +++ b/src/transformers/models/biogpt/modeling_biogpt.py @@ -176,14 +176,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -205,8 +203,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -229,7 +228,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/blenderbot/modeling_blenderbot.py b/src/transformers/models/blenderbot/modeling_blenderbot.py index 99d5cb792234..3381ffb9226c 100755 --- a/src/transformers/models/blenderbot/modeling_blenderbot.py +++ b/src/transformers/models/blenderbot/modeling_blenderbot.py @@ -185,14 +185,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -214,8 +212,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -238,7 +237,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/blenderbot_small/modeling_blenderbot_small.py b/src/transformers/models/blenderbot_small/modeling_blenderbot_small.py index 89932e6f282c..0a0a62eaeaa5 100755 --- a/src/transformers/models/blenderbot_small/modeling_blenderbot_small.py +++ b/src/transformers/models/blenderbot_small/modeling_blenderbot_small.py @@ -172,14 +172,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -201,8 +199,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -225,7 +224,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/blip/modeling_blip_text.py b/src/transformers/models/blip/modeling_blip_text.py index 68f9e497f27a..a62a120f8741 100644 --- a/src/transformers/models/blip/modeling_blip_text.py +++ b/src/transformers/models/blip/modeling_blip_text.py @@ -137,12 +137,9 @@ def forward( past_key_values: Cache | None = None, **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor, torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) # If this is instantiated as a cross-attention module, the keys # and values come from an encoder; the attention mask needs to be @@ -168,16 +165,9 @@ def forward( key_layer = curr_past_key_values.layers[self.layer_idx].keys value_layer = curr_past_key_values.layers[self.layer_idx].values else: - key_layer = ( - self.key(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + kv_shape = (*current_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(current_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: key_layer, value_layer = curr_past_key_values.update(key_layer, value_layer, self.layer_idx) diff --git a/src/transformers/models/bridgetower/modeling_bridgetower.py b/src/transformers/models/bridgetower/modeling_bridgetower.py index 81bbf8797129..225289d8367e 100644 --- a/src/transformers/models/bridgetower/modeling_bridgetower.py +++ b/src/transformers/models/bridgetower/modeling_bridgetower.py @@ -533,14 +533,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -548,8 +546,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -573,7 +572,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/camembert/modeling_camembert.py b/src/transformers/models/camembert/modeling_camembert.py index 0c8a76fc7c6c..9d10a8aeaef1 100644 --- a/src/transformers/models/camembert/modeling_camembert.py +++ b/src/transformers/models/camembert/modeling_camembert.py @@ -287,14 +287,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -302,8 +300,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -327,7 +326,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/clip/modeling_clip.py b/src/transformers/models/clip/modeling_clip.py index 923c650d2158..cbb8e8e39fe7 100644 --- a/src/transformers/models/clip/modeling_clip.py +++ b/src/transformers/models/clip/modeling_clip.py @@ -305,15 +305,16 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) queries = self.q_proj(hidden_states) keys = self.k_proj(hidden_states) values = self.v_proj(hidden_states) - queries = queries.view(batch_size, seq_length, -1, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, -1, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, -1, self.head_dim).transpose(1, 2) + queries = queries.view(hidden_shape).transpose(1, 2) + keys = keys.view(hidden_shape).transpose(1, 2) + values = values.view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -330,7 +331,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/clipseg/modeling_clipseg.py b/src/transformers/models/clipseg/modeling_clipseg.py index ffee94dd5b95..d79c3537cb32 100644 --- a/src/transformers/models/clipseg/modeling_clipseg.py +++ b/src/transformers/models/clipseg/modeling_clipseg.py @@ -306,15 +306,16 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) queries = self.q_proj(hidden_states) keys = self.k_proj(hidden_states) values = self.v_proj(hidden_states) - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + queries = queries.view(hidden_shape).transpose(1, 2) + keys = keys.view(hidden_shape).transpose(1, 2) + values = values.view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -331,7 +332,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/convbert/modeling_convbert.py b/src/transformers/models/convbert/modeling_convbert.py index 5d0172654c14..237f41091b92 100755 --- a/src/transformers/models/convbert/modeling_convbert.py +++ b/src/transformers/models/convbert/modeling_convbert.py @@ -179,7 +179,8 @@ def forward( encoder_hidden_states: torch.Tensor | None = None, **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor, torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) # If this is instantiated as a cross-attention module, the keys # and values come from an encoder; the attention mask needs to be # such that the encoder's padding tokens are not attended to. @@ -194,15 +195,11 @@ def forward( mixed_key_conv_attn_layer = mixed_key_conv_attn_layer.transpose(1, 2) mixed_query_layer = self.query(hidden_states) - query_layer = mixed_query_layer.view( - batch_size, -1, self.num_attention_heads, self.attention_head_size - ).transpose(1, 2) - key_layer = mixed_key_layer.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose( - 1, 2 - ) - value_layer = mixed_value_layer.view( - batch_size, -1, self.num_attention_heads, self.attention_head_size - ).transpose(1, 2) + query_layer = mixed_query_layer.view(hidden_shape).transpose(1, 2) + + key_layer = mixed_key_layer.view(hidden_shape).transpose(1, 2) + value_layer = mixed_value_layer.view(hidden_shape).transpose(1, 2) + conv_attn_layer = torch.multiply(mixed_key_conv_attn_layer, mixed_query_layer) conv_kernel_layer = self.conv_kernel_layer(conv_attn_layer) @@ -210,7 +207,7 @@ def forward( conv_kernel_layer = torch.softmax(conv_kernel_layer, dim=1) conv_out_layer = self.conv_out_layer(hidden_states) - conv_out_layer = torch.reshape(conv_out_layer, [batch_size, -1, self.all_head_size]) + conv_out_layer = torch.reshape(conv_out_layer, [input_shape[0], -1, self.all_head_size]) conv_out_layer = conv_out_layer.transpose(1, 2).contiguous().unsqueeze(-1) conv_out_layer = nn.functional.unfold( conv_out_layer, @@ -220,7 +217,7 @@ def forward( stride=1, ) conv_out_layer = conv_out_layer.transpose(1, 2).reshape( - batch_size, -1, self.all_head_size, self.conv_kernel_size + input_shape[0], -1, self.all_head_size, self.conv_kernel_size ) conv_out_layer = torch.reshape(conv_out_layer, [-1, self.attention_head_size, self.conv_kernel_size]) conv_out_layer = torch.matmul(conv_out_layer, conv_kernel_layer) @@ -243,7 +240,9 @@ def forward( context_layer = torch.matmul(attention_probs, value_layer) context_layer = context_layer.permute(0, 2, 1, 3).contiguous() - conv_out = torch.reshape(conv_out_layer, [batch_size, -1, self.num_attention_heads, self.attention_head_size]) + conv_out = torch.reshape( + conv_out_layer, [input_shape[0], -1, self.num_attention_heads, self.attention_head_size] + ) context_layer = torch.cat([context_layer, conv_out], 2) # conv and context diff --git a/src/transformers/models/data2vec/modeling_data2vec_audio.py b/src/transformers/models/data2vec/modeling_data2vec_audio.py index 180a75757f56..bb3af4ecf25a 100755 --- a/src/transformers/models/data2vec/modeling_data2vec_audio.py +++ b/src/transformers/models/data2vec/modeling_data2vec_audio.py @@ -251,18 +251,17 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) current_states = key_value_states if is_cross_attention else hidden_states - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -280,7 +279,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights, None diff --git a/src/transformers/models/data2vec/modeling_data2vec_text.py b/src/transformers/models/data2vec/modeling_data2vec_text.py index afa40ef82222..512431cb3b0a 100644 --- a/src/transformers/models/data2vec/modeling_data2vec_text.py +++ b/src/transformers/models/data2vec/modeling_data2vec_text.py @@ -286,14 +286,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -301,8 +299,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -326,7 +325,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/data2vec/modeling_data2vec_vision.py b/src/transformers/models/data2vec/modeling_data2vec_vision.py index 8cac4be4da14..224ef22e3ff0 100644 --- a/src/transformers/models/data2vec/modeling_data2vec_vision.py +++ b/src/transformers/models/data2vec/modeling_data2vec_vision.py @@ -255,22 +255,11 @@ def forward( interpolate_pos_encoding: bool = False, resolution: tuple[int] | None = None, ) -> tuple[torch.Tensor] | tuple[torch.Tensor, torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) @@ -322,22 +311,11 @@ def forward( f"{self.__class__.__name__} does not support `output_attentions=True`. The returned attention weights will " "be `None`. If you want to get attention weights, please set `attn_implementation='eager'` when loading the model." ) - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) attn_bias = None if self.has_relative_position_bias: diff --git a/src/transformers/models/dinat/modeling_dinat.py b/src/transformers/models/dinat/modeling_dinat.py index 783231ff0192..de71c29a4b65 100644 --- a/src/transformers/models/dinat/modeling_dinat.py +++ b/src/transformers/models/dinat/modeling_dinat.py @@ -266,22 +266,11 @@ def forward( hidden_states: torch.Tensor, output_attentions: bool | None = False, ) -> tuple[torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) # Apply the scale factor before computing attention weights. It's usually more efficient because # attention weights are typically a bigger tensor compared to query. diff --git a/src/transformers/models/electra/modeling_electra.py b/src/transformers/models/electra/modeling_electra.py index c69ad30c8746..c428ff0a2aeb 100644 --- a/src/transformers/models/electra/modeling_electra.py +++ b/src/transformers/models/electra/modeling_electra.py @@ -248,14 +248,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -263,8 +261,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -288,7 +287,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/emu3/modeling_emu3.py b/src/transformers/models/emu3/modeling_emu3.py index 20dd16f9ffb1..2481decd7aeb 100644 --- a/src/transformers/models/emu3/modeling_emu3.py +++ b/src/transformers/models/emu3/modeling_emu3.py @@ -585,15 +585,12 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape - - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) + input_shape = hidden_states.shape[:-1] - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -610,7 +607,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/eomt/modeling_eomt.py b/src/transformers/models/eomt/modeling_eomt.py index a1767132f47c..589b023d4db8 100644 --- a/src/transformers/models/eomt/modeling_eomt.py +++ b/src/transformers/models/eomt/modeling_eomt.py @@ -765,15 +765,12 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -790,7 +787,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/ernie/modeling_ernie.py b/src/transformers/models/ernie/modeling_ernie.py index 6939fdf4f818..fb299b2f00a1 100644 --- a/src/transformers/models/ernie/modeling_ernie.py +++ b/src/transformers/models/ernie/modeling_ernie.py @@ -259,14 +259,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -274,8 +272,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -299,7 +298,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/esm/modeling_esm.py b/src/transformers/models/esm/modeling_esm.py index b8cc033c8213..e465e1a94855 100755 --- a/src/transformers/models/esm/modeling_esm.py +++ b/src/transformers/models/esm/modeling_esm.py @@ -323,8 +323,8 @@ def forward( encoder_attention_mask: torch.FloatTensor | None = None, **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: - batch_size, seq_length = hidden_states.shape[:-1] - hidden_shape = (batch_size, seq_length, -1, self.attention_head_size) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) @@ -358,7 +358,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/evolla/modeling_evolla.py b/src/transformers/models/evolla/modeling_evolla.py index 50569732061d..23fb4cd00754 100644 --- a/src/transformers/models/evolla/modeling_evolla.py +++ b/src/transformers/models/evolla/modeling_evolla.py @@ -288,8 +288,8 @@ def forward( encoder_attention_mask: torch.FloatTensor | None = None, **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: - batch_size, seq_length = hidden_states.shape[:-1] - hidden_shape = (batch_size, seq_length, -1, self.attention_head_size) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) @@ -323,7 +323,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/flava/modeling_flava.py b/src/transformers/models/flava/modeling_flava.py index 49e3b0f3f73c..4e21020026a7 100644 --- a/src/transformers/models/flava/modeling_flava.py +++ b/src/transformers/models/flava/modeling_flava.py @@ -445,22 +445,11 @@ def forward( attention_mask: torch.Tensor | None = None, output_attentions: bool = False, ) -> tuple[torch.Tensor, torch.Tensor] | tuple[torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) diff --git a/src/transformers/models/git/modeling_git.py b/src/transformers/models/git/modeling_git.py index 507aa4f0ad31..fc3f552ee732 100644 --- a/src/transformers/models/git/modeling_git.py +++ b/src/transformers/models/git/modeling_git.py @@ -235,23 +235,12 @@ def forward( past_key_values: Cache | None = None, **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: - batch_size = hidden_states.shape[0] - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) if past_key_values is not None: key_layer, value_layer = past_key_values.update(key_layer, value_layer, self.layer_idx) @@ -600,16 +589,11 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - - batch_size, seq_length, embed_dim = hidden_states.shape - - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -627,7 +611,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/glpn/modeling_glpn.py b/src/transformers/models/glpn/modeling_glpn.py index 2150c98d7e4c..213381aa271f 100755 --- a/src/transformers/models/glpn/modeling_glpn.py +++ b/src/transformers/models/glpn/modeling_glpn.py @@ -124,12 +124,9 @@ def forward( width, output_attentions=False, ): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) if self.sr_ratio > 1: batch_size, seq_len, num_channels = hidden_states.shape @@ -141,16 +138,9 @@ def forward( hidden_states = hidden_states.reshape(batch_size, num_channels, -1).permute(0, 2, 1) hidden_states = self.layer_norm(hidden_states) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + kv_shape = (*hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(kv_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) diff --git a/src/transformers/models/hubert/modeling_hubert.py b/src/transformers/models/hubert/modeling_hubert.py index c7cc5917702c..e3934ba80f68 100755 --- a/src/transformers/models/hubert/modeling_hubert.py +++ b/src/transformers/models/hubert/modeling_hubert.py @@ -310,18 +310,17 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) current_states = key_value_states if is_cross_attention else hidden_states - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -339,7 +338,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights, None diff --git a/src/transformers/models/ibert/modeling_ibert.py b/src/transformers/models/ibert/modeling_ibert.py index 58c0dd37d3c1..83a77a295681 100644 --- a/src/transformers/models/ibert/modeling_ibert.py +++ b/src/transformers/models/ibert/modeling_ibert.py @@ -238,14 +238,11 @@ def forward( ) # Transpose - batch_size, seq_length, _ = hidden_states.shape - query_layer = query_layer.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose( - 1, 2 - ) - key_layer = key_layer.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose(1, 2) - value_layer = value_layer.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose( - 1, 2 - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = query_layer.view(hidden_shape).transpose(1, 2) + key_layer = key_layer.view(hidden_shape).transpose(1, 2) + value_layer = value_layer.view(hidden_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) diff --git a/src/transformers/models/idefics/vision.py b/src/transformers/models/idefics/vision.py index dbd22df3d7c2..8e110851237a 100644 --- a/src/transformers/models/idefics/vision.py +++ b/src/transformers/models/idefics/vision.py @@ -220,15 +220,16 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) queries = self.q_proj(hidden_states) keys = self.k_proj(hidden_states) values = self.v_proj(hidden_states) - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + queries = queries.view(hidden_shape).transpose(1, 2) + keys = keys.view(hidden_shape).transpose(1, 2) + values = values.view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -246,7 +247,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/idefics2/modeling_idefics2.py b/src/transformers/models/idefics2/modeling_idefics2.py index 0fead94e2dfd..5d81439e27b6 100644 --- a/src/transformers/models/idefics2/modeling_idefics2.py +++ b/src/transformers/models/idefics2/modeling_idefics2.py @@ -240,15 +240,12 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -265,7 +262,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/idefics3/modeling_idefics3.py b/src/transformers/models/idefics3/modeling_idefics3.py index a5d2b381c831..2c58aba032cd 100644 --- a/src/transformers/models/idefics3/modeling_idefics3.py +++ b/src/transformers/models/idefics3/modeling_idefics3.py @@ -235,16 +235,11 @@ def forward( **kwargs, ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - - batch_size, seq_length, embed_dim = hidden_states.shape - - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -261,7 +256,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/informer/modeling_informer.py b/src/transformers/models/informer/modeling_informer.py index e458516d47bb..17ab730741d8 100644 --- a/src/transformers/models/informer/modeling_informer.py +++ b/src/transformers/models/informer/modeling_informer.py @@ -344,14 +344,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -373,8 +371,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -397,7 +396,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/kosmos2/modeling_kosmos2.py b/src/transformers/models/kosmos2/modeling_kosmos2.py index 399740c8935c..dea411a0602c 100644 --- a/src/transformers/models/kosmos2/modeling_kosmos2.py +++ b/src/transformers/models/kosmos2/modeling_kosmos2.py @@ -386,15 +386,16 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) queries = self.q_proj(hidden_states) keys = self.k_proj(hidden_states) values = self.v_proj(hidden_states) - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + queries = queries.view(hidden_shape).transpose(1, 2) + keys = keys.view(hidden_shape).transpose(1, 2) + values = values.view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -412,7 +413,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights @@ -728,10 +729,11 @@ def forward( # if key_value_states are provided this layer is used as a cross-attention layer # for the decoder is_cross_attention = encoder_hidden_states is not None - batch_size, seq_length = hidden_states.shape[:2] + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) query_states = self.q_proj(hidden_states) - query_states = query_states.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + query_states = query_states.view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -751,10 +753,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - key_states = self.k_proj(current_states) - value_states = self.v_proj(current_states) - key_states = key_states.view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) - value_states = value_states.view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_states to cache to be re-used for fast auto-regressive generation @@ -778,7 +779,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() if self.inner_attn_ln is not None: attn_output = self.inner_attn_ln(attn_output) diff --git a/src/transformers/models/longt5/modeling_longt5.py b/src/transformers/models/longt5/modeling_longt5.py index 16a90e89cc77..fed8277b1d0b 100644 --- a/src/transformers/models/longt5/modeling_longt5.py +++ b/src/transformers/models/longt5/modeling_longt5.py @@ -425,7 +425,8 @@ def forward( """ # Input is (batch_size, seq_length, dim) # Mask is (batch_size, 1, 1, key_length) (non-causal encoder) or (batch_size, 1, seq_length, key_length) (causal decoder) - batch_size, seq_length = hidden_states.shape[:2] + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.key_value_proj_dim) past_seen_tokens = past_key_values.get_seq_length(self.layer_idx) if past_key_values is not None else 0 # We clone here for StaticCache, as we get the value before updating it, but use it after and it's the same ref past_seen_tokens = past_seen_tokens.clone() if isinstance(past_seen_tokens, torch.Tensor) else past_seen_tokens @@ -433,8 +434,7 @@ def forward( # if key_value_states are provided this layer is used as a cross-attention layer for the decoder is_cross_attention = key_value_states is not None - q_input_shape = (batch_size, seq_length, -1, self.key_value_proj_dim) - query_states = self.q(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q(hidden_states).view(hidden_shape).transpose(1, 2) # Check is encoder-decoder model is being used. Otherwise we'll get `DynamicCache` is_updated = False @@ -454,9 +454,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - kv_input_shape = (batch_size, current_states.shape[1], -1, self.key_value_proj_dim) - key_states = self.k(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.key_value_proj_dim) + key_states = self.k(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -471,13 +471,13 @@ def forward( key_length = key_states.shape[-2] if not self.has_relative_attention_bias: position_bias = torch.zeros( - (1, query_states.shape[1], seq_length, key_length), device=scores.device, dtype=scores.dtype + (1, query_states.shape[1], input_shape[1], key_length), device=scores.device, dtype=scores.dtype ) if self.gradient_checkpointing and self.training: position_bias.requires_grad = True else: position_bias = self.compute_bias( - seq_length, key_length, device=scores.device, past_seen_tokens=past_seen_tokens + input_shape[1], key_length, device=scores.device, past_seen_tokens=past_seen_tokens ) if mask is not None: @@ -494,7 +494,7 @@ def forward( attn_output = torch.matmul(attn_weights, value_states) attn_output = attn_output.transpose(1, 2).contiguous() - attn_output = attn_output.view(batch_size, seq_length, -1) + attn_output = attn_output.reshape(*input_shape, -1) attn_output = self.o(attn_output) outputs = (attn_output, position_bias) diff --git a/src/transformers/models/lxmert/modeling_lxmert.py b/src/transformers/models/lxmert/modeling_lxmert.py index 425d47978f0d..908c9761dd60 100644 --- a/src/transformers/models/lxmert/modeling_lxmert.py +++ b/src/transformers/models/lxmert/modeling_lxmert.py @@ -236,20 +236,12 @@ def __init__(self, config, ctx_dim=None): self.dropout = nn.Dropout(config.attention_probs_dropout_prob) def forward(self, hidden_states, context, attention_mask=None, output_attentions=False): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(context).view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose(1, 2) - ) - value_layer = ( - self.value(context) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + kv_shape = (*context.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(context).view(kv_shape).transpose(1, 2) + value_layer = self.value(context).view(kv_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) diff --git a/src/transformers/models/m2m_100/modeling_m2m_100.py b/src/transformers/models/m2m_100/modeling_m2m_100.py index ce46ecec392b..8985687435bc 100755 --- a/src/transformers/models/m2m_100/modeling_m2m_100.py +++ b/src/transformers/models/m2m_100/modeling_m2m_100.py @@ -268,14 +268,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -297,8 +295,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -321,7 +320,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/marian/modeling_marian.py b/src/transformers/models/marian/modeling_marian.py index 2df657becfa9..a4070ee00642 100755 --- a/src/transformers/models/marian/modeling_marian.py +++ b/src/transformers/models/marian/modeling_marian.py @@ -192,14 +192,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -221,8 +219,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -245,7 +244,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/mbart/modeling_mbart.py b/src/transformers/models/mbart/modeling_mbart.py index 921237259acf..ce7f7e1e352a 100755 --- a/src/transformers/models/mbart/modeling_mbart.py +++ b/src/transformers/models/mbart/modeling_mbart.py @@ -212,14 +212,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -241,8 +239,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -265,7 +264,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/megatron_bert/modeling_megatron_bert.py b/src/transformers/models/megatron_bert/modeling_megatron_bert.py index cb8500a04c63..5d13ca778910 100755 --- a/src/transformers/models/megatron_bert/modeling_megatron_bert.py +++ b/src/transformers/models/megatron_bert/modeling_megatron_bert.py @@ -131,11 +131,10 @@ def forward( output_attentions: bool | None = False, **kwargs, ) -> tuple[torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) query_layer = self.query(hidden_states) - query_layer = query_layer.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose( - 1, 2 - ) + query_layer = query_layer.view(hidden_shape).transpose(1, 2) is_updated = False is_cross_attention = encoder_hidden_states is not None @@ -157,13 +156,9 @@ def forward( value_layer = curr_past_key_values.layers[self.layer_idx].values else: key_layer = self.key(current_states) - key_layer = key_layer.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose( - 1, 2 - ) + key_layer = key_layer.view(hidden_shape).transpose(1, 2) value_layer = self.value(current_states) - value_layer = value_layer.view( - batch_size, -1, self.num_attention_heads, self.attention_head_size - ).transpose(1, 2) + value_layer = value_layer.view(hidden_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_layer to cache to be re-used for fast auto-regressive generation diff --git a/src/transformers/models/metaclip_2/modeling_metaclip_2.py b/src/transformers/models/metaclip_2/modeling_metaclip_2.py index 16dd6de15098..baea1c832012 100644 --- a/src/transformers/models/metaclip_2/modeling_metaclip_2.py +++ b/src/transformers/models/metaclip_2/modeling_metaclip_2.py @@ -209,15 +209,16 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) queries = self.q_proj(hidden_states) keys = self.k_proj(hidden_states) values = self.v_proj(hidden_states) - queries = queries.view(batch_size, seq_length, -1, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, -1, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, -1, self.head_dim).transpose(1, 2) + queries = queries.view(hidden_shape).transpose(1, 2) + keys = keys.view(hidden_shape).transpose(1, 2) + values = values.view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -234,7 +235,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/mobilevit/modeling_mobilevit.py b/src/transformers/models/mobilevit/modeling_mobilevit.py index aff43a5daa7a..763360ef8211 100755 --- a/src/transformers/models/mobilevit/modeling_mobilevit.py +++ b/src/transformers/models/mobilevit/modeling_mobilevit.py @@ -207,22 +207,11 @@ def __init__(self, config: MobileViTConfig, hidden_size: int) -> None: self.dropout = nn.Dropout(config.attention_probs_dropout_prob) def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) diff --git a/src/transformers/models/mpnet/modeling_mpnet.py b/src/transformers/models/mpnet/modeling_mpnet.py index 25dc58bb99fa..7fb872fc3699 100644 --- a/src/transformers/models/mpnet/modeling_mpnet.py +++ b/src/transformers/models/mpnet/modeling_mpnet.py @@ -141,22 +141,11 @@ def forward( output_attentions=False, **kwargs, ): - batch_size, seq_length, _ = hidden_states.shape - q = ( - self.q(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - k = ( - self.k(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - v = ( - self.v(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + q = self.q(hidden_states).view(hidden_shape).transpose(1, 2) + k = self.k(hidden_states).view(hidden_shape).transpose(1, 2) + v = self.v(hidden_states).view(hidden_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(q, k.transpose(-1, -2)) diff --git a/src/transformers/models/mt5/modeling_mt5.py b/src/transformers/models/mt5/modeling_mt5.py index 90a9515397bb..a1ea0c8e51f5 100644 --- a/src/transformers/models/mt5/modeling_mt5.py +++ b/src/transformers/models/mt5/modeling_mt5.py @@ -257,7 +257,8 @@ def forward( """ # Input is (batch_size, seq_length, dim) # Mask is (batch_size, 1, 1, key_length) (non-causal encoder) or (batch_size, 1, seq_length, key_length) (causal decoder) - batch_size, seq_length = hidden_states.shape[:2] + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.key_value_proj_dim) past_seen_tokens = past_key_values.get_seq_length(self.layer_idx) if past_key_values is not None else 0 # We clone here for StaticCache, as we get the value before updating it, but use it after and it's the same ref past_seen_tokens = past_seen_tokens.clone() if isinstance(past_seen_tokens, torch.Tensor) else past_seen_tokens @@ -265,8 +266,7 @@ def forward( # if key_value_states are provided this layer is used as a cross-attention layer for the decoder is_cross_attention = key_value_states is not None - q_input_shape = (batch_size, seq_length, -1, self.key_value_proj_dim) - query_states = self.q(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q(hidden_states).view(hidden_shape).transpose(1, 2) # Check is encoder-decoder model is being used. Otherwise we'll get `DynamicCache` is_updated = False @@ -286,9 +286,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - kv_input_shape = (batch_size, current_states.shape[1], -1, self.key_value_proj_dim) - key_states = self.k(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.key_value_proj_dim) + key_states = self.k(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -303,13 +303,13 @@ def forward( key_length = key_states.shape[-2] if not self.has_relative_attention_bias: position_bias = torch.zeros( - (1, query_states.shape[1], seq_length, key_length), device=scores.device, dtype=scores.dtype + (1, query_states.shape[1], input_shape[1], key_length), device=scores.device, dtype=scores.dtype ) if self.gradient_checkpointing and self.training: position_bias.requires_grad = True else: position_bias = self.compute_bias( - seq_length, key_length, device=scores.device, past_seen_tokens=past_seen_tokens + input_shape[1], key_length, device=scores.device, past_seen_tokens=past_seen_tokens ) if mask is not None: @@ -326,7 +326,7 @@ def forward( attn_output = torch.matmul(attn_weights, value_states) attn_output = attn_output.transpose(1, 2).contiguous() - attn_output = attn_output.view(batch_size, seq_length, -1) + attn_output = attn_output.reshape(*input_shape, -1) attn_output = self.o(attn_output) outputs = (attn_output, position_bias) diff --git a/src/transformers/models/musicgen/modeling_musicgen.py b/src/transformers/models/musicgen/modeling_musicgen.py index e289d1601af4..75236a9d845b 100644 --- a/src/transformers/models/musicgen/modeling_musicgen.py +++ b/src/transformers/models/musicgen/modeling_musicgen.py @@ -230,14 +230,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -257,8 +255,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_states to cache to be re-used for fast auto-regressive generation @@ -283,7 +282,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/musicgen_melody/modeling_musicgen_melody.py b/src/transformers/models/musicgen_melody/modeling_musicgen_melody.py index 7a2df870cb07..e1d7919b41bf 100644 --- a/src/transformers/models/musicgen_melody/modeling_musicgen_melody.py +++ b/src/transformers/models/musicgen_melody/modeling_musicgen_melody.py @@ -238,14 +238,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -265,8 +263,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_states to cache to be re-used for fast auto-regressive generation @@ -291,7 +290,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/nllb_moe/modeling_nllb_moe.py b/src/transformers/models/nllb_moe/modeling_nllb_moe.py index bc62ba0bdefe..d4ef4927ce67 100644 --- a/src/transformers/models/nllb_moe/modeling_nllb_moe.py +++ b/src/transformers/models/nllb_moe/modeling_nllb_moe.py @@ -457,12 +457,10 @@ def forward( **kwargs: Unpack[FlashAttentionKwargs], ) -> tuple[torch.Tensor, torch.Tensor]: is_cross_attention = key_value_states is not None - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: if isinstance(past_key_values, EncoderDecoderCache): @@ -481,8 +479,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_states to cache to be re-used for fast auto-regressive generation @@ -506,7 +505,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/nystromformer/modeling_nystromformer.py b/src/transformers/models/nystromformer/modeling_nystromformer.py index 33623c990fcc..7bc78d27fa8d 100755 --- a/src/transformers/models/nystromformer/modeling_nystromformer.py +++ b/src/transformers/models/nystromformer/modeling_nystromformer.py @@ -160,22 +160,11 @@ def iterative_inv(self, mat, n_iter=6): return value def forward(self, hidden_states, attention_mask=None, output_attentions=False): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) query_layer = query_layer / math.sqrt(math.sqrt(self.attention_head_size)) key_layer = key_layer / math.sqrt(math.sqrt(self.attention_head_size)) diff --git a/src/transformers/models/ovis2/modeling_ovis2.py b/src/transformers/models/ovis2/modeling_ovis2.py index 5722af5aa00e..4b389e4c66b7 100644 --- a/src/transformers/models/ovis2/modeling_ovis2.py +++ b/src/transformers/models/ovis2/modeling_ovis2.py @@ -226,15 +226,12 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -251,7 +248,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/patchtsmixer/modeling_patchtsmixer.py b/src/transformers/models/patchtsmixer/modeling_patchtsmixer.py index fd98d11907b2..05766ab41153 100644 --- a/src/transformers/models/patchtsmixer/modeling_patchtsmixer.py +++ b/src/transformers/models/patchtsmixer/modeling_patchtsmixer.py @@ -318,18 +318,17 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) current_states = key_value_states if is_cross_attention else hidden_states - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -347,7 +346,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights, None diff --git a/src/transformers/models/patchtst/modeling_patchtst.py b/src/transformers/models/patchtst/modeling_patchtst.py index c669c89a4814..b5f94bab3476 100755 --- a/src/transformers/models/patchtst/modeling_patchtst.py +++ b/src/transformers/models/patchtst/modeling_patchtst.py @@ -116,18 +116,17 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) current_states = key_value_states if is_cross_attention else hidden_states - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -145,7 +144,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights, None diff --git a/src/transformers/models/pegasus/modeling_pegasus.py b/src/transformers/models/pegasus/modeling_pegasus.py index 752227763818..1eed3f26e4e1 100755 --- a/src/transformers/models/pegasus/modeling_pegasus.py +++ b/src/transformers/models/pegasus/modeling_pegasus.py @@ -194,14 +194,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -223,8 +221,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -247,7 +246,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/pegasus_x/modeling_pegasus_x.py b/src/transformers/models/pegasus_x/modeling_pegasus_x.py index 233805c47426..9fcc043fefad 100755 --- a/src/transformers/models/pegasus_x/modeling_pegasus_x.py +++ b/src/transformers/models/pegasus_x/modeling_pegasus_x.py @@ -212,14 +212,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -241,8 +239,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -265,7 +264,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/plbart/modeling_plbart.py b/src/transformers/models/plbart/modeling_plbart.py index fb3cc37beb6d..418e44d7029a 100644 --- a/src/transformers/models/plbart/modeling_plbart.py +++ b/src/transformers/models/plbart/modeling_plbart.py @@ -201,14 +201,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -230,8 +228,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -254,7 +253,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/pop2piano/modeling_pop2piano.py b/src/transformers/models/pop2piano/modeling_pop2piano.py index 852e60c136a6..e361bd65cafb 100644 --- a/src/transformers/models/pop2piano/modeling_pop2piano.py +++ b/src/transformers/models/pop2piano/modeling_pop2piano.py @@ -269,7 +269,8 @@ def forward( """ # Input is (batch_size, seq_length, dim) # Mask is (batch_size, 1, 1, key_length) (non-causal encoder) or (batch_size, 1, seq_length, key_length) (causal decoder) - batch_size, seq_length = hidden_states.shape[:2] + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.key_value_proj_dim) past_seen_tokens = past_key_values.get_seq_length(self.layer_idx) if past_key_values is not None else 0 # We clone here for StaticCache, as we get the value before updating it, but use it after and it's the same ref past_seen_tokens = past_seen_tokens.clone() if isinstance(past_seen_tokens, torch.Tensor) else past_seen_tokens @@ -277,8 +278,7 @@ def forward( # if key_value_states are provided this layer is used as a cross-attention layer for the decoder is_cross_attention = key_value_states is not None - q_input_shape = (batch_size, seq_length, -1, self.key_value_proj_dim) - query_states = self.q(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q(hidden_states).view(hidden_shape).transpose(1, 2) # Check is encoder-decoder model is being used. Otherwise we'll get `DynamicCache` is_updated = False @@ -298,9 +298,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - kv_input_shape = (batch_size, current_states.shape[1], -1, self.key_value_proj_dim) - key_states = self.k(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.key_value_proj_dim) + key_states = self.k(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -315,13 +315,13 @@ def forward( key_length = key_states.shape[-2] if not self.has_relative_attention_bias: position_bias = torch.zeros( - (1, query_states.shape[1], seq_length, key_length), device=scores.device, dtype=scores.dtype + (1, query_states.shape[1], input_shape[1], key_length), device=scores.device, dtype=scores.dtype ) if self.gradient_checkpointing and self.training: position_bias.requires_grad = True else: position_bias = self.compute_bias( - seq_length, key_length, device=scores.device, past_seen_tokens=past_seen_tokens + input_shape[1], key_length, device=scores.device, past_seen_tokens=past_seen_tokens ) if mask is not None: @@ -338,7 +338,7 @@ def forward( attn_output = torch.matmul(attn_weights, value_states) attn_output = attn_output.transpose(1, 2).contiguous() - attn_output = attn_output.view(batch_size, seq_length, -1) + attn_output = attn_output.reshape(*input_shape, -1) attn_output = self.o(attn_output) outputs = (attn_output, position_bias) diff --git a/src/transformers/models/rembert/modeling_rembert.py b/src/transformers/models/rembert/modeling_rembert.py index 868deaaf2040..b21dc813bd9a 100755 --- a/src/transformers/models/rembert/modeling_rembert.py +++ b/src/transformers/models/rembert/modeling_rembert.py @@ -142,12 +142,9 @@ def forward( output_attentions: bool = False, **kwargs, ) -> tuple: - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False is_cross_attention = encoder_hidden_states is not None @@ -168,16 +165,9 @@ def forward( key_layer = curr_past_key_values.layers[self.layer_idx].keys value_layer = curr_past_key_values.layers[self.layer_idx].values else: - key_layer = ( - self.key(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + kv_shape = (*current_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(current_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_layer to cache to be re-used for fast auto-regressive generation diff --git a/src/transformers/models/roberta/modeling_roberta.py b/src/transformers/models/roberta/modeling_roberta.py index c6f499fa0ed0..bf891b7dbfe7 100644 --- a/src/transformers/models/roberta/modeling_roberta.py +++ b/src/transformers/models/roberta/modeling_roberta.py @@ -287,14 +287,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -302,8 +300,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -327,7 +326,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/roberta_prelayernorm/modeling_roberta_prelayernorm.py b/src/transformers/models/roberta_prelayernorm/modeling_roberta_prelayernorm.py index ca3a22ae59f5..299d0565edc7 100644 --- a/src/transformers/models/roberta_prelayernorm/modeling_roberta_prelayernorm.py +++ b/src/transformers/models/roberta_prelayernorm/modeling_roberta_prelayernorm.py @@ -286,14 +286,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -301,8 +299,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -326,7 +325,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/roc_bert/modeling_roc_bert.py b/src/transformers/models/roc_bert/modeling_roc_bert.py index 7c21bc5ab9c8..40bd4dcf5964 100644 --- a/src/transformers/models/roc_bert/modeling_roc_bert.py +++ b/src/transformers/models/roc_bert/modeling_roc_bert.py @@ -305,14 +305,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -320,8 +318,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -345,7 +344,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/roformer/modeling_roformer.py b/src/transformers/models/roformer/modeling_roformer.py index fe4cf6116aa1..bf20e90b1c31 100644 --- a/src/transformers/models/roformer/modeling_roformer.py +++ b/src/transformers/models/roformer/modeling_roformer.py @@ -144,12 +144,9 @@ def forward( output_attentions=False, **kwargs, ): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) # If this is instantiated as a cross-attention module, the keys # and values come from an encoder; the attention mask needs to be # such that the encoder's padding tokens are not attended to. @@ -173,16 +170,9 @@ def forward( key_layer = curr_past_key_values.layers[self.layer_idx].keys value_layer = curr_past_key_values.layers[self.layer_idx].values else: - key_layer = ( - self.key(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + kv_shape = (*current_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(current_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(current_states).view(kv_shape).transpose(1, 2) # Apply RoPE if self attention if not is_cross_attention and sinusoidal_pos is not None: diff --git a/src/transformers/models/segformer/modeling_segformer.py b/src/transformers/models/segformer/modeling_segformer.py index 10d82a587d06..df1430d5cad9 100755 --- a/src/transformers/models/segformer/modeling_segformer.py +++ b/src/transformers/models/segformer/modeling_segformer.py @@ -150,12 +150,9 @@ def forward( width, output_attentions=False, ): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) if self.sr_ratio > 1: batch_size, seq_len, num_channels = hidden_states.shape @@ -167,16 +164,9 @@ def forward( hidden_states = hidden_states.reshape(batch_size, num_channels, -1).permute(0, 2, 1) hidden_states = self.layer_norm(hidden_states) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + kv_shape = (*hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(kv_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) diff --git a/src/transformers/models/sew/modeling_sew.py b/src/transformers/models/sew/modeling_sew.py index 79070d634608..ea499e63289a 100644 --- a/src/transformers/models/sew/modeling_sew.py +++ b/src/transformers/models/sew/modeling_sew.py @@ -308,18 +308,17 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) current_states = key_value_states if is_cross_attention else hidden_states - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -337,7 +336,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights, None diff --git a/src/transformers/models/siglip/modeling_siglip.py b/src/transformers/models/siglip/modeling_siglip.py index bf9e0c0fb99e..524b8b89d1f4 100644 --- a/src/transformers/models/siglip/modeling_siglip.py +++ b/src/transformers/models/siglip/modeling_siglip.py @@ -280,15 +280,12 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -305,7 +302,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/siglip2/modeling_siglip2.py b/src/transformers/models/siglip2/modeling_siglip2.py index ba6f55333fe9..3959802a98be 100644 --- a/src/transformers/models/siglip2/modeling_siglip2.py +++ b/src/transformers/models/siglip2/modeling_siglip2.py @@ -309,15 +309,12 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -334,7 +331,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/smolvlm/modeling_smolvlm.py b/src/transformers/models/smolvlm/modeling_smolvlm.py index ed2eec345b75..c2b6e23698cd 100644 --- a/src/transformers/models/smolvlm/modeling_smolvlm.py +++ b/src/transformers/models/smolvlm/modeling_smolvlm.py @@ -190,16 +190,11 @@ def forward( **kwargs, ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - - batch_size, seq_length, embed_dim = hidden_states.shape - - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -216,7 +211,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/speech_to_text/modeling_speech_to_text.py b/src/transformers/models/speech_to_text/modeling_speech_to_text.py index d66501a47048..3111cc6d0b83 100755 --- a/src/transformers/models/speech_to_text/modeling_speech_to_text.py +++ b/src/transformers/models/speech_to_text/modeling_speech_to_text.py @@ -253,14 +253,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -280,8 +278,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_states to cache to be re-used for fast auto-regressive generation @@ -306,7 +305,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/speech_to_text/tokenization_speech_to_text.py b/src/transformers/models/speech_to_text/tokenization_speech_to_text.py index deb241f70864..9babee22fed6 100644 --- a/src/transformers/models/speech_to_text/tokenization_speech_to_text.py +++ b/src/transformers/models/speech_to_text/tokenization_speech_to_text.py @@ -163,8 +163,8 @@ def get_vocab(self) -> dict: return vocab @property - def tgt_lang(self) -> str: - return self._tgt_lang + def tgt_lang(self) -> str | None: + return getattr(self, "_tgt_lang", None) @tgt_lang.setter def tgt_lang(self, new_tgt_lang) -> None: diff --git a/src/transformers/models/switch_transformers/modeling_switch_transformers.py b/src/transformers/models/switch_transformers/modeling_switch_transformers.py index 3f85033be8d5..4f4124961a92 100644 --- a/src/transformers/models/switch_transformers/modeling_switch_transformers.py +++ b/src/transformers/models/switch_transformers/modeling_switch_transformers.py @@ -337,7 +337,8 @@ def forward( """ # Input is (batch_size, seq_length, dim) # Mask is (batch_size, 1, 1, key_length) (non-causal encoder) or (batch_size, 1, seq_length, key_length) (causal decoder) - batch_size, seq_length = hidden_states.shape[:2] + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.key_value_proj_dim) past_seen_tokens = past_key_values.get_seq_length(self.layer_idx) if past_key_values is not None else 0 # We clone here for StaticCache, as we get the value before updating it, but use it after and it's the same ref past_seen_tokens = past_seen_tokens.clone() if isinstance(past_seen_tokens, torch.Tensor) else past_seen_tokens @@ -345,8 +346,7 @@ def forward( # if key_value_states are provided this layer is used as a cross-attention layer for the decoder is_cross_attention = key_value_states is not None - q_input_shape = (batch_size, seq_length, -1, self.key_value_proj_dim) - query_states = self.q(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q(hidden_states).view(hidden_shape).transpose(1, 2) # Check is encoder-decoder model is being used. Otherwise we'll get `DynamicCache` is_updated = False @@ -366,9 +366,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - kv_input_shape = (batch_size, current_states.shape[1], -1, self.key_value_proj_dim) - key_states = self.k(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.key_value_proj_dim) + key_states = self.k(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -383,13 +383,13 @@ def forward( key_length = key_states.shape[-2] if not self.has_relative_attention_bias: position_bias = torch.zeros( - (1, query_states.shape[1], seq_length, key_length), device=scores.device, dtype=scores.dtype + (1, query_states.shape[1], input_shape[1], key_length), device=scores.device, dtype=scores.dtype ) if self.gradient_checkpointing and self.training: position_bias.requires_grad = True else: position_bias = self.compute_bias( - seq_length, key_length, device=scores.device, past_seen_tokens=past_seen_tokens + input_shape[1], key_length, device=scores.device, past_seen_tokens=past_seen_tokens ) if mask is not None: @@ -406,7 +406,7 @@ def forward( attn_output = torch.matmul(attn_weights, value_states) attn_output = attn_output.transpose(1, 2).contiguous() - attn_output = attn_output.view(batch_size, seq_length, -1) + attn_output = attn_output.reshape(*input_shape, -1) attn_output = self.o(attn_output) outputs = (attn_output, position_bias) diff --git a/src/transformers/models/t5/modeling_t5.py b/src/transformers/models/t5/modeling_t5.py index 8deaf51ad77e..0f541c74069c 100644 --- a/src/transformers/models/t5/modeling_t5.py +++ b/src/transformers/models/t5/modeling_t5.py @@ -265,7 +265,8 @@ def forward( """ # Input is (batch_size, seq_length, dim) # Mask is (batch_size, 1, 1, key_length) (non-causal encoder) or (batch_size, 1, seq_length, key_length) (causal decoder) - batch_size, seq_length = hidden_states.shape[:2] + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.key_value_proj_dim) past_seen_tokens = past_key_values.get_seq_length(self.layer_idx) if past_key_values is not None else 0 # We clone here for StaticCache, as we get the value before updating it, but use it after and it's the same ref past_seen_tokens = past_seen_tokens.clone() if isinstance(past_seen_tokens, torch.Tensor) else past_seen_tokens @@ -273,8 +274,7 @@ def forward( # if key_value_states are provided this layer is used as a cross-attention layer for the decoder is_cross_attention = key_value_states is not None - q_input_shape = (batch_size, seq_length, -1, self.key_value_proj_dim) - query_states = self.q(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q(hidden_states).view(hidden_shape).transpose(1, 2) # Check is encoder-decoder model is being used. Otherwise we'll get `DynamicCache` is_updated = False @@ -294,9 +294,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - kv_input_shape = (batch_size, current_states.shape[1], -1, self.key_value_proj_dim) - key_states = self.k(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.key_value_proj_dim) + key_states = self.k(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -311,13 +311,13 @@ def forward( key_length = key_states.shape[-2] if not self.has_relative_attention_bias: position_bias = torch.zeros( - (1, query_states.shape[1], seq_length, key_length), device=scores.device, dtype=scores.dtype + (1, query_states.shape[1], input_shape[1], key_length), device=scores.device, dtype=scores.dtype ) if self.gradient_checkpointing and self.training: position_bias.requires_grad = True else: position_bias = self.compute_bias( - seq_length, key_length, device=scores.device, past_seen_tokens=past_seen_tokens + input_shape[1], key_length, device=scores.device, past_seen_tokens=past_seen_tokens ) if mask is not None: @@ -334,7 +334,7 @@ def forward( attn_output = torch.matmul(attn_weights, value_states) attn_output = attn_output.transpose(1, 2).contiguous() - attn_output = attn_output.view(batch_size, seq_length, -1) + attn_output = attn_output.reshape(*input_shape, -1) attn_output = self.o(attn_output) outputs = (attn_output, position_bias) diff --git a/src/transformers/models/tapas/modeling_tapas.py b/src/transformers/models/tapas/modeling_tapas.py index b53e85c60046..e66335c13cc2 100644 --- a/src/transformers/models/tapas/modeling_tapas.py +++ b/src/transformers/models/tapas/modeling_tapas.py @@ -170,12 +170,9 @@ def forward( output_attentions=False, **kwargs, ): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False is_cross_attention = encoder_hidden_states is not None @@ -196,16 +193,8 @@ def forward( key_layer = curr_past_key_values.layers[self.layer_idx].keys value_layer = curr_past_key_values.layers[self.layer_idx].values else: - key_layer = ( - self.key(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(current_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + key_layer = self.key(current_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(current_states).view(hidden_shape).transpose(1, 2) if past_key_values is not None: # save all key/value_layer to cache to be re-used for fast auto-regressive generation diff --git a/src/transformers/models/time_series_transformer/modeling_time_series_transformer.py b/src/transformers/models/time_series_transformer/modeling_time_series_transformer.py index 732abf1b4af1..ad4a09f919cc 100644 --- a/src/transformers/models/time_series_transformer/modeling_time_series_transformer.py +++ b/src/transformers/models/time_series_transformer/modeling_time_series_transformer.py @@ -359,14 +359,12 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = False if past_key_values is not None: @@ -388,8 +386,9 @@ def forward( else: key_states = self.k_proj(current_states) value_states = self.v_proj(current_states) - key_states = key_states.view(*kv_input_shape).transpose(1, 2) - value_states = value_states.view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = key_states.view(kv_shape).transpose(1, 2) + value_states = value_states.view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -412,7 +411,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/udop/modeling_udop.py b/src/transformers/models/udop/modeling_udop.py index 3cf52f9b2f6a..dceadc547e86 100644 --- a/src/transformers/models/udop/modeling_udop.py +++ b/src/transformers/models/udop/modeling_udop.py @@ -543,7 +543,8 @@ def forward( """ # Input is (batch_size, seq_length, dim) # Mask is (batch_size, 1, 1, key_length) (non-causal encoder) or (batch_size, 1, seq_length, key_length) (causal decoder) - batch_size, seq_length = hidden_states.shape[:2] + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.key_value_proj_dim) past_seen_tokens = past_key_values.get_seq_length(self.layer_idx) if past_key_values is not None else 0 # We clone here for StaticCache, as we get the value before updating it, but use it after and it's the same ref past_seen_tokens = past_seen_tokens.clone() if isinstance(past_seen_tokens, torch.Tensor) else past_seen_tokens @@ -551,8 +552,7 @@ def forward( # if key_value_states are provided this layer is used as a cross-attention layer for the decoder is_cross_attention = key_value_states is not None - q_input_shape = (batch_size, seq_length, -1, self.key_value_proj_dim) - query_states = self.q(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q(hidden_states).view(hidden_shape).transpose(1, 2) # Check is encoder-decoder model is being used. Otherwise we'll get `DynamicCache` is_updated = False @@ -572,9 +572,9 @@ def forward( key_states = curr_past_key_values.layers[self.layer_idx].keys value_states = curr_past_key_values.layers[self.layer_idx].values else: - kv_input_shape = (batch_size, current_states.shape[1], -1, self.key_value_proj_dim) - key_states = self.k(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.key_value_proj_dim) + key_states = self.k(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v(current_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: key_states, value_states = curr_past_key_values.update(key_states, value_states, self.layer_idx) @@ -589,13 +589,13 @@ def forward( key_length = key_states.shape[-2] if not self.has_relative_attention_bias: position_bias = torch.zeros( - (1, query_states.shape[1], seq_length, key_length), device=scores.device, dtype=scores.dtype + (1, query_states.shape[1], input_shape[1], key_length), device=scores.device, dtype=scores.dtype ) if self.gradient_checkpointing and self.training: position_bias.requires_grad = True else: position_bias = self.compute_bias( - seq_length, key_length, device=scores.device, past_seen_tokens=past_seen_tokens + input_shape[1], key_length, device=scores.device, past_seen_tokens=past_seen_tokens ) if mask is not None: @@ -612,7 +612,7 @@ def forward( attn_output = torch.matmul(attn_weights, value_states) attn_output = attn_output.transpose(1, 2).contiguous() - attn_output = attn_output.view(batch_size, seq_length, -1) + attn_output = attn_output.reshape(*input_shape, -1) attn_output = self.o(attn_output) outputs = (attn_output, position_bias) diff --git a/src/transformers/models/unispeech/modeling_unispeech.py b/src/transformers/models/unispeech/modeling_unispeech.py index 26f1f8e64ce2..e1ee81f42950 100755 --- a/src/transformers/models/unispeech/modeling_unispeech.py +++ b/src/transformers/models/unispeech/modeling_unispeech.py @@ -342,18 +342,17 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) current_states = key_value_states if is_cross_attention else hidden_states - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -371,7 +370,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights, None diff --git a/src/transformers/models/unispeech_sat/modeling_unispeech_sat.py b/src/transformers/models/unispeech_sat/modeling_unispeech_sat.py index bb97b659fae7..c23fdcf16420 100755 --- a/src/transformers/models/unispeech_sat/modeling_unispeech_sat.py +++ b/src/transformers/models/unispeech_sat/modeling_unispeech_sat.py @@ -348,18 +348,17 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) current_states = key_value_states if is_cross_attention else hidden_states - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -377,7 +376,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights, None diff --git a/src/transformers/models/videomae/modeling_videomae.py b/src/transformers/models/videomae/modeling_videomae.py index 1812a667cb5f..b86d0f10fbb7 100755 --- a/src/transformers/models/videomae/modeling_videomae.py +++ b/src/transformers/models/videomae/modeling_videomae.py @@ -222,28 +222,19 @@ def __init__(self, config: VideoMAEConfig) -> None: self.scaling = self.attention_head_size**-0.5 self.is_causal = False - self.query = nn.Linear(config.hidden_size, self.all_head_size, bias=False) - self.key = nn.Linear(config.hidden_size, self.all_head_size, bias=False) - self.value = nn.Linear(config.hidden_size, self.all_head_size, bias=False) + self.query = nn.Linear(config.hidden_size, self.all_head_size, bias=config.qkv_bias) + self.key = nn.Linear(config.hidden_size, self.all_head_size, bias=config.qkv_bias) + self.value = nn.Linear(config.hidden_size, self.all_head_size, bias=config.qkv_bias) - if config.qkv_bias: - self.q_bias = nn.Parameter(torch.zeros(self.all_head_size)) - self.v_bias = nn.Parameter(torch.zeros(self.all_head_size)) - else: - self.q_bias = None - self.v_bias = None - - def forward(self, hidden_states: torch.Tensor | None = None) -> tuple[torch.Tensor, torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape - - k_bias = torch.zeros_like(self.v_bias, requires_grad=False) if self.q_bias is not None else None - keys = nn.functional.linear(input=hidden_states, weight=self.key.weight, bias=k_bias) - values = nn.functional.linear(input=hidden_states, weight=self.value.weight, bias=self.v_bias) - queries = nn.functional.linear(input=hidden_states, weight=self.query.weight, bias=self.q_bias) + def forward( + self, hidden_states: torch.Tensor | None = None + ) -> tuple[torch.Tensor, torch.Tensor]: # TODO: siglip attention 1-1 + input_shape = hidden_states.shape[:-1] - key_layer = keys.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose(1, 2) - value_layer = values.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose(1, 2) - query_layer = queries.view(batch_size, -1, self.num_attention_heads, self.attention_head_size).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.attention_head_size) + keys = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.value(hidden_states).view(hidden_shape).transpose(1, 2) + queries = self.query(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -251,9 +242,9 @@ def forward(self, hidden_states: torch.Tensor | None = None) -> tuple[torch.Tens context_layer, attention_probs = attention_interface( self, - query_layer, - key_layer, - value_layer, + queries, + keys, + values, None, is_causal=self.is_causal, scaling=self.scaling, diff --git a/src/transformers/models/videomt/modeling_videomt.py b/src/transformers/models/videomt/modeling_videomt.py index e14b0ec6440d..2ef7948589de 100644 --- a/src/transformers/models/videomt/modeling_videomt.py +++ b/src/transformers/models/videomt/modeling_videomt.py @@ -220,15 +220,12 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -245,7 +242,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/vilt/modeling_vilt.py b/src/transformers/models/vilt/modeling_vilt.py index 02b9a9f3f2eb..5e973f7502d1 100755 --- a/src/transformers/models/vilt/modeling_vilt.py +++ b/src/transformers/models/vilt/modeling_vilt.py @@ -323,22 +323,11 @@ def __init__(self, config): self.dropout = nn.Dropout(config.attention_probs_dropout_prob) def forward(self, hidden_states, attention_mask=None, output_attentions=False): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) diff --git a/src/transformers/models/visual_bert/modeling_visual_bert.py b/src/transformers/models/visual_bert/modeling_visual_bert.py index 03f1abe59093..60dfb0785b98 100755 --- a/src/transformers/models/visual_bert/modeling_visual_bert.py +++ b/src/transformers/models/visual_bert/modeling_visual_bert.py @@ -194,22 +194,11 @@ def forward( attention_mask=None, output_attentions=False, ): - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) # Take the dot product between "query" and "key" to get the raw attention scores. attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) diff --git a/src/transformers/models/vjepa2/modeling_vjepa2.py b/src/transformers/models/vjepa2/modeling_vjepa2.py index 292659127506..ff469faa1599 100644 --- a/src/transformers/models/vjepa2/modeling_vjepa2.py +++ b/src/transformers/models/vjepa2/modeling_vjepa2.py @@ -298,22 +298,11 @@ def forward( hidden_states, position_mask: torch.Tensor | None = None, ) -> tuple[torch.Tensor, torch.Tensor]: - batch_size, seq_length, _ = hidden_states.shape - query_layer = ( - self.query(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - key_layer = ( - self.key(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) - value_layer = ( - self.value(hidden_states) - .view(batch_size, -1, self.num_attention_heads, self.attention_head_size) - .transpose(1, 2) - ) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.attention_head_size) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) + key_layer = self.key(hidden_states).view(hidden_shape).transpose(1, 2) + value_layer = self.value(hidden_states).view(hidden_shape).transpose(1, 2) pos_ids = self.get_position_ids(hidden_states, masks=position_mask) key_layer = self.apply_rotary_embeddings(key_layer, pos_ids) @@ -675,16 +664,11 @@ def forward( attention_mask: torch.Tensor | None = None, ) -> tuple[torch.Tensor, torch.Tensor]: """Input shape: Batch x Time x Channel""" - - batch_size, seq_length, embed_dim = hidden_states.shape - - queries = self.q_proj(hidden_states) - keys = self.k_proj(hidden_states) - values = self.v_proj(hidden_states) - - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) + queries = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) + keys = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2) + values = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -701,7 +685,7 @@ def forward( dropout=0.0 if not self.training else self.dropout, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/wav2vec2/modeling_wav2vec2.py b/src/transformers/models/wav2vec2/modeling_wav2vec2.py index 561aa0ae3450..08442dad50b8 100755 --- a/src/transformers/models/wav2vec2/modeling_wav2vec2.py +++ b/src/transformers/models/wav2vec2/modeling_wav2vec2.py @@ -514,18 +514,17 @@ def forward( is_cross_attention = key_value_states is not None # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = key_value_states.shape[1] if is_cross_attention else tgt_len + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) - kv_input_shape = (bsz, src_len, -1, self.head_dim) + hidden_shape = (*input_shape, -1, self.head_dim) # get query proj - query_states = self.q_proj(hidden_states).view(*q_input_shape).transpose(1, 2) + query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2) current_states = key_value_states if is_cross_attention else hidden_states - key_states = self.k_proj(current_states).view(*kv_input_shape).transpose(1, 2) - value_states = self.v_proj(current_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*current_states.shape[:-1], -1, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2) + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -543,7 +542,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights, None diff --git a/src/transformers/models/whisper/modeling_whisper.py b/src/transformers/models/whisper/modeling_whisper.py index b38142878660..47f367c4e55e 100644 --- a/src/transformers/models/whisper/modeling_whisper.py +++ b/src/transformers/models/whisper/modeling_whisper.py @@ -298,18 +298,15 @@ def forward( # for the decoder is_cross_attention = key_value_states is not None - # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.head_dim) + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) # Scaling is susceptible to floating point arithmetics' inprecisions # which can lead to different results (this is dependent from model # to model, e.g. whisper is one such case). We therefore keep the # original order of scaling to follow the original implementation # and enforce no scaling (1.0) in the attention call below. - query_states = self.q_proj(hidden_states) * self.scaling - query_states = query_states.view(*q_input_shape) - query_states = query_states.transpose(1, 2).contiguous() + query_states = (self.q_proj(hidden_states) * self.scaling).view(hidden_shape).transpose(1, 2).contiguous() # Check is encoder-decoder model is being used. Otherwise we'll get `DynamicCache` if past_key_values is not None and isinstance(past_key_values, EncoderDecoderCache): @@ -328,10 +325,12 @@ def forward( key_states = past_key_values.layers[self.layer_idx].keys value_states = past_key_values.layers[self.layer_idx].values else: - key_states = self.k_proj(current_states).view(bsz, -1, self.num_heads, self.head_dim) - value_states = self.v_proj(current_states).view(bsz, -1, self.num_heads, self.head_dim) - key_states = key_states.transpose(1, 2).contiguous() - value_states = value_states.transpose(1, 2).contiguous() + # Use the query's batch dimension for kv view so that a different-batch + # encoder output (e.g. in tests) gets absorbed into the sequence axis, + # preserving backward-compatible behaviour. + kv_shape = (input_shape[0], -1, self.num_heads, self.head_dim) + key_states = self.k_proj(current_states).view(kv_shape).transpose(1, 2).contiguous() + value_states = self.v_proj(current_states).view(kv_shape).transpose(1, 2).contiguous() if past_key_values is not None: key_states, value_states = past_key_values.update(key_states, value_states, self.layer_idx) @@ -351,7 +350,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/x_clip/modeling_x_clip.py b/src/transformers/models/x_clip/modeling_x_clip.py index ed874f74342e..616332aa0997 100644 --- a/src/transformers/models/x_clip/modeling_x_clip.py +++ b/src/transformers/models/x_clip/modeling_x_clip.py @@ -279,15 +279,16 @@ def forward( ) -> tuple[torch.Tensor, torch.Tensor | None]: """Input shape: Batch x Time x Channel""" - batch_size, seq_length, embed_dim = hidden_states.shape + input_shape = hidden_states.shape[:-1] + hidden_shape = (*input_shape, -1, self.head_dim) queries = self.q_proj(hidden_states) keys = self.k_proj(hidden_states) values = self.v_proj(hidden_states) - queries = queries.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - keys = keys.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) - values = values.view(batch_size, seq_length, self.num_heads, self.head_dim).transpose(1, 2) + queries = queries.view(hidden_shape).transpose(1, 2) + keys = keys.view(hidden_shape).transpose(1, 2) + values = values.view(hidden_shape).transpose(1, 2) attention_interface: Callable = ALL_ATTENTION_FUNCTIONS.get_interface( self.config._attn_implementation, eager_attention_forward @@ -305,7 +306,7 @@ def forward( **kwargs, ) - attn_output = attn_output.reshape(batch_size, seq_length, embed_dim).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() attn_output = self.out_proj(attn_output) return attn_output, attn_weights diff --git a/src/transformers/models/xlm_roberta/modeling_xlm_roberta.py b/src/transformers/models/xlm_roberta/modeling_xlm_roberta.py index 84581ed39221..76653e7f644c 100644 --- a/src/transformers/models/xlm_roberta/modeling_xlm_roberta.py +++ b/src/transformers/models/xlm_roberta/modeling_xlm_roberta.py @@ -287,14 +287,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -302,8 +300,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -327,7 +326,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/xlm_roberta_xl/modeling_xlm_roberta_xl.py b/src/transformers/models/xlm_roberta_xl/modeling_xlm_roberta_xl.py index 6d5de81b0223..1234db3074b3 100644 --- a/src/transformers/models/xlm_roberta_xl/modeling_xlm_roberta_xl.py +++ b/src/transformers/models/xlm_roberta_xl/modeling_xlm_roberta_xl.py @@ -289,14 +289,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -304,8 +302,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -329,7 +328,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/models/xmod/modeling_xmod.py b/src/transformers/models/xmod/modeling_xmod.py index a8dea11b7a7d..79ef73d34254 100644 --- a/src/transformers/models/xmod/modeling_xmod.py +++ b/src/transformers/models/xmod/modeling_xmod.py @@ -285,14 +285,12 @@ def forward( **kwargs: Unpack[TransformersKwargs], ) -> tuple[torch.Tensor]: # determine input shapes - bsz, tgt_len = hidden_states.shape[:-1] - src_len = encoder_hidden_states.shape[1] + input_shape = hidden_states.shape[:-1] - q_input_shape = (bsz, tgt_len, -1, self.attention_head_size) - kv_input_shape = (bsz, src_len, -1, self.attention_head_size) + hidden_shape = (*input_shape, -1, self.attention_head_size) # get query proj - query_layer = self.query(hidden_states).view(*q_input_shape).transpose(1, 2) + query_layer = self.query(hidden_states).view(hidden_shape).transpose(1, 2) is_updated = past_key_values.is_updated.get(self.layer_idx) if past_key_values is not None else False if past_key_values is not None and is_updated: @@ -300,8 +298,9 @@ def forward( key_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].keys value_layer = past_key_values.cross_attention_cache.layers[self.layer_idx].values else: - key_layer = self.key(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) - value_layer = self.value(encoder_hidden_states).view(*kv_input_shape).transpose(1, 2) + kv_shape = (*encoder_hidden_states.shape[:-1], -1, self.attention_head_size) + key_layer = self.key(encoder_hidden_states).view(kv_shape).transpose(1, 2) + value_layer = self.value(encoder_hidden_states).view(kv_shape).transpose(1, 2) if past_key_values is not None: # save all states to the cache @@ -325,7 +324,7 @@ def forward( scaling=self.scaling, **kwargs, ) - attn_output = attn_output.reshape(bsz, tgt_len, -1).contiguous() + attn_output = attn_output.reshape(*input_shape, -1).contiguous() return attn_output, attn_weights diff --git a/src/transformers/tokenization_utils_base.py b/src/transformers/tokenization_utils_base.py index e61b20c3a4cf..401528c4d2c7 100644 --- a/src/transformers/tokenization_utils_base.py +++ b/src/transformers/tokenization_utils_base.py @@ -1277,7 +1277,9 @@ def __getattr__(self, key): # Named special tokens (bos_token, eos_token, etc.) if key_without_id in self.SPECIAL_TOKENS_ATTRIBUTES: - token_value = self._special_tokens_map.get(key_without_id) + # Use __dict__.get to avoid recursive __getattr__ when _special_tokens_map + # is not yet initialized (e.g. during fast tokenizer __init__) + token_value = self.__dict__.get("_special_tokens_map", {}).get(key_without_id) if token_value is None: if self.verbose: logger.error(f"Using {key}, but it is not set yet.") @@ -1286,10 +1288,16 @@ def __getattr__(self, key): # Extra special tokens if key_without_id == "extra_special_tokens": - tokens = [str(tok) for tok in self._extra_special_tokens] + tokens = [str(tok) for tok in self.__dict__.get("_extra_special_tokens", [])] return self.convert_tokens_to_ids(tokens) if key != key_without_id else tokens if key not in self.__dict__: + # Also check the class hierarchy (handles class-level defaults, e.g. in + # dynamically loaded remote code where __getattr__ may be called before + # the instance attribute is set) + for cls in type(self).__mro__: + if key in vars(cls): + return vars(cls)[key] raise AttributeError(f"{self.__class__.__name__} has no attribute {key}") return super().__getattr__(key) diff --git a/src/transformers/utils/auto_docstring.py b/src/transformers/utils/auto_docstring.py index 6375851dc770..bd04f3fb901e 100644 --- a/src/transformers/utils/auto_docstring.py +++ b/src/transformers/utils/auto_docstring.py @@ -3579,6 +3579,11 @@ def _process_kwargs_parameters(sig, func, parent_class, documented_kwargs, inden if kwarg_param.annotation == inspect.Parameter.empty: continue + if not hasattr(kwarg_param.annotation, "__args__") or not hasattr( + kwarg_param.annotation.__args__[0], "__name__" + ): + continue + if kwarg_param.annotation.__args__[0].__name__ not in BASIC_KWARGS_TYPES: # Extract documentation for kwargs kwargs_documentation = kwarg_param.annotation.__args__[0].__doc__ diff --git a/tests/utils/test_configuration_utils.py b/tests/utils/test_configuration_utils.py index 227c979990dd..f12e873d526e 100644 --- a/tests/utils/test_configuration_utils.py +++ b/tests/utils/test_configuration_utils.py @@ -359,3 +359,41 @@ def __init__( self.assertIsInstance(new_config_instance.inf_positive, float) self.assertIsInstance(new_config_instance.inf_negative, float) self.assertIsInstance(new_config_instance.nan, float) + + +class ConfigSubclassKwOnlyTest(unittest.TestCase): + """Test that config subclasses with non-default fields following parent default fields + no longer raise TypeError (fixed by kw_only=True in __init_subclass__). Regression + test for https://github.com/huggingface/transformers/issues/XXXX.""" + + def test_subclass_non_default_field_after_default(self): + """A config subclass adding a required field after parent defaults must not raise.""" + + class MyConfig(PreTrainedConfig): + pooling: str # no default — would fail under Python dataclass ordering rules + + # Should construct without TypeError + cfg = MyConfig(pooling="mean") + self.assertEqual(cfg.pooling, "mean") + + def test_subclass_multiple_non_default_fields(self): + """Multiple non-default fields in the subclass should all work.""" + + class EmbedConfig(PreTrainedConfig): + dim: int + pooling: str + + cfg = EmbedConfig(dim=128, pooling="cls") + self.assertEqual(cfg.dim, 128) + self.assertEqual(cfg.pooling, "cls") + + def test_inherited_defaults_still_work(self): + """Inherited fields with defaults must still be accessible.""" + from transformers import BertConfig + + class BertWithPooling(BertConfig): + pooling: str + + cfg = BertWithPooling(pooling="mean", hidden_size=256) + self.assertEqual(cfg.pooling, "mean") + self.assertEqual(cfg.hidden_size, 256) diff --git a/tests/utils/test_modeling_rope_utils.py b/tests/utils/test_modeling_rope_utils.py index 45d86bfc2c87..79ab37d9e2f3 100644 --- a/tests/utils/test_modeling_rope_utils.py +++ b/tests/utils/test_modeling_rope_utils.py @@ -36,8 +36,11 @@ def test_rope_validation(self): # The base config is always valid (default RoPE) config.validate_rope() - # If we explicitly set the other RoPE types, then validation should fail + # If we explicitly set the other (non-default) RoPE types with only rope_theta, + # validation should fail because required keys are missing (e.g. factor, short_factor) for rope_type in all_rope_types: + if rope_type == "default": + continue # "default" is always valid with just rope_theta # proportional is same as default wrt to expected keys if rope_type == "proportional": continue @@ -55,6 +58,8 @@ def test_rope_validation(self): "long_factor": ["longrope"], } for rope_type in all_rope_types: + if rope_type == "default": + continue # "default" only warns about unrecognised keys, never raises KeyError # proportional is same as default wrt to expected keys if rope_type == "proportional": continue