o
    i/                     @   s  d dl Zd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ e
 r-ddlmZ ddlmZ e rYeejdZeejded	krYd d
lmZ d dlmZ eeZdededB fddZdd Zdd ZG dd deZG dd deZdS )    N)version)logging)is_torch_availableis_torchao_available   )ConversionOps)get_module_from_nametorchao0.15.0)unflatten_tensor_state_dict)is_metadata_torchaoconfig_namereturnc                 C   s&   |   } td| }|r|dS dS )z
    Extract the size digit from strings like "4weight", "8weight".
    Returns the digit as an integer if found, otherwise None.
    z
(\d)weight   N)lowerresearchgroup)r   	str_match r   c/sda-disk/www/egybert/egybert_env/lib/python3.10/site-packages/transformers/integrations/torchao.pyfuzzy_match_size*   s
   
r   c                 C   sj   ddl m} ddlm} t| |r| jj d|   dS t| |r3| jj d| j dt| j	 dS d S )Nr   )AffineQuantizedTensor)LinearActivationQuantizedTensor()z(activation=	, weight=)
torchao.dtypesr   7torchao.quantization.linear_activation_quantized_tensorr   
isinstance	__class____name___quantization_typeinput_quant_funcoriginal_weight_tensor)weightr   r   r   r   r   r"   9   s   

"r"   c                 C   sZ   t | j}|d u rd| jjd  d| jjd  dS d| jjd  d| jjd  d| S )Nzin_features=r   z, out_features=r   z, weight=Noner   )r"   r%   shape)selfr%   r   r   r   _linear_extra_reprD   s   
"&r(   c                   @   sV   e Zd Zdd Z			d
deeejf dejj	dB dedB deeejf fdd	Z
dS )TorchAoQuantizec                 C   
   || _ d S Nhf_quantizerr'   r-   r   r   r   __init__M      
zTorchAoQuantize.__init__N
input_dictmodelfull_layer_namer   c                 K   s  ddl m} t| d \}}t|tr|d n|}t||\}	}
tjj	||j
d|	j|
< | }t|	t|k}| jjj}|rN|rNt|jjdddd | jj tdkrdd	l m} | jj }t||r|d
d\}}d }||jv r|drJ d|j| }nI||jv r|drJ d|j| }n5|jD ]*}|dsqt|dd  |r|j| } nt|dd  |r|j| } nq|jdd }|d ur|dkr|r|r|	j ! }||	|dd  |"| d|	_#|r|rd|iS i S |||i}||	|d d |"| d|	_#i S ||iS n| jj tdkrddl m$} | jj }t||r|d
d\}}d }||jv rY|drSJ d|j| }n(|jD ]}|dsfq\t|dd  |rx|j| } n	q\|jdd }|d ur|r|r|	j ! }||	|dd d |"| d|	_#|r|rd|iS i S ||iS |r|r|	j ! }||	| jj  |"| d|	_#|r|rd|iS i S )Nr   )	quantize_)requires_gradT)decodertie_word_embeddingsFr
   )FqnToConfig.r   zre:zHparam fqn should not start with`re:`, which is used for specifying regexzImodule fqn should not start with`re:`, which is used for specifying regex   _defaultr%   c                 S      dS NTr   xfqnr   r   r   <lambda>       z)TorchAoQuantize.convert.<locals>.<lambda>zlm_head.weight)	filter_fnz0.12.0)ModuleFqnToConfigc                 S   r<   r=   r   r>   r   r   r   rA      rB   )%torchao.quantizationr4   tupleitemsr   listr   torchnn	Parameterr5   _parametersget_input_embeddingsidr-   quantization_configuntie_embedding_weightssetattrconfigget_text_config_get_ao_versionr   Versionr8   get_apply_tensor_subclassrsplitfqn_to_config
startswithmodule_fqn_to_configr   	fullmatchgetr%   clonediscard_is_hf_initializedrD   )r'   r1   r2   r3   missing_keyskwargsr4   _valuemoduletensor_nameinput_embedis_embedding_paramrP   r8   rR   
module_fqntop_level_param_namecmaybe_module_fqn_patternlm_headcustom_param_fqn_configrD   r   r   r   convertP   s   










2






zTorchAoQuantize.convert)NNN)r!   
__module____qualname__r/   dictstrrI   TensorrJ   Modulern   r   r   r   r   r)   L   s    
r)   c                   @   sd   e Zd Zdd Z				ddeeejf dee dB dej	j
dB dedB deeejf f
d	d
ZdS )TorchAoDeserializec                 C   r*   r+   r,   r.   r   r   r   r/      r0   zTorchAoDeserialize.__init__Nr1   source_patternsr2   r3   r   c                 K   s2  t | d |v}i }d|ddd }	|r-t|d t r(|d d }
n0|d }
n+| D ]&}t|| dkrJtd| dt||  d	|| d ||	 d| < q1|r^||
iS td
t	krkt
| jjsotdt|| jj\}}|r|J || }t||\}}t|tjjrtt||_||iS )a&  
        Consolidates tensor subclass components before reconstructing the object

        For example:
            input_dict: {
                "_weight_qdata": torch.Tensor,
                "_weight_scale": torch.Tensor,
            }
            full_layer_name: "model.layers.0.self_attn.k_proj.weight"

            Given this, we reconstruct a Float8Tensor instance using the qdata and scale
            and return it as a dictionary with the full_layer_name as the key and the recovered
            Float8Tensor instance as the value.
        r   r9   Nr%   r   zExpected a single tensor for z	 but got z tensors insteadr
   zOTo use `safetensors` serialization, you should have `torchao>=0.15.0` installed)rH   keysjoinsplitr   len
ValueErrorr   parseTORCHAO_VERSIONr   r-   metadatar   r   rI   rJ   Lineartypes
MethodTyper(   
extra_repr)r'   r1   rv   r2   r3   r`   ra   is_unsafe_serialization
param_data
layer_namer%   suffixunflattened_state_dictleftover_state_dict	new_paramrd   rb   r   r   r   rn      s4   
zTorchAoDeserialize.convert)NNNN)r!   ro   rp   r/   rq   rr   rI   rs   rH   rJ   rt   rn   r   r   r   r   ru      s"    

ru   ) importlib.metadata	importlibr   r   rI   	packagingr   transformers.utilsr   transformers.utils.import_utilsr   r   core_model_loadingr   quantizers.quantizers_utilsr   r}   r   r~   1torchao.prototype.safetensors.safetensors_supportr   /torchao.prototype.safetensors.safetensors_utilsr   
get_loggerr!   loggerrr   r   r"   r(   r)   ru   r   r   r   r   <module>   s,   
 