Ë
    îÿæi·&  ã            	       óV  — d dl mZ d dlmZ d dlmZmZmZmZ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 ddlmZmZ dd	lmZ  eej6                  d
¬«      dej8                  dej8                  dej8                  dej8                  fd„«       Z eej6                  d
¬«      dej8                  dej8                  dej8                  fd„«       Z eej6                  d
¬«      dej8                  dej8                  dej8                  dej8                  fd„«       Ze G d„ de«      «       Z  G d„ dejB                  «      Z" G d„ dejB                  «      Z# G d„ dejB                  «      Z$ G d„ d ejB                  «      Z% G d!„ d"ejB                  «      Z& G d#„ d$ejB                  «      Z'y)%é    )Ú	dataclass)Úpartial)ÚAnyÚDictÚListÚOptionalÚTupleÚUnionN)Úshard_linearé   )ÚBaseModelArgsÚcreate_attention_maskÚscaled_dot_product_attention)ÚKVCacheÚRotatingKVCache)Úinitialize_ropeT)Ú	shapelessÚqueryÚweightÚbiasÚreturnc                 óz   — | |d d …d d d …f   j                  dd«      z  }||d   z   }t        j                  |«      S )Néÿÿÿÿéþÿÿÿ).NN)ÚswapaxesÚmxÚsigmoid)r   r   r   Úgate_logitss       úr/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_lm/models/iquestloopcoder.pyÚ_compute_gater       sB   € à˜&¢ Dª! Ñ,×5Ñ5°b¸"Ó=Ñ=€KØ  _Ñ 5Ñ5€KÜ�:‰:�kÓ"Ð"ó    ÚgateÚupc                 ó2   — t        j                  | «      |z  S ©N)ÚnnÚsilu)r"   r#   s     r   Ú	_silu_mulr(      s   € ä�7‰7�4‹=˜2ÑÐr!   Úattn_globalÚ
attn_localc                 ó   — | |z  d| z
  |z  z   S )Nr   © )r"   r)   r*   s      r   Ú_mix_attentionr-      s   € ð �+Ñ  T¡¨ZÑ 7Ñ7Ð7r!   c                   óò   — e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   d
Zeed<   dZe	ed<   dZ
e	ed<   dZeed<   dZeeeeeef   f      ed<   dZe	ed<   dZeed<   dZeed<   y)Ú	ModelArgsÚ
model_typeÚhidden_sizeÚnum_hidden_layersÚintermediate_sizeÚnum_attention_headsÚrms_norm_epsÚ
vocab_sizeÚhead_dimÚnum_key_value_headsi   Úmax_position_embeddingsFÚattention_biasÚmlp_biasg    €„AÚ
rope_thetaNÚrope_scalingÚtie_word_embeddingsé   Úloop_numé@   Úloop_window_size)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__ÚintÚfloatr9   r:   Úboolr;   r<   r=   r   r   r
   r>   r@   rB   r,   r!   r   r/   r/   #   s    … àƒOØÓØÓØÓØÓØÓØƒOØƒMØÓØ#)Ð˜SÓ)Ø €N�DÓ Ø€HˆdÓØ €J�Ó Ø;?€L�(˜4  U¨5°#¨:Ñ%6Ð 6Ñ7Ñ8Ó?Ø %Ð˜Ó%Ø€HˆcÓØÐ�cÔr!   r/   c                   ó`   ‡ — e Zd Zdedefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚLoopGateProjectionÚ	num_headsr7   c                 ó¬   •— t         ‰| �  «        || _        || _        t	        j
                  ||f«      | _        t	        j
                  |f«      | _        y r%   )ÚsuperÚ__init__rM   r7   r   Úzerosr   r   )ÚselfrM   r7   Ú	__class__s      €r   rP   zLoopGateProjection.__init__9   sC   ø€ Ü‰ÑÔØ"ˆŒØ ˆŒÜ—h‘h 	¨8Ð4Ó5ˆŒÜ—H‘H˜i˜\Ó*ˆ�	r!   r   r   c                 óD   — t        || j                  | j                  «      S r%   )r    r   r   )rR   r   s     r   Ú__call__zLoopGateProjection.__call__@   s   € Ü˜U D§K¡K°·±Ó;Ð;r!   )	rC   rD   rE   rH   rP   r   ÚarrayrU   Ú__classcell__©rS   s   @r   rL   rL   8   s1   ø„ ð+ #ð +°õ +ð<˜bŸh™hð <¨2¯8©8÷ <r!   rL   c                   ó.  ‡ — e Zd Zdefˆ fd„Z	 ddej                  dedeej                  ej                  ej                  f   fd„Z		 	 ddej                  dej                  d	ej                  d
e
ej                     de
e   dej                  fd„Zˆ xZS )Ú	AttentionÚargsc                 óv  •— t         ‰| �  «        |j                  }|j                  x| _        }|j
                  x| _        }|j                  x| _        }|dz  | _        t        j                  |||z  |j                  ¬«      | _        t        j                  |||z  |j                  ¬«      | _        t        j                  |||z  |j                  ¬«      | _        t        j                  ||z  ||j                  ¬«      | _        t!        ||j"                  d|j$                  |j&                  ¬«      | _        y )Ng      à¿©r   F)ÚtraditionalÚscaling_configr9   )rO   rP   r1   r4   Ún_headsr8   Ú
n_kv_headsr7   Úscaler&   ÚLinearr:   Úq_projÚk_projÚv_projÚo_projr   r<   r=   r9   Úrope)rR   r[   Údimr`   ra   r7   rS   s         €r   rP   zAttention.__init__E   sÿ   ø€ Ü‰ÑÔà×ÑˆØ!%×!9Ñ!9Ð9ˆŒ�wØ'+×'?Ñ'?Ð?ˆŒ˜*Ø#'§=¡=Ð0ˆŒ˜Ø˜t‘^ˆŒ
ä—i‘i  W¨xÑ%7¸d×>QÑ>QÔRˆŒÜ—i‘i  Z°(Ñ%:À×ATÑATÔUˆŒÜ—i‘i  Z°(Ñ%:À×ATÑATÔUˆŒÜ—i‘i ¨(Ñ 2°C¸d×>QÑ>QÔRˆŒä#ØØ�O‰OØØ×,Ñ,Ø$(×$@Ñ$@ô
ˆ�	r!   ÚxÚoffsetr   c                 óò  — |j                   \  }}}| j                  |«      j                  ||| j                  d«      j	                  dddd«      }| j                  |«      j                  ||| j                  d«      j	                  dddd«      }| j                  |«      j                  ||| j                  d«      j	                  dddd«      }| j                  ||¬«      }| j                  ||¬«      }|||fS )Nr   r   r?   r   é   )rk   )	Úshaperd   Úreshaper`   Ú	transposere   ra   rf   rh   )	rR   rj   rk   ÚBÚLÚ_ÚqueriesÚkeysÚvaluess	            r   Úget_qkvzAttention.get_qkv[   sä   € ð —'‘'‰ˆˆ1ˆaØ—+‘+˜a“.×(Ñ(¨¨A¨t¯|©|¸RÓ@×JÑJÈ1ÈaÐQRÐTUÓVˆØ�{‰{˜1‹~×%Ñ% a¨¨D¯O©O¸RÓ@×JÑJÈ1ÈaÐQRÐTUÓVˆØ—‘˜Q“×'Ñ'¨¨1¨d¯o©o¸rÓB×LÑLÈQÐPQÐSTÐVWÓXˆà—)‘)˜G¨F�)Ó3ˆØ�y‰y˜ fˆyÓ-ˆà˜˜fÐ$Ð$r!   rt   ru   rv   ÚmaskÚcachec                 ó8   — t        ||||| j                  |¬«      S )N)ry   rb   rx   )r   rb   )rR   rt   ru   rv   rx   ry   s         r   Ú	attentionzAttention.attentionh   s"   € ô ,Ø�T˜6¨°d·j±jÀtô
ð 	
r!   )r   )NN)rC   rD   rE   r/   rP   r   rV   rH   r	   rw   r   r   r{   rW   rX   s   @r   rZ   rZ   D   s±   ø„ ð
˜Yõ 
ð. *+ñ%Ø—‘ð%Ø#&ð%à	ˆr�x‰x˜Ÿ™ 2§8¡8Ð+Ñ	,ó%ð$ $(Ø#ñ

à—‘ð

ð �h‰hð

ð —‘ð	

ð
 �r—x‘xÑ ð

ð ˜‰}ð

ð 
�‰÷

r!   rZ   c                   ó\   ‡ — e Zd Zdefˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚMLPr[   c                 ó<  •— t         ‰| �  «        |j                  }|j                  }t	        j
                  |||j                  ¬«      | _        t	        j
                  |||j                  ¬«      | _        t	        j
                  |||j                  ¬«      | _	        y )Nr]   )
rO   rP   r1   r3   r&   rc   r;   Ú	gate_projÚ	down_projÚup_proj)rR   r[   ri   Ú
hidden_dimrS   s       €r   rP   zMLP.__init__v   sl   ø€ Ü‰ÑÔØ×ÑˆØ×+Ñ+ˆ
ÜŸ™ 3¨
¸¿¹ÔGˆŒÜŸ™ :¨s¸¿¹ÔGˆŒÜ—y‘y  j°t·}±}ÔEˆ�r!   rj   r   c                 ót   — | j                  t        | j                  |«      | j                  |«      «      «      S r%   )r€   r(   r   r�   )rR   rj   s     r   rU   zMLP.__call__~   s)   € Ø�~‰~œi¨¯©°qÓ(9¸4¿<¹<È»?ÓKÓLÐLr!   )	rC   rD   rE   r/   rP   r   rV   rU   rW   rX   s   @r   r}   r}   u   s/   ø„ ðF˜Yõ FðM˜"Ÿ(™(ð M r§x¡x÷ Mr!   r}   c                   ó$   ‡ — e Zd Zdefˆ fd„Zˆ xZS )ÚTransformerBlockr[   c                 ó"  •— t         ‰| �  «        t        |«      | _        t	        |«      | _        t        j                  |j                  |j                  ¬«      | _
        t        j                  |j                  |j                  ¬«      | _        y )N©Úeps)rO   rP   rZ   Ú	self_attnr}   Úmlpr&   ÚRMSNormr1   r5   Úinput_layernormÚpost_attention_layernorm©rR   r[   rS   s     €r   rP   zTransformerBlock.__init__ƒ   se   ø€ Ü‰ÑÔÜ" 4›ˆŒÜ�t“9ˆŒÜ!Ÿz™z¨$×*:Ñ*:À×@QÑ@QÔRˆÔÜ(*¯
©
Ø×Ñ $×"3Ñ"3ô)
ˆÕ%r!   )rC   rD   rE   r/   rP   rW   rX   s   @r   r…   r…   ‚   s   ø„ ð
˜Y÷ 
ñ 
r!   r…   c                   óX   ‡ — e Zd Zdefˆ fd„Z	 ddej                  deee	      fd„Z
ˆ xZS )ÚIQuestLoopCoderModelr[   c                 óž  •— t         ‰| �  «        |j                  dk(  sJ d|j                  › �«       ‚|| _        |j                  | _        t        j                  |j                  |j                  «      | _        t        |j                  «      D �cg c]  }t        |¬«      ‘Œ c}| _        t        j                  |j                  |j                  ¬«      | _        t        |j                  «      D �cg c]"  }t!        |j"                  |j$                  «      ‘Œ$ c}| _        |j                  | _        |j(                  | _        y c c}w c c}w )Nr?   z"Only loop_num=2 is supported, got )r[   r‡   )rO   rP   r@   r[   r6   r&   Ú	Embeddingr1   Úembed_tokensÚranger2   r…   Úlayersr‹   r5   ÚnormrL   r4   r7   Úgate_projectionsrB   )rR   r[   rs   rS   s      €r   rP   zIQuestLoopCoderModel.__init__Ž   s  ø€ Ü‰ÑÔØ�}‰} Ò!ÐWÐ%GÈÏÉÀÐ#WÓWÐ!ØˆŒ	ØŸ/™/ˆŒÜŸL™L¨¯©¸$×:JÑ:JÓKˆÔä16°t×7MÑ7MÔ1Nó
Ù1N¨AÔ $Ö'Ð1Nñ
ˆŒô —J‘J˜t×/Ñ/°T×5FÑ5FÔGˆŒ	ô ˜4×1Ñ1Ô2ó!
á2�ô ˜t×7Ñ7¸¿¹ÕGØ2ñ!
ˆÔð Ÿ™ˆŒØ $× 5Ñ 5ˆÕùò
ùò!
s   ÂEÃ3'E
Úinputsry   c           	      óþ  — |j                   d d \  }}| j                  |«      }|€d gdt        | j                  «      z  z  }t	        ||d   «      }t	        ||t        | j                  «         | j
                  ¬«      }g }t        | j                  |«      D ]ø  \  }	}
|	j                  |«      }|
�|
j                  nd}|	j                  j                  ||«      \  }}}|
�|
j                  ||«      \  }}|j                  ||f«       |	j                  j                  |||||
¬«      }|	j                  j                  |j                  dddd«      j!                  ||d«      «      }||z   }|	j#                  |	j%                  |«      «      }||z   }Œú t        | j                  | j&                  |t        | j                  «      d  |«      D �]   \  }	}}
\  }}|	j                  |«      }|
�|
j                  nd}|	j                  j                  ||«      \  }}} ||«      }|	j                  j                  |||||
¬«      }|
�|
j                  ||«      \  }}|	j                  j                  |||||
¬«      }t)        |||«      }|	j                  j                  |j                  dddd«      j!                  ||d«      «      }||z   }|	j#                  |	j%                  |«      «      }||z   }�Œ# | j+                  |«      S )Nr?   r   )Úwindow_size)ry   r   rm   r   )rn   r“   Úlenr•   r   rB   ÚziprŒ   rk   r‰   rw   Úupdate_and_fetchÚappendr{   rg   rp   ro   rŠ   r�   r—   r-   r–   )rR   r˜   ry   rq   rr   Úhrx   Úwindow_maskÚloop1_kvÚlayerÚcÚh_normrk   Úq1Úk1Úv1ÚoutÚrr   Úq2Úk2Úv2r"   r)   r*   Úmixeds                             r   rU   zIQuestLoopCoderModel.__call__Ÿ   sæ  € ð
 �|‰|˜B˜QÐ‰ˆˆ1Ø×Ñ˜fÓ%ˆàˆ=Ø�F˜a¤# d§k¡kÓ"2Ñ2Ñ3ˆEä$ Q¨¨a©Ó1ˆÜ+Øˆu”S˜Ÿ™Ó%Ñ&°D×4IÑ4Iô
ˆð ˆÜ˜DŸK™K¨Ö/‰HˆE�1Ø×*Ñ*¨1Ó-ˆFØ!" �Q—X’X°AˆFØŸ™×0Ñ0°¸Ó@‰JˆB��Bàˆ}Ø×+Ñ+¨B°Ó3‘��BØ�O‰O˜R ˜HÔ%à—/‘/×+Ñ+¨B°°B¸ÀAÐ+ÓFˆCØ—‘×&Ñ& s§}¡}°Q¸¸1¸aÓ'@×'HÑ'HÈÈAÈrÓ'RÓSˆAØ�A‘ˆAØ—	‘	˜%×8Ñ8¸Ó;Ó<ˆAØ�A‘‰Að 0ô .1Ø�K‰K˜×.Ñ.°´c¸$¿+¹+Ó6FÐ6HÐ0IÈ8÷.
Ñ)ˆE�9˜a¡ " bð ×*Ñ*¨1Ó-ˆFØ!" �Q—X’X°AˆFØŸ™×0Ñ0°¸Ó@‰JˆB��BÙ˜R“=ˆDØŸ/™/×3Ñ3°B¸¸BÀÈAÐ3ÓNˆKàˆ}Ø×+Ñ+¨B°Ó3‘��BØŸ™×2Ñ2ØØØØØð 3ó ˆJô # 4¨°jÓAˆEØ—‘×&Ñ& u§¡°q¸!¸QÀÓ'B×'JÑ'JÈ1ÈaÐQSÓ'TÓUˆAØ�A‘ˆAØ—	‘	˜%×8Ñ8¸Ó;Ó<ˆAØ�A‘ŠAð/.
ð2 �y‰y˜‹|Ðr!   r%   )rC   rD   rE   r/   rP   r   rV   r   r   r   rU   rW   rX   s   @r   r�   r�   �   s8   ø„ ð6˜Yõ 6ð( &*ñ9à—‘ð9ð ˜˜S™	Ñ"÷9r!   r�   c                   óš   ‡ — e Zd Zdefˆ fd„Z	 d	dej                  fd„Zd	deej                  j                     fd„Zed„ «       Zd„ Zˆ xZS )
ÚModelr[   c                 óî   •— t         ‰| �  «        || _        |j                  | _        t	        |«      | _        |j                  s2t        j                  |j                  |j                  d¬«      | _        y y )NFr]   )rO   rP   r[   r0   r�   Úmodelr>   r&   rc   r1   r6   Úlm_headrŽ   s     €r   rP   zModel.__init__Ü   sX   ø€ Ü‰ÑÔØˆŒ	ØŸ/™/ˆŒÜ)¨$Ó/ˆŒ
Ø×'Ò'ÜŸ9™9 T×%5Ñ%5°t·±ÈUÔSˆD�Lð (r!   r˜   c                 óÆ   — | j                  ||«      }| j                  j                  r'| j                   j                  j	                  |«      }|S | j                  |«      }|S r%   )r±   r[   r>   r“   Ú	as_linearr²   )rR   r˜   ry   r¨   s       r   rU   zModel.__call__ä   sW   € ð
 �j‰j˜ Ó'ˆØ�9‰9×(Ò(Ø—*‘*×)Ñ)×3Ñ3°CÓ8ˆCð ˆ
ð —,‘,˜sÓ#ˆCØˆ
r!   Úgroupc                 óÒ  — |xs t         j                  j                  «       }|j                  «       }|j	                  «       }t        | j                  j                  «      D �]  \  }}t        |j                  j                  d|¬«      |j                  _
        t        |j                  j                  d|¬«      |j                  _        t        |j                  j                  d|¬«      |j                  _        t        |j                  j                  d|¬«      |j                  _        |j                  xj                  |z  c_        |j                  xj                  |z  c_        t        |j                   j"                  d|¬«      |j                   _        t        |j                   j$                  d|¬«      |j                   _        t        |j                   j&                  d|¬«      |j                   _        | j                  j(                  |   }|j*                  |z  }||z  }||z   }	|j,                  ||	…d d …f   |_        |j.                  ||	 |_        ||_        �Œ y )Nzall-to-sharded)rµ   zsharded-to-all)r   ÚdistributedÚinitÚsizeÚrankÚ	enumerater±   r•   r   r‰   rd   re   rf   rg   r`   ra   rŠ   r   r€   r�   r—   rM   r   r   )
rR   rµ   ÚNrº   Úir¢   r   Úheads_per_rankÚstartÚends
             r   ÚshardzModel.shardð   sç  € ØÒ.œŸ™×,Ñ,Ó.ˆØ�J‰J‹LˆØ�z‰z‹|ˆä! $§*¡*×"3Ñ"3×4‰HˆAˆuÜ%1Ø—‘×&Ñ&Ð(8Àô&ˆE�O‰OÔ"ô &2Ø—‘×&Ñ&Ð(8Àô&ˆE�O‰OÔ"ô &2Ø—‘×&Ñ&Ð(8Àô&ˆE�O‰OÔ"ô &2Ø—‘×&Ñ&Ð(8Àô&ˆE�O‰OÔ"ð �O‰O×#Ò#¨Ñ)Õ#Ø�O‰O×&Ò&¨1Ñ,Õ&ä".Ø—	‘	×#Ñ#Ð%5¸Uô#ˆE�I‰IÔô #/Ø—	‘	×#Ñ#Ð%5¸Uô#ˆE�I‰IÔô !-Ø—	‘	×!Ñ!Ð#3¸5ô!ˆE�I‰IÔð Ÿ
™
×3Ñ3°AÑ6ˆIØ&×0Ñ0°AÑ5ˆNØ˜>Ñ)ˆEØ˜.Ñ(ˆCØ(×/Ñ/°°c°	º1°Ñ=ˆIÔØ&Ÿ^™^¨E°#Ð6ˆIŒNØ"0ˆIÖñA 5r!   c                 ó.   — | j                   j                  S r%   )r±   r•   )rR   s    r   r•   zModel.layers  s   € à�z‰z× Ñ Ð r!   c                 óÌ   — | j                   D �cg c]  }t        «       ‘Œ c}| j                   D �cg c]"  }t        | j                  j                  ¬«      ‘Œ$ c}z   S c c}w c c}w )N)Úmax_size)r•   r   r   r[   rB   )rR   rs   s     r   Ú
make_cachezModel.make_cache  sV   € Ø#'§;¢;Ó/¡;˜a”•	 ;Ñ/ØJNÏ+Ê+ó3
ÙJUÀQŒO T§Y¡Y×%?Ñ%?Ö@È+ñ3
ñ 
ð 	
ùÒ/ùò 3
s
   �A°'A!r%   )rC   rD   rE   r/   rP   r   rV   rU   r   r·   ÚGrouprÁ   Úpropertyr•   rÅ   rW   rX   s   @r   r¯   r¯   Û   s\   ø„ ðT˜Yõ Tð ñ
à—‘ó
ñ%1˜8 B§N¡N×$8Ñ$8Ñ9ó %1ðN ñ!ó ð!ö
r!   r¯   )(Údataclassesr   Ú	functoolsr   Útypingr   r   r   r   r	   r
   Úmlx.coreÚcorer   Úmlx.nnr&   Úmlx.nn.layers.distributedr   Úbaser   r   r   ry   r   r   Ú
rope_utilsr   ÚcompilerV   r    r(   r-   r/   ÚModulerL   rZ   r}   r…   r�   r¯   r,   r!   r   Ú<module>rÓ      s…  ðõ "Ý ß :× :å Ý Ý 2ç TÑ Tß +Ý 'ñ 	ˆ�‰˜tÔ$ð#˜Ÿ™ð #¨2¯8©8ð #¸2¿8¹8ð #ÈÏÉò #ó %ð#ñ 	ˆ�‰˜tÔ$ð�B—H‘Hð  "§(¡(ð ¨r¯x©xò ó %ðñ 	ˆ�‰˜tÔ$ð8Ø
�(‰(ð8Ø!#§¡ð8Ø79·x±xð8à‡X�Xò8ó %ð8ð ô�ó ó ðô(	<˜Ÿ™ô 	<ô.
�—	‘	ô .
ôb
Mˆ"�)‰)ô 
Mô
�r—y‘yô 
ôK˜2Ÿ9™9ô Kô\C
ˆB�I‰Iõ C
r!   