|  | """ HelpingAI model . """ | 
					
						
						|  | from typing import Optional, Tuple, Union | 
					
						
						|  | import math | 
					
						
						|  |  | 
					
						
						|  | import torch | 
					
						
						|  | import torch.utils.checkpoint | 
					
						
						|  | from transformers import AutoModel, AutoModelForCausalLM | 
					
						
						|  | from torch import nn | 
					
						
						|  | from torch.nn import CrossEntropyLoss | 
					
						
						|  | from transformers.modeling_outputs import ( | 
					
						
						|  | BaseModelOutputWithPast, | 
					
						
						|  | CausalLMOutputWithPast, | 
					
						
						|  | ) | 
					
						
						|  | from transformers.modeling_utils import PreTrainedModel | 
					
						
						|  | from transformers.utils import logging | 
					
						
						|  | from .configuration_HelpingAI import HelpingAIConfig | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | logger = logging.get_logger(__name__) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def _make_causal_mask( | 
					
						
						|  | input_ids_shape: torch.Size, | 
					
						
						|  | dtype: torch.dtype, | 
					
						
						|  | device: torch.device, | 
					
						
						|  | past_key_values_length: int = 0, | 
					
						
						|  | ): | 
					
						
						|  | """Make causal mask used for bi-directional self-attention.""" | 
					
						
						|  | batch_size, tgt_len = input_ids_shape | 
					
						
						|  | mask = torch.full((tgt_len, tgt_len), torch.finfo(torch.float16).min, device=device) | 
					
						
						|  | mask_cond = torch.arange(mask.size(-1), device=device) | 
					
						
						|  | mask.masked_fill_(mask_cond < (mask_cond + 1).view(mask.size(-1), 1), 0) | 
					
						
						|  | mask = mask.to(dtype) | 
					
						
						|  | if past_key_values_length > 0: | 
					
						
						|  | mask = torch.cat([torch.zeros(tgt_len, past_key_values_length, dtype=dtype, device=device), mask], dim=-1) | 
					
						
						|  | return mask[None, None, :, :].expand(batch_size, 1, tgt_len, tgt_len + past_key_values_length) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def _expand_mask(mask: torch.Tensor, dtype: torch.dtype, tgt_len: Optional[int] = None): | 
					
						
						|  | """Expands attention_mask from `[batch_size, seq_len]` to `[batch_size, 1, tgt_seq_len, src_seq_len]`.""" | 
					
						
						|  | batch_size, src_len = mask.size() | 
					
						
						|  | tgt_len = tgt_len if tgt_len is not None else src_len | 
					
						
						|  |  | 
					
						
						|  | expanded_mask = mask[:, None, None, :].expand(batch_size, 1, tgt_len, src_len).to(dtype) | 
					
						
						|  | inverted_mask = 1.0 - expanded_mask | 
					
						
						|  |  | 
					
						
						|  | return inverted_mask.masked_fill( | 
					
						
						|  | inverted_mask.to(torch.bool), torch.finfo(dtype).min | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class RotaryEmbedding(nn.Module): | 
					
						
						|  | def __init__( | 
					
						
						|  | self, | 
					
						
						|  | dim: int, | 
					
						
						|  | max_position_embeddings: int, | 
					
						
						|  | base: int = 10_000, | 
					
						
						|  | device: Optional[torch.device] = None, | 
					
						
						|  | ): | 
					
						
						|  | super().__init__() | 
					
						
						|  |  | 
					
						
						|  | self.dim = dim | 
					
						
						|  | self.max_position_embeddings = max_position_embeddings | 
					
						
						|  | self.base = base | 
					
						
						|  | inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2, device=device, dtype=torch.float32) / self.dim)) | 
					
						
						|  | self.register_buffer("inv_freq", inv_freq, persistent=False) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | self._set_cos_sin_cache( | 
					
						
						|  | seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype(), | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | def _set_cos_sin_cache(self, seq_len: int, device: torch.device, dtype: torch.dtype): | 
					
						
						|  | self.max_seq_len_cached = seq_len | 
					
						
						|  | t = torch.arange(self.max_seq_len_cached, device=device, dtype=torch.float32) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | freqs = torch.outer(t, self.inv_freq) | 
					
						
						|  |  | 
					
						
						|  | emb = torch.cat((freqs, freqs), dim=-1) | 
					
						
						|  | self.register_buffer("cos_cached", emb.cos()[None, None, :, :].to(dtype), persistent=False) | 
					
						
						|  | self.register_buffer("sin_cached", emb.sin()[None, None, :, :].to(dtype), persistent=False) | 
					
						
						|  |  | 
					
						
						|  | def forward(self, x: torch.Tensor, seq_len: Optional[int] = None): | 
					
						
						|  |  | 
					
						
						|  | if seq_len > self.max_seq_len_cached: | 
					
						
						|  | self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=torch.get_default_dtype()) | 
					
						
						|  | return ( | 
					
						
						|  | self.cos_cached[:, :, :seq_len, ...].to(dtype=x.dtype), | 
					
						
						|  | self.sin_cached[:, :, :seq_len, ...].to(dtype=x.dtype), | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def rotate_half(x: torch.Tensor): | 
					
						
						|  | """Rotates half the hidden dims of the input.""" | 
					
						
						|  | x1, x2 = torch.chunk(x, 2, dim=-1) | 
					
						
						|  | return torch.cat((-x2, x1), dim=-1) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def apply_rotary_pos_emb(q, k, cos, sin, position_ids): | 
					
						
						|  |  | 
					
						
						|  | cos = cos.squeeze(1).squeeze(0) | 
					
						
						|  | sin = sin.squeeze(1).squeeze(0) | 
					
						
						|  | cos = cos[position_ids].unsqueeze(1) | 
					
						
						|  | sin = sin[position_ids].unsqueeze(1) | 
					
						
						|  | q_embed = (q * cos) + (rotate_half(q) * sin) | 
					
						
						|  | k_embed = (k * cos) + (rotate_half(k) * sin) | 
					
						
						|  | return q_embed, k_embed | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class MLP(nn.Module): | 
					
						
						|  | def __init__(self, config: HelpingAIConfig): | 
					
						
						|  | super().__init__() | 
					
						
						|  | self.config = config | 
					
						
						|  | self.hidden_size = config.hidden_size | 
					
						
						|  | self.intermediate_size = config.intermediate_size | 
					
						
						|  | self.gate_proj = nn.Linear(config.hidden_size, config.intermediate_size, bias=False) | 
					
						
						|  | self.up_proj = nn.Linear(config.hidden_size, config.intermediate_size, bias=False) | 
					
						
						|  | self.down_proj = nn.Linear(config.intermediate_size, config.hidden_size, bias=False) | 
					
						
						|  | self.act_fn = nn.SiLU() | 
					
						
						|  |  | 
					
						
						|  | def forward(self, x: torch.Tensor) -> torch.Tensor: | 
					
						
						|  | return self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x)) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: | 
					
						
						|  | """ | 
					
						
						|  | This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, | 
					
						
						|  | num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) | 
					
						
						|  | """ | 
					
						
						|  | batch, num_key_value_heads, slen, head_dim = hidden_states.shape | 
					
						
						|  | if n_rep == 1: | 
					
						
						|  | return hidden_states | 
					
						
						|  | hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) | 
					
						
						|  | return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class Attention(nn.Module): | 
					
						
						|  | def __init__(self, config: HelpingAIConfig): | 
					
						
						|  | super().__init__() | 
					
						
						|  | self.config = config | 
					
						
						|  | self.hidden_size = config.hidden_size | 
					
						
						|  | self.num_heads = config.num_attention_heads | 
					
						
						|  | self.head_dim = self.hidden_size // self.num_heads | 
					
						
						|  | self.num_key_value_heads = config.num_key_value_heads | 
					
						
						|  | self.num_key_value_groups = self.num_heads // self.num_key_value_heads | 
					
						
						|  | self.max_position_embeddings = config.max_position_embeddings | 
					
						
						|  |  | 
					
						
						|  | if (self.head_dim * self.num_heads) != self.hidden_size: | 
					
						
						|  | raise ValueError( | 
					
						
						|  | f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" | 
					
						
						|  | f" and `num_heads`: {self.num_heads})." | 
					
						
						|  | ) | 
					
						
						|  | self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.head_dim, bias=False) | 
					
						
						|  | self.k_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) | 
					
						
						|  | self.v_proj = nn.Linear(self.hidden_size, self.num_key_value_heads * self.head_dim, bias=False) | 
					
						
						|  | self.o_proj = nn.Linear(self.hidden_size, self.hidden_size, bias=False) | 
					
						
						|  |  | 
					
						
						|  | self._init_rope() | 
					
						
						|  |  | 
					
						
						|  | def _init_rope(self): | 
					
						
						|  | self.rotary_ndims = int(self.head_dim * self.config.rope_pct) | 
					
						
						|  | self.rotary_emb = RotaryEmbedding( | 
					
						
						|  | self.rotary_ndims, | 
					
						
						|  | max_position_embeddings=self.config.max_position_embeddings, | 
					
						
						|  | base=self.config.rope_theta, | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | def forward( | 
					
						
						|  | self, | 
					
						
						|  | hidden_states: torch.FloatTensor, | 
					
						
						|  | attention_mask: torch.FloatTensor, | 
					
						
						|  | position_ids: torch.LongTensor, | 
					
						
						|  | past_key_value: Optional[Tuple[torch.Tensor]] = None, | 
					
						
						|  | output_attentions: Optional[bool] = False, | 
					
						
						|  | use_cache: Optional[bool] = False, | 
					
						
						|  | ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: | 
					
						
						|  | bsz, q_len, _ = hidden_states.size() | 
					
						
						|  |  | 
					
						
						|  | query_states = self.q_proj(hidden_states) | 
					
						
						|  | key_states = self.k_proj(hidden_states) | 
					
						
						|  | value_states = self.v_proj(hidden_states) | 
					
						
						|  |  | 
					
						
						|  | query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) | 
					
						
						|  | key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) | 
					
						
						|  | value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) | 
					
						
						|  |  | 
					
						
						|  | query_rot = query_states[..., : self.rotary_ndims] | 
					
						
						|  | query_pass = query_states[..., self.rotary_ndims :] | 
					
						
						|  | key_rot = key_states[..., : self.rotary_ndims] | 
					
						
						|  | key_pass = key_states[..., self.rotary_ndims :] | 
					
						
						|  |  | 
					
						
						|  | kv_seq_len = key_states.shape[-2] | 
					
						
						|  | if past_key_value is not None: | 
					
						
						|  | kv_seq_len += past_key_value[0].shape[-2] | 
					
						
						|  | cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len) | 
					
						
						|  | query_states, key_states = apply_rotary_pos_emb(query_rot, key_rot, cos, sin, position_ids) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | query_states = torch.cat((query_states, query_pass), dim=-1) | 
					
						
						|  | key_states = torch.cat((key_states, key_pass), dim=-1) | 
					
						
						|  |  | 
					
						
						|  | if past_key_value is not None: | 
					
						
						|  |  | 
					
						
						|  | key_states = torch.cat((past_key_value[0], key_states), dim=2) | 
					
						
						|  | value_states = torch.cat((past_key_value[1], value_states), dim=2) | 
					
						
						|  |  | 
					
						
						|  | past_key_value = (key_states, value_states) if use_cache else None | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | key_states = repeat_kv(key_states, self.num_key_value_groups) | 
					
						
						|  | value_states = repeat_kv(value_states, self.num_key_value_groups) | 
					
						
						|  |  | 
					
						
						|  | attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) | 
					
						
						|  |  | 
					
						
						|  | if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): | 
					
						
						|  | raise ValueError( | 
					
						
						|  | f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" | 
					
						
						|  | f" {attn_weights.size()}" | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | if attention_mask is not None: | 
					
						
						|  | if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): | 
					
						
						|  | raise ValueError( | 
					
						
						|  | f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" | 
					
						
						|  | ) | 
					
						
						|  | attn_weights = attn_weights + attention_mask | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype) | 
					
						
						|  | attn_output = torch.matmul(attn_weights, value_states) | 
					
						
						|  |  | 
					
						
						|  | if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): | 
					
						
						|  | raise ValueError( | 
					
						
						|  | f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" | 
					
						
						|  | f" {attn_output.size()}" | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | attn_output = attn_output.transpose(1, 2).contiguous() | 
					
						
						|  | attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | attn_output = self.o_proj(attn_output) | 
					
						
						|  |  | 
					
						
						|  | if not output_attentions: | 
					
						
						|  | attn_weights = None | 
					
						
						|  |  | 
					
						
						|  | return attn_output, attn_weights, past_key_value | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class DecoderLayer(nn.Module): | 
					
						
						|  | def __init__(self, config: HelpingAIConfig): | 
					
						
						|  | super().__init__() | 
					
						
						|  | self.self_attn = Attention(config) | 
					
						
						|  | self.mlp = MLP(config) | 
					
						
						|  | self.input_layernorm = nn.LayerNorm(config.hidden_size, eps=config.norm_eps) | 
					
						
						|  | self.post_attention_layernorm = nn.LayerNorm(config.hidden_size, eps=config.norm_eps) | 
					
						
						|  |  | 
					
						
						|  | def forward( | 
					
						
						|  | self, | 
					
						
						|  | hidden_states: Optional[torch.FloatTensor], | 
					
						
						|  | attention_mask: Optional[torch.FloatTensor] = None, | 
					
						
						|  | position_ids: Optional[torch.LongTensor] = None, | 
					
						
						|  | past_key_value: Optional[Tuple[torch.Tensor]] = None, | 
					
						
						|  | output_attentions: Optional[bool] = False, | 
					
						
						|  | use_cache: Optional[bool] = False, | 
					
						
						|  | ) -> Union[Tuple[torch.Tensor], Optional[Tuple[torch.Tensor, Tuple[torch.FloatTensor, ...]]]]: | 
					
						
						|  | residual = hidden_states | 
					
						
						|  |  | 
					
						
						|  | hidden_states = self.input_layernorm(hidden_states) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | hidden_states, self_attn_weights, present_key_value = self.self_attn( | 
					
						
						|  | hidden_states=hidden_states, | 
					
						
						|  | attention_mask=attention_mask, | 
					
						
						|  | position_ids=position_ids, | 
					
						
						|  | past_key_value=past_key_value, | 
					
						
						|  | output_attentions=output_attentions, | 
					
						
						|  | use_cache=use_cache, | 
					
						
						|  | ) | 
					
						
						|  | hidden_states = residual + hidden_states | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | residual = hidden_states | 
					
						
						|  | hidden_states = self.post_attention_layernorm(hidden_states) | 
					
						
						|  | hidden_states = self.mlp(hidden_states) | 
					
						
						|  | hidden_states = residual + hidden_states | 
					
						
						|  |  | 
					
						
						|  | outputs = (hidden_states,) | 
					
						
						|  |  | 
					
						
						|  | if output_attentions: | 
					
						
						|  | outputs += (self_attn_weights,) | 
					
						
						|  |  | 
					
						
						|  | if use_cache: | 
					
						
						|  | outputs += (present_key_value,) | 
					
						
						|  |  | 
					
						
						|  | return outputs | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class HelpingAIPreTrainedModel(PreTrainedModel): | 
					
						
						|  | """An abstract class to handle weights initialization and a simple interface | 
					
						
						|  | for downloading and loading pretrained models. | 
					
						
						|  | """ | 
					
						
						|  |  | 
					
						
						|  | config_class = HelpingAIConfig | 
					
						
						|  | base_model_prefix = "transformer" | 
					
						
						|  | supports_gradient_checkpointing = True | 
					
						
						|  | _no_split_modules = ["DecoderLayer"] | 
					
						
						|  | _skip_keys_device_placement = "past_key_values" | 
					
						
						|  |  | 
					
						
						|  | def _init_weights(self, module: nn.Module): | 
					
						
						|  | """Initialize the weights""" | 
					
						
						|  | if isinstance(module, nn.Linear): | 
					
						
						|  | module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) | 
					
						
						|  | if module.bias is not None: | 
					
						
						|  | module.bias.data.zero_() | 
					
						
						|  | elif isinstance(module, nn.Embedding): | 
					
						
						|  | module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) | 
					
						
						|  | if module.padding_idx is not None: | 
					
						
						|  | module.weight.data[module.padding_idx].zero_() | 
					
						
						|  | elif isinstance(module, nn.LayerNorm): | 
					
						
						|  | module.bias.data.zero_() | 
					
						
						|  | module.weight.data.fill_(1.0) | 
					
						
						|  |  | 
					
						
						|  | def _set_gradient_checkpointing(self, module: nn.Module, value=False): | 
					
						
						|  | if isinstance(module, HelpingAIModel): | 
					
						
						|  | module.gradient_checkpointing = value | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class HelpingAIModel(HelpingAIPreTrainedModel): | 
					
						
						|  | def __init__(self, config: HelpingAIConfig): | 
					
						
						|  | super().__init__(config) | 
					
						
						|  | self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, config.pad_token_id) | 
					
						
						|  | self.layers = nn.ModuleList([DecoderLayer(config) for _ in range(config.num_hidden_layers)]) | 
					
						
						|  | self.norm = nn.LayerNorm(config.hidden_size, eps=config.norm_eps) | 
					
						
						|  |  | 
					
						
						|  | self.gradient_checkpointing = False | 
					
						
						|  |  | 
					
						
						|  | self.post_init() | 
					
						
						|  |  | 
					
						
						|  | def get_input_embeddings(self): | 
					
						
						|  | return self.embed_tokens | 
					
						
						|  |  | 
					
						
						|  | def set_input_embeddings(self, value: nn.Module): | 
					
						
						|  | self.embed_tokens = value | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | def _prepare_decoder_attention_mask( | 
					
						
						|  | self, | 
					
						
						|  | attention_mask: torch.Tensor, | 
					
						
						|  | input_shape: torch.Size, | 
					
						
						|  | inputs_embeds: torch.Tensor, | 
					
						
						|  | past_key_values_length: int, | 
					
						
						|  | ): | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | combined_attention_mask = None | 
					
						
						|  | if input_shape[-1] > 1: | 
					
						
						|  | combined_attention_mask = _make_causal_mask( | 
					
						
						|  | input_shape, | 
					
						
						|  | inputs_embeds.dtype, | 
					
						
						|  | device=inputs_embeds.device, | 
					
						
						|  | past_key_values_length=past_key_values_length, | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | if attention_mask is not None: | 
					
						
						|  |  | 
					
						
						|  | expanded_attn_mask = _expand_mask( | 
					
						
						|  | attention_mask, inputs_embeds.dtype, tgt_len=input_shape[-1] | 
					
						
						|  | ).to(inputs_embeds.device) | 
					
						
						|  | combined_attention_mask = expanded_attn_mask if combined_attention_mask is None else expanded_attn_mask + combined_attention_mask | 
					
						
						|  |  | 
					
						
						|  | return combined_attention_mask | 
					
						
						|  |  | 
					
						
						|  | def forward( | 
					
						
						|  | self, | 
					
						
						|  | input_ids: Optional[torch.LongTensor] = None, | 
					
						
						|  | attention_mask: Optional[torch.FloatTensor] = None, | 
					
						
						|  | position_ids: Optional[torch.LongTensor] = None, | 
					
						
						|  | past_key_values: Optional[Tuple[Tuple[torch.FloatTensor]]] = None, | 
					
						
						|  | inputs_embeds: Optional[torch.FloatTensor] = None, | 
					
						
						|  | use_cache: Optional[bool] = None, | 
					
						
						|  | output_attentions: Optional[bool] = None, | 
					
						
						|  | output_hidden_states: Optional[bool] = None, | 
					
						
						|  | return_dict: Optional[bool] = None, | 
					
						
						|  | ) -> Union[Tuple, BaseModelOutputWithPast]: | 
					
						
						|  | output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions | 
					
						
						|  | output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states | 
					
						
						|  | use_cache = use_cache if use_cache is not None else self.config.use_cache | 
					
						
						|  |  | 
					
						
						|  | return_dict = return_dict if return_dict is not None else self.config.use_return_dict | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | if input_ids is not None and inputs_embeds is not None: | 
					
						
						|  | raise ValueError( | 
					
						
						|  | "You cannot specify both decoder_input_ids and decoder_inputs_embeds at the same time" | 
					
						
						|  | ) | 
					
						
						|  | elif input_ids is not None: | 
					
						
						|  | batch_size, seq_length = input_ids.shape | 
					
						
						|  | elif inputs_embeds is not None: | 
					
						
						|  | batch_size, seq_length, _ = inputs_embeds.shape | 
					
						
						|  | else: | 
					
						
						|  | raise ValueError( | 
					
						
						|  | "You have to specify either decoder_input_ids or decoder_inputs_embeds" | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | seq_length_with_past = seq_length | 
					
						
						|  | past_key_values_length = 0 | 
					
						
						|  |  | 
					
						
						|  | if past_key_values is not None: | 
					
						
						|  | past_key_values_length = past_key_values[0][0].shape[2] | 
					
						
						|  | seq_length_with_past = seq_length_with_past + past_key_values_length | 
					
						
						|  |  | 
					
						
						|  | if position_ids is None: | 
					
						
						|  | device = input_ids.device if input_ids is not None else inputs_embeds.device | 
					
						
						|  | position_ids = torch.arange( | 
					
						
						|  | past_key_values_length, | 
					
						
						|  | seq_length + past_key_values_length, | 
					
						
						|  | dtype=torch.long, | 
					
						
						|  | device=device, | 
					
						
						|  | ) | 
					
						
						|  | position_ids = position_ids.unsqueeze(0).view(-1, seq_length) | 
					
						
						|  | else: | 
					
						
						|  | position_ids = position_ids.view(-1, seq_length).long() | 
					
						
						|  |  | 
					
						
						|  | if inputs_embeds is None: | 
					
						
						|  | inputs_embeds = self.embed_tokens(input_ids) | 
					
						
						|  |  | 
					
						
						|  | if attention_mask is None: | 
					
						
						|  | attention_mask = torch.ones( | 
					
						
						|  | (batch_size, seq_length_with_past), | 
					
						
						|  | dtype=torch.bool, | 
					
						
						|  | device=inputs_embeds.device, | 
					
						
						|  | ) | 
					
						
						|  | attention_mask = self._prepare_decoder_attention_mask( | 
					
						
						|  | attention_mask, | 
					
						
						|  | (batch_size, seq_length), | 
					
						
						|  | inputs_embeds, | 
					
						
						|  | past_key_values_length, | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | hidden_states = inputs_embeds | 
					
						
						|  |  | 
					
						
						|  | if self.gradient_checkpointing and self.training: | 
					
						
						|  | if use_cache: | 
					
						
						|  | logger.warning( | 
					
						
						|  | "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." | 
					
						
						|  | ) | 
					
						
						|  | use_cache = False | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | all_hidden_states = () if output_hidden_states else None | 
					
						
						|  | all_self_attns = () if output_attentions else None | 
					
						
						|  | next_decoder_cache = () if use_cache else None | 
					
						
						|  |  | 
					
						
						|  | for idx, decoder_layer in enumerate(self.layers): | 
					
						
						|  | if output_hidden_states: | 
					
						
						|  | all_hidden_states += (hidden_states,) | 
					
						
						|  |  | 
					
						
						|  | past_key_value = ( | 
					
						
						|  | past_key_values[idx] if past_key_values is not None else None | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | if self.gradient_checkpointing and self.training: | 
					
						
						|  |  | 
					
						
						|  | def create_custom_forward(module): | 
					
						
						|  | def custom_forward(*inputs): | 
					
						
						|  |  | 
					
						
						|  | return module(*inputs, past_key_value, output_attentions) | 
					
						
						|  |  | 
					
						
						|  | return custom_forward | 
					
						
						|  |  | 
					
						
						|  | layer_outputs = torch.utils.checkpoint.checkpoint( | 
					
						
						|  | create_custom_forward(decoder_layer), | 
					
						
						|  | hidden_states, | 
					
						
						|  | attention_mask, | 
					
						
						|  | position_ids, | 
					
						
						|  | ) | 
					
						
						|  | else: | 
					
						
						|  | layer_outputs = decoder_layer( | 
					
						
						|  | hidden_states, | 
					
						
						|  | attention_mask=attention_mask, | 
					
						
						|  | position_ids=position_ids, | 
					
						
						|  | past_key_value=past_key_value, | 
					
						
						|  | output_attentions=output_attentions, | 
					
						
						|  | use_cache=use_cache, | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | hidden_states = layer_outputs[0] | 
					
						
						|  |  | 
					
						
						|  | if use_cache: | 
					
						
						|  | next_decoder_cache += (layer_outputs[2 if output_attentions else 1],) | 
					
						
						|  |  | 
					
						
						|  | if output_attentions: | 
					
						
						|  | all_self_attns += (layer_outputs[1],) | 
					
						
						|  |  | 
					
						
						|  | hidden_states = self.norm(hidden_states) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | if output_hidden_states: | 
					
						
						|  | all_hidden_states += (hidden_states,) | 
					
						
						|  |  | 
					
						
						|  | next_cache = next_decoder_cache if use_cache else None | 
					
						
						|  | if not return_dict: | 
					
						
						|  | return tuple( | 
					
						
						|  | v | 
					
						
						|  | for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] | 
					
						
						|  | if v is not None | 
					
						
						|  | ) | 
					
						
						|  | return BaseModelOutputWithPast( | 
					
						
						|  | last_hidden_state=hidden_states, | 
					
						
						|  | past_key_values=next_cache, | 
					
						
						|  | hidden_states=all_hidden_states, | 
					
						
						|  | attentions=all_self_attns, | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | class HelpingAIForCausalLM(HelpingAIPreTrainedModel): | 
					
						
						|  | _tied_weights_keys = ["lm_head.weight"] | 
					
						
						|  |  | 
					
						
						|  | def __init__(self, config: HelpingAIConfig): | 
					
						
						|  | super().__init__(config) | 
					
						
						|  |  | 
					
						
						|  | self.model = HelpingAIModel(config) | 
					
						
						|  | self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | self.post_init() | 
					
						
						|  |  | 
					
						
						|  | def get_input_embeddings(self): | 
					
						
						|  | return self.model.embed_tokens | 
					
						
						|  |  | 
					
						
						|  | def set_input_embeddings(self, value): | 
					
						
						|  | self.model.embed_tokens = value | 
					
						
						|  |  | 
					
						
						|  | def get_output_embeddings(self): | 
					
						
						|  | return self.lm_head | 
					
						
						|  |  | 
					
						
						|  | def set_output_embeddings(self, new_embeddings: nn.Module): | 
					
						
						|  | self.lm_head = new_embeddings | 
					
						
						|  |  | 
					
						
						|  | def get_decoder(self): | 
					
						
						|  | return self.transformer | 
					
						
						|  |  | 
					
						
						|  | def set_decoder(self, decoder): | 
					
						
						|  | self.transformer = decoder | 
					
						
						|  |  | 
					
						
						|  | def forward( | 
					
						
						|  | self, | 
					
						
						|  | input_ids: Optional[torch.LongTensor] = None, | 
					
						
						|  | attention_mask: Optional[torch.FloatTensor] = None, | 
					
						
						|  | position_ids: Optional[torch.LongTensor] = None, | 
					
						
						|  | past_key_values: Optional[Tuple[Tuple[torch.FloatTensor]]] = None, | 
					
						
						|  | inputs_embeds: Optional[torch.FloatTensor] = None, | 
					
						
						|  | labels: Optional[torch.LongTensor] = None, | 
					
						
						|  | use_cache: Optional[bool] = None, | 
					
						
						|  | output_attentions: Optional[bool] = None, | 
					
						
						|  | output_hidden_states: Optional[bool] = None, | 
					
						
						|  | return_dict: Optional[bool] = None, | 
					
						
						|  | ) -> Union[Tuple, CausalLMOutputWithPast]: | 
					
						
						|  | output_attentions = ( | 
					
						
						|  | output_attentions | 
					
						
						|  | if output_attentions is not None | 
					
						
						|  | else self.config.output_attentions | 
					
						
						|  | ) | 
					
						
						|  | output_hidden_states = ( | 
					
						
						|  | output_hidden_states | 
					
						
						|  | if output_hidden_states is not None | 
					
						
						|  | else self.config.output_hidden_states | 
					
						
						|  | ) | 
					
						
						|  | return_dict = ( | 
					
						
						|  | return_dict if return_dict is not None else self.config.use_return_dict | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | outputs = self.model( | 
					
						
						|  | input_ids, | 
					
						
						|  | attention_mask=attention_mask, | 
					
						
						|  | position_ids=position_ids, | 
					
						
						|  | past_key_values=past_key_values, | 
					
						
						|  | inputs_embeds=inputs_embeds, | 
					
						
						|  | use_cache=use_cache, | 
					
						
						|  | output_attentions=output_attentions, | 
					
						
						|  | output_hidden_states=output_hidden_states, | 
					
						
						|  | return_dict=return_dict, | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | hidden_states = outputs[0] | 
					
						
						|  | logits = self.lm_head(hidden_states).float() | 
					
						
						|  |  | 
					
						
						|  | loss = None | 
					
						
						|  | if labels is not None: | 
					
						
						|  |  | 
					
						
						|  | shift_logits = logits[..., :-1, :].contiguous() | 
					
						
						|  | shift_labels = labels[..., 1:].contiguous() | 
					
						
						|  |  | 
					
						
						|  | loss_fct = CrossEntropyLoss() | 
					
						
						|  | shift_logits = shift_logits.view(-1, self.config.vocab_size) | 
					
						
						|  | shift_labels = shift_labels.view(-1) | 
					
						
						|  |  | 
					
						
						|  | shift_labels = shift_labels.to(shift_logits.device) | 
					
						
						|  | loss = loss_fct(shift_logits, shift_labels) | 
					
						
						|  |  | 
					
						
						|  | if not return_dict: | 
					
						
						|  | output = (logits,) + outputs[1:] | 
					
						
						|  | return (loss,) + output if loss is not None else output | 
					
						
						|  |  | 
					
						
						|  | return CausalLMOutputWithPast( | 
					
						
						|  | loss=loss, | 
					
						
						|  | logits=logits, | 
					
						
						|  | past_key_values=outputs.past_key_values, | 
					
						
						|  | hidden_states=outputs.hidden_states, | 
					
						
						|  | attentions=outputs.attentions, | 
					
						
						|  | ) | 
					
						
						|  |  | 
					
						
						|  | def prepare_inputs_for_generation( | 
					
						
						|  | self, | 
					
						
						|  | input_ids, | 
					
						
						|  | past_key_values: Optional[torch.Tensor] = None, | 
					
						
						|  | attention_mask: Optional[torch.Tensor] = None, | 
					
						
						|  | inputs_embeds: Optional[torch.Tensor] = None, | 
					
						
						|  | **kwargs, | 
					
						
						|  | ): | 
					
						
						|  |  | 
					
						
						|  | if past_key_values and past_key_values[0] is not None: | 
					
						
						|  | input_ids = input_ids[:, -1:] | 
					
						
						|  |  | 
					
						
						|  | position_ids = kwargs.get("position_ids", None) | 
					
						
						|  | if attention_mask is not None and position_ids is None: | 
					
						
						|  |  | 
					
						
						|  | position_ids = attention_mask.long().cumsum(-1) - 1 | 
					
						
						|  | position_ids.masked_fill_(attention_mask == 0, 1) | 
					
						
						|  | if past_key_values: | 
					
						
						|  | position_ids = position_ids[:, -1].unsqueeze(-1) | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | if inputs_embeds is not None and past_key_values is None: | 
					
						
						|  | model_inputs = {"inputs_embeds": inputs_embeds} | 
					
						
						|  | else: | 
					
						
						|  | model_inputs = {"input_ids": input_ids} | 
					
						
						|  |  | 
					
						
						|  | model_inputs.update( | 
					
						
						|  | { | 
					
						
						|  | "attention_mask": attention_mask, | 
					
						
						|  | "past_key_values": past_key_values, | 
					
						
						|  | "use_cache": kwargs.get("use_cache"), | 
					
						
						|  | "position_ids": position_ids, | 
					
						
						|  | } | 
					
						
						|  | ) | 
					
						
						|  | return model_inputs | 
					
						
						|  |  | 
					
						
						|  | @staticmethod | 
					
						
						|  | def _reorder_cache(past_key_values, beam_idx): | 
					
						
						|  | reordered_past = () | 
					
						
						|  | for layer_past in past_key_values: | 
					
						
						|  | reordered_past += ( | 
					
						
						|  | tuple( | 
					
						
						|  | past_state.index_select(0, beam_idx.to(past_state.device)) | 
					
						
						|  | for past_state in layer_past | 
					
						
						|  | ), | 
					
						
						|  | ) | 
					
						
						|  | return reordered_past | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | HelpingAIConfig.register_for_auto_class() | 
					
						
						|  | HelpingAIForCausalLM.register_for_auto_class("AutoModelForCausalLM") | 
					
						
						|  |  |