§
    ‚Š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mZmZmZmZmZmZ ddlmZ  e¦   «         r
d d	lZdd
lmZ  ej        e¦  «        Z G d„ de¦  «        Zd	S )é    )ÚTYPE_CHECKINGé   )ÚHfQuantizeré   )ÚPreTrainedModel)ÚBitsAndBytesConfig)	ÚACCELERATE_MIN_VERSIONÚBITSANDBYTES_MIN_VERSIONÚis_accelerate_availableÚis_bitsandbytes_availableÚis_torch_availableÚis_torch_hpu_availableÚis_torch_npu_availableÚis_torch_xpu_availableÚlogging)Úget_module_from_nameN)ÚWeightConverterc                   óô   ‡ — e Zd ZU dZdZded<   ˆ fd„Zd„ Zdee	e
e	z  f         dee	e
e	z  f         fd	„Zd
„ Zddde	dddefˆ fd„Zddde	defd„Zdd„Z	 	 dd„Zd„ Zedefd„¦   «         Zdd„Zd„ Zd„ Zˆ xZS )ÚBnb8BitHfQuantizerzB
    8-bit quantization from bitsandbytes quantization method
    Fr   Úquantization_configc                 ó<   •—  t          ¦   «         j        |fi |¤Ž d S ©N)ÚsuperÚ__init__)Úselfr   ÚkwargsÚ	__class__s      €úh/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/quantizers/quantizer_bnb_8bit.pyr   zBnb8BitHfQuantizer.__init__5   s)   ø€ Ø�‰ŒÔÐ,Ð7Ð7°Ð7Ð7Ð7Ð7Ð7ó    c                 ó¸  — t          ¦   «         st          dt          › d�¦  «        ‚t          ¦   «         st          dt          › d�¦  «        ‚ddlm}  |d¬¦  «         |                     d	¦  «        }| j        j	        sTt          |t          ¦  «        rAt          |                     ¦   «         ¦  «        }|d
hk    rd
|v sd|v rt          d¦  «        ‚d S d S d S d S )NzWUsing `bitsandbytes` 8-bit quantization requires accelerate: `pip install 'accelerate>=z'`z]Using `bitsandbytes` 8-bit quantization requires bitsandbytes: `pip install -U bitsandbytes>=ú`r   )Ú!validate_bnb_backend_availabilityT)Úraise_exceptionÚ
device_mapÚcpuÚdiska¾  Some modules are dispatched on the CPU or the disk. Make sure you have enough GPU RAM to fit the quantized model. If you want to dispatch the model on the CPU or the disk while keeping these modules in 32-bit, you need to set `llm_int8_enable_fp32_cpu_offload=True` and pass a custom `device_map` to `from_pretrained`. Check https://huggingface.co/docs/transformers/main/en/main_classes/quantization#offload-between-cpu-and-gpu for more details. )r   ÚImportErrorr	   r   r
   Úintegrationsr"   Úgetr   Ú llm_int8_enable_fp32_cpu_offloadÚ
isinstanceÚdictÚsetÚvaluesÚ
ValueError)r   Úargsr   r"   r$   r.   s         r   Úvalidate_environmentz'Bnb8BitHfQuantizer.validate_environment8   sL  € Ý&Ñ(Ô(ð 	Ýð Eõ  kAð  Eð  Eð  Eñô ð õ )Ñ*Ô*ð 	Ýð Lõ  qIð  Lð  Lð  Lñô ð ð 	EÐDÐDÐDÐDÐDà)Ð)¸$Ð?Ñ?Ô?Ð?à—Z’Z Ñ-Ô-ˆ
ØÔ'ÔHð 
	ÍZÐXbÕdhÑMiÔMið 
	Ý˜×*Ò*Ñ,Ô,Ñ-Ô-ˆFØ˜%˜Ò Ð  e¨v o o¸À6Ð9IÐ9IÝ ð)ñô ð ð
	ð 
	ð 
	ð 
	à Ð Ð9IÐ9Ir   Ú
max_memoryÚreturnc                 óB   — d„ |                      ¦   «         D ¦   «         }|S )Nc                 ó    — i | ]\  }}||d z  “ŒS )gÍÌÌÌÌÌì?© )Ú.0ÚkeyÚvals      r   ú
<dictcomp>z8Bnb8BitHfQuantizer.adjust_max_memory.<locals>.<dictcomp>U   s"   € ÐIÐIÐI©(¨#¨s�c˜3 ™:ÐIÐIÐIr   )Úitems)r   r2   s     r   Úadjust_max_memoryz$Bnb8BitHfQuantizer.adjust_max_memoryS   s'   € àIÐI°j×6FÒ6FÑ6HÔ6HÐIÑIÔIˆ
ØÐr   c                 óH  — |�€t           j                             ¦   «         r!dt           j                             ¦   «         i}nÁt	          ¦   «         r9t          t           d¦  «        r$ddt           j                             ¦   «         › �i}nzt          ¦   «         r9t          t           d¦  «        r$ddt           j                             ¦   «         › �i}n3t          ¦   «         r!dt           j
                             ¦   «         i}nddi}t                               d|› d�¦  «         |S )	NÚ Únpuznpu:Úhpuzhpu:r%   z:The device_map was not initialized. Setting device_map to zL. If you want to use the model for inference, please set device_map ='auto' )ÚtorchÚcudaÚis_availableÚcurrent_devicer   Úhasattrr?   r   r@   r   ÚxpuÚloggerÚinfo)r   r$   s     r   Úupdate_device_mapz$Bnb8BitHfQuantizer.update_device_mapX   s&  € ØÑÝŒz×&Ò&Ñ(Ô(ð 	)Ø ¥%¤*×";Ò";Ñ"=Ô"=Ð>�
�
Ý'Ñ)Ô)ð )­gµe¸UÑ.CÔ.Cð )Ø Ð"E­¬×)AÒ)AÑ)CÔ)CÐ"EÐ"EÐF�
�
Ý'Ñ)Ô)ð )­gµe¸UÑ.CÔ.Cð )Ø Ð"E­¬×)AÒ)AÑ)CÔ)CÐ"EÐ"EÐF�
�
Ý'Ñ)Ô)ð )Ø ¥%¤)×":Ò":Ñ"<Ô"<Ð=�
�
à  %˜[�
Ý�KŠKð]Ø)3ð]ð ]ð ]ñô ð ð
 Ðr   Úmodelr   Ú
param_nameÚparamztorch.Tensorc                 óz   •— |                       ||¦  «        rdS t          ¦   «                              |||¦  «        S )z4Return the element size (in bytes) for `param_name`.r   )Úparam_needs_quantizationr   Úparam_element_size)r   rJ   rK   rL   r   s       €r   rO   z%Bnb8BitHfQuantizer.param_element_sizek   s<   ø€ à×(Ò(¨°
Ñ;Ô;ð 	à�1Ý‰wŒw×)Ò)¨%°¸UÑCÔCÐCr   c                 óp   — dd l }t          ||¦  «        \  }}t          ||j        j        ¦  «        o|dk    S )Nr   Úbias)Úbitsandbytesr   r+   ÚnnÚLinear8bitLt)r   rJ   rK   r   ÚbnbÚmoduleÚnames          r   rN   z+Bnb8BitHfQuantizer.param_needs_quantizationr   s?   € Ø"Ð"Ð"Ð"å+¨E°:Ñ>Ô>‰ˆ�Ý˜& #¤&Ô"5Ñ6Ô6ÐI¸4À6º>ÐIr   c                 óZ   — t          |dd¦  «         |                      ¦   «         |_        |S )NÚis_loaded_in_8bitT)ÚsetattrÚis_serializableÚis_8bit_serializable)r   rJ   r   s      r   Ú#_process_model_after_weight_loadingz6Bnb8BitHfQuantizer._process_model_after_weight_loadingx   s.   € Ý�Ð*¨DÑ1Ô1Ð1Ø%)×%9Ò%9Ñ%;Ô%;ˆÔ"Øˆr   c                 óV  — ddl m} |                      || j        j        |j        ¦  «        | _        | j        j        rMt          |t          ¦  «        r8d„ | 
                    ¦   «         D ¦   «         }| j                             |¦  «          ||| j        | j        | j        ¬¦  «        }d S )Nr   )Úreplace_with_bnb_linearc                 ó    — g | ]\  }}|d v ¯	|‘ŒS ))r&   r%   r6   )r7   r8   Úvalues      r   ú
<listcomp>zKBnb8BitHfQuantizer._process_model_before_weight_loading.<locals>.<listcomp>‹   s'   € ÐdÐdÐd¡z s¨EÈ5ÐTcÐKcÐKc˜sÐKcÐKcÐKcr   )Úmodules_to_not_convertr   Úpre_quantized)r(   r_   Úget_modules_to_not_convertr   Úllm_int8_skip_modulesÚ_keep_in_fp32_modulesrc   r*   r+   r,   r;   Úextendrd   )r   rJ   r$   r   r_   Úkeys_on_cpus         r   Ú$_process_model_before_weight_loadingz7Bnb8BitHfQuantizer._process_model_before_weight_loading}   sÈ   € ð 	;Ð:Ð:Ð:Ð:Ð:à&*×&EÒ&EØ�4Ô+ÔAÀ5ÔC^ñ'
ô '
ˆÔ#ð Ô#ÔDð 	@Ý˜*¥dÑ+Ô+ð @ØdÐd°Z×5EÒ5EÑ5GÔ5GÐdÑdÔd�ØÔ+×2Ò2°;Ñ?Ô?Ð?à'Ð'ØØ#'Ô#>Ø $Ô 8ØÔ,ð	
ñ 
ô 
ˆˆˆr   c                 ó   — dS ©NTr6   ©r   s    r   r[   z"Bnb8BitHfQuantizer.is_serializable•   s   € Øˆtr   c                 ó   — dS rl   r6   rm   s    r   Úis_trainablezBnb8BitHfQuantizer.is_trainable˜   s   € àˆtr   Nc                 ó8   — ddl m}  ||| j        |¬¦  «        }|S )Nr   )Údequantize_and_replace)r   Údtype)r(   rq   r   )r   rJ   rr   rq   s       r   Ú_dequantizezBnb8BitHfQuantizer._dequantizeœ   s4   € Ø9Ð9Ð9Ð9Ð9Ð9à&Ð& uÀ$ÔBZÐbgÐhÑhÔhˆØˆr   c                 ó$   — ddl m}  || ¦  «        S )Nr   )ÚBnb8bitQuantize)Úintegrations.bitsandbytesru   )r   ru   s     r   Úget_quantize_opsz#Bnb8BitHfQuantizer.get_quantize_ops¢   s$   € Ø?Ð?Ð?Ð?Ð?Ð?àˆ˜tÑ$Ô$Ð$r   c                 ó^   — ddl m} | j        rt          g d¢d || ¦  «        g¬¦  «        gS g S )Nr   )ÚBnb8bitDeserialize)ÚSCBÚweight_formatÚweightr|   )Úsource_patternsÚtarget_patternsÚ
operations)rv   ry   rd   r   )r   ry   s     r   Úget_weight_conversionsz)Bnb8BitHfQuantizer.get_weight_conversions§   s_   € ØBÐBÐBÐBÐBÐBàÔð 	åØ$FÐ$FÐ$FØ$,Ø 2Ð 2°4Ñ 8Ô 8Ð9ðñ ô ðð ð ˆ	r   )rJ   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequires_calibrationÚ__annotations__r   r1   r,   ÚstrÚintr<   rI   ÚfloatrO   ÚboolrN   r]   rj   r[   Úpropertyro   rs   rw   r€   Ú__classcell__)r   s   @r   r   r   -   sÄ  ø€ € € € € € ðð ð !ÐØ-Ð-Ð-Ñ-ð8ð 8ð 8ð 8ð 8ðð ð ð6¨D°°c¸C±i°Ô,@ð ÀTÈ#ÈsÐUXÉyÈ.ÔEYð ð ð ð ð
ð ð ð&DÐ(9ð DÀsð DÐSað DÐfkð Dð Dð Dð Dð Dð DðJÐ.?ð JÈSð JÐ_cð Jð Jð Jð Jðð ð ð ð

à ð
ð 
ð 
ð 
ð0ð ð ð ð˜dð ð ð ñ „Xððð ð ð ð%ð %ð %ð
ð ð ð ð ð ð r   r   )Útypingr   Úbaser   Úmodeling_utilsr   Úutils.quantization_configr   Úutilsr	   r
   r   r   r   r   r   r   r   Úquantizers_utilsr   rA   Úcore_model_loadingr   Ú
get_loggerr�   rG   r   r6   r   r   ú<module>r•      sY  ðð !Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð ð ð ?Ø0Ð0Ð0Ð0Ð0Ð0Ø>Ð>Ð>Ð>Ð>Ð>ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 3Ð 2Ð 2Ð 2Ð 2Ð 2ð ÐÑÔð 5Ø€L€L€Là4Ð4Ð4Ð4Ð4Ð4à	ˆÔ	˜HÑ	%Ô	%€ðEð Eð Eð Eð E˜ñ Eô Eð Eð Eð Er   