papahawk/falcon-40b
116
1# port of models described in RW2# We use the bloom model as a starting point for these model.3# Please refer to the bloom models for usage instructions.4 5import math6import warnings7from typing import Optional, Tuple, Union8 9import torch10import torch.utils.checkpoint11from torch import nn12from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, LayerNorm, MSELoss13from torch.nn import functional as F14 15from transformers.modeling_outputs import (16 BaseModelOutputWithPastAndCrossAttentions,17 CausalLMOutputWithCrossAttentions,18 QuestionAnsweringModelOutput,19 SequenceClassifierOutputWithPast,20 TokenClassifierOutput,21)22from transformers.modeling_utils import PreTrainedModel23from transformers.utils import logging24from .configuration_RW import RWConfig25 26logger = logging.get_logger(__name__)27 28# NOTE(Hesslow): Unfortunately we did not fuse matmul and bias during training, this means that there's one additional quantization to bfloat16 between the operations.29# In order not to degrade the quality of our HF-port, we keep these characteristics in the final model.30class Linear(nn.Linear):31 def forward(self, input: torch.Tensor) -> torch.Tensor:32 ret = input @ self.weight.T33 if self.bias is None:34 return ret35 else:36 return ret + self.bias37 38 39from einops import rearrange40 41# rotary pos emb helpers (torch.jit.script does not seem to support staticmethod...)42def rotate_half(x):43 x1, x2 = x[..., : x.shape[-1] // 2], x[..., x.shape[-1] // 2 :]44 return torch.cat((-x2, x1), dim=x1.ndim - 1) # dim=-1 triggers a bug in torch < 1.8.045 46 47class RotaryEmbedding(torch.nn.Module):48 """Implementation of RotaryEmbedding from GPT-NeoX.49 This implementation is design to operate on queries and keys that are compatible with50 [batch_size, n_heads_per_partition, seq_len, head_dim] (e.g. MinGPTAttention format).51 """52 53 def __init__(54 self,55 head_dim: int,56 base=10000,57 ):58 super().__init__()59 inv_freq = 1.0 / (base ** (torch.arange(0, head_dim, 2).float() / head_dim))60 self.register_buffer("inv_freq", inv_freq, persistent=False)61 self.head_dim = head_dim62 self.seq_len_cached = None63 self.batch_size_cached = None64 self.cos_cached: torch.Tensor | None = None65 self.sin_cached: torch.Tensor | None = None66 67 def cos_sin(68 self,69 seq_len: int,70 device="cuda",71 dtype=torch.bfloat16,72 ) -> torch.Tensor:73 if seq_len != self.seq_len_cached:74 self.seq_len_cached = seq_len75 t = torch.arange(seq_len, device=device).type_as(self.inv_freq)76 freqs = torch.einsum("i,j->ij", t, self.inv_freq)77 emb = torch.cat((freqs, freqs), dim=-1).to(device)78 79 if dtype in [torch.float16, torch.bfloat16]:80 emb = emb.float()81 82 self.cos_cached = emb.cos()[None, :, :]83 self.sin_cached = emb.sin()[None, :, :]84 85 self.cos_cached = self.cos_cached.type(dtype)86 self.sin_cached = self.sin_cached.type(dtype)87 88 return self.cos_cached, self.sin_cached89 90 def forward(self, q, k):91 batch, seq_len, head_dim = q.shape92 cos, sin = self.cos_sin(seq_len, q.device, q.dtype)93 return (q * cos) + (rotate_half(q) * sin), (k * cos) + (rotate_half(k) * sin)94 95 96def _make_causal_mask(97 input_ids_shape: torch.Size, device: torch.device, past_key_values_length: int98) -> torch.BoolTensor:99 batch_size, target_length = input_ids_shape100 mask = torch.empty((target_length, target_length + past_key_values_length), dtype=torch.bool, device=device)101 # ONNX doesn't support `torch.Tensor.triu` properly, thus we use this workaround102 seq_ids = torch.arange(target_length, device=device)103 mask[:, past_key_values_length:] = seq_ids[:, None] < seq_ids[None, :]104 105 if past_key_values_length > 0:106 mask[:, :past_key_values_length] = False107 108 expanded_mask = mask[None, None, :, :].expand(batch_size, 1, target_length, target_length + past_key_values_length)109 return expanded_mask110 111 112def _expand_mask(mask: torch.Tensor, tgt_length: int) -> torch.BoolTensor:113 batch_size, src_length = mask.shape114 tgt_length = tgt_length if tgt_length is not None else src_length115 116 expanded_mask = ~(mask[:, None, None, :].to(torch.bool))117 return expanded_mask.expand(batch_size, 1, tgt_length, src_length)118 119 120def build_alibi_tensor(attention_mask: torch.Tensor, num_heads: int, dtype: torch.dtype) -> torch.Tensor:121 batch_size, seq_length = attention_mask.shape122 closest_power_of_2 = 2 ** math.floor(math.log2(num_heads))123 base = torch.tensor(124 2 ** (-(2 ** -(math.log2(closest_power_of_2) - 3))), device=attention_mask.device, dtype=torch.float32125 )126 powers = torch.arange(1, 1 + closest_power_of_2, device=attention_mask.device, dtype=torch.int32)127 slopes = torch.pow(base, powers)128 129 if closest_power_of_2 != num_heads:130 extra_base = torch.tensor(131 2 ** (-(2 ** -(math.log2(2 * closest_power_of_2) - 3))), device=attention_mask.device, dtype=torch.float32132 )133 num_remaining_heads = min(closest_power_of_2, num_heads - closest_power_of_2)134 extra_powers = torch.arange(1, 1 + 2 * num_remaining_heads, 2, device=attention_mask.device, dtype=torch.int32)135 slopes = torch.cat([slopes, torch.pow(extra_base, extra_powers)], dim=0)136 137 # Note: alibi will added to the attention bias that will be applied to the query, key product of attention138 # => therefore alibi will have to be of shape (batch_size, num_heads, query_length, key_length)139 # => here we set (batch_size=1, num_heads=num_heads, query_length=1, key_length=max_length)140 # => the query_length dimension will then be broadcasted correctly141 # This is more or less identical to T5's relative position bias:142 # https://github.com/huggingface/transformers/blob/f681437203baa7671de3174b0fa583c349d9d5e1/src/transformers/models/t5/modeling_t5.py#L527143 arange_tensor = ((attention_mask.cumsum(dim=-1) - 1) * attention_mask)[:, None, :]144 alibi = slopes[..., None].bfloat16() * arange_tensor145 return alibi.reshape(batch_size * num_heads, 1, seq_length).to(dtype)146 147 148def dropout_add(x: torch.Tensor, residual: torch.Tensor, prob: float, training: bool) -> torch.Tensor:149 out = F.dropout(x, p=prob, training=training)150 out = residual + out151 return out152 153 154class Attention(nn.Module):155 def __init__(self, config: RWConfig):156 super().__init__()157 158 self.hidden_size = config.hidden_size159 self.num_heads = config.n_head160 self.head_dim = self.hidden_size // self.num_heads161 self.split_size = self.hidden_size162 self.hidden_dropout = config.hidden_dropout163 164 if self.head_dim * self.num_heads != self.hidden_size:165 raise ValueError(166 f"`hidden_size` must be divisible by num_heads (got `hidden_size`: {self.hidden_size} and `num_heads`:"167 f" {self.num_heads})."168 )169 170 self.maybe_rotary = RotaryEmbedding(config.head_dim) if config.rotary else lambda q, k: (q, k)171 172 # Layer-wise attention scaling173 self.inv_norm_factor = 1.0 / math.sqrt(self.head_dim)174 self.beta = self.inv_norm_factor175 176 self.query_key_value = Linear(177 self.hidden_size,178 (config.n_head_kv * 2 + config.n_head) * self.head_dim,179 bias=config.bias,180 )181 self.dense = Linear(self.hidden_size, self.hidden_size, bias=config.bias)182 self.attention_dropout = nn.Dropout(config.attention_dropout)183 self.num_kv = config.n_head_kv184 185 def _split_heads(self, fused_qkv: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:186 """187 Split the last dimension into (num_heads, head_dim), results share same memory188 storage as `fused_qkv`189 190 Args:191 fused_qkv (`torch.tensor`, *required*): [batch_size, seq_length, num_heads * 3 * head_dim]192 193 Returns:194 query: [batch_size, seq_length, num_heads, head_dim]195 key: [batch_size, seq_length, num_heads, head_dim]196 value: [batch_size, seq_length, num_heads, head_dim]197 """198 batch, seq_len, _ = fused_qkv.shape199 qkv = fused_qkv.view(batch, seq_len, -1, self.num_heads // self.num_kv + 2, 64)200 q = qkv[:, :, :, :-2]201 k = qkv[:, :, :, [-2]]202 v = qkv[:, :, :, [-1]]203 k = torch.broadcast_to(k, q.shape)204 v = torch.broadcast_to(v, q.shape)205 206 q, k, v = [207 rearrange(208 x,209 "batch seq_len group num_heads head_dim ->\210 batch seq_len (group num_heads) head_dim",211 head_dim=self.head_dim,212 )213 for x in [q, k, v]214 ]215 return q, k, v216 217 def _merge_heads(self, x: torch.Tensor) -> torch.Tensor:218 """219 Merge heads together over the last dimenstion220 221 Args:222 x: (`torch.tensor`, *required*): [batch_size * num_heads, seq_length, head_dim]223 224 Returns:225 torch.tensor: [batch_size, seq_length, num_heads * head_dim]226 """227 # What we want to achieve is:228 # batch_size * num_heads, seq_length, head_dim -> batch_size, seq_length, num_heads * head_dim229 batch_size_and_num_heads, seq_length, _ = x.shape230 batch_size = batch_size_and_num_heads // self.num_heads231 232 # First view to decompose the batch size233 # batch_size * num_heads, seq_length, head_dim -> batch_size, num_heads, seq_length, head_dim234 x = x.view(batch_size, self.num_heads, seq_length, self.head_dim)235 236 # batch_size, num_heads, seq_length, head_dim -> batch_size, seq_length, num_heads, head_dim237 x = x.permute(0, 2, 1, 3)238 239 # batch_size, seq_length, num_heads, head_dim -> batch_size, seq_length, num_heads * head_dim240 return x.reshape(batch_size, seq_length, self.num_heads * self.head_dim)241 242 def forward(243 self,244 hidden_states: torch.Tensor,245 alibi: torch.Tensor,246 attention_mask: torch.Tensor,247 layer_past: Optional[Tuple[torch.Tensor, torch.Tensor]] = None,248 head_mask: Optional[torch.Tensor] = None,249 use_cache: bool = False,250 output_attentions: bool = False,251 ):252 fused_qkv = self.query_key_value(hidden_states) # [batch_size, seq_length, 3 x hidden_size]253 254 # 3 x [batch_size, seq_length, num_heads, head_dim]255 (query_layer, key_layer, value_layer) = self._split_heads(fused_qkv)256 257 batch_size, q_length, _, _ = query_layer.shape258 259 query_layer = query_layer.transpose(1, 2).reshape(batch_size * self.num_heads, q_length, self.head_dim)260 key_layer = key_layer.transpose(1, 2).reshape(261 batch_size * self.num_heads,262 q_length,263 self.head_dim,264 )265 value_layer = value_layer.transpose(1, 2).reshape(batch_size * self.num_heads, q_length, self.head_dim)266 267 query_layer, key_layer = self.maybe_rotary(query_layer, key_layer)268 269 if layer_past is not None:270 past_key, past_value = layer_past271 # concatenate along seq_length dimension:272 # - key: [batch_size * self.num_heads, head_dim, kv_length]273 # - value: [batch_size * self.num_heads, kv_length, head_dim]274 key_layer = torch.cat((past_key, key_layer), dim=1)275 value_layer = torch.cat((past_value, value_layer), dim=1)276 277 _, kv_length, _ = key_layer.shape278 279 if use_cache is True:280 present = (key_layer, value_layer)281 else:282 present = None283 284 if alibi is None:285 query_layer_ = query_layer.reshape(batch_size, self.num_heads, -1, self.head_dim)286 key_layer_ = key_layer.reshape(batch_size, self.num_heads, -1, self.head_dim)287 value_layer_ = value_layer.reshape(batch_size, self.num_heads, -1, self.head_dim)288 289 attn_output = F.scaled_dot_product_attention(290 query_layer_, key_layer_, value_layer_, None, 0.0, is_causal=True291 )292 293 x = attn_output.view(batch_size, self.num_heads, q_length, self.head_dim)294 x = x.permute(0, 2, 1, 3)295 attn_output = x.reshape(batch_size, q_length, self.num_heads * self.head_dim)296 297 output_tensor = self.dense(attn_output)298 299 outputs = (output_tensor, present)300 assert not output_attentions # not supported.301 return outputs302 else:303 attention_mask_float = (attention_mask * 1.0).masked_fill(attention_mask, -1e9).to(torch.bfloat16)304 matmul_result = query_layer @ key_layer.transpose(-1, -2)305 306 # change view to [batch_size, num_heads, q_length, kv_length]307 attention_scores = matmul_result.view(batch_size, self.num_heads, q_length, kv_length)308 309 # cast attention scores to fp32, compute scaled softmax and cast back to initial dtype - [batch_size, num_heads, q_length, kv_length]310 input_dtype = attention_scores.dtype311 # `float16` has a minimum value of -65504.0, whereas `bfloat16` and `float32` have a minimum value of `-3.4e+38`312 if input_dtype == torch.float16 or input_dtype == torch.bfloat16:313 attention_scores = attention_scores.to(torch.float32)314 # attn_weights = torch.masked_fill(attention_scores, attention_mask, torch.finfo(attention_scores.dtype).min)315 attention_probs = F.softmax(316 (attention_scores + alibi.view(batch_size, self.num_heads, 1, -1)) * self.inv_norm_factor317 + attention_mask_float,318 dim=-1,319 dtype=hidden_states.dtype,320 )321 # [batch_size, num_heads, q_length, kv_length]322 attention_probs = self.attention_dropout(attention_probs)323 324 if head_mask is not None:325 attention_probs = attention_probs * head_mask326 327 # change view [batch_size x num_heads, q_length, kv_length]328 attention_probs_reshaped = attention_probs.view(batch_size * self.num_heads, q_length, kv_length)329 330 # matmul: [batch_size * num_heads, q_length, head_dim]331 context_layer = attention_probs_reshaped @ value_layer332 333 # change view [batch_size, num_heads, q_length, head_dim]334 context_layer = self._merge_heads(context_layer)335 336 output_tensor = self.dense(context_layer)337 338 outputs = (output_tensor, present)339 if output_attentions:340 outputs += (attention_probs,)341 342 return outputs343 344 345class MLP(nn.Module):346 def __init__(self, config: RWConfig):347 super().__init__()348 hidden_size = config.hidden_size349 350 self.dense_h_to_4h = Linear(hidden_size, 4 * hidden_size, bias=config.bias)351 self.act = nn.GELU()352 self.dense_4h_to_h = Linear(4 * hidden_size, hidden_size, bias=config.bias)353 self.hidden_dropout = config.hidden_dropout354 355 def forward(self, x: torch.Tensor) -> torch.Tensor:356 x = self.act(self.dense_h_to_4h(x))357 x = self.dense_4h_to_h(x)358 return x359 360 361class DecoderLayer(nn.Module):362 def __init__(self, config: RWConfig):363 super().__init__()364 hidden_size = config.hidden_size365 366 self.ln_attn = LayerNorm(hidden_size, eps=config.layer_norm_epsilon)367 self.ln_mlp = LayerNorm(hidden_size, eps=config.layer_norm_epsilon)368 369 self.num_heads = config.n_head370 self.self_attention = Attention(config)371 372 self.mlp = MLP(config)373 374 self.apply_residual_connection_post_layernorm = config.apply_residual_connection_post_layernorm375 self.hidden_dropout = config.hidden_dropout376 377 self.config = config378 379 def forward(380 self,381 hidden_states: torch.Tensor,382 alibi: torch.Tensor,383 attention_mask: torch.Tensor,384 layer_past: Optional[Tuple[torch.Tensor, torch.Tensor]] = None,385 head_mask: Optional[torch.Tensor] = None,386 use_cache: bool = False,387 output_attentions: bool = False,388 ):389 390 ln_attn = self.ln_attn(hidden_states)391 ln_mlp = self.ln_mlp(hidden_states)392 393 residual = hidden_states394 395 # Self attention.396 attn_outputs = self.self_attention(397 ln_attn,398 layer_past=layer_past,399 attention_mask=attention_mask,400 alibi=alibi,401 head_mask=head_mask,402 use_cache=use_cache,403 output_attentions=output_attentions,404 )405 406 attention_output = attn_outputs[0]407 408 outputs = attn_outputs[1:]409 410 # MLP.411 mlp_output = self.mlp(ln_mlp)412 413 output = dropout_add(414 mlp_output + attention_output, residual, self.config.hidden_dropout, training=self.training415 )416 417 if use_cache:418 outputs = (output,) + outputs419 else:420 outputs = (output,) + outputs[1:]421 422 return outputs # hidden_states, present, attentions423 424 425class RWPreTrainedModel(PreTrainedModel):426 _keys_to_ignore_on_load_missing = [r"h.*.self_attention.scale_mask_softmax.causal_mask", r"lm_head.weight"]427 """428 An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained429 models.430 """431 432 config_class = RWConfig433 base_model_prefix = "transformer"434 supports_gradient_checkpointing = True435 _no_split_modules = ["DecoderLayer"]436 437 def __init__(self, *inputs, **kwargs):438 super().__init__(*inputs, **kwargs)439 440 def _init_weights(self, module: nn.Module):441 """Initialize the weights."""442 if isinstance(module, nn.Linear) or isinstance(module, Linear):443 # Slightly different from the TF version which uses truncated_normal for initialization444 # cf https://github.com/pytorch/pytorch/pull/5617445 module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)446 if module.bias is not None:447 module.bias.data.zero_()448 elif isinstance(module, nn.Embedding):449 module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)450 if module.padding_idx is not None:451 module.weight.data[module.padding_idx].zero_()452 elif isinstance(module, LayerNorm):453 module.bias.data.zero_()454 module.weight.data.fill_(1.0)455 456 def _set_gradient_checkpointing(self, module: nn.Module, value: bool = False):457 if isinstance(module, RWModel):458 module.gradient_checkpointing = value459 460 @staticmethod461 def _convert_to_standard_cache(462 past_key_value: Tuple[Tuple[torch.Tensor, torch.Tensor]], batch_size: int463 ) -> Tuple[Tuple[torch.Tensor, torch.Tensor]]:464 """465 Standardizes the format of the cache so as to match most implementations, i.e. to tuple(tuple([batch_size,466 num_heads, ...]))467 """468 batch_size_times_num_heads, head_dim, seq_length = past_key_value[0][0].shape469 num_heads = batch_size_times_num_heads // batch_size470 # key: [batch_size * num_heads, head_dim, seq_length] -> [batch_size, num_heads, head_dim, seq_length]471 # value: [batch_size * num_heads, seq_length, head_dim] -> [batch_size, num_heads, seq_length, head_dim]472 return tuple(473 (474 layer_past[0].view(batch_size, num_heads, head_dim, seq_length),475 layer_past[1].view(batch_size, num_heads, seq_length, head_dim),476 )477 for layer_past in past_key_value478 )479 480 @staticmethod481 def _convert_to_rw_cache(482 past_key_value: Tuple[Tuple[torch.Tensor, torch.Tensor]]483 ) -> Tuple[Tuple[torch.Tensor, torch.Tensor]]:484 batch_size, num_heads, head_dim, seq_length = past_key_value[0][0].shape485 batch_size_times_num_heads = batch_size * num_heads486 # key: [batch_size, num_heads, head_dim, seq_length] -> [batch_size * num_heads, head_dim, seq_length]487 # value: [batch_size, num_heads, seq_length, head_dim] -> [batch_size * num_heads, seq_length, head_dim]488 return tuple(489 (490 layer_past[0].view(batch_size_times_num_heads, head_dim, seq_length),491 layer_past[1].view(batch_size_times_num_heads, seq_length, head_dim),492 )493 for layer_past in past_key_value494 )495 496 497class RWModel(RWPreTrainedModel):498 def __init__(self, config: RWConfig):499 super().__init__(config)500 501 self.embed_dim = config.hidden_size502 self.num_heads = config.n_head503 self.alibi = config.alibi504 505 # Embedding + LN Embedding506 self.word_embeddings = nn.Embedding(config.vocab_size, self.embed_dim)507 508 # Transformer blocks509 self.h = nn.ModuleList([DecoderLayer(config) for _ in range(config.num_hidden_layers)])510 511 # Final Layer Norm512 self.ln_f = LayerNorm(self.embed_dim, eps=config.layer_norm_epsilon)513 514 self.gradient_checkpointing = False515 516 # Initialize weights and apply final processing517 self.post_init()518 519 def get_input_embeddings(self):520 return self.word_embeddings521 522 def _prepare_attn_mask(523 self, attention_mask: torch.Tensor, input_shape: Tuple[int, int], past_key_values_length: int524 ) -> torch.BoolTensor:525 # create causal mask526 # [batch_size, seq_length] -> [batch_size, 1, tgt_length, src_length]527 combined_attention_mask = None528 device = attention_mask.device529 _, src_length = input_shape530 531 if src_length > 1:532 combined_attention_mask = _make_causal_mask(533 input_shape, device=device, past_key_values_length=past_key_values_length534 )535 536 # [batch_size, seq_length] -> [batch_size, 1, tgt_length, src_length]537 expanded_attn_mask = _expand_mask(attention_mask, tgt_length=src_length)538 combined_attention_mask = (539 expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask | combined_attention_mask540 )541 542 return combined_attention_mask543 544 def set_input_embeddings(self, new_embeddings: torch.Tensor):545 self.word_embeddings = new_embeddings546 547 def forward(548 self,549 input_ids: Optional[torch.LongTensor] = None,550 past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None,551 attention_mask: Optional[torch.Tensor] = None,552 head_mask: Optional[torch.LongTensor] = None,553 inputs_embeds: Optional[torch.LongTensor] = None,554 use_cache: Optional[bool] = None,555 output_attentions: Optional[bool] = None,556 output_hidden_states: Optional[bool] = None,557 return_dict: Optional[bool] = None,558 **deprecated_arguments,559 ) -> Union[Tuple[torch.Tensor, ...], BaseModelOutputWithPastAndCrossAttentions]:560 if deprecated_arguments.pop("position_ids", False) is not False:561 # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None`562 warnings.warn(563 "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore"564 " passing `position_ids`.",565 FutureWarning,566 )567 if len(deprecated_arguments) > 0:568 raise ValueError(f"Got unexpected arguments: {deprecated_arguments}")569 570 output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions571 output_hidden_states = (572 output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states573 )574 use_cache = use_cache if use_cache is not None else self.config.use_cache575 return_dict = return_dict if return_dict is not None else self.config.use_return_dict576 577 if input_ids is not None and inputs_embeds is not None:578 raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")579 elif input_ids is not None:580 batch_size, seq_length = input_ids.shape581 elif inputs_embeds is not None:582 batch_size, seq_length, _ = inputs_embeds.shape583 else:584 raise ValueError("You have to specify either input_ids or inputs_embeds")585 586 if past_key_values is None:587 past_key_values = tuple([None] * len(self.h))588 589 # Prepare head mask if needed590 # 1.0 in head_mask indicate we keep the head591 # attention_probs has shape batch_size x num_heads x N x N592 # head_mask has shape n_layer x batch x num_heads x N x N593 head_mask = self.get_head_mask(head_mask, self.config.n_layer)594 595 if inputs_embeds is None:596 inputs_embeds = self.word_embeddings(input_ids)597 598 hidden_states = inputs_embeds599 600 presents = () if use_cache else None601 all_self_attentions = () if output_attentions else None602 all_hidden_states = () if output_hidden_states else None603 604 # Compute alibi tensor: check build_alibi_tensor documentation605 seq_length_with_past = seq_length606 past_key_values_length = 0607 if past_key_values[0] is not None:608 past_key_values_length = past_key_values[0][0].shape[2]609 seq_length_with_past = seq_length_with_past + past_key_values_length610 if attention_mask is None:611 attention_mask = torch.ones((batch_size, seq_length_with_past), device=hidden_states.device)612 else:613 attention_mask = attention_mask.to(hidden_states.device)614 615 if self.alibi:616 alibi = build_alibi_tensor(attention_mask, self.num_heads, dtype=hidden_states.dtype)617 else:618 alibi = None619 620 causal_mask = self._prepare_attn_mask(621 attention_mask,622 input_shape=(batch_size, seq_length),623 past_key_values_length=past_key_values_length,624 )625 626 for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)):627 628 if output_hidden_states:629 all_hidden_states = all_hidden_states + (hidden_states,)630 631 if self.gradient_checkpointing and self.training:632 633 if use_cache:634 logger.warning(635 "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..."636 )637 use_cache = False638 639 def create_custom_forward(module):640 def custom_forward(*inputs):641 # None for past_key_value642 return module(*inputs, use_cache=use_cache, output_attentions=output_attentions)643 644 return custom_forward645 646 outputs = torch.utils.checkpoint.checkpoint(647 create_custom_forward(block),648 hidden_states,649 alibi,650 causal_mask,651 head_mask[i],652 )653 else:654 outputs = block(655 hidden_states,656 layer_past=layer_past,657 attention_mask=causal_mask,658 head_mask=head_mask[i],659 use_cache=use_cache,660 output_attentions=output_attentions,661 alibi=alibi,662 )663 664 hidden_states = outputs[0]665 if use_cache is True:666 presents = presents + (outputs[1],)667 668 if output_attentions:669 all_self_attentions = all_self_attentions + (outputs[2 if use_cache else 1],)670 671 # Add last hidden state672 hidden_states = self.ln_f(hidden_states)673 674 if output_hidden_states:675 all_hidden_states = all_hidden_states + (hidden_states,)676 677 if not return_dict:678 return tuple(v for v in [hidden_states, presents, all_hidden_states, all_self_attentions] if v is not None)679 680 return BaseModelOutputWithPastAndCrossAttentions(681 last_hidden_state=hidden_states,682 past_key_values=presents,683 hidden_states=all_hidden_states,684 attentions=all_self_attentions,685 )686 687 688class RWForCausalLM(RWPreTrainedModel):689 _keys_to_ignore_on_load_missing = [r"h.*.self_attention.scale_mask_softmax.causal_mask", r"lm_head.weight"]690 691 def __init__(self, config: RWConfig):692 super().__init__(config)693 self.transformer = RWModel(config)694 self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)695 696 # Initialize weights and apply final processing697 self.post_init()698 699 def get_output_embeddings(self):700 return self.lm_head701 702 def set_output_embeddings(self, new_embeddings: torch.Tensor):703 self.lm_head = new_embeddings704 705 def prepare_inputs_for_generation(706 self,707 input_ids: torch.LongTensor,708 past: Optional[torch.Tensor] = None,709 attention_mask: Optional[torch.Tensor] = None,710 **kwargs,711 ) -> dict:712 # only last token for input_ids if past is not None713 if past:714 input_ids = input_ids[:, -1].unsqueeze(-1)715 716 # the cache may be in the stardard format (e.g. in contrastive search), convert to our's format if needed717 if past[0][0].shape[0] == input_ids.shape[0]:718 past = self._convert_to_rw_cache(past)719 720 return {721 "input_ids": input_ids,722 "past_key_values": past,723 "use_cache": kwargs.get("use_cache"),724 "attention_mask": attention_mask,725 }726 727 def forward(728 self,729 input_ids: Optional[torch.LongTensor] = None,730 past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None,731 attention_mask: Optional[torch.Tensor] = None,732 head_mask: Optional[torch.Tensor] = None,733 inputs_embeds: Optional[torch.Tensor] = None,734 labels: Optional[torch.Tensor] = None,735 use_cache: Optional[bool] = None,736 output_attentions: Optional[bool] = None,737 output_hidden_states: Optional[bool] = None,738 return_dict: Optional[bool] = None,739 **deprecated_arguments,740 ) -> Union[Tuple[torch.Tensor], CausalLMOutputWithCrossAttentions]:741 r"""742 labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):743 Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set744 `labels = input_ids` Indices are selected in `[-100, 0, ..., config.vocab_size]` All labels set to `-100`745 are ignored (masked), the loss is only computed for labels in `[0, ..., config.vocab_size]`746 """747 if deprecated_arguments.pop("position_ids", False) is not False:748 # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None`749 warnings.warn(750 "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore"751 " passing `position_ids`.",752 FutureWarning,753 )754 if len(deprecated_arguments) > 0:755 raise ValueError(f"Got unexpected arguments: {deprecated_arguments}")756 757 return_dict = return_dict if return_dict is not None else self.config.use_return_dict758 759 transformer_outputs = self.transformer(760 input_ids,761 past_key_values=past_key_values,762 attention_mask=attention_mask,763 head_mask=head_mask,764 inputs_embeds=inputs_embeds,765 use_cache=use_cache,766 output_attentions=output_attentions,767 output_hidden_states=output_hidden_states,768 return_dict=return_dict,769 )770 hidden_states = transformer_outputs[0]771 772 lm_logits = self.lm_head(hidden_states)773 774 loss = None775 if labels is not None:776 # Shift so that tokens < n predict n777 shift_logits = lm_logits[..., :-1, :].contiguous()778 shift_labels = labels[..., 1:].contiguous()779 batch_size, seq_length, vocab_size = shift_logits.shape780 # Flatten the tokens781 loss_fct = CrossEntropyLoss()782 loss = loss_fct(783 shift_logits.view(batch_size * seq_length, vocab_size), shift_labels.view(batch_size * seq_length)784 )785 786 if not return_dict:787 output = (lm_logits,) + transformer_outputs[1:]788 return ((loss,) + output) if loss is not None else output789 790 return CausalLMOutputWithCrossAttentions(791 loss=loss,792 logits=lm_logits,793 past_key_values=transformer_outputs.past_key_values,794 hidden_states=transformer_outputs.hidden_states,795 attentions=transformer_outputs.attentions,796 )797 798 def _reorder_cache(799 self, past: Tuple[Tuple[torch.Tensor, torch.Tensor], ...], beam_idx: torch.LongTensor800 ) -> Tuple[Tuple[torch.Tensor, torch.Tensor], ...]:801 """802 This function is used to re-order the `past_key_values` cache if [`~PreTrainedModel.beam_search`] or803 [`~PreTrainedModel.beam_sample`] is called. This is required to match `past_key_values` with the correct804 beam_idx at every generation step.805 806 Output shares the same memory storage as `past`.807 """808 standardized_past = self._convert_to_standard_cache(past, batch_size=len(beam_idx))809 810 # Get a copy of `beam_idx` on all the devices where we need those indices.811 device_to_beam_idx = {812 past_state.device: beam_idx.to(past_state.device) for layer_past in past for past_state in layer_past813 }814 reordered_past = tuple(815 (816 layer_past[0].index_select(0, device_to_beam_idx[layer_past[0].device]),817 layer_past[1].index_select(0, device_to_beam_idx[layer_past[0].device]),818 )819 for layer_past in standardized_past820 )821 return self._convert_to_rw_cache(reordered_past)822 823 824class RWForSequenceClassification(RWPreTrainedModel):825 _keys_to_ignore_on_load_missing = [r"h.*.self_attention.scale_mask_softmax.causal_mask", r"lm_head.weight"]826 827 def __init__(self, config: RWConfig):828 super().__init__(config)829 self.num_labels = config.num_labels830 self.transformer = RWModel(config)831 self.score = nn.Linear(config.hidden_size, config.num_labels, bias=False)832 833 # Initialize weights and apply final processing834 self.post_init()835 836 def forward(837 self,838 input_ids: Optional[torch.LongTensor] = None,839 past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None,840 attention_mask: Optional[torch.Tensor] = None,841 head_mask: Optional[torch.Tensor] = None,842 inputs_embeds: Optional[torch.Tensor] = None,843 labels: Optional[torch.Tensor] = None,844 use_cache: Optional[bool] = None,845 output_attentions: Optional[bool] = None,846 output_hidden_states: Optional[bool] = None,847 return_dict: Optional[bool] = None,848 **deprecated_arguments,849 ) -> Union[Tuple[torch.Tensor], SequenceClassifierOutputWithPast]:850 r"""851 labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):852 Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,853 config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If854 `config.num_labels > 1` a classification loss is computed (Cross-Entropy).855 """856 if deprecated_arguments.pop("position_ids", False) is not False:857 # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None`858 warnings.warn(859 "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore"860 " passing `position_ids`.",861 FutureWarning,862 )863 if len(deprecated_arguments) > 0:864 raise ValueError(f"Got unexpected arguments: {deprecated_arguments}")865 866 return_dict = return_dict if return_dict is not None else self.config.use_return_dict867 868 transformer_outputs = self.transformer(869 input_ids,870 past_key_values=past_key_values,871 attention_mask=attention_mask,872 head_mask=head_mask,873 inputs_embeds=inputs_embeds,874 use_cache=use_cache,875 output_attentions=output_attentions,876 output_hidden_states=output_hidden_states,877 return_dict=return_dict,878 )879 880 hidden_states = transformer_outputs[0]881 logits = self.score(hidden_states)882 883 if input_ids is not None:884 batch_size = input_ids.shape[0]885 else:886 batch_size = inputs_embeds.shape[0]887 888 if self.config.pad_token_id is None and batch_size != 1:889 raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.")890 if self.config.pad_token_id is None:891 sequence_lengths = -1892 else:893 if input_ids is not None:894 sequence_lengths = torch.ne(input_ids, self.config.pad_token_id).sum(dim=-1) - 1895 else:896 sequence_lengths = -1897 logger.warning(898 f"{self.__class__.__name__} will not detect padding tokens in `inputs_embeds`. Results may be "899 "unexpected if using padding tokens in conjunction with `inputs_embeds.`"900 )901 902 pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths]903 904 loss = None905 if labels is not None:906 if self.config.problem_type is None:907 if self.num_labels == 1:908 self.config.problem_type = "regression"909 elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int):910 self.config.problem_type = "single_label_classification"911 else:912 self.config.problem_type = "multi_label_classification"913 914 if self.config.problem_type == "regression":915 loss_fct = MSELoss()916 if self.num_labels == 1:917 loss = loss_fct(pooled_logits.squeeze(), labels.squeeze())918 else:919 loss = loss_fct(pooled_logits, labels)920 elif self.config.problem_type == "single_label_classification":921 loss_fct = CrossEntropyLoss()922 loss = loss_fct(pooled_logits, labels)923 elif self.config.problem_type == "multi_label_classification":924 loss_fct = BCEWithLogitsLoss()925 loss = loss_fct(pooled_logits, labels)926 if not return_dict:927 output = (pooled_logits,) + transformer_outputs[1:]928 return ((loss,) + output) if loss is not None else output929 930 return SequenceClassifierOutputWithPast(931 loss=loss,932 logits=pooled_logits,933 past_key_values=transformer_outputs.past_key_values,934 hidden_states=transformer_outputs.hidden_states,935 attentions=transformer_outputs.attentions,936 )937 938 939class RWForTokenClassification(RWPreTrainedModel):940 _keys_to_ignore_on_load_missing = [r"h.*.self_attention.scale_mask_softmax.causal_mask", r"lm_head.weight"]941 942 def __init__(self, config: RWConfig):943 super().__init__(config)944 self.num_labels = config.num_labels945 946 self.transformer = RWModel(config)947 if hasattr(config, "classifier_dropout") and config.classifier_dropout is not None:948 classifier_dropout = config.classifier_dropout949 elif hasattr(config, "hidden_dropout") and config.hidden_dropout is not None:950 classifier_dropout = config.hidden_dropout951 else:952 classifier_dropout = 0.1953 self.dropout = nn.Dropout(classifier_dropout)954 self.classifier = nn.Linear(config.hidden_size, config.num_labels)955 956 # Initialize weights and apply final processing957 self.post_init()958 959 def forward(960 self,961 input_ids: Optional[torch.LongTensor] = None,962 past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None,963 attention_mask: Optional[torch.Tensor] = None,964 head_mask: Optional[torch.Tensor] = None,965 inputs_embeds: Optional[torch.Tensor] = None,966 labels: Optional[torch.Tensor] = None,967 use_cache: Optional[bool] = None,968 output_attentions: Optional[bool] = None,969 output_hidden_states: Optional[bool] = None,970 return_dict: Optional[bool] = None,971 **deprecated_arguments,972 ) -> Union[Tuple[torch.Tensor], TokenClassifierOutput]:973 r"""974 labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):975 Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,976 config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If977 `config.num_labels > 1` a classification loss is computed (Cross-Entropy).978 """979 if deprecated_arguments.pop("position_ids", False) is not False:980 # `position_ids` could have been `torch.Tensor` or `None` so defaulting pop to `False` allows to detect if users were passing explicitly `None`981 warnings.warn(982 "`position_ids` have no functionality in BLOOM and will be removed in v5.0.0. You can safely ignore"983 " passing `position_ids`.",984 FutureWarning,985 )986 if len(deprecated_arguments) > 0:987 raise ValueError(f"Got unexpected arguments: {deprecated_arguments}")988 989 return_dict = return_dict if return_dict is not None else self.config.use_return_dict990 991 transformer_outputs = self.transformer(992 input_ids,993 past_key_values=past_key_values,994 attention_mask=attention_mask,995 head_mask=head_mask,996 inputs_embeds=inputs_embeds,997 use_cache=use_cache,998 output_attentions=output_attentions,999 output_hidden_states=output_hidden_states,1000 return_dict=return_dict,1001 )1002 1003 hidden_states = transformer_outputs[0]1004 hidden_states = self.dropout(hidden_states)1005 logits = self.classifier(hidden_states)1006 1007 loss = None1008 if labels is not None:1009 batch_size, seq_length = labels.shape1010 loss_fct = CrossEntropyLoss()1011 loss = loss_fct(logits.view(batch_size * seq_length, self.num_labels), labels.view(batch_size * seq_length))1012 1013 if not return_dict:1014 output = (logits,) + transformer_outputs[2:]1015 return ((loss,) + output) if loss is not None else output1016 1017 return TokenClassifierOutput(1018 loss=loss,1019 logits=logits,1020 hidden_states=transformer_outputs.hidden_states,1021 attentions=transformer_outputs.attentions,1022 )1023 1024 1025class RWForQuestionAnswering(RWPreTrainedModel):1026 _keys_to_ignore_on_load_missing = [r"h.*.self_attention.scale_mask_softmax.causal_mask", r"lm_head.weight"]1027 1028 def __init__(self, config):1029 super().__init__(config)1030 self.transformer = RWModel(config)1031 self.qa_outputs = nn.Linear(config.hidden_size, 2)1032 1033 # Initialize weights and apply final processing1034 self.post_init()1035 1036 def forward(1037 self,1038 input_ids: Optional[torch.LongTensor] = None,1039 attention_mask: Optional[torch.FloatTensor] = None,1040 position_ids: Optional[torch.LongTensor] = None,1041 head_mask: Optional[torch.FloatTensor] = None,1042 inputs_embeds: Optional[torch.FloatTensor] = None,1043 start_positions: Optional[torch.LongTensor] = None,1044 end_positions: Optional[torch.LongTensor] = None,1045 output_attentions: Optional[bool] = None,1046 output_hidden_states: Optional[bool] = None,1047 return_dict: Optional[bool] = None,1048 ) -> Union[Tuple, QuestionAnsweringModelOutput]:1049 r"""1050 start_positions (`torch.LongTensor` of shape `(batch_size,)`, *optional*):1051 Labels for position (index) of the start of the labelled span for computing the token classification loss.1052 Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence1053 are not taken into account for computing the loss.1054 end_positions (`torch.LongTensor` of shape `(batch_size,)`, *optional*):1055 Labels for position (index) of the end of the labelled span for computing the token classification loss.1056 Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence1057 are not taken into account for computing the loss.1058 """1059 return_dict = return_dict if return_dict is not None else self.config.use_return_dict1060 1061 outputs = self.transformer(1062 input_ids,1063 attention_mask=attention_mask,1064 position_ids=position_ids,1065 head_mask=head_mask,1066 inputs_embeds=inputs_embeds,1067 output_attentions=output_attentions,1068 output_hidden_states=output_hidden_states,1069 return_dict=return_dict,1070 )1071 1072 sequence_output = outputs[0]1073 1074 logits = self.qa_outputs(sequence_output)1075 start_logits, end_logits = logits.split(1, dim=-1)1076 start_logits = start_logits.squeeze(-1).contiguous()1077 end_logits = end_logits.squeeze(-1).contiguous()1078 1079 total_loss = None1080 if start_positions is not None and end_positions is not None:1081 # If we are on multi-GPU, split add a dimension1082 if len(start_positions.size()) > 1:1083 start_positions = start_positions.squeeze(-1)1084 if len(end_positions.size()) > 1:1085 end_positions = end_positions.squeeze(-1)1086 # sometimes the start/end positions are outside our model inputs, we ignore these terms1087 ignored_index = start_logits.size(1)1088 start_positions = start_positions.clamp(0, ignored_index)1089 end_positions = end_positions.clamp(0, ignored_index)1090 1091 loss_fct = CrossEntropyLoss(ignore_index=ignored_index)1092 start_loss = loss_fct(start_logits, start_positions)1093 end_loss = loss_fct(end_logits, end_positions)1094 total_loss = (start_loss + end_loss) / 21095 1096 if not return_dict:1097 output = (start_logits, end_logits) + outputs[2:]1098 return ((total_loss,) + output) if total_loss is not None else output1099 1100 return QuestionAnsweringModelOutput(1101 loss=total_loss,1102 start_logits=start_logits,1103 end_logits=end_logits,1104 hidden_states=outputs.hidden_states,1105 attentions=outputs.attentions,1106 )1107 