Ë
    Hêñi0  ã                   óˆ   — d dl 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 dd	lmZ  e«       rd d
lZ G d„ de«      Zy
)é    )ÚTYPE_CHECKINGé   )Úis_fouroversix_availableé   )ÚHfQuantizer)Úget_module_from_name)ÚPreTrainedModel)ÚFourOverSixConfig)Úis_torch_availableNc                   ó¤   ‡ — e Zd ZU dZdZded<   ˆ fd„Zd„ Zddd	ed
dde	fˆ fd„Z
ddd	edefd„Z	 	 dd„Zdd„Zd„ Zedefd„«       Zd„ Zd„ Zˆ xZS )ÚFourOverSixHfQuantizerz,
    FP4 quantization with fouroversix.
    Fr
   Úquantization_configc                 ó&   •— t        ‰| �  |fi |¤Ž y ©N)ÚsuperÚ__init__)Úselfr   ÚkwargsÚ	__class__s      €úo/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/transformers/quantizers/quantizer_fouroversix.pyr   zFourOverSixHfQuantizer.__init__   s   ø€ Ü‰ÑÐ,Ñ7°Ó7ó    c                 ó.   — t        «       st        d«      ‚y )NzXUsing `fouroversix` requires fouroversix: `pip install fouroversix --no-build-isolation`)r   ÚImportError)r   Úargsr   s      r   Úvalidate_environmentz+FourOverSixHfQuantizer.validate_environment    s   € Ü'Ô)ÜØjóð ð *r   Úmodelr	   Ú
param_nameÚparamztorch.TensorÚreturnc                 ó¦   •— ddl m} t        ||«      \  }}|j                  t	        |«      «      r|j                  |«      S t        ‰| �  |||«      S ©Nr   )ÚQuantizedModule)Úfouroversixr"   r   Úis_quantized_module_typeÚtypeÚget_element_sizer   Úparam_element_size)r   r   r   r   r"   ÚmoduleÚtensor_namer   s          €r   r'   z)FourOverSixHfQuantizer.param_element_size&   sP   ø€ õ 	0ä2°5¸*ÓEÑˆ�à×3Ñ3´D¸³LÔAØ×*Ñ*¨;Ó7Ð7ä‰wÑ)¨%°¸UÓCÐCr   c                 ó€   — ddl m} t        ||«      \  }}|j                  t	        |«      «      xr ||j
                  v S r!   )r#   r"   r   r$   r%   Úparameters_to_quantize)r   r   r   r   r"   r(   r)   s          r   Úparam_needs_quantizationz/FourOverSixHfQuantizer.param_needs_quantization5   s>   € õ 	0ä2°5¸*ÓEÑˆ�à×7Ñ7¼¸V»ÓEÒvÈ+ÐY_×YvÑYvÐJvÐvr   c                 ó:  — ddl m}m} ddlm}  || || j
                  «      «       | j                  rh| j
                  j                  sQ|j                  «       D ]=  \  }}|j                  t        |«      «      sŒ!|j                  D ]  }	t        ||	«       Œ Œ? y y y )Nr   )r"   Úquantize_modelr   )Úadapt_fouroversix_config)r#   r"   r.   Úintegrations.fouroversixr/   r   Úpre_quantizedÚkeep_master_weightsÚnamed_modulesr$   r%   r+   Údelattr)
r   r   Ú
device_mapr   r"   r.   r/   Ú_r(   Úparameter_names
             r   Ú$_process_model_before_weight_loadingz;FourOverSixHfQuantizer._process_model_before_weight_loadingA   s“   € ÷ 	@åGáØÙ$ T×%=Ñ%=Ó>ô	
ð ×Ò d×&>Ñ&>×&RÒ&RØ"×0Ñ0Ó2ò 8‘	��6Ø"×;Ñ;¼DÀ»LÕIØ*0×*GÑ*Gò 8˜Ü ¨Õ7ñ8ñ8ð 'SÐr   c                 ó   — |S r   © )r   r   r   s      r   Ú#_process_model_after_weight_loadingz:FourOverSixHfQuantizer._process_model_after_weight_loadingX   s   € Øˆr   c                  ó   — y)NTr:   ©r   s    r   Úis_serializablez&FourOverSixHfQuantizer.is_serializable[   s   € Ør   c                 ó.   — | j                   j                  S r   )r   r2   r=   s    r   Úis_trainablez#FourOverSixHfQuantizer.is_trainable^   s   € à×'Ñ'×;Ñ;Ð;r   c                 ó   — ddl m}  || «      S )Nr   )ÚFourOverSixQuantize)r0   rB   )r   rB   s     r   Úget_quantize_opsz'FourOverSixHfQuantizer.get_quantize_opsb   s   € ÝBá" 4Ó(Ð(r   c                 ó�   — ddl m} t        | j                  d«      r)| j                  j                  }|j                  |«      }|S g S )a¾  
        Return weight conversions for loading pre-quantized checkpoints of
        other pre-quantized models (not fouroversix models). After first use,
        the pre_quantized_model_config_type attribute is set to None to ensure
        subsequent calls (e.g., during save_pretrained) return an empty list
        since, by then, the model will be saved with our framework's format
        so weight conversions are no longer needed.
        r   )ÚWeightConversionsÚpre_quantized_model_config_type)r#   rE   Úhasattrr   rF   Úget_weight_conversions)r   rE   Úmodel_config_typeÚweight_conversionss       r   rH   z-FourOverSixHfQuantizer.get_weight_conversionsg   sM   € õ 	2ô �4×+Ñ+Ð-NÔOØ $× 8Ñ 8× XÑ XÐØ!2×!IÑ!IØ!ó"Ðð &Ð%àˆ	r   )r   r	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequires_calibrationÚ__annotations__r   r   ÚstrÚfloatr'   Úboolr,   r8   r;   r>   Úpropertyr@   rC   rH   Ú__classcell__)r   s   @r   r   r      s±   ø… ñð !ÐØ,Ó,ô8òðDà ðDð ðDð ð	Dð
 
õDð
wà ð
wð ð
wð
 
ó
wð8à ó8ó.òð ð<˜dò <ó ð<ò)ö
r   r   )Útypingr   Úutils.import_utilsr   Úbaser   Úquantizers_utilsr   Úmodeling_utilsr	   Úutils.quantization_configr
   Úutilsr   Útorchr   r:   r   r   ú<module>r^      s:   ðÝ  å 9Ý Ý 2ñ Ý0Ý=õñ
 ÔÛôf˜[õ fr   