§
    ‚Štj¢$  ã                   ó,  — 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j        e¦  «        Zdededz  fd„Z G d„ de¦  «        ZdS )é    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          j        d|                      ¦   «         ¦  «        }|r|                     d¦  «        n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     úg/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/quantizers/quantizer_torchao.pyÚ_fuzzy_match_sizer   2   s:   € õ
 ŒI�m [×%6Ò%6Ñ%8Ô%8Ñ9Ô9€EØ"Ð,ˆ5�;Š;�q‰>Œ>ˆ>¨Ð,ó    c                   ó4  ‡ — 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          ¦   «         j        |fi |¤Ž t          t          | j        j        ¦  «        j        ¦  «        }|dk    rdnd| _        d S )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   s]   ø€ Ø�‰ŒÔÐ,Ð7Ð7°Ð7Ð7Ð7å&¥t¨DÔ,DÔ,OÑ'PÔ'PÔ'YÑZÔZˆ
Ø+5¸Ò+<Ð+< C CÀ!ˆÔ!Ð!Ð!r   c                 ó¾  — t          ¦   «         st          d¦  «        ‚|                     d¦  «        }d| _        t	          |t
          ¦  «        r†d|                     ¦   «         v sd|                     ¦   «         v r^t          |¦  «        dk    rId|                     ¦   «         v | _        | j        r+d|                     ¦   «         v rt          d¦  «        ‚d S d S d S d S d S )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  € Ý#Ñ%Ô%ð 	uÝÐsÑtÔtÐtà—Z’Z Ñ-Ô-ˆ
Ø#ˆÔÝ�j¥$Ñ'Ô'ð 	Ø˜*×+Ò+Ñ-Ô-Ð-Ð-°¸*×:KÒ:KÑ:MÔ:MÐ1MÐ1MÕSVÐWaÑSbÔSbÐefÒSfÐSfØ&+¨z×/@Ò/@Ñ/BÔ/BÐ&B�Ô#ØÔ%ð ¨&°J×4EÒ4EÑ4GÔ4GÐ*GÐ*GÝ$ðiñô ð ð		ð 	ØSfÐSfÐ1MÐ1Mðð Ð*GÐ*Gr   c                 óD   — t          |                     ¦   «         ¦  «        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                 ó’   •— |                       ||¦  «        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^   sH   ø€ à×(Ò(¨°
Ñ;Ô;ð 	-ÀÔ@YÐ@eØÔ,Ð,å‰wŒw×)Ò)¨%°¸UÑCÔCÐCr   Ú
max_memoryc                 óB   — d„ |                      ¦   «         D ¦   «         }|S )Nc                 ó    — i | ]\  }}||d z  “ŒS )gÍÌÌÌÌÌì?© )Ú.0ÚkeyÚvals      r   ú
<dictcomp>z8TorchAoHfQuantizer.adjust_max_memory.<locals>.<dictcomp>g   s"   € ÐHÐHÐH©¨¨c�c˜3 ™9ÐHÐHÐHr   )Úitems)r'   rC   s     r   Úadjust_max_memoryz$TorchAoHfQuantizer.adjust_max_memorye   s'   € àHÐH°Z×5EÒ5EÑ5GÔ5GÐHÑHÔHˆ
ØÐr   Nc                 ó°  ‡‡‡‡— |                       || j        j        |j        ¦  «        | _        | j        j        r�|                     ¦   «         Šˆfd„|                     ¦   «         D ¦   «         Š|                     ¦   «         Šˆfd„|                     ¦   «         D ¦   «         Šˆˆfd„| j        D ¦   «         | _        |�|                      |¦  «         d S d S )Nc                 óZ   •— g | ]'\  }}t          |¦  «        t          ‰¦  «        k    ¯%|‘Œ(S rF   ©Úid)rG   ÚnameÚmoduleÚ	input_embs      €r   ú
<listcomp>zKTorchAoHfQuantizer._process_model_before_weight_loading.<locals>.<listcomp>p   s;   ø€ ÐmÐmÐm©¨¨fÕQSÐTZÑQ[ÔQ[Õ_aÐbkÑ_lÔ_lÒQlÐQl˜tÐQlÐQlÐQlr   c                 óZ   •— g | ]'\  }}t          |¦  «        t          ‰¦  «        k    ¯%|‘Œ(S rF   rO   )rG   rQ   rR   Ú
output_embs      €r   rT   zKTorchAoHfQuantizer._process_model_before_weight_loading.<locals>.<listcomp>r   s;   ø€ ÐoÐoÐo©¨¨vÕRTÐU[ÑR\ÔR\Õ`bÐcmÑ`nÔ`nÒRnÐRn ÐRnÐRnÐRnr   c                 ó"   •— g | ]}|‰‰z   v¯	|‘ŒS rF   rF   )rG   ÚxÚinput_emb_namesÚoutput_emb_namess     €€r   rT   zKTorchAoHfQuantizer._process_model_before_weight_loading.<locals>.<listcomp>s   s0   ø€ ð +ð +ð +Ø¸!À?ÐUeÑCeÐ:eÐ:e�Ð:eÐ:eÐ:er   )	Úget_modules_to_not_convertr   Úmodules_to_not_convertÚ_keep_in_fp32_modulesÚinclude_input_output_embeddingsÚget_input_embeddingsÚnamed_modulesÚget_output_embeddingsÚset_metadata)r'   r<   Úcheckpoint_filesr(   rS   rY   rV   rZ   s       @@@@r   Ú$_process_model_before_weight_loadingz7TorchAoHfQuantizer._process_model_before_weight_loadingj   s	  øøøø€ Ø&*×&EÒ&EØ�4Ô+ÔBÀEÔD_ñ'
ô '
ˆÔ#ð Ô#ÔCð 	Ø×2Ò2Ñ4Ô4ˆIØmÐmÐmÐm¸×8KÒ8KÑ8MÔ8MÐmÑmÔmˆOØ×4Ò4Ñ6Ô6ˆJØoÐoÐoÐo¸×9LÒ9LÑ9NÔ9NÐoÑoÔoÐð+ð +ð +ð +ð +ØÔ6ð+ñ +ô +ˆDÔ'ð Ð'à×ÒÐ.Ñ/Ô/Ð/Ð/Ð/ð (Ð'r   c                 óR  — t          || j        ¦  «        sdS t          ||¦  «        \  }}t          j        j        g}| j        j        r$|                     t          j        j	        ¦  «         ddl
m}m} t          | j        j        |¦  «        rw|                     dd¦  «        \  }	}
 ||	| j        j        ¦  «        sF ||| j        j        ¦  «        s0d| j        j        j        v rt          |t#          |¦  «        ¦  «        rdS t          |t#          |¦  «        ¦  «        o|dk    S )	NFr   )ÚFqnToConfigÚfqn_matches_fqn_configú.r   Ú_defaultTÚweight)r   r\   r   ÚtorchÚnnÚLinearr   r^   ÚappendÚ	EmbeddingÚtorchao.quantizationrf   rg   r2   r$   ÚrsplitÚfqn_to_configÚtuple)r'   r<   r>   r(   rR   Útensor_nameÚ_QUANTIZABLErf   rg   Ú
module_fqnÚ_s              r   rA   z+TorchAoHfQuantizer.param_needs_quantizationz   s>  € å$ Z°Ô1LÑMÔMð 	Ø�5õ 3°5¸*ÑEÔEÑˆ�ÝœœÐ(ˆØÔ#ÔCð 	4Ø×Ò¥¤Ô 2Ñ3Ô3Ð3àLÐLÐLÐLÐLÐLÐLÐLå�dÔ.Ô9¸;ÑGÔGð 
	Ø&×-Ò-¨c°1Ñ5Ô5‰MˆJ˜à&Ð& z°4Ô3KÔ3VÑWÔWðà)Ð)¨*°dÔ6NÔ6YÑZÔZðð  $Ô":Ô"EÔ"SÐSÐSÝ" 6­5°Ñ+>Ô+>Ñ?Ô?ð Tð �tå˜&¥%¨Ñ"5Ô"5Ñ6Ô6ÐR¸;È(Ò;RÐRr   c                 ó   — dS ©NTrF   ©r'   s    r   Úis_serializablez"TorchAoHfQuantizer.is_serializable•   s   € Øˆtr   c                 ó`   — t          t          | j        j        ¦  «        j        ¦  «        dk    S )NÚ8)r   r#   r   r$   r%   rz   s    r   Úis_trainablezTorchAoHfQuantizer.is_trainable˜   s)   € õ !¥ dÔ&>Ô&IÑ!JÔ!JÔ!SÑTÔTÐX[Ò[Ð[r   c                 ó   — dS ry   rF   rz   s    r   Úis_compileablez!TorchAoHfQuantizer.is_compileable�   s   € àˆtr   rc   c                 ó  — |d                               d¦  «        rdi }|D ]V}t          |d¬¦  «        5 }|                     ¦   «         pi }|                     |¦  «         d d d ¦  «         n# 1 swxY w Y   ŒW|| _        d S d S )Nr   z.safetensorsÚpt)Ú	framework)Úendswithr   ÚmetadataÚupdate)r'   rc   r…   Ú
checkpointÚfÚ	metadata_s         r   rb   zTorchAoHfQuantizer.set_metadata¡   sÒ   € Ø˜AÔ×'Ò'¨Ñ7Ô7ð 	%ØˆHØ.ð /ð /�
Ý˜z°TÐ:Ñ:Ô:ð /¸aØ !§
¢
¡¤Ð 2°�IØ—O’O IÑ.Ô.Ð.ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /øð %ˆDŒMˆMˆMð	%ð 	%s   ³,A+Á+A/	Á2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                             ¦   «         D ]…\  }}d|vrŒ
	 t          j        |¦  «        }n# t          j	        t          f$ r Y Œ8w xY w|                     d¦  «        dk    rŒV|                     |                     dd	¦  «        d
         ¦  «         Œ†|pdhS )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…   rj   r   )Úis_metadata_torchaoz$Invalid torchao safetensors metadatarh   Ú_typeÚTensorr   éÿÿÿÿ)Úhasattrr…   Ú/torchao.prototype.safetensors.safetensors_utilsr�   r7   ÚsetrK   ÚjsonÚloadsÚJSONDecodeErrorÚ	TypeErrorr0   Úaddrq   )r'   r�   Úparam_namesÚmeta_keyÚ
meta_valueÚmetas         r   Ú_discover_quantized_param_namesz2TorchAoHfQuantizer._discover_quantized_param_names°   s$  € õ �t˜ZÑ(Ô(ð 	°´ð 	Ø�:ÐàWÐWÐWÐWÐWÐWà"Ð" 4¤=Ñ1Ô1ð 	EÝÐCÑDÔDÐDå‘e”eˆØ$(¤M×$7Ò$7Ñ$9Ô$9ð 		9ð 		9Ñ ˆH�jØ˜(Ð"Ð"ØðÝ”z *Ñ-Ô-��øÝÔ(­)Ð4ð ð ð Ø�ðøøøà�xŠx˜Ñ Ô  HÒ,Ð,ØØ�OŠO˜HŸOšO¨C°Ñ3Ô3°BÔ7Ñ8Ô8Ð8Ð8àÐ(˜x˜jÐ(s   Á2BÂB ÂB c                 ó  — ddl m} | j        rw|                      ¦   «         }g }t	          |¦  «        D ]O}|                     t          d|› d�d|› d�d|› d�d|› d�d|› d�d|› d	�g| || ¦  «        g¬
¦  «        ¦  «         ŒP|S g S )Nr   )ÚTorchAoDeserializerw   Ú_qdataÚ_scale_and_zeroÚ_per_tensor_scaleÚ_scaleÚ_zero_pointÚ_act_pre_scale)Úsource_patternsÚtarget_patternsÚ
operations)rŒ   r¡   r6   rŸ   Úsortedrn   r   )r'   r¡   r›   Ú
convertersr>   s        r   Úget_weight_conversionsz)TorchAoHfQuantizer.get_weight_conversionsÎ   s÷   € Ø=Ð=Ð=Ð=Ð=Ð=àÔð 	Ø×>Ò>Ñ@Ô@ˆKØˆJÝ$ [Ñ1Ô1ð ð �
Ø×!Ò!Ý#à2 
Ð2Ð2Ð2Ø; 
Ð;Ð;Ð;Ø= 
Ð=Ð=Ð=Ø2 
Ð2Ð2Ð2Ø7 
Ð7Ð7Ð7Ø: 
Ð:Ð:Ð:ð)ð )3Ø$6Ð$6°tÑ$<Ô$<Ð#=ðñ ô ñô ð ð ð ÐØˆ	r   )N)r<   r	   )r%   Ú
__module__Ú__qualname__Ú__doc__Úrequires_calibrationÚ__annotations__r"   r9   r=   ÚstrÚfloatrB   r3   ÚintrL   rd   ÚboolrA   r{   Úpropertyr~   r€   Úlistrb   r�   r•   rŸ   r­   Ú__classcell__)r*   s   @r   r   r   ;   s  ø€ € € € € € ðð ð !ÐØ(Ð(Ð(Ñ(ðDð Dð Dð Dð Dðð ð ð=ð =ð =ðDÐ(9ð DÀsð DÐSað DÐfkð Dð Dð Dð Dð Dð Dð¨D°°c¸C±i°Ô,@ð ÀTÈ#ÈsÐUXÉyÈ.ÔEYð ð ð ð ð
0ð 0ð 0ð 0ð 0ð SÐ.?ð SÈSð SÐ_cð Sð Sð Sð Sð6 ð ð ð ð ð ð\˜dð \ð \ð \ñ „Xð\ð ð ð ð ð ñ „Xðð%¨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   rk   Ú1torchao.prototype.safetensors.safetensors_supportr   Ú
get_loggerr%   Úloggerr³   r   r   rF   r   r   ú<module>rÆ      s£  ðð €€€Ø 	€	€	€	Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ Ið ð :Ø0Ð0Ð0Ð0Ð0Ð0Ø9Ð9Ð9Ð9Ð9Ð9à !Ð !Ð !Ð !Ð !Ð !à EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ EÐ Eð Ð ð ÐÑÔð 5Ø4Ð4Ð4Ð4Ð4Ð4ð ÐÑÔð Ø€L€L€LàÐÑÔð ðð ð ð ð ð ð
 
ˆÔ	˜HÑ	%Ô	%€ð- 3ð -¨3°©:ð -ð -ð -ð -ðið ið ið ið i˜ñ iô ið ið ið ir   