jeiku commited on
Commit
4b86754
1 Parent(s): 8fe87d8

Delete modeling_llama.py

Browse files
Files changed (1) hide show
  1. modeling_llama.py +0 -1620
modeling_llama.py DELETED
@@ -1,1620 +0,0 @@
1
- # coding=utf-8
2
- # Copyright 2022 EleutherAI and the HuggingFace Inc. team. All rights reserved.
3
- #
4
- # This code is based on EleutherAI's GPT-NeoX library and the GPT-NeoX
5
- # and OPT implementations in this library. It has been modified from its
6
- # original forms to accommodate minor architectural differences compared
7
- # to GPT-NeoX and OPT used by the Meta AI team that trained the model.
8
- #
9
- # Licensed under the Apache License, Version 2.0 (the "License");
10
- # you may not use this file except in compliance with the License.
11
- # You may obtain a copy of the License at
12
- #
13
- # http://www.apache.org/licenses/LICENSE-2.0
14
- #
15
- # Unless required by applicable law or agreed to in writing, software
16
- # distributed under the License is distributed on an "AS IS" BASIS,
17
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- # See the License for the specific language governing permissions and
19
- # limitations under the License.
20
- import math
21
- from typing import List, Optional, Tuple, Union
22
-
23
- import torch
24
- import torch.nn.functional as F
25
- import torch.utils.checkpoint
26
- from torch import nn
27
- from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss
28
-
29
- from ...activations import ACT2FN
30
- from ...cache_utils import Cache, DynamicCache, StaticCache
31
- from ...modeling_attn_mask_utils import AttentionMaskConverter
32
- from ...modeling_flash_attention_utils import _flash_attention_forward
33
- from ...modeling_outputs import (
34
- BaseModelOutputWithPast,
35
- CausalLMOutputWithPast,
36
- QuestionAnsweringModelOutput,
37
- SequenceClassifierOutputWithPast,
38
- TokenClassifierOutput,
39
- )
40
- from ...modeling_rope_utils import ROPE_INIT_FUNCTIONS
41
- from ...modeling_utils import PreTrainedModel
42
- from ...pytorch_utils import ALL_LAYERNORM_LAYERS
43
- from ...utils import (
44
- add_start_docstrings,
45
- add_start_docstrings_to_model_forward,
46
- is_flash_attn_greater_or_equal_2_10,
47
- is_torchdynamo_compiling,
48
- logging,
49
- replace_return_docstrings,
50
- )
51
- from .configuration_llama import LlamaConfig
52
-
53
-
54
- logger = logging.get_logger(__name__)
55
-
56
- _CONFIG_FOR_DOC = "LlamaConfig"
57
-
58
-
59
- def _prepare_4d_causal_attention_mask_with_cache_position(
60
- attention_mask: torch.Tensor,
61
- sequence_length: int,
62
- target_length: int,
63
- dtype: torch.dtype,
64
- device: torch.device,
65
- min_dtype: float,
66
- cache_position: torch.Tensor,
67
- batch_size: int,
68
- ):
69
- """
70
- Creates a causal 4D mask of shape `(batch_size, 1, query_length, key_value_length)` from a 2D mask of shape
71
- `(batch_size, key_value_length)`, or if the input `attention_mask` is already 4D, do nothing.
72
-
73
- Args:
74
- attention_mask (`torch.Tensor`):
75
- 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)`.
76
- sequence_length (`int`):
77
- The sequence length being processed.
78
- target_length (`int`):
79
- 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.
80
- dtype (`torch.dtype`):
81
- The dtype to use for the 4D attention mask.
82
- device (`torch.device`):
83
- The device to plcae the 4D attention mask on.
84
- min_dtype (`float`):
85
- The minimum value representable with the dtype `dtype`.
86
- cache_position (`torch.Tensor`):
87
- Indices depicting the position of the input sequence tokens in the sequence.
88
- batch_size (`torch.Tensor`):
89
- Batch size.
90
- """
91
- if attention_mask is not None and attention_mask.dim() == 4:
92
- # In this case we assume that the mask comes already in inverted form and requires no inversion or slicing.
93
- causal_mask = attention_mask
94
- else:
95
- causal_mask = torch.full((sequence_length, target_length), fill_value=min_dtype, dtype=dtype, device=device)
96
- if sequence_length != 1:
97
- causal_mask = torch.triu(causal_mask, diagonal=1)
98
- causal_mask *= torch.arange(target_length, device=device) > cache_position.reshape(-1, 1)
99
- causal_mask = causal_mask[None, None, :, :].expand(batch_size, 1, -1, -1)
100
- if attention_mask is not None:
101
- causal_mask = causal_mask.clone() # copy to contiguous memory for in-place edit
102
- mask_length = attention_mask.shape[-1]
103
- padding_mask = causal_mask[:, :, :, :mask_length] + attention_mask[:, None, None, :]
104
- padding_mask = padding_mask == 0
105
- causal_mask[:, :, :, :mask_length] = causal_mask[:, :, :, :mask_length].masked_fill(
106
- padding_mask, min_dtype
107
- )
108
-
109
- return causal_mask
110
-
111
-
112
- class LlamaRMSNorm(nn.Module):
113
- def __init__(self, hidden_size, eps=1e-6):
114
- """
115
- LlamaRMSNorm is equivalent to T5LayerNorm
116
- """
117
- super().__init__()
118
- self.weight = nn.Parameter(torch.ones(hidden_size))
119
- self.variance_epsilon = eps
120
-
121
- def forward(self, hidden_states):
122
- input_dtype = hidden_states.dtype
123
- hidden_states = hidden_states.to(torch.float32)
124
- variance = hidden_states.pow(2).mean(-1, keepdim=True)
125
- hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
126
- return self.weight * hidden_states.to(input_dtype)
127
-
128
- def extra_repr(self):
129
- return f"{tuple(self.weight.shape)}, eps={self.variance_epsilon}"
130
-
131
-
132
- ALL_LAYERNORM_LAYERS.append(LlamaRMSNorm)
133
-
134
-
135
- class LlamaRotaryEmbedding(nn.Module):
136
- def __init__(
137
- self,
138
- dim=None,
139
- max_position_embeddings=2048,
140
- base=10000,
141
- device=None,
142
- scaling_factor=1.0,
143
- rope_type="default",
144
- config: Optional[LlamaConfig] = None,
145
- ):
146
- super().__init__()
147
- # TODO (joao): remove the `if` below, only used for BC
148
- self.rope_kwargs = {}
149
- if config is None:
150
- logger.warning_once(
151
- "`LlamaRotaryEmbedding` can now be fully parameterized by passing the model config through the "
152
- "`config` argument. All other arguments will be removed in v4.45"
153
- )
154
- self.rope_kwargs = {
155
- "rope_type": rope_type,
156
- "factor": scaling_factor,
157
- "dim": dim,
158
- "base": base,
159
- "max_position_embeddings": max_position_embeddings,
160
- }
161
- self.rope_type = rope_type
162
- self.max_seq_len_cached = max_position_embeddings
163
- self.original_max_seq_len = max_position_embeddings
164
- else:
165
- # BC: "rope_type" was originally "type"
166
- if config.rope_scaling is not None:
167
- self.rope_type = config.rope_scaling.get("rope_type", config.rope_scaling.get("type"))
168
- else:
169
- self.rope_type = "default"
170
- self.max_seq_len_cached = config.max_position_embeddings
171
- self.original_max_seq_len = config.max_position_embeddings
172
-
173
- self.config = config
174
- self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type]
175
-
176
- inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device, **self.rope_kwargs)
177
- self.register_buffer("inv_freq", inv_freq, persistent=False)
178
- self.original_inv_freq = self.inv_freq
179
-
180
- def _dynamic_frequency_update(self, position_ids, device):
181
- """
182
- dynamic RoPE layers should recompute `inv_freq` in the following situations:
183
- 1 - growing beyond the cached sequence length (allow scaling)
184
- 2 - the current sequence length is in the original scale (avoid losing precision with small sequences)
185
- """
186
- seq_len = torch.max(position_ids) + 1
187
- if seq_len > self.max_seq_len_cached: # growth
188
- inv_freq, self.attention_scaling = self.rope_init_fn(
189
- self.config, device, seq_len=seq_len, **self.rope_kwargs
190
- )
191
- self.register_buffer("inv_freq", inv_freq, persistent=False) # TODO joao: may break with compilation
192
- self.max_seq_len_cached = seq_len
193
-
194
- if seq_len < self.original_max_seq_len and self.max_seq_len_cached > self.original_max_seq_len: # reset
195
- self.register_buffer("inv_freq", self.original_inv_freq, persistent=False)
196
- self.max_seq_len_cached = self.original_max_seq_len
197
-
198
- @torch.no_grad()
199
- def forward(self, x, position_ids):
200
- if "dynamic" in self.rope_type:
201
- self._dynamic_frequency_update(position_ids, device=x.device)
202
-
203
- # Core RoPE block
204
- inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1)
205
- position_ids_expanded = position_ids[:, None, :].float()
206
- # Force float32 (see https://github.com/huggingface/transformers/pull/29285)
207
- device_type = x.device.type
208
- device_type = device_type if isinstance(device_type, str) and device_type != "mps" else "cpu"
209
- with torch.autocast(device_type=device_type, enabled=False):
210
- freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)
211
- emb = torch.cat((freqs, freqs), dim=-1)
212
- cos = emb.cos()
213
- sin = emb.sin()
214
-
215
- # Advanced RoPE types (e.g. yarn) apply a post-processing scaling factor, equivalent to scaling attention
216
- cos = cos * self.attention_scaling
217
- sin = sin * self.attention_scaling
218
-
219
- return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype)
220
-
221
-
222
- class LlamaLinearScalingRotaryEmbedding(LlamaRotaryEmbedding):
223
- """LlamaRotaryEmbedding extended with linear scaling. Credits to the Reddit user /u/kaiokendev"""
224
-
225
- def __init__(self, *args, **kwargs):
226
- logger.warning_once(
227
- "`LlamaLinearScalingRotaryEmbedding` is deprecated an will be removed in v4.45. Please use "
228
- "`LlamaRotaryEmbedding`, which now also does linear scaling (simply pass the model config to __init__)."
229
- )
230
- kwargs["rope_type"] = "linear"
231
- super().__init__(*args, **kwargs)
232
-
233
-
234
- class LlamaDynamicNTKScalingRotaryEmbedding(LlamaRotaryEmbedding):
235
- """LlamaRotaryEmbedding extended with Dynamic NTK scaling. Credits to the Reddit users /u/bloc97 and /u/emozilla"""
236
-
237
- def __init__(self, *args, **kwargs):
238
- logger.warning_once(
239
- "`LlamaDynamicNTKScalingRotaryEmbedding` is deprecated an will be removed in v4.45. Please use "
240
- "`LlamaRotaryEmbedding`, which now also does dynamic ntk scaling (simply pass the model config to "
241
- "__init__)."
242
- )
243
- kwargs["rope_type"] = "dynamic"
244
- super().__init__(*args, **kwargs)
245
-
246
-
247
- def rotate_half(x):
248
- """Rotates half the hidden dims of the input."""
249
- x1 = x[..., : x.shape[-1] // 2]
250
- x2 = x[..., x.shape[-1] // 2 :]
251
- return torch.cat((-x2, x1), dim=-1)
252
-
253
-
254
- def apply_rotary_pos_emb(q, k, cos, sin, position_ids=None, unsqueeze_dim=1):
255
- """Applies Rotary Position Embedding to the query and key tensors.
256
-
257
- Args:
258
- q (`torch.Tensor`): The query tensor.
259
- k (`torch.Tensor`): The key tensor.
260
- cos (`torch.Tensor`): The cosine part of the rotary embedding.
261
- sin (`torch.Tensor`): The sine part of the rotary embedding.
262
- position_ids (`torch.Tensor`, *optional*):
263
- Deprecated and unused.
264
- unsqueeze_dim (`int`, *optional*, defaults to 1):
265
- The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and
266
- sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note
267
- that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and
268
- k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes
269
- cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have
270
- the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.
271
- Returns:
272
- `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.
273
- """
274
- cos = cos.unsqueeze(unsqueeze_dim)
275
- sin = sin.unsqueeze(unsqueeze_dim)
276
- q_embed = (q * cos) + (rotate_half(q) * sin)
277
- k_embed = (k * cos) + (rotate_half(k) * sin)
278
- return q_embed, k_embed
279
-
280
-
281
- class LlamaMLP(nn.Module):
282
- def __init__(self, config):
283
- super().__init__()
284
- self.config = config
285
- self.hidden_size = config.hidden_size
286
- self.intermediate_size = config.intermediate_size
287
- self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=config.mlp_bias)
288
- self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=config.mlp_bias)
289
- self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=config.mlp_bias)
290
- self.act_fn = ACT2FN[config.hidden_act]
291
-
292
- def forward(self, x):
293
- if self.config.pretraining_tp > 1:
294
- slice = self.intermediate_size // self.config.pretraining_tp
295
- gate_proj_slices = self.gate_proj.weight.split(slice, dim=0)
296
- up_proj_slices = self.up_proj.weight.split(slice, dim=0)
297
- down_proj_slices = self.down_proj.weight.split(slice, dim=1)
298
-
299
- gate_proj = torch.cat(
300
- [F.linear(x, gate_proj_slices[i]) for i in range(self.config.pretraining_tp)], dim=-1
301
- )
302
- up_proj = torch.cat([F.linear(x, up_proj_slices[i]) for i in range(self.config.pretraining_tp)], dim=-1)
303
-
304
- intermediate_states = (self.act_fn(gate_proj) * up_proj).split(slice, dim=2)
305
- down_proj = [
306
- F.linear(intermediate_states[i], down_proj_slices[i]) for i in range(self.config.pretraining_tp)
307
- ]
308
- down_proj = sum(down_proj)
309
- else:
310
- down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))
311
-
312
- return down_proj
313
-
314
-
315
- def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor:
316
- """
317
- This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,
318
- num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)
319
- """
320
- batch, num_key_value_heads, slen, head_dim = hidden_states.shape
321
- if n_rep == 1:
322
- return hidden_states
323
- hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim)
324
- return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim)
325
-
326
-
327
- class LlamaAttention(nn.Module):
328
- """Multi-headed attention from 'Attention Is All You Need' paper"""
329
-
330
- def __init__(self, config: LlamaConfig, layer_idx: Optional[int] = None):
331
- super().__init__()
332
- self.config = config
333
- self.layer_idx = layer_idx
334
- if layer_idx is None:
335
- logger.warning_once(
336
- f"Instantiating {self.__class__.__name__} without passing a `layer_idx` is not recommended and will "
337
- "lead to errors during the forward call if caching is used. Please make sure to provide a `layer_idx` "
338
- "when creating this class."
339
- )
340
-
341
- self.attention_dropout = config.attention_dropout
342
- self.hidden_size = config.hidden_size
343
- self.num_heads = config.num_attention_heads
344
- self.head_dim = getattr(config, "head_dim", self.hidden_size // self.num_heads)
345
- self.num_key_value_heads = config.num_key_value_heads
346
- self.num_key_value_groups = self.num_heads // self.num_key_value_heads
347
- self.max_position_embeddings = config.max_position_embeddings
348
- self.rope_theta = config.rope_theta
349
- self.is_causal = True
350
-
351
- self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=config.attention_bias)
352
- self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=config.attention_bias)
353
- self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=config.attention_bias)
354
- self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=config.attention_bias)
355
-
356
- # TODO (joao): remove in v4.45 (RoPE is computed in the model, not in the decoder layers)
357
- self.rotary_emb = LlamaRotaryEmbedding(config=self.config)
358
-
359
- def forward(
360
- self,
361
- hidden_states: torch.Tensor,
362
- attention_mask: Optional[torch.Tensor] = None,
363
- position_ids: Optional[torch.LongTensor] = None,
364
- past_key_value: Optional[Cache] = None,
365
- output_attentions: bool = False,
366
- use_cache: bool = False,
367
- cache_position: Optional[torch.LongTensor] = None,
368
- position_embeddings: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, # will become mandatory in v4.45
369
- **kwargs,
370
- ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:
371
- bsz, q_len, _ = hidden_states.size()
372
-
373
- if self.config.pretraining_tp > 1:
374
- key_value_slicing = (self.num_key_value_heads * self.head_dim) // self.config.pretraining_tp
375
- query_slices = self.q_proj.weight.split(
376
- (self.num_heads * self.head_dim) // self.config.pretraining_tp, dim=0
377
- )
378
- key_slices = self.k_proj.weight.split(key_value_slicing, dim=0)
379
- value_slices = self.v_proj.weight.split(key_value_slicing, dim=0)
380
-
381
- query_states = [F.linear(hidden_states, query_slices[i]) for i in range(self.config.pretraining_tp)]
382
- query_states = torch.cat(query_states, dim=-1)
383
-
384
- key_states = [F.linear(hidden_states, key_slices[i]) for i in range(self.config.pretraining_tp)]
385
- key_states = torch.cat(key_states, dim=-1)
386
-
387
- value_states = [F.linear(hidden_states, value_slices[i]) for i in range(self.config.pretraining_tp)]
388
- value_states = torch.cat(value_states, dim=-1)
389
-
390
- else:
391
- query_states = self.q_proj(hidden_states)
392
- key_states = self.k_proj(hidden_states)
393
- value_states = self.v_proj(hidden_states)
394
-
395
- query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)
396
- key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
397
- value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
398
-
399
- if position_embeddings is None:
400
- logger.warning_once(
401
- "The attention layers in this model are transitioning from computing the RoPE embeddings internally "
402
- "through `position_ids` (2D tensor with the indexes of the tokens), to using externally computed "
403
- "`position_embeddings` (Tuple of tensors, containing cos and sin). In v4.45 `position_ids` will be "
404
- "removed and `position_embeddings` will be mandatory."
405
- )
406
- cos, sin = self.rotary_emb(value_states, position_ids)
407
- else:
408
- cos, sin = position_embeddings
409
- query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)
410
-
411
- if past_key_value is not None:
412
- # sin and cos are specific to RoPE models; cache_position needed for the static cache
413
- cache_kwargs = {"sin": sin, "cos": cos, "cache_position": cache_position}
414
- key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)
415
-
416
- key_states = repeat_kv(key_states, self.num_key_value_groups)
417
- value_states = repeat_kv(value_states, self.num_key_value_groups)
418
- attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim)
419
-
420
- if attention_mask is not None: # no matter the length, we just slice it
421
- causal_mask = attention_mask[:, :, :, : key_states.shape[-2]]
422
- attn_weights = attn_weights + causal_mask
423
-
424
- # upcast attention to fp32
425
- attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype)
426
- attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training)
427
- attn_output = torch.matmul(attn_weights, value_states)
428
-
429
- if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim):
430
- raise ValueError(
431
- f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is"
432
- f" {attn_output.size()}"
433
- )
434
-
435
- attn_output = attn_output.transpose(1, 2).contiguous()
436
-
437
- attn_output = attn_output.reshape(bsz, q_len, -1)
438
-
439
- if self.config.pretraining_tp > 1:
440
- attn_output = attn_output.split(self.hidden_size // self.config.pretraining_tp, dim=2)
441
- o_proj_slices = self.o_proj.weight.split(self.hidden_size // self.config.pretraining_tp, dim=1)
442
- attn_output = sum([F.linear(attn_output[i], o_proj_slices[i]) for i in range(self.config.pretraining_tp)])
443
- else:
444
- attn_output = self.o_proj(attn_output)
445
-
446
- if not output_attentions:
447
- attn_weights = None
448
-
449
- return attn_output, attn_weights, past_key_value
450
-
451
-
452
- class LlamaFlashAttention2(LlamaAttention):
453
- """
454
- Llama flash attention module. This module inherits from `LlamaAttention` as the weights of the module stays
455
- untouched. The only required change would be on the forward pass where it needs to correctly call the public API of
456
- flash attention and deal with padding tokens in case the input contains any of them.
457
- """
458
-
459
- def __init__(self, *args, **kwargs):
460
- super().__init__(*args, **kwargs)
461
-
462
- # TODO: Should be removed once Flash Attention for RoCm is bumped to 2.1.
463
- # 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.
464
- # 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).
465
- self._flash_attn_uses_top_left_mask = not is_flash_attn_greater_or_equal_2_10()
466
-
467
- def forward(
468
- self,
469
- hidden_states: torch.Tensor,
470
- attention_mask: Optional[torch.LongTensor] = None,
471
- position_ids: Optional[torch.LongTensor] = None,
472
- past_key_value: Optional[Cache] = None,
473
- output_attentions: bool = False,
474
- use_cache: bool = False,
475
- cache_position: Optional[torch.LongTensor] = None,
476
- position_embeddings: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, # will become mandatory in v4.45
477
- ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:
478
- if isinstance(past_key_value, StaticCache):
479
- raise ValueError(
480
- "`static` cache implementation is not compatible with `attn_implementation==flash_attention_2` "
481
- "make sure to use `sdpa` in the mean time, and open an issue at https://github.com/huggingface/transformers"
482
- )
483
-
484
- output_attentions = False
485
-
486
- bsz, q_len, _ = hidden_states.size()
487
-
488
- query_states = self.q_proj(hidden_states)
489
- key_states = self.k_proj(hidden_states)
490
- value_states = self.v_proj(hidden_states)
491
-
492
- # Flash attention requires the input to have the shape
493
- # batch_size x seq_length x head_dim x hidden_dim
494
- # therefore we just need to keep the original shape
495
- query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)
496
- key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
497
- value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
498
-
499
- if position_embeddings is None:
500
- logger.warning_once(
501
- "The attention layers in this model are transitioning from computing the RoPE embeddings internally "
502
- "through `position_ids` (2D tensor with the indexes of the tokens), to using externally computed "
503
- "`position_embeddings` (Tuple of tensors, containing cos and sin). In v4.45 `position_ids` will be "
504
- "removed and `position_embeddings` will be mandatory."
505
- )
506
- cos, sin = self.rotary_emb(value_states, position_ids)
507
- else:
508
- cos, sin = position_embeddings
509
- query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)
510
-
511
- if past_key_value is not None:
512
- # sin and cos are specific to RoPE models; cache_position needed for the static cache
513
- cache_kwargs = {"sin": sin, "cos": cos, "cache_position": cache_position}
514
- key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)
515
-
516
- # TODO: These transpose are quite inefficient but Flash Attention requires the layout [batch_size, sequence_length, num_heads, head_dim]. We would need to refactor the KV cache
517
- # to be able to avoid many of these transpose/reshape/view.
518
- query_states = query_states.transpose(1, 2)
519
- key_states = key_states.transpose(1, 2)
520
- value_states = value_states.transpose(1, 2)
521
-
522
- dropout_rate = self.attention_dropout if self.training else 0.0
523
-
524
- # In PEFT, usually we cast the layer norms in float32 for training stability reasons
525
- # therefore the input hidden states gets silently casted in float32. Hence, we need
526
- # cast them back in the correct dtype just to be sure everything works as expected.
527
- # This might slowdown training & inference so it is recommended to not cast the LayerNorms
528
- # in fp32. (LlamaRMSNorm handles it correctly)
529
-
530
- input_dtype = query_states.dtype
531
- if input_dtype == torch.float32:
532
- if torch.is_autocast_enabled():
533
- target_dtype = torch.get_autocast_gpu_dtype()
534
- # Handle the case where the model is quantized
535
- elif hasattr(self.config, "_pre_quantization_dtype"):
536
- target_dtype = self.config._pre_quantization_dtype
537
- else:
538
- target_dtype = self.q_proj.weight.dtype
539
-
540
- logger.warning_once(
541
- f"The input hidden states seems to be silently casted in float32, this might be related to"
542
- f" the fact you have upcasted embedding or layer norm layers in float32. We will cast back the input in"
543
- f" {target_dtype}."
544
- )
545
-
546
- query_states = query_states.to(target_dtype)
547
- key_states = key_states.to(target_dtype)
548
- value_states = value_states.to(target_dtype)
549
-
550
- attn_output = _flash_attention_forward(
551
- query_states,
552
- key_states,
553
- value_states,
554
- attention_mask,
555
- q_len,
556
- position_ids=position_ids,
557
- dropout=dropout_rate,
558
- sliding_window=getattr(self, "sliding_window", None),
559
- use_top_left_mask=self._flash_attn_uses_top_left_mask,
560
- is_causal=self.is_causal,
561
- )
562
-
563
- attn_output = attn_output.reshape(bsz, q_len, -1).contiguous()
564
- attn_output = self.o_proj(attn_output)
565
-
566
- if not output_attentions:
567
- attn_weights = None
568
-
569
- return attn_output, attn_weights, past_key_value
570
-
571
-
572
- class LlamaSdpaAttention(LlamaAttention):
573
- """
574
- Llama attention module using torch.nn.functional.scaled_dot_product_attention. This module inherits from
575
- `LlamaAttention` as the weights of the module stays untouched. The only changes are on the forward pass to adapt to
576
- SDPA API.
577
- """
578
-
579
- # Adapted from LlamaAttention.forward
580
- def forward(
581
- self,
582
- hidden_states: torch.Tensor,
583
- attention_mask: Optional[torch.Tensor] = None,
584
- position_ids: Optional[torch.LongTensor] = None,
585
- past_key_value: Optional[Cache] = None,
586
- output_attentions: bool = False,
587
- use_cache: bool = False,
588
- cache_position: Optional[torch.LongTensor] = None,
589
- position_embeddings: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, # will become mandatory in v4.45
590
- **kwargs,
591
- ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:
592
- if output_attentions:
593
- # TODO: Improve this warning with e.g. `model.config.attn_implementation = "manual"` once this is implemented.
594
- logger.warning_once(
595
- "LlamaModel is using LlamaSdpaAttention, but `torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to the manual attention implementation, "
596
- '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.'
597
- )
598
- return super().forward(
599
- hidden_states=hidden_states,
600
- attention_mask=attention_mask,
601
- position_ids=position_ids,
602
- past_key_value=past_key_value,
603
- output_attentions=output_attentions,
604
- use_cache=use_cache,
605
- cache_position=cache_position,
606
- position_embeddings=position_embeddings,
607
- )
608
-
609
- bsz, q_len, _ = hidden_states.size()
610
-
611
- query_states = self.q_proj(hidden_states)
612
- key_states = self.k_proj(hidden_states)
613
- value_states = self.v_proj(hidden_states)
614
-
615
- query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2)
616
- key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
617
- value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2)
618
-
619
- if position_embeddings is None:
620
- logger.warning_once(
621
- "The attention layers in this model are transitioning from computing the RoPE embeddings internally "
622
- "through `position_ids` (2D tensor with the indexes of the tokens), to using externally computed "
623
- "`position_embeddings` (Tuple of tensors, containing cos and sin). In v4.45 `position_ids` will be "
624
- "removed and `position_embeddings` will be mandatory."
625
- )
626
- cos, sin = self.rotary_emb(value_states, position_ids)
627
- else:
628
- cos, sin = position_embeddings
629
- query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)
630
-
631
- if past_key_value is not None:
632
- # sin and cos are specific to RoPE models; cache_position needed for the static cache
633
- cache_kwargs = {"sin": sin, "cos": cos, "cache_position": cache_position}
634
- key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)
635
-
636
- key_states = repeat_kv(key_states, self.num_key_value_groups)
637
- value_states = repeat_kv(value_states, self.num_key_value_groups)
638
-
639
- causal_mask = attention_mask
640
- if attention_mask is not None:
641
- causal_mask = causal_mask[:, :, :, : key_states.shape[-2]]
642
-
643
- # SDPA with memory-efficient backend is currently (torch==2.1.2) bugged with non-contiguous inputs with custom attn_mask,
644
- # Reference: https://github.com/pytorch/pytorch/issues/112577.
645
- if query_states.device.type == "cuda" and causal_mask is not None:
646
- query_states = query_states.contiguous()
647
- key_states = key_states.contiguous()
648
- value_states = value_states.contiguous()
649
-
650
- # We dispatch to SDPA's Flash Attention or Efficient kernels via this `is_causal` if statement instead of an inline conditional assignment
651
- # in SDPA to support both torch.compile's dynamic shapes and full graph options. An inline conditional prevents dynamic shapes from compiling.
652
- is_causal = True if causal_mask is None and q_len > 1 else False
653
-
654
- attn_output = torch.nn.functional.scaled_dot_product_attention(
655
- query_states,
656
- key_states,
657
- value_states,
658
- attn_mask=causal_mask,
659
- dropout_p=self.attention_dropout if self.training else 0.0,
660
- is_causal=is_causal,
661
- )
662
-
663
- attn_output = attn_output.transpose(1, 2).contiguous()
664
- attn_output = attn_output.view(bsz, q_len, -1)
665
-
666
- attn_output = self.o_proj(attn_output)
667
-
668
- return attn_output, None, past_key_value
669
-
670
-
671
- LLAMA_ATTENTION_CLASSES = {
672
- "eager": LlamaAttention,
673
- "flash_attention_2": LlamaFlashAttention2,
674
- "sdpa": LlamaSdpaAttention,
675
- }
676
-
677
-
678
- class LlamaDecoderLayer(nn.Module):
679
- def __init__(self, config: LlamaConfig, layer_idx: int):
680
- super().__init__()
681
- self.hidden_size = config.hidden_size
682
-
683
- self.self_attn = LLAMA_ATTENTION_CLASSES[config._attn_implementation](config=config, layer_idx=layer_idx)
684
-
685
- self.mlp = LlamaMLP(config)
686
- self.input_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps)
687
- self.post_attention_layernorm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps)
688
-
689
- def forward(
690
- self,
691
- hidden_states: torch.Tensor,
692
- attention_mask: Optional[torch.Tensor] = None,
693
- position_ids: Optional[torch.LongTensor] = None,
694
- past_key_value: Optional[Cache] = None,
695
- output_attentions: Optional[bool] = False,
696
- use_cache: Optional[bool] = False,
697
- cache_position: Optional[torch.LongTensor] = None,
698
- position_embeddings: Optional[Tuple[torch.Tensor, torch.Tensor]] = None, # will become mandatory in v4.45
699
- **kwargs,
700
- ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]:
701
- """
702
- Args:
703
- hidden_states (`torch.FloatTensor`): input to the layer of shape `(batch, seq_len, embed_dim)`
704
- attention_mask (`torch.FloatTensor`, *optional*):
705
- attention mask of size `(batch_size, sequence_length)` if flash attention is used or `(batch_size, 1,
706
- query_sequence_length, key_sequence_length)` if default attention is used.
707
- output_attentions (`bool`, *optional*):
708
- Whether or not to return the attentions tensors of all attention layers. See `attentions` under
709
- returned tensors for more detail.
710
- use_cache (`bool`, *optional*):
711
- If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding
712
- (see `past_key_values`).
713
- past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states
714
- cache_position (`torch.LongTensor` of shape `(sequence_length)`, *optional*):
715
- Indices depicting the position of the input sequence tokens in the sequence
716
- position_embeddings (`Tuple[torch.FloatTensor, torch.FloatTensor]`, *optional*):
717
- Tuple containing the cosine and sine positional embeddings of shape `(batch_size, seq_len, head_dim)`,
718
- with `head_dim` being the embedding dimension of each attention head.
719
- kwargs (`dict`, *optional*):
720
- Arbitrary kwargs to be ignored, used for FSDP and other methods that injects code
721
- into the model
722
- """
723
- residual = hidden_states
724
-
725
- hidden_states = self.input_layernorm(hidden_states)
726
-
727
- # Self Attention
728
- hidden_states, self_attn_weights, present_key_value = self.self_attn(
729
- hidden_states=hidden_states,
730
- attention_mask=attention_mask,
731
- position_ids=position_ids,
732
- past_key_value=past_key_value,
733
- output_attentions=output_attentions,
734
- use_cache=use_cache,
735
- cache_position=cache_position,
736
- position_embeddings=position_embeddings,
737
- **kwargs,
738
- )
739
- hidden_states = residual + hidden_states
740
-
741
- # Add Gaussian noise after self-attention
742
- hidden_states = hidden_states + torch.randn_like(hidden_states) * 0.0066
743
-
744
- # Fully Connected
745
- residual = hidden_states
746
- hidden_states = self.post_attention_layernorm(hidden_states)
747
- hidden_states = self.mlp(hidden_states)
748
- hidden_states = residual + hidden_states
749
-
750
- # Add Gaussian noise after MLP
751
- hidden_states = hidden_states + torch.randn_like(hidden_states) * 0.0066
752
-
753
- outputs = (hidden_states,)
754
-
755
- if output_attentions:
756
- outputs += (self_attn_weights,)
757
-
758
- if use_cache:
759
- outputs += (present_key_value,)
760
-
761
- return outputs
762
-
763
-
764
- LLAMA_START_DOCSTRING = r"""
765
- This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the
766
- library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads
767
- etc.)
768
-
769
- This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass.
770
- Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage
771
- and behavior.
772
-
773
- Parameters:
774
- config ([`LlamaConfig`]):
775
- Model configuration class with all the parameters of the model. Initializing with a config file does not
776
- load the weights associated with the model, only the configuration. Check out the
777
- [`~PreTrainedModel.from_pretrained`] method to load the model weights.
778
- """
779
-
780
-
781
- @add_start_docstrings(
782
- "The bare LLaMA Model outputting raw hidden-states without any specific head on top.",
783
- LLAMA_START_DOCSTRING,
784
- )
785
- class LlamaPreTrainedModel(PreTrainedModel):
786
- config_class = LlamaConfig
787
- base_model_prefix = "model"
788
- supports_gradient_checkpointing = True
789
- _no_split_modules = ["LlamaDecoderLayer"]
790
- _skip_keys_device_placement = ["past_key_values"]
791
- _supports_flash_attn_2 = True
792
- _supports_sdpa = True
793
- _supports_cache_class = True
794
- _supports_quantized_cache = True
795
- _supports_static_cache = True
796
-
797
- def _init_weights(self, module):
798
- std = self.config.initializer_range
799
- if isinstance(module, nn.Linear):
800
- module.weight.data.normal_(mean=0.0, std=std)
801
- if module.bias is not None:
802
- module.bias.data.zero_()
803
- elif isinstance(module, nn.Embedding):
804
- module.weight.data.normal_(mean=0.0, std=std)
805
- if module.padding_idx is not None:
806
- module.weight.data[module.padding_idx].zero_()
807
-
808
-
809
- LLAMA_INPUTS_DOCSTRING = r"""
810
- Args:
811
- input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`):
812
- Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide
813
- it.
814
-
815
- Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
816
- [`PreTrainedTokenizer.__call__`] for details.
817
-
818
- [What are input IDs?](../glossary#input-ids)
819
- attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*):
820
- Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`:
821
-
822
- - 1 for tokens that are **not masked**,
823
- - 0 for tokens that are **masked**.
824
-
825
- [What are attention masks?](../glossary#attention-mask)
826
-
827
- Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
828
- [`PreTrainedTokenizer.__call__`] for details.
829
-
830
- If `past_key_values` is used, optionally only the last `input_ids` have to be input (see
831
- `past_key_values`).
832
-
833
- If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`]
834
- and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more
835
- information on the default strategy.
836
-
837
- - 1 indicates the head is **not masked**,
838
- - 0 indicates the head is **masked**.
839
- position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
840
- Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0,
841
- config.n_positions - 1]`.
842
-
843
- [What are position IDs?](../glossary#position-ids)
844
- past_key_values (`Cache` or `tuple(tuple(torch.FloatTensor))`, *optional*):
845
- Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention
846
- blocks) that can be used to speed up sequential decoding. This typically consists in the `past_key_values`
847
- returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`.
848
-
849
- Two formats are allowed:
850
- - a [`~cache_utils.Cache`] instance;
851
- - Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of
852
- shape `(batch_size, num_heads, sequence_length, embed_size_per_head)`). This is also known as the legacy
853
- cache format.
854
-
855
- The model will output the same cache format that is fed as input. If no `past_key_values` are passed, the
856
- legacy cache format will be returned.
857
-
858
- If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't
859
- have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids`
860
- of shape `(batch_size, sequence_length)`.
861
- inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*):
862
- Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This
863
- is useful if you want more control over how to convert `input_ids` indices into associated vectors than the
864
- model's internal embedding lookup matrix.
865
- use_cache (`bool`, *optional*):
866
- If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see
867
- `past_key_values`).
868
- output_attentions (`bool`, *optional*):
869
- Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned
870
- tensors for more detail.
871
- output_hidden_states (`bool`, *optional*):
872
- Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
873
- more detail.
874
- return_dict (`bool`, *optional*):
875
- Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
876
- cache_position (`torch.LongTensor` of shape `(sequence_length)`, *optional*):
877
- Indices depicting the position of the input sequence tokens in the sequence. Contrarily to `position_ids`,
878
- this tensor is not affected by padding. It is used to update the cache in the correct position and to infer
879
- the complete sequence length.
880
- """
881
-
882
-
883
- @add_start_docstrings(
884
- "The bare LLaMA Model outputting raw hidden-states without any specific head on top.",
885
- LLAMA_START_DOCSTRING,
886
- )
887
- class LlamaModel(LlamaPreTrainedModel):
888
- """
889
- Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`LlamaDecoderLayer`]
890
-
891
- Args:
892
- config: LlamaConfig
893
- """
894
-
895
- def __init__(self, config: LlamaConfig):
896
- super().__init__(config)
897
- self.padding_idx = config.pad_token_id
898
- self.vocab_size = config.vocab_size
899
-
900
- self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)
901
- self.layers = nn.ModuleList(
902
- [LlamaDecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
903
- )
904
- self.norm = LlamaRMSNorm(config.hidden_size, eps=config.rms_norm_eps)
905
- self.rotary_emb = LlamaRotaryEmbedding(config=config)
906
- self.gradient_checkpointing = False
907
-
908
- # Initialize weights and apply final processing
909
- self.post_init()
910
-
911
- def get_input_embeddings(self):
912
- return self.embed_tokens
913
-
914
- def set_input_embeddings(self, value):
915
- self.embed_tokens = value
916
-
917
- @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING)
918
- def forward(
919
- self,
920
- input_ids: torch.LongTensor = None,
921
- attention_mask: Optional[torch.Tensor] = None,
922
- position_ids: Optional[torch.LongTensor] = None,
923
- past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,
924
- inputs_embeds: Optional[torch.FloatTensor] = None,
925
- use_cache: Optional[bool] = None,
926
- output_attentions: Optional[bool] = None,
927
- output_hidden_states: Optional[bool] = None,
928
- return_dict: Optional[bool] = None,
929
- cache_position: Optional[torch.LongTensor] = None,
930
- ) -> Union[Tuple, BaseModelOutputWithPast]:
931
- output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
932
- output_hidden_states = (
933
- output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
934
- )
935
- use_cache = use_cache if use_cache is not None else self.config.use_cache
936
- return_dict = return_dict if return_dict is not None else self.config.use_return_dict
937
-
938
- if (input_ids is None) ^ (inputs_embeds is not None):
939
- raise ValueError(
940
- "You cannot specify both input_ids and inputs_embeds at the same time, and must specify either one"
941
- )
942
-
943
- if self.gradient_checkpointing and self.training and use_cache:
944
- logger.warning_once(
945
- "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`."
946
- )
947
- use_cache = False
948
-
949
- if inputs_embeds is None:
950
- inputs_embeds = self.embed_tokens(input_ids)
951
-
952
- return_legacy_cache = False
953
- if (
954
- use_cache and not isinstance(past_key_values, Cache) and not self.training
955
- ): # kept for BC (non `Cache` `past_key_values` inputs)
956
- return_legacy_cache = True
957
- past_key_values = DynamicCache.from_legacy_cache(past_key_values)
958
- logger.warning_once(
959
- "We detected that you are passing `past_key_values` as a tuple and this is deprecated and will be removed in v4.43. "
960
- "Please use an appropriate `Cache` class (https://huggingface.co/docs/transformers/internal/generation_utils#transformers.Cache)"
961
- )
962
-
963
- if cache_position is None:
964
- past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0
965
- cache_position = torch.arange(
966
- past_seen_tokens, past_seen_tokens + inputs_embeds.shape[1], device=inputs_embeds.device
967
- )
968
- if position_ids is None:
969
- position_ids = cache_position.unsqueeze(0)
970
-
971
- causal_mask = self._update_causal_mask(
972
- attention_mask, inputs_embeds, cache_position, past_key_values, output_attentions
973
- )
974
- hidden_states = inputs_embeds
975
-
976
- # create position embeddings to be shared across the decoder layers
977
- position_embeddings = self.rotary_emb(hidden_states, position_ids)
978
-
979
- # decoder layers
980
- all_hidden_states = () if output_hidden_states else None
981
- all_self_attns = () if output_attentions else None
982
- next_decoder_cache = None
983
-
984
- for decoder_layer in self.layers:
985
- if output_hidden_states:
986
- all_hidden_states += (hidden_states,)
987
-
988
- if self.gradient_checkpointing and self.training:
989
- layer_outputs = self._gradient_checkpointing_func(
990
- decoder_layer.__call__,
991
- hidden_states,
992
- causal_mask,
993
- position_ids,
994
- past_key_values,
995
- output_attentions,
996
- use_cache,
997
- cache_position,
998
- position_embeddings,
999
- )
1000
- else:
1001
- layer_outputs = decoder_layer(
1002
- hidden_states,
1003
- attention_mask=causal_mask,
1004
- position_ids=position_ids,
1005
- past_key_value=past_key_values,
1006
- output_attentions=output_attentions,
1007
- use_cache=use_cache,
1008
- cache_position=cache_position,
1009
- position_embeddings=position_embeddings,
1010
- )
1011
-
1012
- hidden_states = layer_outputs[0]
1013
-
1014
- if use_cache:
1015
- next_decoder_cache = layer_outputs[2 if output_attentions else 1]
1016
-
1017
- if output_attentions:
1018
- all_self_attns += (layer_outputs[1],)
1019
-
1020
- hidden_states = self.norm(hidden_states)
1021
-
1022
- # add hidden states from the last decoder layer
1023
- if output_hidden_states:
1024
- all_hidden_states += (hidden_states,)
1025
-
1026
- next_cache = next_decoder_cache if use_cache else None
1027
- if return_legacy_cache:
1028
- next_cache = next_cache.to_legacy_cache()
1029
-
1030
- if not return_dict:
1031
- return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None)
1032
- return BaseModelOutputWithPast(
1033
- last_hidden_state=hidden_states,
1034
- past_key_values=next_cache,
1035
- hidden_states=all_hidden_states,
1036
- attentions=all_self_attns,
1037
- )
1038
-
1039
- def _update_causal_mask(
1040
- self,
1041
- attention_mask: torch.Tensor,
1042
- input_tensor: torch.Tensor,
1043
- cache_position: torch.Tensor,
1044
- past_key_values: Cache,
1045
- output_attentions: bool,
1046
- ):
1047
- if self.config._attn_implementation == "flash_attention_2":
1048
- if attention_mask is not None and 0.0 in attention_mask:
1049
- return attention_mask
1050
- return None
1051
-
1052
- # For SDPA, when possible, we will rely on its `is_causal` argument instead of its `attn_mask` argument, in
1053
- # order to dispatch on Flash Attention 2. This feature is not compatible with static cache, as SDPA will fail
1054
- # to infer the attention mask.
1055
- past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0
1056
- using_static_cache = isinstance(past_key_values, StaticCache)
1057
-
1058
- # When output attentions is True, sdpa implementation's forward method calls the eager implementation's forward
1059
- if self.config._attn_implementation == "sdpa" and not using_static_cache and not output_attentions:
1060
- if AttentionMaskConverter._ignore_causal_mask_sdpa(
1061
- attention_mask,
1062
- inputs_embeds=input_tensor,
1063
- past_key_values_length=past_seen_tokens,
1064
- is_training=self.training,
1065
- ):
1066
- return None
1067
-
1068
- dtype, device = input_tensor.dtype, input_tensor.device
1069
- min_dtype = torch.finfo(dtype).min
1070
- sequence_length = input_tensor.shape[1]
1071
- if using_static_cache:
1072
- target_length = past_key_values.get_max_length()
1073
- else:
1074
- target_length = (
1075
- attention_mask.shape[-1]
1076
- if isinstance(attention_mask, torch.Tensor)
1077
- else past_seen_tokens + sequence_length + 1
1078
- )
1079
-
1080
- # In case the provided `attention` mask is 2D, we generate a causal mask here (4D).
1081
- causal_mask = _prepare_4d_causal_attention_mask_with_cache_position(
1082
- attention_mask,
1083
- sequence_length=sequence_length,
1084
- target_length=target_length,
1085
- dtype=dtype,
1086
- device=device,
1087
- min_dtype=min_dtype,
1088
- cache_position=cache_position,
1089
- batch_size=input_tensor.shape[0],
1090
- )
1091
-
1092
- if (
1093
- self.config._attn_implementation == "sdpa"
1094
- and attention_mask is not None
1095
- and attention_mask.device.type == "cuda"
1096
- and not output_attentions
1097
- ):
1098
- # Attend to all tokens in fully masked rows in the causal_mask, for example the relevant first rows when
1099
- # using left padding. This is required by F.scaled_dot_product_attention memory-efficient attention path.
1100
- # Details: https://github.com/pytorch/pytorch/issues/110213
1101
- causal_mask = AttentionMaskConverter._unmask_unattended(causal_mask, min_dtype)
1102
-
1103
- return causal_mask
1104
-
1105
-
1106
- class LlamaForCausalLM(LlamaPreTrainedModel):
1107
- _tied_weights_keys = ["lm_head.weight"]
1108
-
1109
- def __init__(self, config):
1110
- super().__init__(config)
1111
- self.model = LlamaModel(config)
1112
- self.vocab_size = config.vocab_size
1113
- self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
1114
-
1115
- # Initialize weights and apply final processing
1116
- self.post_init()
1117
-
1118
- def get_input_embeddings(self):
1119
- return self.model.embed_tokens
1120
-
1121
- def set_input_embeddings(self, value):
1122
- self.model.embed_tokens = value
1123
-
1124
- def get_output_embeddings(self):
1125
- return self.lm_head
1126
-
1127
- def set_output_embeddings(self, new_embeddings):
1128
- self.lm_head = new_embeddings
1129
-
1130
- def set_decoder(self, decoder):
1131
- self.model = decoder
1132
-
1133
- def get_decoder(self):
1134
- return self.model
1135
-
1136
- @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING)
1137
- @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC)
1138
- def forward(
1139
- self,
1140
- input_ids: torch.LongTensor = None,
1141
- attention_mask: Optional[torch.Tensor] = None,
1142
- position_ids: Optional[torch.LongTensor] = None,
1143
- past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,
1144
- inputs_embeds: Optional[torch.FloatTensor] = None,
1145
- labels: Optional[torch.LongTensor] = None,
1146
- use_cache: Optional[bool] = None,
1147
- output_attentions: Optional[bool] = None,
1148
- output_hidden_states: Optional[bool] = None,
1149
- return_dict: Optional[bool] = None,
1150
- cache_position: Optional[torch.LongTensor] = None,
1151
- num_logits_to_keep: int = 0,
1152
- ) -> Union[Tuple, CausalLMOutputWithPast]:
1153
- r"""
1154
- Args:
1155
- labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
1156
- Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
1157
- config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored
1158
- (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.
1159
-
1160
- num_logits_to_keep (`int`, *optional*):
1161
- Calculate logits for the last `num_logits_to_keep` tokens. If `0`, calculate logits for all
1162
- `input_ids` (special case). Only last token logits are needed for generation, and calculating them only for that
1163
- token can save memory, which becomes pretty significant for long sequences or large vocabulary size.
1164
-
1165
- Returns:
1166
-
1167
- Example:
1168
-
1169
- ```python
1170
- >>> from transformers import AutoTokenizer, LlamaForCausalLM
1171
-
1172
- >>> model = LlamaForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
1173
- >>> tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
1174
-
1175
- >>> prompt = "Hey, are you conscious? Can you talk to me?"
1176
- >>> inputs = tokenizer(prompt, return_tensors="pt")
1177
-
1178
- >>> # Generate
1179
- >>> generate_ids = model.generate(inputs.input_ids, max_length=30)
1180
- >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
1181
- "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."
1182
- ```"""
1183
- output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
1184
- output_hidden_states = (
1185
- output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
1186
- )
1187
- return_dict = return_dict if return_dict is not None else self.config.use_return_dict
1188
-
1189
- # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn)
1190
- outputs = self.model(
1191
- input_ids=input_ids,
1192
- attention_mask=attention_mask,
1193
- position_ids=position_ids,
1194
- past_key_values=past_key_values,
1195
- inputs_embeds=inputs_embeds,
1196
- use_cache=use_cache,
1197
- output_attentions=output_attentions,
1198
- output_hidden_states=output_hidden_states,
1199
- return_dict=return_dict,
1200
- cache_position=cache_position,
1201
- )
1202
-
1203
- hidden_states = outputs[0]
1204
- if self.config.pretraining_tp > 1:
1205
- lm_head_slices = self.lm_head.weight.split(self.vocab_size // self.config.pretraining_tp, dim=0)
1206
- logits = [F.linear(hidden_states, lm_head_slices[i]) for i in range(self.config.pretraining_tp)]
1207
- logits = torch.cat(logits, dim=-1)
1208
- else:
1209
- if labels is None and not is_torchdynamo_compiling():
1210
- logger.warning_once(
1211
- "Starting from v4.46, the `logits` model output will have the same type as the model (except at train time, where it will always be FP32)"
1212
- )
1213
- # Only compute necessary logits, and do not upcast them to float if we are not computing the loss
1214
- # TODO: remove the float() operation in v4.46
1215
- logits = self.lm_head(hidden_states[:, -num_logits_to_keep:, :]).float()
1216
-
1217
- loss = None
1218
- if labels is not None:
1219
- # Upcast to float if we need to compute the loss to avoid potential precision issues
1220
- logits = logits.float()
1221
- # Shift so that tokens < n predict n
1222
- shift_logits = logits[..., :-1, :].contiguous()
1223
- shift_labels = labels[..., 1:].contiguous()
1224
- # Flatten the tokens
1225
- loss_fct = CrossEntropyLoss()
1226
- shift_logits = shift_logits.view(-1, self.config.vocab_size)
1227
- shift_labels = shift_labels.view(-1)
1228
- # Enable model parallelism
1229
- shift_labels = shift_labels.to(shift_logits.device)
1230
- loss = loss_fct(shift_logits, shift_labels)
1231
-
1232
- if not return_dict:
1233
- output = (logits,) + outputs[1:]
1234
- return (loss,) + output if loss is not None else output
1235
-
1236
- return CausalLMOutputWithPast(
1237
- loss=loss,
1238
- logits=logits,
1239
- past_key_values=outputs.past_key_values,
1240
- hidden_states=outputs.hidden_states,
1241
- attentions=outputs.attentions,
1242
- )
1243
-
1244
- def prepare_inputs_for_generation(
1245
- self,
1246
- input_ids,
1247
- past_key_values=None,
1248
- attention_mask=None,
1249
- inputs_embeds=None,
1250
- cache_position=None,
1251
- position_ids=None,
1252
- use_cache=True,
1253
- num_logits_to_keep=0,
1254
- **kwargs,
1255
- ):
1256
- # If we have cache: let's slice `input_ids` through `cache_position`, to keep only the unprocessed tokens
1257
- # Exception 1: when passing input_embeds, input_ids may be missing entries
1258
- # Exception 2: some generation methods do special slicing of input_ids, so we don't need to do it here
1259
- if past_key_values is not None:
1260
- if inputs_embeds is not None: # Exception 1
1261
- input_ids = input_ids[:, -cache_position.shape[0] :]
1262
- elif input_ids.shape[1] != cache_position.shape[0]: # Default case (the "else", a no op, is Exception 2)
1263
- input_ids = input_ids[:, cache_position]
1264
-
1265
- if attention_mask is not None and position_ids is None:
1266
- # create position_ids on the fly for batch generation
1267
- position_ids = attention_mask.long().cumsum(-1) - 1
1268
- position_ids.masked_fill_(attention_mask == 0, 1)
1269
- if past_key_values:
1270
- position_ids = position_ids[:, -input_ids.shape[1] :]
1271
-
1272
- # This `clone` call is needed to avoid recapturing cuda graphs with `torch.compile`'s `mode="reduce-overhead`, as otherwise the input `position_ids` would have various stride during the decoding. Here, simply using `.contiguous()` is not sufficient as in the batch size = 1 case, `position_ids` is already contiguous but with varying stride which retriggers a capture.
1273
- position_ids = position_ids.clone(memory_format=torch.contiguous_format)
1274
-
1275
- # if `inputs_embeds` are passed, we only want to use them in the 1st generation step
1276
- if inputs_embeds is not None and cache_position[0] == 0:
1277
- model_inputs = {"inputs_embeds": inputs_embeds, "input_ids": None}
1278
- else:
1279
- # The clone here is for the same reason as for `position_ids`.
1280
- model_inputs = {"input_ids": input_ids.clone(memory_format=torch.contiguous_format), "inputs_embeds": None}
1281
-
1282
- if isinstance(past_key_values, StaticCache) and attention_mask.ndim == 2:
1283
- if model_inputs["inputs_embeds"] is not None:
1284
- batch_size, sequence_length, _ = model_inputs["inputs_embeds"].shape
1285
- device = model_inputs["inputs_embeds"].device
1286
- else:
1287
- batch_size, sequence_length = model_inputs["input_ids"].shape
1288
- device = model_inputs["input_ids"].device
1289
-
1290
- dtype = self.lm_head.weight.dtype
1291
- min_dtype = torch.finfo(dtype).min
1292
-
1293
- attention_mask = _prepare_4d_causal_attention_mask_with_cache_position(
1294
- attention_mask,
1295
- sequence_length=sequence_length,
1296
- target_length=past_key_values.get_max_length(),
1297
- dtype=dtype,
1298
- device=device,
1299
- min_dtype=min_dtype,
1300
- cache_position=cache_position,
1301
- batch_size=batch_size,
1302
- )
1303
-
1304
- model_inputs.update(
1305
- {
1306
- "position_ids": position_ids,
1307
- "cache_position": cache_position,
1308
- "past_key_values": past_key_values,
1309
- "use_cache": use_cache,
1310
- "attention_mask": attention_mask,
1311
- "num_logits_to_keep": num_logits_to_keep,
1312
- }
1313
- )
1314
- return model_inputs
1315
-
1316
-
1317
- @add_start_docstrings(
1318
- """
1319
- The LLaMa Model transformer with a sequence classification head on top (linear layer).
1320
-
1321
- [`LlamaForSequenceClassification`] uses the last token in order to do the classification, as other causal models
1322
- (e.g. GPT-2) do.
1323
-
1324
- Since it does classification on the last token, it requires to know the position of the last token. If a
1325
- `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If
1326
- no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the
1327
- padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in
1328
- each row of the batch).
1329
- """,
1330
- LLAMA_START_DOCSTRING,
1331
- )
1332
- class LlamaForSequenceClassification(LlamaPreTrainedModel):
1333
- def __init__(self, config):
1334
- super().__init__(config)
1335
- self.num_labels = config.num_labels
1336
- self.model = LlamaModel(config)
1337
- self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False)
1338
-
1339
- # Initialize weights and apply final processing
1340
- self.post_init()
1341
-
1342
- def get_input_embeddings(self):
1343
- return self.model.embed_tokens
1344
-
1345
- def set_input_embeddings(self, value):
1346
- self.model.embed_tokens = value
1347
-
1348
- @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING)
1349
- def forward(
1350
- self,
1351
- input_ids: Optional[torch.LongTensor] = None,
1352
- attention_mask: Optional[torch.Tensor] = None,
1353
- position_ids: Optional[torch.LongTensor] = None,
1354
- past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,
1355
- inputs_embeds: Optional[torch.FloatTensor] = None,
1356
- labels: Optional[torch.LongTensor] = None,
1357
- use_cache: Optional[bool] = None,
1358
- output_attentions: Optional[bool] = None,
1359
- output_hidden_states: Optional[bool] = None,
1360
- return_dict: Optional[bool] = None,
1361
- ) -> Union[Tuple, SequenceClassifierOutputWithPast]:
1362
- r"""
1363
- labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
1364
- Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,
1365
- config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
1366
- `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
1367
- """
1368
- return_dict = return_dict if return_dict is not None else self.config.use_return_dict
1369
-
1370
- transformer_outputs = self.model(
1371
- input_ids,
1372
- attention_mask=attention_mask,
1373
- position_ids=position_ids,
1374
- past_key_values=past_key_values,
1375
- inputs_embeds=inputs_embeds,
1376
- use_cache=use_cache,
1377
- output_attentions=output_attentions,
1378
- output_hidden_states=output_hidden_states,
1379
- return_dict=return_dict,
1380
- )
1381
- hidden_states = transformer_outputs[0]
1382
- logits = self.score(hidden_states)
1383
-
1384
- if input_ids is not None:
1385
- batch_size = input_ids.shape[0]
1386
- else:
1387
- batch_size = inputs_embeds.shape[0]
1388
-
1389
- if self.config.pad_token_id is None and batch_size != 1:
1390
- raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.")
1391
- if self.config.pad_token_id is None:
1392
- sequence_lengths = -1
1393
- else:
1394
- if input_ids is not None:
1395
- # if no pad token found, use modulo instead of reverse indexing for ONNX compatibility
1396
- sequence_lengths = torch.eq(input_ids, self.config.pad_token_id).int().argmax(-1) - 1
1397
- sequence_lengths = sequence_lengths % input_ids.shape[-1]
1398
- sequence_lengths = sequence_lengths.to(logits.device)
1399
- else:
1400
- sequence_lengths = -1
1401
-
1402
- pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths]
1403
-
1404
- loss = None
1405
- if labels is not None:
1406
- labels = labels.to(logits.device)
1407
- if self.config.problem_type is None:
1408
- if self.num_labels == 1:
1409
- self.config.problem_type = "regression"
1410
- elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int):
1411
- self.config.problem_type = "single_label_classification"
1412
- else:
1413
- self.config.problem_type = "multi_label_classification"
1414
-
1415
- if self.config.problem_type == "regression":
1416
- loss_fct = MSELoss()
1417
- if self.num_labels == 1:
1418
- loss = loss_fct(pooled_logits.squeeze(), labels.squeeze())
1419
- else:
1420
- loss = loss_fct(pooled_logits, labels)
1421
- elif self.config.problem_type == "single_label_classification":
1422
- loss_fct = CrossEntropyLoss()
1423
- loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1))
1424
- elif self.config.problem_type == "multi_label_classification":
1425
- loss_fct = BCEWithLogitsLoss()
1426
- loss = loss_fct(pooled_logits, labels)
1427
- if not return_dict:
1428
- output = (pooled_logits,) + transformer_outputs[1:]
1429
- return ((loss,) + output) if loss is not None else output
1430
-
1431
- return SequenceClassifierOutputWithPast(
1432
- loss=loss,
1433
- logits=pooled_logits,
1434
- past_key_values=transformer_outputs.past_key_values,
1435
- hidden_states=transformer_outputs.hidden_states,
1436
- attentions=transformer_outputs.attentions,
1437
- )
1438
-
1439
-
1440
- @add_start_docstrings(
1441
- """
1442
- The Llama Model transformer with a span classification head on top for extractive question-answering tasks like
1443
- SQuAD (a linear layer on top of the hidden-states output to compute `span start logits` and `span end logits`).
1444
- """,
1445
- LLAMA_START_DOCSTRING,
1446
- )
1447
- class LlamaForQuestionAnswering(LlamaPreTrainedModel):
1448
- base_model_prefix = "transformer"
1449
-
1450
- # Copied from transformers.models.bloom.modeling_bloom.BloomForQuestionAnswering.__init__ with Bloom->Llama
1451
- def __init__(self, config):
1452
- super().__init__(config)
1453
- self.transformer = LlamaModel(config)
1454
- self.qa_outputs = nn.Linear(config.hidden_size, 2)
1455
-
1456
- # Initialize weights and apply final processing
1457
- self.post_init()
1458
-
1459
- def get_input_embeddings(self):
1460
- return self.transformer.embed_tokens
1461
-
1462
- def set_input_embeddings(self, value):
1463
- self.transformer.embed_tokens = value
1464
-
1465
- @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING)
1466
- def forward(
1467
- self,
1468
- input_ids: Optional[torch.LongTensor] = None,
1469
- attention_mask: Optional[torch.FloatTensor] = None,
1470
- position_ids: Optional[torch.LongTensor] = None,
1471
- past_key_values: Optional[Union[Cache, List[torch.FloatTensor]]] = None,
1472
- inputs_embeds: Optional[torch.FloatTensor] = None,
1473
- start_positions: Optional[torch.LongTensor] = None,
1474
- end_positions: Optional[torch.LongTensor] = None,
1475
- output_attentions: Optional[bool] = None,
1476
- output_hidden_states: Optional[bool] = None,
1477
- return_dict: Optional[bool] = None,
1478
- ) -> Union[Tuple, QuestionAnsweringModelOutput]:
1479
- r"""
1480
- start_positions (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
1481
- Labels for position (index) of the start of the labelled span for computing the token classification loss.
1482
- Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence
1483
- are not taken into account for computing the loss.
1484
- end_positions (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
1485
- Labels for position (index) of the end of the labelled span for computing the token classification loss.
1486
- Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence
1487
- are not taken into account for computing the loss.
1488
- """
1489
- return_dict = return_dict if return_dict is not None else self.config.use_return_dict
1490
-
1491
- outputs = self.transformer(
1492
- input_ids,
1493
- attention_mask=attention_mask,
1494
- position_ids=position_ids,
1495
- past_key_values=past_key_values,
1496
- inputs_embeds=inputs_embeds,
1497
- output_attentions=output_attentions,
1498
- output_hidden_states=output_hidden_states,
1499
- return_dict=return_dict,
1500
- )
1501
-
1502
- sequence_output = outputs[0]
1503
-
1504
- logits = self.qa_outputs(sequence_output)
1505
- start_logits, end_logits = logits.split(1, dim=-1)
1506
- start_logits = start_logits.squeeze(-1).contiguous()
1507
- end_logits = end_logits.squeeze(-1).contiguous()
1508
-
1509
- total_loss = None
1510
- if start_positions is not None and end_positions is not None:
1511
- # If we are on multi-GPU, split add a dimension
1512
- if len(start_positions.size()) > 1:
1513
- start_positions = start_positions.squeeze(-1).to(start_logits.device)
1514
- if len(end_positions.size()) > 1:
1515
- end_positions = end_positions.squeeze(-1).to(end_logits.device)
1516
- # sometimes the start/end positions are outside our model inputs, we ignore these terms
1517
- ignored_index = start_logits.size(1)
1518
- start_positions = start_positions.clamp(0, ignored_index)
1519
- end_positions = end_positions.clamp(0, ignored_index)
1520
-
1521
- loss_fct = CrossEntropyLoss(ignore_index=ignored_index)
1522
- start_loss = loss_fct(start_logits, start_positions)
1523
- end_loss = loss_fct(end_logits, end_positions)
1524
- total_loss = (start_loss + end_loss) / 2
1525
-
1526
- if not return_dict:
1527
- output = (start_logits, end_logits) + outputs[2:]
1528
- return ((total_loss,) + output) if total_loss is not None else output
1529
-
1530
- return QuestionAnsweringModelOutput(
1531
- loss=total_loss,
1532
- start_logits=start_logits,
1533
- end_logits=end_logits,
1534
- hidden_states=outputs.hidden_states,
1535
- attentions=outputs.attentions,
1536
- )
1537
-
1538
-
1539
- @add_start_docstrings(
1540
- """
1541
- The Llama Model transformer with a token classification head on top (a linear layer on top of the hidden-states
1542
- output) e.g. for Named-Entity-Recognition (NER) tasks.
1543
- """,
1544
- LLAMA_START_DOCSTRING,
1545
- )
1546
- class LlamaForTokenClassification(LlamaPreTrainedModel):
1547
- def __init__(self, config):
1548
- super().__init__(config)
1549
- self.num_labels = config.num_labels
1550
- self.model = LlamaModel(config)
1551
- if getattr(config, "classifier_dropout", None) is not None:
1552
- classifier_dropout = config.classifier_dropout
1553
- elif getattr(config, "hidden_dropout", None) is not None:
1554
- classifier_dropout = config.hidden_dropout
1555
- else:
1556
- classifier_dropout = 0.1
1557
- self.dropout = nn.Dropout(classifier_dropout)
1558
- self.score = nn.Linear(config.hidden_size, config.num_labels)
1559
-
1560
- # Initialize weights and apply final processing
1561
- self.post_init()
1562
-
1563
- def get_input_embeddings(self):
1564
- return self.model.embed_tokens
1565
-
1566
- def set_input_embeddings(self, value):
1567
- self.model.embed_tokens = value
1568
-
1569
- @add_start_docstrings_to_model_forward(LLAMA_INPUTS_DOCSTRING)
1570
- def forward(
1571
- self,
1572
- input_ids: Optional[torch.LongTensor] = None,
1573
- attention_mask: Optional[torch.Tensor] = None,
1574
- position_ids: Optional[torch.LongTensor] = None,
1575
- past_key_values: Optional[List[torch.FloatTensor]] = None,
1576
- inputs_embeds: Optional[torch.FloatTensor] = None,
1577
- labels: Optional[torch.LongTensor] = None,
1578
- use_cache: Optional[bool] = None,
1579
- output_attentions: Optional[bool] = None,
1580
- output_hidden_states: Optional[bool] = None,
1581
- return_dict: Optional[bool] = None,
1582
- ) -> Union[Tuple, TokenClassifierOutput]:
1583
- r"""
1584
- labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
1585
- Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,
1586
- config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
1587
- `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
1588
- """
1589
- return_dict = return_dict if return_dict is not None else self.config.use_return_dict
1590
-
1591
- outputs = self.model(
1592
- input_ids,
1593
- attention_mask=attention_mask,
1594
- position_ids=position_ids,
1595
- past_key_values=past_key_values,
1596
- inputs_embeds=inputs_embeds,
1597
- use_cache=use_cache,
1598
- output_attentions=output_attentions,
1599
- output_hidden_states=output_hidden_states,
1600
- return_dict=return_dict,
1601
- )
1602
- sequence_output = outputs[0]
1603
- sequence_output = self.dropout(sequence_output)
1604
- logits = self.score(sequence_output)
1605
-
1606
- loss = None
1607
- if labels is not None:
1608
- loss_fct = CrossEntropyLoss()
1609
- loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1))
1610
-
1611
- if not return_dict:
1612
- output = (logits,) + outputs[2:]
1613
- return ((loss,) + output) if loss is not None else output
1614
-
1615
- return TokenClassifierOutput(
1616
- loss=loss,
1617
- logits=logits,
1618
- hidden_states=outputs.hidden_states,
1619
- attentions=outputs.attentions,
1620
- )