Ë
    ÜÓ^j¢$  ã                   ó  — 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 d d	lmZ dd
lmZmZmZ dZ e«       rddlmZ  e«       rd dlZ e«       rd dlmZ  ej2                  e«      Zdededz  fd„Z G d„ de«      Zy)é    N)ÚTYPE_CHECKINGé   )ÚHfQuantizer)Úget_module_from_nameÚshould_convert_moduleé   )ÚPreTrainedModel)ÚTorchAoConfig)Ú	safe_open)Úis_torch_availableÚis_torchao_availableÚloggingz2.5.0)ÚWeightConverter)Úflatten_tensor_state_dictÚconfig_nameÚreturnc                 ót   — t        j                  d| j                  «       «      }|r|j                  d«      S dS )z±
    Extract the size digit from torchao config class names like "Int4WeightOnlyConfig", "Int8WeightOnlyConfig".
    Returns the digit as a string if found, otherwise None.
    z
(\d)weightr   N)ÚreÚsearchÚlowerÚgroup)r   Úmatchs     út/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/quantizers/quantizer_torchao.pyÚ_fuzzy_match_sizer   2   s2   € ô
 �I‰I�m [×%6Ñ%6Ó%8Ó9€EÙ"ˆ5�;‰;�q‹>Ð,¨Ð,ó    c                   ó  ‡ — e Zd ZU dZdZded<   ˆ fd„Zd„ Zd„ Zdd	d
e	ddde
fˆ fd„Zdee	ee	z  f   dee	ee	z  f   fd„Zddd„Zdd	d
e	defd„Zdefd„Zedefd„«       Zedefd„«       Zdee	   fd„Zd„ Zdee	   fd„Zd„ Zˆ xZS )ÚTorchAoHfQuantizerz?
    Quantizer for torchao: https://github.com/pytorch/ao/
    Fr
   Úquantization_configc                 ó²   •— t        ‰| �  |fi |¤Ž t        t        | j                  j
                  «      j                  «      }|dk(  rd| _        y d| _        y )NÚ4g      à?r   )ÚsuperÚ__init__r   Útyper   Ú
quant_typeÚ__name__Úquantized_param_size)Úselfr   ÚkwargsÚ
size_digitÚ	__class__s       €r   r"   zTorchAoHfQuantizer.__init__C   sM   ø€ Ü‰ÑÐ,Ñ7°Ò7ä&¤t¨D×,DÑ,D×,OÑ,OÓ'P×'YÑ'YÓZˆ
Ø+5¸Ò+< CˆÕ!À!ˆÕ!r   c                 ój  — t        «       st        d«      ‚|j                  d«      }d| _        t	        |t
        «      rvd|j                  «       v sd|j                  «       v rQt        |«      dkD  rBd|j                  «       v | _        | j                  rd|j                  «       v rt        d«      ‚y y y y y )NzSLoading an torchao quantized model requires torchao library (`pip install torchao`)Ú
device_mapFÚdiskÚcpur   zœYou are attempting to perform disk offload with a pre-quantized torchao model This is not supported yet . Please remove the disk device from the device_map.)
r   ÚImportErrorÚgetÚoffload_to_cpuÚ
isinstanceÚdictÚvaluesÚlenÚpre_quantizedÚ
ValueError)r'   Úargsr(   r,   s       r   Úvalidate_environmentz'TorchAoHfQuantizer.validate_environmentI   s¾   € Ü#Ô%ÜÐsÓtÐtà—Z‘Z Ó-ˆ
Ø#ˆÔÜ�j¤$Ô'Ø˜*×+Ñ+Ó-Ñ-°¸*×:KÑ:KÓ:MÑ1MÔSVÐWaÓSbÐefÒSfØ&+¨z×/@Ñ/@Ó/BÐ&B�Ô#Ø×%Ò%¨&°J×4EÑ4EÓ4GÑ*GÜ$ðióð ð +HÐ%ð TgÐ1Mð (r   c                 ó4   — t        |j                  «       «      S )zv
        We flatten the state dict of tensor subclasses so that it is compatible with the safetensors format.
        )r   Ú
state_dict)r'   Úmodels     r   Úget_state_dict_and_metadataz.TorchAoHfQuantizer.get_state_dict_and_metadataX   s   € ô )¨×)9Ñ)9Ó);Ó<Ð<r   r<   r	   Ú
param_nameÚparamztorch.Tensorr   c                 óz   •— | j                  ||«      r| j                  �| j                  S t        ‰| �  |||«      S )z4Return the element size (in bytes) for `param_name`.)Úparam_needs_quantizationr&   r!   Úparam_element_size)r'   r<   r>   r?   r*   s       €r   rB   z%TorchAoHfQuantizer.param_element_size^   s>   ø€ à×(Ñ(¨°
Ô;À×@YÑ@YÐ@eØ×,Ñ,Ð,ä‰wÑ)¨%°¸UÓCÐCr   Ú
max_memoryc                 ó^   — |j                  «       D ��ci c]  \  }}||dz  “Œ }}}|S c c}}w )NgÍÌÌÌÌÌì?)Úitems)r'   rC   ÚkeyÚvals       r   Úadjust_max_memoryz$TorchAoHfQuantizer.adjust_max_memorye   s6   € à5?×5EÑ5EÓ5G×H©¨¨c�c˜3 ™9‘nÐHˆ
ÑHØÐùó Is   ”)c                 ó\  — | j                  || j                  j                  |j                  «      | _        | j                  j                  r»|j                  «       }|j                  «       D ��cg c]  \  }}t        |«      t        |«      k(  sŒ|‘Œ! }}}|j                  «       }|j                  «       D ��cg c]  \  }}t        |«      t        |«      k(  sŒ|‘Œ! }	}}| j                  D �
cg c]  }
|
||	z   vsŒ|
‘Œ c}
| _        |�| j                  |«       y y c c}}w c c}}w c c}
w ©N)
Úget_modules_to_not_convertr   Úmodules_to_not_convertÚ_keep_in_fp32_modulesÚinclude_input_output_embeddingsÚget_input_embeddingsÚnamed_modulesÚidÚget_output_embeddingsÚset_metadata)r'   r<   Úcheckpoint_filesr(   Ú	input_embÚnameÚmoduleÚinput_emb_namesÚ
output_embÚoutput_emb_namesÚxs              r   Ú$_process_model_before_weight_loadingz7TorchAoHfQuantizer._process_model_before_weight_loadingj   s  € Ø&*×&EÑ&EØ�4×+Ñ+×BÑBÀE×D_ÑD_ó'
ˆÔ#ð ×#Ñ#×CÒCØ×2Ñ2Ó4ˆIØ8=×8KÑ8KÓ8M×m©¨¨fÔQSÐTZÓQ[Ô_aÐbkÓ_lÓQlštÐmˆOÑmØ×4Ñ4Ó6ˆJØ9>×9LÑ9LÓ9N×o©¨¨vÔRTÐU[ÓR\Ô`bÐcmÓ`nÓRn¢ÐoÐÑoà×6Ñ6ö+Ø¸!À?ÐUeÑCeÒ:e’ò+ˆDÔ'ð Ð'à×ÑÐ.Õ/ð (ùó nùãoùò+s$   Á0DÂDÂ:D#ÃD#Ã/D)Ã<D)c                 ó˜  — t        || j                  «      syt        ||«      \  }}t        j                  j
                  g}| j                  j                  r)|j                  t        j                  j                  «       ddl
m}m} t        | j                  j                  |«      r‡|j                  dd«      \  }	}
 ||	| j                  j                  «      sT ||| j                  j                  «      s7d| j                  j                  j                   v rt        |t#        |«      «      ryt        |t#        |«      «      xr |dk(  S )	NFr   )ÚFqnToConfigÚfqn_matches_fqn_configú.r   Ú_defaultTÚweight)r   rL   r   ÚtorchÚnnÚLinearr   rN   ÚappendÚ	EmbeddingÚtorchao.quantizationr^   r_   r2   r$   ÚrsplitÚfqn_to_configÚtuple)r'   r<   r>   r(   rW   Útensor_nameÚ_QUANTIZABLEr^   r_   Ú
module_fqnÚ_s              r   rA   z+TorchAoHfQuantizer.param_needs_quantizationz   s  € ä$ Z°×1LÑ1LÔMØô 3°5¸*ÓEÑˆ�ÜŸ™Ÿ™Ð(ˆØ×#Ñ#×CÒCØ×Ñ¤§¡× 2Ñ 2Ô3çLä�d×.Ñ.×9Ñ9¸;ÔGØ&×-Ñ-¨c°1Ó5‰MˆJ˜á& z°4×3KÑ3K×3VÑ3VÔWÙ)¨*°d×6NÑ6N×6YÑ6YÔZà $×":Ñ":×"EÑ"E×"SÑ"SÑSÜ" 6¬5°Ó+>Ô?ð ä˜&¤%¨Ó"5Ó6ÒR¸;È(Ñ;RÐRr   c                  ó   — y©NT© ©r'   s    r   Úis_serializablez"TorchAoHfQuantizer.is_serializable•   s   € Ør   c                 ól   — t        t        | j                  j                  «      j                  «      dk(  S )NÚ8)r   r#   r   r$   r%   rs   s    r   Úis_trainablezTorchAoHfQuantizer.is_trainable˜   s,   € ô !¤ d×&>Ñ&>×&IÑ&IÓ!J×!SÑ!SÓTÐX[Ñ[Ð[r   c                  ó   — yrq   rr   rs   s    r   Úis_compileablez!TorchAoHfQuantizer.is_compileable�   s   € àr   rT   c                 óÜ   — |d   j                  d«      rLi }|D ]=  }t        |d¬«      5 }|j                  «       xs i }|j                  |«       d d d «       Œ? || _        y y # 1 sw Y   ŒRxY w)Nr   z.safetensorsÚpt)Ú	framework)Úendswithr   ÚmetadataÚupdate)r'   rT   r~   Ú
checkpointÚfÚ	metadata_s         r   rS   zTorchAoHfQuantizer.set_metadata¡   sy   € Ø˜AÑ×'Ñ'¨Ô7ØˆHØ.ò /�
Ü˜z°TÔ:ð /¸aØ !§
¡
£Ò 2°�IØ—O‘O IÔ.÷/ð /ð/ð
 %ˆD�Mð 8÷/ð /ús   ©&A"Á"A+	c                 ó   — ddl m}  || «      S )Nr   )ÚTorchAoQuantize)Úintegrations.torchaor„   )r'   r„   s     r   Úget_quantize_opsz#TorchAoHfQuantizer.get_quantize_ops«   s   € Ý:á˜tÓ$Ð$r   c                 óÊ  — t        | d«      r| j                  sdhS ddlm}  || j                  «      st	        d«      ‚t        «       }| j                  j                  «       D ]Y  \  }}d|vrŒ	 t        j                  |«      }|j                  d«      dk(  rŒ6|j                  |j                  dd	«      d
   «       Œ[ |xs dhS # t        j                  t        f$ r Y Œ~w xY w)au  Extract unique parameter names of quantized params from torchao safetensors metadata.

        The metadata keys are the original fully-qualified parameter names,
        e.g. "model.layers.0.self_attn.q_proj.weight" or
            "model.decoder.layers.0.experts.gate_up_proj".
        Only entries representing tensor subclasses (not plain Tensors) are included.
        r~   rb   r   )Úis_metadata_torchaoz$Invalid torchao safetensors metadatar`   Ú_typeÚTensorr   éÿÿÿÿ)Úhasattrr~   Ú/torchao.prototype.safetensors.safetensors_utilsrˆ   r7   ÚsetrE   ÚjsonÚloadsÚJSONDecodeErrorÚ	TypeErrorr0   Úaddri   )r'   rˆ   Úparam_namesÚmeta_keyÚ
meta_valueÚmetas         r   Ú_discover_quantized_param_namesz2TorchAoHfQuantizer._discover_quantized_param_names°   sÝ   € ô �t˜ZÔ(°·²Ø�:ÐåWá" 4§=¡=Ô1ÜÐCÓDÐDä“eˆØ$(§M¡M×$7Ñ$7Ó$9ò 		9Ñ ˆH�jØ˜(Ñ"ØðÜ—z‘z *Ó-�ð �x‰x˜Ó  HÒ,ØØ�O‰O˜HŸO™O¨C°Ó3°BÑ7Õ8ð		9ð Ò(˜x˜jÐ(øô ×(Ñ(¬)Ð4ò Ùðús   Á/CÃC"Ã!C"c                 óö   — ddl m} | j                  rf| j                  «       }g }t	        |«      D ]D  }|j                  t        d|› d�d|› d�d|› d�d|› d�d|› d�d|› d	�g| || «      g¬
«      «       ŒF |S g S )Nr   )ÚTorchAoDeserializero   Ú_qdataÚ_scale_and_zeroÚ_per_tensor_scaleÚ_scaleÚ_zero_pointÚ_act_pre_scale)Úsource_patternsÚtarget_patternsÚ
operations)r…   rš   r6   r˜   Úsortedrf   r   )r'   rš   r”   Ú
convertersr>   s        r   Úget_weight_conversionsz)TorchAoHfQuantizer.get_weight_conversionsÎ   s¶   € Ý=à×ÒØ×>Ñ>Ó@ˆKØˆJÜ$ [Ó1ò �
Ø×!Ñ!Ü#à 
˜|¨6Ð2Ø 
˜|¨?Ð;Ø 
˜|Ð+<Ð=Ø 
˜|¨6Ð2Ø 
˜|¨;Ð7Ø 
˜|¨>Ð:ð)ð )3Ù$6°tÓ$<Ð#=ôõðð ÐØˆ	r   rJ   )r<   r	   )r%   Ú
__module__Ú__qualname__Ú__doc__Úrequires_calibrationÚ__annotations__r"   r9   r=   ÚstrÚfloatrB   r3   ÚintrH   r\   ÚboolrA   rt   Úpropertyrw   ry   ÚlistrS   r†   rŽ   r˜   r¦   Ú__classcell__)r*   s   @r   r   r   ;   s  ø… ñð !ÐØ(Ó(ôDòò=ðDÐ(9ð DÀsð DÐSað DÐfkõ Dð¨D°°c¸C±i°Ñ,@ð ÀTÈ#ÈsÐUXÉyÈ.ÑEYó ô
0ð SÐ.?ð SÈSð SÐ_có Sð6 ó ð ð\˜dò \ó ð\ð ð ò ó ðð%¨T°#©Yó %ò%ð
)°°S±ó )ö<r   r   )r�   r   Útypingr   Úbaser   Úquantizers_utilsr   r   Úmodeling_utilsr	   Úutils.quantization_configr
   Úsafetensorsr   Úutilsr   r   r   ÚMIN_TORCH_VERSIONÚcore_model_loadingr   rc   Ú1torchao.prototype.safetensors.safetensors_supportr   Ú
get_loggerr%   Úloggerr¬   r   r   rr   r   r   ú<module>r¿      sŒ   ðó Û 	Ý  å ß Iñ Ý0Ý9å !ç EÑ Eð Ð ñ ÔÝ4ñ ÔÛáÔõð
 
ˆ×	Ñ	˜HÓ	%€ð- 3ð -¨3°©:ó -ôi˜õ ir   