| import math |
| from typing import Optional, Union |
|
|
| import torch |
| from torch import Tensor, device, nn |
| from torch.nn import CrossEntropyLoss |
|
|
| from transformers.cache_utils import Cache, DynamicCache, EncoderDecoderCache |
| from transformers.generation import GenerationMixin |
| from transformers.modeling_layers import GradientCheckpointingLayer |
| from transformers.modeling_outputs import ( |
| BaseModelOutputWithPastAndCrossAttentions, |
| BaseModelOutputWithPoolingAndCrossAttentions, |
| CausalLMOutputWithCrossAttentions, |
| ) |
| from transformers.pytorch_utils import apply_chunking_to_forward |
| from transformers.utils import logging |
| from transformer_lens.hook_points import HookPoint, HookedRootModule |
| from transformers.models.blip.modeling_blip_text import ( |
| BlipTextEmbeddings, BlipTextSelfOutput, BlipTextIntermediate, |
| BlipTextPooler, BlipTextPreTrainedModel, BlipTextOnlyMLMHead, |
| BlipTextSelfAttention, BlipTextOutput, BlipTextEncoder |
| ) |
|
|
| logger = logging.get_logger(__name__) |
|
|
| |
|
|
| class HookedBlipTextSelfAttention(BlipTextSelfAttention): |
| def __init__(self, config, is_cross_attention, layer_idx=None): |
| super().__init__(config, is_cross_attention, layer_idx=layer_idx) |
| self.layer_idx = layer_idx |
| self.is_cross_attention = is_cross_attention |
| |
| |
| self.hook_q = HookPoint() |
| self.hook_k = HookPoint() |
| self.hook_v = HookPoint() |
| self.hook_attn_pattern = HookPoint() |
| self.hook_attn_out = HookPoint() |
| self.hook_resid_pre = HookPoint() |
| self.hook_context_layer = HookPoint() |
|
|
| def save_attn_gradients(self, attn_gradients): |
| self.attn_gradients = attn_gradients |
|
|
| def get_attn_gradients(self): |
| return self.attn_gradients |
|
|
| def save_attention_map(self, attention_map): |
| self.attention_map = attention_map |
|
|
| def get_attention_map(self): |
| return self.attention_map |
|
|
| def forward( |
| self, |
| hidden_states: torch.Tensor, |
| attention_mask: Optional[torch.FloatTensor] = None, |
| encoder_hidden_states: Optional[torch.FloatTensor] = None, |
| encoder_attention_mask: Optional[torch.FloatTensor] = None, |
| past_key_values: Optional[Cache] = None, |
| output_attentions: Optional[bool] = False, |
| cache_position: Optional[torch.Tensor] = None, |
| ) -> tuple[torch.Tensor]: |
| |
| |
| self.hook_resid_pre.layer_idx = self.layer_idx |
| hidden_states = self.hook_resid_pre(hidden_states) |
| |
| 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) |
| ) |
| |
| |
| |
| |
| |
| is_cross_attention = encoder_hidden_states is not None |
| attention_mask = encoder_attention_mask if is_cross_attention else attention_mask |
|
|
| is_updated = False |
| if past_key_values is not None: |
| if isinstance(past_key_values, EncoderDecoderCache): |
| is_updated = past_key_values.is_updated.get(self.layer_idx) |
| if is_cross_attention: |
| |
| curr_past_key_values = past_key_values.cross_attention_cache |
| else: |
| curr_past_key_values = past_key_values.self_attention_cache |
| else: |
| curr_past_key_values = past_key_values |
|
|
| current_states = encoder_hidden_states if is_cross_attention else hidden_states |
| if is_cross_attention and past_key_values is not None and is_updated: |
| |
| 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) |
| ) |
|
|
| if past_key_values is not None: |
| |
| cache_position = cache_position if not is_cross_attention else None |
| key_layer, value_layer = curr_past_key_values.update( |
| key_layer, value_layer, self.layer_idx, {"cache_position": cache_position} |
| ) |
| |
| if is_cross_attention and isinstance(past_key_values, EncoderDecoderCache): |
| past_key_values.is_updated[self.layer_idx] = True |
|
|
| |
| |
| |
| self.hook_q.layer_idx = self.layer_idx |
| query_layer = self.hook_q(query_layer) |
| |
| |
| self.hook_k.layer_idx = self.layer_idx |
| key_layer = self.hook_k(key_layer) |
| |
| |
| self.hook_v.layer_idx = self.layer_idx |
| value_layer = self.hook_v(value_layer) |
|
|
| |
| attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2)) |
|
|
| attention_scores = attention_scores / math.sqrt(self.attention_head_size) |
| if attention_mask is not None: |
| |
| attention_scores = attention_scores + attention_mask.to(attention_scores.device) |
|
|
| |
| attention_probs = nn.Softmax(dim=-1)(attention_scores) |
| |
| |
| self.hook_attn_pattern.layer_idx = self.layer_idx |
| attention_probs = self.hook_attn_pattern(attention_probs) |
|
|
| |
| |
| attention_probs_dropped = self.dropout(attention_probs) |
|
|
| |
| context_layer = torch.matmul(attention_probs_dropped, value_layer) |
|
|
| |
| self.hook_context_layer.layer_idx = self.layer_idx |
| context_layer = self.hook_context_layer(context_layer) |
| |
| |
| context_layer = context_layer.permute(0, 2, 1, 3).contiguous() |
| new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,) |
| context_layer = context_layer.view(*new_context_layer_shape) |
|
|
| |
| self.hook_attn_out.layer_idx = self.layer_idx |
| self.hook_attn_out(context_layer) |
|
|
| return context_layer, attention_probs |
| |
| |
| class HookedBlipTextAttention(nn.Module): |
| def __init__(self, config, is_cross_attention=False, layer_idx=None): |
| super().__init__() |
| self.self = HookedBlipTextSelfAttention(config, is_cross_attention, layer_idx=layer_idx) |
| self.output = BlipTextSelfOutput(config) |
|
|
| def forward( |
| self, |
| hidden_states: torch.Tensor, |
| attention_mask: Optional[torch.FloatTensor] = None, |
| encoder_hidden_states: Optional[torch.FloatTensor] = None, |
| past_key_values: Optional[Cache] = None, |
| output_attentions: Optional[bool] = False, |
| cache_position: Optional[torch.Tensor] = None, |
| ) -> tuple[torch.Tensor]: |
| self_outputs = self.self( |
| hidden_states, |
| attention_mask=attention_mask, |
| encoder_hidden_states=encoder_hidden_states, |
| past_key_values=past_key_values, |
| output_attentions=output_attentions, |
| cache_position=cache_position, |
| ) |
| attention_output = self.output(self_outputs[0], hidden_states) |
| outputs = (attention_output,) + self_outputs[1:] |
| return outputs |
|
|
|
|
|
|
| class HookedBlipTextOutput(BlipTextOutput): |
| def __init__(self, config, layer_idx): |
| super().__init__(config) |
| self.layer_idx = layer_idx |
| self.hook_mlp_out = HookPoint() |
|
|
| def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor: |
| hidden_states = self.dense(hidden_states) |
|
|
| self.hook_mlp_out.layer_idx = self.layer_idx |
| self.hook_mlp_out(hidden_states) |
| hidden_states = self.dropout(hidden_states) |
| hidden_states = self.LayerNorm(hidden_states + input_tensor) |
| return hidden_states |
|
|
| |
| class HookedBlipTextLayer(GradientCheckpointingLayer): |
| def __init__(self, config, layer_num): |
| super().__init__() |
| self.config = config |
| self.chunk_size_feed_forward = config.chunk_size_feed_forward |
| self.seq_len_dim = 1 |
| self.layer_num = layer_num |
| self.attention = HookedBlipTextAttention(config, layer_idx=layer_num) |
| if self.config.is_decoder: |
| self.crossattention = HookedBlipTextAttention( |
| config, is_cross_attention=self.config.is_decoder, layer_idx=layer_num |
| ) |
| self.intermediate = BlipTextIntermediate(config) |
| self.output = HookedBlipTextOutput(config, layer_idx=layer_num) |
|
|
| def forward( |
| self, |
| hidden_states: torch.Tensor, |
| attention_mask: Optional[torch.FloatTensor] = None, |
| encoder_hidden_states: Optional[torch.FloatTensor] = None, |
| encoder_attention_mask: Optional[torch.FloatTensor] = None, |
| past_key_values: Optional[Cache] = None, |
| output_attentions: Optional[bool] = False, |
| cache_position: Optional[torch.Tensor] = None, |
| ) -> tuple[torch.Tensor]: |
| self_attention_outputs = self.attention( |
| hidden_states, |
| attention_mask=attention_mask, |
| output_attentions=output_attentions, |
| past_key_values=past_key_values, |
| cache_position=cache_position, |
| ) |
| attention_output = self_attention_outputs[0] |
| outputs = self_attention_outputs[1:] |
|
|
| if encoder_hidden_states is not None: |
| cross_attention_outputs = self.crossattention( |
| attention_output, |
| attention_mask=encoder_attention_mask, |
| encoder_hidden_states=encoder_hidden_states, |
| past_key_values=past_key_values, |
| output_attentions=output_attentions, |
| cache_position=cache_position, |
| ) |
| attention_output = cross_attention_outputs[0] |
| outputs = outputs + cross_attention_outputs[1:] |
| layer_output = apply_chunking_to_forward( |
| self.feed_forward_chunk, self.chunk_size_feed_forward, self.seq_len_dim, attention_output |
| ) |
| return (layer_output,) + outputs |
|
|
| def feed_forward_chunk(self, attention_output): |
| intermediate_output = self.intermediate(attention_output) |
| layer_output = self.output(intermediate_output, attention_output) |
| return layer_output |
|
|
| |
| class HookedBlipTextEncoder(BlipTextEncoder, HookedRootModule): |
| def __init__(self, config): |
| HookedRootModule.__init__(self) |
| self.config = config |
| self.layer = nn.ModuleList([HookedBlipTextLayer(config, i) for i in range(config.num_hidden_layers)]) |
| self.gradient_checkpointing = False |
|
|
| def forward( |
| self, |
| hidden_states: torch.Tensor, |
| attention_mask: Optional[torch.FloatTensor] = None, |
| encoder_hidden_states: Optional[torch.FloatTensor] = None, |
| encoder_attention_mask: Optional[torch.FloatTensor] = None, |
| past_key_values: Optional[Cache] = None, |
| use_cache: Optional[bool] = None, |
| output_attentions: Optional[bool] = False, |
| output_hidden_states: Optional[bool] = False, |
| return_dict: Optional[bool] = True, |
| cache_position: Optional[torch.Tensor] = None, |
| ) -> Union[tuple[torch.Tensor], BaseModelOutputWithPastAndCrossAttentions]: |
| if self.gradient_checkpointing and self.training: |
| if use_cache: |
| logger.warning( |
| "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." |
| ) |
| use_cache = False |
|
|
| if use_cache: |
| |
| |
| if isinstance(past_key_values, DynamicCache): |
| past_key_values = EncoderDecoderCache(past_key_values, DynamicCache(config=self.config)) |
| elif past_key_values is None: |
| past_key_values = EncoderDecoderCache( |
| DynamicCache(config=self.config), DynamicCache(config=self.config) |
| ) |
|
|
| all_hidden_states = () if output_hidden_states else None |
| all_self_attentions = () if output_attentions else None |
| all_cross_attentions = () if output_attentions and encoder_hidden_states is not None else None |
|
|
| for i in range(self.config.num_hidden_layers): |
| layer_module = self.layer[i] |
| if output_hidden_states: |
| all_hidden_states = all_hidden_states + (hidden_states,) |
|
|
| layer_outputs = layer_module( |
| hidden_states, |
| attention_mask, |
| encoder_hidden_states, |
| encoder_attention_mask, |
| past_key_values, |
| output_attentions, |
| cache_position, |
| ) |
|
|
| hidden_states = layer_outputs[0] |
| if output_attentions: |
| all_self_attentions = all_self_attentions + (layer_outputs[1],) |
| if encoder_hidden_states is not None: |
| all_cross_attentions = all_cross_attentions + (layer_outputs[2],) |
|
|
| if output_hidden_states: |
| all_hidden_states = all_hidden_states + (hidden_states,) |
|
|
| if not return_dict: |
| return tuple( |
| v |
| for v in [ |
| hidden_states, |
| past_key_values, |
| all_hidden_states, |
| all_self_attentions, |
| all_cross_attentions, |
| ] |
| if v is not None |
| ) |
| return BaseModelOutputWithPastAndCrossAttentions( |
| last_hidden_state=hidden_states, |
| past_key_values=past_key_values, |
| hidden_states=all_hidden_states, |
| attentions=all_self_attentions, |
| cross_attentions=all_cross_attentions, |
| ) |
|
|
|
|
| |
| class BlipTextModel(BlipTextPreTrainedModel): |
| """ |
| The model can behave as an encoder (with only self-attention) as well as a decoder, in which case a layer of |
| cross-attention is added between the self-attention layers, following the architecture described in [Attention is |
| all you need](https://huggingface.co/papers/1706.03762) by Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, |
| Llion Jones, Aidan N. Gomez, Lukasz Kaiser and Illia Polosukhin. argument and `is_decoder` set to `True`; an |
| `encoder_hidden_states` is then expected as an input to the forward pass. |
| """ |
|
|
| def __init__(self, config, add_pooling_layer=True): |
| super().__init__(config) |
| self.config = config |
|
|
| self.embeddings = BlipTextEmbeddings(config) |
| self.encoder = HookedBlipTextEncoder(config) |
| self.pooler = BlipTextPooler(config) if add_pooling_layer else None |
| |
| self.hook_text_embeddings = HookPoint() |
|
|
| self.post_init() |
|
|
| def get_input_embeddings(self): |
| return self.embeddings.word_embeddings |
|
|
| def set_input_embeddings(self, value): |
| self.embeddings.word_embeddings = value |
|
|
| def get_extended_attention_mask( |
| self, attention_mask: Tensor, input_shape: tuple[int], device: device, is_decoder: bool |
| ) -> Tensor: |
| """ |
| Makes broadcastable attention and causal masks so that future and masked tokens are ignored. |
| |
| Arguments: |
| attention_mask (`torch.Tensor`): |
| Mask with ones indicating tokens to attend to, zeros for tokens to ignore. |
| input_shape (`tuple[int]`): |
| The shape of the input to the model. |
| device (`torch.device`): |
| The device of the input to the model. |
| |
| Returns: |
| `torch.Tensor` The extended attention mask, with a the same dtype as `attention_mask.dtype`. |
| """ |
| |
| |
| if attention_mask.dim() == 3: |
| extended_attention_mask = attention_mask[:, None, :, :] |
| elif attention_mask.dim() == 2: |
| |
| |
| |
| if is_decoder: |
| batch_size, seq_length = input_shape |
|
|
| seq_ids = torch.arange(seq_length, device=device) |
| causal_mask = seq_ids[None, None, :].repeat(batch_size, seq_length, 1) <= seq_ids[None, :, None] |
| |
| causal_mask = causal_mask.to(attention_mask.dtype) |
|
|
| if causal_mask.shape[1] < attention_mask.shape[1]: |
| prefix_seq_len = attention_mask.shape[1] - causal_mask.shape[1] |
| causal_mask = torch.cat( |
| [ |
| torch.ones( |
| (batch_size, seq_length, prefix_seq_len), device=device, dtype=causal_mask.dtype |
| ), |
| causal_mask, |
| ], |
| axis=-1, |
| ) |
|
|
| extended_attention_mask = causal_mask[:, None, :, :] * attention_mask[:, None, None, :] |
| else: |
| extended_attention_mask = attention_mask[:, None, None, :] |
| else: |
| raise ValueError( |
| f"Wrong shape for input_ids (shape {input_shape}) or attention_mask (shape {attention_mask.shape})" |
| ) |
|
|
| |
| |
| |
| |
| |
| extended_attention_mask = extended_attention_mask.to(dtype=self.dtype) |
| extended_attention_mask = (1.0 - extended_attention_mask) * -10000.0 |
| return extended_attention_mask |
|
|
| def forward( |
| self, |
| input_ids: Optional[torch.Tensor] = None, |
| attention_mask: Optional[torch.Tensor] = None, |
| position_ids: Optional[torch.Tensor] = None, |
| inputs_embeds: Optional[torch.Tensor] = None, |
| encoder_embeds: Optional[torch.Tensor] = None, |
| encoder_hidden_states: Optional[torch.Tensor] = None, |
| encoder_attention_mask: Optional[torch.Tensor] = None, |
| past_key_values: Optional[Cache] = None, |
| use_cache: Optional[bool] = None, |
| output_attentions: Optional[bool] = None, |
| output_hidden_states: Optional[bool] = None, |
| return_dict: Optional[bool] = None, |
| is_decoder: Optional[bool] = False, |
| cache_position: Optional[torch.Tensor] = None, |
| ) -> Union[tuple[torch.Tensor], BaseModelOutputWithPoolingAndCrossAttentions]: |
| r""" |
| encoder_hidden_states (`torch.FloatTensor`, *optional*): |
| Sequence of hidden-states at the output of the last layer of the encoder. Used in the cross-attention if |
| the model is configured as a decoder. |
| encoder_attention_mask (`torch.FloatTensor`, *optional*): |
| Mask to avoid performing attention on the padding token indices of the encoder input. This mask is used in |
| the cross-attention if the model is configured as a decoder. Mask values selected in `[0, 1]`: |
| - 1 for tokens that are **not masked**, |
| - 0 for tokens that are **masked**. |
| past_key_values (`Cache`, *optional*): |
| Contains precomputed key and value hidden states of the attention blocks. Can be used to speed up decoding. |
| If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that |
| don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all |
| `decoder_input_ids` of shape `(batch_size, sequence_length)`. |
| use_cache (`bool`, *optional*): |
| If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see |
| `past_key_values`). |
| """ |
| output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions |
| output_hidden_states = ( |
| output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states |
| ) |
| return_dict = return_dict if return_dict is not None else self.config.use_return_dict |
|
|
| if is_decoder: |
| use_cache = use_cache if use_cache is not None else self.config.use_cache |
| else: |
| use_cache = False |
|
|
| if input_ids is not None and inputs_embeds is not None: |
| raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time") |
| elif input_ids is not None: |
| self.warn_if_padding_and_no_attention_mask(input_ids, attention_mask) |
| input_shape = input_ids.size() |
| batch_size, seq_length = input_shape |
| device = input_ids.device |
| elif inputs_embeds is not None: |
| input_shape = inputs_embeds.size()[:-1] |
| batch_size, seq_length = input_shape |
| device = inputs_embeds.device |
| elif encoder_embeds is not None: |
| input_shape = encoder_embeds.size()[:-1] |
| batch_size, seq_length = input_shape |
| device = encoder_embeds.device |
| else: |
| raise ValueError("You have to specify either input_ids or inputs_embeds or encoder_embeds") |
|
|
| past_key_values_length = 0 if past_key_values is None else past_key_values.get_seq_length() |
|
|
| if attention_mask is None: |
| attention_mask = torch.ones((batch_size, seq_length + past_key_values_length)).to(device) |
|
|
| |
| |
| extended_attention_mask: torch.Tensor = self.get_extended_attention_mask( |
| attention_mask, input_shape, device, is_decoder |
| ) |
|
|
| |
| |
| if encoder_hidden_states is not None: |
| if isinstance(encoder_hidden_states, list): |
| encoder_batch_size, encoder_sequence_length, _ = encoder_hidden_states[0].size() |
| else: |
| encoder_batch_size, encoder_sequence_length, _ = encoder_hidden_states.size() |
| encoder_hidden_shape = (encoder_batch_size, encoder_sequence_length) |
|
|
| if isinstance(encoder_attention_mask, list): |
| encoder_extended_attention_mask = [self.invert_attention_mask(mask) for mask in encoder_attention_mask] |
| elif encoder_attention_mask is None: |
| encoder_attention_mask = torch.ones(encoder_hidden_shape, device=device) |
| encoder_extended_attention_mask = self.invert_attention_mask(encoder_attention_mask) |
| else: |
| encoder_extended_attention_mask = self.invert_attention_mask(encoder_attention_mask) |
| else: |
| encoder_extended_attention_mask = None |
|
|
| if encoder_embeds is None: |
| embedding_output = self.embeddings( |
| input_ids=input_ids, |
| position_ids=position_ids, |
| inputs_embeds=inputs_embeds, |
| past_key_values_length=past_key_values_length, |
| ) |
| else: |
| embedding_output = encoder_embeds |
| |
| |
| embedding_output = self.hook_text_embeddings(embedding_output) |
|
|
| encoder_outputs = self.encoder( |
| embedding_output, |
| attention_mask=extended_attention_mask, |
| encoder_hidden_states=encoder_hidden_states, |
| encoder_attention_mask=encoder_extended_attention_mask, |
| past_key_values=past_key_values, |
| use_cache=use_cache, |
| output_attentions=output_attentions, |
| output_hidden_states=output_hidden_states, |
| return_dict=return_dict, |
| cache_position=cache_position, |
| ) |
| sequence_output = encoder_outputs[0] |
| pooled_output = self.pooler(sequence_output) if self.pooler is not None else None |
|
|
| if not return_dict: |
| return (sequence_output, pooled_output) + encoder_outputs[1:] |
|
|
| return BaseModelOutputWithPoolingAndCrossAttentions( |
| last_hidden_state=sequence_output, |
| pooler_output=pooled_output, |
| past_key_values=encoder_outputs.past_key_values, |
| hidden_states=encoder_outputs.hidden_states, |
| attentions=encoder_outputs.attentions, |
| cross_attentions=encoder_outputs.cross_attentions, |
| ) |
|
|
|
|
| |
| class BlipTextLMHeadModel(BlipTextPreTrainedModel, GenerationMixin): |
| _tied_weights_keys = ["cls.predictions.decoder.weight", "cls.predictions.decoder.bias"] |
|
|
| def __init__(self, config): |
| super().__init__(config) |
|
|
| self.bert = BlipTextModel(config, add_pooling_layer=False) |
| self.cls = BlipTextOnlyMLMHead(config) |
| self.label_smoothing = config.label_smoothing |
|
|
| def get_input_embeddings(self): |
| return self.bert.get_input_embeddings() |
|
|
| def set_input_embeddings(self, new_embeddings): |
| self.bert.set_input_embeddings(new_embeddings) |
|
|
| def get_output_embeddings(self): |
| return self.cls.predictions.decoder |
|
|
| def set_output_embeddings(self, new_embeddings): |
| self.cls.predictions.decoder = new_embeddings |
| self.cls.predictions.bias = new_embeddings.bias |
|
|
| def forward( |
| self, |
| input_ids: Optional[torch.Tensor] = None, |
| attention_mask: Optional[torch.Tensor] = None, |
| position_ids: Optional[torch.Tensor] = None, |
| inputs_embeds: Optional[torch.Tensor] = None, |
| encoder_hidden_states: Optional[torch.Tensor] = None, |
| encoder_attention_mask: Optional[torch.Tensor] = None, |
| labels: Optional[torch.Tensor] = None, |
| past_key_values: Optional[Cache] = None, |
| use_cache: Optional[bool] = None, |
| output_attentions: Optional[bool] = None, |
| output_hidden_states: Optional[bool] = None, |
| return_dict: Optional[bool] = None, |
| return_logits: Optional[bool] = False, |
| is_decoder: Optional[bool] = True, |
| reduction: Optional[str] = "mean", |
| cache_position: Optional[torch.Tensor] = None, |
| logits_to_keep: Union[int, torch.Tensor] = 0, |
| ) -> Union[tuple[torch.Tensor], CausalLMOutputWithCrossAttentions]: |
| r""" |
| encoder_hidden_states (`torch.FloatTensor`, *optional*): Sequence of |
| hidden-states at the output of the last layer of the encoder. Used in the cross-attention if the model is |
| configured as a decoder. |
| encoder_attention_mask (`torch.FloatTensor`, *optional*): |
| Mask to avoid performing attention on the padding token indices of the encoder input. This mask is used in |
| the cross-attention if the model is configured as a decoder. Mask values selected in `[0, 1]`: |
| - 1 for tokens that are **not masked**, |
| - 0 for tokens that are **masked**. |
| labels (`torch.LongTensor`, *optional*): |
| Labels for computing the left-to-right language modeling loss (next word prediction). Indices should be in |
| `[-100, 0, ..., config.vocab_size]` (see `input_ids` docstring) Tokens with indices set to `-100` are |
| ignored (masked), the loss is only computed for the tokens with labels n `[0, ..., config.vocab_size]` |
| past_key_values (`Cache`, *optional*): |
| Contains precomputed key and value hidden states of the attention blocks. Can be used to speed up decoding. |
| If `past_key_values` are used, the user can optionally input only the last `decoder_input_ids` (those that |
| don't have their past key value states given to this model) of shape `(batch_size, 1)` instead of all |
| `decoder_input_ids` of shape `(batch_size, sequence_length)`. |
| use_cache (`bool`, *optional*): |
| If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see |
| `past_key_values`). |
| """ |
| return_dict = return_dict if return_dict is not None else self.config.use_return_dict |
| if labels is not None: |
| use_cache = False |
|
|
| outputs = self.bert( |
| input_ids, |
| attention_mask=attention_mask, |
| position_ids=position_ids, |
| inputs_embeds=inputs_embeds, |
| encoder_hidden_states=encoder_hidden_states, |
| encoder_attention_mask=encoder_attention_mask, |
| past_key_values=past_key_values, |
| use_cache=use_cache, |
| output_attentions=output_attentions, |
| output_hidden_states=output_hidden_states, |
| return_dict=return_dict, |
| is_decoder=is_decoder, |
| cache_position=cache_position, |
| ) |
|
|
| hidden_states = outputs[0] |
| |
| slice_indices = slice(-logits_to_keep, None) if isinstance(logits_to_keep, int) else logits_to_keep |
| prediction_scores = self.cls(hidden_states[:, slice_indices, :]) |
|
|
| if return_logits: |
| return prediction_scores[:, :-1, :].contiguous() |
|
|
| lm_loss = None |
| if labels is not None: |
| |
| shifted_prediction_scores = prediction_scores[:, :-1, :].contiguous() |
| labels = labels[:, 1:].contiguous().to(shifted_prediction_scores.device) |
| loss_fct = CrossEntropyLoss(reduction=reduction, label_smoothing=self.label_smoothing) |
| lm_loss = loss_fct(shifted_prediction_scores.view(-1, self.config.vocab_size), labels.view(-1)) |
| if reduction == "none": |
| lm_loss = lm_loss.view(prediction_scores.size(0), -1).sum(1) |
|
|
| if not return_dict: |
| output = (prediction_scores,) + outputs[2:] |
| return ((lm_loss,) + output) if lm_loss is not None else output |
|
|
| return CausalLMOutputWithCrossAttentions( |
| loss=lm_loss, |
| logits=prediction_scores, |
| past_key_values=outputs.past_key_values, |
| hidden_states=outputs.hidden_states, |
| attentions=outputs.attentions, |
| cross_attentions=outputs.cross_attentions, |
| ) |
|
|
| def prepare_inputs_for_generation(self, input_ids, past_key_values=None, attention_mask=None, **model_kwargs): |
| |
|
|
| model_inputs = super().prepare_inputs_for_generation( |
| input_ids, |
| past_key_values=past_key_values, |
| attention_mask=attention_mask, |
| **model_kwargs, |
| ) |
| model_inputs["is_decoder"] = True |
|
|
| return model_inputs |
|
|
|
|
| __all__ = ["BlipTextModel", "BlipTextLMHeadModel", "BlipTextPreTrainedModel"] |
|
|