Ë
    Hêñi¤+  ã                   óì   — d dl mZ ddlmZ ddlmZmZmZ ddlm	Z	 ddl
mZ erddlmZ dd	lmZ  e«       rd d
lZ e«       rd dlmZ ed„ «       Zee_         ej*                  e«      Z G d„ de	«      Zy
)é    )ÚTYPE_CHECKINGé   )Úprepare_for_hqq_linear)Úis_hqq_availableÚis_torch_availableÚloggingé   )ÚHfQuantizer)Úget_module_from_name)ÚPreTrainedModel)Ú	HqqConfigN)Ú	HQQLinearc                 óZ   — t        j                  d| j                  | j                  ¬«      S )Nr   )ÚdtypeÚdevice)ÚtorchÚemptyÚcompute_dtyper   ©Úselfs    úg/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/transformers/quantizers/quantizer_hqq.pyÚweightr   %   s   € ä�{‰{˜1 D×$6Ñ$6¸t¿{¹{ÔKÐKó    c                   ó‚   ‡ — e Zd ZU dZdZded<   ˆ fd„Zd„ Zddd	ed
e	fd„Z
d„ Z	 	 dd„Zdd„Z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().
    Fr   Úquantization_configc                 ó²   •— t        «       st        d«      ‚t        ‰| �  |fi |¤Ž d | _        d| _        t        d d «      j                  «       dhz
  | _        y )Nz�A valid HQQ version (>=0.2.1) is not available. Please follow the instructions to install it: `https://github.com/mobiusml/hqq/`.FÚbias)	r   ÚImportErrorÚsuperÚ__init__r   Úusing_multi_gpur   Ústate_dict_keysÚhqq_keys)r   r   ÚkwargsÚ	__class__s      €r   r!   zHqqHfQuantizer.__init__7   s^   ø€ ÜÔ!Üð Tóð ô 	‰ÑÐ,Ñ7°Ò7ØˆŒ
Ø$ˆÔä! $¨Ó-×=Ñ=Ó?À6À(ÑJˆ�r   c                 ó„  — | j                   €9d|v r|d   | _         n*t        j                  | _         t        j	                  d«       |j                  d«      }t        |t        «      rZd|j                  «       v sd|j                  «       v rt        d«      ‚t        t        |j                  «       «      «      dkD  | _        y y )Nr   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   r   Úfloat32ÚloggerÚinfoÚgetÚ
isinstanceÚdictÚvaluesÚ
ValueErrorÚlenÚsetr"   )r   Úargsr%   r(   s       r   Úvalidate_environmentz#HqqHfQuantizer.validate_environmentB   sª   € Ø�:‰:ÐØ˜&Ñ Ø# G™_�•
ä"Ÿ]™]�”
Ü—‘ÐmÔnà—Z‘Z Ó-ˆ
Ü�j¤$Ô'Ø˜
×)Ñ)Ó+Ñ+¨v¸×9JÑ9JÓ9LÑ/LÜ ðhóð ô
 (+¬3¨z×/@Ñ/@Ó/BÓ+CÓ'DÀqÑ'H�Õ$ð (r   Úmodelr   Ú
param_nameÚreturnc                 óh   — t        ||«      \  }}t        |t        j                  j                  «      S ©N)r   r/   r   ÚnnÚLinear)r   r7   r8   r%   ÚmoduleÚ_s         r   Úparam_needs_quantizationz'HqqHfQuantizer.param_needs_quantization’   s)   € Ü(¨°
Ó;‰	ˆ�ô ˜&¤%§(¡(§/¡/Ó2Ð2r   c                 ó&   ‡‡— d„ Šˆˆfd„‰_         ‰S )Nc                 óÒ   — t        j                  |j                  | j                  «      | j	                  «       j                  «       «      }| j                  �|| j                  z  }|S r;   )r   ÚmatmulÚtor   Ú
dequantizeÚtr   )r   ÚxÚouts      r   Úforward_with_devicezEHqqHfQuantizer._patch_layer_for_multigpu.<locals>.forward_with_deviceì   sL   € Ü—,‘,˜qŸt™t D§K¡KÓ0°$·/±/Ó2C×2EÑ2EÓ2GÓHˆCØ�y‰yÐ$Ø�t—y‘yÑ �ØˆJr   c                 ó   •—  ‰‰| «      S r;   © )rG   rI   Ú	hqq_layers    €€r   ú<lambda>z:HqqHfQuantizer._patch_layer_for_multigpu.<locals>.<lambda>ò   s   ø€ Ñ&9¸)ÀQÓ&G€ r   )Úforward)r   rL   rI   s    `@r   Ú_patch_layer_for_multigpuz(HqqHfQuantizer._patch_layer_for_multigpuë   s   ù€ ò	ô Hˆ	ÔØÐr   c                 ó2   — t        || j                  ¬«      }y )N)r   )r   r   ©r   r7   r%   s      r   Ú$_process_model_before_weight_loadingz3HqqHfQuantizer._process_model_before_weight_loadingõ   s   € ô ' uÀ$×BZÑBZÔ[‰r   c                 óV   — t        |dd«       t        |d| j                  «       «       |S )NÚis_hqq_quantizedTÚis_hqq_serializable)ÚsetattrÚis_serializablerQ   s      r   Ú#_process_model_after_weight_loadingz2HqqHfQuantizer._process_model_after_weight_loadingþ   s*   € Ü�Ð)¨4Ô0Ü�Ð,¨d×.BÑ.BÓ.DÔEØˆr   c                  ó   — y©NTrK   r   s    r   rW   zHqqHfQuantizer.is_serializable  s   € Ør   c                  ó   — yrZ   rK   r   s    r   Úis_trainablezHqqHfQuantizer.is_trainable  s   € àr   )r7   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequires_calibrationÚ__annotations__r!   r6   ÚstrÚboolr@   rO   rR   rX   rW   Úpropertyr\   Ú__classcell__)r&   s   @r   r   r   .   sy   ø… ñð
 !ÐØ$Ó$ô	KòIð`3Ð.?ð 3ÈSð 3Ð_có 3òrð\à ó\óò
ð ð˜dò ó ôr   r   )Útypingr   Úintegrationsr   Úutilsr   r   r   Úbaser
   Úquantizers_utilsr   Úmodeling_utilsr   Úutils.quantization_configr   r   Úhqq.core.quantizer   re   r   Ú
get_loggerr]   r,   r   rK   r   r   ú<module>rp      sx   ðõ !å 1ß AÑ AÝ Ý 2ñ Ý0Ý5ñ ÔÛáÔÝ+ð
 ñLó ðLð €IÔà	ˆ×	Ñ	˜HÓ	%€ôZ�[õ Zr   