Ë
    ÜÓ^jË|  ã                   ó<  — d Z ddlZddlZddlmZ ddlmZmZmZmZ ddlm	Z
 ddlmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZ ddlmZ ddlmZmZ ddlm Z   ejB                  e"«      Z#d'd„Z$ G d„ dejJ                  «      Z& G d„ dejJ                  «      Z' G d„ de«      Z(e G d„ de«      «       Z)e G d„ de)«      «       Z* ed¬«       G d„ de)e«      «       Z+ ed¬«       G d „ d!e)«      «       Z,e G d"„ d#e)«      «       Z-e G d$„ d%e)«      «       Z.g d&¢Z/y)(zPyTorch MPT model.é    N)Únn)ÚBCEWithLogitsLossÚCrossEntropyLossÚ	LayerNormÚMSELoss)Ú
functionalé   )ÚCacheÚDynamicCache)ÚGenerationMixin)Úcreate_causal_mask)ÚGradientCheckpointingLayer)Ú)BaseModelOutputWithPastAndCrossAttentionsÚ!CausalLMOutputWithCrossAttentionsÚQuestionAnsweringModelOutputÚ SequenceClassifierOutputWithPastÚTokenClassifierOutput)ÚPreTrainedModel)Úauto_docstringÚloggingé   )Ú	MptConfigc                 óR  — t        j                  d|z
  dt         j                  |¬«      j                  ddd|«      }dt	        j
                  t	        j                  | «      «      z  }t        j                  d|dz   t         j                  |¬«      j                  «       }|||z  z  }dt        j                  d|«      z  }|j                  d|dd«      }|| k7  r9t        j                  |dd…ddd…df   |dd…ddd…df   gd¬«      dd…d| …df   }||z  }|j                  d«      S )	aª  
    Link to paper: https://huggingface.co/papers/2108.12409 - Alibi tensor is not causal as the original paper mentions, it
    relies on a translation invariance of softmax for quick implementation. This implementation has been copied from
    the alibi implementation of MPT source code that led to slightly different results than the Bloom alibi:
    https://huggingface.co/mosaicml/mpt-7b/blob/main/attention.py#L292
    r   )ÚdtypeÚdeviceé   g      ð?N.©Údimr   )ÚtorchÚarangeÚint32ÚviewÚmathÚceilÚlog2Úint64ÚfloatÚpowÚconcatÚsqueeze)Ú	num_headsÚsequence_lengthÚalibi_bias_maxr   ÚalibiÚnum_heads_power_of_2ÚbaseÚslopess           úo/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/mpt/modeling_mpt.pyÚbuild_mpt_alibi_tensorr3   *   s  € ô �L‰L˜˜_Ñ,¨a´u·{±{È6ÔR×WÑWÐXYÐ[\Ð^_ÐapÓq€EØ¤§	¡	¬$¯)©)°IÓ*>Ó ?Ñ?Ðä�<‰<˜Ð/°!Ñ3¼5¿;¹;ÈvÔV×\Ñ\Ó^€DØ�>Ð$8Ñ8Ñ9€Dà”5—9‘9˜Q Ó%Ñ%€FØ�[‰[˜Ð0°!°QÓ7€Fà˜yÒ(Ü—‘˜v¢a¨¨¨A¨¨s lÑ3°VºA¹sÀ¸sÀC¸KÑ5HÐIÈqÔQÒRSÐU_ÐV_ÐU_ÐadÐRdÑeˆà�F‰N€EØ�=‰=˜ÓÐó    c            
       óš   ‡ — e Zd ZdZddededz  fˆ fd„Z	 	 ddej                  dej                  de	dz  d	ej                  dz  fd
„Z
ˆ xZS )ÚMptAttentionzzMulti-head self attention.
    Using torch or triton attention implementation enables user to also use additive bias.
    NÚconfigÚ	layer_idxc                 ó¾  •— t         ‰| �  «        |j                  | _        |j                  | _        |j                  | _        | j                  | j                  z  | _        |j                  j                  | _        | j                  €4dt        j                  | j                  | j                  z  «      z  | _        |j                  j                  | _        |j                  j                  | _        t        j                  | j                  d| j                  z  d¬«      | _        t        j                  | j                  | j                  d¬«      | _        || _        y )Nr   r	   F©Úbias)ÚsuperÚ__init__Úhidden_sizeÚn_headsÚmax_seq_lenÚmax_seq_lengthÚhead_dimÚattn_configÚsoftmax_scaler#   ÚsqrtÚ
attn_pdropÚattn_dropout_pÚclip_qkvr   ÚLinearÚWqkvÚout_projr8   )Úselfr7   r8   Ú	__class__s      €r2   r=   zMptAttention.__init__F   s  ø€ Ü‰ÑÔØ!×-Ñ-ˆÔØ—~‘~ˆŒØ$×0Ñ0ˆÔØ×(Ñ(¨D¯L©LÑ8ˆŒØ#×/Ñ/×=Ñ=ˆÔØ×ÑÐ%Ø!"¤T§Y¡Y¨t×/?Ñ/?À$Ç,Á,Ñ/NÓ%OÑ!OˆDÔà$×0Ñ0×;Ñ;ˆÔØ×*Ñ*×3Ñ3ˆŒÜ—I‘I˜d×.Ñ.°°D×4DÑ4DÑ0DÈ5ÔQˆŒ	ÜŸ	™	 $×"2Ñ"2°D×4DÑ4DÈ5ÔQˆŒØ"ˆ�r4   Úhidden_statesÚposition_biasÚpast_key_valuesÚattention_maskc                 óf  — |j                   d d \  }}| j                  |«      }| j                  r(|j                  | j                   | j                  ¬«      }|j	                  dd¬«      \  }	}
}|	j                  ||| j                  | j                  «      j                  dd«      }	|
j                  ||| j                  | j                  «      j                  dd«      }
|j                  ||| j                  | j                  «      j                  dd«      }|� |j                  |
|| j                  «      \  }
}t        j                  |	|
j                  dd«      «      | j                  z  }|€|n||j                  «       z   }|�—t        |j                   «      dk7  r!t!        dt        |j                   «      › �«      ‚|
j                   d   }t#        d	|j%                  d«      |z
  «      }t#        d	|j%                  d«      |z
  «      }|d d …|d …|d …f   }||z   }|�9|j'                  |t        j(                  |	j*                  «      j,                  «      }t.        j0                  j3                  |j5                  «       d¬«      j7                  |j*                  «      }t.        j0                  j9                  || j:                  | j<                  ¬
«      }t        j                  ||«      }|j?                  d	ddd«      jA                  «       jC                  ||d«      }| jE                  |«      }||fS )Nr   )ÚminÚmaxr	   r   r   éÿÿÿÿéþÿÿÿz6Expecting position_bias shape to be 3 dimensions, got r   ©ÚpÚtraining)#ÚshaperJ   rH   ÚclampÚchunkÚreshaper?   rB   Ú	transposeÚupdater8   r   ÚmatmulrD   Úget_seq_lengthÚlenÚ
ValueErrorrT   ÚsizeÚmasked_fillÚfinfor   rS   r   r   Úsoftmaxr'   ÚtoÚdropoutrG   rY   ÚpermuteÚ
contiguousr"   rK   )rL   rN   rO   rP   rQ   ÚkwargsÚ
batch_sizeÚ
seq_lengthÚ	mixed_qkvÚquery_statesÚ
key_statesÚvalue_statesÚattention_scoresÚquery_lengthÚ
key_lengthÚposition_bias_query_indexÚposition_bias_key_indexÚattn_weightsÚcontext_statesÚattn_outputs                       r2   ÚforwardzMptAttention.forwardV   së  € ð "/×!4Ñ!4°R°aÐ!8Ñˆ
�Jà—I‘I˜mÓ,ˆ	Ø�=Š=Ø!Ÿ™¨T¯]©]¨NÀÇÁ˜ÓNˆIà1:·±ÀÈ°Ó1JÑ.ˆ�j ,Ø#×+Ñ+¨J¸
ÀDÇLÁLÐRV×R_ÑR_Ó`×jÑjÐklÐnoÓpˆØ×'Ñ'¨
°JÀÇÁÈdÏmÉmÓ\×fÑfÐghÐjkÓlˆ
Ø#×+Ñ+¨J¸
ÀDÇLÁLÐRV×R_ÑR_Ó`×jÑjÐklÐnoÓpˆàÐ&Ø'6×'=Ñ'=¸jÈ,ÐX\×XfÑXfÓ'gÑ$ˆJ˜ä Ÿ<™<¨°j×6JÑ6JÈ2ÈrÓ6RÓSÐVZ×VhÑVhÑhÐØ%4Ð%<‘zÀ*È×OmÑOmÓOoÑBoˆàÐ$Ü�=×&Ñ&Ó'¨1Ò,Ü Ð#YÔZ]Ð^k×^qÑ^qÓZrÐYsÐ!tÓuÐuØ#×)Ñ)¨"Ñ-ˆJä(+¨A¨}×/AÑ/AÀ!Ó/DÀ|Ñ/SÓ(TÐ%Ü&)¨!¨]×-?Ñ-?ÀÓ-BÀZÑ-OÓ&PÐ#à)ª!Ð-FÑ-GÐI`ÑIaÐ*aÑbˆMà/°-Ñ?ÐàÐ%Ø/×;Ñ;¸NÌEÏKÉKÐXd×XjÑXjÓLk×LoÑLoÓpÐô —}‘}×,Ñ,Ð-=×-CÑ-CÓ-EÈ2Ð,ÓN×QÑQÐR^×RdÑRdÓeˆÜ—}‘}×,Ñ,¨\¸T×=PÑ=PÐ[_×[hÑ[hÐ,ÓiˆäŸ™ l°LÓAˆØ'×/Ñ/°°1°a¸Ó;×FÑFÓH×MÑMÈjÐZdÐfhÓiˆØ—m‘m NÓ3ˆà˜LÐ(Ð(r4   ©N)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr=   r   ÚTensorr
   r{   Ú__classcell__©rM   s   @r2   r6   r6   A   sg   ø„ ññ#˜yð #°S¸4±Zõ #ð( )-Ø.2ñ0)à—|‘|ð0)ð —|‘|ð0)ð  ™ð	0)ð
 Ÿ™ tÑ+÷0)r4   r6   c                   ót   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  dej                  fd„Zˆ xZS )ÚMptMLPr7   c                 ó&  •— t         ‰| �  «        |j                  }t        j                  |d|z  d¬«      | _        t        j                  d¬«      | _        t        j                  d|z  |d¬«      | _        |j                  j                  | _        y )Né   Fr:   Únone)Úapproximate)r<   r=   r>   r   rI   Úup_projÚGELUÚactÚ	down_projrC   rF   Úhidden_dropout)rL   r7   r>   rM   s      €r2   r=   zMptMLP.__init__Š   sm   ø€ Ü‰ÑÔØ×(Ñ(ˆä—y‘y ¨a°+©oÀEÔJˆŒÜ—7‘7 vÔ.ˆŒÜŸ™ 1 {¡?°KÀeÔLˆŒØ$×0Ñ0×;Ñ;ˆÕr4   rN   ÚresidualÚreturnc                 óÊ   — | j                  | j                  |«      «      }| j                  |«      }t        j                  || j
                  | j                  ¬«      }||z   }|S )NrW   )r�   r‹   rŽ   ÚFri   r�   rY   )rL   rN   r�   Úintermediate_outputÚoutputs        r2   r{   zMptMLP.forward“   sW   € ØŸ™ §¡¨mÓ!<Ó=ˆà"Ÿn™n¨]Ó;Ðä—‘Ð.°$×2EÑ2EÐPT×P]ÑP]Ô^ˆØ˜(Ñ"ˆàˆr4   )	r}   r~   r   r   r=   r   r‚   r{   rƒ   r„   s   @r2   r†   r†   ‰   s5   ø„ ð<˜yõ <ð U§\¡\ð ¸U¿\¹\ð ÈeÏlÉl÷ r4   r†   c                   óš   ‡ — e Zd Zddededz  fˆ fd„Z	 	 	 ddej                  dej                  dej                  dedz  d	e	d
e	fd„Z
ˆ xZS )ÚMptBlockNr7   r8   c                 óÐ  •— t         ‰| �  «        |j                  }t        ||j                  ¬«      | _        d | j
                  _        |j                  | _        t        ||«      | _
        t        ||j                  ¬«      | _        d | j                  _        t        |«      | _        |j                  j                  | _        t#        j$                  | j                   «      | _        y )N©Úeps)r<   r=   r>   r   Úlayer_norm_epsilonÚnorm_1r;   r?   r+   r6   ÚattnÚnorm_2r†   ÚffnrC   rF   Údropout_rater   ÚDropoutÚresid_attn_dropout)rL   r7   r8   r>   rM   s       €r2   r=   zMptBlock.__init__Ÿ   s¨   ø€ Ü‰ÑÔØ×(Ñ(ˆä °×1JÑ1JÔKˆŒàˆ�‰ÔàŸ™ˆŒÜ  ¨Ó3ˆŒ	ä °×1JÑ1JÔKˆŒàˆ�‰Ôä˜&“>ˆŒà"×.Ñ.×9Ñ9ˆÔÜ"$§*¡*¨T×->Ñ->Ó"?ˆÕr4   rN   rO   rQ   Ú
layer_pastÚ	use_cacheÚoutput_attentionsc                 óÒ   — | j                  |«      }|}	| j                  ||||¬«      \  }
}| j                  |
«      |	z   }| j                  |«      }|}	| j	                  ||	«      }||fS )N)rO   rQ   rP   )rœ   r�   r¢   rž   rŸ   )rL   rN   rO   rQ   r£   r¤   r¥   rl   Úlayernorm_outputr�   Úattn_outputsrx   r•   s                r2   r{   zMptBlock.forward³   s‰   € ð  Ÿ;™; }Ó5Ðà ˆð &*§Y¡YØØ'Ø)Ø&ð	 &/ó &
Ñ"ˆ�lð ×/Ñ/°Ó=ÀÑHˆàŸ;™; }Ó5Ðð !ˆð —‘Ð*¨HÓ5ˆØ�|Ð#Ð#r4   r|   )NFF)r}   r~   r   r   r�   r=   r   r‚   r
   Úboolr{   rƒ   r„   s   @r2   r—   r—   ž   sw   ø„ ñ@˜yð @°S¸4±Zõ @ð2 $(ØØ"'ñ!$à—|‘|ð!$ð —|‘|ð!$ð Ÿ™ð	!$ð
 ˜D‘Lð!$ð ð!$ð  ÷!$r4   r—   c                   ó&   — e Zd ZU eed<   dZdZdgZy)ÚMptPreTrainedModelr7   ÚtransformerTr—   N)r}   r~   r   r   Ú__annotations__Úbase_model_prefixÚsupports_gradient_checkpointingÚ_no_split_modules© r4   r2   r«   r«   ×   s   … àÓØ%ÐØ&*Ð#Ø#˜Ñr4   r«   c                   ó*  ‡ — e Zd Zdefˆ fd„Zd„ Zdd„Zdej                  fd„Z	e
	 	 	 	 	 	 	 	 ddej                  dz  d	edz  d
ej                  dz  dej                  dz  dedz  dedz  dedz  dedz  deej                  df   ez  fd„«       Zˆ xZS )ÚMptModelr7   c           	      óø  •— t         ‰| �  |«       |j                  | _        |j                  | _        t        j                  |j                  | j                  «      | _        t        j                  t        |j                  «      D �cg c]  }t        ||¬«      ‘Œ c}«      | _        t        | j                  |j                  ¬«      | _        d | j                   _        d| _        | j'                  «        y c c}w )N)r8   r™   F)r<   r=   r>   r?   r+   r   Ú	EmbeddingÚ
vocab_sizeÚwteÚ
ModuleListÚrangeÚn_layersr—   Úblocksr   r›   Únorm_fr;   Úgradient_checkpointingÚ	post_init)rL   r7   ÚirM   s      €r2   r=   zMptModel.__init__á   s»   ø€ Ü‰Ñ˜Ô à!×-Ñ-ˆÔØŸ™ˆŒô —<‘< × 1Ñ 1°4×3CÑ3CÓDˆŒô —m‘mÌEÐRX×RaÑRaÓLbÖ$cÀq¤X¨fÀÖ%BÒ$cÓdˆŒô   × 0Ñ 0°f×6OÑ6OÔPˆŒàˆ�‰Ôà&+ˆÔ#ð 	�‰Õùò %ds   ÂC7c                 ó   — | j                   S r|   ©r·   )rL   s    r2   Úget_input_embeddingszMptModel.get_input_embeddings÷   s   € Ø�x‰xˆr4   Nc                 ó   — t        ||||«      S r|   )r3   )rL   r+   r,   r-   r   s        r2   r3   zMptModel.build_mpt_alibi_tensorú   s   € Ü% i°À.ÐRXÓYÐYr4   Únew_embeddingsc                 ó   — || _         y r|   rÁ   ©rL   rÄ   s     r2   Úset_input_embeddingszMptModel.set_input_embeddingsý   s	   € Ø!ˆ�r4   Ú	input_idsrP   rQ   Úinputs_embedsr¤   r¥   Úoutput_hidden_statesÚreturn_dictr‘   .c	           	      óü  — |�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }|�|�t        d«      ‚|�|j                  \  }
}n|�|j                  \  }
}}nt        d«      ‚| j                  r%| j                  r|rt        j                  d«       d}|€| j                  |«      }|r|€t        | j                   ¬«      }|}|rdnd}|rdnd}| j                  | j                  | j                   j                  |j                   ¬«      }t#        | j                   |||¬	«      j%                  t&        j(                  «      }| j*                  D ])  }|r||fz   } |||||||¬
«      }|d   }|sŒ!||d   fz   }Œ+ | j-                  |«      }|r||fz   }|st/        d„ ||||fD «       «      S t1        ||||¬«      S )á²  
        input_ids (`torch.LongTensor` of shape `(batch_size, input_ids_length)`):
            `input_ids_length` = `sequence_length` if `past_key_values` is `None` else `past_key_values.get_seq_length()`
            (`sequence_length` of input past key value states). Indices of input sequence tokens in the vocabulary.

            If `past_key_values` is used, only `input_ids` that do not have their past calculated should be passed as
            `input_ids`.

            Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
            [`PreTrainedTokenizer.__call__`] for details.

            [What are input IDs?](../glossary#input-ids)
        NzDYou cannot specify both input_ids and inputs_embeds at the same timez5You have to specify either input_ids or inputs_embedszZ`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`...F)r7   r±   ©r   )r7   rÉ   rQ   rP   )r£   rQ   r¤   r¥   rO   r   r   c              3   ó&   K  — | ]	  }|€Œ|–— Œ y ­wr|   r±   )Ú.0Úvs     r2   ú	<genexpr>z#MptModel.forward.<locals>.<genexpr>^  s   è ø€ ò ØÐghÑgt”ñùs   ‚Š)Úlast_hidden_staterP   rN   Ú
attentions)r7   r¥   rÊ   r¤   rË   rc   rZ   r½   rY   ÚloggerÚwarning_oncer·   r   r3   r+   r@   r   r   rh   r   r©   r»   r¼   Útupler   )rL   rÈ   rP   rQ   rÉ   r¤   r¥   rÊ   rË   rl   rm   rn   Ú_rN   Úall_self_attentionsÚall_hidden_statesr.   Úcausal_maskÚblockÚoutputss                       r2   r{   zMptModel.forward   sE  € ð4 2CÐ1NÑ-ÐTX×T_ÑT_×TqÑTqÐà$8Ð$DÑ È$Ï+É+×JjÑJjð 	ð "+Ð!6‘I¸D¿K¹K×<QÑ<Qˆ	Ø%0Ð%<‘kÀ$Ç+Á+×BYÑBYˆàÐ  ]Ð%>ÜÐcÓdÐdØÐ"Ø%.§_¡_Ñ"ˆJ™
ØÐ&Ø(5×(;Ñ(;Ñ%ˆJ˜
¡AäÐTÓUÐUà×&Ò&¨4¯=ª=ÙÜ×#Ñ#Øpôð "�	àÐ Ø ŸH™H YÓ/ˆMá˜Ð0Ü*°$·+±+Ô>ˆOà%ˆá$5™b¸4ÐÙ"6™B¸DÐð ×+Ñ+¨D¯N©N¸D¿K¹K×<SÑ<SÐ\i×\pÑ\pÐ+Óqˆä(Ø—;‘;Ø'Ø)Ø+ô	
÷
 ‰"ŒU�Z‰Z‹.ð 	ð —[‘[ò 	JˆEÙ#Ø$5¸Ð8HÑ$HÐ!áØØ*Ø*Ø#Ø"3Ø#ôˆGð $ A™JˆMÚ Ø&9¸WÀQ¹Z¸MÑ&IÑ#ð	Jð$ Ÿ™ MÓ2ˆáØ 1°]Ð4DÑ DÐáÜñ Ø)¨?Ð<MÐObÐcôó ð ô 9Ø+Ø+Ø+Ø*ô	
ð 	
r4   ©é   N©NNNNNNNN)r}   r~   r   r   r=   rÂ   r3   r   r‚   rÇ   r   Ú
LongTensorr
   r©   r×   r   r{   rƒ   r„   s   @r2   r³   r³   ß   s  ø„ ð˜yõ ò,óZð"°5·<±<ó "ð ð .2Ø(,Ø.2Ø15Ø!%Ø)-Ø,0Ø#'ñf
à×#Ñ# dÑ*ðf
ð  ™ðf
ð Ÿ™ tÑ+ð	f
ð
 ×'Ñ'¨$Ñ.ðf
ð ˜$‘;ðf
ð   $™;ðf
ð # T™kðf
ð ˜D‘[ðf
ð 
ˆu�|‰|˜SÐ Ñ	!Ð$MÑ	Mòf
ó ôf
r4   r³   z†
    The MPT Model transformer with a language modeling head on top (linear layer with weights tied to the input
    embeddings).
    )Úcustom_introc                   ó`  ‡ — e Zd ZddiZdefˆ fd„Zdej                  fd„Ze		 	 	 	 	 	 	 	 	 	 ddej                  dz  d	edz  d
ej                  dz  dej                  dz  dej                  dz  dedz  dedz  dedz  dedz  deej                  z  deej                     ez  fd„«       Zˆ xZS )ÚMptForCausalLMzlm_head.weightztransformer.wte.weightr7   c                 óÆ   •— t         ‰| �  |«       t        |«      | _        t	        j
                  |j                  |j                  d¬«      | _        | j                  «        y ©NFr:   )
r<   r=   r³   r¬   r   rI   r>   r¶   Úlm_headr¾   ©rL   r7   rM   s     €r2   r=   zMptForCausalLM.__init__s  sI   ø€ Ü‰Ñ˜Ô Ü# FÓ+ˆÔÜ—y‘y ×!3Ñ!3°V×5FÑ5FÈUÔSˆŒð 	�‰Õr4   rÄ   c                 ó   — || _         y r|   )rç   rÆ   s     r2   Úset_output_embeddingsz$MptForCausalLM.set_output_embeddings{  s	   € Ø%ˆ�r4   NrÈ   rP   rQ   rÉ   Úlabelsr¤   r¥   rÊ   rË   Úlogits_to_keepr‘   c           
      óÈ  — |	�|	n| j                   j                  }	| j                  ||||||||	¬«      }|d   }t        |
t        «      rt        |
 d«      n|
}| j                  |dd…|dd…f   «      }d}|�* | j                  d||| j                   j                  dœ|¤Ž}|	s|f|dd z   }|�|f|z   S |S t        |||j                  |j                  |j                  ¬«      S )a\  
        input_ids (`torch.LongTensor` of shape `(batch_size, input_ids_length)`):
            `input_ids_length` = `sequence_length` if `past_key_values` is `None` else `past_key_values.get_seq_length()`
            (`sequence_length` of input past key value states). Indices of input sequence tokens in the vocabulary.

            If `past_key_values` is used, only `input_ids` that do not have their past calculated should be passed as
            `input_ids`.

            Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
            [`PreTrainedTokenizer.__call__`] for details.

            [What are input IDs?](../glossary#input-ids)
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set
            `labels = input_ids` Indices are selected in `[-100, 0, ..., config.vocab_size]` All labels set to `-100`
            are ignored (masked), the loss is only computed for labels in `[0, ..., config.vocab_size]`
        N©rP   rQ   rÉ   r¤   r¥   rÊ   rË   r   )Úlogitsrë   r¶   r   ©Úlossrï   rP   rN   rÔ   r±   )r7   rË   r¬   Ú
isinstancer�   Úslicerç   Úloss_functionr¶   r   rP   rN   rÔ   )rL   rÈ   rP   rQ   rÉ   rë   r¤   r¥   rÊ   rË   rì   rl   Útransformer_outputsrN   Úslice_indicesrï   rñ   r•   s                     r2   r{   zMptForCausalLM.forward~  s  € ð@ &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà"×.Ñ.ØØ+Ø)Ø'ØØ/Ø!5Ø#ð /ó 	
Ðð ,¨AÑ.ˆä8BÀ>ÔSVÔ8Wœ˜~˜o¨tÔ4Ð]kˆØ—‘˜mªA¨}ºaÐ,?Ñ@ÓAˆàˆØÐØ%�4×%Ñ%Ðp¨V¸FÈtÏ{É{×OeÑOeÑpÐioÑpˆDáØ�YÐ!4°Q°RÐ!8Ñ8ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä0ØØØ/×?Ñ?Ø-×;Ñ;Ø*×5Ñ5ô
ð 	
r4   )
NNNNNNNNNr   )r}   r~   r   Ú_tied_weights_keysr   r=   r   r‚   rê   r   rá   r
   r©   r�   r×   r   r{   rƒ   r„   s   @r2   rä   rä   j  s  ø„ ð +Ð,DÐEÐð˜yõ ð&°E·L±Ló &ð ð .2Ø(,Ø.2Ø-1Ø&*Ø!%Ø)-Ø,0Ø#'Ø-.ñ?
à×#Ñ# dÑ*ð?
ð  ™ð?
ð Ÿ™ tÑ+ð	?
ð
 —|‘| dÑ*ð?
ð —‘˜tÑ#ð?
ð ˜$‘;ð?
ð   $™;ð?
ð # T™kð?
ð ˜D‘[ð?
ð ˜eŸl™lÑ*ð?
ð 
ˆu�|‰|Ñ	Ð@Ñ	@ò?
ó ô?
r4   rä   aÒ  
    The MPT Model transformer with a sequence classification head on top (linear layer).

    [`MptForSequenceClassification`] uses the last token in order to do the classification, as other causal models
    (e.g. GPT-1) do.

    Since it does classification on the last token, it requires to know the position of the last token. If a
    `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If
    no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the
    padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in
    each row of the batch).
    c                   ó8  ‡ — e Zd Zdefˆ fd„Zdej                  fd„Ze	 	 	 	 	 	 	 	 	 ddej                  dz  de
dz  dej                  dz  d	ej                  dz  d
ej                  dz  dedz  dedz  dedz  dedz  deej                     ez  fd„«       Zˆ xZS )ÚMptForSequenceClassificationr7   c                 óè   •— t         ‰| �  |«       |j                  | _        t        |«      | _        t        j                  |j                  |j                  d¬«      | _        | j                  «        y ræ   )
r<   r=   Ú
num_labelsr³   r¬   r   rI   r>   Úscorer¾   rè   s     €r2   r=   z%MptForSequenceClassification.__init__Ð  sV   ø€ Ü‰Ñ˜Ô Ø ×+Ñ+ˆŒÜ# FÓ+ˆÔÜ—Y‘Y˜v×1Ñ1°6×3DÑ3DÈ5ÔQˆŒ
ð 	�‰Õr4   rÄ   c                 ó   — || _         y r|   )rü   rÆ   s     r2   rê   z2MptForSequenceClassification.set_output_embeddingsÙ  s	   € Ø#ˆ�
r4   NrÈ   rP   rQ   rÉ   rë   r¤   r¥   rÊ   rË   r‘   c
           
      ór  — |	�|	n| j                   j                  }	| j                  ||||||||	¬«      }|d   }| j                  |«      }|�|j                  d   }n|j                  d   }| j                   j
                  €|dk7  rt        d«      ‚| j                   j
                  €d}nÃ|�“|| j                   j
                  k7  j                  |j                  t        j                  «      }t        j                  |j                  d   |j                  t        j                  ¬«      }||z  j                  d«      }n.d}t        j                  | j                  j                   › d�«       |t        j                  ||j                  ¬	«      |f   }d}|��^| j                   j"                  €�| j$                  dk(  rd
| j                   _        nl| j$                  dkD  rL|j&                  t        j(                  k(  s|j&                  t        j*                  k(  rd| j                   _        nd| j                   _        | j                   j"                  d
k(  rIt-        «       }| j$                  dk(  r& ||j/                  «       |j/                  «       «      }nc |||«      }nY| j                   j"                  dk(  rt1        «       } |||«      }n,| j                   j"                  dk(  rt3        «       } |||«      }|	s|f|dd z   }|�|f|z   S |S t5        |||j6                  |j8                  |j:                  ¬«      S )á6  
        input_ids (`torch.LongTensor` of shape `(batch_size, input_ids_length)`):
            `input_ids_length` = `sequence_length` if `past_key_values` is `None` else `past_key_values.get_seq_length()`
            (`sequence_length` of input past key value states). Indices of input sequence tokens in the vocabulary.

            If `past_key_values` is used, only `input_ids` that do not have their past calculated should be passed as
            `input_ids`.

            Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and
            [`PreTrainedTokenizer.__call__`] for details.

            [What are input IDs?](../glossary#input-ids)
        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):
            Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,
            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If
            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).
        Nrî   r   r   z=Cannot handle batch sizes > 1 if no padding token is defined.rU   )r   r   zŠ will not detect padding tokens in `inputs_embeds`. Results may be unexpected if using padding tokens in conjunction with `inputs_embeds.`rÎ   Ú
regressionÚsingle_label_classificationÚmulti_label_classificationrð   )r7   rË   r¬   rü   rZ   Úpad_token_idrc   rh   r   r   r!   r    ÚargmaxrÕ   rÖ   rM   r}   Úproblem_typerû   r   Úlongr�   r   r*   r   r   r   rP   rN   rÔ   )rL   rÈ   rP   rQ   rÉ   rë   r¤   r¥   rÊ   rË   rl   rõ   rN   rï   rm   Úlast_non_pad_tokenÚnon_pad_maskÚtoken_indicesÚpooled_logitsrñ   Úloss_fctr•   s                         r2   r{   z$MptForSequenceClassification.forwardÜ  sí  € ð> &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà"×.Ñ.ØØ+Ø)Ø'ØØ/Ø!5Ø#ð /ó 	
Ðð ,¨AÑ.ˆØ—‘˜MÓ*ˆàÐ Ø"Ÿ™¨Ñ+‰Jà&×,Ñ,¨QÑ/ˆJà�;‰;×#Ñ#Ð+°
¸a²ÜÐ\Ó]Ð]Ø�;‰;×#Ñ#Ð+Ø!#ÑØÐ"à%¨¯©×)AÑ)AÑA×EÑEÀfÇmÁmÔUZ×U`ÑU`ÓaˆLÜ!ŸL™L¨¯©¸Ñ)<ÀVÇ]Á]ÔZ_×ZeÑZeÔfˆMØ"/°,Ñ">×!FÑ!FÀrÓ!JÑà!#ÐÜ×ÑØ—>‘>×*Ñ*Ð+ð ,Zð Zôð
 œuŸ|™|¨J¸v¿}¹}ÔMÐOaÐaÑbˆàˆØÑØ�{‰{×'Ñ'Ð/Ø—?‘? aÒ'Ø/;�D—K‘KÕ,Ø—_‘_ qÒ(¨f¯l©l¼e¿j¹jÒ.HÈFÏLÉLÔ\a×\eÑ\eÒLeØ/L�D—K‘KÕ,à/K�D—K‘KÔ,à�{‰{×'Ñ'¨<Ò7Ü"›9�Ø—?‘? aÒ'Ù# M×$9Ñ$9Ó$;¸V¿^¹^Ó=MÓN‘Dá# M°6Ó:‘DØ—‘×)Ñ)Ð-JÒJÜ+Ó-�Ù ¨vÓ6‘Ø—‘×)Ñ)Ð-IÒIÜ,Ó.�Ù ¨vÓ6�ÙØ#Ð%Ð(;¸A¸BÐ(?Ñ?ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä/ØØ Ø/×?Ñ?Ø-×;Ñ;Ø*×5Ñ5ô
ð 	
r4   ©	NNNNNNNNN)r}   r~   r   r   r=   r   r‚   rê   r   rá   r
   r©   r×   r   r{   rƒ   r„   s   @r2   rù   rù   Á  s  ø„ ð˜yõ ð$°E·L±Ló $ð ð .2Ø(,Ø.2Ø-1Ø&*Ø!%Ø)-Ø,0Ø#'ñe
à×#Ñ# dÑ*ðe
ð  ™ðe
ð Ÿ™ tÑ+ð	e
ð
 —|‘| dÑ*ðe
ð —‘˜tÑ#ðe
ð ˜$‘;ðe
ð   $™;ðe
ð # T™kðe
ð ˜D‘[ðe
ð 
ˆu�|‰|Ñ	Ð?Ñ	?òe
ó ôe
r4   rù   c                   ó  ‡ — e Zd Zdefˆ fd„Ze	 	 	 	 	 	 	 	 	 ddej                  dz  dedz  dej                  dz  dej                  dz  dej                  dz  d	e
dz  d
e
dz  de
dz  de
dz  deej                     ez  fd„«       Zˆ xZS )ÚMptForTokenClassificationr7   c                 ó°  •— t         ‰| �  |«       |j                  | _        t        |«      | _        t        |d«      r|j                  �|j                  }n't        |d«      r|j                  �|j                  }nd}t        j                  |«      | _
        t        j                  |j                  |j                  «      | _        | j                  «        y )NÚclassifier_dropoutr�   gš™™™™™¹?)r<   r=   rû   r³   r¬   Úhasattrr  r�   r   r¡   ri   rI   r>   Ú
classifierr¾   )rL   r7   r  rM   s      €r2   r=   z"MptForTokenClassification.__init__G  s¯   ø€ Ü‰Ñ˜Ô Ø ×+Ñ+ˆŒä# FÓ+ˆÔÜ�6Ð/Ô0°V×5NÑ5NÐ5ZØ!'×!:Ñ!:ÑÜ�VÐ-Ô.°6×3HÑ3HÐ3TØ!'×!6Ñ!6Ñà!$ÐÜ—z‘zÐ"4Ó5ˆŒÜŸ)™) F×$6Ñ$6¸×8IÑ8IÓJˆŒð 	�‰Õr4   NrÈ   rP   rQ   rÉ   rë   r¤   r¥   rÊ   rË   r‘   c
           
      ó  — |	�|	n| j                   j                  }	| j                  ||||||||	¬«      }|d   }| j                  |«      }| j	                  |«      }d}|�l|j                  |j                  «      }|j                  \  }}t        «       } ||j                  ||z  | j                  «      |j                  ||z  «      «      }|	s|f|dd z   }|�|f|z   S |S t        |||j                  |j                  ¬«      S )rÿ   Nrî   r   r   )rñ   rï   rN   rÔ   )r7   rË   r¬   ri   r  rh   r   rZ   r   r"   rû   r   rN   rÔ   )rL   rÈ   rP   rQ   rÉ   rë   r¤   r¥   rÊ   rË   Údeprecated_argumentsrõ   rN   rï   rñ   rm   rn   r  r•   s                      r2   r{   z!MptForTokenClassification.forwardX  s+  € ð> &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà"×.Ñ.ØØ+Ø)Ø'ØØ/Ø!5Ø#ð /ó 	
Ðð ,¨AÑ.ˆØŸ™ ]Ó3ˆØ—‘ Ó/ˆàˆØÐà—Y‘Y˜vŸ}™}Ó-ˆFØ%+§\¡\Ñ"ˆJ˜
Ü'Ó)ˆHÙØ—‘˜J¨Ñ3°T·_±_ÓEÀvÇ{Á{ÐS]Ð`jÑSjÓGkóˆDñ Ø�YÐ!4°Q°RÐ!8Ñ8ˆFØ)-Ð)9�T�G˜fÑ$ÐE¸vÐEä$ØØØ-×;Ñ;Ø*×5Ñ5ô	
ð 	
r4   r  )r}   r~   r   r   r=   r   r   rá   r
   r‚   r©   r×   r   r{   rƒ   r„   s   @r2   r  r  E  s÷   ø„ ð˜yõ ð" ð .2Ø(,Ø.2Ø-1Ø&*Ø!%Ø)-Ø,0Ø#'ñB
à×#Ñ# dÑ*ðB
ð  ™ðB
ð Ÿ™ tÑ+ð	B
ð
 —|‘| dÑ*ðB
ð —‘˜tÑ#ðB
ð ˜$‘;ðB
ð   $™;ðB
ð # T™kðB
ð ˜D‘[ðB
ð 
ˆu�|‰|Ñ	Ð4Ñ	4òB
ó ôB
r4   r  c                   ó   ‡ — e Zd Zˆ fd„Ze	 	 	 	 	 	 	 	 ddej                  dz  dej                  dz  dej                  dz  dej                  dz  dej                  dz  dedz  d	edz  d
edz  de	e
z  fd„«       Zˆ xZS )ÚMptForQuestionAnsweringc                 ó®   •— t         ‰| �  |«       t        |«      | _        t	        j
                  |j                  d«      | _        | j                  «        y )Nr   )	r<   r=   r³   r¬   r   rI   r>   Ú
qa_outputsr¾   rè   s     €r2   r=   z MptForQuestionAnswering.__init__   sA   ø€ Ü‰Ñ˜Ô Ü# FÓ+ˆÔÜŸ)™) F×$6Ñ$6¸Ó:ˆŒð 	�‰Õr4   NrÈ   rQ   rÉ   Ústart_positionsÚend_positionsr¥   rÊ   rË   r‘   c	                 ó"  — |�|n| j                   j                  }| j                  ||||||¬«      }
|
d   }| j                  |«      }|j	                  dd¬«      \  }}|j                  d«      j                  «       }|j                  d«      j                  «       }d}|�·|�µt        |j                  «       «      dkD  r|j                  d«      }t        |j                  «       «      dkD  r|j                  d«      }|j                  d«      }|j                  d|«      }|j                  d|«      }t        |¬«      } |||«      } |||«      }||z   dz  }|s||f|
dd z   }|�|f|z   S |S t        ||||
j                  |
j                  ¬	«      S )
rÍ   N)rQ   rÉ   r¥   rÊ   rË   r   r   rU   r   )Úignore_indexr   )rñ   Ústart_logitsÚ
end_logitsrN   rÔ   )r7   rË   r¬   r  Úsplitr*   rk   rb   rd   r[   r   r   rN   rÔ   )rL   rÈ   rQ   rÉ   r  r  r¥   rÊ   rË   rl   rÝ   Úsequence_outputrï   r  r  Ú
total_lossÚignored_indexr  Ú
start_lossÚend_lossr•   s                        r2   r{   zMptForQuestionAnswering.forward¨  s»  € ð4 &1Ð%<‘kÀ$Ç+Á+×BYÑBYˆà×"Ñ"ØØ)Ø'Ø/Ø!5Ø#ð #ó 
ˆð " !™*ˆà—‘ Ó1ˆØ#)§<¡<°°r <Ó#:Ñ ˆ�jØ#×+Ñ+¨BÓ/×:Ñ:Ó<ˆØ×'Ñ'¨Ó+×6Ñ6Ó8ˆ
àˆ
ØÐ&¨=Ð+Dä�?×'Ñ'Ó)Ó*¨QÒ.Ø"1×"9Ñ"9¸"Ó"=�Ü�=×%Ñ%Ó'Ó(¨1Ò,Ø -× 5Ñ 5°bÓ 9�à(×-Ñ-¨aÓ0ˆMØ-×3Ñ3°A°}ÓEˆOØ)×/Ñ/°°=ÓAˆMä'°]ÔCˆHÙ! ,°Ó@ˆJÙ 
¨MÓ:ˆHØ$ xÑ/°1Ñ4ˆJáØ" JÐ/°'¸!¸"°+Ñ=ˆFØ/9Ð/E�Z�M FÑ*ÐQÈ6ÐQä+ØØ%Ø!Ø!×/Ñ/Ø×)Ñ)ô
ð 	
r4   rà   )r}   r~   r   r=   r   r   rá   ÚFloatTensorr©   r×   r   r{   rƒ   r„   s   @r2   r  r  ž  sâ   ø„ ôð ð .2Ø37Ø26Ø37Ø15Ø)-Ø,0Ø#'ñF
à×#Ñ# dÑ*ðF
ð ×)Ñ)¨DÑ0ðF
ð ×(Ñ(¨4Ñ/ð	F
ð
 ×)Ñ)¨DÑ0ðF
ð ×'Ñ'¨$Ñ.ðF
ð   $™;ðF
ð # T™kðF
ð ˜D‘[ðF
ð 
Ð-Ñ	-òF
ó ôF
r4   r  )rä   r³   r«   rù   r  r  rÞ   )0r€   r#   r   r   Útorch.nnr   r   r   r   r   r“   Úcache_utilsr
   r   Ú
generationr   Úmasking_utilsr   Úmodeling_layersr   Úmodeling_outputsr   r   r   r   r   Úmodeling_utilsr   Úutilsr   r   Úconfiguration_mptr   Ú
get_loggerr}   rÕ   r3   ÚModuler6   r†   r—   r«   r³   rä   rù   r  r  Ú__all__r±   r4   r2   ú<module>r2     s_  ðñ ã ã Ý ß LÓ LÝ $ç .Ý )Ý /Ý 9÷õ õ .ß ,Ý (ð 
ˆ×	Ñ	˜HÓ	%€óô.E)�2—9‘9ô E)ôPˆR�Y‰Yô ô*6$Ð)ô 6$ðr ô%˜ó %ó ð%ð ôG
Ð!ó G
ó ðG
ñT ðôôN
Ð'¨ó N
óðN
ñb ðôôs
Ð#5ó s
óðs
ðl ôU
Ð 2ó U
ó ðU
ðp ôP
Ð0ó P
ó ðP
òf�r4   