§
    Þ˜ºhÀ  ã                   óÖ   — d dl Z d dl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j        e¦  «        Z G d„ de	¦  «        ZdS )é    N)ÚTYPE_CHECKINGÚAnyÚOptionalÚUnion)Úversioné   )ÚHfQuantizer)Úget_module_from_nameé   )ÚPreTrainedModel)Úis_accelerate_availableÚis_optimum_quanto_availableÚis_torch_availableÚlogging)ÚQuantoConfigc            
       óp  ‡ — 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efd$„¦   «         Zd(d%„Zˆ xZS ))ÚQuantoHfQuantizerz*
    Quantizer for the quanto library
    ÚquantoÚ
accelerateTFÚquantization_configc                 ód   •—  t          ¦   «         j        |fi |¤Ž |                      ¦   «          d S ©N)ÚsuperÚ__init__Ú	post_init)Úselfr   ÚkwargsÚ	__class__s      €úp/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/transformers/quantizers/quantizer_quanto.pyr   zQuantoHfQuantizer.__init__2   s9   ø€ Ø�‰ŒÔÐ,Ð7Ð7°Ð7Ð7Ð7Ø�ŠÑÔÐÐÐó    c                 óN   — | j         j        �| j        st          d¦  «        ‚dS dS )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Ð;ÝðOñô ð ð <Ð;Ð;Ð;r    c                 óz   — t          ¦   «         st          d¦  «        ‚t          ¦   «         st          d¦  «        ‚d S )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@   sT   € Ý*Ñ,Ô,ð 	ÝØzñô ð õ 'Ñ(Ô(ð 	ÝØrñô ð ð	ð 	r    c                 óF   — |€ddi}t                                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   s5   € ØÐØ˜e˜ˆJÝ�KŠKð\ñô ð ð
 Ðr    Údtypeútorch.dtypeÚreturnc                 óV   — |€&t                                d¦  «         t          j        }|S )NzPYou did not specify `dtype` in `from_pretrained`. Setting it to `torch.float32`.)r-   r.   ÚtorchÚfloat32)r   r1   s     r   Úupdate_dtypezQuantoHfQuantizer.update_dtypeT   s&   € Øˆ=Ý�KŠKÐjÑkÔkÐkÝ”MˆEØˆr    Úmissing_keysÚprefixc                 óB  ‡— t          ¦   «         rddlm} g Š|                     ¦   «         D ]f\  }}t	          ||¦  «        rQ|D ]N}||v s	||› d|› �v r?|                     d¦  «        s*|                     d¦  «        s‰                     |¦  «         ŒOŒgˆfd„|D ¦   «         S )Nr   ©ÚQModuleMixinú.z.weightz.biasc                 ó   •— g | ]}|‰v¯|‘Œ	S © r?   )Ú.0ÚkÚnot_missing_keyss     €r   ú
<listcomp>z9QuantoHfQuantizer.update_missing_keys.<locals>.<listcomp>h   s$   ø€ ÐEÐEÐE�a¨1Ð4DÐ+DÐ+D�Ð+DÐ+DÐ+Dr    )r   Úoptimum.quantor<   Únamed_modulesÚ
isinstanceÚendswithÚappend)	r   Úmodelr8   r9   r<   ÚnameÚmoduleÚmissingrB   s	           @r   Úupdate_missing_keysz%QuantoHfQuantizer.update_missing_keysZ   sê   ø€ Ý&Ñ(Ô(ð 	4Ø3Ð3Ð3Ð3Ð3Ð3àÐØ!×/Ò/Ñ1Ô1ð 	9ð 	9‰LˆD�&Ý˜& ,Ñ/Ô/ð 9Ø+ð 9ð 9�Gà ˜˜¨D°vÐ4IÐ4IÀÐ4IÐ4IÐ,IÐ,IØ '× 0Ò 0°Ñ ;Ô ;ð -Jà '× 0Ò 0°Ñ 9Ô 9ð -Jð )×/Ò/°Ñ8Ô8Ð8øøØEÐEÐEÐE˜<ÐEÑEÔEÐEr    rI   r   Úparam_valueztorch.TensorÚ
param_nameÚ
state_dictc                 ó~  — t          ¦   «         rddlm} |                     d¦  «        }|                     d¦  «        }|�M|�Kt	          |                     ¦   «         ¦  «        }	|dk    r$t          |	¦  «        dk    r|	dhk    s
|	ddhk    sd	S t          ||¦  «        \  }
}t          |
|¦  «        rd
|v r|
j	         S d	S )z=
        Check if a parameter needs to be quantized.
        r   r;   r/   Úparam_deviceNr,   r   ÚdiskFÚweight)
r   rD   r<   ÚgetÚsetÚvaluesÚlenr
   rF   Úfrozen)r   rI   rN   rO   rP   r   r<   r/   rR   Údevice_map_valuesrK   Útensor_names               r   Úcheck_quantized_paramz'QuantoHfQuantizer.check_quantized_paramj   së   € õ 'Ñ(Ô(ð 	4Ø3Ð3Ð3Ð3Ð3Ð3à—Z’Z Ñ-Ô-ˆ
Ø—z’z .Ñ1Ô1ˆàÐ! lÐ&>Ý # J×$5Ò$5Ñ$7Ô$7Ñ 8Ô 8ÐØ˜uÒ$Ð$­Ð->Ñ)?Ô)?À!Ò)CÐ)CØ)¨e¨WÒ4Ð4Ð8IÈeÐU[È_Ò8\Ð8\Ø ˜5å2°5¸*ÑEÔEÑˆ�å�f˜lÑ+Ô+ð 	°¸KÐ0GÐ0Gà”}Ð$Ð$à�5r    Ú
max_memoryc                 óB   — d„ |                      ¦   «         D ¦   «         }|S )Nc                 ó    — i | ]\  }}||d z  “ŒS )gÍÌÌÌÌÌì?r?   )r@   ÚkeyÚvals      r   ú
<dictcomp>z7QuantoHfQuantizer.adjust_max_memory.<locals>.<dictcomp>Š   s"   € ÐIÐIÐI©(¨#¨s�c˜3 ™:ÐIÐIÐIr    )Úitems)r   r]   s     r   Úadjust_max_memoryz#QuantoHfQuantizer.adjust_max_memory‰   s'   € ØIÐI°j×6FÒ6FÑ6HÔ6HÐIÑIÔIˆ
ØÐr    Útarget_deviceztorch.devicec                 ó”   — ddl m}  |||||¦  «         t          ||¦  «        \  }}	|                     ¦   «          d|j        _        dS )ze
        Create the quantized parameter by calling .freeze() after setting it to the module.
        r   )Úset_module_tensor_to_deviceFN)Úaccelerate.utilsrg   r
   ÚfreezerT   Úrequires_grad)
r   rI   rN   rO   re   r(   r   rg   rK   Ú_s
             r   Úcreate_quantized_paramz(QuantoHfQuantizer.create_quantized_param�   s^   € ð 	AÐ@Ð@Ð@Ð@Ð@à#Ð# E¨:°}ÀkÑRÔRÐRÝ(¨°
Ñ;Ô;‰	ˆ�Ø�Š‰ŒˆØ&+ˆŒÔ#Ð#Ð#r    Útarget_dtypec                 ó"  — t          j        t          j                              d¦  «        ¦  «        t          j        d¦  «        k    r:d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Úmetadatarh   ro   r5   rp   ÚFP8ÚINT4ÚINT2r   Úweightsr$   )r   rm   ro   Úmappings       r   Úadjust_target_dtypez%QuantoHfQuantizer.adjust_target_dtype    s™   € ÝŒ=�Ô+×3Ò3°LÑAÔAÑBÔBÅWÄ]ÐS[ÑE\ÔE\Ò\Ð\Ø4Ð4Ð4Ð4Ð4Ð4õ œ
Ø%œ/Ø#Ô(Ø#Ô(ð	ð ˆGð # 4Ô#;Ô#CÔDˆLØÐåðPñô ð r    NÚkeep_in_fp32_modulesc                 ó¶   — ddl m} |                      || j        j        |¦  «        | _         ||| j        | j        ¬¦  «        \  }}| j        |j        _        d S )Nr   )Úreplace_with_quanto_layers)Úmodules_to_not_convertr   )Úintegrationsr   Úget_modules_to_not_convertr   r€   Úconfig)r   rI   r}   r   r   rk   s         r   Ú$_process_model_before_weight_loadingz6QuantoHfQuantizer._process_model_before_weight_loading³   s|   € ð 	>Ð=Ð=Ð=Ð=Ð=à&*×&EÒ&EØ�4Ô+ÔBÐDXñ'
ô '
ˆÔ#ð .Ð-Ø¨$Ô*EÐ[_Ô[sð
ñ 
ô 
‰ˆˆqð ,0Ô+CˆŒÔ(Ð(Ð(r    c                 ó   — |S r   r?   )r   rI   r   s      r   Ú#_process_model_after_weight_loadingz5QuantoHfQuantizer._process_model_after_weight_loadingÁ   s   € Øˆr    c                 ó   — dS )NTr?   r%   s    r   Úis_trainablezQuantoHfQuantizer.is_trainableÄ   s   € àˆtr    c                 ó   — dS )NFr?   )r   Úsafe_serializations     r   Úis_serializablez!QuantoHfQuantizer.is_serializableÈ   s   € Øˆur    )r1   r2   r3   r2   )rm   r2   r3   r2   r   ) Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequired_packagesÚ requires_parameters_quantizationÚrequires_calibrationr   r   r   r)   r0   r7   ÚlistÚstrrM   Údictr   Úboolr\   r   Úintrd   rl   r|   r   r„   r†   Úpropertyrˆ   r‹   Ú__classcell__)r   s   @r   r   r   )   sS  ø€ € € € € ðð ð " <Ð0ÐØ'+Ð$Ø Ðð¨Lð ð ð ð ð ð ðð ð ðð ð ðð ð ðð ð ð ðF°t¸C´yð FÈ#ð FÐRVÐWZÔR[ð Fð Fð Fð Fð à ðð $ðð ð	ð
 ˜˜c˜”Nðð 
ðð ð ð ð>¨D°°e¸CÀ¸H´oÐ1EÔ,Fð È4ÐPSÐUZÐ[^Ð`cÐ[cÔUdÐPdÔKeð ð ð ð ð,à ð,ð $ð,ð ð	,ð
 &ð,ð ,ð ,ð ,ð&ð ð ð ð( UYðDð DØ&ðDØ>FÀtÈCÄyÔ>QðDð Dð Dð Dðð ð ð ð˜dð ð ð ñ „Xððð ð ð ð ð ð ð r    r   )ru   Útypingr   r   r   r   Ú	packagingr   Úbaser	   Úquantizers_utilsr
   Úmodeling_utilsr   Úutilsr   r   r   r   Úutils.quantization_configr   r5   Ú
get_loggerrŒ   r-   r   r?   r    r   ú<module>r¢      sE  ðð Ð Ð Ð Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6à Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð ð 1Ø0Ð0Ð0Ð0Ð0Ð0ðð ð ð ð ð ð ð ð ð ð ð ð 5Ð 4Ð 4Ð 4Ð 4Ð 4ð ÐÑÔð Ø€L€L€Là	ˆÔ	˜HÑ	%Ô	%€ð`ð `ð `ð `ð `˜ñ `ô `ð `ð `ð `r    