
    (HJj-                         d dl 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 d dlmZmZ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ddZ ee
j<                  d      d dedefd       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)!    N)	dataclass)partial)AnyOptional)shard_inplaceshard_linearsum_gradients   )BaseModelArgscreate_attention_maskscaled_dot_product_attention)KVCacheRotatingKVCache)initialize_rope)	SwitchGLUc                       e Zd ZU dZ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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d<   dZeed<   dZeed<   dZeed<   dZeed<   y)	ModelArgsgpt_oss
model_type$   num_hidden_layers   num_local_experts   num_experts_per_toki 
vocab_sizegh㈵>rms_norm_epsi@  hidden_sizeintermediate_size@   head_dimnum_attention_heads   num_key_value_headssliding_windowiI 
rope_thetaNrope_scalinglayer_types)__name__
__module____qualname__r   str__annotations__r   intr   r   r   r   floatr   r   r!   r"   r$   r%   r&   r'   r   r(   list     _/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx_lm/models/gpt_oss.pyr   r      s    Js s   JL%K!s!Hc!!  NCJL#Kr2   r   c                     t        j                  | | |      }|d| df   }t        j                  | ||      }||fS )zMLX equivalent of torch.topk)kthaxis.Nr6   )mxargpartitiontake_along_axis)akr6   partitioned_indicestop_k_indicestop_k_valuess         r3   mlx_topkr@   &   sH    //!!$?'aRS1M%%aTBL&&r2   T)	shapelessalphalimitc                     t        j                  |d |      }t        j                  | | |      } ||z  }t        j                  |      }||z  }|| dz   z  S )N)a_mina_maxr
   )r8   clipsigmoid)x_linearx_glurB   rC   
glu_scaledsigout_glus          r3   swiglurN   0   sY     GGEU3EwwxvU;HJ
**Z
 CckGhl##r2   c                   $     e Zd Z fdZd Z xZS )SwiGLUc                 "    t         |           y N)super__init__)self	__class__s    r3   rT   zSwiGLU.__init__?   s    r2   c                     t        ||      S rR   )rN   )rU   xgates      r3   __call__zSwiGLU.__call__B   s    ar2   )r)   r*   r+   rT   rZ   __classcell__rV   s   @r3   rP   rP   >   s    r2   rP   c                   v     e Zd Zdef fdZddej                  dej                  dej                  fdZ xZS )AttentionBlockconfigc                    t         |           |j                  | _        |j                  | _        |j                  | _        |j                  |j                  z  | _        t        j                  |j                  f      | _        t        j                  |j                  |j                  | j                  z  d      | _        t        j                  |j                  |j                  | j                  z  d      | _        t        j                  |j                  |j                  | j                  z  d      | _        t        j                  | j                  |j                  z  |j                  d      | _        dt!        j"                  |j                        z  | _        t'        | j                  |j(                  d|j*                        | _        y )NTbiasr
   F)traditionalscaling_config)rS   rT   r!   r"   r$   num_key_value_groupsr8   zerossinksnnLinearr   q_projk_projv_projo_projmathsqrtsm_scaler   r&   r'   roperU   r_   rV   s     r3   rT   zAttentionBlock.__init__G   si   #)#=#= #)#=#= &&&*D*DD 	! XXv99;<
ii : :T]] JQU
 ii : :T]] JQU
 ii : :T]] JQU
 iiMMF6668J8JQU
 DIIfoo66#MM!..	
	r2   rX   maskreturnc           	         |j                   \  }}}| j                  }| j                  }| j                  |      j	                  ||d|      j                  dd      }	| j                  |      j	                  ||d|      j                  dd      }
| j                  |      j	                  ||d|      j                  dd      }|P| j                  |	|j                        }	| j                  |
|j                        }
|j                  |
|      \  }
}n"| j                  |	      }	| j                  |
      }
t        |	|
||| j                  || j                        }| j                  |j                  dd      j	                  ||d            S )Nr
      )offset)rs   rg   )shaper!   r$   rj   reshapeswapaxesrk   rl   rq   rx   update_and_fetchr   rp   rg   rm   )rU   rX   rs   cacheBL_DHkqr<   vv_hats                r3   rZ   zAttentionBlock.__call__j   sT   ''1aMM%%KKN""1aQ/88A>KKN""1aQ/88A>KKN""1aQ/88A>		!ELL	1A		!ELL	1A))!Q/DAq		!A		!A,q!UDMMDJJ
 {{5>>!Q/771bABBr2   rR   	r)   r*   r+   r   rT   r8   arrayrZ   r[   r\   s   @r3   r^   r^   F   s:    !
y !
FC"(( C"(( C288 Cr2   r^   c                   \     e Zd Zdef fdZdej                  dej                  fdZ xZS )MLPBlockr_   c                 n   t         |           |j                  | _        |j                  | _        |j                  | _        t        |j                  |j                  |j                  t               d      | _        t        j                  |j                  |j                  d      | _        d | _        y )NT)
input_dimshidden_dimsnum_experts
activationrb   ra   )rS   rT   r   r   r   r   r   rP   expertsrh   ri   routersharding_grouprr   s     r3   rT   zMLPBlock.__init__   s    !--!'!9!9#)#=#=  ))0000x
 ii 2 2F4L4LSWX"r2   rX   rt   c                    | j                    t        | j                         |      }| j                  |      }t        || j                  d      \  }}t        j                  |dd      }| j                  ||      }|t        j                  |d      z  }|j                  d      }| j                   +t
        j                  j                  || j                         }|S )Nrv   )r<   r6   T)r6   preciser7   group)r   r	   r   r@   r   r8   softmaxr   expand_dimssumdistributedall_sum)rU   rX   gr   indicesexpert_weightsys          r3   rZ   zMLPBlock.__call__   s    *2d11215AKKN#A)A)AKG"dC LLG$~B77EErEN*&&q0C0C&DAr2   r   r\   s   @r3   r   r      s*    #y #""(( rxx r2   r   c                   v     e Zd Zdef fdZddej                  dej                  dej                  fdZ xZS )TransformerBlockr_   c                    t         |           t        |      | _        t	        |      | _        t        j                  |j                  |j                        | _
        t        j                  |j                  |j                        | _        y rR   )rS   rT   r^   	self_attnr   mlprh   RMSNormr   r   input_layernormpost_attention_layernormrr   s     r3   rT   zTransformerBlock.__init__   sg    '/F#!zz&*<*<f>Q>QR(*

 3 3)
%r2   rX   rs   rt   c                     |}| j                  |      }| j                  |||      }||z   }|}| j                  |      }| j                  |      }||z   }|S rR   )r   r   r   r   )rU   rX   rs   r}   residuals        r3   rZ   zTransformerBlock.__call__   sb      #NN1dE*qL))!,HHQKqLr2   rR   r   r\   s   @r3   r   r      s5    
y 

"(( 
"(( 
288 
r2   r   c                   h     e Zd Zdef fdZ	 	 ddej                  deej                     fdZ xZ	S )GptOssMoeModelargsc                 :   t         |           t        j                  |j                  |j
                        | _        t        j                  |j
                  |j                        | _	        |j                  xs ddg|j                  dz  z  | _
        t        |j                        D cg c]  }t        |       c}| _        |j                  | _        | j                  j#                  d      | _        | j                  j#                  d      | _        y c c}w )Nsliding_attentionfull_attentionrw   )rS   rT   rh   	Embeddingr   r   embed_tokensr   r   normr(   r   ranger   layersr%   window_sizeindexswa_idxga_idx)rU   r   r   rV   s      r3   rT   zGptOssMoeModel.__init__   s    LL$:J:JKJJt//1B1BC	++ *0
 ##q(0* 8=T=S=S7TU7T!'-7TU..''--.AB&&,,-=> Vs   ,Dinputsinput_embeddingsc                    ||}n| j                  |      }|d gt        | j                        z  }t        ||| j                           }t        ||| j
                     | j                        }t        | j                  || j                        D ]  \  }}}	|	dk(  r|n|}
 |||
|      } | j                  |      }|S )N)r   r   )
r   lenr   r   r   r   r   zipr(   r   )rU   r   r}   r   rX   	full_maskswa_masklayerc
layer_typers   s              r3   rZ   zGptOssMoeModel.__call__   s     ' A!!&)A=FS--E)!U4;;-?@	(uT\\"0@0@
 %(UD<L<L$M E1j *.> >9HDaq!A %N IIaLr2   )NN)
r)   r*   r+   r   rT   r8   r   r   rZ   r[   r\   s   @r3   r   r      s;    ?Y ?  /3	 #288,	r2   r   c                        e Zd Zdef fdZddej                  fdZd Zdde	ej                  j                     fdZed        Zed	        Zd
 Z xZS )Modelr   c                     t         |           || _        |j                  | _        t	        |      | _        t        j                  |j                  |j                  d      | _
        y )NFra   )rS   rT   r   r   r   modelrh   ri   r   r   lm_head)rU   r   rV   s     r3   rT   zModel.__init__   sJ    	//#D)
yy!1!14??Or2   r   c                 D    | j                  | j                  ||            S rR   )r   r   )rU   r   r}   s      r3   rZ   zModel.__call__   s    ||DJJvu566r2   c                    t        d |j                         D              r|S i }|j                         D ]  \  }}d|v rd|vrd|v r@|j                  t        j
                        j                  d      }|j                  dd      }d|v r|j                  dd      }t	        j                  |d	d d d
d d f         ||j                  dd      <   t	        j                  |d	dd d
d d f         ||j                  dd      <   d|v red|vrad|v r@|j                  t        j
                        j                  d      }|j                  dd      }d|v r|j                  dd      }|||<   9d|v rbt	        j                  |d	d d d
f         ||j                  dd      <   t	        j                  |d	dd d
f         ||j                  dd      <   d|v r|||j                  dd      <   |||<    |S )Nc              3   $   K   | ]  }d |v  
 yw)zgate_proj.weightNr1   ).0r<   s     r3   	<genexpr>z!Model.sanitize.<locals>.<genexpr>   s     ?1!Q&s   gate_up_projrb   _blocksr   z.weight_scalesz.scales.rw   	gate_projr
   up_proj	down_projgate_up_proj_biaszgate_proj.biaszup_proj.biasdown_proj_biaszdown_proj.bias)	anykeysitemsviewr8   uint32flattenreplace
contiguous)rU   weightsnew_weightsr<   r   s        r3   sanitizezModel.sanitize   s   ???NMMODAq"vQ>ryy)11"5A		)Y7A>		)Y7AFHmmc3Q3kNGAIInkBC EGMMc14a4lOEAIIni@A !fAo>ryy)11"5A		)Y7A>		)Y7A!"A$)MM!C1H+. AII&9;KLM MM!CAI,/ AII&9>JK "Q&MNAII&68HIJ!"A= $@ r2   r   c                    |xs t         j                  j                         }|j                         }|j	                         }| j
                  j                  D ]b  }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_        |j                  j                  |j                  j                  z  |j                  _        |j                  j                   |j                  j                  |z  |j                  j                  |dz   z   |j                  _        t#        |j$                  j&                  j(                  d|       t#        |j$                  j&                  j*                  d|       |j$                  j&                  j*                  xj,                  |z  c_        t#        |j$                  j&                  j.                  d|       ||j$                  _        e y )Nzall-to-sharded)shardingr   zsharded-to-allr
   r   )r8   r   initsizerankr   r   r   r   rj   rk   rl   rm   r"   r$   re   rg   r   r   r   r   r   rb   r   r   )rU   r   NRr   s        r3   shardzModel.shard  s   .,,.JJLJJLZZ&&E%1&&1A&EOO" &2&&1A&EOO" &2&&1A&EOO" &2&&1A&EOO" OO//A5/OO//A5/33??667 OO0
 %*OO$9$933oo99q5%EOO! %))++557GuU%))++557GuUII'',,1,		!!))4DE (-EII$E 'r2   c                 .    | j                   j                  S rR   )r   r   )rU   s    r3   r   zModel.layersC  s    zz   r2   c                     d }|S )Nc                 0    | j                  d      rdddS y)Nr   r    r#   )
group_sizebitsT)endswith)pathr   s     r3   	predicatez(Model.quant_predicate.<locals>.predicateI  s    }}X&&(!44r2   r1   )rU   r   s     r3   quant_predicatezModel.quant_predicateG  s    	
 r2   c                     g }| j                   j                  D ]P  }|dk(  r|j                  t                      "|j                  t	        | j
                  j                               R |S )Nr   )max_size)r   r(   appendr   r   r   r%   )rU   cacheslts      r3   
make_cachezModel.make_cacheP  sT    **((B%%gi(otyy7O7OPQ	 )
 r2   rR   )r)   r*   r+   r   rT   r8   r   rZ   r   r   r   Groupr   propertyr   r   r   r[   r\   s   @r3   r   r      sp    PY P7rxx 7%N'-8BNN$8$89 '-R ! !  r2   r   )rv   )gZd;?g      @)(rn   dataclassesr   	functoolsr   typingr   r   mlx.corecorer8   mlx.nnrh   mlx.nn.layers.distributedr   r   r	   baser   r   r   r}   r   r   
rope_utilsr   switch_layersr   r   r@   compiler/   rN   ModulerP   r^   r   r   r   r   r1   r2   r3   <module>r     s     !      P P T T + ' $   &' 	t$
$5 
$ 
$ %
$RYY 9CRYY 9Cx$ryy $Nryy .%RYY %PoBII or2   