Ë
    T^(h  ã                   óÔ   — d dl Z d dlmZmZmZ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j0                  e«      Z G d„ de«      Zy)é    N)ÚTYPE_CHECKINGÚAnyÚDictÚListÚ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ddedeeef   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$ded   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      €úf/var/www/skyplay_api_hub/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 )NzVYou did not specify `torch_dtype` in `from_pretrained`. Setting it to `torch.float32`.)r.   r/   ÚtorchÚfloat32)r   Útorch_dtypes     r!   Úupdate_torch_dtypez$QuantoHfQuantizer.update_torch_dtypeT   s$   € ØÐÜ�K‰KÐpÔqÜŸ-™-ˆKØÐ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   Úmodelr8   r9   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rC   r   Úparam_valueztorch.TensorÚ
param_nameÚ
state_dictc                 ó@  — t        «       rddlm} |j                  dd«      }|j                  dd«      }|�<|�:t	        |j                  «       «      }	|dk(  rt        |	«      dkD  r|	dhk(  s|	ddhk(  sy	t        ||«      \  }
}t        |
«      rd
|v r|
j                   S y	)z=
        Check if a parameter needs to be quantized.
        r   r;   r0   NÚparam_devicer-   r
   ÚdiskFÚweight)
r   r>   r<   ÚgetÚsetÚvaluesÚlenr   r@   Úfrozen)r   rC   rJ   rK   rL   r   r<   r0   rN   Údevice_map_valuesrF   Útensor_names               r!   Úcheck_quantized_paramz'QuantoHfQuantizer.check_quantized_paramj   s­   € ô 'Ô(Ý3à—Z‘Z ¨dÓ3ˆ
Ø—z‘z .°$Ó7ˆàÐ! lÐ&>Ü # J×$5Ñ$5Ó$7Ó 8ÐØ˜uÒ$¬Ð->Ó)?À!Ò)CØ)¨e¨WÒ4Ð8IÈeÐU[È_Ò8\Ø ä2°5¸*ÓEÑˆ�ä�f˜lÔ+°¸KÑ0Gà—}‘}Ð$Ð$àr"   Ú
max_memoryc                 ó^   — |j                  «       D ��ci c]  \  }}||dz  “Œ }}}|S c c}}w )NgÍÌÌÌÌÌì?)Úitems)r   rY   ÚkeyÚvals       r!   Úadjust_max_memoryz#QuantoHfQuantizer.adjust_max_memory‰   s6   € Ø6@×6FÑ6FÓ6H×I©(¨#¨s�c˜3 ™:‘oÐIˆ
ÑIØÐùó Js   ”)Útarget_deviceztorch.devicec                 ó†   — ddl m}  |||||«       t        ||«      \  }}	|j                  «        d|j                  _        y)ze
        Create the quantized parameter by calling .freeze() after setting it to the module.
        r   )Úset_module_tensor_to_deviceFN)Úaccelerate.utilsra   r   ÚfreezerP   Úrequires_grad)
r   rC   rJ   rK   r_   r)   r   ra   rF   Ú_s
             r!   Úcreate_quantized_paramz(QuantoHfQuantizer.create_quantized_param�   s;   € õ 	Aá# E¨:°}ÀkÔRÜ(¨°
Ó;‰	ˆ�Ø�‰ŒØ&+ˆ�‰Õ#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Úmetadatarb   rh   r4   ri   ÚFP8ÚINT4ÚINT2r   Úweightsr&   )r   Útarget_dtyperh   Ú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   )Úintegrationsry   Úget_modules_to_not_convertr   rz   Úconfig)r   rC   rw   r   ry   re   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   rC   r   s      r!   Ú#_process_model_after_weight_loadingz5QuantoHfQuantizer._process_model_after_weight_loadingÁ   s   € Øˆr"   c                  ó   — y)NTr€   )r   rC   s     r!   Úis_trainablezQuantoHfQuantizer.is_trainableÄ   s   € àr"   c                  ó   — y)NFr€   )r   Úsafe_serializations     r!   Úis_serializablez!QuantoHfQuantizer.is_serializableÈ   s   € Ør"   )r6   útorch.dtyper2   r‡   )rt   r‡   r2   r‡   r   ) Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequired_packagesÚ requires_parameters_quantizationÚrequires_calibrationr   r   r   r*   r1   r7   r   ÚstrrI   r   r   ÚboolrX   r   Úintr^   rf   rv   r   r~   r�   Úpropertyrƒ   r†   Ú__classcell__)r    s   @r!   r   r   )   sg  ø„ ñð " <Ð0ÐØ'+Ð$Ø Ðð¨Lõ òòòóðF°t¸C±yð FÈ#ð FÐRVÐWZÑR[ó Fð à ðð $ðð ð	ð
 ˜˜c˜‘Nðð 
óð>¨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òð ñ (Ð+<Ñ"=ò ó ð÷r"   r   )rn   Útypingr   r   r   r   r   r   Ú	packagingr	   Úbaser   Úquantizers_utilsr   Úmodeling_utilsr   Úutilsr   r   r   r   Úutils.quantization_configr   r4   Ú
get_loggerrˆ   r.   r   r€   r"   r!   ú<module>rœ      s[   ðó ß B× Bå å Ý 2ñ Ý0÷ó õ 5ñ ÔÛà	ˆ×	Ñ	˜HÓ	%€ô`˜õ `r"   