§
    ‚Štjµ  ã                   ó¦   — d dl mZ ddlmZ erddlmZ ddlmZ ddlm	Z	m
Z
mZ  e
¦   «         rd dlZ ej        e¦  «        Z G d	„ d
e¦  «        ZdS )é    )ÚTYPE_CHECKINGé   )ÚHfQuantizeré   )ÚPreTrainedModel)ÚBitNetQuantConfig)Úis_accelerate_availableÚis_torch_availableÚloggingNc                   óÄ   ‡ — e Zd ZU dZdZded<   ˆ fd„Zd„ Z	 	 dd	„Zd
e	e
ee
z  f         de	e
ee
z  f         fd„Zd„ Zedefd„¦   «         Zedefd„¦   «         Zd„ Zˆ xZS )ÚBitNetHfQuantizerzó
    1.58-bit quantization from BitNet quantization method:
    Before loading: it converts the linear layers into BitLinear layers during loading.

    Check out the paper introducing this method: https://huggingface.co/papers/2402.17764
    Tr   Úquantization_configc                 ó<   •—  t          ¦   «         j        |fi |¤Ž d S )N)ÚsuperÚ__init__)Úselfr   ÚkwargsÚ	__class__s      €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/quantizers/quantizer_bitnet.pyr   zBitNetHfQuantizer.__init__,   s)   ø€ Ø�‰ŒÔÐ,Ð7Ð7°Ð7Ð7Ð7Ð7Ð7ó    c                 óä  — t          ¦   «         st          d¦  «        ‚t          j                             ¦   «         st
                               d¦  «         d S |                     d¦  «        }|€t
                               d¦  «         d S t          |t          ¦  «        rNt          |¦  «        dk    rd|                     ¦   «         v sd|                     ¦   «         v rt          d¦  «        ‚d S d S )	NzOLoading a BitNet quantized model requires accelerate (`pip install accelerate`)zhYou don't have a GPU available to load the model, the inference will be slow because of weight unpackingÚ
device_mapz�You have loaded a BitNet model on CPU and have a CUDA device available, make sure to set your model on a GPU device in order to run your model.r   ÚcpuÚdiskz¯You are attempting to load a BitNet 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	   ÚImportErrorÚtorchÚcudaÚis_availableÚloggerÚwarning_onceÚgetÚ
isinstanceÚdictÚlenÚvaluesÚ
ValueError)r   Úargsr   r   s       r   Úvalidate_environmentz&BitNetHfQuantizer.validate_environment/   s  € Ý&Ñ(Ô(ð 	qÝÐoÑpÔpÐpåŒz×&Ò&Ñ(Ô(ð 	Ý×ÒØzñô ð ð ˆFà—Z’Z Ñ-Ô-ˆ
ØÐÝ×ÒðIñô ð ð ð õ ˜
¥DÑ)Ô)ð 	Ý�:‰Œ Ò"Ð" u°
×0AÒ0AÑ0CÔ0CÐ'CÐ'CÀvÐQ[×QbÒQbÑQdÔQdÐGdÐGdÝ ðgñô ð ð	ð 	ØGdÐGdr   Úmodelr   c                 ó˜   — ddl m} |                      || j        j        |j        ¦  «        | _         ||| j        | j        ¬¦  «        }d S )Nr   )Úreplace_with_bitnet_linear)Úmodules_to_not_convertr   )Úintegrationsr+   Úget_modules_to_not_convertr   r,   Ú_keep_in_fp32_modules)r   r)   r   r+   s       r   Ú$_process_model_before_weight_loadingz6BitNetHfQuantizer._process_model_before_weight_loadingF   sj   € ð
 	>Ð=Ð=Ð=Ð=Ð=à&*×&EÒ&EØ�4Ô+ÔBÀEÔD_ñ'
ô '
ˆÔ#ð +Ð*ØØ#'Ô#>Ø $Ô 8ð
ñ 
ô 
ˆˆˆr   Ú
max_memoryÚreturnc                 óB   — d„ |                      ¦   «         D ¦   «         }|S )Nc                 ó    — i | ]\  }}||d z  “ŒS )gÍÌÌÌÌÌì?© )Ú.0ÚkeyÚvals      r   ú
<dictcomp>z7BitNetHfQuantizer.adjust_max_memory.<locals>.<dictcomp>X   s"   € ÐIÐIÐI©(¨#¨s�c˜3 ™:ÐIÐIÐIr   )Úitems)r   r1   s     r   Úadjust_max_memoryz#BitNetHfQuantizer.adjust_max_memoryW   s'   € ØIÐI°j×6FÒ6FÑ6HÔ6HÐIÑIÔIˆ
ØÐr   c                 ó   — dS )NTr5   ©r   s    r   Úis_serializablez!BitNetHfQuantizer.is_serializable[   s   € Øˆtr   c                 óB   — | j         j        dk    o| j         j        dk    S )NÚautobitlinearÚonline©r   Úlinear_classÚquantization_moder=   s    r   Úis_trainablezBitNetHfQuantizer.is_trainable^   s+   € ð Ô$Ô1°_ÒDð GØÔ(Ô:¸hÒFð	
r   c                 óB   — | j         j        dk    o| j         j        dk    S )zUFlag indicating whether the quantized model can carry out quantization aware trainingr@   rA   rB   r=   s    r   Úis_qat_trainablez"BitNetHfQuantizer.is_qat_trainablee   s+   € ð Ô$Ô1°_ÒDð GØÔ(Ô:¸hÒFð	
r   c                 ó”   — ddl m} ddlm} | j        j        dk    r+| j        j        dk    r |dgdg || ¦  «        g¬¦  «        gS g S )Nr   )ÚWeightConverter)ÚBitNetDeserializer@   ÚofflineÚweight)Úsource_patternsÚtarget_patternsÚ
operations)Úcore_model_loadingrI   Úintegrations.bitnetrJ   r   rC   rD   )r   rI   rJ   s      r   Úget_weight_conversionsz(BitNetHfQuantizer.get_weight_conversionsm   sŒ   € Ø8Ð8Ð8Ð8Ð8Ð8Ø;Ð;Ð;Ð;Ð;Ð;ð Ô$Ô1°_ÒDÐDØÔ(Ô:¸iÒGÐGð  �Ø%- JØ%- JØ 1Ð 1°$Ñ 7Ô 7Ð8ðñ ô ðð ð ˆ	r   )r)   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequires_calibrationÚ__annotations__r   r(   r0   r#   ÚstrÚintr;   r>   ÚpropertyÚboolrE   rG   rR   Ú__classcell__)r   s   @r   r   r   !   s,  ø€ € € € € € ðð ð  ÐØ,Ð,Ð,Ñ,ð8ð 8ð 8ð 8ð 8ðð ð ð.
à ð
ð 
ð 
ð 
ð"¨D°°c¸C±i°Ô,@ð ÀTÈ#ÈsÐUXÉyÈ.ÔEYð ð ð ð ðð ð ð ð
˜dð 
ð 
ð 
ñ „Xð
ð ð
 $ð 
ð 
ð 
ñ „Xð
ðð ð ð ð ð ð r   r   )Útypingr   Úbaser   Úmodeling_utilsr   Úutils.quantization_configr   Úutilsr	   r
   r   r   Ú
get_loggerrS   r   r   r5   r   r   ú<module>rd      så   ðð !Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð ð ð >Ø0Ð0Ð0Ð0Ð0Ð0Ø=Ð=Ð=Ð=Ð=Ð=à HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hð ÐÑÔð Ø€L€L€Lð 
ˆÔ	˜HÑ	%Ô	%€ð[ð [ð [ð [ð [˜ñ [ô [ð [ð [ð [r   