o
    0 i                     @   s   d dl Z d dl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 rAd dlZeeZG dd deZdS )    N)TYPE_CHECKINGOptionalUnion)version   )HfQuantizer)get_module_from_name   )PreTrainedModel)is_accelerate_availableis_optimum_quanto_availableis_torch_availablelogging)QuantoConfigc                       s$  e Zd ZdZddgZdZdZdef fddZd	d
 Z	dd Z
dd Zd3ddZdee dedee fddZdddedefddZdeeeeef f deeeeef f fddZddd d!ded"d#fd$d%Zd4d'd(Z	)d5ddd*eee  fd+d,Zd-d. Zedefd/d0Zd5d1d2Z  ZS )6QuantoHfQuantizerz*
    Quantizer for the quanto library
    Zquanto
accelerateTFquantization_configc                    s    t  j|fi | |   d S N)super__init__	post_init)selfr   kwargs	__class__ t/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/transformers/quantizers/quantizer_quanto.pyr   2   s   zQuantoHfQuantizer.__init__c                 C   s"   | j jdur| jstddS dS )z 
        Safety checker
        NzWe 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   ZactivationsZpre_quantized
ValueErrorr   r   r   r   r   6   s
   zQuantoHfQuantizer.post_initc                 O   s    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   r   r   r   validate_environment@   s   z&QuantoHfQuantizer.validate_environmentc                 C   s   |d u rddi}t d |S )N cpuzThe 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   Z
device_mapr   r   r   update_device_mapJ   s   z#QuantoHfQuantizer.update_device_mapdtypetorch.dtypereturnc                 C   s   |d u rt d tj}|S )NzPYou did not specify `dtype` in `from_pretrained`. Setting it to `torch.float32`.)r$   r%   torchZfloat32)r   r'   r   r   r   update_dtypeT   s   
zQuantoHfQuantizer.update_dtypemissing_keysprefixc                    s   t  r	ddlm} g  | D ]*\}}t||r9|D ]}||v s)|| d| v r8|ds8|ds8 | qq fdd|D S )Nr   QModuleMixin.z.weightz.biasc                    s   g | ]}| vr|qS r   r   ).0kZnot_missing_keysr   r   
<listcomp>h   s    z9QuantoHfQuantizer.update_missing_keys.<locals>.<listcomp>)r   optimum.quantor/   Znamed_modules
isinstanceendswithappend)r   modelr,   r-   r/   namemodulemissingr   r3   r   update_missing_keysZ   s   

z%QuantoHfQuantizer.update_missing_keysr9   r
   
param_namec                 K   s>   t  r	ddlm} t||\}}t||rd|v r|j S dS )Nr   r.   weightF)r   r5   r/   r   r6   frozen)r   r9   r>   r   r/   r;   Ztensor_namer   r   r   param_needs_quantizationj   s   z*QuantoHfQuantizer.param_needs_quantization
max_memoryc                 C   s   dd |  D }|S )Nc                 S   s   i | ]	\}}||d  qS )g?r   )r1   keyvalr   r   r   
<dictcomp>w   s    z7QuantoHfQuantizer.adjust_max_memory.<locals>.<dictcomp>)items)r   rB   r   r   r   adjust_max_memoryv   s   z#QuantoHfQuantizer.adjust_max_memoryparam_valueztorch.Tensortarget_deviceztorch.devicec           	      K   s@   ddl m} ||||| t||\}}|  d|j_d S )Nr	   )_load_parameter_into_modelF)modeling_utilsrJ   tor   freezer?   Zrequires_grad)	r   r9   rH   r>   rI   r   rJ   r;   _r   r   r   create_quantized_paramz   s
   z(QuantoHfQuantizer.create_quantized_paramtarget_dtypec                 C   sV   t tj dt dkr'ddlm} tj|j|j	|j
d}|| jj }|S td)Nr   z0.27.0r   )CustomDtype)int8Zfloat8Zint4Zint2zYou 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metadataZaccelerate.utilsrQ   r*   rR   ZFP8ZINT4ZINT2r   weightsr   )r   rP   rQ   mappingr   r   r   adjust_target_dtype   s   z%QuantoHfQuantizer.adjust_target_dtypeNkeep_in_fp32_modulesc                 K   sD   ddl m} | || jj|| _||| j| jd\}}| j|j_d S )Nr	   )replace_with_quanto_layers)modules_to_not_convertr   )ZintegrationsrZ   Zget_modules_to_not_convertr   r[   config)r   r9   rY   r   rZ   rN   r   r   r   $_process_model_before_weight_loading   s   


z6QuantoHfQuantizer._process_model_before_weight_loadingc                 K   s   |S r   r   )r   r9   r   r   r   r   #_process_model_after_weight_loading      z5QuantoHfQuantizer._process_model_after_weight_loadingc                 C      dS )NTr   r   r   r   r   is_trainable   s   zQuantoHfQuantizer.is_trainablec                 C   r`   )NFr   )r   Zsafe_serializationr   r   r   is_serializable   r_   z!QuantoHfQuantizer.is_serializable)r'   r(   r)   r(   )rP   r(   r)   r(   r   )__name__
__module____qualname____doc__Zrequired_packagesZ requires_parameters_quantizationZrequires_calibrationr   r   r   r!   r&   r+   liststrr=   boolrA   dictr   intrG   rO   rX   r   r]   r^   propertyra   rb   __classcell__r   r   r   r   r   )   sB    



2



r   )rT   typingr   r   r   	packagingr   baser   Zquantizers_utilsr   rK   r
   utilsr   r   r   r   Zutils.quantization_configr   r*   Z
get_loggerrc   r$   r   r   r   r   r   <module>   s   
