
    @Kiz                         S SK JrJr  SSKJr  \(       a  SSKJr  SSKJrJ	r	J
r
Jr  SSKJr  \
" 5       (       a  S SKr\R                  " \5      r " S	 S
\5      rg)    )TYPE_CHECKINGOptional   )HfQuantizer   )PreTrainedModel)is_accelerate_availableis_eetq_availableis_torch_availablelogging)get_module_from_nameNc                      ^  \ rS rSrSrSrSrSS/rU 4S jrS r	SS
 jr
SSS\S	\4S jrSSSSS\SS4S jrSS jr SSSS\\\      4S jjrSS jr\S	\4S j5       rSrU =r$ )EetqHfQuantizer!   a  
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                 4   > [         TU ]  " U40 UD6  Xl        g N)super__init__quantization_config)selfr   kwargs	__class__s      h/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/transformers/quantizers/quantizer_eetq.pyr   EetqHfQuantizer.__init__-   s    ,77#6     c                    [        5       (       d  [        S5      e SS Kn[	        5       (       d  [        S5      eUR                  SS5      (       d  UR                  SS5      (       a  [        S	5      e[        R                  R                  5       (       d  [        S
5      eUR                  S5      nUc  [        R                  S5        g UbJ  [        U[        5      (       a4  SUR                  5       ;   d  SUR                  5       ;   a  [        S5      eg g g ! [         a!  nS[        U5      ;   a  [        S5      Uee S nAff = f)NzUsing `eetq` 8-bit quantization requires eetq.Please install the latest version of eetq from : https://github.com/NetEase-FuXi/EETQr   shard_checkpointzYou 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_flaxzConverting 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_mapzYou 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diskzYou 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_environment$EetqHfQuantizer.validate_environment1   sO    ""h 
	 '((noo::i''6::k5+I+I; 
 zz&&((PQQZZ-
I #*d++*:K:K:M1MQW[e[l[l[nQn h  Ro+ $=  
	!SX- "n 
 
	s   D 
E#D??Ereturnc                     Uc(  [         R                  n[        R                  SU5        U$ U[         R                  :w  a  [        R                  S5        U$ )NzOverriding 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   dtypes     r   update_dtypeEetqHfQuantizer.update_dtype_   sM    =MMEKK?   emm#KKfgr   modelr   
param_namec                 |    SSK Jn  [        X5      u  pV[        XT5      (       a  U R                  (       d  US:X  a  ggg)Nr   )
EetqLinearbiasFT)r   r@   r   r/   pre_quantized)r   r=   r>   r   r@   moduletensor_names          r   param_needs_quantization(EetqHfQuantizer.param_needs_quantizationm   s6    #25Ef))!![F%:r   param_valueztorch.Tensortarget_deviceztorch.devicec                    SSK JnJn  [        X5      u  pU" U5      u  p[	        X5      (       aX  U R
                  (       d  U	S:X  a0  U	S:X  a)  UR                  [        R                  :w  a  [        S5      eOU	S:X  a  [        S5      eU
R                  U5      UR                  U	'   UR                  SUR                  U5      5        g )	Nr   )r@   quantize_and_preprocess_weightsrA   weightz6Expect quantized weights but got an unquantized weightweight_scalez;Expect unquantized weights but got a quantized weight_scaleweight_scales)r   r@   rJ   r   r/   rB   r:   r)   int8r(   to_buffersregister)r   r=   rG   r>   rH   r   r@   rJ   rC   rD   	new_valuerL   s               r   create_quantized_param&EetqHfQuantizer.create_quantized_paramy   s     	E25E"A+"N	 f))!![F%:(*{/@/@EJJ/N$%]^^.0$%bcc'0||M'B$)GHr   c                     U$ r    )r   r=   r   s      r   #_process_model_after_weight_loading3EetqHfQuantizer._process_model_after_weight_loading   s    r   keep_in_fp32_modulesc                     SSK Jn  U R                  XR                  R                  U5      U l        U" UU R                  U R                  U R
                  S9nU R                  UR                  l        g )Nr   )replace_with_eetq_linear)modules_to_not_convertr   rB   )integrationsr[   get_modules_to_not_convertr   r\   rB   config)r   r=   rY   r   r[   s        r   $_process_model_before_weight_loading4EetqHfQuantizer._process_model_before_weight_loading   sj     	<&*&E&E++BBDX'
# )#'#>#> $ 8 8,,	
 ,0+C+C(r   c                     gNTrV   )r   safe_serializations     r   is_serializableEetqHfQuantizer.is_serializable   s    r   c                     grc   rV   )r   s    r   is_trainableEetqHfQuantizer.is_trainable   s    r   )r\   r   )r:   torch.dtyper6   rj   )r=   r   r   )__name__
__module____qualname____firstlineno____doc__ requires_parameters_quantizationrequires_calibrationrequired_packagesr   r4   r;   r&   boolrE   rS   rW   r   listr`   re   propertyrh   __static_attributes____classcell__)r   s   @r   r   r   !   s     (,$ .7,\
.? 
S 
_c 
I I $I 	I
 &I2 59D D 'tCy1D* d  r   r   )typingr   r   baser   modeling_utilsr   utilsr	   r
   r   r   quantizers_utilsr   r)   
get_loggerrk   r-   r   rV   r   r   <module>r~      sL    +  0 [ [ 2  
		H	%Nk Nr   