+
    TV-jÇ  ã                   ó  € ^ RI t ^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RI	t
^ RIHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHtHt RR lt^]P8                  R	3R
 R lltR tR t] R8X  d
   ]! 4        R# R# )é    N)Útree_flattenÚtree_mapÚtree_unflatten)Útqdm)Ú	load_data)Úkl_div_loss)Úgrad_checkpoint)Úcompute_bits_per_weightÚloadÚquantize_modelÚsavec                 ó¬  € R p^ p\        ^ \        V4      V4       F™  pWWR,            pV ! VRRR13,          4      P                  \        P                  4      p\
        P                  P                  WvR,          4      pW8P                  4       P                  4       ,          pWHP                  ,          pK›  	  \        P                  ! W4,          4      p	V	# )g        ºNNNNéÿÿÿÿ)r   :é   NN)ÚrangeÚlenÚastypeÚmxÚfloat32ÚnnÚlossesÚcross_entropyÚsumÚitemÚsizeÚmathÚexp)
ÚmodelÚdataÚ
batch_sizeÚall_lossÚntoksÚsÚbatchÚlogitsr   Úppls
   &&&       Úk/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_lm/quant/dynamic_quant.pyÚeval_pplr)      s§   € Ø€HØ€EÜ�1”c˜$“i Ö,ˆØ˜�Ð(ˆÙ�u˜Q   ˜V•}Ó%×,Ñ,¬R¯Z©ZÓ8ˆÜ—‘×(Ñ(¨°uµÓ>ˆØ—J‘J“L×%Ñ%Ó'Õ'ˆØ—‘ÕŠñ -ô �(Š(�8Õ#Ó
$€CØ€Jó    Fc                óP   € V ^8„  d   QhR\         R\        P                  R\        /# )é   r!   Úgradient_accum_dtypeÚgradient_checkpoint)Úintr   ÚDtypeÚbool)Úformats   "r(   Ú__annotate__r3   &   s3   € ÷ Dñ Dô ðDô Ÿ(™(ðDô ñDr*   c	           
      óZ  aaaaaaa€ R  o\        V P                  4       \        P                  P                  R7      p	V	 U
Uu/ uF  w  r«\        VR4      '       g   K  W«bK  	  p	p
p\        P                  ! V 4      o\        P                  ! V	4      pVP                  4        F>  pS! VP                  W#4      Vn	        VP                  4        VP                  R.R7       K@  	  SP                  4        SP                  \        \        VP                  4       4      4      4       V3R lpV'       d   \!        SP"                  ^ ,          4       \%        V3R lSP'                  4       4      p\)        \+        \-        ^ \/        S4      S4      4      \/        S4      S,          RR7       Fv  w  ppSVVS,            pV ! V4      p\0        P2                  ! V4       \        P4                  ! SV4      ! VV4      w  pp\%        R	 VV4      p?\0        P2                  ! V4       Kx  	  VVVVV3R
 lp\%        VVSP7                  4       V P7                  4       4      p\0        P2                  ! V4       \        V4       U
Uu. uF  w  p
pV
RR VP9                  4       3NK  	  pp
pV# u upp
i u upp
i )c                 ój   € \         P                  ! WVR 7      w  rp\         P                  ! WWAVR7      # ))ÚbitsÚ
group_size)ÚscalesÚbiasesr6   r7   )r   ÚquantizeÚ
dequantize)Úwr6   r7   r$   Úbs   &&&  r(   ÚqdqÚ#estimate_sensitivities.<locals>.qdq1   s)   € Ü—+’+˜a°zÔB‰ˆˆaÜ�}Š}˜Q°È*ÔUÐUr*   )Úis_leafÚto_quantizedÚweight)Úkeysc                 óD   <€ \        S! V 4      V4      P                  4       # ©N)r   Úmean)r%   ÚtargetsÚq_models   &&€r(   Úloss_fnÚ'estimate_sensitivities.<locals>.loss_fnA   s   ø€ Ü™7 5›>¨7Ó3×8Ñ8Ó:Ð:r*   c                 óH   <€ \         P                  ! V P                  SR 7      # ))Údtype)r   ÚzerosÚshape)Úxr-   s   &€r(   Ú<lambda>Ú(estimate_sensitivities.<locals>.<lambda>H   s   ø€ ”"—(’(˜1Ÿ7™7Ð*>Õ?r*   zEstimating sensitivities)ÚtotalÚdescc                 ó   € W,           # rE   © )rO   Úys   &&r(   rP   rQ   T   s   € ¨1®5r*   c                 óØ   <€ \        S4      S,           ^,
          S,          pW,          p S! VS	S
4      pVP                  R,          pWV,
          ,          P                  4       pWe,          # )r   g    €„.A)r   r   r   )ÚgradientÚlow_q_weightÚoriginal_weightÚ	n_batchesÚhigh_q_weightÚ
param_sizeÚ	alignmentr!   r    Ú	high_bitsÚhigh_group_sizer>   s   &&&    €€€€€r(   Úcompute_sensitivityÚ3estimate_sensitivities.<locals>.compute_sensitivityX   s`   ø€ Ü˜“Y Õ+¨aÕ/°JÕ>ˆ	ØÕ'ˆÙ˜O¨Y¸ÓHˆØ$×)Ñ)¨CÕ/ˆ
Ø°Õ!=Õ>×CÑCÓEˆ	ØÕ%Ð%r*   Niùÿÿÿ)r   Úleaf_modulesr   ÚModuleÚ	is_moduleÚhasattrÚcopyÚdeepcopyÚvaluesrB   ÚfreezeÚunfreezeÚupdate_modulesr   ÚlistÚitemsr	   Úlayersr   Útrainable_parametersr   Ú	enumerater   r   r   ÚevalÚvalue_and_gradÚ
parametersr   )r   r    Úlow_bitsÚlow_group_sizer_   r`   r!   r-   r.   ro   ÚkÚlÚq_layersrI   Ú
grad_accumÚer$   r%   rG   Ú_Úgradsra   ÚsensitivitiesrH   r>   s   &f&&ffff&              @@r(   Úestimate_sensitivitiesr   &   s%  þ€ òVô ˜%×,Ñ,Ó.¼¿	¹	×8KÑ8KÔL€FÙ%ÔD™v‘t�q¬°°N×)CŒdˆaŠd™v€FÑDÜ�mŠm˜EÓ"€GÜ�}Š}˜VÓ$€HØ�_‰_ÖˆÙ�q—x‘x Ó:ˆŒà	�‰Œ
Ø	�
‰
˜˜
ˆ
Ö#ñ	 ð
 ‡N�NÔØ×Ñœ>¬$¨x¯~©~Ó/?Ó*@ÓAÔBõ;÷ Ü˜Ÿ™ qÕ)Ô*äÜ?Ø×$Ñ$Ó&ó€Jô Ü”%˜œ3˜t›9 jÓ1Ó2Ü�$‹i˜:Õ%Ø'÷‰ˆˆ1ð
 �Q˜˜Z�Ð(ˆÙ˜“,ˆÜ
�Š�ÔÜ×$Ò$ W¨gÔ6°u¸gÓF‰ˆˆ5ÜÑ0°*¸eÓDˆ
ØÜ
�Š�
Öñ÷&ñ &ô ØØØ×ÑÓØ×ÑÓó	€Mô ‡G‚GˆMÔä4@ÀÔ4OÔPÑ4O©D¨A¨q�a˜˜�f˜aŸf™f›hÓ'Ñ4O€MÑPàÐùói Eùód Qs   ÁJ!ÁJ!É;!J'c                 óŽ  aaaaa€ VVV3R  lo\        SP                  4       4      p\        V4      p\        V4      p	RW˜,
          ,          p
W˜,
          V
8”  d`   W˜,           ^,          oVV3R lp\        P
                  ! V 4      p\        P                  ! VVVVR7       \        V4      pWÒ8”  d   SpKh  Sp	Kl  W˜,           ^,          # )c                 óX   <€ \        VR 4      '       g   R# SV ,          V8”  d   RSRS/# R# ©rA   Fr6   r7   T)rf   )ÚpÚmÚhigh_thresholdr_   r`   r~   s   &&&€€€r(   Ú	predicateÚ%estimate_threshold.<locals>.predicatev   s2   ø€ Ü�q˜.×)Ò)ÙØ˜Õ˜nÔ,Ø˜I |°_ÐEÐEÙr*   gü©ñÒMbP?c                 ó   <€ S! WS4      # rE   rU   )rƒ   r„   Úmidr†   s   &&€€r(   rP   Ú$estimate_threshold.<locals>.<lambda>„   s   ø€ ¡y°°sÔ';r*   )r7   r6   Úclass_predicate)	rm   ri   ÚminÚmaxrg   rh   r   r:   r
   )r   r~   Ú
target_bpwru   rv   r_   r`   Ú	sens_valsÚmin_thresholdÚmax_thresholdÚ	tolerancer‹   rH   Úbpwr‰   r†   s   &f&&&ff       @@r(   Úestimate_thresholdr”   m   s©   ü€ ÷ô �]×)Ñ)Ó+Ó,€IÜ˜	“N€MÜ˜	“N€MØ˜Õ5Õ6€IØÕ(¨IÔ
5ØÕ,°Õ1ˆÝ;ˆÜ—-’- Ó&ˆÜ
�ŠØØ%ØØ+õ		
ô & gÓ.ˆØÔØŠMàŠMàÕ)¨QÕ.Ð.r*   c                  óP  a
aa€ \         P                  ! 4       p V P                  R RRR7       V P                  RRRR7       V P                  R\        ^{R	7       V P                  R
\        RRR7       V P                  R\
        RRR7       V P                  R\        ^R	7       V P                  R\        ^@R	7       V P                  R\        ^R	7       V P                  R\        ^@R	7       V P                  RRRR7       V P                  RRRR7       V P                  RRRR.RR7       V P                  4       o
\        P                  P                  4       p\        S
P                  R R!7      w  r#pS
P                  fé   \        P                  P                  S
P                  4       \        VR2R"R#7      p\!        VVS
P"                  S
P$                  S
P&                  S
P(                  \+        \        S
P,                  4      S
P.                  R$7      oS
P                  P1                  R%R&4      p\3        V R'2R(4      ;_uu_ 4       p\4        P6                  ! SV4       RRR4       M=\3        S
P                  R)4      ;_uu_ 4       p\4        P                  ! V4      oRRR4       \9        S4      o\        P                  P                  S
P                  4       \        VR2R"R#7      pS
P:                  '       d   \=        W%4      p\?        R*VR+ 24       \A        VSS
PB                  S
P"                  S
P$                  S
P&                  S
P(                  R,7      oV
VV3R- lp	\E        VVS
P$                  S
P"                  V	R.7      w  r$S
P:                  '       d   \=        W%4      p\?        R/VR+ 24       \G        S
PH                  S
P                  VVV4       \?        R0\        PJ                  ! 4       R3,          R+ R124       R#   + '       g   i     ELl; i  + '       g   i     EL€; i)4z--modelz-mzQwen/Qwen3-0.6B-base)Údefaultz
--mlx-pathÚ	mlx_modelzPath to save the model)r–   Úhelpz--seed)Útyper–   z--sensitivitiesNz-Path to a pre-computed sensitivity JSON file.)r™   r–   r˜   z--target-bpwg      @zTarget bits per weight.z
--low-bitsz--low-group-sizez--high-bitsz--high-group-sizez--report-pplÚ
store_truez8Compute the perplexity of the base and quantized models.)Úactionr˜   z--grad-checkpointz0Use gradient checkpointing to reduce memory use.z--accumulation-dtyper   Úbfloat16zBWhat type to use to accumulate the gradients for the sensitivities)r–   Úchoicesr˜   T)Úreturn_configi   )Únum_samplesÚsequence_length)r-   r.   Ú/r|   z_sensitivities.jsonr<   ÚrzOriginal PPL: z.3f)rŽ   ru   rv   r_   r`   c                 ó€   <€ \        VR 4      '       g   R# SV ,          S8”  d   RSP                  RSP                  /# R# r‚   )rf   r_   r`   )rƒ   r„   Úargsr~   Ú	thresholds   &&€€€r(   Úquant_predicateÚmain.<locals>.quant_predicateå   s<   ø€ Ü�q˜.×)Ò)ÙØ˜Õ˜iÔ'Ø˜DŸN™N¨L¸$×:NÑ:NÐOÐOÙr*   )r7   r6   r¦   zQuantized PPL: zPeak memory used: ÚGBr   i Êš;)&ÚargparseÚArgumentParserÚadd_argumentr/   ÚstrÚfloatÚ
parse_argsr   ÚdistributedÚinitr   r   r~   ÚrandomÚseedr   r   ru   rv   r_   r`   ÚgetattrÚaccumulation_dtyper	   ÚreplaceÚopenÚjsonÚdumpÚdictÚ
report_pplr)   Úprintr”   rŽ   r   r   Úmlx_pathÚget_peak_memory)ÚparserÚgroupr   Ú	tokenizerÚconfigr    Ú
model_nameÚfidr'   r¦   r¤   r~   r¥   s             @@@r(   ÚmainrÄ   •   s£  ú€ Ü×$Ò$Ó&€FØ
×Ñ˜	 4Ð1GÐÔHØ
×ÑØ˜kÐ0Hð ô ð ×Ñ˜¤s°CÐÔ8Ø
×ÑØÜØØ<ð	 ô ð ×ÑØœU¨CÐ6Oð ô ð ×Ñ˜¬3¸ÐÔ:Ø
×ÑÐ*´¸bÐÔAØ
×Ñ˜¬C¸ÐÔ;Ø
×ÑÐ+´#¸rÐÔBØ
×ÑØØØGð ô ð
 ×ÑØØØ?ð ô ð
 ×ÑØØØ˜JÐ'ØQð	 ô ð ×ÑÓ€Dä�N‰N×ÑÓ!€EÜ# D§J¡J¸dÔCÑ€E�fà×ÑÒ!Ü
�	‰	�‰�t—y‘yÔ!Ü˜°ÀCÔHˆä.ØØØ�M‰MØ×ÑØ�N‰NØ× Ñ Ü!(¬¨T×-DÑ-DÓ!EØ $× 4Ñ 4ô	
ˆð —Z‘Z×'Ñ'¨¨SÓ1ˆ
Ü�Z�LÐ 3Ð4°c×:Ô:¸cÜ�IŠI�m SÔ)÷ ;Ð:ô �$×$Ñ$ c×*Ô*¨cÜ ŸIšI c›NˆM÷ +ô ˜Ó'€MÜ‡I�I‡N�N�4—9‘9ÔÜ�Y¨BÀÔD€Dà‡‡€Ü�uÓ#ˆÜ�˜s 3˜iÐ(Ô)ä"ØØØ—?‘?Ø—‘Ø×*Ñ*Ø—.‘.Ø×,Ñ,ô€I÷ô #ØØØ×&Ñ&Ø�]‰]Ø'ô�M€Eð ‡‡€Ü�uÓ#ˆÜ�  C˜yÐ)Ô*äØ�‰Ø�
‰
ØØØôô 
Ðœr×1Ò1Ó3°gÕ=¸cÐBÀ"Ð
EÖF÷e ;×:Ð:ú÷ +×*Ð*ús   ÉP ÊPÐ P	ÐP%	Ú__main__)é   )!r©   rg   r·   r   Úmlx.coreÚcorer   Úmlx.nnr   ÚnumpyÚnpÚ	mlx.utilsr   r   r   r   Úmlx_lm.quant.utilsr   Úmlx_lm.tuner.lossesr   Úmlx_lm.tuner.trainerr	   Úmlx_lm.utilsr
   r   r   r   r)   r   r   r”   rÄ   Ú__name__rU   r*   r(   Ú<module>rÒ      su   ðó Û Û Û å Ý Û ß <Ñ <Ý å (Ý +Ý 0÷ó ô
ð( Ø%'§Z¡ZØ %÷DòN%/òPjGðZ ˆzÔÙ†Fñ r*   