ó
    >:jã+  ã                  ó  • S SK Jr  S SKrS SKJr  S SKJr  S SKJrJ	r	  S SK
rS SKrS SKrS SKJr  \ " S S5      5       rSS	 jr\SSS
 jj5       rSS jrSSS jjrSS jrS rSS jr\SSS jj5       r\SSS jj5       r\S 5       rS rg)é    )ÚannotationsN)Úcontextmanager)Ú	dataclass)ÚLiteralÚOptional)Únnc                  ó4   • \ rS rSr% S\S'   S\S'   S\S'   Srg	)
ÚTpInfoé   zdict[str, str]Útp_planztorch.distributed.DeviceMeshÚdevice_meshÚintÚtp_size© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__r   ó    ÚT/home/mande/repo/quber/.venv/lib/python3.13/site-packages/peft/utils/integrations.pyr
   r
      s   ‡ àÓØ-Ó-Ø†Lr   r
   c                 óÒ   • [         R                  R                  [        R                  5      [         R                  R                  S5      :¼  a  SSKJn   U " 5       $ SSKJn   U " 5       $ )Nz4.33.0r   ©Úis_deepspeed_zero3_enabled)Ú	packagingÚversionÚparseÚtransformersÚ__version__Útransformers.integrationsr   Útransformers.deepspeedr   s    r   Úcheck_deepspeed_zero3_enabledr#   #   sP   € Ü×Ñ×Ñœ|×7Ñ7Ó8¼I×<MÑ<M×<SÑ<SÐT\Ó<]Ó]ÝHñ &Ó'Ð'õ 	FÙ%Ó'Ð'r   c              #  ó¬   #   • [        5       (       d  Sv •  gSSKnUR                  R                  XUS9   Sv •  SSS5        g! , (       d  f       g= f7f)z`Call DeepSpeed GatheredParameters context manager if DeepSpeed is enabled, otherwise do nothing.Nr   )Úmodifier_rankÚ
fwd_module)r#   Ú	deepspeedÚzeroÚGatheredParameters)Úparamr%   r&   r'   s       r   Úgather_params_ctxr+   +   sI   é € ô )×*Ñ*ÛØãà	�‰×	*Ñ	*¨5ÐZdÐ	*Ò	eÛ÷ 
fà
÷ 
fÔ	eà
üs   ‚3AµAº	AÁ
AÁAc                óî  • [        U S5      (       a  U R                  5       nU$ [        U R                  5      R                  R                  S5      (       a  U R                  R                  5       nU$ U R                  n[        U[        R                  R                  5      (       d9  [        U[        R                  5      (       a  U$ [        S[        U5       S35      eUR                  R                  nUS;  a  U$ [        U SS5      nUR                  nUR                  [        R                  " S5      R                  :H  n[!        XS	9nU(       a   U R                  R#                  U5      U l        U$ )
zÈ
Helper function to dequantize a quantized weight.

This function should be extended if more quantization schemes are added to the library.

If the weight is not quantized, it will be returned as is.
ÚW_qztorchao.z1Input weight should be of type nn.Parameter, got z instead)Ú
Params4bitÚ
Int8ParamsÚstateNÚcpu)r0   )ÚhasattrÚ
dequantizeÚtypeÚweightr   Ú
startswithÚ
isinstanceÚtorchr   Ú	ParameterÚTensorÚ	TypeErrorÚ	__class__r   ÚgetattrÚdeviceÚdequantize_bnb_weightÚto)Úmoduler5   Úcls_nameÚquant_stater>   Úis_cpus         r   Údequantize_module_weightrE   :   s'  € ô ˆv�u×ÑØ×"Ñ"Ó$ˆØˆÜ	ˆf�m‰mÓ	×	'Ñ	'×	2Ñ	2°:×	>Ñ	>à—‘×)Ñ)Ó+ˆØˆà�]‰]€FÜ�fœeŸh™h×0Ñ0×1Ñ1Ü�fœeŸl™l×+Ñ+àˆMÜÐKÌDÐQWËLÈ>ÐYaÐbÓcÐcà×Ñ×(Ñ(€HØÐ3Ó3Øˆä˜& '¨4Ó0€KØ�]‰]€FØ�[‰[œEŸLšL¨Ó/×4Ñ4Ñ4€FÜ" 6Ñ=€FÞàŸ™×(Ñ(¨Ó0ˆŒØ€Mr   c                ó  • SSK nU R                  nU R                  R                  nUS:X  a2  UR                  R                  U R                  U R                  5      nU$ Uc  [        S5      eUR                  c  U R                  Ul	        [        UR                  S5      (       a2  UR                  R                  U R                  UR                  5      nU$ U R                  UR                  R                  SS5      -  S-  nU$ )	z7Helper function to dequantize 4bit or 8bit bnb weights.r   Nr.   z¢No `state` was passed for bnb 8bit quantized weights. Please open an issue on the PEFT repository and report the error: https://github.com/huggingface/peft/issuesÚint8_vectorwise_dequantéÿÿÿÿé   g   €@ €?)Úbitsandbytesr>   r<   r   Ú
functionalÚdequantize_4bitÚdatarC   Ú
ValueErrorÚSCBr2   rG   Úview)r5   r0   Úbnbr>   rB   Údequantizeds         r   r?   r?   _   sá   € ãà�]‰]€Fà×Ñ×(Ñ(€HØ�<ÓØ—n‘n×4Ñ4°V·[±[À&×BTÑBTÓUˆØÐð �}ÜðKó
ð 	
ð
 ‡y�yÑØ—J‘JˆŒ	äˆs�~‰~Ð8×9Ñ9à—n‘n×<Ñ<¸V¿[¹[È%Ï)É)ÓTˆð
 Ðð —k‘k E§I¡I§N¡N°2°qÓ$9Ñ9Ð<PÑPˆàÐr   c                óp   • U R                   R                  S:X  a  gU R                   R                  S:X  a  gg)z>Returns '4bit' or '8bit' if bitsandbytes parameter, else Falser.   Ú4bitr/   Ú8bitF)r<   r   )r*   s    r   Úget_bnb_param_typerV   ~   s/   € à‡�×Ñ <Ó/ØØ‡�×Ñ <Ó/ØØr   c                ó–  • U R                   R                  5        Vs/ s H  oS;  d  M
  UPM     snS   nU R                   R                  5        VVs0 s H  u  p4X4S;   a  UOU_M     nnnUc  g[        U5      S:X  a9  SU;   a3  [	        U R
                  R                  5       Vs0 s H  ofUS   _M
     sn$ 0 nU H?  n[	        U R
                  R                  5       H  nSU S3U S3;   d  M  XX   Xv'     M=     MA     [	        U R
                  R                  5       H  nXg;  d  M
  [        SU S35      e   U$ s  snf s  snnf s  snf )	z4
Derive the device map for the layers of the model.
)r1   Údiskr   NrI   Ú Ú.zlayer z! has not been mapped to a device.)Úhf_device_mapÚvaluesÚitemsÚlenÚrangeÚconfigÚnum_hidden_layersÚRuntimeError)	ÚmodelÚdÚmain_deviceÚnamer>   Úexecution_device_mapÚidxÚlayer_device_mapÚlayers	            r   Úget_layer_device_maprk   ‰   s_  € ð $×1Ñ1×8Ñ8Ô:ÓWÒ:˜ÀÑ>V—1Ñ:ÑWÐXYÑZ€Kð X]×WjÑWj×WpÑWpÔWrôÚWrÁ|Àtˆ Ó6‰k¸FÒBÑWrð ñ ð Ñ#Øä
ÐÓ  AÓ%¨"Ð0DÓ*DÜ9>¸u¿|¹|×?]Ñ?]Ô9^Ó_Ò9^°#Ð)¨"Ñ-Ò-Ñ9^Ñ_Ð_àÐÛ%ˆÜ˜Ÿ™×7Ñ7Ö8ˆCØ�3�%�qˆz ˜w a˜[Õ(Ø(<Ñ(CÐ Ñ%Úó 9ñ &ô
 �U—\‘\×3Ñ3Ö4ˆØÕ&Ü ¨ uÐ,MÐNÓOÐOñ 5ð Ðùò+ Xùóùò `s   �	D;ªD;ÁE Â&Ec                óª  • [        U[        R                  5      (       a  [        U S5      (       d  g[        U[        R                  5      (       a  [        XR                  5        g[        U 5      n[        U R                  R                  5       H¿  nX#   n[        US5      (       aQ  UR                  U   nUR                  R                  U5      Ul        UR                  R                  U5      Ul        Mi  UR                  U   R                  U5      UR                  U'   UR                   U   R                  U5      UR                   U'   MÁ     g)zh
Ensure that the key and value cache of the model are on the same device as their corresponding layers.
r[   NÚlayers)r7   r   ÚCacher2   ÚEncoderDecoderCacheÚmap_cache_to_layer_device_mapÚself_attention_cacherk   r_   r`   ra   rm   Úkeysr@   r\   Ú	key_cacheÚvalue_cache)rc   Úcacheri   rh   Úlayer_devicerj   s         r   rp   rp   §   s  € ô �uœl×0Ñ0×1Ñ1´g¸eÀ_×6UÑ6UØä�%œ×9Ñ9×:Ñ:Ü% e×-GÑ-GÔHØä+¨EÓ2ÐÜ�U—\‘\×3Ñ3Ö4ˆØ'Ñ,ˆÜ�5˜(×#Ñ#à—L‘L Ñ%ˆEØŸ™Ÿ™ |Ó4ˆEŒJØ Ÿ<™<Ÿ?™?¨<Ó8ˆEŽLð $)§?¡?°3Ñ#7×#:Ñ#:¸<Ó#HˆE�O‰O˜CÑ Ø%*×%6Ñ%6°sÑ%;×%>Ñ%>¸|Ó%LˆE×Ñ˜cÓ"ò 5r   c              #  ó„   #   • [        [        R                  " S5      U S9 nUv •  S S S 5        g ! , (       d  f       g = f7f)NÚmeta)Úinclude_buffers)Ú_init_on_devicer8   r>   )ry   Úfs     r   Úinit_empty_weightsr|   É   s.   é € ô 
œŸš fÓ-¸Ò	OÐSTØŠ÷ 
P×	OÖ	Oüs   ‚A ¡/¦	A ¯
=¹A c              #  óh  ^ ^^	#   • [         R                  R                  m	U(       a  [         R                  R                  mU U	4S jnSU U4S jjnU(       a"  S Vs0 s H  nU[	        [
        U5      _M     nnO0 nU 4S jn U[         R                  l        U(       a  U[         R                  l        UR                  5        H'  n[        [
        XF" [	        [
        U5      5      5        M)     S v •  T	[         R                  l        U(       a  T[         R                  l        UR                  5        H  u  pG[        [
        XG5        M     g s  snf ! T	[         R                  l        U(       a  T[         R                  l        UR                  5        H  u  pG[        [
        XG5        M     f = f7f)Nc                ó.  >• T" XU5        Ubˆ  [        [        SS5      SLas  [        U R                  U   5      nU R                  U   R                  nUR
                  US'   U" U R                  U   R                  T5      40 UD6U R                  U'   g g g )NÚ_skipFTÚrequires_grad)r=   rz   r4   Ú_parametersÚ__dict__r€   r@   )rA   rf   r*   Ú	param_clsÚkwargsr>   Úold_register_parameters        €€r   Úregister_empty_parameterÚ1_init_on_device.<locals>.register_empty_parameter×   s›   ø€ ñ 	˜v¨UÔ3ØÑ¤G¬O¸WÀeÓ$LÐTXÒ$XÜ˜V×/Ñ/°Ñ5Ó6ˆIØ×'Ñ'¨Ñ-×6Ñ6ˆFØ&+×&9Ñ&9ˆF�?Ñ#Ù'0°×1CÑ1CÀDÑ1I×1LÑ1LÈVÓ1TÑ'_ÐX^Ñ'_ˆF×Ñ˜tÒ$ð	 %YÐr   c                ór   >• T" XX#S9  Ub,  U R                   U   R                  T5      U R                   U'   g g )N)Ú
persistent)Ú_buffersr@   )rA   rf   Úbufferr‰   r>   Úold_register_buffers       €€r   Úregister_empty_bufferÚ._init_on_device.<locals>.register_empty_bufferâ   s:   ø€ Ù˜F¨&ÒHØÑØ$*§O¡O°DÑ$9×$<Ñ$<¸VÓ$DˆF�O‰O˜DÒ!ð r   )ÚemptyÚzerosÚonesÚfullc                ó   >^ • UU 4S jnU$ )Nc                 ó   >• TUS'   T" U 0 UD6$ )Nr>   r   )Úargsr„   r>   Úfns     €€r   ÚwrapperÚB_init_on_device.<locals>.patch_tensor_constructor.<locals>.wrapperñ   s   ø€ Ø%ˆF�8ÑÙ�tÐ&˜vÑ&Ð&r   r   )r–   r—   r>   s   ` €r   Úpatch_tensor_constructorÚ1_init_on_device.<locals>.patch_tensor_constructorð   s   ù€ ö	'ð ˆr   )T)	r   ÚModuleÚregister_parameterÚregister_bufferr=   r8   rr   Úsetattrr]   )
r>   ry   r†   r�   Útorch_function_nameÚtensor_constructors_to_patchr™   Úold_torch_functionrŒ   r…   s
   `       @@r   rz   rz   Ð   s\  úé € ô  ŸY™Y×9Ñ9ÐÞÜ Ÿi™i×7Ñ7Ðö	`÷Eð Eö ñ (Jó(
â'IÐ#ð  ¤¬Ð0CÓ!DÒDÙ'Ið 	%ð (
Ð$ð
 (*Ð$õðDØ'?Œ�	‰	Ô$ÞØ(=ŒB�I‰IÔ%Ø#?×#DÑ#DÖ#FÐÜ”EÐ.Ð0HÌÔQVÐXkÓIlÓ0mÖnñ $Gãà'=Œ�	‰	Ô$ÞØ(;ŒB�I‰IÔ%Ø7S×7YÑ7YÖ7[Ñ3ÐÜ”EÐ.ÖCò 8\ùò3(
øð, (>Œ�	‰	Ô$ÞØ(;ŒB�I‰IÔ%Ø7S×7YÑ7YÖ7[Ñ3ÐÜ”EÐ.ÖCò 8\üs-   …AF2ÁEÁ7F2ÂA0E Ã3A F2ÅAF/Æ/F2c               #  ó„   #   • [        [        SS5      n  S[        l        S v •  U [        l        g ! U [        l        f = f7f)Nr   FT)r=   rz   r   )Úold_vals    r   Ú_skip_init_on_devicer¤     s5   é € ô ”o w°Ó6€Gð(Ø $ŒÔÛà 'ŒÕø ŒÕüs   ‚A •0 ¤A °=½A c                óF   ^ • [         R                  " T 5      U 4S j5       nU$ )zÜ
Ignore the init_on_device context manager when calling the decorated function.

This is a narrow use decorator that allows us to avoid initializing on meta device even when we're inside the
init_empty_weights context.

c                 ó^   >• [        5          T" U 0 UD6sS S S 5        $ ! , (       d  f       g = f©N)r¤   )r•   r„   Úfuncs     €r   r—   Ú$skip_init_on_device.<locals>.wrapper  s"   ø€ ä!Õ#Ù˜Ð( Ñ(÷ $×#×#ús   Œž
,)Ú	functoolsÚwraps)r¨   r—   s   ` r   Úskip_init_on_devicer¬     s'   ø€ ô ‡_‚_�TÓô)ó ð)ð €Nr   )ÚreturnÚbool)r   N)r%   zOptional[int]r&   útorch.nn.Module)rA   r¯   r­   útorch.nn.Parameterr§   )r5   r°   )r*   r°   r­   zLiteral[False, '4bit', '8bit'])r­   ÚNone)ry   r®   )r>   ztorch.devicery   r®   )Ú
__future__r   rª   Ú
contextlibr   Údataclassesr   Útypingr   r   Úpackaging.versionr   r8   r   r   r
   r#   r+   rE   r?   rV   rk   rp   r|   rz   r¤   r¬   r   r   r   Ú<module>r·      s´   ðõ #ã Ý %Ý !ß $ã Û Û Ý ð ÷ð ó ðô(ð õó ðô"öJô>òô<MðD õó ðð õ2Dó ð2Dðj ñ(ó ð(ór   