§
    ‚Štjt9  ã                   ó°  — d dl Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
mZ  e	¦   «         rd dlZ e
¦   «         rd dlZd dlmZ ddlmZ  e¦   «         rd dlZd dlmZmZ  ej        e¦  «        Z G d„ d	e¦  «        Z G d
„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z	 	 	 ddej        j        dee          dz  fd„Z!ddd„Z"d„ Z#dd„Z$dd„Z%dS )é    Né   )ÚConversionOps)Úget_module_from_nameÚshould_convert_module)Úget_available_devicesÚis_accelerate_availableÚis_bitsandbytes_availableÚis_torch_availableÚlogging)ÚConv1D)Úadd_hook_to_moduleÚremove_hook_from_modulec                   ó’   — e Zd Zd„ Z	 	 ddeeeej                 f         dedz  dej	        j
        dz  deeej        f         fd„ZdS )	ÚBnb4bitQuantizec                 ó   — || _         d S ©N©Úhf_quantizer©Úselfr   s     úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/integrations/bitsandbytes.pyÚ__init__zBnb4bitQuantize.__init__   ó   € Ø(ˆÔÐÐó    NÚ
input_dictÚfull_layer_nameÚmodelÚreturnc                 óŽ  — i }|                      ¦   «         D ]­\  }}t          |t          ¦  «        r|d         }t          ||¦  «        \  }}	t	          |j        t          ¦  «        r|j        }|                     |¦  «        }
t          j
        j        |fddi|
j        ¤Ž                     |j        ¦  «        }d|_        |||<   Œ®|S )a:  
        we need to store some parameters to create the quantized weight. For example, bnb requires 6 values that are stored in the checkpoint to recover the quantized weight. So we store them in a dict that it stored in hf_quantizer for now as we can't save it in the op since we create an op per tensor.
        r   Úrequires_gradFT)ÚitemsÚ
isinstanceÚlistr   Ú
issubclassÚ
source_clsr   ÚTÚget_parameter_or_bufferÚbnbÚnnÚ
Params4bitÚ__dict__ÚtoÚdeviceÚ_is_hf_initialized)r   r   r   r   ÚkwargsÚresultÚ
param_nameÚvalueÚmoduleÚ_Ú	old_valueÚ	new_values               r   ÚconvertzBnb4bitQuantize.convert"   sØ   € ð ˆØ!+×!1Ò!1Ñ!3Ô!3ð 	+ð 	+ÑˆJ˜Ý˜%¥Ñ&Ô&ð !Ø˜aœ�õ -¨U°JÑ?Ô?‰IˆF�Aõ ˜&Ô+­VÑ4Ô4ð  Øœ�à×5Ò5°jÑAÔAˆIÝœÔ)¨%Ð[Ð[¸uÐ[È	ÔHZÐ[Ð[×^Ò^Ð_dÔ_kÑlÔlˆIØ(,ˆFÔ%Ø!*ˆF�:ÑÐØˆr   ©NN©Ú__name__Ú
__module__Ú__qualname__r   ÚdictÚstrr#   ÚtorchÚTensorr)   ÚModuler7   © r   r   r   r      s”   € € € € € ð)ð )ð )ð '+Ø(,ð	ð à˜˜d 5¤<Ô0Ð0Ô1ðð ˜t™ðð ŒxŒ Ñ%ð	ð 
ˆc�5”<ÐÔ	 ðð ð ð ð ð r   r   c                   ó’   — e Zd Zd„ Z	 	 ddeeeej                 f         dej	        j
        dz  dedz  deeej        f         fd„ZdS )	ÚBnb4bitDeserializec                 ó   — || _         d S r   r   r   s     r   r   zBnb4bitDeserialize.__init__A   r   r   Nr   r   r   r   c                 óf  — t          |¦  «        dk    r|S |                     ¦   «         D ]%\  }}t          |t          ¦  «        r|d         ||<   Œ&d}|                     |¦  «        }t          ||¦  «        \  }	}
t          j        j         	                    ||d|j
        |	¬¦  «        }d|	_        ||iS )z_
        Deserialization of bnb keys. We need 6 keys to recreate the quantized weights
        é   r   ÚweightF)ÚdataÚquantized_statsr    r-   r3   T)Úlenr!   r"   r#   Úpopr   r(   r)   r*   Úfrom_prequantizedr-   r.   )r   r   r   r   r/   Úkeyr2   Ú
key_weightrH   r3   r4   r6   s               r   r7   zBnb4bitDeserialize.convertD   sÈ   € õ ˆz‰?Œ?˜aÒÐØÐà$×*Ò*Ñ,Ô,ð 	+ð 	+‰JˆC�Ý˜%¥Ñ&Ô&ð +Ø"'¨¤(�
˜3‘øàˆ
Ø—’ 
Ñ+Ô+ˆÝ(¨°Ñ@Ô@‰	ˆ�Ý”FÔ%×7Ò7ØØ&ØØ”=Øð 8ñ 
ô 
ˆ	ð %)ˆÔ!Ø˜IÐ&Ð&r   r8   r9   rB   r   r   rD   rD   @   s”   € € € € € ð)ð )ð )ð )-Ø&*ð	'ð 'à˜˜d 5¤<Ô0Ð0Ô1ð'ð ŒxŒ Ñ%ð'ð ˜t™ð	'ð 
ˆc�5”<ÐÔ	 ð'ð 'ð 'ð 'ð 'ð 'r   rD   c                   ó’   — e Zd Zd„ Z	 	 ddeeeej                 f         dej	        j
        dz  dedz  deeej        f         fd„ZdS )	ÚBnb8bitQuantizec                 ó   — || _         d S r   r   r   s     r   r   zBnb8bitQuantize.__init__d   r   r   Nr   r   r   r   c                 óÚ  — i }|                      ¦   «         D ]Ó\  }}t          |t          ¦  «        r|d         n|}t          ||¦  «        \  }}	t	          |j        t          ¦  «        r|j        }|j        }
| 	                    |¦  «        j
        }|                     dd ¦  «         t          j        j        |                     d¦  «        fddi|¤Ž                     |
¦  «        }|||<   ŒÔ|S )Nr   ÚSCBÚcpur    F)r!   r"   r#   r   r$   r%   r   r&   r-   r'   r+   rL   r(   r)   Ú
Int8Paramsr,   )r   r   r   r   r/   r0   r1   r2   r3   r4   Úvalue_deviceÚparams_kwargsr6   s                r   r7   zBnb8bitQuantize.convertg   sô   € ð ˆØ!+×!1Ò!1Ñ!3Ô!3ð 	+ð 	+ÑˆJ˜Ý *¨5µ$Ñ 7Ô 7ÐB�E˜!”H�H¸UˆEå,¨U°JÑ?Ô?‰IˆF�Aõ ˜&Ô+­VÑ4Ô4ð  Øœ�Ø œ<ˆLØ!×9Ò9¸*ÑEÔEÔNˆMØ×Ò˜e TÑ*Ô*Ð*ÝœÔ)¨%¯(ª(°5©/¬/Ð`Ð`ÈÐ`ÐR_Ð`Ð`×cÒcÐdpÑqÔqˆIØ!*ˆF�:ÑÐØˆr   r8   r9   rB   r   r   rQ   rQ   c   s”   € € € € € ð)ð )ð )ð )-Ø&*ð	ð à˜˜d 5¤<Ô0Ð0Ô1ðð ŒxŒ Ñ%ðð ˜t™ð	ð 
ˆc�5”<ÐÔ	 ðð ð ð ð ð r   rQ   c                   ó’   — e Zd Zd„ Z	 	 ddeeeej                 f         dej	        j
        dz  dedz  deeej        f         fd„ZdS )	ÚBnb8bitDeserializec                 ó   — || _         d S r   r   r   s     r   r   zBnb8bitDeserialize.__init__�   r   r   Nr   r   r   r   c                 óœ  — t          |¦  «        dk    r|S |                     ¦   «         D ]%\  }}t          |t          ¦  «        r|d         ||<   Œ&t	          ||¦  «        \  }}d}	||	         }
|                     |¦  «        j        }|d         |d<   t          j        j	        |
fddi|¤Ž 
                    |
j        ¦  «        }d|_        |	|iS )z.
        Deserialization of bnb keys.
        rG   r   rH   rT   r    FT)rK   r!   r"   r#   r   r'   r+   r(   r)   rV   r,   r-   r.   )r   r   r   r   r/   rN   r2   r3   r4   rO   rH   r6   s               r   r7   zBnb8bitDeserialize.convert„   sæ   € õ ˆz‰?Œ?˜aÒÐð Ðà$×*Ò*Ñ,Ô,ð 	+ð 	+‰JˆC�Ý˜%¥Ñ&Ô&ð +Ø"'¨¤(�
˜3‘øå(¨°Ñ@Ô@‰	ˆ�àˆ
Ø˜JÔ'ˆØ×.Ò.¨Ñ?Ô?ÔHˆØ" 5Ô)ˆˆu‰Ý”FÔ% fÐLÐL¸EÐLÀVÐLÐL×OÒOÐPVÔP]Ñ^Ô^ˆ	Ø$(ˆÔ!Ø˜IÐ&Ð&r   r8   r9   rB   r   r   rZ   rZ   €   s”   € € € € € ð)ð )ð )ð )-Ø&*ð	'ð 'à˜˜d 5¤<Ô0Ð0Ô1ð'ð ŒxŒ Ñ%ð'ð ˜t™ð	'ð 
ˆc�5”<ÐÔ	 ð'ð 'ð 'ð 'ð 'ð 'r   rZ   Fr   Úmodules_to_not_convertc                 ó2  — d}|                       ¦   «         D �]â\  }}t          ||¦  «        sŒd}t          j        d¦  «        5  t	          |t
          ¦  «        st          |¦  «        t          j        u �rlt	          |t
          ¦  «        r|j	        j
        \  }}	n|j        }|j        }	|                     ¦   «         dk    rlt          j                             ||	|j        du|j        |j        ¬¦  «        }|r4|j	        j                             t          j        ¬¦  «        |j	        _        nrt          j                             ||	|j        du|j        |j        |j        |j        ¬¦  «        }|r/|j	        j                             |j        ¬¦  «        |j	        _        |�At          |¦  «        |_        |                     d¦  «         |                      ||¦  «         d}ddd¦  «         n# 1 swxY w Y   �Œä|st<                               d	¦  «         | S )
aÒ  
    A helper function to replace all `torch.nn.Linear` modules by bnb modules from the `bitsandbytes` library.

    Args:
        model (`torch.nn.Module`):
            The model to convert, can be any `torch.nn.Module` instance.
        modules_to_not_convert (`list[str]`, defaults to `None`):
            A list of nn.Linear weights to not convert. If a parameter path is in the list (e.g. `lm_head.weight`), the corresponding module will not be
            converted.
        quantization_config (`BitsAndBytesConfig`):
            The quantization config object that contains the quantization parameters.
        pre_quantized (`book`, defaults to `False`):
            Whether the model is pre-quantized or not
    FNÚmetaÚllm_int8)Úhas_fp16_weightsÚ	threshold)Údtype)Úcompress_statisticsÚ
quant_typeÚquant_storageTz»You are loading your model using eetq but no linear modules were found in your model. Please double check your model architecture, or submit an issue on github if you think this is a bug.) Únamed_modulesr   r?   r-   r"   r   Útyper)   ÚLinearrH   ÚshapeÚin_featuresÚout_featuresÚquantization_methodr(   ÚLinear8bitLtÚbiasÚllm_int8_has_fp16_weightÚllm_int8_thresholdrI   r,   Úint8Ú
Linear4bitÚbnb_4bit_compute_dtypeÚbnb_4bit_use_double_quantÚbnb_4bit_quant_typeÚbnb_4bit_quant_storager%   Úrequires_grad_Úset_submoduleÚloggerÚwarning)
r   r]   Úquantization_configÚpre_quantizedÚhas_been_replacedÚmodule_namer3   Ú
new_modulerk   rl   s
             r   Úreplace_with_bnb_linearr�   ¢   st  € ð( Ðà$×2Ò2Ñ4Ô4ð ,-ñ ,-Ñˆ�VÝ$ [Ð2HÑIÔIð 	ØØˆ
ÝŒ\˜&Ñ!Ô!ð (	-ð (	-Ý˜&¥&Ñ)Ô)ð '-­T°&©\¬\½R¼YÐ-FÑ-FÝ˜f¥fÑ-Ô-ð 7Ø06´Ô0CÑ-�K  à"(Ô"4�KØ#)Ô#6�LØ&×:Ò:Ñ<Ô<À
ÒJÐJÝ!$¤×!4Ò!4Ø#Ø$Øœ¨4Ð/Ø)<Ô)UØ"5Ô"Hð "5ñ "ô "�Jð %ð ]ð 2<Ô1BÔ1G×1JÒ1JÕQVÔQ[Ð1JÑ1\Ô1\˜
Ô)Ô.øå!$¤×!2Ò!2Ø#Ø$Øœ¨4Ð/Ø+ÔBØ,?Ô,YØ#6Ô#JØ&9Ô&Pð "3ñ "ô "�Jð %ð à1;Ô1BÔ1G×1JÒ1JØ"5Ô"Lð 2Kñ 2ô 2˜
Ô)Ô.ð Ð)å,0°©L¬L�JÔ)à×-Ò-¨eÑ4Ô4Ð4Ø×'Ò'¨°ZÑ@Ô@Ð@Ø(,Ð%ðQ(	-ð (	-ð (	-ñ (	-ô (	-ð (	-ð (	-ð (	-ð (	-ð (	-ð (	-øøøð (	-ð (	-ð (	-ð (	-ùðT ð 
Ý�Šðñ	
ô 	
ð 	
ð
 €Ls   ÁFG.Ç.G2	Ç5G2	rH   útorch.nn.Parameterc                 ó  — t          | t          j        j        ¦  «        s t	          dt          | ¦  «        › d�¦  «        ‚| j        j        }|dvr| S |dk    r,t          j	         
                    | j        | j        ¦  «        }|S |j        €| j        |_        t          t          j	        d¦  «        r+t          j	                             | j        |j        ¦  «        }n&| j        |j                             dd¦  «        z  d	z  }|S )
zŽ
    Helper function to dequantize 4bit or 8bit bnb weights.

    If the weight is not a bnb quantized weight, it will be returned as is.
    z1Input weight should be of type nn.Parameter, got z instead)r*   rV   r*   NÚint8_vectorwise_dequantéÿÿÿÿrG   g   €@ €?)r"   r?   r)   Ú	ParameterÚ	TypeErrorrh   Ú	__class__r:   r(   Ú
functionalÚdequantize_4bitrI   Úquant_staterT   Úhasattrr„   Úview)rH   ÚstateÚcls_nameÚoutput_tensorÚdequantizeds        r   Údequantize_bnb_weightr’   ð   sô   € õ �f�eœhÔ0Ñ1Ô1ð dÝÐbÍDÐQWÉLÌLÐbÐbÐbÑcÔcÐcàÔÔ(€HØÐ3Ð3Ð3Øˆà�<ÒÐÝœ×6Ò6°v´{ÀFÔDVÑWÔWˆØÐà„yÐØ”JˆŒ	å�sŒ~Ð8Ñ9Ô9ð Qå”n×<Ò<¸V¼[È%Ì)ÑTÔTˆˆð ”k E¤I§N¢N°2°qÑ$9Ô$9Ñ9Ð<PÑPˆàÐr   c                 óÔ   — t          t          j        | j        j        ¦  «        }| j        }i }t          j        |j        ¦  «        }|D ]}||j	        v r||         ||<   Œ |di |¤Ž}|S )a  
    Creates a new hook based on the old hook. Use it only if you know what you are doing !
    This method is a copy of: https://github.com/huggingface/peft/blob/748f7968f3a31ec06a1c2b0328993319ad9a150a/src/peft/utils/other.py#L245
    with some changes
    rB   )
ÚgetattrÚ
accelerateÚhooksrˆ   r:   r+   ÚinspectÚ	signaturer   Ú
parameters)Úold_hookÚold_hook_clsÚold_hook_attrÚfiltered_old_hook_attrÚold_hook_init_signatureÚkÚnew_hooks          r   Ú_create_accelerate_new_hookr¡     sˆ   € õ �:Ô+¨XÔ-?Ô-HÑIÔI€LØÔ%€MØÐÝ%Ô/°Ô0EÑFÔFÐØð 9ð 9ˆØÐ'Ô2Ð2Ð2Ø(5°aÔ(8Ð" 1Ñ%øØˆ|Ð5Ð5Ð4Ð5Ð5€HØ€Or   c                 ó°  — |                      ¦   «         }|dk    rt          j        j        nt          j        j        }|                      ¦   «         D �]ç\  }}t          ||¦  «        �rÐt          j        d¦  «        5  t          |dd¦  «        }t          j         
                    |j        |j        |du¬¦  «        }ddd¦  «         n# 1 swxY w Y   |dk    r|j        nd}	t          j                             t          |j        |	¦  «        ¦  «        |_        t          |j        |	¦  «        }
|€$t"                               d|
j        › d�¦  «         n;t"                               d|
j        › d|› d	�¦  «         |
                     |¦  «        }
t          j                             |
¦  «        |_        |�||_        t-          |d
¦  «        r5|j        }t1          |¦  «        }t3          |¦  «         t5          ||¦  «         |                     |j        j        ¦  «         |                      ||¦  «         d}�Œé|st"                               d¦  «         | S )a&  
    Converts a quantized model into its dequantized original version. The newly converted model will have
    some performance drop compared to the original model before quantization - use it only for specific usecases
    such as QLoRA adapters merging.

    Returns the converted model.
    r`   r_   ro   N)ro   zThe modules are dequantized in zK. If you want to change the dtype, please specify `dtype` in `dequantize`. z and casted to ú.Ú_hf_hookTz_For some reason the model has not been properly dequantized. You might see unexpected behavior.)rm   r(   r)   rn   rs   rg   r"   r?   r-   r”   ri   rk   rl   rŽ   r†   r’   rH   rz   Úwarning_oncerc   r,   ro   rŒ   r¤   r¡   r   r   ry   r{   )r   r|   rc   Úquant_methodÚ
target_clsr   r3   ro   r€   rŽ   rH   rš   r    r~   s                 r   Údequantize_and_replacer¨     s¡  € ð '×:Ò:Ñ<Ô<€Là(4¸
Ò(BÐ(B•”Ô$Ð$ÍÌÔHY€JØ$×2Ò2Ñ4Ô4ð %ñ %Ñˆ�VÝ�f˜jÑ)Ô)ñ 	%Ý”˜fÑ%Ô%ð mð mÝ˜v v¨tÑ4Ô4�Ý"œXŸ_š_¨VÔ-?ÀÔATÐ[_ÐgkÐ[k˜_ÑlÔl�
ðmð mð mñ mô mð mð mð mð mð mð møøøð mð mð mð mð %1°JÒ$>Ð$>�F”L�LÀDˆEÝ %¤× 2Ò 2Õ3HÈÌÐX]Ñ3^Ô3^Ñ _Ô _ˆJÔÝ*¨6¬=¸%Ñ@Ô@ˆFØˆ}Ý×#Ò#ð P°f´lð  Pð  Pð  Pñô ð ð õ ×#Ò#Ð$kÀfÄlÐ$kÐ$kÐchÐ$kÐ$kÐ$kÑlÔlÐlØŸš 5Ñ)Ô)�Ý %¤× 2Ò 2°6Ñ :Ô :ˆJÔØÐØ"&�
”Ý�v˜zÑ*Ô*ð 9Ø!œ?�Ý6°xÑ@Ô@�Ý'¨Ñ/Ô/Ð/Ý" :¨xÑ8Ô8Ð8Ø�MŠM˜&œ-Ô.Ñ/Ô/Ð/Ø×Ò ¨ZÑ8Ô8Ð8Ø $Ðùàð 
Ý�ŠØmñ	
ô 	
ð 	
ð €Ls   Á<A CÃC	ÃC	c                 ó  — t          t          dt          ¦   «         ¦  «        }t          t          ¦   «         ¦  «        }|                     |¦  «        s8| rd|pd› d|› d�}t          |¦  «        ‚t                               d¦  «         dS dS )	zs
    Validates if the available devices are supported by bitsandbytes, optionally raising an exception if not.
    Úsupported_torch_devicesz3None of the available devices `available_devices = NzY` are supported by the bitsandbytes version you have installed: `bnb_supported_devices = z¢`. Please check the docs to see if the backend you intend to use is available and how to install it: https://huggingface.co/docs/bitsandbytes/main/en/installationz+No supported devices found for bitsandbytesFT)r”   r(   Úsetr   ÚintersectionÚRuntimeErrorrz   r{   )Úraise_exceptionÚbnb_supported_devicesÚavailable_devicesÚerr_msgs       r   Ú!validate_bnb_backend_availabilityr²   L  sµ   € õ $¥CÐ)BÅCÁEÄEÑJÔJÐÝÕ1Ñ3Ô3Ñ4Ô4Ðà×)Ò)Ð*?Ñ@Ô@ð 	Øð 	(ðrÐFWÐF_Ð[_ð rð rð  {Pð rð rð rð õ ˜wÑ'Ô'Ð'å�ŠÐDÑEÔEÐEØˆuØˆ4r   )NNFr   )rH   r‚   r8   )F)&r—   Úcore_model_loadingr   Úquantizers.quantizers_utilsr   r   Úutilsr   r   r	   r
   r   Úbitsandbytesr(   r?   Útorch.nnr)   Úpytorch_utilsr   r•   Úaccelerate.hooksr   r   Ú
get_loggerr:   rz   r   rD   rQ   rZ   rA   r#   r>   r�   r’   r¡   r¨   r²   rB   r   r   ú<module>r»      sr  ðØ €€€à .Ð .Ð .Ð .Ð .Ð .Ø UÐ UÐ UÐ UÐ UÐ UÐ UÐ Uðð ð ð ð ð ð ð ð ð ð ð ð ð ð ÐÑÔð ØÐÐÐàÐÑÔð 'Ø€L€L€LØÐÐÐÐÐà&Ð&Ð&Ð&Ð&Ð&àÐÑÔð MØÐÐÐØLÐLÐLÐLÐLÐLÐLÐLà	ˆÔ	˜HÑ	%Ô	%€ðð ð ð ð �mñ ô ð ðD 'ð  'ð  'ð  'ð  '˜ñ  'ô  'ð  'ðFð ð ð ð �mñ ô ð ð:'ð 'ð 'ð 'ð '˜ñ 'ô 'ð 'ðH 04ØØð	Jð JØŒ8Œ?ðJà  œI¨Ñ,ðJð Jð Jð Jð\ð ð ð ð ð<ð ð ð"*ð *ð *ð *ðZð ð ð ð ð r   