hvai/sdset
Stable Difusion store for learner get files
1596
1# coding=utf-8
2# 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 at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# 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 and
14# limitations under the License.
15
16""" PyTorch Phi-3 model."""
17
18import inspect
19import math
20import warnings
21from typing import List, Optional, Tuple, Union
22
23import torch
24import torch.nn.functional as F
25import torch.utils.checkpoint
26from torch import nn
27from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss
28
29from transformers.activations import ACT2FN
30from transformers.cache_utils import Cache, DynamicCache
31from transformers.modeling_attn_mask_utils import _prepare_4d_causal_attention_mask
32from transformers.modeling_outputs import (
33 BaseModelOutputWithPast,
34 CausalLMOutputWithPast,
35 SequenceClassifierOutputWithPast,
36 TokenClassifierOutput,
37)
38from transformers.modeling_utils import PreTrainedModel
39from transformers.utils import (
40 add_code_sample_docstrings,
41 add_start_docstrings,
42 add_start_docstrings_to_model_forward,
43 is_flash_attn_2_available,
44 is_flash_attn_greater_or_equal_2_10,
45 logging,
46 replace_return_docstrings,
47)
48from .configuration_phi3 import Phi3Config
49
50
51logger = logging.get_logger(__name__)
52
53# Transformers scans dependencies in the modeling file, causing issues on conditional loading. The regex only ignores try/catch blocks, but not if statements
54# if is_flash_attn_2_available():
55_flash_supports_window_size = False
56try:
57 from flash_attn import flash_attn_func, flash_attn_varlen_func
58 from flash_attn.bert_padding import index_first_axis, pad_input, unpad_input # noqa
59
60 _flash_supports_window_size = "window_size" in list(inspect.signature(flash_attn_func).parameters)
61except ImportError as error:
62 logger.warning(
63 f"`flash-attention` package not found, consider installing for better performance: {error}."
64 )
65 if not _flash_supports_window_size:
66 logger.warning(
67 "Current `flash-attention` does not support `window_size`. Either upgrade or use `attn_implementation='eager'`."
68 )
69
70_CHECKPOINT_FOR_DOC = "microsoft/Phi-3-mini-4k-instruct"
71_CONFIG_FOR_DOC = "Phi3Config"
72
73PHI3_PRETRAINED_MODEL_ARCHIVE_LIST = [
74 "microsoft/Phi-3-mini-4k-instruct",
75 "microsoft/Phi-3-mini-128k-instruct",
76 # See all Phi-3 models at https://huggingface.co/models?filter=Phi-3
77]
78
79
80# Copied from transformers.models.llama.modeling_llama.LlamaRMSNorm with Llama->Phi3
81class Phi3RMSNorm(nn.Module):
82 def __init__(self, hidden_size, eps=1e-6):
83 """
84 Phi3RMSNorm is equivalent to T5LayerNorm
85 """
86 super().__init__()
87 self.weight = nn.Parameter(torch.ones(hidden_size))
88 self.variance_epsilon = eps
89
90 def forward(self, hidden_states):
91 input_dtype = hidden_states.dtype
92 hidden_states = hidden_states.to(torch.float32)
93 variance = hidden_states.pow(2).mean(-1, keepdim=True)
94 hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
95 return self.weight * hidden_states.to(input_dtype)
96
97
98# Copied from transformers.models.llama.modeling_llama._get_unpad_data
99def _get_unpad_data(attention_mask):
100 seqlens_in_batch = attention_mask.sum(dim=-1, dtype=torch.int32)
101 indices = torch.nonzero(attention_mask.flatten(), as_tuple=False).flatten()
102 max_seqlen_in_batch = seqlens_in_batch.max().item()
103 cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.int32), (1, 0))
104 return (
105 indices,
106 cu_seqlens,
107 max_seqlen_in_batch,
108 )
109
110
111# Copied from transformers.models.gemma.modeling_gemma.GemmaRotaryEmbedding with gemma->phi3, Gemma->Phi3
112class Phi3RotaryEmbedding(nn.Module):
113 def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None):
114 super().__init__()
115
116 self.dim = dim
117 self.max_position_embeddings = max_position_embeddings
118 self.base = base
119 self.register_buffer("inv_freq", None, persistent=False)
120
121 @torch.no_grad()
122 def forward(self, x, position_ids, seq_len=None):
123 # x: [bs, num_attention_heads, seq_len, head_size]
124 if self.inv_freq is None:
125 self.inv_freq = 1.0 / (
126 self.base ** (torch.arange(0, self.dim, 2, dtype=torch.int64, device=x.device).float() / self.dim)
127 )
128 inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1)
129 position_ids_expanded = position_ids[:, None, :].float()
130 # Force float32 since bfloat16 loses precision on long contexts
131 # See https://github.com/huggingface/transformers/pull/29285
132 device_type = x.device.type
133 device_type = device_type if isinstance(device_type, str) and device_type != "mps" else "cpu"
134 with torch.autocast(device_type=device_type, enabled=False):
135 freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)
136 emb = torch.cat((freqs, freqs), dim=-1)
137 cos = emb.cos()
138 sin = emb.sin()
139 return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype)
140
141
142class Phi3LongRoPEScaledRotaryEmbedding(Phi3RotaryEmbedding):
143 def __init__(self, dim, config, device=None):
144 super().__init__(dim, config.max_position_embeddings, config.rope_theta, device)
145
146 self.short_factor = config.rope_scaling["short_factor"]
147 self.long_factor = config.rope_scaling["long_factor"]
148 self.original_max_position_embeddings = config.original_max_position_embeddings
149
150 @torch.no_grad()
151 def forward(self, x, position_ids, seq_len=None):
152 seq_len = seq_len or torch.max(position_ids) + 1
153 if seq_len > self.original_max_position_embeddings:
154 ext_factors = torch.tensor(self.long_factor, dtype=torch.float32, device=x.device)
155 else:
156 ext_factors = torch.tensor(self.short_factor, dtype=torch.float32, device=x.device)
157
158 inv_freq_shape = torch.arange(0, self.dim, 2, dtype=torch.int64, device=x.device).float() / self.dim
159 self.inv_freq = 1.0 / (ext_factors * self.base**inv_freq_shape)
160
161 inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1)
162 position_ids_expanded = position_ids[:, None, :].float()
163
164 # Force float32 since bfloat16 loses precision on long contexts
165 # See https://github.com/huggingface/transformers/pull/29285
166 device_type = x.device.type
167 device_type = device_type if isinstance(device_type, str) and device_type != "mps" else "cpu"
168 with torch.autocast(device_type=device_type, enabled=False):
169 freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)
170 emb = torch.cat((freqs, freqs), dim=-1)
171
172 scale = self.max_position_embeddings / self.original_max_position_embeddings
173 if scale <= 1.0:
174 scaling_factor = 1.0
175 else:
176 scaling_factor = math.sqrt(1 + math.log(scale) / math.log(self.original_max_position_embeddings))
177
178 cos = emb.cos() * scaling_factor
179 sin = emb.sin() * scaling_factor
180 return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype)
181
182
183# Copied from transformers.models.llama.modeling_llama.rotate_half
184def rotate_half(x):
185 """Rotates half the hidden dims of the input."""
186 x1 = x[..., : x.shape[-1] // 2]
187 x2 = x[..., x.shape[-1] // 2 :]
188 return torch.cat((-x2, x1), dim=-1)
189
190
191# Copied from transformers.models.llama.modeling_llama.apply_rotary_pos_emb
192def apply_rotary_pos_emb(q, k, cos, sin, position_ids=None, unsqueeze_dim=1):
193 """Applies Rotary Position Embedding to the query and key tensors.
194
195 Args:
196 q (`torch.Tensor`): The query tensor.
197 k (`torch.Tensor`): The key tensor.
198 cos (`torch.Tensor`): The cosine part of the rotary embedding.
199 sin (`torch.Tensor`): The sine part of the rotary embedding.
200 position_ids (`torch.Tensor`, *optional*):
201 Deprecated and unused.
202 unsqueeze_dim (`int`, *optional*, defaults to 1):
203 The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and
204 sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note
205 that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and
206 k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes
207 cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have
208 the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.
209 Returns:
210 `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.
211 """
212 cos = cos.unsqueeze(unsqueeze_dim)
213 sin = sin.unsqueeze(unsqueeze_dim)
214 q_embed = (q * cos) + (rotate_half(q) * sin)
215 k_embed = (k * cos) + (rotate_half(k) * sin)
216 return q_embed, k_embed
217
218
219class Phi3MLP(nn.Module):
220 def __init__(self, config):
221 super().__init__()
222
223 self.config = config
224 self.gate_up_proj = nn.Linear(config.hidden_size, 2 * config.intermediate_size, bias=False)
225 self.down_proj = nn.Linear(config.intermediate_size, config.hidden_size, bias=False)
226
227 self.activation_fn = ACT2FN[config.hidden_act]
228
229 def forward(self, hidden_states: torch.FloatTensor) -> torch.FloatTensor:
230 up_states = self.gate_up_proj(hidden_states)
231
232 gate, up_states = up_states.chunk(2, dim=-1)
233 up_states = up_states * self.activation_fn(gate)
234
235 return self.down_proj(up_states)
236
237
238# Copied from transformers.models.llama.modeling_llama.repeat_kv with llama->phi
239def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor:
240 """
241 This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,
242 num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)
243 """
244 batch, num_key_value_heads, slen, head_dim = hidden_states.shape
245 if n_rep == 1:
246 return hidden_states
247 hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim)
248 return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim)
249
250
251class Phi3Attention(nn.Module):
252 """Multi-headed attention from 'Attention Is All You Need' paper"""
253
254 def __init__(self, config: Phi3Config, layer_idx: Optional[int] = None):
255 super().__init__()
256 self.config = config
257 self.layer_idx = layer_idx
258 if layer_idx is None:
259 logger.warning_once(
260 f"Instantiating {self.__class__.__name__} without passing a `layer_idx` is not recommended and will "
261 "lead to errors during the forward call if caching is used. Please make sure to provide a `layer_idx` "
262 "when creating this class."
263 )
264
265 self.attention_dropout = config.attention_dropout
266 self.hidden_size = config.hidden_size
267 self.num_heads = config.num_attention_heads
268 self.head_dim = self.hidden_size // self.num_heads
269 self.num_key_value_heads = config.num_key_value_heads
270 self.num_key_value_groups = self.num_heads // self.num_key_value_heads
271 self.max_position_embeddings = config.max_position_embeddings
272 self.original_max_position_embeddings = config.original_max_position_embeddings
273 self.rope_theta = config.rope_theta
274 self.rope_scaling = config.rope_scaling
275 self.is_causal = True
276
277 if (self.head_dim * self.num_heads) != self.hidden_size:
278 raise ValueError(
279 f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}"
280 f" and `num_heads`: {self.num_heads})."
281 )
282
283 op_size = self.num_heads * self.head_dim + 2 * (self.num_key_value_heads * self.head_dim)
284 self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False)
285 self.qkv_proj = nn.Linear(self.hidden_size, op_size, bias=False)
286 self._init_rope()
287
288 def _init_rope(self):
289 if self.rope_scaling is None:
290 self.rotary_emb = Phi3RotaryEmbedding(
291 self.head_dim,
292 max_position_embeddings=self.max_position_embeddings,
293 base=self.rope_theta,
294 )
295 else:
296 scaling_type = self.config.rope_scaling["type"]
297 if scaling_type == "longrope":
298 self.rotary_emb = Phi3LongRoPEScaledRotaryEmbedding(self.head_dim, self.config)
299 else:
300 raise ValueError(f"Unknown RoPE scaling type {scaling_type}")
301
302 def forward(
303 self,
304 hidden_states: torch.Tensor,
305 attention_mask: Optional[torch.Tensor] = None,
306 position_ids: Optional[torch.LongTensor] = None,
307 past_key_value: Optional[Cache] = None,
308 output_attentions: bool = False,
309 use_cache: bool = False,
310 ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:
311 logger.warning_once("You are not running the flash-attention implementation, expect numerical differences.")
312
313 bsz, q_len, _ = hidden_states.size()
314
315 qkv = self.qkv_proj(hidden_states)
316 query_pos = self.num_heads * self.head_dim
317 query_states = qkv[..., :query_pos]
318 key_states = qkv[..., query_pos : query_pos + self.num_key_value_heads * self.head_dim]
319 value_states = qkv[..., query_pos + self.num_key_value_heads * self.head_dim :]
320
321 query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)
322 key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
323 value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
324
325 kv_seq_len = key_states.shape[-2]
326 if past_key_value is not None:
327 if self.layer_idx is None:
328 raise ValueError(
329 f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} "
330 "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class "
331 "with a layer index."
332 )
333 kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx)
334 cos, sin = self.rotary_emb(value_states, position_ids, seq_len=kv_seq_len)
335
336 query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)
337
338 if past_key_value is not None:
339 cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models
340 key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)
341
342 # repeat k/v heads if n_kv_heads < n_heads
343 key_states = repeat_kv(key_states, self.num_key_value_groups)
344 value_states = repeat_kv(value_states, self.num_key_value_groups)
345
346 attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim)
347
348 if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len):
349 raise ValueError(
350 f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is"
351 f" {attn_weights.size()}"
352 )
353
354 if attention_mask is not None:
355 if attention_mask.size() != (bsz, 1, q_len, kv_seq_len):
356 raise ValueError(
357 f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}"
358 )
359 attn_weights = attn_weights + attention_mask
360
361 # upcast attention to fp32
362 attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(value_states.dtype)
363 attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training)
364
365 attn_output = torch.matmul(attn_weights, value_states)
366
367 if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim):
368 raise ValueError(
369 f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is"
370 f" {attn_output.size()}"
371 )
372
373 attn_output = attn_output.transpose(1, 2).contiguous()
374 attn_output = attn_output.reshape(bsz, q_len, self.hidden_size)
375
376 attn_output = self.o_proj(attn_output)
377
378 if not output_attentions:
379 attn_weights = None
380
381 return attn_output, attn_weights, past_key_value
382
383
384class Phi3FlashAttention2(Phi3Attention):
385 """
386 Phi-3 flash attention module. This module inherits from `Phi3Attention` as the weights of the module stays
387 untouched. The only required change would be on the forward pass where it needs to correctly call the public API of
388 flash attention and deal with padding tokens in case the input contains any of them.
389 """
390
391 # Copied from transformers.models.llama.modeling_llama.LlamaFlashAttention2.__init__
392 def __init__(self, *args, **kwargs):
393 super().__init__(*args, **kwargs)
394
395 # TODO: Should be removed once Flash Attention for RoCm is bumped to 2.1.
396 # flash_attn<2.1 generates top-left aligned causal mask, while what is needed here is bottom-right alignement, that was made default for flash_attn>=2.1. This attribute is used to handle this difference. Reference: https://github.com/Dao-AILab/flash-attention/releases/tag/v2.1.0.
397 # Beware that with flash_attn<2.1, using q_seqlen != k_seqlen (except for the case q_seqlen == 1) produces a wrong mask (top-left).
398 self._flash_attn_uses_top_left_mask = not is_flash_attn_greater_or_equal_2_10()
399
400 def forward(
401 self,
402 hidden_states: torch.Tensor,
403 attention_mask: Optional[torch.LongTensor] = None,
404 position_ids: Optional[torch.LongTensor] = None,
405 past_key_value: Optional[Cache] = None,
406 output_attentions: bool = False,
407 use_cache: bool = False,
408 **kwargs,
409 ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:
410 # Phi3FlashAttention2 attention does not support output_attentions
411
412 if not _flash_supports_window_size:
413 logger.warning_once(
414 "The current flash attention version does not support sliding window attention. Please use `attn_implementation='eager'` or upgrade flash-attn library."
415 )
416 raise ValueError("The current flash attention version does not support sliding window attention.")
417
418 output_attentions = False
419
420 if "padding_mask" in kwargs:
421 warnings.warn(
422 "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`"
423 )
424
425 # overwrite attention_mask with padding_mask
426 attention_mask = kwargs.pop("padding_mask")
427
428 bsz, q_len, _ = hidden_states.size()
429
430 qkv = self.qkv_proj(hidden_states)
431 query_pos = self.num_heads * self.head_dim
432 query_states = qkv[..., :query_pos]
433 key_states = qkv[..., query_pos : query_pos + self.num_key_value_heads * self.head_dim]
434 value_states = qkv[..., query_pos + self.num_key_value_heads * self.head_dim :]
435
436 # Flash attention requires the input to have the shape
437 # batch_size x seq_length x head_dim x hidden_dim
438 # therefore we just need to keep the original shape
439 query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)
440 key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
441 value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
442
443 kv_seq_len = key_states.shape[-2]
444 if past_key_value is not None:
445 if self.layer_idx is None:
446 raise ValueError(
447 f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} "
448 "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class "
449 "with a layer index."
450 )
451 kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx)
452
453 # Because the input can be padded, the absolute sequence length depends on the max position id.
454 rotary_seq_len = max(kv_seq_len, position_ids[:, -1].max().item() + 1)
455 cos, sin = self.rotary_emb(value_states, position_ids, seq_len=rotary_seq_len)
456
457 query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)
458
459 use_sliding_windows = (
460 _flash_supports_window_size
461 and getattr(self.config, "sliding_window", None) is not None
462 and kv_seq_len > self.config.sliding_window
463 )
464
465 if past_key_value is not None:
466 # Activate slicing cache only if the config has a value `sliding_windows` attribute
467 cache_has_contents = past_key_value.get_seq_length(self.layer_idx) > 0
468 if (
469 getattr(self.config, "sliding_window", None) is not None
470 and kv_seq_len > self.config.sliding_window
471 and cache_has_contents
472 ):
473 slicing_tokens = 1 - self.config.sliding_window
474
475 past_key = past_key_value[self.layer_idx][0]
476 past_value = past_key_value[self.layer_idx][1]
477
478 past_key = past_key[:, :, slicing_tokens:, :].contiguous()
479 past_value = past_value[:, :, slicing_tokens:, :].contiguous()
480
481 if past_key.shape[-2] != self.config.sliding_window - 1:
482 raise ValueError(
483 f"past key must have a shape of (`batch_size, num_heads, self.config.sliding_window-1, head_dim`), got"
484 f" {past_key.shape}"
485 )
486
487 if attention_mask is not None:
488 attention_mask = attention_mask[:, slicing_tokens:]
489 attention_mask = torch.cat([attention_mask, torch.ones_like(attention_mask[:, -1:])], dim=-1)
490
491 cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models
492 key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)
493
494 # repeat k/v heads if n_kv_heads < n_heads
495 key_states = repeat_kv(key_states, self.num_key_value_groups)
496 value_states = repeat_kv(value_states, self.num_key_value_groups)
497
498 attn_dropout = self.attention_dropout if self.training else 0.0
499
500 # In PEFT, usually we cast the layer norms in float32 for training stability reasons
501 # therefore the input hidden states gets silently casted in float32. Hence, we need
502 # cast them back in the correct dtype just to be sure everything works as expected.
503 # This might slowdown training & inference so it is recommended to not cast the LayerNorms
504 # in fp32.
505
506 if query_states.dtype == torch.float32:
507 if torch.is_autocast_enabled():
508 target_dtype = torch.get_autocast_gpu_dtype()
509 # Handle the case where the model is quantized
510 elif hasattr(self.config, "_pre_quantization_dtype"):
511 target_dtype = self.config._pre_quantization_dtype
512 else:
513 target_dtype = self.qkv_proj.weight.dtype
514
515 logger.warning_once(
516 f"The input hidden states seems to be silently casted in float32, this might be related to"
517 f" the fact you have upcasted embedding or layer norm layers in float32. We will cast back the input in"
518 f" {target_dtype}."
519 )
520
521 query_states = query_states.to(target_dtype)
522 key_states = key_states.to(target_dtype)
523 value_states = value_states.to(target_dtype)
524
525 # Reashape to the expected shape for Flash Attention
526 query_states = query_states.transpose(1, 2)
527 key_states = key_states.transpose(1, 2)
528 value_states = value_states.transpose(1, 2)
529
530 attn_output = self._flash_attention_forward(
531 query_states,
532 key_states,
533 value_states,
534 attention_mask,
535 q_len,
536 dropout=attn_dropout,
537 use_sliding_windows=use_sliding_windows,
538 )
539
540 attn_output = attn_output.reshape(bsz, q_len, self.hidden_size).contiguous()
541 attn_output = self.o_proj(attn_output)
542
543 if not output_attentions:
544 attn_weights = None
545
546 return attn_output, attn_weights, past_key_value
547
548 # Copied from transformers.models.mistral.modeling_mistral.MistralFlashAttention2._flash_attention_forward
549 def _flash_attention_forward(
550 self,
551 query_states,
552 key_states,
553 value_states,
554 attention_mask,
555 query_length,
556 dropout=0.0,
557 softmax_scale=None,
558 use_sliding_windows=False,
559 ):
560 """
561 Calls the forward method of Flash Attention - if the input hidden states contain at least one padding token
562 first unpad the input, then computes the attention scores and pad the final attention scores.
563
564 Args:
565 query_states (`torch.Tensor`):
566 Input query states to be passed to Flash Attention API
567 key_states (`torch.Tensor`):
568 Input key states to be passed to Flash Attention API
569 value_states (`torch.Tensor`):
570 Input value states to be passed to Flash Attention API
571 attention_mask (`torch.Tensor`):
572 The padding mask - corresponds to a tensor of size `(batch_size, seq_len)` where 0 stands for the
573 position of padding tokens and 1 for the position of non-padding tokens.
574 dropout (`float`):
575 Attention dropout
576 softmax_scale (`float`, *optional*):
577 The scaling of QK^T before applying softmax. Default to 1 / sqrt(head_dim)
578 use_sliding_windows (`bool`, *optional*):
579 Whether to activate sliding window attention.
580 """
581 if not self._flash_attn_uses_top_left_mask:
582 causal = self.is_causal
583 else:
584 # TODO: Remove the `query_length != 1` check once Flash Attention for RoCm is bumped to 2.1. For details, please see the comment in LlamaFlashAttention2 __init__.
585 causal = self.is_causal and query_length != 1
586
587 # Contains at least one padding token in the sequence
588 if attention_mask is not None:
589 batch_size = query_states.shape[0]
590 query_states, key_states, value_states, indices_q, cu_seq_lens, max_seq_lens = self._upad_input(
591 query_states, key_states, value_states, attention_mask, query_length
592 )
593
594 cu_seqlens_q, cu_seqlens_k = cu_seq_lens
595 max_seqlen_in_batch_q, max_seqlen_in_batch_k = max_seq_lens
596
597 if not use_sliding_windows:
598 attn_output_unpad = flash_attn_varlen_func(
599 query_states,
600 key_states,
601 value_states,
602 cu_seqlens_q=cu_seqlens_q,
603 cu_seqlens_k=cu_seqlens_k,
604 max_seqlen_q=max_seqlen_in_batch_q,
605 max_seqlen_k=max_seqlen_in_batch_k,
606 dropout_p=dropout,
607 softmax_scale=softmax_scale,
608 causal=causal,
609 )
610 else:
611 attn_output_unpad = flash_attn_varlen_func(
612 query_states,
613 key_states,
614 value_states,
615 cu_seqlens_q=cu_seqlens_q,
616 cu_seqlens_k=cu_seqlens_k,
617 max_seqlen_q=max_seqlen_in_batch_q,
618 max_seqlen_k=max_seqlen_in_batch_k,
619 dropout_p=dropout,
620 softmax_scale=softmax_scale,
621 causal=causal,
622 window_size=(self.config.sliding_window, self.config.sliding_window),
623 )
624
625 attn_output = pad_input(attn_output_unpad, indices_q, batch_size, query_length)
626 else:
627 if not use_sliding_windows:
628 attn_output = flash_attn_func(
629 query_states,
630 key_states,
631 value_states,
632 dropout,
633 softmax_scale=softmax_scale,
634 causal=causal,
635 )
636 else:
637 attn_output = flash_attn_func(
638 query_states,
639 key_states,
640 value_states,
641 dropout,
642 softmax_scale=softmax_scale,
643 causal=causal,
644 window_size=(self.config.sliding_window, self.config.sliding_window),
645 )
646
647 return attn_output
648
649 # Copied from transformers.models.mistral.modeling_mistral.MistralFlashAttention2._upad_input
650 def _upad_input(self, query_layer, key_layer, value_layer, attention_mask, query_length):
651 batch_size, kv_seq_len, num_heads, head_dim = key_layer.shape
652
653 # On the first iteration we need to properly re-create the padding mask
654 # by slicing it on the proper place
655 if kv_seq_len != attention_mask.shape[-1]:
656 attention_mask_num_tokens = attention_mask.shape[-1]
657 attention_mask = attention_mask[:, attention_mask_num_tokens - kv_seq_len :]
658
659 indices_k, cu_seqlens_k, max_seqlen_in_batch_k = _get_unpad_data(attention_mask)
660
661 key_layer = index_first_axis(key_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k)
662 value_layer = index_first_axis(value_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k)
663
664 if query_length == kv_seq_len:
665 query_layer = index_first_axis(
666 query_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k
667 )
668 cu_seqlens_q = cu_seqlens_k
669 max_seqlen_in_batch_q = max_seqlen_in_batch_k
670 indices_q = indices_k
671 elif query_length == 1:
672 max_seqlen_in_batch_q = 1
673 cu_seqlens_q = torch.arange(
674 batch_size + 1, dtype=torch.int32, device=query_layer.device
675 ) # There is a memcpy here, that is very bad.
676 indices_q = cu_seqlens_q[:-1]
677 query_layer = query_layer.squeeze(1)
678 else:
679 # The -q_len: slice assumes left padding.
680 attention_mask = attention_mask[:, -query_length:]
681 query_layer, indices_q, cu_seqlens_q, max_seqlen_in_batch_q = unpad_input(query_layer, attention_mask)
682
683 return (
684 query_layer,
685 key_layer,
686 value_layer,
687 indices_q,
688 (cu_seqlens_q, cu_seqlens_k),
689 (max_seqlen_in_batch_q, max_seqlen_in_batch_k),
690 )
691
692
693# copied from transformers.models.llama.modeling_llama.LlamaSdpaAttention with Llama->Phi3
694# TODO @Arthur no longer copied from LLama after static cache
695class Phi3SdpaAttention(Phi3Attention):
696 """
697 Phi3 attention module using torch.nn.functional.scaled_dot_product_attention. This module inherits from
698 `Phi3Attention` as the weights of the module stays untouched. The only changes are on the forward pass to adapt to
699 SDPA API.
700 """
701
702 # Adapted from Phi3Attention.forward
703 def forward(
704 self,
705 hidden_states: torch.Tensor,
706 attention_mask: Optional[torch.Tensor] = None,
707 position_ids: Optional[torch.LongTensor] = None,
708 past_key_value: Optional[Cache] = None,
709 output_attentions: bool = False,
710 use_cache: bool = False,
711 ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:
712 if output_attentions:
713 # TODO: Improve this warning with e.g. `model.config.attn_implementation = "manual"` once this is implemented.
714 logger.warning_once(
715 "Phi3Model is using Phi3SdpaAttention, but `torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to the manual attention implementation, "
716 'but specifying the manual implementation will be required from Transformers version v5.0.0 onwards. This warning can be removed using the argument `attn_implementation="eager"` when loading the model.'
717 )
718 return super().forward(
719 hidden_states=hidden_states,
720 attention_mask=attention_mask,
721 position_ids=position_ids,
722 past_key_value=past_key_value,
723 output_attentions=output_attentions,
724 use_cache=use_cache,
725 )
726
727 bsz, q_len, _ = hidden_states.size()
728
729 qkv = self.qkv_proj(hidden_states)
730 query_pos = self.num_heads * self.head_dim
731 query_states = qkv[..., :query_pos]
732 key_states = qkv[..., query_pos : query_pos + self.num_key_value_heads * self.head_dim]
733 value_states = qkv[..., query_pos + self.num_key_value_heads * self.head_dim :]
734
735 query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)
736 key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
737 value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
738
739 kv_seq_len = key_states.shape[-2]
740 if past_key_value is not None:
741 kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx)
742 cos, sin = self.rotary_emb(value_states, position_ids, seq_len=kv_seq_len)
743
744 query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids)
745
746 if past_key_value is not None:
747 cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models
748 key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)
749
750 key_states = repeat_kv(key_states, self.num_key_value_groups)
751 value_states = repeat_kv(value_states, self.num_key_value_groups)
752
753 if attention_mask is not None:
754 if attention_mask.size() != (bsz, 1, q_len, kv_seq_len):
755 raise ValueError(
756 f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}"
757 )
758
759 # SDPA with memory-efficient backend is currently (torch==2.1.2) bugged with non-contiguous inputs with custom attn_mask,
760 # Reference: https://github.com/pytorch/pytorch/issues/112577.
761 if query_states.device.type == "cuda" and attention_mask is not None:
762 query_states = query_states.contiguous()
763 key_states = key_states.contiguous()
764 value_states = value_states.contiguous()
765
766 attn_output = torch.nn.functional.scaled_dot_product_attention(
767 query_states,
768 key_states,
769 value_states,
770 attn_mask=attention_mask,
771 dropout_p=self.attention_dropout if self.training else 0.0,
772 # The q_len > 1 is necessary to match with AttentionMaskConverter.to_causal_4d that does not create a causal mask in case q_len == 1.
773 is_causal=self.is_causal and attention_mask is None and q_len > 1,
774 )
775
776 attn_output = attn_output.transpose(1, 2).contiguous()
777 attn_output = attn_output.view(bsz, q_len, self.hidden_size)
778
779 attn_output = self.o_proj(attn_output)
780
781 return attn_output, None, past_key_value
782
783
784PHI3_ATTENTION_CLASSES = {
785 "eager": Phi3Attention,
786 "flash_attention_2": Phi3FlashAttention2,
787 "sdpa": Phi3SdpaAttention,
788}
789
790
791class Phi3DecoderLayer(nn.Module):
792 def __init__(self, config: Phi3Config, layer_idx: int):
793 super().__init__()
794
795 self.config = config
796 self.self_attn = PHI3_ATTENTION_CLASSES[config._attn_implementation](config, layer_idx=layer_idx)
797
798 self.mlp = Phi3MLP(config)
799 self.input_layernorm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
800
801 self.resid_attn_dropout = nn.Dropout(config.resid_pdrop)
802 self.resid_mlp_dropout = nn.Dropout(config.resid_pdrop)
803 self.post_attention_layernorm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
804
805 def forward(
806 self,
807 hidden_states: torch.Tensor,
808 attention_mask: Optional[torch.Tensor] = None,
809 position_ids: Optional[torch.LongTensor] = None,
810 past_key_value: Optional[Tuple[torch.Tensor]] = None,
811 output_attentions: Optional[bool] = False,
812 use_cache: Optional[bool] = False,
813 **kwargs,
814 ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]:
815 if "padding_mask" in kwargs:
816 warnings.warn(
817 "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`"
818 )
819 """
820 Args:
821 hidden_states (`torch.FloatTensor`):
822 input to the layer of shape `(batch, seq_len, embed_dim)`
823 attention_mask (`torch.FloatTensor`, *optional*): attention mask of size
824 `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values.
825 position_ids (`torch.LongTensor` of shape `({0})`, *optional*):
826 Indices of positions of each input sequence tokens in the position embeddings. Selected in the range
827 `[0, config.n_positions - 1]`. [What are position IDs?](../glossary#position-ids)
828 output_attentions (`bool`, *optional*):
829 Whether or not to return the attentions tensors of all attention layers. See `attentions` under
830 returned tensors for more detail.
831 use_cache (`bool`, *optional*):
832 If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding
833 (see `past_key_values`).
834 past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states
835 """
836
837 residual = hidden_states
838
839 hidden_states = self.input_layernorm(hidden_states)
840
841 # Self Attention
842 attn_outputs, self_attn_weights, present_key_value = self.self_attn(
843 hidden_states=hidden_states,
844 attention_mask=attention_mask,
845 position_ids=position_ids,
846 past_key_value=past_key_value,
847 output_attentions=output_attentions,
848 use_cache=use_cache,
849 )
850
851 hidden_states = residual + self.resid_attn_dropout(attn_outputs)
852
853 residual = hidden_states
854 hidden_states = self.post_attention_layernorm(hidden_states)
855 hidden_states = self.mlp(hidden_states)
856 hidden_states = residual + self.resid_mlp_dropout(hidden_states)
857
858 outputs = (hidden_states,)
859
860 if output_attentions:
861 outputs += (self_attn_weights,)
862
863 if use_cache:
864 outputs += (present_key_value,)
865
866 return outputs
867
868
869PHI3_START_DOCSTRING = r"""
870 This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the
871 library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads
872 etc.)
873
874 This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass.
875 Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage
876 and behavior.
877
878 Parameters:
879 config ([`Phi3Config`]):
880 Model configuration class with all the parameters of the model. Initializing with a config file does not
881 load the weights associated with the model, only the configuration. Check out the
882 [`~PreTrainedModel.from_pretrained`] method to load the model weights.
883"""
884
885
886@add_start_docstrings(
887 "The bare Phi-3 model outputting raw hidden-states without any specific head on top.",
888 PHI3_START_DOCSTRING,
889)
890class Phi3PreTrainedModel(PreTrainedModel):
891 config_class = Phi3Config
892 base_model_prefix = "model"
893 supports_gradient_checkpointing = True
894 _no_split_modules = ["Phi3DecoderLayer"]
895 _skip_keys_device_placement = "past_key_values"
896 _supports_flash_attn_2 = True
897 _supports_sdpa = False
898 _supports_cache_class = True
899
900 _version = "0.0.5"
901
902 def _init_weights(self, module):
903 std = self.config.initializer_range
904 if isinstance(module, nn.Linear):
905 module.weight.data.normal_(mean=0.0, std=std)
906 if module.bias is not None:
907 module.bias.data.zero_()
908 elif isinstance(module, nn.Embedding):
909 module.weight.data.normal_(mean=0.0, std=std)
910 if module.padding_idx is not None:
911 module.weight.data[module.padding_idx].zero_()
912
913
914PHI3_INPUTS_DOCSTRING = r"""
915 Args:
916 input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
917 Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide
918 it.
919
920 Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
921 [`PreTrainedTokenizer.__call__`] for details.
922
923 [What are input IDs?](../glossary#input-ids)
924 attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
925 Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:
926
927 - 1 for tokens that are **not masked**,
928 - 0 for tokens that are **masked**.
929
930 [What are attention masks?](../glossary#attention-mask)
931
932 Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
933 [`PreTrainedTokenizer.__call__`] for details.
934
935 If `past_key_values` is used, optionally only the last `input_ids` have to be input (see
936 `past_key_values`).
937
938 If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`]
939 and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more
940 information on the default strategy.
941
942 - 1 indicates the head is **not masked**,
943 - 0 indicates the head is **masked**.
944 position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
945 Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
946 config.n_positions - 1]`.
947
948 [What are position IDs?](../glossary#position-ids)
949 past_key_values (`Cache` or `tuple(tuple(torch.FloatTensor))`, *optional*):
950 Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention
951 blocks) that can be used to speed up sequential decoding. This typically consists in the `past_key_values`
952 returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.
953
954 Two formats are allowed:
955 - a [`~cache_utils.Cache`] instance;
956 - Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of
957 shape `(batch_size, num_heads, sequence_length, embed_size_per_head)`). This is also known as the legacy
958 cache format.
959
960 The model will output the same cache format that is fed as input. If no `past_key_values` are passed, the
961 legacy cache format will be returned.
962
963 If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't
964 have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids`
965 of shape `(batch_size, sequence_length)`.
966 inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*):
967 Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This
968 is useful if you want more control over how to convert `input_ids` indices into associated vectors than the
969 model's internal embedding lookup matrix.
970 use_cache (`bool`, *optional*):
971 If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see
972 `past_key_values`).
973 output_attentions (`bool`, *optional*):
974 Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
975 tensors for more detail.
976 output_hidden_states (`bool`, *optional*):
977 Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
978 more detail.
979 return_dict (`bool`, *optional*):
980 Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
981"""
982
983
984@add_start_docstrings(
985 "The bare Phi-3 model outputting raw hidden-states without any specific head on top.",
986 PHI3_START_DOCSTRING,
987)
988class Phi3Model(Phi3PreTrainedModel):
989 """
990 Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`Phi3DecoderLayer`]
991
992 Args:
993 config: Phi3Config
994 """
995
996 def __init__(self, config: Phi3Config):
997 super().__init__(config)
998 self.padding_idx = config.pad_token_id
999 self.vocab_size = config.vocab_size
1000
1001 self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)
1002 self.embed_dropout = nn.Dropout(config.embd_pdrop)
1003 self.layers = nn.ModuleList(
1004 [Phi3DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
1005 )
1006 self._attn_implementation = config._attn_implementation
1007 self.norm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
1008
1009 self.gradient_checkpointing = False
1010 # Initialize weights and apply final processing
1011 self.post_init()
1012
1013 def get_input_embeddings(self):
1014 return self.embed_tokens
1015
1016 def set_input_embeddings(self, value):
1017 self.embed_tokens = value
1018
1019 @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING)
1020 def forward(
1021 self,
1022 input_ids: torch.LongTensor = None,
1023 attention_mask: Optional[torch.Tensor] = None,
1024 position_ids: Optional[torch.LongTensor] = None,
1025 past_key_values: Optional[List[torch.FloatTensor]] = None,
1026 inputs_embeds: Optional[torch.FloatTensor] = None,
1027 use_cache: Optional[bool] = None,
1028 output_attentions: Optional[bool] = None,
1029 output_hidden_states: Optional[bool] = None,
1030 return_dict: Optional[bool] = None,
1031 ) -> Union[Tuple, BaseModelOutputWithPast]:
1032 output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
1033 output_hidden_states = (
1034 output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
1035 )
1036 use_cache = use_cache if use_cache is not None else self.config.use_cache
1037
1038 return_dict = return_dict if return_dict is not None else self.config.use_return_dict
1039
1040 # retrieve input_ids and inputs_embeds
1041 if input_ids is not None and inputs_embeds is not None:
1042 raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
1043 elif input_ids is not None:
1044 batch_size, seq_length = input_ids.shape[:2]
1045 elif inputs_embeds is not None:
1046 batch_size, seq_length = inputs_embeds.shape[:2]
1047 else:
1048 raise ValueError("You have to specify either input_ids or inputs_embeds")
1049
1050 past_key_values_length = 0
1051
1052 if self.gradient_checkpointing and self.training:
1053 if use_cache:
1054 logger.warning_once(
1055 "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..."
1056 )
1057 use_cache = False
1058
1059 if use_cache:
1060 use_legacy_cache = not isinstance(past_key_values, Cache)
1061 if use_legacy_cache:
1062 past_key_values = DynamicCache.from_legacy_cache(past_key_values)
1063 past_key_values_length = past_key_values.get_usable_length(seq_length)
1064
1065 if position_ids is None:
1066 device = input_ids.device if input_ids is not None else inputs_embeds.device
1067 position_ids = torch.arange(
1068 past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device
1069 )
1070 position_ids = position_ids.unsqueeze(0).view(-1, seq_length)
1071 else:
1072 position_ids = position_ids.view(-1, seq_length).long()
1073
1074 if inputs_embeds is None:
1075 inputs_embeds = self.embed_tokens(input_ids)
1076
1077 if attention_mask is not None and self._attn_implementation == "flash_attention_2" and use_cache:
1078 is_padding_right = attention_mask[:, -1].sum().item() != batch_size
1079 if is_padding_right:
1080 raise ValueError(
1081 "You are attempting to perform batched generation with padding_side='right'"
1082 " this may lead to unexpected behaviour for Flash Attention version of Phi3. Make sure to "
1083 " call `tokenizer.padding_side = 'left'` before tokenizing the input. "
1084 )
1085
1086 if self._attn_implementation == "flash_attention_2":
1087 # 2d mask is passed through the layers
1088 attention_mask = attention_mask if (attention_mask is not None and 0 in attention_mask) else None
1089 else:
1090 # 4d mask is passed through the layers
1091 attention_mask = _prepare_4d_causal_attention_mask(
1092 attention_mask,
1093 (batch_size, seq_length),
1094 inputs_embeds,
1095 past_key_values_length,
1096 sliding_window=self.config.sliding_window,
1097 )
1098
1099 hidden_states = inputs_embeds
1100
1101 # decoder layers
1102 all_hidden_states = () if output_hidden_states else None
1103 all_self_attns = () if output_attentions else None
1104 next_decoder_cache = None
1105
1106 for decoder_layer in self.layers:
1107 if output_hidden_states:
1108 all_hidden_states += (hidden_states,)
1109
1110 if self.gradient_checkpointing and self.training:
1111 layer_outputs = self._gradient_checkpointing_func(
1112 decoder_layer.__call__,
1113 hidden_states,
1114 attention_mask,
1115 position_ids,
1116 past_key_values,
1117 output_attentions,
1118 use_cache,
1119 )
1120 else:
1121 layer_outputs = decoder_layer(
1122 hidden_states,
1123 attention_mask=attention_mask,
1124 position_ids=position_ids,
1125 past_key_value=past_key_values,
1126 output_attentions=output_attentions,
1127 use_cache=use_cache,
1128 )
1129
1130 hidden_states = layer_outputs[0]
1131
1132 if use_cache:
1133 next_decoder_cache = layer_outputs[2 if output_attentions else 1]
1134
1135 if output_attentions:
1136 all_self_attns += (layer_outputs[1],)
1137
1138 hidden_states = self.norm(hidden_states)
1139
1140 # add hidden states from the last decoder layer
1141 if output_hidden_states:
1142 all_hidden_states += (hidden_states,)
1143
1144 next_cache = None
1145 if use_cache:
1146 next_cache = next_decoder_cache.to_legacy_cache() if use_legacy_cache else next_decoder_cache
1147 if not return_dict:
1148 return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None)
1149 return BaseModelOutputWithPast(
1150 last_hidden_state=hidden_states,
1151 past_key_values=next_cache,
1152 hidden_states=all_hidden_states,
1153 attentions=all_self_attns,
1154 )
1155
1156
1157class Phi3ForCausalLM(Phi3PreTrainedModel):
1158 _tied_weights_keys = ["lm_head.weight"]
1159
1160 # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.__init__ with Llama->Phi3
1161 def __init__(self, config):
1162 super().__init__(config)
1163 self.model = Phi3Model(config)
1164 self.vocab_size = config.vocab_size
1165 self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
1166
1167 # Initialize weights and apply final processing
1168 self.post_init()
1169
1170 # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.get_input_embeddings
1171 def get_input_embeddings(self):
1172 return self.model.embed_tokens
1173
1174 # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.set_input_embeddings
1175 def set_input_embeddings(self, value):
1176 self.model.embed_tokens = value
1177
1178 # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.get_output_embeddings
1179 def get_output_embeddings(self):
1180 return self.lm_head
1181
1182 # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.set_output_embeddings
1183 def set_output_embeddings(self, new_embeddings):
1184 self.lm_head = new_embeddings
1185
1186 # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.set_decoder
1187 def set_decoder(self, decoder):
1188 self.model = decoder
1189
1190 # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.get_decoder
1191 def get_decoder(self):
1192 return self.model
1193
1194 # Ignore copy
1195 @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING)
1196 @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC)
1197 def forward(
1198 self,
1199 input_ids: torch.LongTensor = None,
1200 attention_mask: Optional[torch.Tensor] = None,
