Ë
    îÍ:j‰  ã                   óÈ   — d dl 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
 erddlmZ dd	lmZmZmZmZ dd
lmZ  e«       rd dlZ ej*                  e«      Z G d„ de«      Zy)é    N)ÚTYPE_CHECKINGÚOptionalÚUnion)Úversioné   )ÚHfQuantizer)Úget_module_from_nameé   )ÚPreTrainedModel)Úis_accelerate_availableÚis_optimum_quanto_availableÚis_torch_availableÚlogging)ÚQuantoConfigc                   ó"  ‡ — e Zd ZdZddgZdZdZdefˆ fd„Zd„ Z	d	„ Z
d
„ Zd!d„Zdee   dedee   fd„Zdddedefd„Zdeeeeef   f   deeeeef   f   fd„Zdddddeddfd„Zd"d„Z	 d#dddeee      fd„Zd„ Zedefd„«       Zd#d „Zˆ xZS )$ÚQuantoHfQuantizerz*
    Quantizer for the quanto library
    ÚquantoÚ
accelerateTFÚquantization_configc                 óF   •— t        ‰| �  |fi |¤Ž | j                  «        y ©N)ÚsuperÚ__init__Ú	post_init)Úselfr   ÚkwargsÚ	__class__s      €ú}/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/transformers/quantizers/quantizer_quanto.pyr   zQuantoHfQuantizer.__init__2   s    ø€ Ü‰ÑÐ,Ñ7°Ò7Ø�‰Õó    c                 ó`   — | j                   j                  �| j                  st        d«      ‚yy)z 
        Safety checker
        NzÂWe don't support quantizing the activations with transformers library.Use quanto library for more complex use cases such as activations quantization, calibration and quantization aware training.)r   ÚactivationsÚpre_quantizedÚ
ValueError©r   s    r   r   zQuantoHfQuantizer.post_init6   s;   € ð ×#Ñ#×/Ñ/Ð;ÀD×DVÒDVÜðOóð ð EWÐ;r   c                 óX   — t        «       st        d«      ‚t        «       st        d«      ‚y )NzhLoading an optimum-quanto quantized model requires optimum-quanto library (`pip install optimum-quanto`)z`Loading an optimum-quanto quantized model requires accelerate library (`pip install accelerate`))r   ÚImportErrorr   )r   Úargsr   s      r   Úvalidate_environmentz&QuantoHfQuantizer.validate_environment@   s5   € Ü*Ô,ÜØzóð ô 'Ô(ÜØróð ð )r   c                 ó<   — |€ddi}t         j                  d«       |S )NÚ Úcpuz�The device_map was not initialized. Setting device_map to {'':'cpu'}. If you want to use the model for inference, please set device_map ='auto')ÚloggerÚinfo)r   Ú
device_maps     r   Úupdate_device_mapz#QuantoHfQuantizer.update_device_mapJ   s+   € ØÐØ˜e˜ˆJÜ�K‰Kð\ôð
 Ðr   Úreturnc                 óT   — |€%t         j                  d«       t        j                  }|S )NzPYou did not specify `dtype` in `from_pretrained`. Setting it to `torch.float32`.)r,   r-   ÚtorchÚfloat32)r   Údtypes     r   Úupdate_dtypezQuantoHfQuantizer.update_dtypeT   s"   € Øˆ=Ü�K‰KÐjÔkÜ—M‘MˆEØˆr   Úmissing_keysÚprefixc                 ó8  — t        «       rddlm} g }|j                  «       D ]\  \  }}t	        |«      sŒ|D ]E  }||v s
||› d|› �v sŒ|j                  d«      rŒ#|j                  d«      rŒ5|j                  |«       ŒG Œ^ |D �	cg c]	  }	|	|vsŒ|	‘Œ c}	S c c}	w )Nr   ©ÚQModuleMixinú.z.weightz.bias)r   Úoptimum.quantor:   Únamed_modulesÚ
isinstanceÚendswithÚappend)
r   Úmodelr6   r7   r:   Únot_missing_keysÚnameÚmoduleÚmissingÚks
             r   Úupdate_missing_keysz%QuantoHfQuantizer.update_missing_keysZ   s§   € Ü&Ô(Ý3àÐØ!×/Ñ/Ó1ò 	9‰LˆD�&Ü˜& ,Õ/Ø+ò 9�Gà ™¨D°v°h¸aÀ¸yÐ4IÒ,IØ '× 0Ñ 0°Õ ;Ø '× 0Ñ 0°Õ 9à(×/Ñ/°Õ8ñ9ð	9ð (ÖE�a¨1Ð4DÒ+D’ÒEÐEùÒEs   Â	BÂBrA   r   Ú
param_namec                 ó|   — t        «       rddlm} t        ||«      \  }}t	        |«      rd|v r|j
                   S y)Nr   r9   ÚweightF)r   r<   r:   r	   r>   Úfrozen)r   rA   rH   r   r:   rD   Útensor_names          r   Úparam_needs_quantizationz*QuantoHfQuantizer.param_needs_quantizationj   s=   € Ü&Ô(Ý3ä2°5¸*ÓEÑˆ�ä�f˜lÔ+°¸KÑ0Gà—}‘}Ð$Ð$àr   Ú
max_memoryc                 ó^   — |j                  «       D ��ci c]  \  }}||dz  “Œ }}}|S c c}}w )NgÍÌÌÌÌÌì?)Úitems)r   rN   ÚkeyÚvals       r   Úadjust_max_memoryz#QuantoHfQuantizer.adjust_max_memoryv   s6   € Ø6@×6FÑ6FÓ6H×I©(¨#¨s�c˜3 ™:‘oÐIˆ
ÑIØÐùó Js   ”)Úparam_valueztorch.TensorÚtarget_deviceztorch.devicec                 ó¢   — ddl m}  ||||j                  |«      «       t        ||«      \  }}|j	                  «        d|j
                  _        y )Nr
   )Ú_load_parameter_into_modelF)Úmodeling_utilsrW   Útor	   ÚfreezerJ   Úrequires_grad)	r   rA   rT   rH   rU   r   rW   rD   Ú_s	            r   Úcreate_quantized_paramz(QuantoHfQuantizer.create_quantized_paramz   sB   € õ 	@á" 5¨*°k·n±nÀ]Ó6SÔTÜ(¨°
Ó;‰	ˆ�Ø�‰ŒØ&+ˆ�‰Õ#r   c                 óP  — t        j                  t        j                  j                  d«      «      t        j                  d«      kD  rTddlm} t        j                  |j                  |j                  |j                  dœ}|| j                  j                     }|S t        d«      ‚)Nr   z0.27.0r   )ÚCustomDtype)Úint8Úfloat8Úint4Úint2zçYou are using `device_map='auto'` on an optimum-quanto quantized model. To automatically compute the appropriate device map, you should upgrade your `accelerate` library,`pip install --upgrade accelerate` or install it from source.)r   ÚparseÚ	importlibÚmetadataÚaccelerate.utilsr_   r2   r`   ÚFP8ÚINT4ÚINT2r   Úweightsr#   )r   Útarget_dtyper_   Úmappings       r   Úadjust_target_dtypez%QuantoHfQuantizer.adjust_target_dtype‰   s‹   € Ü�=‰=œ×+Ñ+×3Ñ3°LÓAÓBÄWÇ]Á]ÐS[ÓE\Ò\Ý4ô Ÿ
™
Ø%Ÿ/™/Ø#×(Ñ(Ø#×(Ñ(ñ	ˆGð # 4×#;Ñ#;×#CÑ#CÑDˆLØÐäðPóð r   Úkeep_in_fp32_modulesc                 óâ   — ddl m} | j                  || j                  j                  |«      | _         ||| j                  | j                  ¬«      \  }}| j                  |j
                  _        y )Nr
   )Úreplace_with_quanto_layers)Úmodules_to_not_convertr   )Úintegrationsrq   Úget_modules_to_not_convertr   rr   Úconfig)r   rA   ro   r   rq   r\   s         r   Ú$_process_model_before_weight_loadingz6QuantoHfQuantizer._process_model_before_weight_loadingœ   sf   € õ 	>à&*×&EÑ&EØ�4×+Ñ+×BÑBÐDXó'
ˆÔ#ñ .Ø¨$×*EÑ*EÐ[_×[sÑ[sô
‰ˆˆqð ,0×+CÑ+Cˆ�‰Õ(r   c                 ó   — |S r   © )r   rA   r   s      r   Ú#_process_model_after_weight_loadingz5QuantoHfQuantizer._process_model_after_weight_loadingª   s   € Øˆr   c                  ó   — y)NTrx   r$   s    r   Úis_trainablezQuantoHfQuantizer.is_trainable­   s   € àr   c                  ó   — y)NFrx   )r   Úsafe_serializations     r   Úis_serializablez!QuantoHfQuantizer.is_serializable±   s   € Ør   )r4   útorch.dtyper0   r   )rl   r   r0   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequired_packagesÚ requires_parameters_quantizationÚrequires_calibrationr   r   r   r(   r/   r5   ÚlistÚstrrG   ÚboolrM   Údictr   ÚintrS   r]   rn   r   rv   ry   Úpropertyr{   r~   Ú__classcell__)r   s   @r   r   r   )   s@  ø„ ñð " <Ð0ÐØ'+Ð$Ø Ðð¨Lõ òòòóðF°t¸C±yð FÈ#ð FÐRVÐWZÑR[ó Fð 
Ð.?ð 
ÈSð 
Ð_có 
ð¨D°°e¸CÀ¸H±oÐ1EÑ,Fð È4ÐPSÐUZÐ[^Ð`cÐ[cÑUdÐPdÑKeó ð,à ð,ð $ð,ð ð	,ð
 &ó,óð( UYñDØ&ðDØ>FÀtÈCÁyÑ>QóDòð ð˜dò ó ð÷r   r   )re   Útypingr   r   r   Ú	packagingr   Úbaser   Úquantizers_utilsr	   rX   r   Úutilsr   r   r   r   Úutils.quantization_configr   r2   Ú
get_loggerr€   r,   r   rx   r   r   ú<module>r•      s[   ðó ß 1Ñ 1å å Ý 2ñ Ý0÷ó õ 5ñ ÔÛà	ˆ×	Ñ	˜HÓ	%€ôI˜õ Ir   