Ë
      çiÝS  ã                   óÄ  — d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZm	Z	 d dl m
Z
 d dlmZ d dlmZmZmZmZmZ d dlZd dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dl m!Z! d dl"m#Z#m$Z$m%Z% d dl&m'Z'  ejP                  e)«      Z* ed«      Z+ G d„ de!«      Z,deej0                  gdf   dededdfd„Z-dej\                  j^                  deddfd„Z0	 d&dej\                  jb                  dej0                  dee2   dej\                  jb                  fd„Z3 e jh                  d¬ «      defd!„«       Z5d'dej\                  j^                  d"e6d#e7e8   d$e8ddf
d%„Z9y)(é    N)ÚOrderedDict)ÚAbstractContextManagerÚ	ExitStack)Úpartial)Ú
ModuleType)ÚAnyÚCallableÚLiteralÚOptionalÚcast)Úapply_to_collection)ÚRequirementCache)ÚTensor)Úinit)Ú_IncompatibleKeys)ÚSelfÚoverride)Ú	Precision)Ú_ClassReplacementContextManagerÚ_convert_fp_tensorÚ_DtypeContextManager)Ú_DEVICEÚbitsandbytesc            	       ó:  — e Zd ZdZ	 	 dded   deej                     deee	      ddfd„Z
ed	ej                  j                  dej                  j                  fd
„«       Zedefd„«       Zedefd„«       Zedefd„«       Zededefd„«       Zededefd„«       Zy)ÚBitsandbytesPrecisionaþ  Plugin for quantizing weights with `bitsandbytes <https://github.com/bitsandbytes-foundation/bitsandbytes>`__.

    .. warning::  This is an :ref:`experimental <versioning:Experimental API>` feature.

    .. note::
        The optimizer is not automatically replaced with ``bitsandbytes.optim.Adam8bit`` or equivalent 8-bit optimizers.

    Args:
        mode: The quantization mode to use.
        dtype: The compute dtype to use.
        ignore_modules: The submodules whose Linear layers should not be replaced, for example. ``{"lm_head"}``.
            This might be desirable for numerical stability. The string will be checked in as a prefix, so a value like
            "transformer.blocks" will ignore all linear layers in all of the transformer blocks.
    NÚmode)Únf4únf4-dqÚfp4úfp4-dqÚint8úint8-trainingÚdtypeÚignore_modulesÚreturnc                 ó  — t        «        |€~|j                  d«      rt        j                  }n\t        j                  j                  «       r.t        j                  j                  «       rt        j                  nt        j                  }|j                  d«      r#|t        j                  urt        |›d|› d�«      ‚t        «       }|d   |d   |d   |d   |d   |d	   d
œ}||   | _
        || _        |xs
 t        «       | _        y )Nr!   z7 only works with `dtype=torch.float16`, but you chose `Ú`Ú
_NF4LinearÚ_NF4DQLinearÚ
_FP4LinearÚ_FP4DQLinearÚ_Linear8bitLtÚ_Int8LinearInference)r   r   r   r    r"   r!   )Ú_import_bitsandbytesÚ
startswithÚtorchÚfloat16ÚcudaÚis_availableÚis_bf16_supportedÚbfloat16Ú
ValueErrorÚglobalsÚ_linear_clsr#   Úsetr$   )Úselfr   r#   r$   Úglobals_Úmode_to_clss         ú„/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/lightning_fabric/plugins/precision/bitsandbytes.pyÚ__init__zBitsandbytesPrecision.__init__F   sò   € ô 	Ôàˆ=à�‰˜vÔ&ÜŸ™‘ô ',§j¡j×&=Ñ&=Ô&?ÄEÇJÁJ×D`ÑD`ÔDb”E—N’NÔhm×huÑhuð ð �?‰?˜6Ô" u´E·M±MÑ'Aä ˜xÐ'^Ð_dÐ^eÐefÐgÓhÐhä“9ˆà˜LÑ)Ø˜~Ñ.Ø˜LÑ)Ø˜~Ñ.Ø% oÑ6ØÐ3Ñ4ñ
ˆð ' tÑ,ˆÔØˆŒ
Ø,Ò5´³ˆÕó    Úmodulec                 ó”  ‡— t        d„ |j                  «       D «       «      st        d«      ‚t        «       Št        ˆfd„|j                  «       D «       «      s!t	        || j
                  | j                  «       |j                  «       D ];  }t        |‰j                  j                  «      sŒ$| j                  |_        d|_        Œ= |S )Nc              3   ód   K  — | ](  }t        |t        j                  j                  «      –— Œ* y ­w©N)Ú
isinstancer0   ÚnnÚLinear)Ú.0Úms     r=   Ú	<genexpr>z7BitsandbytesPrecision.convert_module.<locals>.<genexpr>j   s"   è ø€ ÐLÑ;K°a”:˜a¤§¡§¡×1Ñ;Kùs   ‚.0z|You are using the bitsandbytes precision plugin, but your model has no Linear layers. This plugin won't work for your model.c              3   óŠ   •K  — | ]:  }t        |‰j                  j                  ‰j                  j                  f«      –— Œ< y ­wrC   )rD   rE   ÚLinear8bitLtÚ
Linear4bit)rG   rH   Úbnbs     €r=   rI   z7BitsandbytesPrecision.convert_module.<locals>.<genexpr>r   s4   øè ø€ ÐeÑTdÈq”:˜a #§&¡&×"5Ñ"5°s·v±v×7HÑ7HÐ!I×JÑTdùs   ƒA AF)ÚanyÚmodulesÚ	TypeErrorr.   Ú_convert_layersr8   r$   rD   rE   rL   r#   Úcompute_dtypeÚcompute_type_is_set)r:   r@   rH   rM   s      @r=   Úconvert_modulez$BitsandbytesPrecision.convert_moduleg   s§   ø€ ô ÑL¸6¿>¹>Ô;KÓLÔLÜð.óð ô #Ó$ˆÜÓeÐTZ×TbÑTbÔTdÓeÔeä˜F D×$4Ñ$4°d×6IÑ6IÔJð —‘Ö!ˆAÜ˜!˜SŸV™V×.Ñ.Õ/Ø"&§*¡*�”Ø(-�Õ%ð "ð ˆr?   c                 ó,   — t        | j                  «      S rC   ©r   r#   ©r:   s    r=   Útensor_init_contextz)BitsandbytesPrecision.tensor_init_context}   ó   € ä# D§J¡JÓ/Ð/r?   c                 óö   — | j                   rt        d| j                   › d�«      ‚| j                  «       }t        d| j                  i«      }t        «       }|j                  |«       |j                  |«       |S )NzŒInstantiating your model under the `init_module` context manager is not supported when used with `BitsandbytesPrecision(..., ignore_modules=z£)` as this may initialize the layers on-device, defeating the purpose of quantization. You can remove `ignore_modules` or remove the `init_module` context manager.ztorch.nn.Linear)r$   ÚRuntimeErrorrX   r   r8   r   Úenter_context)r:   Ú	dtype_ctxÚcontext_managerÚstacks       r=   Úmodule_init_contextz)BitsandbytesPrecision.module_init_context�   s„   € à×Òäð?Ø?C×?RÑ?RÐ>Sð TQðQóð ð ×,Ñ,Ó.ˆ	ä9Ð;LÈd×N^ÑN^Ð:_Ó`ˆÜ“ˆØ×Ñ˜IÔ&Ø×Ñ˜OÔ,Øˆr?   c                 ó,   — t        | j                  «      S rC   rV   rW   s    r=   Úforward_contextz%BitsandbytesPrecision.forward_context“   rY   r?   Údatac                 óD   — t        |t        t        | j                  ¬«      S ©N)Úfunctionr#   Údst_type)r   r   r   r#   ©r:   rc   s     r=   Úconvert_inputz#BitsandbytesPrecision.convert_input—   s   € ä" 4Ô2DÌFÐ]a×]gÑ]gÔhÐhr?   c                 óT   — t        |t        t        t        j                  «       ¬«      S re   )r   r   r   r0   Úget_default_dtyperh   s     r=   Úconvert_outputz$BitsandbytesPrecision.convert_output›   s   € ä" 4Ô2DÌFÔ]b×]tÑ]tÓ]vÔwÐwr?   ©NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r0   r#   r9   Ústrr>   r   rE   ÚModulerT   r   rX   r`   rb   r   ri   rl   © r?   r=   r   r   .   s%  „ ñð4 (,Ø-1ñ	6àÐOÑPð6ð ˜Ÿ™Ñ$ð6ð !  S¡Ñ*ð	6ð
 
ó6ðB ð U§X¡X§_¡_ð ¸¿¹¿¹ò ó ðð* ð0Ð%;ò 0ó ð0ð ðÐ%;ò ó ðð" ð0Ð!7ò 0ó ð0ð ði #ð i¨#ò ió ðið ðx 3ð x¨3ò xó ñxr?   r   Úquantize_fnÚ
state_dictÚ_r%   c                 ób   — t        d„ |D «       d «      }|€y |j                  |«      } | |«       y )Nc              3   óD   K  — | ]  }|j                  d «      sŒ|–— Œ y­w)ÚweightN)Úendswith)rG   Únames     r=   rI   z)_quantize_on_load_hook.<locals>.<genexpr>¢   s   è ø€ ÐN©
 °d·m±mÀHÕ6M”t©
ùs   ‚ ™ )ÚnextÚpop)ru   rv   rw   Ú
weight_keyrz   s        r=   Ú_quantize_on_load_hookr€       s4   € äÑN©
ÓNÐPTÓU€JØÐØà�^‰^˜JÓ'€FÙ�Õr?   r@   Úincompatible_keysc                 ó’   — t        |j                  «      D ]/  }|j                  d«      sŒ|j                  j                  |«       Œ1 y )Nrz   )ÚreversedÚmissing_keysr{   Úremove)r@   r�   Úkeys      r=   Ú_ignore_missing_weights_hookr‡   ª   s:   € ô Ð)×6Ñ6Ö7ˆØ�<‰<˜Õ!Ø×*Ñ*×1Ñ1°#Õ6ñ 8r?   Úparamrc   Úquant_statec                 ó  — t        «       }| j                  j                  dk(  rµt        | |j                  j
                  «      rj|j                  j                  ||j                  || j                  | j                  | j                  | j                  | j                  | j                  ¬«	      S t        j                  j                  ||j                  ¬«      S || _        t        | |j                  j
                  «      r|| _        | S )NÚmeta)	rc   Úrequires_gradr‰   Ú	blocksizeÚcompress_statisticsÚ
quant_typeÚquant_storager@   Úbnb_quantized)rŒ   )r.   ÚdeviceÚtyperD   rE   Ú
Params4bitrŒ   r�   rŽ   r�   r�   r@   r‘   r0   Ú	Parameterrc   r‰   )rˆ   rc   r‰   rM   s       r=   Ú_replace_paramr–   ²   sÛ   € ô Ó
 €Cð ‡|�|×Ñ˜FÒ"Ü�e˜SŸV™V×.Ñ.Ô/Ø—6‘6×$Ñ$ØØ"×0Ñ0Ø'ØŸ/™/Ø$)×$=Ñ$=Ø ×+Ñ+Ø#×1Ñ1Ø—|‘|Ø#×1Ñ1ð %ó 
ð 
ô �x‰x×!Ñ! $°d×6HÑ6HÐ!ÓIÐIØ€E„JÜ�%˜Ÿ™×*Ñ*Ô+Ø'ˆÔØ€Lr?   é   )Úmaxsizec                  óT  ‡	— t         st        t        t         «      «      ‚dt        j                  v } | sdt        j                  d<   t        j                  dd¬«       t        j                  dd¬«       dd lŠ	| st        j                  d=  G ˆ	fd„d	‰	j                  j                  «      } G ˆ	fd
„d‰	j                  j                  «      } G d„ d|«      } G d„ d|«      } G d„ d|«      } G d„ d|«      } G d„ d|«      }|||||||dœ}t        «       j                  |«       ‰	S )NÚBITSANDBYTES_NOWELCOMEÚ1Úignorez1.*bitsandbytes was compiled without GPU support.*)ÚmessagezHMatMul8bitLt: inputs will be cast from .* to float16 during quantizationr   c                   óf  •‡ — e Zd ZdZdddœdedee   deded	df
ˆ ˆfd
„Zddee	j                     dee	j                     d	dfˆfd„ZedW °j                  j                  de	j                  dee	j                     d	W °j                  j                  fˆfd„«       Zddœdeded	efd„Zdˆfd„Zˆ xZS )ú+_import_bitsandbytes.<locals>._Linear8bitLtz„Wraps `bnb.nn.Linear8bitLt` and enables instantiation directly on the device and re-quantizaton when loading
        the state dict.Ng      @©r’   Ú	thresholdÚargsr’   r¡   Úkwargsr%   c                ó¢  •— t        ‰| �  |||dœ|¤Ž t        ‰j                  j                  | j
                  «      | _        | j                  | _        t        j                  d|¬«      j                  j                  dk(  r| j                  «        | j                  t        t        | j                  «      «       | j                  t         «       y )Nr    r   ©r’   r2   )Úsuperr>   r   rE   Ú
Int8Paramsrz   Úbiasr0   Útensorr’   r“   Ú	quantize_Ú"_register_load_state_dict_pre_hookr   r€   Ú"register_load_state_dict_post_hookr‡   )r:   r’   r¡   r¢   r£   Ú	__class__rM   s        €€r=   r>   z4_import_bitsandbytes.<locals>._Linear8bitLt.__init__â   s—   ø€ Ü‰GÑ˜d¨6¸YÑQÈ&ÒQÜ˜sŸv™v×0Ñ0°$·+±+Ó>ˆDŒKØ6:·i±iˆDŒIô �|‰|˜A fÔ-×4Ñ4×9Ñ9¸VÒCØ—‘Ô Ø×3Ñ3´GÔ<RÐTX×TbÑTbÓ4cÔdØ×3Ñ3Ô4PÕQr?   rz   c                 ó"  •— |€| j                   j                  }|j                  j                  t        j                  k(  ryt        | j                   ‰j                  j                  «      sJ ‚| j                  | j                   ||«      | _         y)úInplace quantize.N)	rz   rc   r#   r0   r!   rD   rE   r§   Úquantize©r:   rz   r’   rM   s      €r=   rª   z5_import_bitsandbytes.<locals>._Linear8bitLt.quantize_í   sf   ø€ àˆ~ØŸ™×)Ñ)�Ø�{‰{× Ñ ¤E§J¡JÒ.àÜ˜dŸk™k¨3¯6©6×+<Ñ+<Ô=Ð=Ð=ØŸ-™-¨¯©°V¸VÓDˆD�Kr?   Ú
int8paramsc                 ó   •— |xs t        j                  d«      }|j                  dk7  rt        d|j                  › �«      ‚|j	                  «       j                  |t         j                  ¬«      }| j                  r	|| _        | S t        ‰j                  d«      r ‰j                  j                  |«      \  }}}n!‰j                  j                  |«      \  }}}}}|| _        t        | d|«       t        | d|«       | S )Nr2   úUnexpected device type: ©r’   r#   Úint8_vectorwise_quantÚCBÚSCB)r0   r’   r“   r[   Ú
contiguousÚtor1   Úhas_fp16_weightsrc   ÚhasattrÚ
functionalr¶   Údouble_quantÚsetattr)r²   rz   r’   ÚBr·   r¸   rw   rM   s          €r=   r°   z4_import_bitsandbytes.<locals>._Linear8bitLt.quantize÷   sä   ø€ ð Ò3œuŸ|™|¨FÓ3ˆFØ�{‰{˜fÒ$Ü"Ð%=¸f¿k¹k¸]Ð#KÓLÐLà×!Ñ!Ó#×&Ñ&¨f¼E¿M¹MÐ&ÓJˆAØ×*Ò*Ø"#�
”ð Ðô ˜3Ÿ>™>Ð+BÔCØ!$§¡×!EÑ!EÀaÓ!H‘J�B˜™Qà'*§~¡~×'BÑ'BÀ1Ó'EÑ$�B˜˜3  1à"$�
”Ü˜
 D¨"Ô-Ü˜
 E¨3Ô/ØÐr?   T©ÚrecurserÂ   c                ó8  — | j                   j                  j                  dk(  rt        ‚| j                   j                  t
        j                  k(  rt        ‚t        j                  |«      }t        j                  | j                   j                  |¬«      }|j                  dk(  r| j                  ||«       nt        | j                   |«      | _         | j                  �:t        | j                  t        j                  | j                  |¬«      «      | _        | S )Nr‹   r¥   r2   )rz   r’   r“   ÚNotImplementedErrorr#   r0   Úuint8Ú
empty_likerc   rª   r–   r¨   ©r:   r’   rÂ   rz   s       r=   Úto_emptyz4_import_bitsandbytes.<locals>._Linear8bitLt.to_empty  sÅ   € Ø�{‰{×!Ñ!×&Ñ&¨&Ò0ä)Ð)Ø�{‰{× Ñ ¤E§K¡KÒ/ä)Ð)Ü—\‘\ &Ó)ˆFÜ×%Ñ% d§k¡k×&6Ñ&6¸vÔFˆFØ�{‰{˜fÒ$Ø—‘˜v vÕ.ä,¨T¯[©[¸&ÓA�”Ø�y‰yÐ$Ü*¨4¯9©9´e×6FÑ6FÀtÇyÁyÐY_Ô6`Óa�”	ØˆKr?   c                 ó^  •— | j                   �wt        j                  j                  j	                  | j
                  «      \  }}|dkD  rdt        j                  |«      z  nd}t        j                  | j                   | |«       t        | j
                  ‰j                  j                  «      }|r-| j
                  j                  t        j                  k(  rt        ‚| j
                  j                  }t        j                  j                  j                  |t        j                  d«      ¬«       |rz| j
                  j                   j"                  dk(  rt        ‚| j
                  j                   j"                  dk(  r| j%                  |«       y t'        | j
                  |«      | _        y y )Nr   r—   é   ©Úar‹   r2   )r¨   r0   rE   r   Ú_calculate_fan_in_and_fan_outrz   ÚmathÚsqrtÚuniform_rD   r”   r#   rÅ   rÄ   rc   Úkaiming_uniform_r’   r“   rª   r–   ©r:   Úfan_inrw   ÚboundÚlinear_init_finishedrz   rM   s         €r=   Úreset_parametersz<_import_bitsandbytes.<locals>._Linear8bitLt.reset_parameters  s%  ø€ à�y‰yÐ$Ü!ŸH™HŸM™M×GÑGÈÏÉÓT‘	�˜Ø17¸!²˜œDŸI™I fÓ-Ò-À�Ü—‘˜dŸi™i¨%¨°Ô7ä#-¨d¯k©k¸3¿6¹6×;LÑ;LÓ#MÐ Ù#¨¯©×(9Ñ(9¼U¿[¹[Ò(Hä)Ð)Ø—[‘[×%Ñ%ˆFÜ�H‰H�M‰M×*Ñ*¨6´T·Y±Y¸q³\Ð*ÔBÙ#Ø—;‘;×%Ñ%×*Ñ*¨fÒ4ä-Ð-Ø—;‘;×%Ñ%×*Ñ*¨fÒ4Ø—N‘N 6Õ*ä"0°·±¸fÓ"E�D•Kð $r?   rm   ©r%   N)rn   ro   rp   rq   r   r   r   Úfloatr>   r0   r   r’   rª   ÚstaticmethodrE   r§   r°   Úboolr   rÈ   rÖ   Ú__classcell__©r­   rM   s   @€r=   r,   rŸ   Þ   s  ù„ ñ	ð DHÐ\_ò 		R #ð 		R¨x¸Ñ/@ð 		RÐTYð 		RÐknð 		RÐswö 		Rñ	E H¨U¯\©\Ñ$:ð 	EÈ8ÐTY×T`ÑT`ÑKað 	EÐmqõ 	Eð 
ð	ÙŸ™×)Ñ)ð	Ø38·<±<ð	ØIQÐRW×R^ÑR^ÑI_ð	á�V‰V×Ñô	ó 
ð	ð, @Dò 	 gð 	¸ð 	Èó 	÷"	Fñ 	Fr?   r,   c            	       ó`  •‡ — e Zd ZdZddœdedee   deddfˆ ˆfd„Zdd	eej                     deej                     ddfˆfd
„ZedW °j                  j                  d	ej                  deej                     dW °j                  j                  fˆfd„«       Zddœdededefd„Zdˆfd„Zˆ xZS )ú)_import_bitsandbytes.<locals>._Linear4bitz¯Wraps `bnb.nn.Linear4bit` to enable: instantiation directly on the device, re-quantizaton when loading the
        state dict, meta-device initialization, and materialization.Nr¥   r¢   r’   r£   r%   c                ó   •— t        ‰| �  |d|i|¤Ž t        ‰j                  j                  | j
                  «      | _        | j                  | _        t        j                  d|¬«      j                  j                  dk(  r| j                  «        | j                  t        t        | j                  «      «       | j                  t         «       y )Nr’   r   r¥   r2   )r¦   r>   r   rE   r”   rz   r¨   r0   r©   r’   r“   rª   r«   r   r€   r¬   r‡   )r:   r’   r¢   r£   r­   rM   s       €€r=   r>   z2_import_bitsandbytes.<locals>._Linear4bit.__init__9  s˜   ø€ Ü‰GÑ˜dÐ<¨6Ð<°VÒ<Ü˜sŸv™v×0Ñ0°$·+±+Ó>ˆDŒKØ6:·i±iˆDŒIô �|‰|˜A fÔ-×4Ñ4×9Ñ9¸VÒCØ—‘Ô Ø×3Ñ3´GÔ<RÐTX×TbÑTbÓ4cÔdØ×3Ñ3Ô4PÕQr?   rz   c                 óD  •— |€| j                   j                  }|j                  j                  t        j                  k(  ryt        | j                   ‰j                  j                  «      sJ ‚| j                  | j                   ||«      | _         d| j                   _	        y)r¯   NT)
rz   rc   r#   r0   rÅ   rD   rE   r”   r°   r‘   r±   s      €r=   rª   z3_import_bitsandbytes.<locals>._Linear4bit.quantize_D  sr   ø€ àˆ~ØŸ™×)Ñ)�Ø�{‰{× Ñ ¤E§K¡KÒ/àÜ˜dŸk™k¨3¯6©6×+<Ñ+<Ô=Ð=Ð=ØŸ-™-¨¯©°V¸VÓDˆDŒKØ(,ˆD�K‰KÕ%r?   Ú
params4bitc                 ó’  •— |xs t        j                  d«      }|j                  dk7  rt        d|j                  › �«      ‚|j	                  «       j                  |t         j                  ¬«      }‰j                  j                  || j                  | j                  | j                  | j                  ¬«      \  }}t        | ||«      S )Nr2   r´   rµ   )r�   rŽ   r�   r�   )r0   r’   r“   r[   r¹   rº   Úhalfr½   Úquantize_4bitr�   rŽ   r�   r�   r–   )rá   rz   r’   ÚwÚw_4bitr‰   rM   s         €r=   r°   z2_import_bitsandbytes.<locals>._Linear4bit.quantizeO  s³   ø€ ð Ò3œuŸ|™|¨FÓ3ˆFØ�{‰{˜fÒ$Ü"Ð%=¸f¿k¹k¸]Ð#KÓLÐLà×!Ñ!Ó#×&Ñ&¨f¼E¿J¹JÐ&ÓGˆAØ"%§.¡.×">Ñ">ØØ$×.Ñ.Ø$.×$BÑ$BØ%×0Ñ0Ø(×6Ñ6ð #?ó #ÑˆF�Kô " *¨f°kÓBÐBr?   TrÁ   rÂ   c                ód  — | j                   j                  t        j                  k(  rEt        j                  | j                   j
                  j                  |t        j                  ¬«      }n+t        j                  | j                   j                  |¬«      }t        j                  |«      }|j                  dk(  r| j                  ||«       nt        | j                   |«      | _         | j                  �:t        | j                  t        j                  | j                  |¬«      «      | _        | S )Nrµ   r¥   r2   )rz   r#   r0   rÅ   Úemptyr‰   Úshaperã   rÆ   rc   r’   r“   rª   r–   r¨   rÇ   s       r=   rÈ   z2_import_bitsandbytes.<locals>._Linear4bit.to_emptya  sÊ   € Ø�{‰{× Ñ ¤E§K¡KÒ/äŸ™ T§[¡[×%<Ñ%<×%BÑ%BÈ6ÔY^×YcÑYcÔd‘ä×)Ñ)¨$¯+©+×*:Ñ*:À6ÔJ�Ü—\‘\ &Ó)ˆFØ�{‰{˜fÒ$Ø—‘˜v vÕ.ä,¨T¯[©[¸&ÓA�”Ø�y‰yÐ$Ü*¨4¯9©9´e×6FÑ6FÀtÇyÁyÐY_Ô6`Óa�”	ØˆKr?   c                 ó²  •— | j                   �wt        j                  j                  j	                  | j
                  «      \  }}|dkD  rdt        j                  |«      z  nd}t        j                  | j                   | |«       t        | j
                  ‰j                  j                  «      }|r€| j
                  j                  t        j                  k(  rYt        j                  | j
                  j                  j                  | j
                  j                   t        j"                  ¬«      }n| j
                  j$                  }t        j                  j                  j'                  |t        j                  d«      ¬«       |rQ| j
                  j                   j(                  dk(  r| j+                  |«       y t-        | j
                  |«      | _        y y )Nr   r—   rµ   rÊ   rË   r2   )r¨   r0   rE   r   rÍ   rz   rÎ   rÏ   rÐ   rD   r”   r#   rÅ   rè   r‰   ré   r’   rã   rc   rÑ   r“   rª   r–   rÒ   s         €r=   rÖ   z:_import_bitsandbytes.<locals>._Linear4bit.reset_parametersp  s4  ø€ à�y‰yÐ$Ü!ŸH™HŸM™M×GÑGÈÏÉÓT‘	�˜Ø17¸!²˜œDŸI™I fÓ-Ò-À�Ü—‘˜dŸi™i¨%¨°Ô7ä#-¨d¯k©k¸3¿6¹6×;LÑ;LÓ#MÐ Ù#¨¯©×(9Ñ(9¼U¿[¹[Ò(HäŸ™ T§[¡[×%<Ñ%<×%BÑ%BÈ4Ï;É;×K]ÑK]Ôej×eoÑeoÔp‘àŸ™×)Ñ)�Ü�H‰H�M‰M×*Ñ*¨6´T·Y±Y¸q³\Ð*ÔBÙ#Ø—;‘;×%Ñ%×*Ñ*¨fÒ4Ø—N‘N 6Õ*ä"0°·±¸fÓ"E�D•Kð	 $r?   rm   r×   )rn   ro   rp   rq   r   r   r   r>   r0   r   r’   rª   rÙ   rE   r”   r°   rÚ   r   rÈ   rÖ   rÛ   rÜ   s   @€r=   Ú_Linear4bitrÞ   5  sø   ù„ ñ	Hð DHò 		R #ð 		R¨x¸Ñ/@ð 		RÐSVð 		RÐ[_ö 		Rñ		- H¨U¯\©\Ñ$:ð 		-È8ÐTY×T`ÑT`ÑKað 		-Ðmqõ 		-ð 
ð	CÙŸ™×)Ñ)ð	CØ38·<±<ð	CØIQÐRW×R^ÑR^ÑI_ð	Cá�V‰V×Ñô	Có 
ð	Cð" @Dò 	 gð 	¸ð 	Èó 	÷	Fñ 	Fr?   rë   c                   ó,   ‡ — e Zd Zdededdfˆ fd„Zˆ xZS )ú2_import_bitsandbytes.<locals>._Int8LinearInferencer¢   r£   r%   Nc                 ó(   •— t        ‰| �  |ddi|¤Ž y )Nr»   F©r¦   r>   ©r:   r¢   r£   r­   s      €r=   r>   z;_import_bitsandbytes.<locals>._Int8LinearInference.__init__†  s   ø€ Ü‰GÑ˜dÐE°UÐE¸fÓEr?   ©rn   ro   rp   r   r>   rÛ   ©r­   s   @r=   r-   rí   …  s'   ø„ ð	F #ð 	F°ð 	F¸÷ 	Fñ 	Fr?   r-   c                   ó,   ‡ — e Zd Zdededdfˆ fd„Zˆ xZS )ú(_import_bitsandbytes.<locals>._FP4Linearr¢   r£   r%   Nc                 ó*   •— t        ‰| �  |dddœ|¤Ž y )Nr   F©r�   rŽ   rï   rð   s      €r=   r>   z1_import_bitsandbytes.<locals>._FP4Linear.__init__Š  ó   ø€ Ü‰GÑ˜d¨uÈ%ÑZÐSYÓZr?   rñ   rò   s   @r=   r*   rô   ‰  ó'   ø„ ð	[ #ð 	[°ð 	[¸÷ 	[ñ 	[r?   r*   c                   ó,   ‡ — e Zd Zdededdfˆ fd„Zˆ xZS )ú*_import_bitsandbytes.<locals>._FP4DQLinearr¢   r£   r%   Nc                 ó*   •— t        ‰| �  |dddœ|¤Ž y )Nr   Trö   rï   rð   s      €r=   r>   z3_import_bitsandbytes.<locals>._FP4DQLinear.__init__Ž  ó   ø€ Ü‰GÑ˜d¨uÈ$ÑYÐRXÓYr?   rñ   rò   s   @r=   r+   rú   �  ó'   ø„ ð	Z #ð 	Z°ð 	Z¸÷ 	Zñ 	Zr?   r+   c                   ó,   ‡ — e Zd Zdededdfˆ fd„Zˆ xZS )ú(_import_bitsandbytes.<locals>._NF4Linearr¢   r£   r%   Nc                 ó*   •— t        ‰| �  |dddœ|¤Ž y )Nr   Frö   rï   rð   s      €r=   r>   z1_import_bitsandbytes.<locals>._NF4Linear.__init__’  r÷   r?   rñ   rò   s   @r=   r(   rÿ   ‘  rø   r?   r(   c                   ó,   ‡ — e Zd Zdededdfˆ fd„Zˆ xZS )ú*_import_bitsandbytes.<locals>._NF4DQLinearr¢   r£   r%   Nc                 ó*   •— t        ‰| �  |dddœ|¤Ž y )Nr   Trö   rï   rð   s      €r=   r>   z3_import_bitsandbytes.<locals>._NF4DQLinear.__init__–  rü   r?   rñ   rò   s   @r=   r)   r  •  rý   r?   r)   )r,   rë   r-   r*   r+   r(   r)   )Ú_BITSANDBYTES_AVAILABLEÚModuleNotFoundErrorrr   ÚosÚenvironÚwarningsÚfilterwarningsr   rE   rK   rL   r7   Úupdate)
Únowelcome_setr,   rë   r-   r*   r+   r(   r)   ÚclassesrM   s
            @r=   r.   r.   Í   s"  ø€ å"Ü!¤#Ô&=Ó">Ó?Ð?à,´·
±
Ð:€MÙØ/2Œ�
‰
Ð+Ñ,Ü×Ñ˜HÐ.bÕcÜ×ÑØÐeõó áÜ�J‰JÐ/Ð0öUF˜Ÿ™×+Ñ+ô UFönMF�c—f‘f×'Ñ'ô MFô`F˜}ô Fô[�[ô [ôZ�{ô Zô[�[ô [ôZ�{ô Zð 'Ø"Ø 4Ø Ø$Ø Ø$ñ€Gô ƒI×Ñ�WÔà€Jr?   Ú
linear_clsr$   Úprefixc                 ó>  ‡— | j                  «       D �]ˆ  \  }}|r|› d|› �n|Št        |t        j                  j                  «      �rCt        ˆfd„|D «       «      �s.t        j                  d‰›d�«       |j                  d u}t        «       d   }t        j                  t        ||«      rdnd«      } ||j                  |j                  ||¬«      }	|r=t        |	j                  |j                  j                  j!                  «       «      |	_        d	t        ||«      r|	j"                  j$                  nd i}
t        |	j"                  |j"                  j                  j!                  «       fi |
¤Ž|	_        | j'                  ||	«       �Œzt)        |||‰¬
«       �Œ‹ y )NÚ.c              3   ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrC   )r/   )rG   ÚsÚfullnames     €r=   rI   z"_convert_layers.<locals>.<genexpr>¬  s    øè ø€ Ð9iÑZhÐUV¸(×:MÑ:MÈa×:PÑZhùs   ƒzReplacing layer z with bitsandbytes equivalentrë   r‹   Úcpu)r¨   r’   r‰   )r  )Únamed_childrenrD   r0   rE   rF   rN   ÚlogÚdebugr¨   r7   r’   Ú
issubclassÚin_featuresÚout_featuresr–   rc   Úclonerz   r‰   Ú__setattr__rQ   )r@   r  r$   r  r|   ÚchildÚhas_biasrë   r’   ÚreplacementÚstater  s              @r=   rQ   rQ   ©  sX  ø€ Ø×,Ñ,×.‰ˆˆeÙ)/�f�X˜Q˜t˜fÑ%°TˆÜ�eœUŸX™XŸ_™_Õ-´cÓ9iÑZhÓ9iÕ6iÜ�I‰IÐ(¨¨Ð4QÐRÔSØ—z‘z¨Ð-ˆHô "›) MÑ2ˆKÜ—\‘\¬J°zÀ;Ô,O¡&ÐUZÓ[ˆFÙ$Ø×!Ñ!Ø×"Ñ"ØØô	ˆKñ Ü#1°+×2BÑ2BÀEÇJÁJÇOÁO×DYÑDYÓD[Ó#\�Ô Ø"ÄjÐQ[Ð]hÔFi K×$6Ñ$6×$BÒ$BÐosÐtˆEÜ!/°×0BÑ0BÀEÇLÁL×DUÑDU×D[ÑD[ÓD]Ñ!gÐafÑ!gˆKÔØ×Ñ˜t [Ö1ä˜E :¨~Àh×Oñ- /r?   rC   )Ú ):Ú	functoolsÚloggingrÎ   r  r  Úcollectionsr   Ú
contextlibr   r   r   Útypesr   Útypingr   r	   r
   r   r   r0   Úlightning_utilitiesr   Ú lightning_utilities.core.importsr   r   Útorch.nnr   Útorch.nn.modules.moduler   Útyping_extensionsr   r   Ú,lightning_fabric.plugins.precision.precisionr   Ú(lightning_fabric.plugins.precision.utilsr   r   r   Ú lightning_fabric.utilities.typesr   Ú	getLoggerrn   r  r  r   r€   rE   rs   r‡   r•   Útupler–   Ú	lru_cacher.   r“   r9   rr   rQ   rt   r?   r=   Ú<module>r3     s†  ðó Û Û Û 	Û Ý #ß 8Ý Ý ß 9Õ 9ã Ý 3Ý =Ý Ý Ý 5ß ,å B÷ñ õ
 5à€g×Ñ˜Ó!€á*¨>Ó:Ð ôox˜Iô oxðd¨°%·,±,°ÀÐ1EÑ(Fð ÐT_ð Ðehð Ðmqó ð7¨¯©¯©ð 7ÐM^ð 7Ðcgó 7ð SWñØ�8‰8×ÑðØ%*§\¡\ðØ@HÈÁðà
‡X�X×Ñóð6 €×Ñ˜QÔðX˜jò Xó  ðXñvP˜EŸH™HŸO™Oð P¸ð PÈsÐSVÉxð PÐadð PÐnrô Pr?   