§
    ‚ŠtjA—  ã                   ó@  — d dl mZ d dlmZ d dlZd dlmZ ddlmZ ddl	m
Z
 ddlmZmZ dd	lmZ dd
lmZmZmZ ddlmZmZ ddlmZmZ ddlmZmZ ddlmZmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0  G d„ dej1        ¦  «        Z2d„ Z3 ed¦  «        dCd„¦   «         Z4dej5        de6dej5        fd„Z7	 dDd ej1        d!ej5        d"ej5        d#ej5        d$ej5        dz  d%e8d&e8d'e$e&         fd(„Z9 ee4¦  «         G d)„ d*ej1        ¦  «        ¦   «         Z: G d+„ d,ej;        j<        ¦  «        Z=e G d-„ d.ej1        ¦  «        ¦   «         Z>dEd0„Z? G d1„ d2ej@        ¦  «        ZA G d3„ d4ej1        ¦  «        ZB G d5„ d6e¦  «        ZCe' G d7„ d8e"¦  «        ¦   «         ZDe' G d9„ d:eD¦  «        ¦   «         ZE	 	 	 dFd;ej5        eFej5                 z  dz  d<e6dz  d$ej5        dz  dej5        e6z  fd=„ZGe' G d>„ d?eDe¦  «        ¦   «         ZH G d@„ dAeeD¦  «        ZIg dB¢ZJdS )Gé    )ÚCallable)ÚOptionalN)Únné   )Úinitialization)ÚACT2FN)ÚCacheÚDynamicCache)ÚGenerationMixin)Úuse_experts_implementationÚuse_kernel_func_from_hubÚuse_kernelized_func)Úcreate_causal_maskÚ!create_sliding_window_causal_mask)Ú GenericForSequenceClassificationÚGradientCheckpointingLayer)ÚMoeCausalLMOutputWithPastÚMoeModelOutputWithPast)ÚROPE_INIT_FUNCTIONSÚdynamic_rope_update)ÚALL_ATTENTION_FUNCTIONSÚPreTrainedModel)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚcan_return_tuple)Úmaybe_autocastÚmerge_with_config_defaults)ÚOutputRecorderÚcapture_outputsé   )ÚPhimoeConfigc                   óÖ   ‡ — e Zd ZU ej        ed<   ddefˆ fd„Ze	 	 	 ddedz  de	d         de
dz  ded	ef         fd
„¦   «         Z ej        ¦   «         edd„¦   «         ¦   «         Zˆ xZS )ÚPhimoeRotaryEmbeddingÚinv_freqNÚconfigc                 óÚ  •— t          ¦   «                              ¦   «          |j        | _        |j        | _        || _        | j        j        d         | _        | j        | _	        | j        dk    rt          | j                 | _	        |  	                    | j        |¦  «        \  }| _        |                      d|d¬¦  «         |                      d|                     ¦   «         d¬¦  «         d S )NÚ	rope_typeÚdefaultr%   F)Ú
persistentÚoriginal_inv_freq)ÚsuperÚ__init__Úmax_position_embeddingsÚmax_seq_len_cachedÚoriginal_max_seq_lenr&   Úrope_parametersr(   Úcompute_default_rope_parametersÚrope_init_fnr   Úattention_scalingÚregister_bufferÚclone)Úselfr&   Údevicer%   Ú	__class__s       €úh/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/phimoe/modeling_phimoe.pyr-   zPhimoeRotaryEmbedding.__init__0   sÔ   ø€ Ý‰Œ×ÒÑÔÐØ"(Ô"@ˆÔØ$*Ô$BˆÔ!àˆŒàœÔ4°[ÔAˆŒØ&*Ô&JˆÔØŒ>˜YÒ&Ð&Ý 3°D´NÔ CˆDÔØ+/×+<Ò+<¸T¼[È&Ñ+QÔ+QÑ(ˆ�$Ô(à×Ò˜Z¨¸eÐÑDÔDÐDØ×ÒÐ0°(·.².Ñ2BÔ2BÈuÐÑUÔUÐUÐUÐUó    r8   ztorch.deviceÚseq_lenÚreturnztorch.Tensorc                 óü   — | j         d         }t          | dd¦  «        p| j        | j        z  }d}d|t	          j        d|dt          j        ¬¦  «                             |t          j        ¬¦  «        |z  z  z  }||fS )	a¨  
        Computes the inverse frequencies according to the original RoPE implementation
        Args:
            config ([`~transformers.PreTrainedConfig`]):
                The model configuration.
            device (`torch.device`):
                The device to use for initialization of the inverse frequencies.
            seq_len (`int`, *optional*):
                The current sequence length. Unused for this type of RoPE.
        Returns:
            Tuple of (`torch.Tensor`, `float`), containing the inverse frequencies for the RoPE embeddings and the
            post-processing scaling factor applied to the computed cos/sin (unused in this type of RoPE).
        Ú
rope_thetaÚhead_dimNç      ð?r   é   )Údtype)r8   rC   )	r1   ÚgetattrÚhidden_sizeÚnum_attention_headsÚtorchÚarangeÚint64ÚtoÚfloat)r&   r8   r<   ÚbaseÚdimÚattention_factorr%   s          r:   r2   z5PhimoeRotaryEmbedding.compute_default_rope_parameters@   sŒ   € ð& Ô% lÔ3ˆÝ�f˜j¨$Ñ/Ô/Ðc°6Ô3EÈÔIcÑ3cˆàÐð Ø•U”\ ! S¨!µ5´;Ð?Ñ?Ô?×BÒBÈ&ÕX]ÔXcÐBÑdÔdÐgjÑjÑkñ
ˆð Ð)Ð)Ð)r;   c                 ó˜  — |�t          | j        j        › d|› d�¦  «        ‚d }t          j        |¦  «        dz   }| j        j        d         dk    r<|r:|| j        j        d         k    r| j        j        d         n| j        j        d         }|                      | j        |j        |¦  «        \  }}|€|n|}|d d d …d f          	                    ¦   «          
                    |j        d	         d
d¦  «                             |j        ¦  «        }|d d …d d d …f          	                    ¦   «         }	t          |j        j        t          ¦  «        r|j        j        dk    r|j        j        nd}
t!          |
d¬¦  «        5  | 	                    ¦   «         |	 	                    ¦   «         z                       dd¦  «        }t          j        ||fd
¬¦  «        }|                     ¦   «         |z  }|                     ¦   «         |z  }d d d ¦  «         n# 1 swxY w Y   |                     |j        ¦  «        |                     |j        ¦  «        fS )Nz3 does not support layer types, but got `layer_type=ú`r!   r(   r)   Ú original_max_position_embeddingsÚlong_mscaleÚshort_mscaler   éÿÿÿÿÚmpsÚcpuF)Údevice_typeÚenabledrB   ©rM   )Ú
ValueErrorr9   Ú__name__rG   Úmaxr&   r1   r3   r8   rK   ÚexpandÚshaperJ   Ú
isinstanceÚtypeÚstrr   Ú	transposeÚcatÚcosÚsinrC   )r7   ÚxÚposition_idsÚ
layer_typeÚmscaler<   r%   r4   Úinv_freq_expandedÚposition_ids_expandedrW   ÚfreqsÚembrd   re   s                  r:   ÚforwardzPhimoeRotaryEmbedding.forward^   s|  € ð Ð!ÝØ”>Ô*ÐlÐlÐ_iÐlÐlÐlñô ð ð ˆÝ”)˜LÑ)Ô)¨AÑ-ˆØŒ;Ô& {Ô3°yÒ@Ð@ÀWÐ@ð ˜Tœ[Ô8Ð9[Ô\Ò\Ð\ð ”Ô+¨MÔ:Ð:à”[Ô0°Ô@ð ð
 '+×&7Ò&7¸¼ÀQÄXÈwÑ&WÔ&WÑ#ˆÐ#Ø&, nÐ"Ð"¸&ˆØ$ T¨1¨1¨1¨d ]Ô3×9Ò9Ñ;Ô;×BÒBÀ<ÔCUÐVWÔCXÐZ\Ð^_Ñ`Ô`×cÒcÐdeÔdlÑmÔmÐØ ,¨Q¨Q¨Q°°a°a°a¨ZÔ 8× >Ò >Ñ @Ô @Ðå'1°!´(´-ÅÑ'EÔ'EÐkÈ!Ì(Ì-Ð[`ÒJ`ÐJ`�a”h”m�mÐfkˆÝ¨¸UÐCÑCÔCð 	%ð 	%Ø&×,Ò,Ñ.Ô.Ð1F×1LÒ1LÑ1NÔ1NÑN×YÒYÐZ[Ð]^Ñ_Ô_ˆEÝ”)˜U E˜N°Ð3Ñ3Ô3ˆCØ—'’'‘)”)˜fÑ$ˆCØ—'’'‘)”)˜fÑ$ˆCð		%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð
 �vŠv�a”g‰Œ §¢ q¤w¡¤Ð/Ð/s   Å=BHÈHÈH©N©NNN)NN)r[   Ú
__module__Ú__qualname__rG   ÚTensorÚ__annotations__r"   r-   Ústaticmethodr   ÚintÚtuplerK   r2   Úno_gradr   rn   Ú__classcell__©r9   s   @r:   r$   r$   -   sþ   ø€ € € € € € ØŒlÐÐÑðVð V˜|ð Vð Vð Vð Vð Vð Vð  à&*Ø+/Ø"ð*ð *Ø˜tÑ#ð*à˜Ô(ð*ð �t‘ð*ð 
ˆ~˜uÐ$Ô	%ð	*ð *ð *ñ „\ð*ð: €U„]�_„_Øð0ð 0ð 0ñ Ôñ „_ð0ð 0ð 0ð 0ð 0r;   r$   c                 óœ   — | dd| j         d         dz  …f         }| d| j         d         dz  d…f         }t          j        | |fd¬¦  «        S )z*Rotates half the hidden dims of the input..NrT   rB   rY   )r^   rG   rc   )rf   Úx1Úx2s      r:   Úrotate_halfr~   |   s]   € à	
ˆ3Ð"�!”'˜"”+ Ñ"Ð"Ð"Ô	#€BØ	
ˆ3�”˜”˜qÑ Ð"Ð"Ð"Ô	#€BÝŒ9�r�c˜2�Y BÐ'Ñ'Ô'Ð'r;   Úrotary_pos_embc                 ó¾   — |                      |¦  «        }|                      |¦  «        }| |z  t          | ¦  «        |z  z   }||z  t          |¦  «        |z  z   }||fS )a…  Applies Rotary Position Embedding to the query and key tensors.

    Args:
        q (`torch.Tensor`): The query tensor.
        k (`torch.Tensor`): The key tensor.
        cos (`torch.Tensor`): The cosine part of the rotary embedding.
        sin (`torch.Tensor`): The sine part of the rotary embedding.
        unsqueeze_dim (`int`, *optional*, defaults to 1):
            The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and
            sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note
            that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and
            k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes
            cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have
            the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.
    Returns:
        `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.
    )Ú	unsqueezer~   )ÚqÚkrd   re   Úunsqueeze_dimÚq_embedÚk_embeds          r:   Úapply_rotary_pos_embr‡   ƒ   sc   € ð& �-Š-˜Ñ
&Ô
&€CØ
�-Š-˜Ñ
&Ô
&€CØ�3‰w�; q™>œ>¨CÑ/Ñ0€GØ�3‰w�; q™>œ>¨CÑ/Ñ0€GØ�GÐÐr;   Úhidden_statesÚn_repr=   c                 ó¸   — | j         \  }}}}|dk    r| S | dd…dd…ddd…dd…f                              |||||¦  «        } |                      |||z  ||¦  «        S )zÔ
    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)
    r!   N)r^   r]   Úreshape)rˆ   r‰   ÚbatchÚnum_key_value_headsÚslenr@   s         r:   Ú	repeat_kvr�   �   s„   € ð
 2?Ô1DÑ.€EÐ  hØ�‚z€zØÐØ! ! ! ! Q Q Q¨¨a¨a¨a°°°Ð"2Ô3×:Ò:¸5ÐBUÐW\Ð^bÐdlÑmÔm€MØ× Ò  Ð(;¸eÑ(CÀTÈ8ÑTÔTÐTr;   ç        ÚmoduleÚqueryÚkeyÚvalueÚattention_maskÚscalingÚdropoutÚkwargsc                 ó  — t          || j        ¦  «        }t          || j        ¦  «        }	t          j        ||                     dd¦  «        ¦  «        |z  }
|�|
|z   }
t
          j                             |
dt          j        ¬¦  «         	                    |j
        ¦  «        }
t
          j                             |
|| j        ¬¦  «        }
t          j        |
|	¦  «        }|                     dd¦  «                             ¦   «         }||
fS )NrB   r   rT   )rM   rC   )ÚpÚtrainingr!   )r�   Únum_key_value_groupsrG   Úmatmulrb   r   Ú
functionalÚsoftmaxÚfloat32rJ   rC   r—   r›   Ú
contiguous)r‘   r’   r“   r”   r•   r–   r—   r˜   Ú
key_statesÚvalue_statesÚattn_weightsÚattn_outputs               r:   Úeager_attention_forwardr¦   ©   sé   € õ ˜3 Ô ;Ñ<Ô<€JÝ˜U FÔ$?Ñ@Ô@€Lå”<  z×';Ò';¸A¸qÑ'AÔ'AÑBÔBÀWÑL€LØÐ!Ø# nÑ4ˆå”=×(Ò(¨¸2ÅUÄ]Ð(ÑSÔS×VÒVÐW\ÔWbÑcÔc€LÝ”=×(Ò(¨¸È6Ì?Ð(Ñ[Ô[€LÝ”,˜|¨\Ñ:Ô:€KØ×'Ò'¨¨1Ñ-Ô-×8Ò8Ñ:Ô:€Kà˜Ð$Ð$r;   c                   óÎ   ‡ — e Zd ZdZdedefˆ fd„Z	 	 	 ddej        de	ej        ej        f         dz  dej        dz  d	e
dz  d
ee         de	ej        ej        f         fd„Zˆ xZS )ÚPhimoeAttentionz=Multi-headed attention from 'Attention Is All You Need' paperr&   Ú	layer_idxc                 ó®  •— t          ¦   «                              ¦   «          || _        || _        t	          |d|j        |j        z  ¦  «        | _        |j        |j        z  | _	        | j        dz  | _
        |j        | _        d| _        t          j        |j        |j        | j        z  |j        ¬¦  «        | _        t          j        |j        |j        | j        z  |j        ¬¦  «        | _        t          j        |j        |j        | j        z  |j        ¬¦  «        | _        t          j        |j        | j        z  |j        |j        ¬¦  «        | _        d S )Nr@   g      à¿T©Úbias)r,   r-   r&   r©   rD   rE   rF   r@   r�   rœ   r–   Úattention_dropoutÚ	is_causalr   ÚLinearÚattention_biasÚq_projÚk_projÚv_projÚo_proj©r7   r&   r©   r9   s      €r:   r-   zPhimoeAttention.__init__Æ   sB  ø€ Ý‰Œ×ÒÑÔÐØˆŒØ"ˆŒÝ ¨
°FÔ4FÈ&ÔJdÑ4dÑeÔeˆŒØ$*Ô$>À&ÔB\Ñ$\ˆÔ!Ø”} dÑ*ˆŒØ!'Ô!9ˆÔØˆŒå”iØÔ Ô :¸T¼]Ñ JÐQWÔQfð
ñ 
ô 
ˆŒõ ”iØÔ Ô :¸T¼]Ñ JÐQWÔQfð
ñ 
ô 
ˆŒõ ”iØÔ Ô :¸T¼]Ñ JÐQWÔQfð
ñ 
ô 
ˆŒõ ”iØÔ&¨¬Ñ6¸Ô8JÐQWÔQfð
ñ 
ô 
ˆŒˆˆr;   Nrˆ   Úposition_embeddingsr•   Úpast_key_valuesr˜   r=   c                 ó"  — |j         d d…         }g |¢d‘| j        ‘R }|                      |¦  «                             |¦  «                             dd¦  «        }|                      |¦  «                             |¦  «                             dd¦  «        }	|                      |¦  «                             |¦  «                             dd¦  «        }
|\  }}t          ||	||¦  «        \  }}	|�|                     |	|
| j	        ¦  «        \  }	}
t          j        | j        j        t          ¦  «        } || ||	|
|f| j        sdn| j        | j        dœ|¤Ž\  }} |j        g |¢d‘R Ž                      ¦   «         }|                      |¦  «        }||fS )NrT   r!   rB   r�   )r—   r–   )r^   r@   r±   Úviewrb   r²   r³   r‡   Úupdater©   r   Úget_interfacer&   Ú_attn_implementationr¦   r›   r­   r–   r‹   r¡   r´   )r7   rˆ   r¶   r•   r·   r˜   Úinput_shapeÚhidden_shapeÚquery_statesr¢   r£   rd   re   Úattention_interfacer¥   r¤   s                   r:   rn   zPhimoeAttention.forwardÝ   sÀ  € ð $Ô)¨#¨2¨#Ô.ˆØ8˜Ð8 bÐ8¨$¬-Ð8Ð8ˆà—{’{ =Ñ1Ô1×6Ò6°|ÑDÔD×NÒNÈqÐRSÑTÔTˆØ—[’[ Ñ/Ô/×4Ò4°\ÑBÔB×LÒLÈQÐPQÑRÔRˆ
Ø—{’{ =Ñ1Ô1×6Ò6°|ÑDÔD×NÒNÈqÐRSÑTÔTˆà&‰ˆˆSÝ#7¸ÀjÐRUÐWZÑ#[Ô#[Ñ ˆ�jàÐ&Ø'6×'=Ò'=¸jÈ,ÐX\ÔXfÑ'gÔ'gÑ$ˆJ˜å(?Ô(MØŒKÔ,Õ.Eñ)
ô )
Ðð %8Ð$7ØØØØØð	%
ð  $œ}ÐH�C�C°$Ô2HØ”Lð	%
ð 	%
ð ð	%
ð 	%
Ñ!ˆ�\ð *�kÔ)Ð;¨;Ð;¸Ð;Ð;Ð;×FÒFÑHÔHˆØ—k’k +Ñ.Ô.ˆØ˜LÐ(Ð(r;   rp   )r[   rq   rr   Ú__doc__r"   rv   r-   rG   rs   rw   r	   r   r   rn   ry   rz   s   @r:   r¨   r¨   Â   så   ø€ € € € € àGÐGð
˜|ð 
¸ð 
ð 
ð 
ð 
ð 
ð 
ð4 IMØ.2Ø(,ð&)ð &)à”|ð&)ð # 5¤<°´Ð#=Ô>ÀÑEð&)ð œ tÑ+ð	&)ð
  ™ð&)ð Ð+Ô,ð&)ð 
ˆuŒ|˜Uœ\Ð)Ô	*ð&)ð &)ð &)ð &)ð &)ð &)ð &)ð &)r;   r¨   c                   ó’   — e Zd Zedej        dej        dej        dej        dej        f
d„¦   «         Zedej        fd„¦   «         Zd	S )
ÚPhimoeMultiplierÚscoresÚ
multiplierÚselected_expertsÚmasked_gatesÚmask_for_onec                 ó:   — |                       |||¦  «         ||z  S )a  
        Forward pass for the custom autograd function.

        Args:
            ctx: Context object to save information for backward computation.
            scores (torch.Tensor): Input scores tensor.
            multiplier (torch.Tensor): Multiplier tensor.
            selected_experts (torch.Tensor): Tensor of selected experts.
            masked_gates (torch.Tensor): Masked gates tensor.
            mask_for_one (torch.Tensor): Mask for one tensor.

        Returns:
            torch.Tensor: Result of the forward pass.
        )Úsave_for_backward)ÚctxrÄ   rÅ   rÆ   rÇ   rÈ   s         r:   rn   zPhimoeMultiplier.forward  s(   € ð. 	×Ò˜jÐ*:¸LÑIÔIÐIØ˜LÑ(Ð(r;   Úgrad_at_outputc                 ó�   — | j         \  }}}||z  }||                     d¦  «        z  }|                     d||¬¦  «         |ddddfS )aB  
        Backward pass for the custom autograd function.

        Args:
            ctx: Context object with saved tensors from the forward pass.
            grad_at_output (torch.Tensor): Gradient at the output.

        Returns:
            tuple[torch.Tensor, None, None, None, None]: Gradients for the inputs.
        rT   )rM   ÚindexÚsrcN)Úsaved_tensorsÚmulÚscatter_add_)rË   rÌ   rÅ   rÆ   rÇ   Úgrad_at_scores_expandeds         r:   ÚbackwardzPhimoeMultiplier.backward!  sx   € ð 69Ô5FÑ2ˆ
Ð$ là'¨*Ñ4ˆà".°×1CÒ1CÀBÑ1GÔ1GÑ"GÐØ×,Ò,ØØ"Øð 	-ñ 	
ô 	
ð 	
ð $ØØØØð
ð 	
r;   N)r[   rq   rr   ru   rG   rs   rn   rÔ   © r;   r:   rÃ   rÃ     s–   € € € € € Øð)à”ð)ð ”Lð)ð  œ,ð	)ð
 ”lð)ð ”lð)ð )ð )ñ „\ð)ð2 ð
àœð
ð 
ð 
ñ „\ð
ð 
ð 
r;   rÃ   c                   óh   ‡ — e Zd ZdZdefˆ fd„Zdej        dej        dej        dej        fd„Zˆ xZ	S )	ÚPhimoeExpertsz2Collection of expert weights stored as 3D tensors.r&   c                 ó´  •— t          ¦   «                              ¦   «          |j        | _        |j        | _        |j        | _        t          j	        t          j        | j        d| j        z  | j        ¦  «        ¦  «        | _        t          j	        t          j        | j        | j        | j        ¦  «        ¦  «        | _        t          |j                 | _        d S )NrB   )r,   r-   Únum_local_expertsÚnum_expertsrE   Ú
hidden_dimÚintermediate_sizeÚintermediate_dimr   Ú	ParameterrG   ÚemptyÚgate_up_projÚ	down_projr   Ú
hidden_actÚact_fn©r7   r&   r9   s     €r:   r-   zPhimoeExperts.__init__H  s£   ø€ Ý‰Œ×ÒÑÔÐØ!Ô3ˆÔØ Ô,ˆŒØ &Ô 8ˆÔÝœL­¬°TÔ5EÀqÈ4ÔK`ÑG`ÐbfÔbqÑ)rÔ)rÑsÔsˆÔÝœ¥e¤k°$Ô2BÀDÄOÐUYÔUjÑ&kÔ&kÑlÔlˆŒÝ˜VÔ.Ô/ˆŒˆˆr;   rˆ   Útop_k_indexÚtop_k_weightsr=   c                 ó€  — t          j        |¦  «        }t          j        ¦   «         5  t           j        j                             || j        ¬¦  «        }|                     ddd¦  «        }t          j        | 	                    d¬¦  «        d¦  «         
                    ¦   «         }d d d ¦  «         n# 1 swxY w Y   |D ]þ}|d         }|| j        k    rŒt          j        ||         ¦  «        \  }}	||	         }
t          j                             |
| j        |         ¦  «                             dd¬¦  «        \  }}|                      |¦  «        |z  }t          j                             || j        |         ¦  «        }|||	|d f         z  }|                     d|	|                     |j        ¦  «        ¦  «         Œÿ|S )N)Únum_classesrB   r!   r   )rT   éþÿÿÿrY   rT   )rG   Ú
zeros_likerx   r   rž   Úone_hotrÚ   ÚpermuteÚgreaterÚsumÚnonzeroÚwhereÚlinearrà   Úchunkrã   rá   Ú
index_add_rJ   rC   )r7   rˆ   rå   ræ   Úfinal_hidden_statesÚexpert_maskÚ
expert_hitÚ
expert_idxÚ	top_k_posÚ	token_idxÚcurrent_stateÚgateÚupÚcurrent_hidden_statess                 r:   rn   zPhimoeExperts.forwardQ  sø  € õ $Ô.¨}Ñ=Ô=ÐÝŒ]‰_Œ_ð 	Sð 	SÝœ(Ô-×5Ò5°kÈtÔO_Ð5Ñ`Ô`ˆKØ%×-Ò-¨a°°AÑ6Ô6ˆKÝœ {§¢¸8 Ñ'DÔ'DÀaÑHÔH×PÒPÑRÔRˆJð	Sð 	Sð 	Sñ 	Sô 	Sð 	Sð 	Sð 	Sð 	Sð 	Sð 	Søøøð 	Sð 	Sð 	Sð 	Sð
 %ð 
	nð 
	nˆJØ# AœˆJØ˜TÔ-Ò-Ð-ØÝ#(¤;¨{¸:Ô/FÑ#GÔ#GÑ ˆI�yØ)¨)Ô4ˆMÝ”}×+Ò+¨M¸4Ô;LÈZÔ;XÑYÔY×_Ò_Ð`aÐgiÐ_ÑjÔj‰HˆD�"Ø$(§K¢K°Ñ$5Ô$5¸Ñ$:Ð!Ý$&¤M×$8Ò$8Ð9NÐPTÔP^Ð_iÔPjÑ$kÔ$kÐ!Ø$9¸MÈ)ÐU^Ð`dÐJdÔ<eÑ$eÐ!Ø×*Ò*¨1¨iÐ9N×9QÒ9QÐReÔRkÑ9lÔ9lÑmÔmÐmÐmà"Ð"s   ¨A>B2Â2B6Â9B6)
r[   rq   rr   rÁ   r"   r-   rG   rs   rn   ry   rz   s   @r:   r×   r×   D  sŒ   ø€ € € € € à<Ð<ð0˜|ð 0ð 0ð 0ð 0ð 0ð 0ð#à”|ð#ð ”\ð#ð ”|ð	#ð
 
Œð#ð #ð #ð #ð #ð #ð #ð #r;   r×   rB   c                 óB  — t          j        ¦   «         5  |                      dd¬¦  «        \  }}|                      ¦   «                              |¬¦  «        }|| z
  |z  d|z  k    }ddd¦  «         n# 1 swxY w Y   |                      |t          d¦  «        ¦  «        }|ru|t          j        |t           j        ¬¦  «         	                    ¦   «          
                    ¦   «         z
                       d¬	¦  «        d
                              d¦  «        }n|}t          j        |d¬	¦  «        }|                     d|¬¦  «        }	|r’|                     dd¬¦  «        \  }
}t          j        ||k    t          j        |
¦  «        dk    ¦  «        }t          j        d|d¬¦  «                             |¦  «        }t$                               | |	|||¦  «        }n|	}t          j        | d|t          d¦  «        ¦  «        }t          j        ¦   «         5  |                     dd¬¦  «        \  }}|                      ¦   «                              |¬¦  «        }|| z
  |z  d|z  k    }ddd¦  «         n# 1 swxY w Y   |                     |t          d¦  «        ¦  «        }|ru|t          j        |t           j        ¬¦  «         	                    ¦   «          
                    ¦   «         z
                       d¬	¦  «        d
                              d¦  «        }n|}t          j        |d¬	¦  «        }|                     d|¬¦  «        }|r¤|                     dd¬¦  «        \  }
}t          j        ||k    t          j        |
¦  «                             ¦   «         dk    ¦  «        }t          j        d|d¬¦  «                             |¦  «        }t$                               | ||||¦  «        }n|}t          j        ||fd¬	¦  «        }t          j        ||fd¬	¦  «        }||fS )ud  
    Sparse mixer function to select top-k experts and compute multipliers.
    Based on the paper: https://huggingface.co/papers/2409.12136
    We first replace the TopK(Â·) function as random sampling of discrete variables
    in model training. Then, following Liu et al. (2023a) and Liu et al. (2023b), we apply Heun's
    third order method to approximate the expert routing gradient and construct a modified
    back-propagation to give a mathematically sound gradient estimation for expert routing.

    Args:
        scores (torch.Tensor): Input scores tensor.
        jitter_eps (float): Jitter epsilon for numerical stability.
        training (bool): Flag indicating if the model is in training mode.
        top_k (int): Number of top experts to select.

    Returns:
        tuple[torch.Tensor, torch.Tensor]: Multiplier and selected experts tensors.
    rT   T)rM   Úkeepdim)ÚminrB   Nz-inf)Úmemory_formatrY   r!   )rM   rÎ   g      è?gioð…ÉTÕ?gKÈ=›Uå?)Úalpha)rG   rx   r\   ÚabsÚclampÚmasked_fillrK   Ú
empty_likeÚlegacy_contiguous_formatÚexponential_Úlogr�   rŸ   ÚgatherÚ
logical_orÚ	rand_likeÚaddÚtype_asrÃ   ÚapplyÚscatterÚuniform_Úconcat)rÄ   Ú
jitter_epsr›   Útop_kÚmask_logits_thresholdÚmax_indÚfactorrÇ   rÆ   Úmultiplier_oÚ
max_scoresrÈ   rÅ   Úmasked_scoresÚmasked_gates_top2Úselected_experts_top2Úmultiplier_top2_oÚmask_for_one_top2Úmultiplier_top2s                      r:   Úsparsemixerr   l  sØ  € õ$ 
Œ‰Œð _ð _à)/¯ª¸ÀD¨Ñ)IÔ)IÑ&Ð˜wØ—’‘”×#Ò#Ð(=Ð#Ñ>Ô>ˆØ"7¸&Ñ"@ÀFÑ!JÈqÐS]É~Ò ^Ðð	_ð _ð _ñ _ô _ð _ð _ð _ð _ð _ð _øøøð _ð _ð _ð _ð ×%Ò%Ð&;½UÀ6¹]¼]ÑKÔK€LØð 
#ð ÝÔ" <½uÔ?]Ð^Ñ^Ô^×kÒkÑmÔm×qÒqÑsÔsñt÷ ŠS�RˆS‰[Œ[˜ô	÷
 ŠY�r‰]Œ]ð 	Ðð #Ðõ ”= °2Ð6Ñ6Ô6€LØ×&Ò&¨2Ð5EÐ&ÑFÔF€Làð "à*×.Ò.°2¸tÐ.ÑDÔDÑˆ
�GÝÔ'Ø Ò'ÝŒO˜JÑ'Ô'¨$Ò.ñ
ô 
ˆõ
 ”y ¨¸VÐDÑDÔD×LÒLÈ\ÑZÔZˆå%×+Ò+ØØØØØñ
ô 
ˆ
ˆ
ð "ˆ
õ ”MØØ
ØÝˆf‰Œñ	ô €Mõ 
Œ‰Œð _ð _à)6×):Ò):¸rÈ4Ð):Ñ)PÔ)PÑ&Ð˜wØ—’‘”×#Ò#Ð(=Ð#Ñ>Ô>ˆØ"7¸&Ñ"@ÀFÑ!JÈqÐS]É~Ò ^Ðð	_ð _ð _ñ _ô _ð _ð _ð _ð _ð _ð _øøøð _ð _ð _ð _ð &×1Ò1Ð2GÍÈvÉÌÑWÔWÐØð (ð "ÝÔ"Ð#4ÅEÔDbÐcÑcÔcß’‘”ß’‘”ñ÷
 ŠS�RˆS‰[Œ[˜ô÷ ŠY�r‰]Œ]ð 	Ðð !(ÐåœÐ&7¸RÐ@Ñ@Ô@ÐØ)×0Ò0°RÐ?TÐ0ÑUÔUÐàð ,à/×3Ò3¸ÀDÐ3ÑIÔIÑˆ
�GÝ!Ô,Ø! WÒ,ÝŒO˜JÑ'Ô'×0Ò0Ñ2Ô2°TÒ9ñ
ô 
Ðõ
 "œI fÐ.?ÀvÐNÑNÔN×VÒVÐWhÑiÔiÐå*×0Ò0ØØØ!ØØñ
ô 
ˆˆð ,ˆå”˜z¨?Ð;ÀÐDÑDÔD€JÝ”|Ð%5Ð7LÐ$MÐSUÐVÑVÔVÐð 	Øðð s%   ”AA2Á2A6Á9A6ÈAI1É1I5É8I5c                   óf   ‡ — e Zd Zdefˆ fd„Zdej        deej        ej        f         fˆ fd„Zˆ xZ	S )ÚPhimoeTopKRouterr&   c                 óÄ   •— t          ¦   «                              |j        |j        d¬¦  «         |j        | _        |j        | _        |j        | _        |j        | _        d S )NFr«   )	r,   r-   rE   rÙ   Úrouter_jitter_noiseÚinput_jitter_noiseÚnum_experts_per_tokr  rÚ   rä   s     €r:   r-   zPhimoeTopKRouter.__init__è  sY   ø€ Ý‰Œ×Ò˜Ô+¨VÔ-EÈEÐÑRÔRÐRØ#)Ô#=ˆÔ Ø"(Ô";ˆÔØÔ/ˆŒ
Ø!Ô3ˆÔÐÐr;   rˆ   r=   c                 ó4  •— | j         rF| j        dk    r;|t          j        |¦  «                             d| j        z
  d| j        z   ¦  «        z  }t          ¦   «                              |¦  «        }t          || j        | j         | j	        ¬¦  «        \  }}|||fS )Nr   rA   )r  r›   r  )
r›   r%  rG   r  r  r,   rn   r   r$  r  )r7   rˆ   Úrouter_logitsÚrouting_weightsrÆ   r9   s        €r:   rn   zPhimoeTopKRouter.forwardï  s©   ø€ ØŒ=ð 	˜TÔ4°qÒ8Ð8Ø�UÔ-¨mÑ<Ô<×EÒEØ�dÔ-Ñ-¨s°TÔ5LÑ/Lñô ñ ˆMõ ™œŸš¨Ñ6Ô6ˆÝ,7Ø dÔ&>ÈÌÐ^bÔ^hð-
ñ -
ô -
Ñ)ˆÐ)ð ˜oÐ/?Ð?Ð?r;   )
r[   rq   rr   r"   r-   rG   rs   rw   rn   ry   rz   s   @r:   r"  r"  ç  sŒ   ø€ € € € € ð4˜|ð 4ð 4ð 4ð 4ð 4ð 4ð	@ U¤\ð 	@°e¸E¼LÈ%Ì,Ð<VÔ6Wð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@r;   r"  c                   óF   ‡ — e Zd ZdZˆ fd„Zdej        dej        fd„Zˆ xZS )ÚPhimoeSparseMoeBlockaÈ  
    This implementation is
    strictly equivalent to standard MoE with full capacity (no
    dropped tokens). It's faster since it formulates MoE operations
    in terms of block-sparse operations to accommodate imbalanced
    assignments of tokens to experts, whereas standard MoE either
    (1) drop tokens at the cost of reduced performance or (2) set
    capacity factor to number of experts and thus waste computation
    and memory on padding.
    c                 ó  •— t          ¦   «                              ¦   «          |j        | _        |j        | _        |j        | _        |j        | _	        t          |¦  «        | _        t          |¦  «        | _        |j        | _        d S ro   )r,   r-   rE   rÛ   rÜ   Úffn_dimrÙ   rÚ   r&  r  r"  Úrouterr×   Úexpertsr%  rä   s     €r:   r-   zPhimoeSparseMoeBlock.__init__  sq   ø€ Ý‰Œ×ÒÑÔÐØ Ô,ˆŒØÔ/ˆŒØ!Ô3ˆÔØÔ/ˆŒ
Ý& vÑ.Ô.ˆŒÝ$ VÑ,Ô,ˆŒØ"(Ô";ˆÔÐÐr;   rˆ   r=   c                 ó‚  — |j         \  }}}| j        rF| j        dk    r;|t          j        |¦  «                             d| j        z
  d| j        z   ¦  «        z  }|j         \  }}}|                     d|¦  «        }|                      |¦  «        \  }}}|                      |||¦  «        }|                     |||¦  «        S )Nr   rA   rT   )	r^   r›   r%  rG   r  r  r‹   r.  r/  )	r7   rˆ   Ú
batch_sizeÚsequence_lengthrÛ   Ú_r)  rÆ   rô   s	            r:   rn   zPhimoeSparseMoeBlock.forward  sÓ   € Ø2?Ô2EÑ/ˆ
�O ZØŒ=ð 	˜TÔ4°qÒ8Ð8Ø�UÔ-¨mÑ<Ô<×EÒEØ�dÔ-Ñ-¨s°TÔ5LÑ/Lñô ñ ˆMð 3@Ô2EÑ/ˆ
�O ZØ%×-Ò-¨b°*Ñ=Ô=ˆØ/3¯{ª{¸=Ñ/IÔ/IÑ,ˆˆ?Ð,Ø"Ÿlšl¨=Ð:JÈOÑ\Ô\ÐØ"×*Ò*¨:°È
ÑSÔSÐSr;   )	r[   rq   rr   rÁ   r-   rG   rs   rn   ry   rz   s   @r:   r+  r+  û  sr   ø€ € € € € ð	ð 	ð<ð <ð <ð <ð <ðT U¤\ð T°e´lð Tð Tð Tð Tð Tð Tð Tð Tr;   r+  c                   óÆ   ‡ — e Zd Zdedefˆ fd„Z	 	 	 	 ddej        deej        ej        f         dz  dej        dz  dej	        dz  d	e
dz  d
ee         dej        fd„Zˆ xZS )ÚPhimoeDecoderLayerr&   r©   c                 óJ  •— t          ¦   «                              ¦   «          |j        | _        t          ||¦  «        | _        t          |¦  «        | _        t          j        |j        |j	        d¬¦  «        | _
        t          j        |j        |j	        d¬¦  «        | _        d S )NT©ÚepsÚelementwise_affine)r,   r-   rE   r¨   Ú	self_attnr+  Úmlpr   Ú	LayerNormÚrms_norm_epsÚinput_layernormÚpost_attention_layernormrµ   s      €r:   r-   zPhimoeDecoderLayer.__init__   s’   ø€ Ý‰Œ×ÒÑÔÐØ!Ô-ˆÔå(¨°Ñ;Ô;ˆŒå'¨Ñ/Ô/ˆŒõ  "œ|¨FÔ,>ÀFÔDWÐlpÐqÑqÔqˆÔÝ(*¬ØÔ FÔ$7ÈDð)
ñ )
ô )
ˆÔ%Ð%Ð%r;   Nrˆ   r¶   r•   rg   r·   r˜   r=   c           	      óÌ   — |}|                       |¦  «        } | j        d|||||dœ|¤Ž\  }}||z   }|}|                      |¦  «        }|                      |¦  «        }||z   }|S )N)rˆ   r¶   r•   rg   r·   rÕ   )r>  r:  r?  r;  )	r7   rˆ   r¶   r•   rg   r·   r˜   Úresidualr3  s	            r:   rn   zPhimoeDecoderLayer.forward.  sœ   € ð !ˆØ×,Ò,¨]Ñ;Ô;ˆØ)˜4œ>ð 
Ø'Ø 3Ø)Ø%Ø+ð
ð 
ð ð
ð 
Ñˆ�qð ! =Ñ0ˆØ ˆØ×5Ò5°mÑDÔDˆØŸš Ñ/Ô/ˆØ  =Ñ0ˆØÐr;   )NNNN)r[   rq   rr   r"   rv   r-   rG   rs   rw   Ú
LongTensorr	   r   r   rn   ry   rz   s   @r:   r5  r5    sè   ø€ € € € € ð
˜|ð 
¸ð 
ð 
ð 
ð 
ð 
ð 
ð" IMØ.2Ø04Ø(,ðð à”|ðð # 5¤<°´Ð#=Ô>ÀÑEðð œ tÑ+ð	ð
 Ô&¨Ñ-ðð  ™ðð Ð+Ô,ðð 
Œðð ð ð ð ð ð ð r;   r5  c                   óž   ‡ — e Zd ZU eed<   dZdZdgZdgZdZ	dZ
dZdZdZ eed¬¦  «        eedœZ ej        ¦   «         ˆ fd	„¦   «         Zˆ xZS )
ÚPhimoePreTrainedModelr&   ÚmodelTr5  r·   r   )rÎ   )r(  rˆ   Ú
attentionsc                 óf  •— t          ¦   «                              |¦  «         | j        j        }t	          |t
          ¦  «        r:t          j        |j        d|¬¦  «         t          j        |j	        d|¬¦  «         d S t	          |t          ¦  «        rt          j        |j        d|¬¦  «         d S d S )Nr�   )ÚmeanÚstd)r,   Ú_init_weightsr&   Úinitializer_ranger_   r×   ÚinitÚnormal_rà   rá   r"  Úweight)r7   r‘   rI  r9   s      €r:   rJ  z#PhimoePreTrainedModel._init_weights\  s­   ø€ å‰Œ×Ò˜fÑ%Ô%Ð%ØŒkÔ+ˆÝ�f�mÑ,Ô,ð 	;ÝŒL˜Ô,°3¸CÐ@Ñ@Ô@Ð@ÝŒL˜Ô)°¸Ð=Ñ=Ô=Ð=Ð=Ð=Ý˜Õ 0Ñ1Ô1ð 	;ÝŒL˜œ¨S°cÐ:Ñ:Ô:Ð:Ð:Ð:ð	;ð 	;r;   )r[   rq   rr   r"   rt   Úbase_model_prefixÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_skip_keys_device_placementÚ_supports_flash_attnÚ_supports_sdpaÚ_supports_flex_attnÚ_can_compile_fullgraphÚ_supports_attention_backendr   r"  r5  r¨   Ú_can_record_outputsrG   rx   rJ  ry   rz   s   @r:   rD  rD  I  s»   ø€ € € € € € àÐÐÑØÐØ&*Ð#Ø-Ð.ÐØ#4Ð"5ÐØÐØ€NØÐà!ÐØ"&Ðà'˜Ð(8ÀÐBÑBÔBØ+Ø%ðð Ðð €U„]�_„_ð;ð ;ð ;ð ;ñ „_ð;ð ;ð ;ð ;ð ;r;   rD  c                   óâ   ‡ — e Zd Zdefˆ fd„Zeee	 	 	 	 	 	 ddej	        dz  dej
        dz  dej	        dz  dedz  dej        dz  d	edz  d
ee         defd„¦   «         ¦   «         ¦   «         Zˆ xZS )ÚPhimoeModelr&   c                 óê  •‡— t          ¦   «                              ‰¦  «         ‰j        | _        ‰j        | _        t          j        ‰j        ‰j        | j        ¦  «        | _        t          j	        ˆfd„t          ‰j        ¦  «        D ¦   «         ¦  «        | _        t          j        ‰j        ‰j        d¬¦  «        | _        t!          ‰¬¦  «        | _        d| _        |                      ¦   «          d S )Nc                 ó0   •— g | ]}t          ‰|¦  «        ‘ŒS rÕ   )r5  )Ú.0r©   r&   s     €r:   ú
<listcomp>z(PhimoeModel.__init__.<locals>.<listcomp>p  s$   ø€ ÐdÐdÐd°yÕ ¨	Ñ2Ô2ÐdÐdÐdr;   Tr7  ©r&   F)r,   r-   Úpad_token_idÚpadding_idxÚ
vocab_sizer   Ú	EmbeddingrE   Úembed_tokensÚ
ModuleListÚrangeÚnum_hidden_layersÚlayersr<  r=  Únormr$   Ú
rotary_embÚgradient_checkpointingÚ	post_initrä   s    `€r:   r-   zPhimoeModel.__init__i  sÙ   øø€ Ý‰Œ×Ò˜Ñ Ô Ð Ø!Ô.ˆÔØ Ô+ˆŒåœL¨Ô):¸FÔ<NÐPTÔP`ÑaÔaˆÔÝ”mØdÐdÐdÐdÅEÈ&ÔJbÑDcÔDcÐdÑdÔdñ
ô 
ˆŒõ ”L Ô!3¸Ô9LÐaeÐfÑfÔfˆŒ	Ý/°vÐ>Ñ>Ô>ˆŒØ&+ˆÔ#ð 	�ŠÑÔÐÐÐr;   NÚ	input_idsr•   rg   r·   Úinputs_embedsÚ	use_cacher˜   r=   c           
      ót  — |d u |d uz  rt          d¦  «        ‚|r|€t          | j        ¬¦  «        }|€|                      |¦  «        }|€V|�|                     ¦   «         nd}t          j        |j        d         |j        ¬¦  «        |z   }| 	                    d¦  «        }| j        j
        €t          nt          }	 |	| j        ||||¬¦  «        }
|}|                      ||¬¦  «        }| j        d | j        j        …         D ]} ||f|
||||dœ|¤Ž}Œ|                      |¦  «        }t#          ||¬	¦  «        S )
Nz:You must specify exactly one of input_ids or inputs_embedsr_  r   r!   )r8   )r&   rn  r•   r·   rg   )rg   )r•   rg   r·   ro  r¶   )Úlast_hidden_stater·   )rZ   r
   r&   rd  Úget_seq_lengthrG   rH   r^   r8   r�   Úsliding_windowr   r   rj  rh  rg  ri  r   )r7   rm  r•   rg   r·   rn  ro  r˜   Úpast_seen_tokensÚmask_functionÚcausal_maskrˆ   r¶   Údecoder_layers                 r:   rn   zPhimoeModel.forwardy  s¢  € ð ˜Ð -°tÐ";Ñ<ð 	[ÝÐYÑZÔZÐZàð 	?˜Ð0Ý*°$´+Ð>Ñ>Ô>ˆOàÐ Ø ×-Ò-¨iÑ8Ô8ˆMàÐØCRÐC^˜×=Ò=Ñ?Ô?Ð?ÐdeÐÝ œ<¨Ô(;¸AÔ(>À}ÔG[Ð\Ñ\Ô\Ð_oÑoˆLØ'×1Ò1°!Ñ4Ô4ˆLà.2¬kÔ.HÐ.PÕ*Ð*ÕVwˆØ#�mØ”;Ø'Ø)Ø+Ø%ð
ñ 
ô 
ˆð &ˆØ"Ÿošo¨mÈ,˜oÑWÔWÐà!œ[Ð)H¨4¬;Ô+HÐ)HÔIð 		ð 		ˆMØ)˜MØðà*Ø)Ø /Ø#Ø$7ðð ð ðð ˆMˆMð Ÿ	š	 -Ñ0Ô0ˆå%Ø+Ø+ð
ñ 
ô 
ð 	
r;   )NNNNNN)r[   rq   rr   r"   r-   r   r    r   rG   rB  rs   r	   ÚFloatTensorÚboolr   r   r   rn   ry   rz   s   @r:   rZ  rZ  g  s  ø€ € € € € ð˜|ð ð ð ð ð ð ð   ØØð .2Ø.2Ø04Ø(,Ø26Ø!%ð4
ð 4
àÔ# dÑ*ð4
ð œ tÑ+ð4
ð Ô&¨Ñ-ð	4
ð
  ™ð4
ð Ô(¨4Ñ/ð4
ð ˜$‘;ð4
ð Ð+Ô,ð4
ð 
 ð4
ð 4
ð 4
ñ „^ñ „_ñ  Ôð4
ð 4
ð 4
ð 4
ð 4
r;   rZ  Úgate_logitsrÚ   c                 óÆ  ‡— | �t          | t          ¦  «        sdS t          | t          ¦  «        r/| d         j        Št          j        ˆfd„| D ¦   «         d¬¦  «        }t          j        j                             |d¬¦  «        }t          j        ||d¬¦  «        \  }}t          j        j         	                    ||¦  «        }|€@t          j
        |                     ¦   «         d¬¦  «        }	t          j
        |d¬¦  «        }
�n.|j        \  }}|j        d         ||z  z  }|ddd…dd…ddf                              |||||f¦  «                             d||¦  «                             ‰¦  «        }t          j        |                     ¦   «         |z  d¬¦  «        t          j        |d¬¦  «        z  }	|ddd…dd…df                              ||||f¦  «                             d|¦  «                             ‰¦  «        }t          j        ||z  d¬¦  «        t          j        |d¬¦  «        z  }
t          j        |	|
                     d¦  «        z  ¦  «        }||z  S )aÄ  
    Computes auxiliary load balancing loss as in Switch Transformer - implemented in Pytorch.

    See Switch Transformer (https://huggingface.co/papers/2101.03961) for more details. This function implements the loss
    function presented in equations (4) - (6) of the paper. It aims at penalizing cases where the routing between
    experts is too unbalanced.

    Args:
        gate_logits:
            Logits from the `gate`, should be a tuple of model.config.num_hidden_layers tensors of
            shape [batch_size X sequence_length, num_experts].
        num_experts:
            Number of experts
        top_k:
            The number of experts to route per-token, can be also interpreted as the `top-k` routing
            parameter.
        attention_mask (`torch.Tensor`, *optional*):
            The attention_mask used in forward function
            shape [batch_size X sequence_length] if not None.

    Returns:
        The auxiliary loss.
    Nr   c                 ó:   •— g | ]}|                      ‰¦  «        ‘ŒS rÕ   )rJ   )r]  Ú
layer_gateÚcompute_devices     €r:   r^  z,load_balancing_loss_func.<locals>.<listcomp>Õ  s&   ø€ Ð-jÐ-jÐ-jÐPZ¨j¯mªm¸NÑ.KÔ.KÐ-jÐ-jÐ-jr;   rY   rT   )r_   rw   r8   rG   rc   r   rž   rŸ   Útopkrë   rH  rK   r^   r]   r‹   rJ   rî   r�   )rz  rÚ   r  r•   Úconcatenated_gate_logitsr)  r3  rÆ   rõ   Útokens_per_expertÚrouter_prob_per_expertr1  r2  rg  Úexpert_attention_maskÚ router_per_expert_attention_maskÚoverall_lossr~  s                    @r:   Úload_balancing_loss_funcr†  ³  s�  ø€ ð: Ð¥*¨[½%Ñ"@Ô"@ÐØˆqå�+�uÑ%Ô%ð sØ$ QœÔ.ˆÝ#(¤9Ð-jÐ-jÐ-jÐ-jÐ^iÐ-jÑ-jÔ-jÐpqÐ#rÑ#rÔ#rÐ å”hÔ)×1Ò1Ð2JÐPRÐ1ÑSÔS€Oåœ* _°eÀÐDÑDÔDÑ€AÐå”(Ô%×-Ò-Ð.>ÀÑLÔL€KàÐå!œJ {×'8Ò'8Ñ':Ô':ÀÐBÑBÔBÐõ "'¤¨OÀÐ!CÑ!CÔ!CÐÑà&4Ô&:Ñ#ˆ
�OØ4Ô:¸1Ô=À*ÈÑB^Ñ_Ðð ˜4    A A A t¨TÐ1Ô2ßŠVÐ&¨
°OÀUÈKÐXÑYÔYßŠW�R˜ Ñ,Ô,ßŠR�ÑÔð	 	õ "œI k×&7Ò&7Ñ&9Ô&9Ð<QÑ&QÐWXÐYÑYÔYÕ\aÔ\eØ! qð]
ñ ]
ô ]
ñ 
Ðð ˜4    A A A tÐ+Ô,ßŠVÐ&¨
°OÀ[ÐQÑRÔRßŠW�R˜Ñ%Ô%ßŠR�ÑÔð	 	)õ "'¤¨?Ð=]Ñ+]ÐcdÐ!eÑ!eÔ!eÕhmÔhqØ,°!ði
ñ i
ô i
ñ "
Ðõ ”9Ð.Ð1G×1QÒ1QÐRSÑ1TÔ1TÑTÑUÔU€LØ˜+Ñ%Ð%r;   c                   ó<  ‡ — e Zd ZddiZddiZddgdgfiZˆ fd„Zee	 	 	 	 	 	 	 	 	 dd
e	j
        dz  de	j        dz  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e	j        z  dee         defd„¦   «         ¦   «         Z	 	 	 	 	 	 dˆ fd„	Zˆ xZS )ÚPhimoeForCausalLMzlm_head.weightzmodel.embed_tokens.weightÚlm_headÚcolwise_gather_outputrˆ   Úlogitsc                 óZ  •— t          ¦   «                              |¦  «         t          |¦  «        | _        |j        | _        t          j        |j        |j        | j        j	        ¬¦  «        | _
        |j        | _        |j        | _        |j        | _        |                      ¦   «          d S )Nr«   )r,   r-   rZ  rE  rb  r   r¯   rE   r&   Úlm_head_biasr‰  Úrouter_aux_loss_coefrÙ   rÚ   r&  rl  rä   s     €r:   r-   zPhimoeForCausalLM.__init__  s�   ø€ Ý‰Œ×Ò˜Ñ Ô Ð Ý  Ñ(Ô(ˆŒ
Ø Ô+ˆŒÝ”y Ô!3°VÔ5FÈTÌ[ÔMeÐfÑfÔfˆŒØ$*Ô$?ˆÔ!Ø!Ô3ˆÔØ#)Ô#=ˆÔ ð 	�ŠÑÔÐÐÐr;   Nr   rm  r•   rg   r·   rn  Úlabelsro  Úoutput_router_logitsÚlogits_to_keepr˜   r=   c
                 ó  — |�|n| j         j        } | j        d|||||||dœ|
¤Ž}|j        }t	          |	t
          ¦  «        rt          |	 d¦  «        n|	}|                      |dd…|dd…f         ¦  «        }d}|� | j        ||| j	        fi |
¤Ž}d}|rHt          |j        | j        | j        |¦  «        }|�%|| j        |                     |j        ¦  «        z  z  }t#          ||||j        |j        |j        |j        ¬¦  «        S )az  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
            config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored
            (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.

        Example:

        ```python
        >>> from transformers import AutoTokenizer, PhimoeForCausalLM

        >>> model = PhimoeForCausalLM.from_pretrained("mistralai/Phimoe-8x7B-v0.1")
        >>> tokenizer = AutoTokenizer.from_pretrained("mistralai/Phimoe-8x7B-v0.1")

        >>> prompt = "Hey, are you conscious? Can you talk to me?"
        >>> inputs = tokenizer(prompt, return_tensors="pt")

        >>> # Generate
        >>> generate_ids = model.generate(inputs.input_ids, max_length=30)
        >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
        "Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."
        ```N)rm  r•   rg   r·   rn  ro  r�  )ÚlossÚaux_lossr‹  r·   rˆ   rF  r(  rÕ   )r&   r�  rE  rq  r_   rv   Úslicer‰  Úloss_functionrb  r†  r(  rÚ   r&  rŽ  rJ   r8   r   r·   rˆ   rF  )r7   rm  r•   rg   r·   rn  r�  ro  r�  r‘  r˜   Úoutputsrˆ   Úslice_indicesr‹  r“  r”  s                    r:   rn   zPhimoeForCausalLM.forward  sn  € ðN %9Ð$DÐ Ð È$Ì+ÔJjð 	ð
 +5¨$¬*ð 	+
ØØ)Ø%Ø+Ø'ØØ!5ð	+
ð 	+
ð ð	+
ð 	+
ˆð  Ô1ˆå8BÀ>ÕSVÑ8WÔ8WÐk�˜~˜o¨tÑ4Ô4Ð4Ð]kˆØ—’˜m¨A¨A¨A¨}¸a¸a¸aÐ,?Ô@ÑAÔAˆàˆØÐØ%�4Ô% f¨f°d´oÐPÐPÈÐPÐPˆDàˆØð 	MÝ/ØÔ%ØÔ ØÔ(Øñ	ô ˆHð Ð!Ø˜Ô1°H·K²KÀÄÑ4LÔ4LÑLÑL�å(ØØØØ#Ô3Ø!Ô/ØÔ)Ø!Ô/ð
ñ 
ô 
ð 	
r;   Tc                 ó   •— |rYt          | j        d¦  «        rD|j        d         | j        j        dz   k    r&|                     ¦   «         }	|	| j        j        k    rd } t          ¦   «         j        d|||||||dœ|¤Ž}
|
S )NrQ   r!   )rm  r·   r•   rn  rg   ro  r‘  rÕ   )Úhasattrr&   r^   rQ   rr  r,   Úprepare_inputs_for_generation)r7   rm  r·   r•   rn  rg   ro  r‘  r˜   Úpast_lengthÚmodel_inputsr9   s              €r:   r›  z/PhimoeForCausalLM.prepare_inputs_for_generationl  s°   ø€ ð" ð	'å˜œÐ%GÑHÔHð	'ð ” Ô" d¤kÔ&RÐUVÑ&VÒVÐVà)×8Ò8Ñ:Ô:ˆKØ˜dœkÔJÒJÐJØ"&�à<•u‘w”wÔ<ð 	
ØØ+Ø)Ø'Ø%ØØ)ð	
ð 	
ð ð	
ð 	
ˆð Ðr;   )	NNNNNNNNr   )NNNNTN)r[   rq   rr   Ú_tied_weights_keysÚ_tp_planÚ_pp_planr-   r   r   rG   rB  rs   r	   rx  ry  rv   r   r   r   rn   r›  ry   rz   s   @r:   rˆ  rˆ    sŸ  ø€ € € € € à*Ð,GÐHÐØÐ2Ð3€HØ˜_Ð-°¨zÐ:Ð;€Hð
ð 
ð 
ð 
ð 
ð Øð .2Ø.2Ø04Ø(,Ø26Ø*.Ø!%Ø,0Ø-.ðP
ð P
àÔ# dÑ*ðP
ð œ tÑ+ðP
ð Ô&¨Ñ-ð	P
ð
  ™ðP
ð Ô(¨4Ñ/ðP
ð Ô  4Ñ'ðP
ð ˜$‘;ðP
ð # T™kðP
ð ˜eœlÑ*ðP
ð Ð+Ô,ðP
ð 
#ðP
ð P
ð P
ñ „^ñ ÔðP
ðl ØØØØØð#ð #ð #ð #ð #ð #ð #ð #ð #ð #r;   rˆ  c                   ó   — e Zd ZdS )ÚPhimoeForSequenceClassificationN)r[   rq   rr   rÕ   r;   r:   r¢  r¢  ’  s   € € € € € € € r;   r¢  )rD  rZ  rˆ  r¢  )r!   )r�   )rB   )NrB   N)KÚcollections.abcr   Útypingr   rG   r   Ú r   rL  Úactivationsr   Úcache_utilsr	   r
   Ú
generationr   Úintegrationsr   r   r   Úmasking_utilsr   r   Úmodeling_layersr   r   Úmodeling_outputsr   r   Úmodeling_rope_utilsr   r   Úmodeling_utilsr   r   Úprocessing_utilsr   Úutilsr   r   r   Úutils.genericr   r   Úutils.output_capturingr   r    Úconfiguration_phimoer"   ÚModuler$   r~   r‡   rs   rv   r�   rK   r¦   r¨   ÚautogradÚFunctionrÃ   r×   r   r¯   r"  r+  r5  rD  rZ  rw   r†  rˆ  r¢  Ú__all__rÕ   r;   r:   ú<module>r¸     sˆ  ðð, %Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &Ø !Ð !Ð !Ð !Ð !Ð !Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø )Ð )Ð )Ð )Ð )Ð )Ø eÐ eÐ eÐ eÐ eÐ eÐ eÐ eÐ eÐ eØ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ &Ð &Ð &Ð &Ð &Ð &Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ .Ð .Ð .Ð .Ð .Ð .ðL0ð L0ð L0ð L0ð L0˜BœIñ L0ô L0ð L0ð^(ð (ð (ð ÐÐ*Ñ+Ô+ðð ð ñ ,Ô+ðð2	U˜Uœ\ð 	U°#ð 	U¸%¼,ð 	Uð 	Uð 	Uð 	Uð& ð%ð %ØŒIð%àŒ<ð%ð 
Œð%ð Œ<ð	%ð
 ”L 4Ñ'ð%ð ð%ð ð%ð Ð'Ô(ð%ð %ð %ð %ð2 ÐÐ)Ñ*Ô*ð@)ð @)ð @)ð @)ð @)�b”iñ @)ô @)ñ +Ô*ð@)ðF;
ð ;
ð ;
ð ;
ð ;
�u”~Ô.ñ ;
ô ;
ð ;
ð| ð$#ð $#ð $#ð $#ð $#�B”Iñ $#ô $#ñ Ôð$#ðNxð xð xð xðv@ð @ð @ð @ð @�r”yñ @ô @ð @ð(!Tð !Tð !Tð !Tð !T˜2œ9ñ !Tô !Tð !TðH'ð 'ð 'ð 'ð 'Ð3ñ 'ô 'ð 'ðT ð;ð ;ð ;ð ;ð ;˜Oñ ;ô ;ñ „ð;ð: ðH
ð H
ð H
ð H
ð H
Ð'ñ H
ô H
ñ „ðH
ðZ #Ø
Ø*.ð	O&ð O&Ø”  e¤lÔ 3Ñ3°dÑ:ðO&à�t‘ðO&ð ”L 4Ñ'ð	O&ð
 „\�CÑðO&ð O&ð O&ð O&ðd ðIð Ið Ið Ið IÐ-¨ñ Iô Iñ „ðIðX dÐ cÐ cÐ cÐ cÐ&FÐH]Ñ cÔ cÐ cð kÐ
jÐ
j€€€r;   