unsloth/Phi-4-mini-instruct
226.2k
1# coding=utf-82# Copyright 2024 Microsoft and the HuggingFace Inc. team. All rights reserved.3#4# Licensed under the Apache License, Version 2.0 (the "License");5# you may not use this file except in compliance with the License.6# You may obtain a copy of the License at7#8# http://www.apache.org/licenses/LICENSE-2.09#10# Unless required by applicable law or agreed to in writing, software11# distributed under the License is distributed on an "AS IS" BASIS,12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.13# See the License for the specific language governing permissions and14# limitations under the License.15 16"""PyTorch Phi-3 model."""17 18from typing import Callable, List, Optional, Tuple, Union19 20import torch21from torch import nn22 23from transformers.activations import ACT2FN24from transformers.cache_utils import Cache, DynamicCache, SlidingWindowCache, StaticCache25from transformers.generation import GenerationMixin26from transformers.modeling_attn_mask_utils import AttentionMaskConverter27from transformers.modeling_flash_attention_utils import FlashAttentionKwargs28from transformers.modeling_outputs import (29 BaseModelOutputWithPast,30 CausalLMOutputWithPast,31 SequenceClassifierOutputWithPast,32 TokenClassifierOutput,33)34from transformers.modeling_rope_utils import ROPE_INIT_FUNCTIONS35from transformers.modeling_utils import ALL_ATTENTION_FUNCTIONS, PreTrainedModel36from transformers.processing_utils import Unpack37from transformers.utils import (38 LossKwargs,39 add_code_sample_docstrings,40 add_start_docstrings,41 add_start_docstrings_to_model_forward,42 logging,43 replace_return_docstrings,44)45from transformers.utils.deprecation import deprecate_kwarg46from .configuration_phi3 import Phi3Config47 48 49logger = logging.get_logger(__name__)50 51_CHECKPOINT_FOR_DOC = "microsoft/Phi-3-mini-4k-instruct"52_CONFIG_FOR_DOC = "Phi3Config"53 54 55class Phi3MLP(nn.Module):56 def __init__(self, config):57 super().__init__()58 59 self.config = config60 self.gate_up_proj = nn.Linear(config.hidden_size, 2 * config.intermediate_size, bias=False)61 self.down_proj = nn.Linear(config.intermediate_size, config.hidden_size, bias=False)62 self.activation_fn = ACT2FN[config.hidden_act]63 64 def forward(self, hidden_states: torch.FloatTensor) -> torch.FloatTensor:65 up_states = self.gate_up_proj(hidden_states)66 67 gate, up_states = up_states.chunk(2, dim=-1)68 up_states = up_states * self.activation_fn(gate)69 70 return self.down_proj(up_states)71 72 73def rotate_half(x):74 """Rotates half the hidden dims of the input."""75 x1 = x[..., : x.shape[-1] // 2]76 x2 = x[..., x.shape[-1] // 2 :]77 return torch.cat((-x2, x1), dim=-1)78 79 80def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor:81 """82 This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,83 num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)84 """85 batch, num_key_value_heads, slen, head_dim = hidden_states.shape86 if n_rep == 1:87 return hidden_states88 hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim)89 return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim)90 91 92def eager_attention_forward(93 module: nn.Module,94 query: torch.Tensor,95 key: torch.Tensor,96 value: torch.Tensor,97 attention_mask: Optional[torch.Tensor],98 scaling: float,99 dropout: float = 0.0,100 **kwargs,101):102 key_states = repeat_kv(key, module.num_key_value_groups)103 value_states = repeat_kv(value, module.num_key_value_groups)104 105 attn_weights = torch.matmul(query, key_states.transpose(2, 3)) * scaling106 if attention_mask is not None:107 causal_mask = attention_mask[:, :, :, : key_states.shape[-2]]108 attn_weights = attn_weights + causal_mask109 110 attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query.dtype)111 attn_weights = nn.functional.dropout(attn_weights, p=dropout, training=module.training)112 attn_output = torch.matmul(attn_weights, value_states)113 attn_output = attn_output.transpose(1, 2).contiguous()114 115 return attn_output, attn_weights116 117 118def apply_rotary_pos_emb(q, k, cos, sin, position_ids=None, unsqueeze_dim=1):119 """Applies Rotary Position Embedding to the query and key tensors.120 121 Args:122 q (`torch.Tensor`): The query tensor.123 k (`torch.Tensor`): The key tensor.124 cos (`torch.Tensor`): The cosine part of the rotary embedding.125 sin (`torch.Tensor`): The sine part of the rotary embedding.126 position_ids (`torch.Tensor`, *optional*):127 Deprecated and unused.128 unsqueeze_dim (`int`, *optional*, defaults to 1):129 The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and130 sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note131 that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and132 k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes133 cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have134 the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.135 Returns:136 `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.137 """138 cos = cos.unsqueeze(unsqueeze_dim)139 sin = sin.unsqueeze(unsqueeze_dim)140 141 rotary_dim = cos.shape[-1]142 q_rot, q_pass = q[..., :rotary_dim], q[..., rotary_dim:]143 k_rot, k_pass = k[..., :rotary_dim], k[..., rotary_dim:]144 145 q_embed = torch.cat([(q_rot * cos) + (rotate_half(q_rot) * sin), q_pass], dim=-1)146 k_embed = torch.cat([(k_rot * cos) + (rotate_half(k_rot) * sin), k_pass], dim=-1)147 return q_embed, k_embed148 149 150class Phi3Attention(nn.Module):151 """Multi-headed attention from 'Attention Is All You Need' paper"""152 153 def __init__(self, config: Phi3Config, layer_idx: Optional[int] = None):154 super().__init__()155 self.config = config156 self.layer_idx = layer_idx157 self.head_dim = getattr(config, "head_dim", config.hidden_size // config.num_attention_heads)158 self.num_key_value_groups = config.num_attention_heads // config.num_key_value_heads159 self.num_key_value_heads = config.num_key_value_heads160 self.scaling = self.head_dim**-0.5161 self.attention_dropout = config.attention_dropout162 self.is_causal = True163 164 op_size = config.num_attention_heads * self.head_dim + 2 * (config.num_key_value_heads * self.head_dim)165 self.o_proj = nn.Linear(config.num_attention_heads * self.head_dim, config.hidden_size, bias=False)166 self.qkv_proj = nn.Linear(config.hidden_size, op_size, bias=False)167 168 def forward(169 self,170 hidden_states: torch.Tensor,171 position_embeddings: Tuple[torch.Tensor, torch.Tensor],172 attention_mask: Optional[torch.Tensor],173 past_key_value: Optional[Cache] = None,174 cache_position: Optional[torch.LongTensor] = None,175 **kwargs: Unpack[FlashAttentionKwargs],176 ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:177 input_shape = hidden_states.shape[:-1]178 hidden_shape = (*input_shape, -1, self.head_dim)179 180 qkv = self.qkv_proj(hidden_states)181 query_pos = self.config.num_attention_heads * self.head_dim182 query_states = qkv[..., :query_pos]183 key_states = qkv[..., query_pos : query_pos + self.num_key_value_heads * self.head_dim]184 value_states = qkv[..., query_pos + self.num_key_value_heads * self.head_dim :]185 186 query_states = query_states.view(hidden_shape).transpose(1, 2)187 key_states = key_states.view(hidden_shape).transpose(1, 2)188 value_states = value_states.view(hidden_shape).transpose(1, 2)189 190 cos, sin = position_embeddings191 query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)192 193 if past_key_value is not None:194 # sin and cos are specific to RoPE models; cache_position needed for the static cache195 cache_kwargs = {"sin": sin, "cos": cos, "cache_position": cache_position}196 key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)197 198 attention_interface: Callable = eager_attention_forward199 if self.config._attn_implementation != "eager":200 if self.config._attn_implementation == "sdpa" and kwargs.get("output_attentions", False):201 logger.warning_once(202 "`torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to "203 'eager attention. This warning can be removed using the argument `attn_implementation="eager"` when loading the model.'204 )205 else:206 attention_interface = ALL_ATTENTION_FUNCTIONS[self.config._attn_implementation]207 208 attn_output, attn_weights = attention_interface(209 self,210 query_states,211 key_states,212 value_states,213 attention_mask,214 dropout=0.0 if not self.training else self.attention_dropout,215 scaling=self.scaling,216 sliding_window=getattr(self.config, "sliding_window", None),217 **kwargs,218 )219 220 attn_output = attn_output.reshape(*input_shape, -1).contiguous()221 attn_output = self.o_proj(attn_output)222 return attn_output, attn_weights223 224 225class Phi3RMSNorm(nn.Module):226 def __init__(self, hidden_size, eps=1e-6):227 """228 Phi3RMSNorm is equivalent to T5LayerNorm229 """230 super().__init__()231 self.weight = nn.Parameter(torch.ones(hidden_size))232 self.variance_epsilon = eps233 234 def forward(self, hidden_states):235 input_dtype = hidden_states.dtype236 hidden_states = hidden_states.to(torch.float32)237 variance = hidden_states.pow(2).mean(-1, keepdim=True)238 hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)239 return self.weight * hidden_states.to(input_dtype)240 241 def extra_repr(self):242 return f"{tuple(self.weight.shape)}, eps={self.variance_epsilon}"243 244 245class Phi3DecoderLayer(nn.Module):246 def __init__(self, config: Phi3Config, layer_idx: int):247 super().__init__()248 self.hidden_size = config.hidden_size249 self.self_attn = Phi3Attention(config=config, layer_idx=layer_idx)250 self.mlp = Phi3MLP(config)251 self.input_layernorm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps)252 self.post_attention_layernorm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps)253 self.config = config254 self.resid_attn_dropout = nn.Dropout(config.resid_pdrop)255 self.resid_mlp_dropout = nn.Dropout(config.resid_pdrop)256 257 def forward(258 self,259 hidden_states: torch.Tensor,260 attention_mask: Optional[torch.Tensor] = None,261 position_ids: Optional[torch.LongTensor] = None,262 past_key_value: Optional[Cache] = None,263 output_attentions: Optional[bool] = False,264 use_cache: Optional[bool] = False,265 cache_position: Optional[torch.LongTensor] = None,266 position_embeddings: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, # necessary, but kept here for BC267 **kwargs: Unpack[FlashAttentionKwargs],268 ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]:269 """270 Args:271 hidden_states (`torch.FloatTensor`):272 input to the layer of shape `(batch, seq_len, embed_dim)`273 attention_mask (`torch.FloatTensor`, *optional*): attention mask of size274 `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.275 position_ids (`torch.LongTensor` of shape `({0})`, *optional*):276 Indices of positions of each input sequence tokens in the position embeddings. Selected in the range277 `[0, config.n_positions - 1]`. [What are position IDs?](../glossary#position-ids)278 past_key_value (`Cache`, *optional*): cached past key and value projection states279 output_attentions (`bool`, *optional*):280 Whether or not to return the attentions tensors of all attention layers. See `attentions` under281 returned tensors for more detail.282 use_cache (`bool`, *optional*):283 If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding284 (see `past_key_values`).285 cache_position (`torch.LongTensor` of shape `(sequence_length)`, *optional*):286 Indices depicting the position of the input sequence tokens in the sequence287 kwargs (`dict`, *optional*):288 Arbitrary kwargs to be ignored, used for FSDP and other methods that injects code289 into the model290 """291 residual = hidden_states292 293 hidden_states = self.input_layernorm(hidden_states)294 295 # Self Attention296 hidden_states, self_attn_weights = self.self_attn(297 hidden_states=hidden_states,298 attention_mask=attention_mask,299 position_ids=position_ids,300 past_key_value=past_key_value,301 output_attentions=output_attentions,302 use_cache=use_cache,303 cache_position=cache_position,304 position_embeddings=position_embeddings,305 **kwargs,306 )307 hidden_states = residual + self.resid_attn_dropout(hidden_states) # main diff with Llama308 309 residual = hidden_states310 hidden_states = self.post_attention_layernorm(hidden_states)311 hidden_states = self.mlp(hidden_states)312 hidden_states = residual + self.resid_mlp_dropout(hidden_states) # main diff with Llama313 314 outputs = (hidden_states,)315 if output_attentions:316 outputs += (self_attn_weights,)317 318 return outputs319 320 321class Phi3RotaryEmbedding(nn.Module):322 def __init__(self, config: Phi3Config, device=None):323 super().__init__()324 # BC: "rope_type" was originally "type"325 if hasattr(config, "rope_scaling") and config.rope_scaling is not None:326 self.rope_type = config.rope_scaling.get("rope_type", config.rope_scaling.get("type"))327 else:328 self.rope_type = "default"329 self.max_seq_len_cached = config.max_position_embeddings330 self.original_max_seq_len = config.max_position_embeddings331 332 self.config = config333 self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type]334 335 inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device)336 self.register_buffer("inv_freq", inv_freq, persistent=False)337 self.original_inv_freq = self.inv_freq338 339 def _dynamic_frequency_update(self, position_ids, device):340 """341 dynamic RoPE layers should recompute `inv_freq` in the following situations:342 1 - growing beyond the cached sequence length (allow scaling)343 2 - the current sequence length is in the original scale (avoid losing precision with small sequences)344 """345 seq_len = torch.max(position_ids) + 1346 if seq_len > self.max_seq_len_cached: # growth347 inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device, seq_len=seq_len)348 self.register_buffer("inv_freq", inv_freq, persistent=False) # TODO joao: may break with compilation349 self.max_seq_len_cached = seq_len350 351 if seq_len < self.original_max_seq_len and self.max_seq_len_cached > self.original_max_seq_len: # reset352 # This .to() is needed if the model has been moved to a device after being initialized (because353 # the buffer is automatically moved, but not the original copy)354 self.original_inv_freq = self.original_inv_freq.to(device)355 self.register_buffer("inv_freq", self.original_inv_freq, persistent=False)356 self.max_seq_len_cached = self.original_max_seq_len357 358 @torch.no_grad()359 def forward(self, x, position_ids):360 if "dynamic" in self.rope_type:361 self._dynamic_frequency_update(position_ids, device=x.device)362 elif self.rope_type == "longrope":363 self._longrope_frequency_update(position_ids, device=x.device)364 365 # Core RoPE block366 inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1)367 position_ids_expanded = position_ids[:, None, :].float()368 # Force float32 (see https://github.com/huggingface/transformers/pull/29285)369 device_type = x.device.type370 device_type = device_type if isinstance(device_type, str) and device_type != "mps" else "cpu"371 with torch.autocast(device_type=device_type, enabled=False):372 freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)373 emb = torch.cat((freqs, freqs), dim=-1)374 cos = emb.cos()375 sin = emb.sin()376 377 # Advanced RoPE types (e.g. yarn) apply a post-processing scaling factor, equivalent to scaling attention378 cos = cos * self.attention_scaling379 sin = sin * self.attention_scaling380 381 return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype)382 383 def _longrope_frequency_update(self, position_ids, device):384 """Longrope uses long factor if sequence is larger than original pretraining length, short otherwise."""385 seq_len = torch.max(position_ids) + 1386 if hasattr(self.config, "original_max_position_embeddings"):387 original_max_position_embeddings = self.config.original_max_position_embeddings388 else:389 original_max_position_embeddings = self.config.max_position_embeddings390 if seq_len > original_max_position_embeddings:391 if not hasattr(self, "long_inv_freq"):392 self.long_inv_freq, _ = self.rope_init_fn(393 self.config, device, seq_len=original_max_position_embeddings + 1394 )395 self.register_buffer("inv_freq", self.long_inv_freq, persistent=False)396 else:397 # This .to() is needed if the model has been moved to a device after being initialized (because398 # the buffer is automatically moved, but not the original copy)399 self.original_inv_freq = self.original_inv_freq.to(device)400 self.register_buffer("inv_freq", self.original_inv_freq, persistent=False)401 402 403PHI3_START_DOCSTRING = r"""404 This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the405 library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads406 etc.)407 408 This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass.409 Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage410 and behavior.411 412 Parameters:413 config ([`Phi3Config`]):414 Model configuration class with all the parameters of the model. Initializing with a config file does not415 load the weights associated with the model, only the configuration. Check out the416 [`~PreTrainedModel.from_pretrained`] method to load the model weights.417"""418 419 420@add_start_docstrings(421 "The bare Phi3 Model outputting raw hidden-states without any specific head on top.",422 PHI3_START_DOCSTRING,423)424class Phi3PreTrainedModel(PreTrainedModel):425 config_class = Phi3Config426 base_model_prefix = "model"427 supports_gradient_checkpointing = True428 _no_split_modules = ["Phi3DecoderLayer"]429 _skip_keys_device_placement = ["past_key_values"]430 _supports_flash_attn_2 = True431 _supports_sdpa = True432 _supports_flex_attn = True433 _supports_cache_class = True434 _supports_quantized_cache = True435 _supports_static_cache = True436 _supports_attention_backend = True437 _version = "0.0.5"438 439 def _init_weights(self, module):440 std = self.config.initializer_range441 if isinstance(module, nn.Linear):442 module.weight.data.normal_(mean=0.0, std=std)443 if module.bias is not None:444 module.bias.data.zero_()445 elif isinstance(module, nn.Embedding):446 module.weight.data.normal_(mean=0.0, std=std)447 if module.padding_idx is not None:448 module.weight.data[module.padding_idx].zero_()449 450 451PHI3_INPUTS_DOCSTRING = r"""452 Args:453 input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):454 Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide455 it.456 457 Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and458 [`PreTrainedTokenizer.__call__`] for details.459 460 [What are input IDs?](../glossary#input-ids)461 attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):462 Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:463 464 - 1 for tokens that are **not masked**,465 - 0 for tokens that are **masked**.466 467 [What are attention masks?](../glossary#attention-mask)468 469 Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and470 [`PreTrainedTokenizer.__call__`] for details.471 472 If `past_key_values` is used, optionally only the last `input_ids` have to be input (see473 `past_key_values`).474 475 If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`]476 and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more477 information on the default strategy.478 479 - 1 indicates the head is **not masked**,480 - 0 indicates the head is **masked**.481 position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):482 Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,483 config.n_positions - 1]`.484 485 [What are position IDs?](../glossary#position-ids)486 past_key_values (`Cache` or `tuple(tuple(torch.FloatTensor))`, *optional*):487 Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention488 blocks) that can be used to speed up sequential decoding. This typically consists in the `past_key_values`489 returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.490 491 Two formats are allowed:492 - a [`~cache_utils.Cache`] instance, see our493 [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache);494 - Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of495 shape `(batch_size, num_heads, sequence_length, embed_size_per_head)`). This is also known as the legacy496 cache format.497 498 The model will output the same cache format that is fed as input. If no `past_key_values` are passed, the499 legacy cache format will be returned.500 501 If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't502 have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids`503 of shape `(batch_size, sequence_length)`.504 inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*):505 Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This506 is useful if you want more control over how to convert `input_ids` indices into associated vectors than the507 model's internal embedding lookup matrix.508 use_cache (`bool`, *optional*):509 If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see510 `past_key_values`).511 output_attentions (`bool`, *optional*):512 Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned513 tensors for more detail.514 output_hidden_states (`bool`, *optional*):515 Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for516 more detail.517 return_dict (`bool`, *optional*):518 Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.519 cache_position (`torch.LongTensor` of shape `(sequence_length)`, *optional*):520 Indices depicting the position of the input sequence tokens in the sequence. Contrarily to `position_ids`,521 this tensor is not affected by padding. It is used to update the cache in the correct position and to infer522 the complete sequence length.523"""524 525 526@add_start_docstrings(527 "The bare Phi3 Model outputting raw hidden-states without any specific head on top.",528 PHI3_START_DOCSTRING,529)530class Phi3Model(Phi3PreTrainedModel):531 """532 Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`Phi3DecoderLayer`]533 534 Args:535 config: Phi3Config536 """537 538 def __init__(self, config: Phi3Config):539 super().__init__(config)540 self.padding_idx = config.pad_token_id541 self.vocab_size = config.vocab_size542 543 self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)544 self.layers = nn.ModuleList(545 [Phi3DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]546 )547 self.norm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps)548 self.rotary_emb = Phi3RotaryEmbedding(config=config)549 self.gradient_checkpointing = False550 551 # Initialize weights and apply final processing552 self.post_init()553 554 def get_input_embeddings(self):555 return self.embed_tokens556 557 def set_input_embeddings(self, value):558 self.embed_tokens = value559 560 @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING)561 def forward(562 self,563 input_ids: torch.LongTensor = None,564 attention_mask: Optional[torch.Tensor] = None,565 position_ids: Optional[torch.LongTensor] = None,566 past_key_values: Optional[Cache] = None,567 inputs_embeds: Optional[torch.FloatTensor] = None,568 use_cache: Optional[bool] = None,569 output_attentions: Optional[bool] = None,570 output_hidden_states: Optional[bool] = None,571 return_dict: Optional[bool] = None,572 cache_position: Optional[torch.LongTensor] = None,573 **flash_attn_kwargs: Unpack[FlashAttentionKwargs],574 ) -> Union[Tuple, BaseModelOutputWithPast]:575 output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions576 output_hidden_states = (577 output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states578 )579 use_cache = use_cache if use_cache is not None else self.config.use_cache580 return_dict = return_dict if return_dict is not None else self.config.use_return_dict581 582 if (input_ids is None) ^ (inputs_embeds is not None):583 raise ValueError("You must specify exactly one of input_ids or inputs_embeds")584 585 if self.gradient_checkpointing and self.training and use_cache:586 logger.warning_once(587 "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`."588 )589 use_cache = False590 591 if inputs_embeds is None:592 inputs_embeds = self.embed_tokens(input_ids)593 594 if use_cache and past_key_values is None:595 past_key_values = DynamicCache()596 597 if cache_position is None:598 past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0599 cache_position = torch.arange(600 past_seen_tokens, past_seen_tokens + inputs_embeds.shape[1], device=inputs_embeds.device601 )602 603 if position_ids is None:604 position_ids = cache_position.unsqueeze(0)605 606 causal_mask = self._update_causal_mask(607 attention_mask, inputs_embeds, cache_position, past_key_values, output_attentions608 )609 610 hidden_states = inputs_embeds611 612 # create position embeddings to be shared across the decoder layers613 position_embeddings = self.rotary_emb(hidden_states, position_ids)614 615 # decoder layers616 all_hidden_states = () if output_hidden_states else None617 all_self_attns = () if output_attentions else None618 619 for decoder_layer in self.layers[: self.config.num_hidden_layers]:620 if output_hidden_states:621 all_hidden_states += (hidden_states,)622 623 if self.gradient_checkpointing and self.training:624 layer_outputs = self._gradient_checkpointing_func(625 decoder_layer.__call__,626 hidden_states,627 causal_mask,628 position_ids,629 past_key_values,630 output_attentions,631 use_cache,632 cache_position,633 position_embeddings,634 )635 else:636 layer_outputs = decoder_layer(637 hidden_states,638 attention_mask=causal_mask,639 position_ids=position_ids,640 past_key_value=past_key_values,641 output_attentions=output_attentions,642 use_cache=use_cache,643 cache_position=cache_position,644 position_embeddings=position_embeddings,645 **flash_attn_kwargs,646 )647 648 hidden_states = layer_outputs[0]649 650 if output_attentions:651 all_self_attns += (layer_outputs[1],)652 653 hidden_states = self.norm(hidden_states)654 655 # add hidden states from the last decoder layer656 if output_hidden_states:657 all_hidden_states += (hidden_states,)658 659 output = BaseModelOutputWithPast(660 last_hidden_state=hidden_states,661 past_key_values=past_key_values if use_cache else None,662 hidden_states=all_hidden_states,663 attentions=all_self_attns,664 )665 return output if return_dict else output.to_tuple()666 667 def _update_causal_mask(668 self,669 attention_mask: torch.Tensor,670 input_tensor: torch.Tensor,671 cache_position: torch.Tensor,672 past_key_values: Cache,673 output_attentions: bool,674 ):675 if self.config._attn_implementation == "flash_attention_2":676 if attention_mask is not None and past_key_values is not None:677 is_padding_right = attention_mask[:, -1].sum().item() != input_tensor.size()[0]678 if is_padding_right:679 raise ValueError(680 "You are attempting to perform batched generation with padding_side='right'"681 " this may lead to unexpected behaviour for Flash Attention version of Phi3. Make sure to "682 " call `tokenizer.padding_side = 'left'` before tokenizing the input. "683 )684 if attention_mask is not None and 0.0 in attention_mask:685 return attention_mask686 return None687 688 # For SDPA, when possible, we will rely on its `is_causal` argument instead of its `attn_mask` argument, in689 # order to dispatch on Flash Attention 2. This feature is not compatible with static cache, as SDPA will fail690 # to infer the attention mask.691 past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0692 using_static_cache = isinstance(past_key_values, StaticCache)693 using_sliding_window_cache = isinstance(past_key_values, SlidingWindowCache)694 695 # When output attentions is True, sdpa implementation's forward method calls the eager implementation's forward696 if (697 self.config._attn_implementation == "sdpa"698 and not (using_static_cache or using_sliding_window_cache)699 and not output_attentions700 ):701 if AttentionMaskConverter._ignore_causal_mask_sdpa(702 attention_mask,703 inputs_embeds=input_tensor,704 past_key_values_length=past_seen_tokens,705 sliding_window=self.config.sliding_window,706 is_training=self.training,707 ):708 return None709 710 dtype, device = input_tensor.dtype, input_tensor.device711 min_dtype = torch.finfo(dtype).min712 sequence_length = input_tensor.shape[1]713 # SlidingWindowCache or StaticCache714 if using_sliding_window_cache or using_static_cache:715 target_length = past_key_values.get_max_cache_shape()716 # DynamicCache or no cache717 else:718 target_length = (719 attention_mask.shape[-1]720 if isinstance(attention_mask, torch.Tensor)721 else past_seen_tokens + sequence_length + 1722 )723 724 # In case the provided `attention` mask is 2D, we generate a causal mask here (4D).725 causal_mask = self._prepare_4d_causal_attention_mask_with_cache_position(726 attention_mask,727 sequence_length=sequence_length,728 target_length=target_length,729 dtype=dtype,730 device=device,731 cache_position=cache_position,732 batch_size=input_tensor.shape[0],733 config=self.config,734 past_key_values=past_key_values,735 )736 737 if (738 self.config._attn_implementation == "sdpa"739 and attention_mask is not None740 and attention_mask.device.type in ["cuda", "xpu"]741 and not output_attentions742 ):743 # Attend to all tokens in fully masked rows in the causal_mask, for example the relevant first rows when744 # using left padding. This is required by F.scaled_dot_product_attention memory-efficient attention path.745 # Details: https://github.com/pytorch/pytorch/issues/110213746 causal_mask = AttentionMaskConverter._unmask_unattended(causal_mask, min_dtype)747 748 return causal_mask749 750 @staticmethod751 def _prepare_4d_causal_attention_mask_with_cache_position(752 attention_mask: torch.Tensor,753 sequence_length: int,754 target_length: int,755 dtype: torch.dtype,756 device: torch.device,757 cache_position: torch.Tensor,758 batch_size: int,759 config: Phi3Config,760 past_key_values: Cache,761 ):762 """763 Creates a causal 4D mask of shape `(batch_size, 1, query_length, key_value_length)` from a 2D mask of shape764 `(batch_size, key_value_length)`, or if the input `attention_mask` is already 4D, do nothing.765 766 Args:767 attention_mask (`torch.Tensor`):768 A 2D attention mask of shape `(batch_size, key_value_length)` or a 4D attention mask of shape `(batch_size, 1, query_length, key_value_length)`.769 sequence_length (`int`):770 The sequence length being processed.771 target_length (`int`):772 The target length: when generating with static cache, the mask should be as long as the static cache, to account for the 0 padding, the part of the cache that is not filled yet.773 dtype (`torch.dtype`):774 The dtype to use for the 4D attention mask.775 device (`torch.device`):776 The device to plcae the 4D attention mask on.777 cache_position (`torch.Tensor`):778 Indices depicting the position of the input sequence tokens in the sequence.779 batch_size (`torch.Tensor`):780 Batch size.781 config (`Phi3Config`):782 The model's configuration class783 past_key_values (`Cache`):784 The cache class that is being used currently to generate785 """786 if attention_mask is not None and attention_mask.dim() == 4:787 # In this case we assume that the mask comes already in inverted form and requires no inversion or slicing.788 causal_mask = attention_mask789 else:790 min_dtype = torch.finfo(dtype).min791 causal_mask = torch.full(792 (sequence_length, target_length), fill_value=min_dtype, dtype=dtype, device=device793 )794 diagonal_attend_mask = torch.arange(target_length, device=device) > cache_position.reshape(-1, 1)795 if config.sliding_window is not None:796 # if we have sliding window, we should not attend to tokens beyond sliding window length, so we mask them out also797 # the check is needed to verify is current checkpoint was trained with sliding window or not798 if not isinstance(past_key_values, SlidingWindowCache) or sequence_length > target_length:799 sliding_attend_mask = torch.arange(target_length, device=device) <= (800 cache_position.reshape(-1, 1) - config.sliding_window801 )802 diagonal_attend_mask.bitwise_or_(sliding_attend_mask)803 causal_mask *= diagonal_attend_mask804 causal_mask = causal_mask[None, None, :, :].expand(batch_size, 1, -1, -1)805 if attention_mask is not None:806 causal_mask = causal_mask.clone() # copy to contiguous memory for in-place edit807 if attention_mask.shape[-1] > target_length:808 attention_mask = attention_mask[:, :target_length]809 mask_length = attention_mask.shape[-1]810 padding_mask = causal_mask[:, :, :, :mask_length] + attention_mask[:, None, None, :].to(811 causal_mask.device812 )813 padding_mask = padding_mask == 0814 causal_mask[:, :, :, :mask_length] = causal_mask[:, :, :, :mask_length].masked_fill(815 padding_mask, min_dtype816 )817 return causal_mask818 819 820class KwargsForCausalLM(FlashAttentionKwargs, LossKwargs): ...821 822 823class Phi3ForCausalLM(Phi3PreTrainedModel, GenerationMixin):824 _tied_weights_keys = ["lm_head.weight"]825 _tp_plan = {"lm_head": "colwise_rep"}826 _pp_plan = {"lm_head": (["hidden_states"], ["logits"])}827 828 def __init__(self, config):829 super().__init__(config)830 self.model = Phi3Model(config)831 self.vocab_size = config.vocab_size832 self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)833 834 # Initialize weights and apply final processing835 self.post_init()836 837 def get_input_embeddings(self):838 return self.model.embed_tokens839 840 def set_input_embeddings(self, value):841 self.model.embed_tokens = value842 843 def get_output_embeddings(self):844 return self.lm_head845 846 def set_output_embeddings(self, new_embeddings):847 self.lm_head = new_embeddings848 849 def set_decoder(self, decoder):850 self.model = decoder851 852 def get_decoder(self):853 return self.model854 855 @deprecate_kwarg("num_logits_to_keep", version="4.50", new_name="logits_to_keep")856 @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING)857 @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC)858 def forward(859 self,860 input_ids: torch.LongTensor = None,861 attention_mask: Optional[torch.Tensor] = None,862 position_ids: Optional[torch.LongTensor] = None,863 past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,864 inputs_embeds: Optional[torch.FloatTensor] = None,865 labels: Optional[torch.LongTensor] = None,866 use_cache: Optional[bool] = None,867 output_attentions: Optional[bool] = None,868 output_hidden_states: Optional[bool] = None,869 return_dict: Optional[bool] = None,870 cache_position: Optional[torch.LongTensor] = None,871 logits_to_keep: Union[int, torch.Tensor] = 0,872 **kwargs: Unpack[KwargsForCausalLM],873 ) -> Union[Tuple, CausalLMOutputWithPast]:874 r"""875 Args:876 labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):877 Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,878 config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored879 (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.880 881 logits_to_keep (`int` or `torch.Tensor`, *optional*):882 If an `int`, compute logits for the last `logits_to_keep` tokens. If `0`, calculate logits for all883 `input_ids` (special case). Only last token logits are needed for generation, and calculating them only for that884 token can save memory, which becomes pretty significant for long sequences or large vocabulary size.885 If a `torch.Tensor`, must be 1D corresponding to the indices to keep in the sequence length dimension.886 This is useful when using packed tensor format (single dimension for batch and sequence length).887 888 Returns:889 890 Example:891 892 ```python893 >>> from transformers import AutoTokenizer, Phi3ForCausalLM894 895 >>> model = Phi3ForCausalLM.from_pretrained("meta-phi3/Phi3-2-7b-hf")896 >>> tokenizer = AutoTokenizer.from_pretrained("meta-phi3/Phi3-2-7b-hf")897 898 >>> prompt = "Hey, are you conscious? Can you talk to me?"899 >>> inputs = tokenizer(prompt, return_tensors="pt")900 901 >>> # Generate902 >>> generate_ids = model.generate(inputs.input_ids, max_length=30)903 >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]904 "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."905 ```"""906 output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions907 output_hidden_states = (908 output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states909 )910 return_dict = return_dict if return_dict is not None else self.config.use_return_dict911 912 # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn)913 outputs = self.model(914 input_ids=input_ids,915 attention_mask=attention_mask,916 position_ids=position_ids,917 past_key_values=past_key_values,918 inputs_embeds=inputs_embeds,919 use_cache=use_cache,920 output_attentions=output_attentions,921 output_hidden_states=output_hidden_states,922 return_dict=return_dict,923 cache_position=cache_position,924 **kwargs,925 )926 927 hidden_states = outputs[0]928 # Only compute necessary logits, and do not upcast them to float if we are not computing the loss929 slice_indices = slice(-logits_to_keep, None) if isinstance(logits_to_keep, int) else logits_to_keep930 logits = self.lm_head(hidden_states[:, slice_indices, :])931 932 loss = None933 if labels is not None:934 loss = self.loss_function(logits=logits, labels=labels, vocab_size=self.config.vocab_size, **kwargs)935 936 if not return_dict:937 output = (logits,) + outputs[1:]938 return (loss,) + output if loss is not None else output939 940 return CausalLMOutputWithPast(941 loss=loss,942 logits=logits,943 past_key_values=outputs.past_key_values,944 hidden_states=outputs.hidden_states,945 attentions=outputs.attentions,946 )947 948 def prepare_inputs_for_generation(949 self,950 input_ids,951 past_key_values=None,952 attention_mask=None,953 inputs_embeds=None,954 cache_position=None,955 position_ids=None,956 use_cache=True,957 logits_to_keep=None,958 **kwargs,959 ):960 # Overwritten -- this model may need to switch between short and long rope, invalidating the cache in the961 # process962 963 # When the first time input length reached long and short factor switching point, enforce re-compute cache964 # It will cause downside of slower at this single token position, however, better than current failure.965 if (966 past_key_values967 and self.config.rope_scaling968 and input_ids.shape[1] >= self.config.original_max_position_embeddings + 1969 ):970 past_length = cache_position[0]971 if past_length <= self.config.original_max_position_embeddings:972 past_key_values = None973 974 model_inputs = super().prepare_inputs_for_generation(975 input_ids=input_ids,976 past_key_values=past_key_values,977 attention_mask=attention_mask,978 inputs_embeds=inputs_embeds,979 cache_position=cache_position,980 position_ids=position_ids,981 use_cache=use_cache,982 logits_to_keep=logits_to_keep,983 **kwargs,984 )985 return model_inputs986 987 988@add_start_docstrings(989 """990 The Phi3 Model transformer with a sequence classification head on top (linear layer).991 992 [`Phi3ForSequenceClassification`] uses the last token in order to do the classification, as other causal models993 (e.g. GPT-2) do.994 995 Since it does classification on the last token, it requires to know the position of the last token. If a996 `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If997 no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the998 padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in999 each row of the batch).1000 """,1001 PHI3_START_DOCSTRING,1002)1003class Phi3ForSequenceClassification(Phi3PreTrainedModel):1004 def __init__(self, config):1005 super().__init__(config)1006 self.num_labels = config.num_labels1007 self.model = Phi3Model(config)1008 self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False)1009 1010 # Initialize weights and apply final processing1011 self.post_init()1012 1013 def get_input_embeddings(self):1014 return self.model.embed_tokens1015 1016 def set_input_embeddings(self, value):1017 self.model.embed_tokens = value1018 1019 @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING)1020 def forward(1021 self,1022 input_ids: Optional[torch.LongTensor] = None,1023 attention_mask: Optional[torch.Tensor] = None,1024 position_ids: Optional[torch.LongTensor] = None,1025 past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,1026 inputs_embeds: Optional[torch.FloatTensor] = None,1027 labels: Optional[torch.LongTensor] = None,1028 use_cache: Optional[bool] = None,1029 output_attentions: Optional[bool] = None,1030 output_hidden_states: Optional[bool] = None,1031 return_dict: Optional[bool] = None,1032 ) -> Union[Tuple, SequenceClassifierOutputWithPast]:1033 r"""1034 labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):1035 Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,1036 config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If1037 `config.num_labels > 1` a classification loss is computed (Cross-Entropy).1038 """1039 return_dict = return_dict if return_dict is not None else self.config.use_return_dict1040 1041 transformer_outputs = self.model(1042 input_ids,1043 attention_mask=attention_mask,1044 position_ids=position_ids,1045 past_key_values=past_key_values,1046 inputs_embeds=inputs_embeds,1047 use_cache=use_cache,1048 output_attentions=output_attentions,1049 output_hidden_states=output_hidden_states,1050 return_dict=return_dict,1051 )1052 hidden_states = transformer_outputs[0]1053 logits = self.score(hidden_states)1054 1055 if input_ids is not None:1056 batch_size = input_ids.shape[0]1057 else:1058 batch_size = inputs_embeds.shape[0]1059 1060 if self.config.pad_token_id is None and batch_size != 1:1061 raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.")1062 if self.config.pad_token_id is None:1063 last_non_pad_token = -11064 elif input_ids is not None:1065 # To handle both left- and right- padding, we take the rightmost token that is not equal to pad_token_id1066 non_pad_mask = (input_ids != self.config.pad_token_id).to(logits.device, torch.int32)1067 token_indices = torch.arange(input_ids.shape[-1], device=logits.device)1068 last_non_pad_token = (token_indices * non_pad_mask).argmax(-1)1069 else:1070 last_non_pad_token = -11071 logger.warning_once(1072 f"{self.__class__.__name__} will not detect padding tokens in `inputs_embeds`. Results may be "1073 "unexpected if using padding tokens in conjunction with `inputs_embeds.`"1074 )1075 1076 pooled_logits = logits[torch.arange(batch_size, device=logits.device), last_non_pad_token]1077 1078 loss = None1079 if labels is not None:1080 loss = self.loss_function(logits=logits, labels=labels, pooled_logits=pooled_logits, config=self.config)1081 1082 if not return_dict:1083 output = (pooled_logits,) + transformer_outputs[1:]1084 return ((loss,) + output) if loss is not None else output1085 1086 return SequenceClassifierOutputWithPast(1087 loss=loss,1088 logits=pooled_logits,1089 past_key_values=transformer_outputs.past_key_values,1090 hidden_states=transformer_outputs.hidden_states,1091 attentions=transformer_outputs.attentions,1092 )1093 1094 1095@add_start_docstrings(1096 """1097 The Phi3 Model transformer with a token classification head on top (a linear layer on top of the hidden-states1098 output) e.g. for Named-Entity-Recognition (NER) tasks.1099 """,1100 PHI3_START_DOCSTRING,1101)1102class Phi3ForTokenClassification(Phi3PreTrainedModel):1103 def __init__(self, config):1104 super().__init__(config)1105 self.num_labels = config.num_labels1106 self.model = Phi3Model(config)1107 if getattr(config, "classifier_dropout", None) is not None:1108 classifier_dropout = config.classifier_dropout1109 elif getattr(config, "hidden_dropout", None) is not None:1110 classifier_dropout = config.hidden_dropout1111 else:1112 classifier_dropout = 0.11113 self.dropout = nn.Dropout(classifier_dropout)1114 self.score = nn.Linear(config.hidden_size, config.num_labels)1115 1116 # Initialize weights and apply final processing1117 self.post_init()1118 1119 def get_input_embeddings(self):1120 return self.model.embed_tokens1121 1122 def set_input_embeddings(self, value):1123 self.model.embed_tokens = value1124 1125 @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING)1126 @add_code_sample_docstrings(1127 checkpoint=_CHECKPOINT_FOR_DOC,1128 output_type=TokenClassifierOutput,1129 config_class=_CONFIG_FOR_DOC,1130 )1131 def forward(1132 self,1133 input_ids: Optional[torch.LongTensor] = None,1134 attention_mask: Optional[torch.Tensor] = None,1135 position_ids: Optional[torch.LongTensor] = None,1136 past_key_values: Optional[List[torch.FloatTensor]] = None,1137 inputs_embeds: Optional[torch.FloatTensor] = None,1138 labels: Optional[torch.LongTensor] = None,1139 use_cache: Optional[bool] = None,1140 output_attentions: Optional[bool] = None,1141 output_hidden_states: Optional[bool] = None,1142 return_dict: Optional[bool] = None,1143 ) -> Union[Tuple, TokenClassifierOutput]:1144 r"""1145 labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):1146 Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,1147 config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If1148 `config.num_labels > 1` a classification loss is computed (Cross-Entropy).1149 """1150 return_dict = return_dict if return_dict is not None else self.config.use_return_dict1151 1152 outputs = self.model(1153 input_ids,1154 attention_mask=attention_mask,1155 position_ids=position_ids,1156 past_key_values=past_key_values,1157 inputs_embeds=inputs_embeds,1158 use_cache=use_cache,1159 output_attentions=output_attentions,1160 output_hidden_states=output_hidden_states,1161 return_dict=return_dict,1162 )1163 sequence_output = outputs[0]1164 sequence_output = self.dropout(sequence_output)1165 logits = self.score(sequence_output)1166 1167 loss = None1168 if labels is not None:1169 loss = self.loss_function(logits, labels, self.config)1170 1171 if not return_dict:1172 output = (logits,) + outputs[2:]1173 return ((loss,) + output) if loss is not None else output1174 1175 return TokenClassifierOutput(1176 loss=loss,1177 logits=logits,1178 hidden_states=outputs.hidden_states,1179 attentions=outputs.attentions,1180 )1181 