§
    ‚Štjf  ã                   óÖ   — d dl mZ 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  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)Úget_module_from_nameé   )Ú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ÚloggingN)ÚWeightConverterc                   óô   ‡ — e Zd ZU dZdZded<   ˆ 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eeeez  f         deeeez  f         fd„Z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 )ÚBnb4BitHfQuantizerzB
    4-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_4bit.pyr   zBnb4BitHfQuantizer.__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` 4-bit quantization requires accelerate: `pip install 'accelerate>=z'`z]Using `bitsandbytes` 4-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'Bnb4BitHfQuantizer.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   Úmodelr   Ú
param_nameÚparamztorch.TensorÚreturnc                 óz   •— |                       ||¦  «        rdS t          ¦   «                              |||¦  «        S )z4Return the element size (in bytes) for `param_name`.g      à?)Úparam_needs_quantizationr   Úparam_element_size)r   r2   r3   r4   r   s       €r   r8   z%Bnb4BitHfQuantizer.param_element_sizeS   s<   ø€ à×(Ò(¨°
Ñ;Ô;ð 	à�3å‰wŒw×)Ò)¨%°¸UÑCÔCÐCr   c                 óp   — dd l }t          ||¦  «        \  }}t          ||j        j        ¦  «        o|dk    S )Nr   Úbias)Úbitsandbytesr   r+   ÚnnÚ
Linear4bit)r   r2   r3   r   ÚbnbÚmoduleÚnames          r   r7   z+Bnb4BitHfQuantizer.param_needs_quantization[   s?   € Ø"Ð"Ð"Ð"å+¨E°:Ñ>Ô>‰ˆ�Ý˜& #¤&Ô"3Ñ4Ô4ÐG¸ÀºÐGr   Ú
max_memoryc                 óB   — d„ |                      ¦   «         D ¦   «         }|S )Nc                 ó    — i | ]\  }}||d z  “ŒS )gÍÌÌÌÌÌì?© )Ú.0ÚkeyÚvals      r   ú
<dictcomp>z8Bnb4BitHfQuantizer.adjust_max_memory.<locals>.<dictcomp>c   s"   € ÐIÐIÐI©(¨#¨s�c˜3 ™:ÐIÐIÐIr   )Úitems)r   rA   s     r   Úadjust_max_memoryz$Bnb4BitHfQuantizer.adjust_max_memorya   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   ÚhasattrrM   r   rN   r   ÚxpuÚloggerÚinfo)r   r$   s     r   Úupdate_device_mapz$Bnb4BitHfQuantizer.update_device_mapf   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   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%   rD   )rE   rF   Úvalues      r   ú
<listcomp>zKBnb4BitHfQuantizer._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(   rY   Úget_modules_to_not_convertr   Úllm_int8_skip_modulesÚ_keep_in_fp32_modulesr]   r*   r+   r,   rI   Úextendr^   )r   r2   r$   r   rY   Úkeys_on_cpus         r   Ú$_process_model_before_weight_loadingz7Bnb4BitHfQuantizer._process_model_before_weight_loadingy   sÈ   € ð 	;Ð:Ð:Ð:Ð:Ð:à&*×&EÒ&EØ�4Ô+ÔAÀ5ÔC^ñ'
ô '
ˆÔ#ð Ô#ÔDð 	@Ý˜*¥dÑ+Ô+ð @ØdÐd°Z×5EÒ5EÑ5GÔ5GÐdÑdÔd�ØÔ+×2Ò2°;Ñ?Ô?Ð?à'Ð'ØØ#'Ô#>Ø $Ô 8ØÔ,ð	
ñ 
ô 
ˆˆˆr   c                 ón   — t          |dd¦  «         t          |d|                      ¦   «         ¦  «         |S )NÚis_loaded_in_4bitTÚis_4bit_serializable)ÚsetattrÚis_serializable)r   r2   r   s      r   Ú#_process_model_after_weight_loadingz6Bnb4BitHfQuantizer._process_model_after_weight_loading‘   s9   € Ý�Ð*¨DÑ1Ô1Ð1Ý�Ð-¨t×/CÒ/CÑ/EÔ/EÑFÔFÐFØˆr   c                 ó   — dS ©NTrD   ©r   s    r   ri   z"Bnb4BitHfQuantizer.is_serializable–   s   € Øˆtr   c                 ó   — dS rl   rD   rm   s    r   Úis_trainablezBnb4BitHfQuantizer.is_trainable™   s   € àˆtr   Nc                 ó8   — ddl m}  ||| j        |¬¦  «        }|S )Nr   )Údequantize_and_replace)r   Údtype)r(   rq   r   )r   r2   rr   rq   s       r   Ú_dequantizezBnb4BitHfQuantizer._dequantize�   s4   € Ø9Ð9Ð9Ð9Ð9Ð9à&Ð& uÀ$ÔBZÐbgÐhÑhÔhˆØˆr   c                 ó$   — ddl m}  || ¦  «        S )Nr   )ÚBnb4bitQuantize)Úintegrations.bitsandbytesru   )r   ru   s     r   Úget_quantize_opsz#Bnb4BitHfQuantizer.get_quantize_ops£   s$   € Ø?Ð?Ð?Ð?Ð?Ð?àˆ˜tÑ$Ô$Ð$r   c                 ó^   — ddl m} | j        rt          g d¢d || ¦  «        g¬¦  «        gS g S )Nr   )ÚBnb4bitDeserialize)zweight.nested_absmaxzweight.nested_quant_mapzweight.quant_mapzweight.absmaxz$weight.quant_state.bitsandbytes__nf4z$weight.quant_state.bitsandbytes__fp4Úweightrz   )Úsource_patternsÚtarget_patternsÚ
operations)rv   ry   r^   r   )r   ry   s     r   Úget_weight_conversionsz)Bnb4BitHfQuantizer.get_weight_conversions¨   sg   € ØBÐBÐBÐBÐBÐBàÔð 	åð%ð %ð %ð %-Ø 2Ð 2°4Ñ 8Ô 8Ð9ðñ ô ðð ð ˆ	r   )r2   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úrequires_calibrationÚ__annotations__r   r1   ÚstrÚfloatr8   Úboolr7   r,   ÚintrJ   rW   rd   rj   ri   Úpropertyro   rs   rw   r~   Ú__classcell__)r   s   @r   r   r   -   sÄ  ø€ € € € € € ðð ð !ÐØ-Ð-Ð-Ñ-ð8ð 8ð 8ð 8ð 8ðð ð ð6DÐ(9ð DÀsð DÐSað DÐfkð Dð Dð Dð Dð Dð DðHÐ.?ð HÈSð HÐ_cð Hð Hð Hð Hð¨D°°c¸C±i°Ô,@ð ÀTÈ#ÈsÐUXÉyÈ.ÔEYð ð ð ð ð
ð ð ð&
à ð
ð 
ð 
ð 
ð0ð ð ð ð
ð ð ð ð˜dð ð ð ñ „Xððð ð ð ð%ð %ð %ð
ð ð ð ð ð ð r   r   )Útypingr   Úbaser   Úquantizers_utilsr   Úmodeling_utilsr   Úutils.quantization_configr	   Úutilsr
   r   r   r   r   r   r   r   r   rO   Úcore_model_loadingr   Ú
get_loggerr   rU   r   rD   r   r   ú<module>r“      sW  ðð !Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ð ð ?Ø0Ð0Ð0Ð0Ð0Ð0Ø>Ð>Ð>Ð>Ð>Ð>ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð ÐÑÔð 5Ø€L€L€Là4Ð4Ð4Ð4Ð4Ð4à	ˆÔ	˜HÑ	%Ô	%€ðNð Nð Nð Nð N˜ñ Nô Nð Nð Nð Nr   