ó
    Eñi›  ã            	       óÔ  • S SK r S SKrS SKrS SKrS SKrS SKrS SKJr  S SKJ	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Jr  S	S
KJrJrJrJr  S	SKJr  S	SKJrJr  S	SKJrJ r J!r!  S	SK"J#r#  \" \$5      r%S r&S r'S1S jr(S1S jr)S r*S2S jr+S2S jr,S3S jr-S2S jr.S4S\/S\/S\04S jjr1 S5S\/S\/S\0S\04S jjr2S\Rf                  Rh                  S \Rj                  4S! jr6S6S\Rf                  Rh                  S"\7S#\04S$ jjr8S%\Rr                  Rt                  S&\74S' jr;S\Rf                  Rh                  4S( jr<S\Rf                  Rh                  S)\Rf                  Rh                  4S* jr=S\Rf                  Rh                  S)\\Rf                  Rh                  /\04   4S+ jr>S, r?S-\7S)\74S. jr@S/\\	\Rf                  Rh                     \/4   S)\A\Rf                  R„                     4S0 jrCg)7é    N)Údefaultdict)ÚIterable)Únullcontext)ÚPath)ÚCallableÚUnioné   )Ú
get_loggeré   )ÚFSDP_MODEL_NAMEÚOPTIMIZER_NAMEÚSAFE_WEIGHTS_NAMEÚWEIGHTS_NAME)Úget_module_class_from_name)Úget_non_persistent_buffersÚis_peft_model)Úget_module_children_bottom_upÚis_compiled_moduleÚsave)Úis_torch_versionc                  óx   • S[         R                  ;  a  S[         R                  S'   S[         R                  S'   g)zS
Enables RAM efficient loading of Hugging Face models for FSDP in the environment.
ÚACCELERATE_USE_FSDPÚTrueÚFSDP_CPU_RAM_EFFICIENT_LOADINGN©ÚosÚenviron© ó    ÚX/home/mande/repo/quber/.venv/lib/python3.13/site-packages/accelerate/utils/fsdp_utils.pyÚ!enable_fsdp_ram_efficient_loadingr!   '   s.   € ð
 ¤B§J¡JÓ.Ø,2Œ�
‰
Ð(Ñ)Ø39„B‡J�JÐ/Ò0r   c                  ó*   • S[         R                  S'   g)zT
Disables RAM efficient loading of Hugging Face models for FSDP in the environment.
ÚFalser   Nr   r   r   r    Ú"disable_fsdp_ram_efficient_loadingr$   1   s   € ð 4;„B‡J�JÐ/Ò0r   c                 óš   • U(       a&  [        U 5      (       a  SSKJn  U" X R                  S9$ Ub  SSKJn  U" XS9$ U R                  5       $ )Nr   )Úget_peft_model_state_dict©Úadapter_name)Úget_model_state_dict©Úoptions)r   Úpeftr&   Úactive_adapterÚ'torch.distributed.checkpoint.state_dictr)   Ú
state_dict)ÚmodelÚadapter_onlyÚ
sd_optionsr&   r)   s        r    Ú_get_model_state_dictr3   8   sH   € Þœ e×,Ñ,Ý2á(¨×=QÑ=QÑRÐRð ÑÝPá# EÑ>Ð>à×ÑÓ!Ð!r   c                 ó    • U(       a'  [        U 5      (       a  SSKJn  U" XU R                  S9$ Ub  SSKJn  U" XUS9$ U R                  U5      $ )Nr   )Úset_peft_model_state_dictr'   )Úset_model_state_dictr*   )r   r,   r5   r-   r.   r6   Úload_state_dict)r0   r/   r1   r2   r5   r6   s         r    Ú_set_model_state_dictr8   G   sN   € Þœ e×,Ñ,Ý2á(¨È×I]ÑI]Ñ^Ð^ð ÑÝPá# E¸zÑJÐJà×$Ñ$ ZÓ0Ð0r   c           	      óÔ   • S nU R                   S:X  aU  SSKJn  SSKJn  U" U R
                  UR                  :H  [        U R                  SS5      [        U R                  SS5      S9nU$ )	Nr	   r   )ÚStateDictOptions©ÚStateDictTypeÚoffload_to_cpuFÚ
rank0_only)Úfull_state_dictÚcpu_offloadÚbroadcast_from_rank0)	Úfsdp_versionr.   r:   Ú2torch.distributed.fsdp.fully_sharded_data_parallelr<   Ústate_dict_typeÚFULL_STATE_DICTÚgetattrÚstate_dict_config)Úfsdp_pluginr2   r:   r<   s       r    Ú_prepare_sd_optionsrI   V   sj   € Ø€Jð ×Ñ 1Ó$ÝLÝTá%Ø'×7Ñ7¸=×;XÑ;XÑXÜ × =Ñ =Ð?OÐQVÓWÜ!(¨×)FÑ)FÈÐV[Ó!\ñ
ˆ
ð Ðr   c                 ó  • SS K Js  Jn  SSKJn  SSKJn  SSKJn	  [        R                  " USS9  U R                  U	R                  :X  a/  UR                  S:„  n
X R                  l        X R                  l        U R                   S:X  a1  UR                  X R                  U R                  U R"                  5      O	[%        5       n['        U 5      nU   [)        X%US9nU R                  U	R                  :X  a’  US:X  a	  [*         S	3O[*         S
U S	3n[        R,                  R/                  X>5      nUR0                  S:X  aF  [2        R5                  SU 35        [6        R8                  " Xß5        [2        R5                  SU 35        GOfU R                  U	R:                  :X  a›  US:X  a  [*         SUR0                   S	3O[*         S
U SUR0                   S	3n[        R,                  R/                  X>5      n[2        R5                  SU 35        [6        R8                  " Xß5        [2        R5                  SU 35        O±U R                  U	R<                  :X  a—  [        R,                  R/                  U[*         S
U 35      n[        R                  " USS9  [2        R5                  SU 35        SU0nUR9                  UUR?                  U5      U" 5       S9  [2        R5                  SU 35        S S S 5        g ! , (       d  f       g = f)Nr   ©ÚDefaultSavePlanner©ÚFullyShardedDataParallelr;   T©Úexist_okr   ©r1   r2   ú.binÚ_zSaving model to zModel saved to Ú_rankr0   ©r/   Ústorage_writerÚplanner) Útorch.distributed.checkpointÚdistributedÚ
checkpointÚ,torch.distributed.checkpoint.default_plannerrL   rC   rN   r<   r   ÚmakedirsrD   rE   Únum_processesrG   r=   r>   rB   Úoptim_state_dict_configr   rI   r3   r   ÚpathÚjoinÚprocess_indexÚloggerÚinfoÚtorchr   ÚLOCAL_STATE_DICTÚSHARDED_STATE_DICTÚFileSystemWriter)rH   Úacceleratorr0   Ú
output_dirÚmodel_indexr1   Údist_cprL   ÚFSDPr<   Úis_multi_processÚctxr2   r/   Úweights_nameÚoutput_model_fileÚckpt_dirs                    r    Úsave_fsdp_modelrr   g   s¤  € ç2Ð2ÝOÝcÝPä‡K‚K�
 TÒ*Ø×"Ñ" m×&CÑ&CÓCð '×4Ñ4°qÑ8ÐØ7G×%Ñ%Ô4Ø3C×%Ñ%Ô0ð ×#Ñ# qÓ(ð 	×ÑØ×.Ñ.°×0MÑ0MÈ{×OrÑOrô	
ô ‹]ð ô % [Ó1€Jâ	Ü*¨5ÐXbÑcˆ
Ø×&Ñ&¨-×*GÑ*GÓGØ7BÀaÓ7GœoÐ.¨dÑ3ÔP_ÐO`Ð`aÐbmÐanÐnrÐMsˆLÜ "§¡§¡¨ZÓ FÐØ×(Ñ(¨AÓ-Ü—‘Ð.Ð/@Ð.AÐBÔCÜ—
’
˜:Ô9Ü—‘˜oÐ.?Ð-@ÐAÔBùà×(Ñ(¨M×,JÑ,JÓJð  !Ó#ô #Ð# 5¨×)BÑ)BÐ(CÀ4ÑHä'Ð(¨¨+¨°e¸K×<UÑ<UÐ;VÐVZÐ[ð ô
 !#§¡§¡¨ZÓ FÐÜ�K‰KÐ*Ð+<Ð*=Ð>Ô?Ü�JŠJ�zÔ5Ü�K‰K˜/Ð*;Ð)<Ð=Õ>Ø×(Ñ(¨M×,LÑ,LÓLÜ—w‘w—|‘| J´?Ð2CÀ1À[ÀMÐ0RÓSˆHÜ�KŠK˜¨4Ò0Ü�K‰KÐ*¨8¨*Ð5Ô6Ø! :Ð.ˆJà�L‰LØ%Ø&×7Ñ7¸ÓAÙ*Ó,ð ñ ô
 �K‰K˜/¨(¨Ð4Ô5÷? 
�Žús   ÃHK8Ë8
Lc                 ó  • SS K Js  Jn  SSKJn  SSKJn  SSKJn	  UR                  5         U R                  U	R                  :X  a/  UR                  S:„  n
X R                  l        X R                  l        U R                  S:X  a1  UR                  X R                  U R                  U R                   5      O	[#        5       n[%        U 5      nU   U R                  U	R                  :X  Ga  ['        U5      ULaW  UR(                  S:w  aG  UR*                  (       d6  U R,                  (       d  U R                  S:X  a  [/        S5      e S S S 5        g US:X  a	  [0         S3O[0         SU S3n[2        R4                  R7                  X=5      n[8        R;                  S	U 35        UR*                  (       + =(       d    UR<                  nU(       a  [>        R@                  " US
S9nO0 n[8        R;                  SU 35        GOjU R                  U	RB                  :X  aš  US:X  a  [0         SUR(                   S3O[0         SU SUR(                   S3n[2        R4                  R7                  X=5      n[8        R;                  S	U 35        [>        R@                  " US
S9n[8        R;                  SU 35        O¶U R                  U	RD                  :X  aœ  [0         U;  a)  [2        R4                  R7                  U[0         SU 35      OUn[8        R;                  S	U 35        S[G        X%US90nURA                  UURI                  U5      U" 5       S9  US   n[8        R;                  SU 35        [K        UWX\S9nS S S 5        U$ ! , (       d  f       W$ = f)Nr   )ÚDefaultLoadPlannerrM   r;   r   zzSet the `sync_module_states` flag to `True` so that model states are synced across processes when initializing FSDP objectrR   rS   zLoading model from T©Úweights_onlyzModel loaded from rT   r0   rQ   )r/   Ústorage_readerrW   )&rX   rY   rZ   r[   rt   rC   rN   r<   Úwait_for_everyonerD   rE   r]   rG   r=   r>   rB   r^   r   rI   Útypera   Úis_fsdp2Úsync_module_statesÚ
ValueErrorr   r   r_   r`   rb   rc   Úis_main_processrd   Úloadre   rf   r3   ÚFileSystemReaderr8   )rH   rh   r0   Ú	input_dirrj   r1   rk   rt   rl   r<   rm   rn   r2   ro   Úinput_model_fileÚ
load_modelr/   rq   Úload_results                      r    Úload_fsdp_modelr„   ¡   sO  € ç2Ð2ÝOÝcÝPà×!Ñ!Ô#Ø×"Ñ" m×&CÑ&CÓCð '×4Ñ4°qÑ8ÐØ7G×%Ñ%Ô4Ø3C×%Ñ%Ô0ð ×#Ñ# qÓ(ð 	×ÑØ×.Ñ.°×0MÑ0MÈ{×OrÑOrô	
ô ‹]ð ô % [Ó1€JÚ	Ø×&Ñ&¨-×*GÑ*GÔGÜ�E‹{ $Ò&¨;×+DÑ+DÈÓ+IÐR]×Rf×RfØ"×5×5¸+×:RÑ:RÐVWÓ:WÜ$ð3óð ð ÷ 
ˆð 8CÀaÓ7GœoÐ.¨dÑ3ÔP_ÐO`Ð`aÐbmÐanÐnrÐMsˆLÜ!Ÿw™wŸ|™|¨IÓDÐÜ�K‰KÐ-Ð.>Ð-?Ð@ÔAà(×1Ñ1Ô1×P°[×5PÑ5PˆJÞÜ"ŸZšZÐ(8ÀtÑL‘
à�
Ü�K‰KÐ,Ð-=Ð,>Ð?Ö@Ø×(Ñ(¨M×,JÑ,JÓJð  !Ó#ô #Ð# 5¨×)BÑ)BÐ(CÀ4ÑHä'Ð(¨¨+¨°e¸K×<UÑ<UÐ;VÐVZÐ[ð ô
  "Ÿw™wŸ|™|¨IÓDÐÜ�K‰KÐ-Ð.>Ð-?Ð@ÔAÜŸšÐ$4À4ÑHˆJÜ�K‰KÐ,Ð-=Ð,>Ð?Õ@Ø×(Ñ(¨M×,LÑ,LÓLô &Ð&¨yÓ8ô —‘—‘˜Y¬?Ð*;¸1¸[¸MÐ(JÔKàð ô
 �K‰KÐ-¨h¨ZÐ8Ô9Ø!Ô#8¸ÐfpÑ#qÐrˆJØ�L‰LØ%Ø&×7Ñ7¸ÓAÙ*Ó,ð ñ ð
 $ GÑ,ˆJÜ�K‰KÐ,¨X¨JÐ7Ô8ä+¨E°:ÈLÑpˆ÷[ 
ð\ Ð÷] 
Œð\ Ðús   ÃA8M<ÅH$M<Í<
Nc                 ó&  • SS K Js  Jn  SSKJn  SSKJn  SSKJn	  [        R                  " USS9  U R                  S:X  a1  UR                  X0R                  U R                  U R                  5      O	[        5       n
[        U 5      nU
   U R                  S:X  a  SS	KJn  U" X2US
9nOUR%                  X25      nU R                  U	R&                  :X  a‘  UR(                  S:X  a€  US:X  a	  [*         S3O[*         SU S3n[        R,                  R/                  XN5      n[0        R3                  SU 35        [4        R6                  " Xß5        [0        R3                  SU 35        O•[        R,                  R/                  U[*         SU 35      n[        R                  " USS9  [0        R3                  SU 35        UR7                  SU0UR9                  U5      U" 5       S9  [0        R3                  SU 35        S S S 5        g ! , (       d  f       g = f)Nr   rK   rM   r;   TrO   r   r	   ©Úget_optimizer_state_dictr*   rR   rS   zSaving Optimizer state to zOptimizer state saved in Ú	optimizerrU   )rX   rY   rZ   r[   rL   rC   rN   r<   r   r\   rB   rD   rG   r^   r   rI   r.   r‡   Úoptim_state_dictrE   ra   r   r_   r`   rb   rc   rd   r   rg   )rH   rh   rˆ   r0   ri   Úoptimizer_indexrk   rL   rl   r<   rn   r2   r‡   Úoptim_stateÚoptim_state_nameÚoutput_optimizer_filerq   s                    r    Úsave_fsdp_optimizerrŽ   é   sË  € ç2Ð2ÝOÝcÝPä‡K‚K�
 TÒ*ð ×#Ñ# qÓ(ð 	×ÑØ×.Ñ.°×0MÑ0MÈ{×OrÑOrô	
ô ‹]ð ô % [Ó1€Jâ	Ø×#Ñ# qÓ(ÝXá2°5ÈZÑX‰Kà×/Ñ/°ÓAˆKà×&Ñ&¨-×*GÑ*GÓGØ×(Ñ(¨AÓ-à/>À!Ó/C”~Ð& dÑ+ÌNÐK[Ð[\Ð]lÐ\mÐmqÐIrð !ô )+¯©¯©°ZÓ(RÐ%Ü—‘Ð8Ð9NÐ8OÐPÔQÜ—
’
˜;Ô>Ü—‘Ð7Ð8MÐ7NÐOÔPøä—w‘w—|‘| J´>Ð2BÀ!ÀOÐCTÐ0UÓVˆHÜ�KŠK˜¨4Ò0Ü�K‰KÐ4°X°JÐ?Ô@Ø�L‰LØ'¨Ð5Ø&×7Ñ7¸ÓAÙ*Ó,ð ñ ô
 �K‰KÐ3°H°:Ð>Ô?÷5 
�Žús   Â	E0HÈ
Hc                 óº  • SS K Js  Jn  SSKJn  SSKJn	  UR                  5         U R                  S:X  a1  UR                  X0R                  U R                  U R                  5      O	[        5       n
[        U 5      nU
   U R                  U	R                  :X  a­  S nUR                  S:X  d  U R                  R                  (       d  US:X  a	  [          S3O[          SU S3n["        R$                  R'                  XM5      n[(        R+                  SU 35        [,        R.                  " USS	9n[(        R+                  S
U 35        O¾[          U;  a)  ["        R$                  R'                  U[          SU 35      OUn[(        R+                  SU 35        U R                  S:X  a  SSKJn  U" X2US9nOUR5                  X25      nSU0nUR/                  UUUR7                  U5      S9  US   n[(        R+                  SU 35        U R                  S:X  a"  UR9                  X2US9nUR;                  U5        OSSKJn  U" X2XËS9  S S S 5        g ! , (       d  f       g = f)Nr   rM   r;   r   rR   rS   zLoading Optimizer state from Tru   zOptimizer state loaded from zLoading Optimizer from r	   r†   r*   rˆ   )Úcheckpoint_idrw   zOptimizer loaded from )r0   Úoptimr‰   )Úset_optimizer_state_dict)rX   rY   rZ   rC   rN   r<   rx   rB   rD   rG   r^   r   rI   rE   ra   r>   r   r   r_   r`   rb   rc   rd   r~   r.   r‡   r‰   r   Úoptim_state_dict_to_loadr7   r’   )rH   rh   rˆ   r0   r€   rŠ   r1   rk   rl   r<   rn   r2   r‹   Úoptimizer_nameÚinput_optimizer_filerq   r‡   Úflattened_osdr’   s                      r    Úload_fsdp_optimizerr—     s4  € ç2Ð2ÝcÝPà×!Ñ!Ô#ð
 ×#Ñ# qÓ(ð 	×ÑØ×.Ñ.°×0MÑ0MÈ{×OrÑOrô	
ô ‹]ð ô % [Ó1€JÚ	Ø×&Ñ&¨-×*GÑ*GÓGØˆKØ×(Ñ(¨AÓ-°[×5XÑ5X×5c×5cà/>À!Ó/C”~Ð& dÑ+ÌNÐK[Ð[\Ð]lÐ\mÐmqÐIrð ô (*§w¡w§|¡|°IÓ'NÐ$Ü—‘Ð;Ð<PÐ;QÐRÔSÜ#ŸjšjÐ)=ÈDÑQ�Ü—‘Ð:Ð;OÐ:PÐQÔRøô %Ð%¨iÓ7ô —‘—‘˜Y¬>Ð*:¸!¸OÐ;LÐ(MÔNàð ô
 �K‰KÐ1°(°Ð<Ô=Ø×'Ñ'¨1Ó,Ý\á6°uÐQ[Ñ\‘à"×3Ñ3°EÓE�Ø&¨Ð4ˆKØ�L‰LØØ&Ø&×7Ñ7¸ÓAð ñ ð
 & kÑ2ˆKÜ�K‰KÐ0°°
Ð;Ô<à×#Ñ# qÓ(Ø ×9Ñ9ÀÐitÐ9ÐuˆMØ×%Ñ% mÕ4åXá$ U°{ÒW÷O 
�Žús   Á>GIÉ
IÚcheckpoint_dirÚ	save_pathÚsafe_serializationc                 óh  • SSK Js  Jn  SSKJs  Js  Jn  0 n[        U5      nUR                  SS9  UR                  UUR                  U 5      UR                  5       SS9  U(       a	  U[        -  OU[        -  n[        UR                  5       5      S:X  a  U[        U5      S      n[        XQUS9  U$ )z¡
Passthrough to `torch.distributed.checkpoint.format_utils.dcp_to_torch_save`

Will save under `save_path` as either `model.safetensors` or `pytorch_model.bin`.
r   NTrO   )rw   rW   Úno_distr   )rš   )rX   rY   rZ   Ú)torch.distributed.checkpoint.format_utilsÚformat_utilsr   ÚmkdirÚ_load_state_dictr   Ú_EmptyStateDictLoadPlannerr   r   ÚlenÚkeysÚlistr   )r˜   r™   rš   rk   Údist_cp_format_utilsr/   s         r    Ú)_distributed_checkpoint_to_merged_weightsr¦   R  s²   € ÷ 3Ð2ßLÓLà€JÜ�Y“€IØ‡O�O˜T€OÑ"Ø×)Ñ)ØØ×/Ñ/°Ó?Ø$×?Ñ?ÓAØð	 *ñ ö 2D�	Ô-Ò-ÈÔUaÑIa€Iô ˆ:�?‰?ÓÓ Ó"Ø¤ ZÓ 0°Ñ 3Ñ4ˆ
ÜˆÐ3EÒFØÐr   Úoutput_pathÚremove_checkpoint_dirc                 óÈ  • [        U 5      n SSKJn  [        SS5      (       d  [	        S5      eU R                  5       (       d‡  U S-  R                  5       nU S-  R                  5       nSU  S	3nU(       a  U(       a  US
-  nUSU  SU  S3-  nUS-  nO+U(       a  US-  nUSU  S3-  nOU(       a  US-  nUSU  S3-  n[	        U5      eU" 5       nUR                  (       aq  [        R                  SU  35        [        XU5      n	[        R                  SU	 35        U(       a.  [        R                  SU  35        [        R                  " U 5        UR                  5         g)a  
Merge the weights from sharded FSDP model checkpoints into a single combined checkpoint. Should be used if
`SHARDED_STATE_DICT` was used for the model. Weights will be saved to `{output_path}/model.safetensors` if
`safe_serialization` else `pytorch_model.bin`.

Note: this is a CPU-bound process.

Args:
    checkpoint_dir (`str`):
        The directory containing the FSDP checkpoints (can be either the model or optimizer).
    output_path (`str`):
        The path to save the merged checkpoint.
    safe_serialization (`bool`, *optional*, defaults to `True`):
        Whether to save the merged weights with safetensors (recommended).
    remove_checkpoint_dir (`bool`, *optional*, defaults to `False`):
        Whether to remove the checkpoint directory after merging.
r   )ÚPartialStateú>=z2.3.0z/`merge_fsdp_weights` requires PyTorch >= 2.3.0`Úpytorch_model_fsdp_0Úoptimizer_0zTried to load from z) but couldn't find a valid metadata file.zE However, potential model and optimizer checkpoint directories exist.zPlease pass in either z/pytorch_model_fsdp_0 or z/optimizer_0zinstead.z8 However, a potential model checkpoint directory exists.zPlease try passing in z/pytorch_model_fsdp_0 instead.z< However, a potential optimizer checkpoint directory exists.z/optimizer_0 instead.zMerging FSDP weights from z.Successfully merged FSDP weights and saved to z"Removing old checkpoint directory N)r   Úaccelerate.staterª   r   r|   Úexistsr}   rb   rc   r¦   ÚshutilÚrmtreerx   )
r˜   r§   rš   r¨   rª   Úmodel_path_existsÚoptimizer_path_existsÚerrÚstater™   s
             r    Úmerge_fsdp_weightsr¶   n  sx  € ô( ˜.Ó)€NÝ-ä˜D '×*Ñ*ÜÐJÓKÐKð × Ñ ×"Ñ"Ø+Ð.DÑD×LÑLÓNÐØ!/°-Ñ!?× GÑ GÓ IÐØ# NÐ#3Ð3\Ð]ˆÞÖ!6ØÐZÑZˆCØÐ+¨NÐ+;Ð;TÐUcÐTdÐdpÐqÑqˆCØ�:Ñ‰CÞØÐMÑMˆCØÐ+¨NÐ+;Ð;YÐZÑZ‰CÞ"ØÐQÑQˆCØÐ+¨NÐ+;Ð;PÐQÑQˆCÜ˜‹oÐñ ‹N€EØ××Ü�‰Ð0°Ð0@ÐAÔBÜ=¸nÐ[mÓnˆ	Ü�‰ÐDÀYÀKÐPÔQÞ Ü�K‰KÐ<¸^Ð<LÐMÔNÜ�MŠM˜.Ô)Ø	×ÑÕr   r0   Údevicec                 ó8  ^ ^	• [        USS 5      nU(       d  T $ 0 m	U HV  nUR                  S5      nSR                  US S 5      US   pTUR                  U5      n[        Xe5      nS T	[	        U5      '   MX     S[
        R                  R                  4U	U 4S jjnU$ )NÚ_tied_weights_keysÚ.éÿÿÿÿÚmodulec                 óN  >• [        [        5      nU R                  SS9 H3  u  p#[        U5      T;   d  M  U[        U5         R	                  U5        M5     T" U 5      n UR                  5        H2  u  pEU H'  nTU   nUc  [        X5      TU'   M  [        XU5        M)     M4     U $ )NF)Úrecurse)r   r¤   Únamed_parametersÚidÚappendÚitemsrF   Úsetattr)	r¼   Úparams_to_tieÚnÚparamÚid_keyÚ_param_namesÚ
param_nameÚ_tied_paramsÚparam_init_fns	          €€r    Úparam_init_fn_tied_paramÚ7ensure_weights_retied.<locals>.param_init_fn_tied_param·  s«   ø€ ô $¤DÓ)ˆØ×/Ñ/¸Ð/Ó>‰HˆAÜ�%‹y˜LÕ(Øœb ›iÑ(×/Ñ/°Ö2ñ ?ñ ˜vÓ&ˆð %2×$7Ñ$7Ö$9Ñ ˆFÛ*�
Ø$ VÑ,�Ø‘=ô ,3°6Ó+F�L Ó(ä˜F°Ö6ó +ñ %:ð ˆr   )rF   Úsplitr`   Úget_submodulerÀ   rd   ÚnnÚModule)
rË   r0   r·   Ú_tied_namesÚnamerÉ   ÚmodrÆ   rÌ   rÊ   s
   `        @r    Úensure_weights_retiedrÕ   ¥  sœ   ù€ Ü˜%Ð!5°tÓ<€KÞàÐð €LÛˆØ�z‰z˜#‹ˆØŸ8™8 D¨¨" IÓ.°°R±ˆjØ×!Ñ! $Ó'ˆÜ˜Ó(ˆà"&ˆ”R˜“YÓñ ð¬¯©¯©÷ ð ð2 $Ð#r   Úfull_sdr@   c                 ó  • SSK Jn  SSKJnJn  UR                  5       n0 nS n	S n
U R                  (       aõ  [        UR                  5       UR                  5       5       HÈ  u  u  p¼nUR                  nUR                  5       R                  UR                  5      n[        XÅ5      (       a  UR                  5       nUR!                  USUR"                  R$                  S9  U" XÎUR&                  5      nU	" UUU5      u  nnU
" UUU5      nU(       a  UR                  S5      nXøU'   MÊ     OÈUR                  5        H´  u  p½UR                  n[(        R*                  " UR-                  5       UR                  UR.                  S9nUR!                  USUR"                  R$                  S9  U" UXíR&                  5      nU	" UUU5      u  nnU
" UUU5      nU(       a  UR                  S5      nXøU'   M¶     UR1                  US	S
9  U$ )au  
Loads the full state dict (could be only on rank 0) into the sharded model. This is done by broadcasting the
parameters from rank 0 to all other ranks. This function modifies the model in-place.

Args:
    accelerator (`Accelerator`): The accelerator instance
    model (`torch.nn.Module`):
        The model to load the state dict into, expected to be on meta device or a VRAM spike can occur
    full_sd (`dict`): The full state dict to load, can only be on rank 0
    cpu_offload (`bool`, defaults to `False`):
        If True, move sharded parameters to CPU after distribution. Required when FSDP CPU offloading is enabled.
r   N)ÚDTensorÚdistribute_tensorc                 ó¬  •  U R                  U5      n[        [        S5      nS nU=(       a    UR                  [        R                  :H  n	UR                  R                  (       a  U	(       d  UR                  nUS L=(       a    UR                  5       U4$ ! [         a3    UR                  SS5      u  pEU R                  U5      n[	        Xe5      n N¿f = f)Nrº   r   Úfloat8_e4m3fn)Úget_parameter_or_bufferÚAttributeErrorÚrsplitrÏ   rF   Úhasattrrd   ÚdtyperÛ   Úis_floating_pointÚis_contiguous)
r0   rÉ   Úempty_paramÚ	old_paramÚbase_param_nameÚlocal_param_nameÚ	submoduleÚis_torch_e4m3fn_availableÚcasting_dtypeÚis_param_float8_e4m3fns
             r    Ú_infer_parameter_dtypeÚ:fsdp2_load_full_state_dict.<locals>._infer_parameter_dtypeè  sÁ   € ð	=Ø×5Ñ5°jÓAˆIô %,¬E°?Ó$CÐ!ØˆØ!:×!g¸{×?PÑ?PÔTY×TgÑTgÑ?gÐà×Ñ×.×.Ö7MØ%ŸO™OˆMà Ð$×B¨×)@Ñ)@Ó)BÀMÐQÐQøô ó 	=à0:×0AÑ0AÀ#ÀqÓ0IÑ-ˆOØ×+Ñ+¨OÓ<ˆIÜ 	Ó<ŠIð		=ús   ‚B Â:CÃCc                 óX   • Ub  U R                  US9n U(       a  U R                  5       n U $ )N)rà   )ÚtoÚ
contiguous)ÚtensorÚto_contiguousrà   s      r    Ú_cast_and_contiguousÚ8fsdp2_load_full_state_dict.<locals>._cast_and_contiguousú  s.   € ØÑØ—Y‘Y U�YÐ+ˆFÞØ×&Ñ&Ó(ˆFØˆr   )ÚsrcÚgroupÚcpu)r·   rà   T)Úassign)Útorch.distributedrY   Útorch.distributed.tensorrØ   rÙ   r/   r}   ÚziprÂ   ÚvaluesÚdevice_meshÚdetachrî   Údevice_typeÚ
isinstanceÚto_localÚ	broadcastrõ   ÚWORLDÚ
placementsrd   ÚemptyÚsizerà   r7   )rh   r0   rÖ   r@   ÚdistrØ   rÙ   Úmeta_sharded_sdÚ
sharded_sdrë   rò   rÉ   Ú
full_paramÚsharded_paramrü   Úsharded_tensorrñ   ré   Úfull_tensors                      r    Úfsdp2_load_full_state_dictr  Ó  sí  € õ %ßCð ×&Ñ&Ó(€OØ€JòRò$ð ×"×"Ü7:¸7¿=¹=»?ÈO×LbÑLbÓLdÖ7eÑ3Ñ$ˆZ mØ'×3Ñ3ˆKØ#×*Ñ*Ó,×/Ñ/°×0GÑ0GÓHˆJÜ˜*×.Ñ.ð (×0Ñ0Ó2�
Ø�N‰N˜:¨1°D·J±J×4DÑ4DˆNÑEÙ.¨zÈ×H`ÑH`ÓaˆNÙ+AØØØó,Ñ(ˆM˜=ñ
 2°.À-ÐQ^Ó_ˆNæØ!/×!2Ñ!2°5Ó!9�Ø%3�zÓ"ò' 8fð, *9×)>Ñ)>Ö)@Ñ%ˆJØ'×3Ñ3ˆKÜŸ+š+ m×&8Ñ&8Ó&:À;×CZÑCZÐbo×buÑbuÑvˆKØ�N‰N˜;¨A°T·Z±Z×5EÑ5EˆNÑFÙ.¨{¸K×IaÑIaÓbˆNÙ+AØØØó,Ñ(ˆM˜=ñ
 2°.À-ÐQ^Ó_ˆNæØ!/×!2Ñ!2°5Ó!9�Ø%3�zÓ"ñ *Að" 
×Ñ˜*¨TÐÑ2Ø€Lr   rˆ   Úmappingc                 óÊ   • SSK Jn  0 nSX2'    U R                   H(  nUS    Vs/ s H  oQUR                     PM     snUS'   M*     gs  snf ! [         a    [	        S5      ef = f)a’  
Switches the parameters of the optimizer to new ones (sharded parameters in usual case). This function modifies the
optimizer in-place.

Args:
    optimizer (`torch.optim.Optimizer`): Optimizer instance which contains the original model parameters
    mapping (`dict`): Mapping from the original parameter (specified by `data_ptr`) to the sharded parameter

Raises:
    KeyError:
        If a parameter in the optimizer couldn't be switched to its sharded version. This should never happen and
        indicates a bug. If we kept the original params instead of raising, the training wouldn't be numerically
        correct and weights wouldn't get updated.
r   )rØ   Ú_local_tensorÚparamsz„A parameter in the optimizer couldn't be switched to its sharded version. This breaks the training. Please raise an issue on GitHub.N)rù   rØ   Úparam_groupsÚdata_ptrÚKeyError)rˆ   r  rØ   Úaccessor_mappingÚparam_groupÚps         r    Ú!fsdp2_switch_optimizer_parametersr  -  sy   € õ 1àÐà /ÐÑð
Ø$×1Ô1ˆKØBMÈhÒBWÓ$XÒBW¸Q¨Q¯Z©ZÔ%8ÑBWÑ$XˆK˜Ó!ò 2ùÚ$XøÜó 
ô ð Só
ð 	
ð
ús   ŽA ¤A¼
A ÁA ÁA"c                 ón  • SSK Jn  [        U R                  R                  U5      n[        USS9SS  H}  u  pE[        UR                  S5      5      S:”  a  UR                  SS5      u  pgOSnUnU(       a  UR                  U5      OUnU" U5      (       d  Me  U" US	S
9nUR                  Xu5        M     U$ )a  
Applies the activation checkpointing to the model.

Args:
    accelerator (`Accelerator`): The accelerator instance
    model (`torch.nn.Module`): The model to apply the activation checkpointing to

Returns:
    `torch.nn.Module`: The model with the activation checkpointing applied
r   )Úcheckpoint_wrapperT)Úreturn_fqnsNr»   rº   r   F)Úpreserve_rng_state)Ú;torch.distributed.algorithms._checkpoint.checkpoint_wrapperr  Úfsdp2_prepare_auto_wrap_policyrµ   rH   r   r¢   rÎ   rÞ   rÏ   Úregister_module)	rh   r0   r  Úauto_wrap_policy_funcÚ
layer_nameÚlayerÚparent_nameÚ
child_nameÚparent_modules	            r    Úfsdp2_apply_acr&  L  sº   € õô ;¸;×;LÑ;L×;XÑ;XÐZ_Ó`Ðä:¸5ÈdÑSÐTWÐUWÓXÑˆ
Üˆz×Ñ Ó$Ó%¨Ó)Ø&0×&7Ñ&7¸¸QÓ&?Ñ#ˆK˜àˆKØ#ˆJæ<G˜×+Ñ+¨KÔ8ÈUˆÙ  ×/Ó/Ù& uÀÑGˆEØ×)Ñ)¨*Ö<ñ Yð €Lr   Úreturnc           	      ó¤  • SSK JnJnJn  [	        X5      =(       d(    [        U5      =(       a    [	        UR                  U5      nU(       a  U$ U R                  R                  nUR                  U5        UR                  5       n[        U SS5      nUR                  UR                  UR                  =(       d    U" 5       Ub"  U[        U R                   R"                  5         OSS.n	[%        SS5      (       a0  UR&                  b#  [)        UR&                  XR*                  5      U	S'   S	n
UR-                  5        H#  u  p¼UR.                  R0                  S
:X  d  M!  Sn
  O   UR2                  (       a˜  U
(       d‘  [5        USSS9n[6        R8                  " UR;                  5        VVs0 s H  u  pïXí;   d  M  Xï_M     snn5      nUR=                  [>        R*                  " S5      5      n[A        US5      (       a  URC                  5         [E        Xa5      nUb@  [G        U5      SS  H.  nU" U5      (       d  M  [	        UU5      (       a  M%  U" U40 U	D6  M0     [	        X5      (       d	  U" U40 U	D6  UR2                  (       a%  SSK J$n  [K        XU[	        UR                  U5      S9  UR2                  (       aŸ  U
(       d˜  WRM                  5        Hc  u  nnUR=                  U R*                  5      nSU;   a'  URO                  SS5      u  nnURQ                  U5      nOUnUnURS                  UUS	S9  Me     [A        US5      (       a  URC                  5         [        USS5      nU RT                  S:w  aÓ  Ub  U[>        RV                  :w  a¼  / nUR-                  5        Hh  u  p¼URX                  (       d  M  URZ                  [>        RV                  :w  d  M8  UR]                  U5        UR=                  [>        RV                  5      nMj     U R^                  (       a-  U(       a&  [`        Rb                  " S[e        U5       SU S35        U$ s  snnf )a
  Prepares the model for FSDP2 in-place. Also returns the model to avoid misuse of the original model.

Args:
    accelerator (`Accelerator`): The accelerator instance
    model (`torch.nn.Module`): The model to prepare

Returns:
    `torch.nn.Module`: Prepared model
r   )Ú
FSDPModuleÚMixedPrecisionPolicyÚfully_shardÚtorch_device_meshN)Úreshard_after_forwardÚoffload_policyÚ	mp_policyÚmeshr«   z2.7.0Úignored_paramsFÚ
Params4bitT)r¾   ÚfqnsÚmetaÚtie_weightsr»   )ÚCPUOffloadPolicy)r@   rº   r   )Ú
persistentrà   ÚnozŒFSDP upcast of low precision parameters to fp32 (since mixed_precision != 'no') may affect the precision of model checkpoints. This effects z parameters: z...)3Útorch.distributed.fsdpr)  r*  r+  rÿ   r   Ú	_orig_modrµ   rH   Úset_auto_wrap_policyr/   rF   r-  r@   Úmixed_precision_policyÚtupleÚparallelism_configÚfsdp_dim_namesr   Úignored_modulesÚget_parameters_from_modulesr·   r¿   Ú	__class__Ú__name__Úcpu_ram_efficient_loadingr   ÚcopyÚdeepcopyÚnamed_buffersrî   rd   rß   r5  r  r   r6  r  rÂ   rÞ   rÏ   Úregister_bufferÚmixed_precisionÚfloat32Úrequires_gradrà   rÁ   r}   ÚwarningsÚwarnr¢   )rh   r0   r)  r*  r+  Úis_type_fsdpÚfsdp2_pluginÚoriginal_sdr0  Úfsdp2_kwargsÚmodel_has_params4bitrÓ   rÆ   Únon_persistent_buffer_fqnsÚkÚvÚoriginal_non_persistent_buffersr   r¼   r6  ÚfqnÚbuffer_tensorÚ
parent_fqnÚlocal_buffer_namer%  Úmodel_dtypeÚupcasted_paramss                              r    Úfsdp2_prepare_modelr]  m  sÑ  € ÷ UÑTä˜eÓ0÷ Ü˜5Ó!×M¤j°·±À*Ó&Mð ö Øˆà×$Ñ$×0Ñ0€Là×%Ñ% eÔ,à×"Ñ"Ó$€KÜ�;Ð 3°TÓ:€Dð ".×!CÑ!CØ&×2Ñ2à!×8Ñ8×RÑ<PÓ<RØNRÑN^�”U˜;×9Ñ9×HÑHÓIÒJÐdhñ€Lô ˜˜g×&Ñ&¨<×+GÑ+GÑ+SÜ)DØ×(Ñ(¨%×1CÑ1Có*
ˆÐ%Ñ&ð !ÐØ×-Ñ-Ö/‰ˆð �?‰?×#Ñ# |Õ3Ø#'Ð Ùñ 0ð ×-×-Ö6Jô &@ÀÈtÐZ^Ñ%_Ð"Ü*.¯-ª-Ø#×1Ñ1Ô3ÔWÒ3‘d�a°qÑ7V‹TˆQŠTÑ3ÒWó+
Ð'ð —‘œŸš fÓ-Ó.ˆô �5˜-×(Ñ(Ø×ÑÔä:¸<ÓOÐØÑ(ä3°EÓ:¸3¸BÓ?ˆFÙ$ V×,Ó,´ZÀÈ
×5SÓ5SÙ˜FÑ3 lÔ3ñ @ô �e×(Ñ(Ù�EÑ*˜\Ò*à×-×-õ 	<ä"Ø ¼ÀL×D\ÑD\Ð^nÓ9oò	
ð ×-×-Ö6Jà"A×"GÑ"GÖ"IÑˆC�Ø)×,Ñ,¨[×-?Ñ-?Ó@ˆMà�c‹zØ03·
±
¸3ÀÓ0BÑ-�
Ð-Ø %× 3Ñ 3°JÓ ?‘à$'Ð!Ø %�à×)Ñ)Ð*;¸]ÐW\Ð)Ó]ñ #Jô  �5˜-×(Ñ(Ø×ÑÔô ˜% ¨$Ó/€KØ×"Ñ" dÓ*°Ñ0CÀ{ÔV[×VcÑVcÓGcð ˆØ ×1Ñ1Ö3‰KˆDØ×"×"Ñ" u§{¡{´e·m±mÕ'CØ×&Ñ& tÔ,ØŸ™¤§¡Ó/’ñ 4ð ×&×&®?Ü�MŠMð Ü # OÓ 4Ð5°]À?ÐBSÐSVðXôð €LùóE Xs   Æ*Q
Æ9Q
c                 ó.  ^ ^
• SSK JnJn  T R                  n[	        U[
        R                  5      (       a  UR                  nXCL a¢  [        USS5      nUc  / n[        U5      nT R                  b  T R                  n[        5       m
U H1  n[        X5      nUc  [        SU S35      eT
R                  U5        M3     S[        R                   R"                  S[$        4U U
4S	 jjn	U	$ XBL a*  S[        R                   R"                  S[$        4U 4S
 jjn	U	$ g)aõ  Prepares the auto wrap policy based on its type, done to mimic the behaviour of FSDP1 auto wrap policy.

Args:
    fsdp2_plugin (`FullyShardedDataParallelPlugin`):
        Instance of `FullyShardedDataParallelPlugin` containing the configuration options
    auto_wrap_policy_type (`str`):
        Either `transformer` or `size`
    model (`torch.nn.Module`):
        The model to wrap

Returns:
    `Callable[[torch.nn.Module], bool]`:
        The auto wrap policy function to be applied to the model
r   )Úsize_based_auto_wrap_policyÚtransformer_auto_wrap_policyÚ_no_split_modulesNz+Could not find the transformer layer class z in the model.r¼   r'  c                 óJ   >• TR                   c  g[        U [        T5      5      $ )NF)Útransformer_cls_names_to_wraprÿ   r=  )r¼   rO  Útransformer_cls_to_wraps    €€r    ÚpolicyÚ.fsdp2_prepare_auto_wrap_policy.<locals>.policy  s%   ø€ Ø×9Ñ9ÑAØÜ˜f¤eÐ,CÓ&DÓEÐEr   c                 ób   >• [        S U R                  5        5       5      nUTR                  :„  $ )Nc              3   ó@   #   • U  H  oR                  5       v •  M     g 7f)N)Únumel)Ú.0r  s     r    Ú	<genexpr>ÚAfsdp2_prepare_auto_wrap_policy.<locals>.policy.<locals>.<genexpr>  s   é € Ð#KÒ7J°!§G¡G§I IÒ7Jùs   ‚)ÚsumÚ
parametersÚmin_num_params)r¼   Úmodule_num_paramsrO  s     €r    re  rf    s.   ø€ Ü #Ñ#K°v×7HÑ7HÔ7JÓ#KÓ KÐØ$ |×'BÑ'BÑBÐBr   )Útorch.distributed.fsdp.wrapr_  r`  Úauto_wrap_policyrÿ   Ú	functoolsÚpartialÚfuncrF   r¤   rc  Úsetr   r|   Úaddrd   rÐ   rÑ   Úbool)rO  r0   r_  r`  ÚfnÚno_split_modulesrc  Úlayer_classÚtransformer_clsre  rd  s   `         @r    r  r  í  s  ù€ ÷ fà	×	&Ñ	&€Bä�"”i×'Ñ'×(Ñ(Ø�W‰Wˆà	Ò)Ü" 5Ð*=¸tÓDÐØÑ#Ø!ÐÜ(,Ð-=Ó(>Ð%Ø×5Ñ5ÑAØ,8×,VÑ,VÐ)Ü"%£%Ðã8ˆKÜ8¸ÓLˆOØÑ&Ü Ð#NÈ{ÈmÐ[iÐ!jÓkÐkØ#×'Ñ'¨Ö8ñ	 9ð	Fœ5Ÿ8™8Ÿ?™?ð 	F¬t÷ 	Fð 	Fð €Mð 
Ò	*ð	Cœ5Ÿ8™8Ÿ?™?ð 	C¬t÷ 	Cð €Mð r   c                  ó   • SSK Jn  U" S0 U D6$ )z÷
Returns a `GradScaler` for FSDP2, as the current implementation of `get_grad_scaler` doesn't accept other args. We
need this as current `get_grad_scaler` accepts only `distributed_type` as arg, which doesn't differentiate between
FSDP1 and FSDP2
r   )Ú
GradScalerr   )Útorch.amp.grad_scalerr~  )Úkwargsr~  s     r    Úget_fsdp2_grad_scalerr�  "  s   € õ 1áÑ˜ÑÐr   Únamed_paramsc                 ó˜  • U R                  5        VVs0 s H  u  pUR                  SS5      U_M     n nnU R                  5        VVs0 s H0  u  pUR                  S5      (       a  UR                  SS5      OUU_M2     n nnU R                  5        VVs0 s H  u  pUR                  SS5      U_M     n nnU $ s  snnf s  snnf s  snnf )a  Removes parameter name modifiers in order to map them back to their original names.

See huggingface/accelerate#3554 for more context.

Args:
    named_params (`dict`): The named parameters dictionary to canonicalize.

Returns:
    `dict`: The canonicalized named parameters dictionary
z._checkpoint_wrapped_moduleÚ z
_orig_mod.z
._orig_mod)rÂ   ÚreplaceÚ
startswith)r‚  rT  rU  s      r    Úfsdp2_canonicalize_namesr‡  -  sÎ   € ð Q]×PbÑPbÔPdÔeÒPdÉÈ�A—I‘IÐ;¸RÓ@À!ÒCÑPd€LÑeàXd×XjÑXjÔXlôÚXlÑPTÐPQ q§|¡|°L×'AÑ'Aˆ�	‰	�, Ô#ÀqÈ!ÒKÑXlð ñ ð @L×?QÑ?QÔ?SÔTÒ?S±t°q�A—I‘I˜l¨BÓ/°Ò2Ñ?S€LÑTØÐùó fùóùó Us   ”B:Á	7C ÂCÚmodulesc                 óœ  • U c
  [        5       $ / n[        U [        5      (       am  [        R                  " U 5      n/ nUR                  5        H?  u  pgUR                  U5      (       d  M  UR                  U5        UR                  U5        MA     Un U  H+  nUR                  [        UR                  5       5      5        M-     [        U5      $ )zâConverts modules to parameters where modules can be a string or list of torch.nn.Module

Args:
    modules (`Union[Iterable[torch.nn.Module], str]`): List of modules

Returns:
    `set[torch.nn.Parameter]`: List of parameters
)rv  rÿ   ÚstrÚreÚcompileÚnamed_modulesÚ	fullmatchrî   rÁ   Úextendr¤   rn  )rˆ  r0   r·   rn  ÚregÚmapped_modulesrÓ   r¼   s           r    rA  rA  @  sª   € ð �Ü‹uˆØ€Jä�'œ3×ÑÜ�jŠj˜Ó!ˆØˆØ!×/Ñ/Ö1‰LˆDØ�}‰}˜T×"Ó"Ø—	‘	˜&Ô!Ø×%Ñ% fÖ-ñ 2ð !ˆÛˆØ×Ñœ$˜v×0Ñ0Ó2Ó3Ö4ñ äˆz‹?Ðr   )FN)r   F)r   )T)TF)F)DrE  rs  r   r‹  r°   rL  Úcollectionsr   Úcollections.abcr   Ú
contextlibr   Úpathlibr   Útypingr   r   rd   Úloggingr
   Ú	constantsr   r   r   r   Údataclassesr   Úmodelingr   r   Úotherr   r   r   Úversionsr   rC  rb   r!   r$   r3   r8   rI   rr   r„   rŽ   r—   rŠ  rx  r¦   r¶   rÐ   rÑ   r·   rÕ   Údictr  r‘   Ú	Optimizerr  r&  r]  r  r�  r‡  rv  Ú	ParameterrA  r   r   r    Ú<module>r      s÷  ðó Û Û 	Û 	Û Û Ý #Ý $Ý "Ý ß "ã å  ß WÓ WÝ 3ß ?ß JÑ JÝ &ñ 
�HÓ	€ò:ò;ô"ô1òô"76ôtEôP-@ô`6Xñr¸cð Ècð Ðgkõ ð: kpñ4Øð4Ø&)ð4Ø?Cð4Øcgõ4ðn+$°·±·±ð +$ÈÏÉô +$ñ\W°5·8±8·?±?ð WÈTð WÐ`dõ Wðt
°·±×1FÑ1Fð 
ÐQUô 
ð> u§x¡x§¡ô ðB}¨E¯H©H¯O©Oð }ÀÇÁÇÁô }ð@2¸¿¹¿¹ð 2ÈHÐV[×V^ÑV^×VeÑVeÐUfÐhlÐUlÑLmô 2òj ð¨4ð °Dô ð&Ø�8˜EŸH™HŸO™OÑ,¨cÐ1Ñ2ðàˆ�‰×	Ñ	Ñõr   