+
    UV-j¡'  ã                   ó  € ^ RI t ^ RIt^ RIt^ RIH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HtHtHtHtHtHtHt . ROtR R ltR R	 ltR
 R ltRR R lltR R ltR t] R8X  d   ]!! R4       ]! 4        R# R# )é    N)ÚPath)ÚCallableÚOptionalÚUnion)Útree_map_with_path)ÚMODEL_CONVERSION_DTYPESÚcreate_model_cardÚfetch_from_hubÚget_model_pathÚsave_configÚsave_weightsÚskip_multimodal_moduleÚupload_to_hubc                óh   € V ^8„  d   QhR\         \        ,          R\         \        ,          R\        /# )é   Úq_group_sizeÚq_bitsÚq_mode)r   ÚintÚstr)Úformats   "Ú`/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_vlm/convert.pyÚ__annotate__r   !   s,   € ÷ ñ Üœ3•-ðÜ)1´#­ðÜ@Cñó    c                 ób   € R RRRRR	RR
/pW2,          w  rERT ;'       g    TRT;'       g    TRV/# )ÚaffineÚmxfp4Únvfp4Úmxfp8Ú
group_sizeÚbitsÚmode)é@   é   )é    r$   )é   r$   )r%   é   © )r   r   r   Úmode_defaultsr    r!   s   &&&   r   Ú_quantization_paramsr*   !   sS   € ð 	�'Ø�Ø�Ø�ð	€Mð %Õ,Ñ€Jà�l×0Ð0 jØ�—�˜$Ø�ðð r   c          
      ó”   € V ^8„  d   QhR\         R\        P                  R\        \        ,          R\        \        ,          R\
        /# )r   ÚconfigÚmodelr   r   r   )ÚdictÚnnÚModuler   r   r   )r   s   "r   r   r   2   sF   € ÷ 1ñ 1Üð1ä�9‰9ð1ô œ3•-ð1ô ”S�Mð	1ô
 ñ1r   c                 ó"  € V P                  R / 4      pV P                  R4      R8w  g4   RV 9   g-   \        V\        4      '       d   VP                  R4      R8w  d   R# ^RIHp V! V4      pVP                  \        W#V4      4       WpR&   WpR &   R# )Úquantization_configÚ
model_typeÚdeepseek_v4ÚquantizationÚquant_methodÚfp8N)Úmake_quantization_config)ÚgetÚ
isinstancer.   Úmodels.deepseek_v4.languager8   Úupdater*   )r,   r-   r   r   r   r2   r8   r5   s   &&&&&   r   Ú+_preserve_existing_deepseek_v4_quantizationr=   2   s‡   € ð !Ÿ*™*Ð%:¸BÓ?Ðà�
‰
�<Ó  MÔ1Ø˜VÔ#ÜÐ-¬t×4Ò4Ø×"Ñ" >Ó2°eÔ;áåEá+¨EÓ2€LØ×ÑÔ,¨\À6ÓJÔKØ)ˆ>ÑØ$0Ð Ó!r   c          
      ó´   € V ^8„  d   QhR\         R\        P                  R\        \         \        P                  .\        \
        \        3,          3,          /# )r   Úreciper-   Úreturn)r   r/   r0   r   r   Úboolr.   )r   s   "r   r   r   J   sI   € ÷ D!ñ D!ÜðD!ÜŸ	™	ðD!äŒs”B—I‘IÐ¤¤d¬D jÕ 1Ð1Õ2ñD!r   c                 óÖ  aaa	a
a€ ^@oRRRRRRRRRRRRRR/pW9  d   \        RV  24      hW ,          w  o
oVP                  4        UUu. uF  w  r4R	V9   g   K  VNK  	  ppp\        V4      ^ 8X  d   \        R
4      h\        V^ ,          P	                  R4      4       F  w  o	pVP                  4       '       g   K   M	  \        VP                  4      oR VVV	V
V3R llpV# u uppi )r#   Ú	mixed_2_6Ú	mixed_3_4Ú	mixed_3_5Ú	mixed_3_6Ú	mixed_3_8Ú	mixed_4_6Ú	mixed_4_8zInvalid quant recipe Ú	down_projz2Model does not have expected keys for mixed quant.Ú.c                ór   € V ^8„  d   QhR\         R\        P                  R\        \        \
        3,          /# )r   ÚpathÚmoduler@   )r   r/   r0   r   rA   r.   )r   s   "r   r   Ú3mixed_quant_predicate_builder.<locals>.__annotate__h   s3   € ÷ $<ñ $<Üð$<ä—	‘	ð$<ô 
Œt”TˆzÕ	ñ$<r   c                ó@  <€ \        V 4      '       d   R# \        VR4      '       g   R# VP                  P                  ^,          S,          ^ 8w  d   R# V P	                  R4      p^ p\        V4      S8”  d+   VS,          pVP                  4       '       d   \        V4      pVS
^,          8  ;'       g6    V^S
,          ^,          8¬  ;'       g    VS
^,          ,
          ^,          ^8H  pV'       d   RV 9   g   RV 9   d   RSRS/# RV 9   g   R	V 9   d   RSRS/# RSRS	/# )
a%  Implements mixed quantization predicates with similar choices to, for example, llama.cpp's Q4_K_M.
Ref: https://github.com/ggerganov/llama.cpp/blob/917786f43d0f29b7c77a0c56767c0fa4df68b1c5/src/llama.cpp#L5265
By Alex Barron: https://gist.github.com/barronalex/84addb8078be21969f1690c1454855f3
FÚto_quantizedrK   Úv_projrJ   r    r!   Úlm_headÚembed_tokens)r   ÚhasattrÚweightÚshapeÚsplitÚlenÚisdigitr   )rM   rN   Ú
path_partsÚindexÚelementÚuse_more_bitsr    Ú	high_bitsÚlayer_locationÚlow_bitsÚ
num_layerss   &&    €€€€€r   Úmixed_quant_predicateÚ<mixed_quant_predicate_builder.<locals>.mixed_quant_predicateh   s  ø€ ô " $×'Ò'ÙÜ�v˜~×.Ò.ÙØ�=‰=×Ñ˜qÕ! JÕ.°!Ô3Ùà—Z‘Z “_ˆ
Øˆäˆz‹?˜^Ô+Ø  Õ0ˆGØ�‰× Ò Ü˜G›�ð �J !•OÑ#÷ 2ð 2Ø˜˜J�¨!Õ+Ñ+÷2ð 2à˜
 a�Õ'¨1Õ,°Ñ1ð 	÷ ˜h¨$Ô.°+ÀÔ2EØ  *¨f°iÐ@Ð@à˜Ô °$Ô 6Ø  *¨f°iÐ@Ð@à˜j¨&°(Ð;Ð;r   )r   é   )é   r$   )rf   é   )rf   re   )rf   r'   )r$   re   )r$   r'   )Ú
ValueErrorÚnamed_modulesrY   Ú	enumeraterX   rZ   Úlayers)r?   r-   Úrecipe_configÚkÚ_Ú	down_keysrc   r    r_   r`   ra   rb   s   &&     @@@@@r   Úmixed_quant_predicate_builderrp   J   sþ   ü€ ð €Jð 	�VØ�VØ�VØ�VØ�VØ�VØ�Vð€Mð Ô"ÜÐ0°°Ð9Ó:Ð:à'Õ/Ñ€Hˆià$×2Ñ2Ô4ÔIÑ4‘t�q¸ÀqÑ8H—�Ñ4€IÑIÜ
ˆ9ƒ~˜ÔÜÐMÓNÐNô ' y°¥|×'9Ñ'9¸#Ó'>Ö?Ñˆ˜Ø�9‰9�;Œ;Ùñ @ô �U—\‘\Ó"€J÷$<ô $<ðL !Ð ùóa Js   Á
C%ÁC%c                óê   € V ^8„  d   QhR\         R\         R\        R\        R\        R\         R\        \         ,          R\         R	\        \         ,          R
\        R\        R\        \         ,          /# )r   Úhf_pathÚmlx_pathÚquantizer   r   r   ÚdtypeÚupload_repoÚrevisionÚ
dequantizeÚtrust_remote_codeÚquant_predicate)r   rA   r   r   )r   s   "r   r   r   ‘   sš   € ÷ l-ñ l-Üðl-äðl-ô ðl-ô ð	l-ô
 ðl-ô ðl-ô ”C�=ðl-ô ðl-ô ”s�mðl-ô ðl-ô ðl-ô œc•]ñl-r   c           	      ó>  aaa€ \        R 4       \        WR7      p\        VRV
R7      w  rÞp\        VRR4      oV3R lp\	        V\
        4      '       d   \        W½4      pT;'       g    TpSf   VP                  RR4      oSf-   VP                  RR4      ;p'       d   VP                  R	R4      oS\        9   d[   \        R
S4       \        \        S4      o\        VRR 4      oVV3R lpVP                  \        VVP                  4       4      4       V'       d   V	'       d   \        R4      hV'       dA   ^ RIHp \!        WíW4V4       \        R4       VP#                  R/ 4       V! VVVVVVR7      w  rÞV	'       d   ^ RIHp \        R4       V! V4      p\	        V\
        4      '       d   \'        V4      p\)        WRR7       R Fe  p\*        P*                  ! \        VV,          4      4      pV F6  p\'        V4      P,                  R8X  d   K  \.        P0                  ! VV4       K8  	  Kg  	  VP3                  4        Fq  pVP5                  4       '       g   K  VVP,                  ,          pVP7                  4       '       d   \.        P8                  ! V4       \.        P:                  ! VV4       Ks  	  VP=                  V4       \?        WáR,          R7       \'        V 4      P7                  4       '       d   RMT p\A        VV4       Ve   \C        W4       R# R# )z[INFO] Loading)rw   T)Úlazyry   rz   Nc                 óF   <€ \        V 4      '       d   R # Se	   S! W4      # R# )FT)r   )rM   rN   Úmodel_quant_predicates   &&€r   Úbase_quant_predicateÚ%convert.<locals>.base_quant_predicate§   s%   ø€ Ü! $×'Ò'ÙØ Ò,Ù(¨Ó6Ð6Ùr   Útorch_dtypeÚtext_configru   z[INFO] Using dtype:Úcast_predicatec                 ó   € R # )Tr(   )rn   s   &r   Ú<lambda>Úconvert.<locals>.<lambda>º   s   € ÁDr   c                 ó°   <€ S! V 4      '       dG   \         P                  ! VP                  \         P                  4      '       d   VP	                  S4      # V# )N)ÚmxÚ
issubdtyperu   ÚfloatingÚastype)rm   Úvrƒ   ru   s   &&€€r   Ú	set_dtypeÚconvert.<locals>.set_dtype¼   s9   ø€ Ù˜a× Ò ¤R§]¢]°1·7±7¼B¿K¹K×%HÒ%HØ—x‘x “Ð&à�r   z/Choose either quantize or dequantize, not both.)Úquantize_modelz[INFO] QuantizingÚvision_config)r"   rz   )Údequantize_modelz[INFO] Dequantizing)Údonate_weightszmodel.safetensors.index.jsonzconfig.json)Úconfig_path)z*.pyz*.json)"Úprintr   r
   Úgetattrr:   r   rp   r9   r   rˆ   r<   r   Ú
parametersrh   Úmlx_lm.utilsr�   r=   Ú
setdefaultr‘   r   r   ÚglobÚnameÚshutilÚcopyÚiterdirÚis_dirÚexistsÚrmtreeÚcopytreeÚsave_pretrainedr   r	   r   )rr   rs   rt   r   r   r   ru   rv   rw   rx   ry   rz   Ú
model_pathr-   r,   Ú	processorr   r‚   r�   r�   r‘   ÚpatternÚfilesÚfileÚitemÚdestÚhf_reporƒ   r~   s   &&&&&&f&&&&&               @@r   Úconvertr«   ‘   s�  ú€ ô 
Ð
ÔÜ Ô;€JÜ-Ø˜Ð1Bô Ñ€E�9ô $ EÐ+<¸dÓCÐõô �/¤3×'Ò'Ü7¸ÓOˆà%×=Ð=Ð)=€Oà‚}Ø—
‘
˜=¨$Ó/ˆØ‚}¨¯©°MÀ4Ó)HÐH˜+ÖHØ—‘ ¨Ó.ˆØÔ'Ô'ÜÐ# UÔ+Üœ˜EÓ"ˆÜ  Ð(8¹.ÓIˆö	ð 	�‰Ô'¨	°5×3CÑ3CÓ3EÓFÔGç—JÜÐJÓKÐKçÝ/ä3Ø˜<°ô	
ô 	Ð!Ô"Ø×Ñ˜/¨2Ô.Ù&ØØØØØØ+ô
‰ˆ÷ Ý1äÐ#Ô$Ù  Ó'ˆä�(œC× Ò Ü˜“>ˆä�°Õ6ó &ˆÜ—	’	œ#˜j¨7Õ2Ó3Ó4ˆÛˆDä�D‹z�‰Ð"@Ô@ÙÜ�KŠK˜˜hÖ'ó	 ñ &ð ×"Ñ"Ö$ˆØ�;‰;�=Œ=Ø˜dŸi™iÕ'ˆDØ�{‰{�}Š}Ü—’˜dÔ#Ü�OŠO˜D $Ö'ñ %ð ×Ñ˜hÔ'ä�¨}Õ$<Õ=ä˜7“m×*Ñ*×,Ò,‰d°'€GÜ�h Ô(àÒÜ�hÖ,ñ r   c                ó8   € V ^8„  d   QhR\         P                  /# )r   r@   )ÚargparseÚArgumentParser)r   s   "r   r   r      s   € ÷ Pñ Pœ(×1Ñ1ñ Pr   c                 ó�  € \         P                  ! RR7      p V P                  RR\        RR7       V P                  R\        RR	R
7       V P                  R\        RRR7       V P                  RRRRR7       V P                  RR\        R	R7       V P                  RR\        R	R7       V P                  RR\        . R+ORR7       V P                  RR\        \
        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                  R)R*RR!R(7       V # ),z
Configures and returns the argument parser for the script.

Returns:
    argparse.ArgumentParser: Configured argument parser.
z(Convert Hugging Face model to MLX format)Údescriptionz	--hf-pathz--modelzSPath to the model. This can be a local path or a Hugging Face Hub model identifier.)ÚtypeÚhelpz
--revisionzEHugging Face revision (branch), when converting a model from the Hub.N)r±   r²   Údefaultz
--mlx-pathÚ	mlx_modelzPath to save the MLX model.)r±   r³   r²   z-qz
--quantizezGenerate a quantized model.Ú
store_true)r²   Úactionz--q-group-sizezGroup size for quantization.)r²   r±   r³   z--q-bitsz!Bits per weight for quantization.z--q-modezThe quantization mode.r   )r²   r±   Úchoicesr³   z--dtypezfType to save the parameter. Defaults to config.json's `torch_dtype` or the current model weights dtypez--quant-predicatezMixed-bit quantization recipe.F)r²   r·   r±   Úrequiredz--upload-repoz-The Hugging Face repo to upload the model to.z-dz--dequantizezDequantize a quantized model.)r²   r¶   r³   z--trust-remote-codezTrust remote code.)r   r   r   r   )r­   r®   Úadd_argumentr   r   r   ÚQUANT_RECIPES)Úparsers    r   Úconfigure_parserr¼      s²  € ô ×$Ò$Ø>ô€Fð ×ÑØØÜØbð	 ô ð ×ÑØÜØTØð	 ô ð ×ÑØœ3¨Ð:Wð ô ð ×ÑØˆlÐ!>À|ð ô ð ×ÑØØ+ÜØð	 ô ð ×ÑØØ0ÜØð	 ô ð ×ÑØØ%ÜÚ5Øð ô ð ×ÑØØuÜÜ'Øð ô ð ×ÑØØ-ÜÜØð ô ð ×ÑØØ<ÜØð	 ô ð ×ÑØØØ,ØØð ô ð ×ÑØØ!ØØð	 ô ð €Mr   c                  ób   € \        4       p V P                  4       p\        R/ \        V4      B  R # )Nr(   )r¼   Ú
parse_argsr«   Úvars)r»   Úargss     r   ÚmainrÁ   S  s'   € ÜÓ€FØ×ÑÓ€DÜÑŒd�4‹jÔr   Ú__main__z…Calling `python -m mlx_vlm.convert ...` directly is deprecated. Use `mlx_vlm.convert ...` or `python -m mlx_vlm convert ...` instead.)rC   rD   rE   rF   rG   rH   rI   )r´   Fr#   r$   r   NNNFTN)"r­   r™   r›   Úpathlibr   Útypingr   r   r   Úmlx.coreÚcorerˆ   Úmlx.nnr/   Ú	mlx.utilsr   Úutilsr   r	   r
   r   r   r   r   r   rº   r*   r=   rp   r«   r¼   rÁ   Ú__name__r”   r(   r   r   Ú<module>rË      s~   ðÛ Û Û Ý ß ,Ñ ,å Ý Ý (÷	÷ 	ó 	ò€õõ"1õ0D!÷Nl-õ^Pòfð ˆzÔÙ	ð	Qôñ 	†Fñ r   