
     `iU                          d dl 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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Optional   )tqdm   )HfQuantizer)get_module_from_name)PreTrainedModel)is_accelerate_availableis_flute_availableis_hadamard_availableis_torch_availablelogging)QuantizationConfigMixinNc                        e Zd ZdZdZdZddgZdef fdZd Z	d dZ
dddddeddfdZ	 d!dddeee                  fdZd"dZdee         dedee         fdZedefd            Zd!dZdddedefdZd Z xZS )#HiggsHfQuantizerz
    Quantizer of the HIGGS method. Enables the loading of prequantized models and in-flight quantization of full-precision models.
    FTzflute-kernelfast_hadamard_transformquantization_configc                 J     t                      j        |fi | || _        d S N)super__init__r   )selfr   kwargs	__class__s      {/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/transformers/quantizers/quantizer_higgs.pyr   zHiggsHfQuantizer.__init__+   s1    ,77777#6       c                    t           j                                        st          d          t	                      st          d          t                      st          d          t                      st          d          |t          d          t          |t                    r;d|                                v sd|                                v rt          d          d S d S )	NzNHIGGS quantization is only supported on GPU. Please use a different quantizer.zHUsing `higgs` quantization requires Accelerate: `pip install accelerate`zLUsing `higgs` quantization requires FLUTE: `pip install flute-kernel>=0.3.0`zbUsing `higgs` quantization requires fast_hadamard_transform: `pip install fast_hadamard_transform`zwYou are attempting to load a HIGGS model without setting device_map. Please set device_map comprised of 'cuda' devices.cpudiskzYou are attempting to load a HIGGS 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.)torchcudais_availableNotImplementedErrorr   ImportErrorr   r   
ValueError
isinstancedictvalues)r   
device_mapr   s      r   validate_environmentz%HiggsHfQuantizer.validate_environment/   s   z&&(( 	x%&vwww&(( 	jhiii!## 	nlmmm$&& 	t   F   
D)) 	u
8I8I8K8K/K/KvYcYjYjYlYlOlOld  	 	OlOlr   dtypetorch.dtypereturnc                     |'t                               d           t          j        }n3|t          j        k    r#|t          j        k    rt          d| d          |S )NzG`dtype` is None. Setting `dtype=torch.float16` for FLUTE compatibility.zInvalid `dtype` zS. HIGGS quantization only supports `dtype=torch.float16` or `dtype=torch.bfloat16`.)loggerinfor!   float16bfloat16r&   )r   r,   s     r   update_dtypezHiggsHfQuantizer.update_dtypeI   sc    =KKabbbMEEem##(?(?}5}}}   r   modelr
   param_valueztorch.Tensor
param_nametarget_deviceztorch.devicec                    ddl m}  ||                    |          | j        j        | j        j        | j        j        | j        j                  }~t          ||          \  }}	d	                    |
                    d          d d                   }
|                                D ]\  }}||j        v r*t          j                            |d          |j        |<   8||j        v r(t          j                            |          |j        |<   i|dk    r)||_        |                                | j        j        |
<   t)          d| d	|           d S )
Nr   )quantize_with_higgs.F)requires_gradtune_metadatazUnexpected key z in module )integrationsr:   tor   bitsp
group_sizehadamard_sizer	   joinsplititems_parametersr!   nn	Parameter_buffersBufferr>   to_dictr&   )r   r5   r6   r7   r8   r   r:   
flute_dictmodule_module_namekeyvalues                r   create_quantized_paramz'HiggsHfQuantizer.create_quantized_paramT   ss    	766666((NN=))$)$&$/$2
 

 (
;;	hhz//44SbS9::$**,, 		M 		MJCf(((*/(*<*<URW*<*X*X"3''''',xu'='=$$''',$FKmmoo(6{CC !K3!K!K6!K!KLLL		M 		Mr   Nkeep_in_fp32_modulesc                     ddl m} |                     || j        j        |          | _         ||| j        | j                   | j        |j        _        d S )Nr   )replace_with_higgs_linear)r   modules_to_not_convert)r?   rW   get_modules_to_not_convertr   rX   config)r   r5   rU   r   rW   s        r   $_process_model_before_weight_loadingz5HiggsHfQuantizer._process_model_before_weight_loadingt   s|     	=<<<<<&*&E&E4+BDX'
 '
# 	"! $ 8#'#>	
 	
 	
 	

 ,0+C(((r   c                 j  
 ddl m}m} ddlm} ddlm
 i }
fd|                                D             }t          |	                                dd	          D ]\  }}	|	j
        j        |vr# ||	j
        j        
          ||	j
        j        <   ||	j
        j                 |	_        |                    | j        j        |                   |	_         ||	j
        j        |	j        j        |	j                  \  |	j
        _        |	_        |	j                                        | j        j        |<   d S )Nr   )TuneMetaDatamaybe_tune_and_repack)make_workspace_streamkr   HiggsLinearc                 <    i | ]\  }}t          |          ||S  r'   .0namerO   ra   s      r   
<dictcomp>zHHiggsHfQuantizer._process_model_after_weight_loading.<locals>.<dictcomp>   s1    sss,$S]^dfqSrSrsvsssr   zRepacking HIGGS modulesF)descleave)device)weightscalesmetadata)
flute.tuner]   r^   flute.utilsr_   r?   ra   named_modulesr   rG   rl   rk   	workspace	from_dictr   r>   datarm   rM   )r   r5   r   r]   r^   r_   flute_workspacesflute_modulesrg   rO   ra   s             @r   #_process_model_after_weight_loadingz4HiggsHfQuantizer._process_model_after_weight_loading   su   BBBBBBBB666666......ssss%:M:M:O:Osss !4!4!6!6=V^cddd 	Z 	ZLD& }#+;;;9O9OW]WdWk9l9l9l !56/0DEF $0#9#9$:R:`ae:f#g#gF 7L7L})})-8 8 84FM 4
 <B;O;W;W;Y;YD$2488	Z 	Zr   missing_keysprefixc                     ddl m fd|                                D             dt          dt          ffdfd|D             S )Nr   r`   c                 :    h | ]\  }}t          |          |S rc   rd   re   s      r   	<setcomp>z7HiggsHfQuantizer.update_missing_keys.<locals>.<setcomp>   s.    iiifTZ\gIhIhitiiir   rR   r.   c                                            d          s                      d          rdS  d  t           fdD                       S )Nz.weightz.biasFr;   c              3   (   K   | ]}|v p|v V  d S r   rc   )rf   rg   full_keyrR   s     r   	<genexpr>zNHiggsHfQuantizer.update_missing_keys.<locals>.should_update.<locals>.<genexpr>   s1      OO4ts{6dh&6OOOOOOr   )endswithany)rR   r   higgs_namesry   s   `@r   should_updatez;HiggsHfQuantizer.update_missing_keys.<locals>.should_update   sj    ||I&& #,,w*?*? u ((3((HOOOOO;OOOOOOr   c                 *    g | ]} |          |S rc   rc   )rf   rR   r   s     r   
<listcomp>z8HiggsHfQuantizer.update_missing_keys.<locals>.<listcomp>   s(    FFF==3E3EFFFFr   )r?   ra   rq   strbool)r   r5   rx   ry   ra   r   r   s      `@@@r   update_missing_keysz$HiggsHfQuantizer.update_missing_keys   s    ......iiii0C0C0E0Eiii	Ps 	Pt 	P 	P 	P 	P 	P 	P 	P GFFF|FFFFr   c                     dS )NFrc   )r   s    r   is_trainablezHiggsHfQuantizer.is_trainable   s    ur   c                     dS )NTrc   )r   safe_serializations     r   is_serializablez HiggsHfQuantizer.is_serializable   s    tr   c                 h    ddl m} t          ||          \  }}t          ||          r|dk    rdS dS )Nr   r`   rl   TF)r?   ra   r	   r'   )r   r5   r7   r   ra   rO   tensor_names          r   param_needs_quantizationz)HiggsHfQuantizer.param_needs_quantization   sN    ......25*EEfk** 	{h/F/F45r   c                 (    ddl m}  ||          }|S )Nr   )dequantize_higgs)r?   r   )r   r5   r   s      r   _dequantizezHiggsHfQuantizer._dequantize   s)    333333  ''r   )r,   r-   r.   r-   r   )r5   r
   )__name__
__module____qualname____doc__requires_calibration requires_parameters_quantizationrequired_packagesr   r   r+   r4   r   rT   r   listr[   rw   r   propertyr   r   r   r   r   __classcell__)r   s   @r   r   r   "   s         !'+$')BC7,C 7 7 7 7 7 7  4	 	 	 	M M $M 	M
 &M M M MF 59D D D 'tCy1D D D D&Z Z Z Z2GtCy G# GRVWZR[ G G G G d    X   .? S _c          r   r   )typingr   r   utils.loggingr   baser   quantizers_utilsr	   modeling_utilsr
   utilsr   r   r   r   r   utils.quantization_configr   r!   
get_loggerr   r0   r   rc   r   r   <module>r      s   + * * * * * * *                   2 2 2 2 2 2  1000000 s s s s s s s s s s s s s s ? ? ? ? ? ?  LLL		H	%	%` ` ` ` `{ ` ` ` ` `r   