Ë
    îÍ:jƒ,  ã                   óì   — 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 erdd	lmZ  e«       rd d
lZ e«       rd dlmZ ed„ «       Zee_         e	j*                  e«      Z G d„ de«      Zy
)é    )Údefaultdict)ÚTYPE_CHECKINGé   )Úprepare_for_hqq_linear)Úis_hqq_availableÚis_torch_availableÚloggingé   )ÚHfQuantizer)Úget_module_from_name)ÚPreTrainedModelN)Ú	HQQLinearc                 óZ   — t        j                  d| j                  | j                  ¬«      S )Nr   )ÚdtypeÚdevice)ÚtorchÚemptyÚcompute_dtyper   ©Úselfs    úz/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/transformers/quantizers/quantizer_hqq.pyÚweightr   %   s   € ä�{‰{˜1 D×$6Ñ$6¸t¿{¹{ÔKÐKó    c            	       óæ   ‡ — e Zd ZdZdZdZdZdgZˆ fd„Zddde	e
   d	e
d
e	e
   fd„Zddde	e
   de	e
   d
e	e
   fd„Zddde
d
efd„Zddddde
ddfd„Zd„ Z	 	 dd„Zdd„Zdd„Zed
efd„«       Zˆ xZS )ÚHqqHfQuantizerzŠ
    HQQ quantizer base HF class.
    nn.Linear modules are first tagged with quant_config in _process_model_before_weight_loading().
    FTÚhqqc                 ó�  •— t        «       st        d«      ‚t        ‰| �  |fi |¤Ž d | _        d| _        t        d d «      j                  «       dhz
  | _        |j                  dd«      s|j                  dd«      rt        d«      ‚| j                  €9d|v r|d   | _        n*t        j                  | _        t        j                  d«       |j                  d	«      }t        |t         «      rZd
|j#                  «       v sd|j#                  «       v rt        d«      ‚t%        t'        |j#                  «       «      «      dkD  | _        y y )Nz�A valid HQQ version (>=0.2.1) is not available. Please follow the instructions to install it: `https://github.com/mobiusml/hqq/`.FÚbiasÚfrom_tfÚ	from_flaxzwConverting weights from tf/flax weights is currently not supported, please make sure the weights are in PyTorch format.r   zOSetting dtype to torch.float32 as the default value since it was not specified.Ú
device_mapÚcpuÚdiskz­You are attempting to use an HQQ model with a device_map that contains a CPU or disk device. This is not supported. Please remove the CPU or disk device from the device_map.r
   )r   ÚImportErrorÚsuperÚ__init__r   Úusing_multi_gpur   Ústate_dict_keysÚhqq_keysÚgetÚ
ValueErrorr   Úfloat32ÚloggerÚinfoÚ
isinstanceÚdictÚvaluesÚlenÚset)r   Úquantization_configÚkwargsr!   Ú	__class__s       €r   r&   zHqqHfQuantizer.__init__9   s5  ø€ ÜÔ!Üð Tóð ô 	‰ÑÐ,Ñ7°Ò7ØˆŒ
Ø$ˆÔä! $¨Ó-×=Ñ=Ó?À6À(ÑJˆŒà�:‰:�i Ô'¨6¯:©:°kÀ5Ô+IÜð;óð ð
 �:‰:ÐØ˜&Ñ Ø# G™_�•
ä"Ÿ]™]�”
Ü—‘ÐmÔnà—Z‘Z Ó-ˆ
Ü�j¤$Ô'Ø˜
×)Ñ)Ó+Ñ+¨v¸×9JÑ9JÓ9LÑ/LÜ ðhóð ô
 (+¬3¨z×/@Ñ/@Ó/BÓ+CÓ'DÀqÑ'H�Õ$ð (r   Úmodelr   Úmissing_keysÚprefixÚreturnc                 óR   — | j                   r|D �cg c]	  }d|vsŒ|‘Œ c}S |S c c}w )Nr   )Úpre_quantized)r   r7   r8   r9   r5   Úkeys         r   Úupdate_missing_keysz"HqqHfQuantizer.update_missing_keys[   s1   € ð ×ÒØ#/ÖI˜C°HÀCÒ4G’CÒIÐIàÐùò Js   ‘	$›$Úexpected_keysÚloaded_keysc                 óú  ‡‡— | j                   s|S ˆfd„Št        |«      }|j                  «       D ]  \  }}||_        Œ t        «       } ‰||«       t        «       }|D ]6  }	|j                  j
                  d   D ]  }
|
|	v sŒ|j                  |	«       Œ Œ8 ||z  }t        d d t        j                  dd¬«      j                  «       dhz
  }t        «       }|D ](  Št        ˆfd„|D «       «      sŒ|j                  ‰«       Œ* ||z  }|D ]_  }	|	dz   |v r|j                  |	dz   «       n%|j                  |D �ch c]
  }|	d	z   |z   ’Œ c}«       |	d
z   |v sŒL|j                  |	d
z   «       Œa t        |«      S c c}w )Nc                 óÆ   •— | j                  «       D ]M  \  }}t        |t        j                  j                  «      r|j                  |j                  «        ‰||«       ŒO y ©N)Únamed_childrenr/   r   ÚnnÚLinearÚaddÚname)r7   ÚlayersrH   ÚmoduleÚ_find_hqq_quantizable_layerss       €r   rK   zIHqqHfQuantizer.update_expected_keys.<locals>._find_hqq_quantizable_layersk   sK   ø€ Ø %× 4Ñ 4Ó 6ò =‘��fÜ˜f¤u§x¡x§¡Ô8Ø—J‘J˜vŸ{™{Ô+Ù,¨V°VÕ<ñ=r   Úskip_modulesr"   F©Úlinear_layerÚquant_configr   r   Údel_origr   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrC   © )Ú.0Ú_moduler=   s     €r   ú	<genexpr>z6HqqHfQuantizer.update_expected_keys.<locals>.<genexpr>�   s   øè ø€ Ò@ g�7˜c”>Ñ@ùó   ƒz.weightú.z.bias)r<   r3   Únamed_modulesrH   Úconfigr4   rG   r   r   Úfloat16r(   ÚanyÚupdateÚlist)r   r7   r?   r@   Únew_keysrH   rJ   Ú_valid_modulesÚ_skipped_modulesrT   Ú_skip_moduleÚ	_ref_keysÚ_rm_keysÚ_ref_keyrK   r=   s                 @@r   Úupdate_expected_keysz#HqqHfQuantizer.update_expected_keysd   s¦  ù€ ð ×!Ò!Ø Ð ô	=ô �}Ó%ˆð "×/Ñ/Ó1ò 	‰LˆD�&ØˆF�Kð	ô ›ˆÙ$ U¨NÔ;ô ›5ÐØ%ò 	2ˆGØ %§¡× @Ñ @ÀÑ Pò 2�Ø 7Ò*Ø$×(Ñ(¨Õ1ñ2ð	2ð 	Ð*Ñ*ˆô ØØÜŸ-™-ØØô
÷ ‰/Ó
˜v˜hñ'ˆ	ô “5ˆØò 	"ˆCÜÓ@°Ô@Õ@Ø—‘˜SÕ!ð	"ð 	�HÑˆð &ò 	0ˆGØ˜Ñ" kÑ1Ø—‘˜W yÑ0Õ1à—‘È)Ö T¸h ¨3¡°Ó!9Ò TÔUØ˜Ñ  KÒ/Ø—‘˜W wÑ.Õ/ð	0ô �H‹~Ðùò	 !Us   Ä9E8
Ú
param_namec                 óh   — t        ||«      \  }}t        |t        j                  j                  «      S rC   )r   r/   r   rE   rF   )r   r7   rf   r5   rJ   Ú_s         r   Úparam_needs_quantizationz'HqqHfQuantizer.param_needs_quantizationŸ   s)   € Ü(¨°
Ó;‰	ˆ�ô ˜&¤%§(¡(§/¡/Ó2Ð2r   Úparam_valueztorch.TensorÚtarget_deviceztorch.devicec                 ó–  ‡‡— t        ||«      \  Š}|j                  dd«      d   }t        ||«      \  }}	|j                  j                  d   }
|j                  j                  d   }t	        ˆfd„|D «       «      r2‰j                  ||j                  || j                  ¬«      idd	¬
«       y | j                  �r?t        | d«      st        t        «      | _        | j                  |   j                  ||i«       | j                  |   Št        ˆfd„| j                  D «       «      rÑd‰v s‰j                   €Át#        d d | j                  |d¬«      }|j                  ‰«       |j                   �Rt%        |j                   t&        j(                  «      r.t&        j*                  j-                  |j                   «      |_        | j.                  r| j1                  |«      }t3        ||	|«       | j                  |= ‹y ‰j                  ||idd	¬
«       ‰j4                  j6                  j8                  dk7  xr3 ‰j                   d u xs# ‰j                   j6                  j8                  dk7  }|ràdj;                  ‰j<                  j?                  d«      dd  «      }d|
v r|
}n	||
v r|
|   }t#        ‰| j                  |d	¬«      }|j                   �Rt%        |j                   t&        j(                  «      r.t&        j*                  j-                  |j                   «      |_        | j.                  r| j1                  |«      }t3        ||	|«       y y )NrW   r
   r   rO   rL   c              3   ó:   •K  — | ]  }|‰j                   v –— Œ y ­wrC   )rH   )rS   Úskip_modulerJ   s     €r   rU   z8HqqHfQuantizer.create_quantized_param.<locals>.<genexpr>µ   s   øè ø€ ÒJ¨kˆ{˜fŸk™kÔ)ÑJùs   ƒ)r   r   FT)ÚstrictÚassignÚ
hqq_paramsc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrC   rR   )rS   Úkrq   s     €r   rU   z8HqqHfQuantizer.create_quantized_param.<locals>.<genexpr>Å   s   øè ø€ Ò: q�1˜
”?Ñ:ùrV   r   rM   ÚmetaéþÿÿÿÚweight_quant_params)rO   r   r   rP   ) r   ÚrsplitrY   r4   r[   Úload_state_dictÚtor   r<   Úhasattrr   r0   rq   r\   Úallr)   r   r   r/   r   ÚTensorrE   Ú	Parameterr'   Ú_patch_layer_for_multigpuÚsetattrr   r   ÚtypeÚjoinrH   Úsplit)r   r7   rj   rf   rk   r5   Útensor_nameÚmodule_nameÚparent_moduleÚnoderO   rL   Ú	hqq_layerÚmodule_is_readyÚ
module_tagÚmodule_quant_configrq   rJ   s                   @@r   Úcreate_quantized_paramz%HqqHfQuantizer.create_quantized_param¥   sæ  ù€ ô 3°5¸*ÓEÑˆ�Ø ×'Ñ'¨¨QÓ/°Ñ2ˆÜ2°5¸+ÓFÑˆ�tà—|‘|×7Ñ7¸ÑGˆØ—|‘|×7Ñ7¸ÑGˆô ÓJ¸\ÔJÔJØ×"Ñ"Ø˜kŸn™n°MÈÏÉ˜nÓTÐUÐ^cÐlpð #ô ð ð ×Óä˜4 Ô.Ü"-¬dÓ"3�”Ø�O‰O˜KÑ(×/Ñ/°¸kÐ0JÔKØŸ™¨Ñ5ˆJô Ó:¨D¯M©MÔ:Ô:ÀÈ*Ñ@TÐX^×XcÑXcÐXkÜ%Ø!%Ø!%Ø"&§*¡*Ø(Ø"ô�	ð ×)Ñ)¨*Ô5à—>‘>Ð-´*¸Y¿^¹^ÌUÏ\É\Ô2ZÜ%*§X¡X×%7Ñ%7¸	¿¹Ó%G�I”NØ×'Ò'Ø $× >Ñ >¸yÓ I�Iä˜ t¨YÔ7Ø—O‘O KÐ0°&Øð 	×Ñ ¨[Ð9À%ÐPTÐÔUð !Ÿ-™-×.Ñ.×3Ñ3°vÑ=ò 
Ø�K‰K˜4ÐÒD 6§;¡;×#5Ñ#5×#:Ñ#:¸fÑ#Dð 	ñ ØŸ™ &§+¡+×"3Ñ"3°CÓ"8¸¸Ð"=Ó>ˆJØ$¨Ñ4Ø&2Ñ#Ø˜|Ñ+Ø&2°:Ñ&>Ð#ä!ØØ0Ø"Ÿj™jØ$ØôˆIð �~‰~Ð)¬j¸¿¹ÌÏÉÔ.VÜ!&§¡×!3Ñ!3°I·N±NÓ!C�	”à×#Ò#Ø ×:Ñ:¸9ÓE�	ä�M 4¨Õ3ð+ r   c                 ó&   ‡‡— d„ Šˆˆfd„‰_         ‰S )Nc                 óÒ   — t        j                  |j                  | j                  «      | j	                  «       j                  «       «      }| j                  �|| j                  z  }|S rC   )r   Úmatmulry   r   Ú
dequantizeÚtr   )r   ÚxÚouts      r   Úforward_with_devicezEHqqHfQuantizer._patch_layer_for_multigpu.<locals>.forward_with_deviceø   sL   € Ü—,‘,˜qŸt™t D§K¡KÓ0°$·/±/Ó2C×2EÑ2EÓ2GÓHˆCØ�y‰yÐ$Ø�t—y‘yÑ �ØˆJr   c                 ó   •—  ‰‰| «      S rC   rR   )r‘   r“   r‡   s    €€r   ú<lambda>z:HqqHfQuantizer._patch_layer_for_multigpu.<locals>.<lambda>þ   s   ø€ Ñ&9¸)ÀQÓ&G€ r   )Úforward)r   r‡   r“   s    `@r   r~   z(HqqHfQuantizer._patch_layer_for_multigpu÷   s   ù€ ò	ô Hˆ	ÔØÐr   c                 ó2   — t        || j                  ¬«      }y )N)r4   )r   r4   ©r   r7   r5   s      r   Ú$_process_model_before_weight_loadingz3HqqHfQuantizer._process_model_before_weight_loading  s   € ô ' uÀ$×BZÑBZÔ[‰r   c                 ó>   — d|_         | j                  «       |_        |S ©NT)Úis_hqq_quantizedÚis_serializableÚis_hqq_serializabler˜   s      r   Ú#_process_model_after_weight_loadingz2HqqHfQuantizer._process_model_after_weight_loading
  s    € Ø!%ˆÔØ$(×$8Ñ$8Ó$:ˆÔ!Øˆr   c                  ó   — yr›   rR   )r   Úsafe_serializations     r   r�   zHqqHfQuantizer.is_serializable  s   € Ør   c                  ó   — yr›   rR   r   s    r   Úis_trainablezHqqHfQuantizer.is_trainable  s   € àr   )r7   r   rC   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úuse_keep_in_fp32_modulesÚ requires_parameters_quantizationÚrequires_calibrationÚrequired_packagesr&   r]   Ústrr>   re   Úboolri   r‹   r~   r™   rŸ   r�   Úpropertyr£   Ú__classcell__)r6   s   @r   r   r   .   s  ø„ ñð
  %ÐØ'+Ð$Ø ÐØ˜Ðô IðD Ø&ð Ø6:¸3±ið ØILð à	ˆc‰ó ð9Ø&ð9Ø7;¸C±yð9ØOSÐTWÉyð9à	ˆc‰ó9ðv3Ð.?ð 3ÈSð 3Ð_có 3ðP4à ðP4ð $ðP4ð ð	P4ð
 &óP4òdð\à ó\óó
ð ð˜dò ó ôr   r   )Úcollectionsr   Útypingr   Úintegrationsr   Úutilsr   r   r	   Úbaser   Úquantizers_utilsr   Úmodeling_utilsr   r   Úhqq.core.quantizer   r®   r   Ú
get_loggerr¤   r-   r   rR   r   r   ú<module>r¹      sx   ðõ $Ý  å 1ß AÑ AÝ Ý 2ñ Ý0ñ ÔÛáÔÝ+ð
 ñLó ðLð €IÔà	ˆ×	Ñ	˜HÓ	%€ôf�[õ fr   