§
    Þ˜ºh¤2  ã                   óà   — d dl mZmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZ erddlmZ  e¦   «         rd d	lmZ  e¦   «         rd d
lZ e	j        e¦  «        Zd„ Z G d„ de¦  «        Zd
S )é    )ÚTYPE_CHECKINGÚAnyé   )Úprepare_for_hqq_linear)Úis_accelerate_availableÚis_hqq_availableÚis_torch_availableÚloggingé   )ÚHfQuantizer)Úget_module_from_name)ÚPreTrainedModel)Úremove_hook_from_moduleNc                 óh   — |                      d¦  «        d d…         }| }|D ]}|j        |         }Œ|S )Nú.éÿÿÿÿ)ÚsplitÚ_modules)ÚmodelÚnameÚmodule_treeÚparentÚms        úm/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/transformers/quantizers/quantizer_hqq.pyÚfind_parentr   %   sA   € Ø—*’*˜S‘/”/ # 2 #Ô&€KØ€FØð $ð $ˆØ” Ô#ˆˆØ€Mó    c                   óL  ‡ — e Zd ZdZdZdZdZdgZˆ fd„Zd„ Z	ddd	e
e         d
ede
e         fd„Zddde
e         de
e         de
e         fd„Zdddddedeeef         def
d„Zdddddedddeeef         de
e         fd„Zd„ Z	 	 dd„Zdd„Zd d„Zedefd„¦   «         Zˆ xZS )!ÚHqqHfQuantizerzä
    HQQ quantizer base HF class.
    nn.Linear modules are first tagged with quant_config in _process_model_before_weight_loading().
    The actual quantization and offloading to the GPU is done in check_quantized_param().
    FTÚhqqc                 óX   •—  t          ¦   «         j        |fi |¤Ž d | _        d| _        d S )NF)ÚsuperÚ__init__ÚdtypeÚusing_multi_gpu)ÚselfÚquantization_configÚkwargsÚ	__class__s      €r   r"   zHqqHfQuantizer.__init__9   s8   ø€ Ø�‰ŒÔÐ,Ð7Ð7°Ð7Ð7Ð7ØˆŒ
Ø$ˆÔÐÐr   c                 óz  — t          ¦   «         st          d¦  «        ‚|                     dd¦  «        s|                     dd¦  «        rt          d¦  «        ‚| j        €=d|v r|d         | _        n+t
          j        | _        t                               d¦  «         |                     d¦  «        }t          |t          ¦  «        rtd	|                     ¦   «         v sd
|                     ¦   «         v rt          d¦  «        ‚t          t          |                     ¦   «         ¦  «        ¦  «        dk    | _        d S d S )Nz�A valid HQQ version (>=0.2.1) is not available. Please follow the instructions to install it: `https://github.com/mobiusml/hqq/`.Úfrom_tfFÚ	from_flaxzwConverting weights from tf/flax weights is currently not supported, please make sure the weights are in PyTorch format.r#   zOSetting dtype to torch.float32 as the default value since it was not specified.Ú
device_mapÚcpuÚdiskz­You are attempting to use an HQQ model with a device_map that contains a CPU or disk device. This is not supported. Please remove the CPU or disk device from the device_map.r   )r   ÚImportErrorÚgetÚ
ValueErrorr#   ÚtorchÚfloat32ÚloggerÚinfoÚ
isinstanceÚdictÚvaluesÚlenÚsetr$   )r%   Úargsr'   r,   s       r   Úvalidate_environmentz#HqqHfQuantizer.validate_environment>   sP  € Ý Ñ"Ô"ð 	Ýð Tñô ð ð �:Š:�i Ñ'Ô'ð 	¨6¯:ª:°kÀ5Ñ+IÔ+Ið 	Ýð;ñô ð ð
 Œ:ÐØ˜&Ð Ð Ø# Gœ_�”
�
å"œ]�”
Ý—’ÐmÑnÔnÐnà—Z’Z Ñ-Ô-ˆ
Ý�j¥$Ñ'Ô'ð 	IØ˜
×)Ò)Ñ+Ô+Ð+Ð+¨v¸×9JÒ9JÑ9LÔ9LÐ/LÐ/LÝ ðhñô ð õ
 (+­3¨z×/@Ò/@Ñ/BÔ/BÑ+CÔ+CÑ'DÔ'DÀqÒ'H�Ô$Ð$Ð$ð	Ið 	Ir   r   r   Úmissing_keysÚprefixÚreturnc                 ó,   — | j         rd„ |D ¦   «         S |S )Nc                 ó   — g | ]}d |v¯|‘Œ	S )Úweight© )Ú.0Úkeys     r   ú
<listcomp>z6HqqHfQuantizer.update_missing_keys.<locals>.<listcomp>_   s"   € ÐIÐIÐI˜C°HÀCÐ4GÐ4G�CÐ4GÐ4GÐ4Gr   )Úpre_quantized)r%   r   r=   r>   r'   s        r   Úupdate_missing_keysz"HqqHfQuantizer.update_missing_keys[   s)   € ð Ôð 	 ØIÐI <ÐIÑIÔIÐIàÐr   Úexpected_keysÚloaded_keysc                 óF  ‡‡‡— | j         s|S ˆfd„Št          |¦  «        }t          ¦   «         �rdddlm} |                     ¦   «         D ]\  }}||_        Œt          ¦   «         } ‰||¦  «         t          ¦   «         }	|D ]0Š|j        j        d         D ]}
|
‰v r|	 	                    ‰¦  «         ŒŒ1||	z  } |d d t          j        dd¬¦  «                             ¦   «         dhz
  }t          ¦   «         }|D ]2Št          ˆfd	„|D ¦   «         ¦  «        r| 	                    ‰¦  «         Œ3||z  }|D ]bŠ‰d
z   |v r| 	                    ‰d
z   ¦  «         n!|                     ˆfd„|D ¦   «         ¦  «         ‰dz   |v r| 	                    ‰dz   ¦  «         Œct          |¦  «        S )Nc                 óÆ   •— |                       ¦   «         D ]J\  }}t          |t          j        j        ¦  «        r|                     |j        ¦  «          ‰||¦  «         ŒKd S ©N)Únamed_childrenr6   r2   ÚnnÚLinearÚaddr   )r   Úlayersr   ÚmoduleÚ_find_hqq_quantizable_layerss       €r   rT   zIHqqHfQuantizer.update_expected_keys.<locals>._find_hqq_quantizable_layersk   sl   ø€ Ø %× 4Ò 4Ñ 6Ô 6ð =ð =‘��fÝ˜f¥u¤x¤Ñ8Ô8ð ,Ø—J’J˜vœ{Ñ+Ô+Ð+Ø,Ð,¨V°VÑ<Ô<Ð<Ð<ð=ð =r   r   ©Ú	HQQLinearÚskip_modulesr-   F©Úlinear_layerÚquant_configÚcompute_dtypeÚdeviceÚdel_origÚbiasc              3   ó    •K  — | ]}|‰v V — Œ	d S rM   rC   )rD   Ú_modulerE   s     €r   ú	<genexpr>z6HqqHfQuantizer.update_expected_keys.<locals>.<genexpr>‘   s'   øè è € ÐDÐD¨'�w #�~ÐDÐDÐDÐDÐDÐDr   z.weightc                 ó    •— h | ]
}‰d z   |z   ’ŒS )r   rC   )rD   Ú_ref_keyr`   s     €r   ú	<setcomp>z6HqqHfQuantizer.update_expected_keys.<locals>.<setcomp>›   s"   ø€ Ð$XÐ$XÐ$XÀ( W¨s¡]°XÑ%=Ð$XÐ$XÐ$Xr   z.bias)rG   r:   r   Úhqq.core.quantizerV   Únamed_modulesr   Úconfigr&   rQ   r2   Úfloat16Ústate_dict_keysÚanyÚupdateÚlist)r%   r   rI   rJ   Únew_keysrV   r   rS   Ú_valid_modulesÚ_skipped_modulesÚ_skip_moduleÚ	_ref_keysÚ_rm_keysrT   r`   rE   s                @@@r   Úupdate_expected_keysz#HqqHfQuantizer.update_expected_keysd   s?  øøø€ ð Ô!ð 	!Ø Ð ð	=ð 	=ð 	=ð 	=ð 	=õ �}Ñ%Ô%ˆÝÑÔñ +	4Ø3Ð3Ð3Ð3Ð3Ð3ð !&× 3Ò 3Ñ 5Ô 5ð #ð #‘��fØ"�”�õ !™UœUˆNØ(Ð(¨°Ñ?Ô?Ð?õ  #™uœuÐØ)ð 6ð 6�Ø$)¤LÔ$DÀ^Ô$Tð 6ð 6�LØ# wÐ.Ð.Ø(×,Ò,¨WÑ5Ô5Ð5øð6ð Ð.Ñ.ˆNð "˜	Ø!Ø!Ý#œmØØðñ ô ÷ ŠoÑÔ 6 (ñ+ˆIõ ‘u”uˆHØð &ð &�ÝÐDÐDÐDÐD°^ÐDÑDÔDÑDÔDð &Ø—L’L Ñ%Ô%Ð%øØ˜Ñ ˆHð *ð 4ð 4�Ø˜YÑ&¨+Ð5Ð5Ø—L’L ¨9Ñ!4Ñ5Ô5Ð5Ð5à—O’OÐ$XÐ$XÐ$XÐ$XÈiÐ$XÑ$XÔ$XÑYÔYÐYØ˜WÑ$¨Ð3Ð3Ø—L’L ¨7Ñ!2Ñ3Ô3Ð3øå�H‰~Œ~Ðr   Úparam_valueztorch.TensorÚ
param_nameÚ
state_dictc                 ó"  — t          ¦   «         rddlm} t          ||¦  «        \  }}| j        r't          |t          j        j        |f¦  «        o|dk    S t          |t          j        j        ¦  «        r|dk    pt          ||¦  «        o|dk    S )Nr   rU   rB   r^   )	r   re   rV   r   rG   r6   r2   rO   rP   )	r%   r   rt   ru   rv   r'   rV   rS   Útensor_names	            r   Úcheck_quantized_paramz$HqqHfQuantizer.check_quantized_param¡   s«   € õ ÑÔð 	4Ø3Ð3Ð3Ð3Ð3Ð3Ý2°5¸*ÑEÔEÑˆ�àÔð 		Ý˜v­¬¬¸Ð'CÑDÔDÐaÈ+ÐYaÒJaÐaõ ˜6¥5¤8¤?Ñ3Ô3ð ,Ø 8Ò+ðMõ ˜v yÑ1Ô1ÐK°kÀVÒ6Kðr   Útarget_deviceztorch.deviceÚunexpected_keysc                 ó  — t          ¦   «         r ddlm} t          d|fd„¦   «         }||_        t          ||¦  «        \  }	}
d                     |                     d¦  «        dd…         ¦  «        }t          ||¦  «        }|                     d¦  «        d         }|
dk    rdS i }| 	                    ¦   «         D ]E\  }}|dz   |v r9|||                     d¦  «        d         <   |�||v r| 
                    |¦  «         ŒF| j        rÛt          |	|¦  «        rdS  |dd| j        |d	¬
¦  «        }|                     |¦  «         |j        �Ht          |j        t           j        ¦  «        r)t           j                             |j        ¦  «        |_        | j        r|                      |¦  «        }t-          |||¦  «         |	`~	t           j                             ¦   «          dS | 	                    ¦   «         D ]3\  }}t-          |	|t           j                             |¦  «        ¦  «         Œ4|j        j        d         }|j        j        d         }d                     |	j                             d¦  «        dd…         ¦  «        }d}d|v r|}n||v r||         }|D ]}||	j        v rd} nŒ|�’ ||	|| j        |d¬¦  «        }|j        �Ht          |j        t           j        ¦  «        r)t           j                             |j        ¦  «        |_        | j        r|                      |¦  «        }t-          |||¦  «         n-|	                     | j        |¬¦  «        }	t-          |||	¦  «         t           j                             ¦   «          dS )a  
        Each nn.Linear layer is processed here.
        We first check if the corresponding module state_dict contains already HQQ quantized parameters.
        If not, we create a temp linear layer with the module state_dict params and use it for quantization
        r   rU   Ú_selfc                 óD   — t          j        d| j        | j        ¬¦  «        S )Nr   ©r#   r\   )r2   Úemptyr[   r\   )r}   s    r   rB   z5HqqHfQuantizer.create_quantized_param.<locals>.weightÍ   s   € å”{ 1¨EÔ,?ÈÌÐUÑUÔUÐUr   r   Nr   r^   FrX   rZ   rW   éþÿÿÿÚweight_quant_paramsT)rZ   r[   r\   r]   r   )r   re   rV   ÚpropertyrB   r   Újoinr   r   ÚitemsÚremoverG   r6   r#   Úload_state_dictr^   r2   ÚTensorrO   Ú	Parameterr$   Ú_patch_layer_for_multigpuÚsetattrÚ__dict__ÚcudaÚempty_cacherg   r&   r   Úto)r%   r   rt   ru   rz   rv   r{   rV   rB   rS   rx   Ú
layer_nameÚparent_moduleÚnodeÚmodule_state_dictÚkÚvÚ	hqq_layerrE   ÚtensorrZ   rW   Ú
module_tagÚmodule_quant_configÚskip_modules                            r   Úcreate_quantized_paramz%HqqHfQuantizer.create_quantized_param¸   sô  € õ ÑÔð 
	&Ø3Ð3Ð3Ð3Ð3Ð3õ
 ðV˜ið Vð Vð Vñ ŒXðVð  &ˆIÔå2°5¸*ÑEÔEÑˆ�Ø—X’X˜j×.Ò.¨sÑ3Ô3°C°R°CÔ8Ñ9Ô9ˆ
Ý# E¨:Ñ6Ô6ˆØ×Ò Ñ$Ô$ RÔ(ˆà˜&Ò Ð àˆFð ÐØ×$Ò$Ñ&Ô&ð 	.ð 	.‰DˆAˆqØ˜CÑ 1Ð$Ð$Ø67Ð! !§'¢'¨#¡,¤,¨rÔ"2Ñ3Ø"Ð.°1¸Ð3GÐ3GØ#×*Ò*¨1Ñ-Ô-Ð-øàÔð 	Ý˜& )Ñ,Ô,ð 	Ø�à%˜IØ!%Ø!%Ø"&¤*Ø(Ø"ðñ ô �	ð ×%Ò%Ð&7Ñ8Ô8Ð8àŒ~Ð)­j¸¼ÍÌÑ.VÔ.VÐ)Ý!&¤×!3Ò!3°I´NÑ!CÔ!C�	”àÔ#ð FØ ×:Ò:¸9ÑEÔE�	å�M 4¨Ñ3Ô3Ð3ð � ÝŒJ×"Ò"Ñ$Ô$Ð$ØˆFð -×2Ò2Ñ4Ô4ð 	=ð 	=‰KˆC�Ý�F˜C¥¤×!3Ò!3°FÑ!;Ô!;Ñ<Ô<Ð<Ð<ð ”|Ô7¸ÔGˆØ”|Ô7¸ÔGˆØ—X’X˜fœk×/Ò/°Ñ4Ô4°R°S°SÔ9Ñ:Ô:ˆ
Ø"ÐØ  LÐ0Ð0Ø".ÐÐØ˜<Ð'Ð'Ø".¨zÔ":Ðà'ð 	ð 	ˆKØ˜fœkÐ)Ð)Ø&*Ð#Ø�ð *ð Ð*Ø!˜	ØØ0Ø"œjØ$Øðñ ô ˆIð Œ~Ð)­j¸¼ÍÌÑ.VÔ.VÐ)Ý!&¤×!3Ò!3°I´NÑ!CÔ!C�	”àÔ#ð FØ ×:Ò:¸9ÑEÔE�	å�M 4¨Ñ3Ô3Ð3Ð3ð —Y’Y T¤Z¸�YÑFÔFˆFÝ�M 4¨Ñ0Ô0Ð0åŒ
×ÒÑ Ô Ð Ð Ð r   c                 óD   ‡‡— t          ‰¦  «        Šd„ Šˆˆfd„‰_        ‰S )Nc                 óÊ   — t          j        |                     | j        ¦  «        |                      ¦   «                              ¦   «         ¦  «        }| j        �
|| j        z  }|S rM   )r2   Úmatmulr�   r\   Ú
dequantizeÚtr^   )r%   ÚxÚouts      r   Úforward_with_devicezEHqqHfQuantizer._patch_layer_for_multigpu.<locals>.forward_with_device.  sP   € Ý”,˜qŸtšt D¤KÑ0Ô0°$·/²/Ñ2CÔ2C×2EÒ2EÑ2GÔ2GÑHÔHˆCØŒyÐ$Ø�t”yÑ �ØˆJr   c                 ó   •—  ‰‰| ¦  «        S rM   rC   )r¡   r£   r–   s    €€r   ú<lambda>z:HqqHfQuantizer._patch_layer_for_multigpu.<locals>.<lambda>4  s   ø€ Ð&9Ð&9¸)ÀQÑ&GÔ&G€ r   )r   Úforward)r%   r–   r£   s    `@r   rŠ   z(HqqHfQuantizer._patch_layer_for_multigpu+  s=   øø€ Ý+¨IÑ6Ô6ˆ	ð	ð 	ð 	ð HÐGÐGÐGÐGˆ	ÔØÐr   c                 ó2   — t          || j        ¬¦  «        }d S )N)r&   )r   r&   ©r%   r   r'   s      r   Ú$_process_model_before_weight_loadingz3HqqHfQuantizer._process_model_before_weight_loading7  s   € õ ' uÀ$ÔBZÐ[Ñ[Ô[ˆˆˆr   c                 óF   — d|_         |                      ¦   «         |_        |S ©NT)Úis_hqq_quantizedÚis_serializableÚis_hqq_serializabler¨   s      r   Ú#_process_model_after_weight_loadingz2HqqHfQuantizer._process_model_after_weight_loading@  s#   € Ø!%ˆÔØ$(×$8Ò$8Ñ$:Ô$:ˆÔ!Øˆr   Nc                 ó   — dS r«   rC   )r%   Úsafe_serializations     r   r­   zHqqHfQuantizer.is_serializableE  s   € Øˆtr   c                 ó   — dS r«   rC   )r%   s    r   Úis_trainablezHqqHfQuantizer.is_trainableH  s   € àˆtr   )r   r   rM   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úuse_keep_in_fp32_modulesÚ requires_parameters_quantizationÚrequires_calibrationÚrequired_packagesr"   r<   rl   ÚstrrH   rs   r7   r   Úboolry   r›   rŠ   r©   r¯   r­   rƒ   r³   Ú__classcell__)r(   s   @r   r   r   -   s  ø€ € € € € ðð ð  %ÐØ'+Ð$Ø ÐØ˜Ðð%ð %ð %ð %ð %ð
Ið Ið Ið: Ø&ð Ø6:¸3´ið ØILð à	ˆcŒð ð  ð  ð  ð;Ø&ð;Ø7;¸C´yð;ØOSÐTWÌyð;à	ˆcŒð;ð ;ð ;ð ;ðzà ðð $ðð ð	ð
 ˜˜c˜”Nðð 
ðð ð ð ð.p!à ðp!ð $ðp!ð ð	p!ð
 &ðp!ð ˜˜c˜”Nðp!ð ˜cœðp!ð p!ð p!ð p!ðf
ð 
ð 
ð\à ð\ð \ð \ð \ðð ð ð ð
ð ð ð ð ð˜dð ð ð ñ „Xðð ð ð ð r   r   )Útypingr   r   Úintegrationsr   Úutilsr   r   r	   r
   Úbaser   Úquantizers_utilsr   Úmodeling_utilsr   Úaccelerate.hooksr   r2   Ú
get_loggerr´   r4   r   r   rC   r   r   ú<module>rÇ      s3  ðð &Ð %Ð %Ð %Ð %Ð %Ð %Ð %à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø ZÐ ZÐ ZÐ ZÐ ZÐ ZÐ ZÐ ZÐ ZÐ ZÐ ZÐ ZØ Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð ð 1Ø0Ð0Ð0Ð0Ð0Ð0ð ÐÑÔð 9Ø8Ð8Ð8Ð8Ð8Ð8àÐÑÔð Ø€L€L€Là	ˆÔ	˜HÑ	%Ô	%€ðð ð ð]ð ]ð ]ð ]ð ]�[ñ ]ô ]ð ]ð ]ð ]r   