
    (HJjE                        d dl Z d dl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 d dlmZ 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 d dlmZmZ e G d d             Z e G d d             Z!d Z" e!ddddg e ddg ddg       e ddg       e dddd g!      g"      Z# e!ddddg e ddg ddg       e ddg       e dd#dd g!      g"      Z$ e"e$d$%      Z% e!ddg d& e dddd'gdg       e d(d)g       e ddgd* +       e d,d-gd. +       e d/d0gd1 d2g3       e dddd gd4 5       e ddg d6d7 5      g"      Z&e#e#e#e#e$ e"e$d$%      e&d8Z'd9 Z(d: Z)	 	 d[d;ejT                  d<ejV                  d2ejV                  dz  d=e,fd>Z-d<ejV                  d?ej\                  j^                  fd@Z0dAe1ejT                     dBe	dCejT                  dz  dDe2dEe,f
dFZ3dG Z4dCejT                  dHe1e    dBe	dDe2dEe,f
dIZ5	 	 	 d\dJejT                  dBe	dKe,dEe,dLe6d=e,dMe,fdNZ7	 d]dCejT                  dOe1e8   dBe	dKe,dEe,f
dPZ9	 	 	 	 	 d^dQejV                  dRe!dKe,dSe,dTe,dUe,dEe,fdVZ:dWejT                  dXe
e8ef   fdYZ;dZ Z<y)_    N)	dataclassfield)Path)AnyCallableDict)request)tree_flattentree_maptree_map_with_path)tqdm)create_attention_mask)SwitchLinear)	load_data)loadsavec                       e Zd ZU ej                  ed<   eej                     ed<   dZej                  dz  ed<    ee      Z	eed<   dZ
eej                  gef   dz  ed<   y)ScaleConfigprevlayersNblock)default_factorykwargs
use_config)__name__
__module____qualname__nnModule__annotations__listr   r   r   r   r   bool     Z/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/mlx_lm/quant/awq.pyr   r      sZ    
))OO"E299t".FD.59J"))d*+d29r$   r   c                   V    e Zd ZU eed<   eed<   ee   ed<   ee   ed<   dZedz  ed<   y)	AWQConfigembedlm_headno_clipscale_configsNlm_key)r   r   r   strr    r!   r   r,   r#   r$   r%   r'   r'   !   s/    JL#Y$$FC$Jr$   r'   c                 z    t        j                  |       } |j                         D ]  \  }}t        | ||        | S N)copydeepcopyitemssetattr)cfgr   kvs       r%   updater7   *   s5    
--
C1Q Jr$   embed_tokensr)   q_projk_proj	self_attninput_layernorm)r9   r:   v_projmask)r   r   r   r   zmlp.up_projzmlp.down_proj)r   r   mlppost_attention_layernorm	gate_projup_proj)r   r   r   )r(   r)   r*   r+   pre_feedforward_layernormlanguage_model)r,   )r9   q_a_projq_b_projkv_a_proj_with_mqa	kv_b_projrG   zself_attn.kv_a_layernormzself_attn.kv_b_projc                     d| j                   vS N
switch_mlpr?   r   s    r%   <lambda>rN   m       )Br$   )r   r   r   zmlp.shared_experts.up_projzmlp.shared_experts.down_projc                     d| j                   v S rJ   rL   rM   s    r%   rN   rN   r       \UYY%>r$   zmlp.switch_mlp.up_projzmlp.switch_mlp.down_projc                     d| j                   v S rJ   rL   rM   s    r%   rN   rN   w   rQ   r$   indices)r   r   r   r   c                     d| j                   vS rJ   rL   rM   s    r%   rN   rN   ~   rO   r$   )r   r   r   r   )zswitch_mlp.gate_projzswitch_mlp.up_projzshared_experts.gate_projzshared_experts.up_projgatec                     d| j                   v S rJ   rL   rM   s    r%   rN   rN      rQ   r$   )llamamistralqwen2qwen3gemma3_textgemma3deepseek_v2c                 L    | |z
  j                  t        j                        dz  S )N   )astypemxfloat32)xys     r%   msere      s    UNN2::&1,,r$   c                 @    |j                  d      }|D ]  }| |   } 	 | S )N.)split)modulekeykeysr5   s       r%   submodule_from_keyrl      s'    99S>D Mr$   layerrc   
batch_sizec           
      ,   g }t        d|j                  d   |      D ]]  }|&|j                   | ||||z    ||||z    fi |       n|j                   | ||||z    fi |       t        j                  |       _ t        j
                  |d      }|S )Nr   axis)rangeshapeappendra   evalconcatenate)rm   rc   rS   rn   r   rd   is          r%   	run_layerrx      s     	A1aggaj*-HHaA
N+WQZ-HSFS HHU1QZ0;F;<

 . 	qq!AHr$   groupc                     |j                         }|dk(  r| S | j                  d   }||z  dk(  sJ |j                         }||z   dz
  |z  }| ||z  |dz   |z   S )N   r   )sizers   rank)rc   ry   NBrlocal_Bs         r%   
dist_splitr      sm    

AAv	
Aq5A::

A1uqyQGQ[AEW,--r$   r   quantize_funcr   layer_kwargsn_gridc                 :   t         j                  j                         }|xs i }| d   j                  }|xs | d   } ||fi |}|j	                         j                  d      }t        d      }	d }
t        |j                               }t        |      D ]Z  }||z  }t        j                  ||z  d      j                  d      }||j                         |j                         z  j                         z  }| D ]@  }t        |t         j"                  t$        f      s$ ||j&                  |z        |z  |_        B t)        ||fi |}t+        ||      j-                         }|0t         j                  j/                  |      |j1                         z  }||j0                  z  }t        j2                  |       |j5                         |	k  r|j5                         }	|}
|j7                  |       ] |
j                  d      }
t        j2                  |
       |
S )Nr   )r   r{   rp   infg-C6?)ra   distributedinit
input_featabsmeanfloatr
   
parametersrr   maximumreshapemaxminsqrt
isinstancer   Linearr   weightrx   re   sumall_sumr|   ru   itemload_weights)r   r   r   r   r   ry   rc   outx_max
best_errorbest_scalesweightsratioscalesrm   out_qlosss                    r%   search_best_scaler      s    NN!E%2Lq	AVAYE

"\
"CEEGLLfL%EuJK5++-.G vE5L$/77;6::<&**,6<<>>E%"))\!:;,U\\F-BCfL  %3l33""$>>))$/%**,>D
99;#J K 	7#' * %%b)KGGKr$   c                    t        | t        j                  t        f      rut	        |      dk(  sJ | j
                  |d d t        j                  f   z  | _        t        | d      r| j                  |z  | _	        |d   j
                  |z  |d   _        nt        | t        j                  t        j                  f      rP| j
                  |z  | _        t        | d      r| j                  |z  | _	        |D ]  }|j
                  |z  |_         n| j                  j                  dk(  rx| j
                  j                  }d| j
                  j                  t        j                         z   |z  dz
  j                  |      | _        |D ]  }|j
                  |z  |_         nt#        d|        |D ]#  }t        |d      s|j$                  |z  |_        % y )Nr{   biasr   RMSNormg      ?z"Could not apply scale to prev_op: r   )r   r   r   r   lenr   ra   newaxishasattrr   	LayerNormr   	__class__r   dtyper`   rb   NotImplementedErrorr   )prev_opr   r   rm   dts        r%   apply_scaler      s   'BII|456{a &BJJ*??7F#"<<&0GL!!9++f4q		GbllBJJ7	8 &07F#"<<&0GLE <<&0EL 				#	#y	0^^!!7>>((44>D
&* 	 E <<&0EL  "$Fwi"PQQ5,'$//&8E r$   configsc                 D   |D ]  }|j                   |j                  |       s"|j                  3| |j                     }|j                  D cg c]  }t        ||       }}n%d }|j                  D cg c]  }t        | |       }}|j                  D 	ci c]  }	|	|v s|	||	    }
}	|j                  D ]$  }	t        |d   |	      st        |d   |	      |
|	<   & t        |||
||      }t        t        | |j                        ||        y c c}w c c}w c c}	w )Nr   )r   r   r   r   r   )
r   r   r   rl   r   r   getattrr   r   r   )r   r   r   r   r   conflocal_blocklr   r5   local_kwargsr   s               r%   scale_blockr     s    ??&tu/E::!

+KBF++N+Q(a8+FNK<@KKHKq(2KFH48KKUKq1CT<?*KUAvay!$")&)Q"7Q  #%'
 	&udii8&&I+ 
 O IUs   D4D	D!Dri   
group_size
max_shrinkn_framesc                    t         j                  j                         }| j                  j	                  dd      }|j
                  d   |z   dz
  |z  }	|d d |	   }| j                  }
|j                  |j
                  d   d|      }|
j
                  }t        j                  |
d|
j                  dz
        }g }t        d|j
                  d   |      D ]9  }||||z    }
|
j
                  d   |
j
                  d   |z  f}t        j                  |t        d            }t        j                  g |d|j                        }|
j
                  } |
j                  g |
j
                  d d d| }
t        j                  d||
      }|
j                         j!                  dd	      }t        t#        ||z              D ]5  }d||z  z
  }||z  }t        j$                  |
| |      j                  |      } ||      } |j                  g |j
                  d d d| }t        j                  d||      }t'        ||      j)                  d
      }|0t         j                  j+                  |      |j-                         z  }||j
                  d   z  }||k  }t        j.                  |||      }t        j.                  |dt         j0                  f   ||      }t        j2                  ||       8 |j5                  |       < t        j6                  |d
      } |j                  g |j
                  d d d| }t        j$                  || |      }|j                  |      }t        j2                  |       |S )Nr   r{   r   r_   r   )r   zbdg,odg->bodT)rq   keepdimsrp   .)ra   r   r   r   flattenrs   r   r   ndimrr   fullr   zerosr   einsumr   r   intclipre   r   r   r|   wherer   ru   rt   rv   )ri   r   r   r   r   rn   r   ry   rc   strideww_init_shapew_all	w_max_allbgroup_shaper   
best_w_maxw_shaper   init_maxrw   pw_maxw_mw_qr   r   best_indicesw_rbest_ws                                  r%   search_best_clipr   3  s)    NN!E 	!!!Q'Aggaj8#a'H4F	(F(AA			!''!*b*-A77LJJq!QVVaZ(EI 1ekk!nj1!a*n%wwqz1772;*#<=WW[%,7
XX//Q/qww?
''AII4qwws|4R44ii1-557;;B;6 s:./0AAJALE''!eVU+33G<C$C#++>syy"~>r>:>CIIna5E sE?&&A&.D ~~--d3ejjlBCIIaL D*,L,jAJ,sBJJ"?
SJGGJ
+% 1( 	$E 2H 	2J
%--
:Sb)
:2
:z
:CWWS:+z2F^^L)FGGFOMr$   no_clip_keysc                     fd}t        || j                         t        j                  j                         y )Nc                      t        |t        j                  t        f      r,t	         fdD              rt        |      }||_        y y y )Nc              3   &   K   | ]  }|v 
 y wr/   r#   ).0r5   paths     r%   	<genexpr>z1clip_block.<locals>.apply_clip.<locals>.<genexpr>  s      A
#/aATM<s   )r   r   r   )r   r   r   r   allr   r   )r   ri   best_weightr   r   r   r   s   `  r%   
apply_clipzclip_block.<locals>.apply_clip  sU    fryy,78S A
#/A
 >
 ++%	K (FM>
8r$   is_leafr   leaf_modulesr   r   	is_module)r   r   r   r   r   r   s    ```` r%   
clip_blockr   y  s)    
( z5#5#5#7ATATUr$   inputs
awq_configbitsembed_group_size
embed_bitsc           	         |j                   | |j                      } t        j                  j                         }fd}	t	        |      }
|j
                  }| j                  |   j                  ||      | j                  |<    | j                  |   |      }d }t        t        | j                              D ]`  \  }}|j                         }t        ||t        j                  j                        }|j!                  |       t#        |||
      }|j!                  |       ~t        j$                  |       t#        |||
      }t'        ||      j)                         }|0t        j                  j+                  |      |j-                         z  }||j,                  z  }|j!                  |       |j/                         }t1        ||j2                  |	|d|
i       t5        ||j6                  |	|       t        j$                  |       t#        |||
      }t'        ||      j)                         }|0t        j                  j+                  |      |j-                         z  }||j,                  z  }t        j8                  d	||z          ||kD  rO|j!                  |       |j;                  |       t        j$                  |       t        j8                  d
       |}t        j<                  |       t        j>                          c |j@                  x}| v r| |   j                  ||      | |<   y y )Nc                 `    t        j                  |       }t        j                  |dS )N)r   r   )ra   quantize
dequantize)r   wqr   r   s     r%   r   z#awq_quantize.<locals>.quantize_func  s(    [[*=}}bt
CCr$   r   r   c                      t         t        j                  t        f      s S  G  fddt        j                        } |       S )Nc                   2    e Zd Zdej                  f fdZy).awq_quantize.<locals>.capture.<locals>.Catcherrc   c                 6   t        d      r)t        j                  j                  |gd      _        n|_        t	        t
              rA|d   }t        d      r)t        j                  j                  |gd      _        n|_         |g|i |S )Nr   r   rp   rS   )r   ra   rv   r   r   r   rS   )selfrc   argsr   rS   ri   s        r%   __call__z7awq_quantize.<locals>.capture.<locals>.Catcher.__call__  s    6<0(*8I8I17MTU(VF%()F% fl3"1gGvy1)+#^^W5A* *1a1$1&11r$   N)r   r   r   ra   arrayr   )ri   s   r%   Catcherr     s    2"(( 2r$   r   )r   r   r   r   r   )ri   r   s   ` r%   capturezawq_quantize.<locals>.capture  s5    &299l";<M	2bii 	2( yr$   r   )r>   r>   )r   r   r   r   r   )r   r   r   r   r   zLoss reduction: z6Loss is not reduced, falling back to original weights.)!r,   ra   r   r   r   r(   modelto_quantized	enumerater   r   r   r   r   r   r   update_modulesrx   r   re   r   r   r|   r   r   r+   r   r*   writer7   ru   clear_cacher)   )r   r   r   r   r   r   r   r   ry   r   r>   	embed_keyr   er   orig_leavescapture_leavesoutputs	outputs_qbefore_lossorig_params
after_lossr)   s      ``                  r%   awq_quantizer    s    $j''(NN!ED !(D  I"[[3@@#* A EKK	 $U[[#F+F4 d5<<015((*!';		@S@ST^,E65[) 	Ejt<eV$7	'9-113..00=

LKw||#[)&&(,,' $	
 	#++'!	
 	Ejt<eV$7	),002
//
;ejjlJJgll"


%j;&>%?@A#  -LL%KK*4@JJOP

k 2n %%%%/w44'j 5 
g 0r$   r   configc                     dddd<   fd}t        || j                         t        j                  j                         S )N@      r   quantizationc                 n    t        |d      r |j                  |j                  dd   | <   y dd   | <   y )Nr   r   r  F)r   r   r   )r   ri   r  s     r%   update_configz$update_config.<locals>.update_config  s?    66"$//,F>"4(
 ,1F>"4(r$   r   r   )r   r  r  s    ` r%   r  r    s?    
 -/:F>1 }e&8&8&:BIIDWDWXMr$   c            
         t        j                         } | j                  ddd       | j                  dd       | j                  dt        d	       | j                  d
t        d	       | j                  dt        d	       | j                  dt        d	       | j                  dt        d	       | j                  dt        d	       | j                  dt        d	       | j                  dt        d	       | j	                         }t
        j                  j                         }|j                  }|=||j                         z  dkD  r'||j                         ||j                         z  z
  z  }t
        j                  j                  |j                         t        |j                  dd      \  }}}|d   }t        j                  |d       x}t!        d| d      t#        ||j                  |j$                        }	t'        |	|      }	t)        ||	||j*                  |j,                  |j.                  |j0                  |j2                         t5        ||      }t7        |j8                  |j                  |||       y )Nz--modelz-mz&mlx-community/Qwen2.5-7B-Instruct-bf16)defaultz
--mlx-path	mlx_modelz--bitsr  )typer  z--group-sizer  z--embed-bitsz--embed-group-size    z--num-samples   z--sequence-length   z--n-grid   z--seed{   r   T)lazyreturn_config
model_typezAWQ support for z models NYI.)r   r   r   r   r   )argparseArgumentParseradd_argumentr   
parse_argsra   r   r   num_samplesr|   randomseedr   r   AWQ_MODEL_CONFIGSgetr   r   sequence_lengthr   r  r   r   r   r   r   r  r   mlx_path)
parserr   ry   r&  r   	tokenizerr  r!  r   calibration_datas
             r%   mainr0    s=   $$&F
4!I   k:
sA6
S"=
S!<
,3C
c3?
+#sC

b9
sC8DNN!E""K[5::<7!;uzz|kEJJL&@@@IINN499#DJJTNE9f%J'++J==
F!$4ZL"MNN D,<,<d>R>RS!"2E:YY????..{{	 5&)F

r$   )Nr  )g      ?r  r  )r  )r     r  r  r  )=r"  r0   dataclassesr   r   pathlibr   typingr   r   r   urllibr	   mlx.corecorera   mlx.nnr   	mlx.utilsr
   r   r   r   mlx_lm.models.baser   mlx_lm.models.switch_layersr   mlx_lm.quant.utilsr   mlx_lm.utilsr   r   r   r'   r7   	llama_awqgemma3_text_awq
gemma3_awqdeepseek_v2_awqr)  re   rl   r   r   r   rx   r   Groupr   r!   dictr   r   r   r   r   r-   r   r  r  r0  r#   r$   r%   <module>rD     sJ     (  & &    @ @  4 4 ( : : :    
x "18		
 	/@A++	
		( 
x "18		
 	/@A,+	
	( O,<=

Q"238		
 	+)*	
 	#$B	

 	-23>	

 	)./>;		
 	++B		
 	+ ?	
C-	2j "_-=>" -  $	99	xx XX_ 	(."(( .2>>#7#7 .0O00 99t0 	0
 0f9:J99J+J J 	J
 JH CIICC C 	C
 C C CV V99Vs)V V 	V
 V4 o
HHo
 o
 	o

 o
 o
 o
 o
d99cN(4r$   