Ë
    îÿæif*  ã                   óê  — d dl mZ d dl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 dd	lmZ e G d
„ de«      «       Ze G d„ de«      «       Z G d„ de
j4                  «      Z G d„ de
j4                  «      Z G d„ de
j4                  «      Z G d„ de
j4                  «      Z G d„ de
j4                  «      Z G d„ de
j4                  «      Z  G d„ de
j4                  «      Z!y)é    )Ú	dataclass)ÚAnyÚOptionalÚUnionNé   )Úswiglu)ÚBaseModelArgsÚcreate_attention_maskÚscaled_dot_product_attention)ÚChunkedKVCacheÚKVCache)Úinitialize_rope)Ú	SwitchGLUc                   óö   — 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	<   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<   eed<   dZ	eed<   dZ
eed<   dZeed<   y)ÚTextArgsÚattention_biasÚattention_chunk_sizeÚhead_dimÚhidden_sizeÚinterleave_moe_layer_stepÚintermediate_sizeÚintermediate_size_mlpÚmax_position_embeddingsÚ
model_typeÚnum_attention_headsÚnum_experts_per_tokÚnum_hidden_layersÚnum_key_value_headsÚnum_local_expertsÚrms_norm_epsÚrope_scalingÚ
rope_thetaÚuse_qk_normÚ
vocab_sizeé   Úattn_temperature_tuningi    Úfloor_scalegš™™™™™¹?Ú
attn_scaleN)Ú__name__Ú
__module__Ú__qualname__ÚboolÚ__annotations__ÚintÚstrÚfloatr   r&   r'   r(   © ó    úi/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_lm/models/llama4.pyr   r      s�   … àÓØÓØƒMØÓØ"Ó"ØÓØÓØ Ó ØƒOØÓØÓØÓØÓØÓØÓØÓØÓØÓØƒOØ#$Ð˜SÓ$Ø€K�ÓØ€J�Ôr2   r   c                   ó2   — e Zd ZU eeef   ed<   eed<   d„ Zy)Ú	ModelArgsÚtext_configr   c                 óL   — t         j                  | j                  «      | _        y ©N)r   Ú	from_dictr6   ©Úselfs    r3   Ú__post_init__zModelArgs.__post_init__/   s   € Ü#×-Ñ-¨d×.>Ñ.>Ó?ˆÕr2   N)	r)   r*   r+   r   r   Údictr-   r/   r<   r1   r2   r3   r5   r5   *   s   … à�x �~Ñ&Ó&ØƒOó@r2   r5   c            	       óŽ   ‡ — e Zd Zdedefˆ fd„Z	 	 d	dej                  deej                     dee	   dej                  fd„Z
ˆ xZS )
Ú	AttentionÚargsÚ	layer_idxc                 ón  •— t         ‰| �  «        |j                  }|j                  x| _        }|j
                  x| _        }t        |dz   dz  dk7  «      | _        |j                  | _	        |j                  | _
        |j                  | _        |j                  xs |j                  |z  x| _        }|dz  | _        t        |d«      r|j                  }nd}t!        j"                  |||z  |¬«      | _        t!        j"                  |||z  |¬«      | _        t!        j"                  |||z  |¬«      | _        t!        j"                  ||z  ||¬«      | _        |j,                  xr | j                  | _        | j                  r4t/        ||j0                  d|j2                  |j4                  ¬	«      | _        y y )
Nr   r%   r   g      à¿r   F©ÚbiasT)ÚtraditionalÚscaling_configr   )ÚsuperÚ__init__r   r   Ún_headsr   Ú
n_kv_headsr.   Úuse_roper&   r'   r(   r   ÚscaleÚhasattrr   ÚnnÚLinearÚq_projÚk_projÚv_projÚo_projr#   r   r"   r!   r   Úrope)	r;   r@   rA   ÚdimrI   rJ   r   r   Ú	__class__s	           €r3   rH   zAttention.__init__4   sv  ø€ Ü‰ÑÔà×ÑˆØ!%×!9Ñ!9Ð9ˆŒ�wØ'+×'?Ñ'?Ð?ˆŒ˜*ä˜Y¨™]¨aÑ/°1Ñ4Ó5ˆŒØ'+×'CÑ'CˆÔ$Ø×+Ñ+ˆÔØŸ/™/ˆŒà#'§=¡=Ò#O°D×4DÑ4DÈÑ4OÐOˆŒ˜à˜t‘^ˆŒ
Ü�4Ð)Ô*Ø!×0Ñ0‰Nà"ˆNä—i‘i  W¨xÑ%7¸nÔMˆŒÜ—i‘i  Z°(Ñ%:ÀÔPˆŒÜ—i‘i  Z°(Ñ%:ÀÔPˆŒÜ—i‘i ¨(Ñ 2°C¸nÔMˆŒà×+Ñ+Ò=°·±ˆÔà�=Š=Ü'ØØ—‘Ø Ø#×0Ñ0Ø(,×(DÑ(DôˆD�Ið r2   ÚxÚmaskÚcacheÚreturnc           	      óæ  — |j                   \  }}}| j                  |«      | j                  |«      | j                  |«      }	}}|j	                  ||| j
                  d«      j                  dddd«      }|j	                  ||| j                  d«      j                  dddd«      }|	j	                  ||| j                  d«      j                  dddd«      }	|�|j                  }
nd}
| j                  r&| j                  ||
¬«      }| j                  ||
¬«      }| j                  rDt        j                  j                  |d d¬«      }t        j                  j                  |d d¬«      }| j                  r˜| j                  sŒt        j                   t        j"                  t        j$                  |
dz   |
|z   dz   «      | j&                  z  «      d	z   «      | j(                  z  d	z   }|d d …d f   }||z  j+                  |j,                  «      }|�|j/                  ||	«      \  }}	t1        |||	|| j2                  |¬
«      }|j                  dddd«      j	                  ||d«      }| j5                  |«      S )Néÿÿÿÿr   é   r   é   )Úoffsetg�íµ ÷Æ°>)ÚweightÚepsg      ð?)rY   rL   rX   )ÚshaperP   rQ   rR   ÚreshaperI   Ú	transposerJ   r_   rK   rT   r#   ÚmxÚfastÚrms_normr&   ÚlogÚfloorÚaranger'   r(   ÚastypeÚdtypeÚupdate_and_fetchr   rL   rS   )r;   rW   rX   rY   ÚBÚLÚDÚqueriesÚkeysÚvaluesr_   Úattn_scalesÚoutputs                r3   Ú__call__zAttention.__call__X   s5  € ð —'‘'‰ˆˆ1ˆaà $§¡¨A£°·±¸A³ÀÇÁÈAÃ�v�ˆà—/‘/ ! Q¨¯©°bÓ9×CÑCÀAÀqÈ!ÈQÓOˆØ�|‰|˜A˜q $§/¡/°2Ó6×@Ñ@ÀÀAÀqÈ!ÓLˆØ—‘  1 d§o¡o°rÓ:×DÑDÀQÈÈ1ÈaÓPˆàÐØ—\‘\‰FàˆFà�=Š=Ø—i‘i °�iÓ7ˆGØ—9‘9˜T¨&�9Ó1ˆDà×ÒÜ—g‘g×&Ñ& w°tÀÐ&ÓFˆGÜ—7‘7×#Ñ# D°¸4Ð#Ó@ˆDà×'Ò'°·²ä—‘Ü—H‘HœRŸY™Y v°¡z°6¸A±:À±>ÓBÀT×EUÑEUÑUÓVØñóð —/‘/ñ	"ð
 ñð ð &¢a¨ gÑ.ˆKØ Ñ,×4Ñ4°W·]±]ÓCˆGàÐØ ×1Ñ1°$¸Ó?‰LˆD�&ä-Ø�T˜6¨°d·j±jÀtô
ˆð ×!Ñ! ! Q¨¨1Ó-×5Ñ5°a¸¸BÓ?ˆØ�{‰{˜6Ó"Ð"r2   ©NN©r)   r*   r+   r   r.   rH   re   Úarrayr   r   rv   Ú__classcell__©rV   s   @r3   r?   r?   3   s_   ø„ ð"˜Xð "°#õ "ðN $(Ø#ñ	.#à�8‰8ð.#ð �r—x‘xÑ ð.#ð ˜‰}ð	.#ð
 
�‰÷.#r2   r?   c                   óJ   ‡ — e Zd Zddedefˆ fd„Zdej                  fd„Zˆ xZ	S )ÚMLPr@   r   c                 ó  •— t         ‰| �  «        |j                  }|xs |j                  }t	        j
                  ||d¬«      | _        t	        j
                  ||d¬«      | _        t	        j
                  ||d¬«      | _        y ©NFrC   )	rG   rH   r   r   rN   rO   Ú	gate_projÚ	down_projÚup_proj)r;   r@   r   rU   Ú
hidden_dimrV   s        €r3   rH   zMLP.__init__Š   se   ø€ Ü‰ÑÔà×ÑˆØ&Ò@¨$×*@Ñ*@ˆ
äŸ™ 3¨
¸Ô?ˆŒÜŸ™ :¨s¸Ô?ˆŒÜ—y‘y  j°uÔ=ˆ�r2   rZ   c                 ót   — | j                  t        | j                  |«      | j                  |«      «      «      S r8   )r�   r   r€   r‚   )r;   rW   s     r3   rv   zMLP.__call__”   s)   € Ø�~‰~œf T§^¡^°AÓ%6¸¿¹ÀQ»ÓHÓIÐIr2   r8   )
r)   r*   r+   r5   r.   rH   re   ry   rv   rz   r{   s   @r3   r}   r}   ‰   s(   ø„ ñ>˜Yð >¸3õ >ðJ˜RŸX™X÷ Jr2   r}   c                   ó>   ‡ — e Zd Zˆ fd„Zdej
                  fd„Zˆ xZS )ÚMoEc                 ót  •— t         ‰| �  «        |j                  | _        | j                  dk(  sJ d«       ‚|j                  | _        t        |j                  |j                  | j
                  «      | _	        t        j                  |j                  |j                  d¬«      | _        t        |«      | _        y )Nr   z!Only 1 expert per token supportedFrC   )rG   rH   r   Útop_kr   Únum_expertsr   r   r   ÚexpertsrN   rO   Úrouterr}   Úshared_expert©r;   r@   rV   s     €r3   rH   zMoE.__init__™   s’   ø€ Ü‰ÑÔØ×-Ñ-ˆŒ
Ø�z‰z˜QŠÐCÐ CÓCˆØ×1Ñ1ˆÔÜ Ø×Ñ˜d×4Ñ4°d×6FÑ6Fó
ˆŒô —i‘i × 0Ñ 0°$×2HÑ2HÈuÔUˆŒÜ  ›YˆÕr2   rZ   c                 ó¸  — | j                  |«      }| j                  }t        j                  | |dz
  d¬«      dd |…f   }t        j                  ||d¬«      }t        j
                  |j                  t        j                  «      «      j                  |j                  «      }| j                  ||z  |«      j                  d«      }|| j                  |«      z   S )Nr   r\   )ÚkthÚaxis.©r�   r]   )r‹   rˆ   re   ÚargpartitionÚtake_along_axisÚsigmoidrk   Úfloat32rl   rŠ   ÚsqueezerŒ   )r;   rW   ÚlogitsÚkÚindicesÚscoresÚouts          r3   rv   zMoE.__call__¤   s°   € Ø—‘˜Q“ˆØ�J‰JˆÜ—/‘/ 6 '¨q°1©u¸2Ô>¸sÀBÀQÀB¸wÑGˆÜ×#Ñ# F¨G¸"Ô=ˆÜ—‘˜FŸM™M¬"¯*©*Ó5Ó6×=Ñ=¸a¿g¹gÓFˆà�l‰l˜1˜v™: wÓ/×7Ñ7¸Ó:ˆØ�T×'Ñ'¨Ó*Ñ*Ð*r2   )r)   r*   r+   rH   re   ry   rv   rz   r{   s   @r3   r†   r†   ˜   s   ø„ ô	'ð+˜RŸX™X÷ +r2   r†   c            	       óŽ   ‡ — e Zd Zdedefˆ fd„Z	 	 d	dej                  deej                     dee	   dej                  fd„Z
ˆ xZS )
ÚTransformerBlockr@   rA   c                 ó  •— t         ‰| �  «        |j                  | _        |j                  | _        t	        ||«      | _        ||j                  z  |j                  dz
  k(  | _        | j                  rt        |«      | _	        nt        ||j                  «      | _	        t        j                  |j                  |j                  ¬«      | _        t        j                  |j                  |j                  ¬«      | _        || _        y )Nr   ©ra   )rG   rH   r   r   r?   Ú	self_attnr   Úis_moe_layerr†   Úfeed_forwardr}   r   rN   ÚRMSNormr    Úinput_layernormÚpost_attention_layernormr@   )r;   r@   rA   rV   s      €r3   rH   zTransformerBlock.__init__°   sÔ   ø€ Ü‰ÑÔØ#'×#;Ñ#;ˆÔ Ø×+Ñ+ˆÔÜ" 4¨Ó3ˆŒØ&¨×)GÑ)GÑGØ×*Ñ*¨QÑ.ñ
ˆÔð ×ÒÜ # D£	ˆDÕä # D¨$×*DÑ*DÓ EˆDÔä!Ÿz™z¨$×*:Ñ*:À×@QÑ@QÔRˆÔÜ(*¯
©
Ø×Ñ $×"3Ñ"3ô)
ˆÔ%ð ˆ�	r2   rW   rX   rY   rZ   c                 óž   — | j                  | j                  |«      ||«      }||z   }| j                  | j                  |«      «      }||z   }|S r8   )r    r¤   r¢   r¥   )r;   rW   rX   rY   ÚrÚhr›   s          r3   rv   zTransformerBlock.__call__Ã   sS   € ð �N‰N˜4×/Ñ/°Ó2°D¸%Ó@ˆØ�‰EˆØ×Ñ˜d×;Ñ;¸AÓ>Ó?ˆØ�!‰eˆØˆ
r2   rw   rx   r{   s   @r3   r�   r�   ¯   s^   ø„ ð˜Xð °#õ ð, $(Ø#ñ	
à�8‰8ð
ð �r—x‘xÑ ð
ð ˜‰}ð	
ð
 
�‰÷
r2   r�   c                   óH   ‡ — e Zd Zdefˆ fd„Z	 ddej                  fd„Zˆ xZS )Ú
LlamaModelr@   c                 óä  •— t         ‰| �  «        || _        |j                  | _        |j                  | _        | j                  dkD  sJ ‚t        j                  |j                  |j                  «      | _        t        |j                  «      D �cg c]  }t        ||«      ‘Œ c}| _        t        j                  |j                  |j                  ¬«      | _        |j                  | _        y c c}w )Nr   rŸ   )rG   rH   r@   r$   r   rN   Ú	Embeddingr   Úembed_tokensÚranger�   Úlayersr£   r    Únormr   )r;   r@   ÚirV   s      €r3   rH   zLlamaModel.__init__Ñ   sº   ø€ Ü‰ÑÔØˆŒ	ØŸ/™/ˆŒØ!%×!7Ñ!7ˆÔØ�‰ Ò"Ð"Ð"ÜŸL™L¨¯©¸$×:JÑ:JÓKˆÔÜ:?À×@VÑ@VÔ:WÓXÑ:W°QÔ'¨¨aÕ0Ð:WÑXˆŒÜ—J‘J˜t×/Ñ/°T×5FÑ5FÔGˆŒ	Ø$(×$=Ñ$=ˆÕ!ùò Ys   ÂC-Úinputsc                 óÖ  — | j                  |«      }|�Nt        |«      D ]!  \  }}|dz   dz  dk7  sŒ|j                  «        Œ# |d   j                  }|d   j                  }nd}d}||j
                  d   z   }t        j                  ||«      }	t        j                  ||«      d d …d f   }
t        j                  |	| j                  z  |
| j                  z  z
  «      }|	|
k  }|dk(  |z  }|€d gt        | j                  «      z  }t        ||d   «      }t        t        | j                  |«      «      D ]$  \  }\  }}|dz   dz  dk7  }|r|n|} ||||¬«      }Œ& | j                  |«      S )Nr   r%   r   r^   )rY   )r­   Ú	enumerateÚmaybe_trim_frontÚstart_positionr_   rb   re   rj   Úabsr   Úlenr¯   r
   Úzipr°   )r;   r²   rY   r¨   ÚidxÚcÚstartr_   ÚendÚlindsÚrindsÚ	block_posÚ	token_posÚ
chunk_maskÚglobal_maskÚlayerÚuse_chunked_attentionrX   s                     r3   rv   zLlamaModel.__call__Ü   sx  € ð
 ×Ñ˜fÓ%ˆàÐÜ# EÖ*‘��QØ˜!‘G˜q‘= AÓ%Ø×&Ñ&Õ(ð +ð ˜!‘H×+Ñ+ˆEØ˜1‘X—_‘_‰FàˆEØˆFØ�q—w‘w˜q‘zÑ!ˆÜ—	‘	˜% Ó%ˆÜ—	‘	˜& #Ó&¢q¨$ wÑ/ˆÜ—F‘FØ�d×/Ñ/Ñ/°E¸T×=VÑ=VÑ4VÑWó
ˆ	ð ˜U‘Nˆ	Ø 1‘n¨	Ñ1ˆ
àˆ=Ø�FœS §¡Ó-Ñ-ˆEä+¨A¨u°Q©xÓ8ˆä(¬¨T¯[©[¸%Ó)@ÖA‰OˆC‘�%˜Ø%(¨1¡W°¡M°QÑ$6Ð!Ù!6‘:¸KˆDÙ�a˜ QÔ'‰Að  Bð
 �y‰y˜‹|Ðr2   r8   ©	r)   r*   r+   r   rH   re   ry   rv   rz   r{   s   @r3   rª   rª   Ð   s%   ø„ ð	>˜Xõ 	>ð ñ#à—‘÷#r2   rª   c                   óH   ‡ — e Zd Zdefˆ fd„Z	 ddej                  fd„Zˆ xZS )ÚLanguageModelr@   c                 ó  •— t         ‰| �  «        || _        |j                  | _        t	        | j                  «      | _        t        j                  | j                  j                  | j                  j                  d¬«      | _
        y r   )rG   rH   r@   r   rª   ÚmodelrN   rO   r   r$   Úlm_headr�   s     €r3   rH   zLanguageModel.__init__  s[   ø€ Ü‰ÑÔØˆŒ	ØŸ/™/ˆŒÜ §	¡	Ó*ˆŒ
Ü—y‘yØ�I‰I×!Ñ! 4§9¡9×#7Ñ#7¸eô
ˆ�r2   r²   c                 óH   — | j                  ||«      }| j                  |«      S r8   )rÊ   rË   )r;   r²   rY   r›   s       r3   rv   zLanguageModel.__call__  s#   € ð
 �j‰j˜ Ó'ˆØ�|‰|˜CÓ Ð r2   r8   rÆ   r{   s   @r3   rÈ   rÈ     s%   ø„ ð
˜Xõ 
ð ñ!à—‘÷!r2   rÈ   c                   ód   ‡ — e Zd Zdefˆ fd„Z	 ddej                  fd„Zd„ Ze	d„ «       Z
d„ Zˆ xZS )	ÚModelr@   c                 ó†   •— t         ‰| �  «        || _        |j                  | _        t	        |j
                  «      | _        y r8   )rG   rH   r@   r   rÈ   r6   Úlanguage_modelr�   s     €r3   rH   zModel.__init__  s3   ø€ Ü‰ÑÔØˆŒ	ØŸ/™/ˆŒÜ+¨D×,<Ñ,<Ó=ˆÕr2   r²   c                 ó&   — | j                  ||«      S r8   )rÐ   )r;   r²   rY   s      r3   rv   zModel.__call__  s   € ð
 ×"Ñ" 6¨5Ó1Ð1r2   c                 ó2  — d„ }|j                  «       D ��ci c]  \  }} ||«      rŒ||“Œ }}}t        | j                  j                  j                  «      D ]µ  }d|› d�}|› d�|v rm|j                  |› d�«      }|› d�}|› d�}t        j                  |dd¬	«      \  }	}
t        j                  |	d
d«      ||<   t        j                  |
d
d«      ||<   |› d�|v sŒ…|j                  |› d�«      }t        j                  |d
d«      ||› d�<   Œ· |S c c}}w )Nc                 ó   — d| v xs d| v S )NÚvision_modelÚmulti_modal_projectorr1   )r˜   s    r3   Ú	to_removez!Model.sanitize.<locals>.to_remove$  s   € Ø! QÐ&ÒFÐ*AÀQÐ*FÐFr2   zlanguage_model.model.layers.z.feed_forward.expertsz.gate_up_projz.gate_proj.weightz.up_proj.weightr]   r\   r‘   r   z
.down_projz.down_proj.weight)	Úitemsr®   r@   r6   r   Úpopre   ÚsplitÚswapaxes)r;   ÚweightsrÖ   r˜   ÚvÚlÚprefixÚgate_kÚup_kr€   r‚   r�   s               r3   ÚsanitizezModel.sanitize#  s4  € ò	Gð %,§M¡M¤OÔH¡O™D˜A˜q¹9ÀQ½<�1�a‘4 OˆÑHô �t—y‘y×,Ñ,×>Ñ>Ö?ˆAØ3°A°3Ð6KÐLˆFØ�˜Ð'¨7Ñ2Ø—K‘K 6 (¨-Ð 8Ó9�Ø"˜8Ð#4Ð5�Ø ˜ Ð1�Ü%'§X¡X¨a°¸Ô%<Ñ"�	˜7Ü"$§+¡+¨i¸¸AÓ">�˜‘Ü "§¡¨G°Q¸Ó :�˜‘Ø�˜Ð$¨Ò/Ø#ŸK™K¨6¨(°*Ð(=Ó>�	Ü8:¿¹ÀIÈqÐRSÓ8T�˜6˜(Ð"3Ð4Ò5ð @ð ˆùó Is
   —D¨Dc                 óB   — | j                   j                  j                  S r8   )rÐ   rÊ   r¯   r:   s    r3   r¯   zModel.layers9  s   € à×"Ñ"×(Ñ(×/Ñ/Ð/r2   c                 ó  — | j                   j                  j                  }g }t        t	        | j
                  «      «      D ]A  }|dz   dz  dk7  r|j                  t        |«      «       Œ)|j                  t        «       «       ŒC |S )Nr   r%   r   )	r@   r6   r   r®   r¸   r¯   Úappendr   r   )r;   Ú
chunk_sizeÚcachesr±   s       r3   Ú
make_cachezModel.make_cache=  sj   € Ø—Y‘Y×*Ñ*×?Ñ?ˆ
ØˆÜ”s˜4Ÿ;™;Ó'Ö(ˆAØ�A‘˜‰{˜aÒØ—‘œn¨ZÓ8Õ9à—‘œg›iÕ(ð	 )ð
 ˆr2   r8   )r)   r*   r+   r5   rH   re   ry   rv   rá   Úpropertyr¯   rç   rz   r{   s   @r3   rÎ   rÎ     sC   ø„ ð>˜Yõ >ð ñ2à—‘ó2òð, ñ0ó ð0ör2   rÎ   )"Údataclassesr   Útypingr   r   r   Úmlx.coreÚcorere   Úmlx.nnrN   Úactivationsr   Úbaser	   r
   r   rY   r   r   Ú
rope_utilsr   Úswitch_layersr   r   r5   ÚModuler?   r}   r†   r�   rª   rÈ   rÎ   r1   r2   r3   Ú<module>ró      sØ   ðõ "ß 'Ñ 'å Ý å ß TÑ Tß *Ý 'Ý $ð ôˆ}ó ó ðð2 ô@�ó @ó ð@ôS#�—	‘	ô S#ôlJˆ"�)‰)ô Jô+ˆ"�)‰)ô +ô.�r—y‘yô ôB/�—‘ô /ôd!�B—I‘Iô !ô&0ˆB�I‰Iõ 0r2   