§
    Þ˜ºhß  ã                   ó²   — d dl mZmZ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 )é    )ÚTYPE_CHECKINGÚAnyÚOptionalé   )ÚHfQuantizeré   )ÚPreTrainedModel)Úis_accelerate_availableÚis_eetq_availableÚis_torch_availableÚlogging)Úget_module_from_nameNc                   ó  ‡ — e Zd ZdZdZdZddgZˆ fd„Zd„ Zdd„Z	ddddde
dee
ef         fd„Z	 dddddde
dddee
ef         deee
                  fd„Zdd„Z	 ddddeee
                  fd„Zdd„Zed
efd„¦   «         Zˆ xZS ) ÚEetqHfQuantizera  
    8-bit quantization from EETQ quantization method:
        before loading: converts transformer layers into W8A16Linear during loading: load 16bit weight and pass to the
        layer object after: quantizes individual weights in Linear8bitLt into 8bit at first .cuda() call
    TFÚeetqÚ
acceleratec                 óJ   •—  t          ¦   «         j        |fi |¤Ž || _        d S ©N)ÚsuperÚ__init__Úquantization_config)Úselfr   ÚkwargsÚ	__class__s      €ún/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/transformers/quantizers/quantizer_eetq.pyr   zEetqHfQuantizer.__init__-   s1   ø€ Ø�‰ŒÔÐ,Ð7Ð7°Ð7Ð7Ð7Ø#6ˆÔ Ð Ð ó    c                 óÐ  — t          ¦   «         st          d¦  «        ‚	 dd l}n4# t          $ r'}dt          |¦  «        v rt          d¦  «        |‚‚ d }~ww xY wt	          ¦   «         st          d¦  «        ‚|                     dd¦  «        s|                     dd¦  «        rt          d	¦  «        ‚t          j         	                    ¦   «         st          d
¦  «        ‚|                     d¦  «        }|€t                               d¦  «         d S |�Pt          |t          ¦  «        r=d|                     ¦   «         v sd|                     ¦   «         v rt          d¦  «        ‚d S d S d S )NzƒUsing `eetq` 8-bit quantization requires eetq.Please install the latest version of eetq from : https://github.com/NetEase-FuXi/EETQr   Úshard_checkpointz³You are using a version of EETQ that is incompatible with the current transformers version. Either downgrade transformers to <= v4.46.3 or, if available, upgrade EETQ to > v1.0.0.zNLoading an EETQ quantized model requires accelerate (`pip install accelerate`)Úfrom_tfFÚ	from_flaxz‚Converting into 8-bit weights from tf/flax weights is currently not supported, please make sure the weights are in PyTorch format.z/No GPU found. A GPU is needed for quantization.Ú
device_mapzŽYou have loaded an EETQ model on CPU and have a CUDA device available, make sure to set your model on a GPU device in order to run your model.ÚcpuÚdiskz¯You are attempting to load an EETQ 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   ÚImportErrorr   Ústrr
   ÚgetÚ
ValueErrorÚtorchÚcudaÚis_availableÚRuntimeErrorÚloggerÚwarning_onceÚ
isinstanceÚdictÚvalues)r   Úargsr   r   Úexcr!   s         r   Úvalidate_environmentz$EetqHfQuantizer.validate_environment1   sÍ  € Ý Ñ"Ô"ð 	Ýðhñô ð ð
	ØˆKˆKˆKˆKøÝð 
	ð 
	ð 
	Ø!¥S¨¡X¤XÐ-Ð-õ "ðnñô ð ðð
 øøøøð
	øøøõ 'Ñ(Ô(ð 	pÝÐnÑoÔoÐoà�:Š:�i Ñ'Ô'ð 	¨6¯:ª:°kÀ5Ñ+IÔ+Ið 	Ýð;ñô ð õ
 Œz×&Ò&Ñ(Ô(ð 	RÝÐPÑQÔQÐQà—Z’Z Ñ-Ô-ˆ
ØÐÝ×ÒðIñô ð ð ð ð Ð#Ý˜*¥dÑ+Ô+ð °¸*×:KÒ:KÑ:MÔ:MÐ1MÐ1MÐQWÐ[e×[lÒ[lÑ[nÔ[nÐQnÐQnÝ ðhñô ð ð $Ð#ðð ÐQnÐQns   Ÿ$ ¤
A®"AÁAÚdtypeútorch.dtypeÚreturnc                 ó®   — |€(t           j        }t                               d|¦  «         n*|t           j        k    rt                               d¦  «         |S )NzîOverriding dtype=%s with `dtype=torch.float16` due to requirements of `eetq` to enable model loading in 8-bit. Pass your own dtype to specify the dtype of the remaining non-linear layers or pass dtype=torch.float16 to remove this warning.zLWe suggest you to set `dtype=torch.float16` for better efficiency with EETQ.)r(   Úfloat16r,   Úinfo)r   r4   s     r   Úupdate_dtypezEetqHfQuantizer.update_dtype_   sZ   € Øˆ=Ý”MˆEÝ�KŠKð?ð ñô ð ð ð •e”mÒ#Ð#Ý�KŠKÐfÑgÔgÐgØˆr   Úmodelr	   Úparam_valueztorch.TensorÚ
param_nameÚ
state_dictc                 óø   — ddl m} t          ||¦  «        \  }}t          ||¦  «        rP| j        s|dk    r,|dk    r$|j        t          j        k    rt          d¦  «        ‚dS |dk    rt          d¦  «        ‚d	S dS )
Nr   )Ú
EetqLinearÚbiasÚweightz6Expect quantized weights but got an unquantized weightFÚweight_scalez;Expect unquantized weights but got a quantized weight_scaleT)	r   r@   r   r.   Úpre_quantizedr4   r(   Úint8r'   )	r   r;   r<   r=   r>   r   r@   ÚmoduleÚtensor_names	            r   Úcheck_quantized_paramz%EetqHfQuantizer.check_quantized_paramm   s£   € ð 	$Ð#Ð#Ð#Ð#Ð#å2°5¸*ÑEÔEÑˆ�å�f˜jÑ)Ô)ð 	ØÔ!ð  [°FÒ%:Ð%:Ø (Ò*Ð*¨{Ô/@ÅEÄJÒ/NÐ/NÝ$Ð%]Ñ^Ô^Ð^Ø�uà .Ò0Ð0Ý$Ð%bÑcÔcÐcØ�tØˆur   NÚtarget_deviceztorch.deviceÚunexpected_keysc                 óà   — ddl m} t          ||¦  «        \  }}	 ||¦  «        \  }
}|
                     |¦  «        |j        |	<   |                     d|                     |¦  «        ¦  «         dS )zB
        quantizes weights into qweight and weight_scales
        r   )Úquantize_and_preprocess_weightsÚweight_scalesN)r   rL   r   ÚtoÚ_buffersÚregister)r   r;   r<   r=   rI   r>   rJ   rL   rF   rG   Ú	new_valuerC   s               r   Úcreate_quantized_paramz&EetqHfQuantizer.create_quantized_param„   s}   € ð 	9Ð8Ð8Ð8Ð8Ð8å2°5¸*ÑEÔEÑˆ�Ø"AÐ"AÀ+Ñ"NÔ"NÑˆ	�<à'0§|¢|°MÑ'BÔ'BˆŒ˜Ñ$Ø�Š˜¨¯ª¸Ñ)GÔ)GÑHÔHÐHÐHÐHr   c                 ó   — |S r   © )r   r;   r   s      r   Ú#_process_model_after_weight_loadingz3EetqHfQuantizer._process_model_after_weight_loading˜   s   € Øˆr   Úkeep_in_fp32_modulesc                 ó¼   — ddl m} |                      || j        j        |¦  «        | _         ||| j        | j        | j        ¬¦  «        }| j        |j        _        d S )Nr   )Úreplace_with_eetq_linear)Úmodules_to_not_convertr   rD   )ÚintegrationsrX   Úget_modules_to_not_convertr   rY   rD   Úconfig)r   r;   rV   r   rX   s        r   Ú$_process_model_before_weight_loadingz4EetqHfQuantizer._process_model_before_weight_loading›   s   € ð 	<Ð;Ð;Ð;Ð;Ð;à&*×&EÒ&EØ�4Ô+ÔBÐDXñ'
ô '
ˆÔ#ð )Ð(ØØ#'Ô#>Ø $Ô 8ØÔ,ð	
ñ 
ô 
ˆð ,0Ô+CˆŒÔ(Ð(Ð(r   c                 ó   — dS ©NTrT   )r   Úsafe_serializations     r   Úis_serializablezEetqHfQuantizer.is_serializable°   s   € Øˆtr   c                 ó   — dS r_   rT   )r   s    r   Úis_trainablezEetqHfQuantizer.is_trainable³   s   € àˆtr   )r4   r5   r6   r5   r   )r;   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú requires_parameters_quantizationÚrequires_calibrationÚrequired_packagesr   r3   r:   r%   r/   r   rH   r   ÚlistrR   rU   r]   ra   ÚpropertyÚboolrc   Ú__classcell__)r   s   @r   r   r   !   sÄ  ø€ € € € € ðð ð (,Ð$Ø Ðà Ð.Ðð7ð 7ð 7ð 7ð 7ð,ð ,ð ,ð\ð ð ð ðà ðð $ðð ð	ð
 ˜˜c˜”Nðð ð ð ð< 04ðIð Ià ðIð $ðIð ð	Ið
 &ðIð ˜˜c˜”NðIð " $ s¤)Ô,ðIð Ið Ið Ið(ð ð ð ð 59ðDð Dà ðDð ' t¨C¤yÔ1ðDð Dð Dð Dð*ð ð ð ð ð˜dð ð ð ñ „Xðð ð ð ð r   r   )Útypingr   r   r   Úbaser   Úmodeling_utilsr	   Úutilsr
   r   r   r   Úquantizers_utilsr   r(   Ú
get_loggerrd   r,   r   rT   r   r   ú<module>ru      s÷   ðð 0Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à Ð Ð Ð Ð Ð ð ð 1Ø0Ð0Ð0Ð0Ð0Ð0à [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð ÐÑÔð Ø€L€L€Lð 
ˆÔ	˜HÑ	%Ô	%€ðTð Tð Tð Tð T�kñ Tô Tð Tð Tð Tr   