Ë
    T^(hÎ>  ã                   óð   — d dl Z d dlmZ d dlmZmZmZmZmZm	Z	 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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!y)é    N)Úcached_property)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptionalÚUnion)Úversioné   )ÚHfQuantizer)Úget_module_from_nameé   )ÚPreTrainedModel)ÚACCELERATE_MIN_VERSIONÚis_accelerate_availableÚis_bitsandbytes_availableÚis_torch_availableÚis_torch_hpu_availableÚis_torch_npu_availableÚis_torch_xpu_availableÚlogging)ÚConv1Dc                   óL  ‡ — e Zd ZdZdZdZdZddgZˆ fd„Zd„ Z	d d	„Z
d
ddddedeeef   def
d„Z	 d!d
ddddedddeeef   deee      fd„Zdeeeeef   f   deeeeef   f   fd„Zd"d„Zd„ Z	 d!d
ddeee      fd„Zd#d„Zd!d„Zedefd„«       Zedefd„«       Zd„ Zˆ xZ S )$ÚBnb4BitHfQuantizerað  
    4-bit quantization from bitsandbytes.py quantization method:
        before loading: converts transformer layers into Linear4bit during loading: load 16bit weight and pass to the
        layer object after: quantizes individual weights in Linear4bit into 4bit at the first .cuda() call
        saving:
            from state dict, as usual; saves weights and `quant_state` components
        loading:
            need to locate `quant_state` components and pass to Param4bit constructor
    TFÚbitsandbytesÚ
acceleratec                 óŠ   •— t        ‰| �  |fi |¤Ž | j                  j                  �| j                  j                  | _        y y ©N)ÚsuperÚ__init__Úquantization_configÚllm_int8_skip_modulesÚmodules_to_not_convert)Úselfr!   ÚkwargsÚ	__class__s      €úh/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/quantizers/quantizer_bnb_4bit.pyr    zBnb4BitHfQuantizer.__init__@   sB   ø€ Ü‰ÑÐ,Ñ7°Ò7à×#Ñ#×9Ñ9ÐEØ*.×*BÑ*B×*XÑ*XˆDÕ'ð Fó    c                 ó   — t        «       st        dt        › d�«      ‚t        «       st        d«      ‚ddlm} ddlm}  |«       } |d¬«       |j                  d	d
«      s|j                  dd
«      rt        d«      ‚|j                  dd «      }|�¥t        |t        «      r•| j                  j                  s|j                  «       D �ci c]  }|| j                  vsŒ|||   “Œ }}t!        |j#                  «       «      dhk(  r|rn/d|j#                  «       v sd|j#                  «       v rt        d«      ‚t%        j&                  t(        j*                  j%                  d«      «      t%        j&                  d«      k  rt        d«      ‚y c c}w )NzWUsing `bitsandbytes` 4-bit quantization requires Accelerate: `pip install 'accelerate>=z'`zrUsing `bitsandbytes` 4-bit quantization requires the latest version of bitsandbytes: `pip install -U bitsandbytes`r   )Ú!validate_bnb_backend_availability)Ú'is_bitsandbytes_multi_backend_availableT)Úraise_exceptionÚfrom_tfFÚ	from_flaxz‹Converting into 4-bit or 8-bit weights from tf/flax weights is currently not supported, please make sure the weights are in PyTorch format.Ú
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   z0.39.0zžYou have a version of `bitsandbytes` that is not compatible with 4bit inference and training make sure you have the latest version of `bitsandbytes` installed)r   ÚImportErrorr   r   Úintegrationsr*   Úutilsr+   ÚgetÚ
ValueErrorÚ
isinstanceÚdictr!   Ú llm_int8_enable_fp32_cpu_offloadÚkeysr#   ÚsetÚvaluesr
   ÚparseÚ	importlibÚmetadata)	r$   Úargsr%   r*   r+   Úbnb_multibackend_is_enabledr/   ÚkeyÚdevice_map_without_lm_heads	            r'   Úvalidate_environmentz'Bnb4BitHfQuantizer.validate_environmentF   s¢  € Ü&Ô(ÜØiô  kAð  jBð  BDð  Eóð ô )Ô*Üð Eóð õ 	EÝCá&MÓ&OÐ#Ù)¸$Õ?à�:‰:�i Ô'¨6¯:©:°kÀ5Ô+IÜð;óð ð
 —Z‘Z ¨dÓ3ˆ
àÐ"Ü˜:¤tÔ,Ø×,Ñ,×MÒMð 1;·±Ó0Aö*Ø),ÀSÐPT×PkÑPkÒEk��Z ‘_Ñ$ð*Ð&ð *ô �:×$Ñ$Ó&Ó'¨E¨7Ò2Ñ7RØØÐ4×;Ñ;Ó=Ñ=ÀÐKe×KlÑKlÓKnÑAnÜ ð)óð ô �=‰=œ×+Ñ+×3Ñ3°NÓCÓDÄwÇ}Á}ÐU]ÓG^Ò^ÜðUóð ð _ùò*s   Ã
FÃFÚreturnc                 ó  — t        j                  t        j                  j                  d«      «      t        j                  d«      kD  r:ddlm} |t        j                  k7  rt        j                  d«       |j                  S t        d«      ‚)Nr   z0.19.0r   )ÚCustomDtypezXtarget_dtype {target_dtype} is replaced by `CustomDtype.INT4` for 4-bit BnB quantizationaU  You are using `device_map='auto'` on a 4bit loaded version of the model. To automatically compute the appropriate device map, you should upgrade your `accelerate` library,`pip install --upgrade accelerate` or install it from source to support fp4 auto device mapcalculation. You may encounter unexpected behavior, or pass your own device map)r
   r=   r>   r?   Úaccelerate.utilsrG   ÚtorchÚint8ÚloggerÚinfoÚINT4r6   )r$   Útarget_dtyperG   s      r'   Úadjust_target_dtypez&Bnb4BitHfQuantizer.adjust_target_dtypew   si   € Ü�=‰=œ×+Ñ+×3Ñ3°LÓAÓBÄWÇ]Á]ÐS[ÓE\Ò\Ý4àœuŸz™zÒ)Ü—‘ÐvÔwØ×#Ñ#Ð#äðbóð r(   Úmodelr   Úparam_valueztorch.TensorÚ
param_nameÚ
state_dictc                 óì   — dd l }t        ||«      \  }}t        |j                  j	                  |d «      |j
                  j                  «      ryt        ||j
                  j                  «      r|dk(  ryy)Nr   TÚbiasF)r   r   r7   Ú_parametersr5   ÚnnÚ
Params4bitÚ
Linear4bit)	r$   rP   rQ   rR   rS   r%   ÚbnbÚmoduleÚtensor_names	            r'   Úcheck_quantized_paramz(Bnb4BitHfQuantizer.check_quantized_param†   se   € ó 	#ä2°5¸*ÓEÑˆ�Ü�f×(Ñ(×,Ñ,¨[¸$Ó?ÀÇÁ×ARÑARÔSàÜ˜ §¡× 1Ñ 1Ô2°{ÀfÒ7Lð àr(   Útarget_deviceztorch.deviceÚunexpected_keysc                 ó  — ddl }t        ||«      \  }}	|	|j                  vrt        |› d|	› d�«      ‚t	        ||	«      }
t        |t        «      rt        «       rd|› �}|	dk(  r`|€|
j                  |«      }n|j                  |«      }t        j                  j                  ||
j                  ¬«      }||j                  |	<   yt        |j                  |	   |j                  j                  «      st        d«      ‚|
j                  t        j                  d	«      k(  r,|d	t        j                  d	«      fvr|€t        |	› d
|› d�«      ‚| j                  r³| j                   st        d«      ‚|dz   |vr|dz   |vrt        d|› d�«      ‚i }|j#                  «       D ]+  \  }}|dz   |v sŒ|||<   |€Œ||v sŒ|j%                  |«       Œ- i }| j&                  r||d<    |j                  j                  j(                  d||d|dœ|¤Ž}nq|j                  d«      }t+        |j,                  t.        «      r|j0                  }|
j2                  } |j                  j                  |fddi|¤Žj                  |«      }||j                  |	<   y)z‘
        combines logic from _load_state_dict_into_meta_model and .integrations.bitsandbytes.py::set_module_quantized_tensor_to_device()
        r   Nz- does not have a parameter or a buffer named ú.únpu:rU   )Úrequires_gradz0this function only loads `Linear4bit components`Úmetaz7 is on the meta device, we need a `value` to put in on z¿Detected int4 weights but the version of bitsandbytes is not compatible with int4 serialization. Make sure to download the latest `bitsandbytes` version. `pip install --upgrade bitsandbytes`.z.quant_state.bitsandbytes__fp4z.quant_state.bitsandbytes__nf4zSupplied state dict for zT does not contain `bitsandbytes__*` and possibly other `quantized_stats` components.r[   F)ÚdataÚquantized_statsrc   Údevicer0   rc   © )r   r   rV   r6   Úgetattrr7   Úintr   ÚtorI   rW   Ú	Parameterrc   rX   rg   Úpre_quantizedÚis_serializableÚitemsÚremoveÚ$is_bnb_supports_quant_storage_moduleÚfrom_prequantizedÚ
issubclassÚ
source_clsr   ÚTÚ__dict__)r$   rP   rQ   rR   r^   rS   r_   rZ   r[   r\   Ú	old_valueÚ	new_valuerf   ÚkÚvÚparam_kwargsr%   s                    r'   Úcreate_quantized_paramz)Bnb4BitHfQuantizer.create_quantized_param›   sÁ  € ó 	#ä2°5¸*ÓEÑˆ�à˜f×0Ñ0Ñ0Ü ˜xÐ'TÐU`ÐTaÐabÐcÓdÐdä˜F KÓ0ˆ	ô �m¤SÔ)Ô.DÔ.FØ" = /Ð2ˆMØ˜&Ò ØÐ"Ø%ŸL™L¨Ó7‘	à'ŸN™N¨=Ó9�	äŸ™×*Ñ*¨9ÀI×D[ÑD[Ð*Ó\ˆIØ.7ˆF×Ñ˜{Ñ+Øä˜&×,Ñ,¨[Ñ9¸3¿6¹6×;LÑ;LÔMÜÐOÓPÐPà×Ñ¤§¡¨VÓ 4Ò4Ø f¬e¯l©l¸6Ó.BÐ%CÑCØÐ#ä ˜}Ð,cÐdqÐcrÐrsÐtÓuÐuð ×Òð ×'Ò'Ü ðuóð ð
 Ð=Ñ=ÀZÑOØÐ=Ñ=ÀZÑOä Ø.¨z¨lð  ;Oð  Póð ð !ˆOØ"×(Ñ(Ó*ò 2‘��1Ø Ñ# qÒ(Ø)*�O AÑ&Ø&Ñ2°q¸OÒ7KØ'×.Ñ.¨qÕ1ð	2ð ˆLØ×8Ò8Ø)/�˜XÑ&à;˜Ÿ™×)Ñ)×;Ñ;ð Ø Ø /Ø#Ø$ñ	ð
 ñ‰Ið $Ÿ™ uÓ-ˆIô ˜&×+Ñ+¬VÔ4Ø%ŸK™K�	à×'Ñ'ˆFØ)˜Ÿ™×)Ñ)¨)ÑSÀ5ÐSÈFÑS×VÑVÐWdÓeˆIà*3ˆ×Ñ˜;Ò'r(   Ú
max_memoryc                 ó^   — |j                  «       D ��ci c]  \  }}||dz  “Œ }}}|S c c}}w )NgÍÌÌÌÌÌì?)ro   )r$   r}   rB   Úvals       r'   Úadjust_max_memoryz$Bnb4BitHfQuantizer.adjust_max_memoryø   s6   € à6@×6FÑ6FÓ6H×I©(¨#¨s�c˜3 ™:‘oÐIˆ
ÑIØÐùó Js   ”)c                 óV   — |€&t         j                  d|«       t        j                  }|S )Na  Overriding torch_dtype=%s with `torch_dtype=torch.float16` due to requirements of `bitsandbytes` to enable model loading in 8-bit or 4-bit. Pass your own torch_dtype to specify the dtype of the remaining non-linear layers or pass torch_dtype=torch.float16 to remove this warning.)rK   rL   rI   Úfloat16)r$   Útorch_dtypes     r'   Úupdate_torch_dtypez%Bnb4BitHfQuantizer.update_torch_dtypeþ   s0   € ØÐä�K‰KðEð ôô  Ÿ-™-ˆKØÐr(   c                 óÖ  — |€æt         j                  j                  «       r!dt         j                  j                  «       i}nŽt	        «       r$ddt         j
                  j                  «       › �i}n`t        «       r$ddt         j                  j                  «       › �i}n2t        «       r$ddt         j                  j                  «       › �i}nddi}t        j                  d|› d�«       |S )NÚ rb   zhpu:zxpu:r0   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' )rI   ÚcudaÚis_availableÚcurrent_devicer   Únpur   Úhpur   ÚxpurK   rL   )r$   r/   s     r'   Úupdate_device_mapz$Bnb4BitHfQuantizer.update_device_map  sÑ   € ØÐÜ�z‰z×&Ñ&Ô(Ø ¤%§*¡*×";Ñ";Ó"=Ð>‘
Ü'Ô)Ø  D¬¯©×)AÑ)AÓ)CÐ(DÐ"EÐF‘
Ü'Ô)Ø  D¬¯©×)AÑ)AÓ)CÐ(DÐ"EÐF‘
Ü'Ô)Ø  D¬¯©×)AÑ)AÓ)CÐ(DÐ"EÐF‘
à  %˜[�
Ü�K‰Kð)Ø)3¨ð 5]ð]ôð
 Ðr(   Úkeep_in_fp32_modulesc                 ó&  — ddl m} | j                  j                  }| j	                  || j                  j
                  |«      | _        t        |t        «      ryt        |j                  «       «      dkD  r]|j                  «       D ��cg c]  \  }}|dv sŒ|‘Œ }	}}t        |	«      dkD  r|st        d«      ‚| j                  j                  |	«        ||| j                  | j                  ¬«      }| j                  |j                  _        y c c}}w )Nr   )Úreplace_with_bnb_linearr   )r1   r0   r   z¹If you want to offload some keys to `cpu` or `disk`, you need to set `llm_int8_enable_fp32_cpu_offload=True`. Note that these modules will not be  converted to 8-bit but kept in 32-bit.)r#   r!   )r3   r�   r!   r9   Úget_modules_to_not_convertr"   r#   r7   r8   Úlenr:   ro   r6   ÚextendÚconfig)
r$   rP   r/   rŽ   r%   r�   r9   rB   ÚvalueÚkeys_on_cpus
             r'   Ú$_process_model_before_weight_loadingz7Bnb4BitHfQuantizer._process_model_before_weight_loading  s÷   € õ 	;à+/×+CÑ+C×+dÑ+dÐ(à&*×&EÑ&EØ�4×+Ñ+×AÑAÐCWó'
ˆÔ#ô
 �j¤$Ô'¬C°
·±Ó0AÓ,BÀQÒ,FØ1;×1AÑ1AÓ1C×`¡: 3¨ÀuÐP_ÒG_š3Ð`ˆKÑ`ä�;Ó !Ò#Ñ,LÜ ð>óð ð
 ×'Ñ'×.Ñ.¨{Ô;á'Ø¨$×*EÑ*EÐ[_×[sÑ[sô
ˆð
 ,0×+CÑ+Cˆ�‰Õ(ùó as   ÂDÂDc                 ó>   — d|_         | j                  «       |_        |S ©NT)Úis_loaded_in_4bitrn   Úis_4bit_serializable)r$   rP   r%   s      r'   Ú#_process_model_after_weight_loadingz6Bnb4BitHfQuantizer._process_model_after_weight_loadingB  s    € Ø"&ˆÔØ%)×%9Ñ%9Ó%;ˆÔ"Øˆr(   c                 óÄ   — t        j                  t        j                  j                  d«      «      t        j                  d«      k\  }|st        j                  d«       yy)Nr   z0.41.3zÇYou are calling `save_pretrained` to a 4-bit converted model, but your `bitsandbytes` version doesn't support it. If you want to save 4-bit models, make sure to have `bitsandbytes>=0.41.3` installed.FT)r
   r=   r>   r?   rK   Úwarning)r$   Úsafe_serializationÚ_is_4bit_serializables      r'   rn   z"Bnb4BitHfQuantizer.is_serializableG  sQ   € Ü '§¡¬i×.@Ñ.@×.HÑ.HÈÓ.XÓ YÔ]d×]jÑ]jÐksÓ]tÑ tÐá$Ü�N‰Nðhôð àr(   c                 ó’   — t        j                  t        j                  j                  d«      «      t        j                  d«      k\  S )zž
        determines if the current version of bitsandbytes supports
        the `module` parameter in `Params4bit.from_prequantized`
        :return:
        r   z0.43.3)r
   r=   r>   r?   ©r$   s    r'   rq   z7Bnb4BitHfQuantizer.is_bnb_supports_quant_storage_moduleS  s3   € ô �}‰}œY×/Ñ/×7Ñ7¸ÓGÓHÌGÏMÉMÐZbÓLcÑcÐcr(   c                  ó   — yr™   rh   r¢   s    r'   Úis_trainablezBnb4BitHfQuantizer.is_trainable\  s   € àr(   c                 óP   — ddl m}  ||| j                  | j                  ¬«      }|S )Nr   )Údequantize_and_replace)r!   )r3   r¦   r#   r!   )r$   rP   r¦   s      r'   Ú_dequantizezBnb4BitHfQuantizer._dequantize`  s)   € Ý9á&Ø�4×.Ñ.ÀD×D\ÑD\ô
ˆð ˆr(   )rN   útorch.dtyperE   r¨   r   )rƒ   r¨   rE   r¨   )rP   r   )!Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úuse_keep_in_fp32_modulesÚ requires_parameters_quantizationÚrequires_calibrationÚrequired_packagesr    rD   rO   Ústrr   r   Úboolr]   r   r   r|   r	   rj   r€   r„   r�   r—   rœ   rn   r   rq   Úpropertyr¤   r§   Ú__classcell__)r&   s   @r'   r   r   /   sŠ  ø„ ñð  $ÐØ'+Ð$Ø Ðà'¨Ð6ÐôYò/óbðà ðð $ðð ð	ð
 ˜˜c˜‘Nðð 
óð8 04ñZ4à ðZ4ð $ðZ4ð ð	Z4ð
 &ðZ4ð ˜˜c˜‘NðZ4ð " $ s¡)Ñ,óZ4ðz¨D°°e¸CÀ¸H±oÐ1EÑ,Fð È4ÐPSÐUZÐ[^Ð`cÐ[cÑUdÐPdÑKeó óòð0 59ñ	 Dà ð Dð ' t¨C¡yÑ1ó	 DóFó

ð ðd°dò dó ðdð ð˜dò ó ðör(   r   )"r>   Ú	functoolsr   Útypingr   r   r   r   r   r	   Ú	packagingr
   Úbaser   Úquantizers_utilsr   Úmodeling_utilsr   r4   r   r   r   r   r   r   r   r   rI   Úpytorch_utilsr   Ú
get_loggerr©   rK   r   rh   r(   r'   ú<module>r½      sa   ðó Ý %ß B× Bå å Ý 2ñ Ý0÷	÷ 	ó 	ñ ÔÛå&à	ˆ×	Ñ	˜HÓ	%€ôw˜õ wr(   