Ë
    M²jân  ã            	       ó¼  — U 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mZ d dlm	Z	 d dl
mZmZ d dl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 d d
lmZmZmZmZmZmZm Z m!Z! d dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 ddl6m7Z7  ejp                  e9«      Z:ejv                  e<d<   g d¢Z= G d„ de'«      Z> G d„ de$«      Z? G d„ de?«      Z@	 d-deAeBef   dedeCde#fd„ZDdeEe#   deEe#   fd„ZFdeAeBef   d eCde&fd!„ZG	 d-deEe&   d"eCdeHeEe&   ef   fd#„ZIdedefd$„ZJd%ed&edeCfd'„ZKd(ej˜                  d)edeCfd*„ZMd+eEe&   dedeEeB   fd,„ZNy).é    N)Úbisect_rightÚinsort)ÚChainMap)ÚAnyÚcast)Únarrow_tensor_by_index)Údedup_save_plans)ÚFLATTEN_MAPPINGÚflatten_state_dict)Ú_flatten_sharded_tensors)Úset_element)ÚBytesStorageMetadataÚChunkStorageMetadataÚMetadataÚMetadataIndexÚSTATE_DICT_TYPEÚSTORAGE_TYPESÚStorageMetaÚTensorStorageMetadata)ÚLoadPlanÚLoadPlannerÚReadItemÚSavePlanÚSavePlannerÚ	WriteItemÚWriteItemType)Ú_compare_save_plansÚ_contains_usable_planÚ"_create_default_metadata_only_planÚ_create_read_itemsÚ_create_write_itemsÚ_init_state_dictÚ_merge_delta_local_plans)Úfind_state_dict_object)ÚDTensoré   )Ú_versionÚlogger)ÚDefaultSavePlannerÚDefaultLoadPlannerÚcreate_default_local_load_planÚcreate_default_global_load_planÚcreate_default_local_save_planÚcreate_default_global_save_planc                   óŽ  — e Zd ZU eed<   	 	 	 	 	 ddedededz  dededdfd	„Z	 	 dd
ededz  deddfd„Z	de
fd„Zdee
   dee
   fd„Zdee
   deee
   ef   fd„Zdee
   deee
   ee
   ef   fd„Zdee
   deee
   ef   fd„Zde
de
fd„Zde
de
fd„Zdedej.                  ej2                  z  fd„Zdedefd„Zdedefd„Zy)r)   ÚmappingsNr   Úflatten_sharded_tensorsÚdedup_replicated_tensorsÚdedup_save_to_lowest_rankÚenable_plan_cachingÚreturnc                 ó®   — || _         || _        i | _        || _        |�t        j                  d«       | j                  j                  | _        || _	        y )Nz—DefaultSavePlanner's `dedup_replicated_tensors` argument is being deprecated, and no longer has any effect. Please remove this argument from your call.)
r   r1   r0   r3   r(   ÚwarningÚ	__class__Ú__name__Ú_cached_plans_keyÚ_enable_plan_caching)Úselfr   r1   r2   r3   r4   s         úk/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/distributed/checkpoint/default_planner.pyÚ__init__zDefaultSavePlanner.__init__I   sV   € ð #5ˆÔØ'>ˆÔ$ØˆŒØ)BˆÔ&Ø#Ð/Ü�N‰Nð"ôð
 '+§n¡n×&=Ñ&=ˆÔØ$7ˆÕ!ó    Ú
state_dictÚstorage_metaÚis_coordinatorc                 óŒ   — | j                   rt        |«      \  }| _        | j                  rt        |«      }|| _        || _        y ©N)r   r0   r1   r   r@   rB   )r<   r@   rA   rB   s       r=   Úset_up_plannerz!DefaultSavePlanner.set_up_planner^   s@   € ð ×"Ò"Ü(:¸:Ó(FÑ%ˆJ˜œØ×'Ò'Ü1°*Ó=ˆJØ$ˆŒØ,ˆÕr?   c                 ó²  — t        | j                  | j                  «      }| j                  r!t	        j
                  || j                  ¬«      }|| _        | j                  rl| j                  t        j                  v rIt        |t        j                  | j                     «      r"t        j                  d«       t        g d¬«      S || _        | j                  S )N©Úplanner_datazINo change in the local plan. Skipping sending the plan to the coordinatorF©Úusable)r-   r@   rB   r   ÚdataclassesÚreplacer0   Úplanr;   r:   r   Ú_cached_save_planr   r(   Úinfor   Ú_pending_local_plan)r<   rM   s     r=   Úcreate_local_planz$DefaultSavePlanner.create_local_plank   s¯   € Ü-¨d¯o©o¸t×?RÑ?RÓSˆØ×"Ò"Ü×&Ñ& t¸$¿-¹-ÔHˆDØˆŒ	à×$Ò$ð ×&Ñ&¬+×*GÑ*GÑGÜ'Øœ+×7Ñ7¸×8NÑ8NÑOôô —‘Ø_ôô   ¨5Ô1Ð1ð ,0�Ô(à�y‰yÐr?   Ú	all_plansc                 ó.   — t        || j                  «      S rD   )r	   r3   )r<   rR   s     r=   Ú_dedup_save_plansz$DefaultSavePlanner._dedup_save_plans‡   s   € Ü 	¨4×+IÑ+IÓJÐJr?   c                 ór  — | j                  |«      }t        |«      \  }}| j                  rA|D �cg c]  }|j                  ‘Œ }}t	        t        |Ž «      }t        j                  ||¬«      }t        ||«      }|r5dj                  |«      }	t        |	«      dkD  r|	d d dz   }	t        d|	› �«      ‚||fS c c}w )NrG   z; iô  z... (truncated)z Failed to validate global plan: )rT   r.   r   rH   Údictr   rK   rL   Ú_validate_global_planÚjoinÚlenÚ
ValueError)
r<   rR   Údeduped_plansÚglobal_planÚmetadataÚpÚplanner_data_dictÚmerged_mappingsÚvalidation_errorsÚerror_summarys
             r=   Ú_create_global_planz&DefaultSavePlanner._create_global_planŠ   sË   € ð ×.Ñ.¨yÓ9ˆä ?ÀÓ NÑˆ�Xà×"Ò"ð
 :EÖ E°A §£Ð EÐÐ EÜ"¤8Ð->Ð#?Ó@ˆOÜ"×*Ñ*¨8À/ÔRˆHä1°+¸xÓHÐÙØ ŸI™IÐ&7Ó8ˆMÜ�=Ó! CÒ'Ø -¨d¨sÐ 3Ð6GÑ G�ÜÐ?À¸ÐOÓPÐPà˜HÐ$Ð$ùò !Fs   °B4c                 ó  — g }| j                   t        j                  vrp| j                  |«      \  }}|t        j                  | j                   <   |t        j                  | j                   <   |t        j
                  | j                   <   |||fS t        |«      sVt        g d¬«      gt        |«      z  }t        j                  | j                      }t        j
                  | j                      }�nt        t        j                  | j                      |«      }|t        j                  | j                   <   | j                  |«      \  }}| j                   | j                  v rit        t        j                  | j                      |«      D ]?  \  }}t        ||«      r|j                  t        g d¬«      «       Œ/|j                  |«       ŒA |t        j                  | j                   <   |t        j
                  | j                   <   |||fS )zw
        Create global plan with caching.
        Returns a tuple of global_plan_delta, global_plan, metadata.
        FrI   )r:   r   Ú_cached_all_plansrc   Ú_cached_global_planÚ_cached_metadatar   r   rY   r#   Úzipr   Úappend)r<   rR   Úglobal_plan_deltar\   r]   Úmerged_plansÚcached_planÚnew_plans           r=   Ú _create_global_plan_with_cachingz3DefaultSavePlanner._create_global_plan_with_caching£   sÙ  € ð -/Ðà×!Ñ!¬×)FÑ)FÑFð %)×$<Ñ$<¸YÓ$GÑ!ˆK˜ð ENŒK×)Ñ)¨$×*@Ñ*@ÑAØFQŒK×+Ñ+¨D×,BÑ,BÑCØCKŒK×(Ñ(¨×)?Ñ)?Ñ@à ¨XÐ5Ð5ô % YÔ/ô "*¨"°UÔ!;Ð <¼sÀ9»~Ñ MÐÜ%×9Ñ9¸$×:PÑ:PÑQˆKÜ"×3Ñ3°D×4JÑ4JÑKŠHô 4Ü×-Ñ-¨d×.DÑ.DÑEÀyóˆLð EQŒK×)Ñ)¨$×*@Ñ*@ÑAØ$(×$<Ñ$<¸\Ó$JÑ!ˆK˜à×%Ñ%¨×)AÑ)AÑAÜ-0Ü×3Ñ3°D×4JÑ4JÑKÈ[ó.ò ;Ñ)�K ô +¨;¸ÔAØ)×0Ñ0´¸"ÀUÔ1KÕLà)×0Ñ0°Õ:ð;ð GRŒK×+Ñ+¨D×,BÑ,BÑCØCKŒK×(Ñ(¨×)?Ñ)?Ñ@à  +¨xÐ7Ð7r?   c                 ó®   — g }| j                   r| j                  |«      \  }}}n| j                  |«      \  }}|}|| _        || _        || j                  fS rD   )r;   rn   rc   r\   r]   )r<   rR   rj   r\   r]   s        r=   Úcreate_global_planz%DefaultSavePlanner.create_global_planß   sl   € ð -/ÐØ×$Ò$ð ×5Ñ5°iÓ@ñ	Ø!ØÙð %)×$<Ñ$<¸YÓ$GÑ!ˆK˜à +Ðà&ˆÔØ ˆŒà  $§-¡-Ð/Ð/r?   rm   c                 óž   — |}|j                   st        j                  | j                     }|S |}|t        j                  | j                  <   |S rD   )rJ   r   Ú_cached_final_save_planr:   ©r<   rm   Úfinished_plans      r=   Ú_finish_plan_with_cachingz,DefaultSavePlanner._finish_plan_with_cachingõ   sO   € Ø"*ˆà�ŠÜ'×?Ñ?À×@VÑ@VÑWˆMð Ðð %ˆMØJRŒK×/Ñ/°×0FÑ0FÑGØÐr?   c                 óÐ   — |}| j                   rF| j                  |«      }t        | d«      r)| j                  t        j
                  | j                  <   | `|| _        | j                  S )NrP   )r;   ru   ÚhasattrrP   r   rN   r:   rM   rs   s      r=   Úfinish_planzDefaultSavePlanner.finish_planÿ   se   € Ø"*ˆà×$Ò$Ø ×:Ñ:¸8ÓDˆMô �tÐ2Ô3à×,Ñ,ô ×-Ñ-¨d×.DÑ.DÑEð Ð,à!ˆŒ	Ø�y‰yÐr?   Ú
write_itemc                 ó\   — | j                  |j                  «      }| j                  ||«      S rD   )Úlookup_objectÚindexÚtransform_object)r<   ry   Úobjects      r=   Úresolve_datazDefaultSavePlanner.resolve_data  s+   € Ø×#Ñ# J×$4Ñ$4Ó5ˆØ×$Ñ$ Z°Ó8Ð8r?   r|   c                 ó.   — t        | j                  |«      S ©zSExtension from the planner interface to make it easy to extend the default planner.©r$   r@   ©r<   r|   s     r=   r{   z DefaultSavePlanner.lookup_object  ó   € ä% d§o¡o°uÓ=Ð=r?   r~   c                 ó˜   — |j                   t        j                  k(  r,t        j                  «       }t        j                  ||«       |}|S r�   )Útyper   ÚBYTE_IOÚioÚBytesIOÚtorchÚsave)r<   ry   r~   Úbytess       r=   r}   z#DefaultSavePlanner.transform_object  s7   € à�?‰?œm×3Ñ3Ò3Ü—J‘J“LˆEÜ�J‰J�v˜uÔ%ØˆFØˆr?   )TTNFF©NF)r9   Ú
__module__Ú__qualname__r
   Ú__annotations__Úboolr>   r   r   rE   r   rQ   ÚlistrT   Útupler   rc   rn   rp   ru   rx   r   rŠ   ÚTensorrˆ   r‰   r   r   r   r{   r}   © r?   r=   r)   r)   F   s¦  … ØÓð $(Ø(,Ø04Ø*/Ø$)ñ8à ð8ð "&ð8ð #'¨¡+ð	8ð
 $(ð8ð "ð8ð 
ó8ð0 ,0Ø$ñ	-à#ð-ð " DÑ(ð-ð ð	-ð
 
ó-ð 8ó ð8K¨4°©>ð K¸dÀ8¹nó Kð%Ø˜h™ð%à	ˆt�H‰~˜xÐ'Ñ	(ó%ð2:8Ø˜h™ð:8à	ˆt�H‰~˜t H™~¨xÐ7Ñ	8ó:8ðx0Ø˜h™ð0à	ˆt�H‰~˜xÐ'Ñ	(ó0ð,°(ð ¸xó ð Hð °ó ð&9 yð 9°U·\±\ÀBÇJÁJÑ5Nó 9ð> =ð >°Só >ð¨9ð ¸cô r?   r)   c            	       óF  — e Zd ZU dZeed<   eed<   	 	 	 ddedededdfd	„Z	 	 dd
ede	dz  deddfd„Z
defd„Zdee   dee   fd„Zdedefd„Zdedej$                  ddfd„Zdefd„Zdedej,                  ddfd„Zdedej,                  fd„Zdedej,                  fd„Zy)r*   ak  
    DefaultLoadPlanner that adds multiple features on top of LoadPlanner.

    In particular it adds the following:

    flatten_state_dict: Handle state_dict with nested dicts
    flatten_sharded_tensors: For FSDP in 2D parallel mode
    allow_partial_load: If False, will raise a runtime error if a key is present in state_dict, but not in the checkpoint.
    Úoriginal_state_dictr0   r   r1   Úallow_partial_loadr5   Nc                 óJ   — || _         || _        i | _        i | _        || _        y rD   )r   r1   r—   r0   r˜   )r<   r   r1   r˜   s       r=   r>   zDefaultLoadPlanner.__init__1  s+   € ð #5ˆÔØ'>ˆÔ$Ø#%ˆÔ ØˆŒØ"4ˆÕr?   r@   r]   rB   c                 ó¾   — t        |«       || _        | j                  rt        |«      }| j                  rt	        |«      \  }| _        || _        || _        || _        y rD   )	r"   r—   r1   r   r   r0   r@   r]   rB   )r<   r@   r]   rB   s       r=   rE   z!DefaultLoadPlanner.set_up_planner=  sW   € ô 	˜Ô$Ø#-ˆÔ à×'Ò'Ü1°*Ó=ˆJà×"Ò"Ü(:¸:Ó(FÑ%ˆJ˜œà$ˆŒØ ˆŒØ,ˆÕr?   c                 ó  — | j                   €t        d«      ‚| j                  r²t        | j                  j                  «       «      }t        | j                   j                  j                  «       «      }||z
  }|r[dt        _        t        | j                  «      \  }}t        |j                  «       «      }||z  r||c| _        | _
        d t        _        t        | j                  | j                   | j                   «      S )Nzself.metadata is not NoneÚ2_3)r]   ÚAssertionErrorr   Úsetr@   ÚkeysÚstate_dict_metadatar'   Ú_derived_versionr—   r0   r+   r˜   )r<   Úcurrent_keysÚ	load_keysÚmissing_keysÚold_state_dictÚold_mappingsÚold_keyss          r=   rQ   z$DefaultLoadPlanner.create_local_planP  sà   € Ø�=‰=Ð Ü Ð!<Ó=Ð=Ø×"Ò"ô$ ˜tŸ™×3Ñ3Ó5Ó6ˆLÜ˜DŸM™M×=Ñ=×BÑBÓDÓEˆIØ$ |Ñ3ˆLÙØ,1”Ô)Ü/AØ×,Ñ,ó0Ñ,� ô ˜~×2Ñ2Ó4Ó5�Ø˜lÒ*Ø5CÀ\Ð2�D”O T¤]ð -1”Ô)ä-Ø�O‰O˜TŸ]™]°×0GÑ0GÐ,Gó
ð 	
r?   r\   c                 ó   — t        |«      S rD   )r,   )r<   r\   s     r=   rp   z%DefaultLoadPlanner.create_global_planx  s   € Ü.¨{Ó;Ð;r?   rm   c                 ó   — |S rD   r•   )r<   rm   s     r=   rx   zDefaultLoadPlanner.finish_plan{  s   € Øˆr?   Ú	read_itemÚvaluec                 ó(  — | j                   rNt        | j                  | j                  |j                  j
                     t        j                  |d¬«      «       y t        j                  |d¬«      | j                  |j                  j
                  <   y )NF)Úweights_only)	r   r   r—   r0   Ú
dest_indexÚfqnrŠ   Úloadr@   )r<   rª   r«   s      r=   Ú
load_byteszDefaultLoadPlanner.load_bytes~  sl   € Ø×"Ò"ÜØ×(Ñ(Ø—‘˜i×2Ñ2×6Ñ6Ñ7Ü—
‘
˜5¨uÔ5õô 9>¿
¹
Ø Eô9ˆD�O‰O˜I×0Ñ0×4Ñ4Ò5r?   c                 ó\   — | j                  |j                  «      }| j                  ||«      S rD   )Úlookup_tensorr®   Útransform_tensor©r<   rª   Útensors      r=   Úresolve_tensorz!DefaultLoadPlanner.resolve_tensorŠ  s+   € Ø×#Ñ# I×$8Ñ$8Ó9ˆØ×$Ñ$ Y°Ó7Ð7r?   r¶   c                  ó   — y rD   r•   rµ   s      r=   Úcommit_tensorz DefaultLoadPlanner.commit_tensorŽ  s   € Ør?   r|   c                 ó.   — t        | j                  |«      S r�   r‚   rƒ   s     r=   r³   z DefaultLoadPlanner.lookup_tensor‘  r„   r?   c                 óD   — t        ||j                  |j                  «      S r�   )r   Údest_offsetsÚlengthsrµ   s      r=   r´   z#DefaultLoadPlanner.transform_tensor•  s   € ä% f¨i×.DÑ.DÀi×FWÑFWÓXÐXr?   )TTFr�   )r9   rŽ   r�   Ú__doc__r   r�   r
   r‘   r>   r   rE   r   rQ   r’   rp   rx   r   rˆ   r‰   r±   r·   rŠ   r”   r¹   r   r³   r´   r•   r?   r=   r*   r*   #  s6  … ñð )Ó(ØÓð $(Ø(,Ø#(ñ	
5à ð
5ð "&ð
5ð !ð	
5ð
 
ó
5ð %)Ø$ñ	-à#ð-ð ˜T‘/ð-ð ð	-ð
 
ó-ð&&
 8ó &
ðP<¨d°8©nð <ÀÀhÁó <ð Hð °ó ð
 Hð 
°R·Z±Zð 
ÀDó 
ð8¨ó 8ð xð ¸¿¹ð È$ó ð> =ð >°U·\±\ó >ðY¨(ð Y¸E¿L¹Lô Yr?   r*   c            	       ó`   ‡ — e Zd ZdZdˆ fd„	Zdededefd„Z	 	 dde	dedz  d	eddfˆ fd
„Z
ˆ xZS )Ú_EmptyStateDictLoadPlanneraí  
    Extension of DefaultLoadPlanner, which rebuilds state_dict from the saved metadata.
    Useful for loading in state_dict without first initializing a model, such as
    when converting a DCP checkpoint into a Torch save file.

    . N.B. `state_dict` must be an empty dictionary when used with this LoadPlanner

    .. warning::
        Because the entire state dict is initialized, It's recommended to only utilize
        this LoadPlanner on a single rank or process to avoid OOM.

    Nc                 ó2   •— || _         t        ‰| �  |i |¤Ž y rD   )rŸ   Úsuperr>   )r<   rŸ   ÚargsÚkwargsr8   s       €r=   r>   z#_EmptyStateDictLoadPlanner.__init__¨  s   ø€ ØˆŒ	Ü‰Ñ˜$Ð) &Ó)r?   Úkeyr]   r5   c           	      ó4  ‡ — ‰ j                   €y|‰ j                   v ryg }|j                  j                  |«      }|D ]D  }|r/|j                  dj	                  |d   t        |«      g«      «       Œ4|j                  |«       ŒF t        ˆ fd„|D «       «      ryy)NTú.éÿÿÿÿc              3   ó:   •K  — | ]  }|‰j                   v –— Œ y ­wrD   )rŸ   )Ú.0Úunflattened_keyr<   s     €r=   ú	<genexpr>zA_EmptyStateDictLoadPlanner._should_include_key.<locals>.<genexpr>¾  s   øè ø€ ÒT°ˆ $§)¡)Ô+ÑTùs   ƒF)rŸ   rH   Úgetri   rX   ÚstrÚany)r<   rÅ   r]   Úunflattened_keysrH   rË   s   `     r=   Ú_should_include_keyz._EmptyStateDictLoadPlanner._should_include_key¬  sž   ø€ Ø�9‰9ÐØà�$—)‘)ÑØà&(ÐØ×,Ñ,×0Ñ0°Ó5ˆØ+ò 	9ˆOÙØ ×'Ñ'Ø—H‘HÐ.¨rÑ2´C¸Ó4HÐIÓJõð
 !×'Ñ'¨Õ8ð	9ô ÓTÐCSÔTÔTØàr?   r@   rB   c                 óÄ  •— |rt        d«      ‚|€t        d«      ‚|j                  j                  «       D ]—  \  }}| j                  ||«      sŒt	        |t
        «      r5t        j                  |j                  |j                  j                  ¬«      }|j                  �)||j                  v rt        ||j                  |   |«       Œ“|||<   Œ™ t        ‰| �9  |||«       y )Nznot state_dictzmetadata is not None)Údtype)r�   r    ÚitemsrÑ   Ú
isinstancer   rŠ   ÚemptyÚsizeÚ
propertiesrÓ   rH   r   rÂ   rE   )r<   r@   r]   rB   ÚkÚvr8   s         €r=   rE   z)_EmptyStateDictLoadPlanner.set_up_plannerÃ  sÒ   ø€ ñ Ü Ð!1Ó2Ð2ØÐÜ Ð!7Ó8Ð8ð ×0Ñ0×6Ñ6Ó8ò 		"‰DˆAˆqØ×+Ñ+¨A¨xÔ8Øä˜!Ô2Ô3Ü—K‘K §¡¨a¯l©l×.@Ñ.@ÔA�Ø×$Ñ$Ð0°Q¸(×:OÑ:OÑ5OÜ˜J¨×(=Ñ(=¸aÑ(@À!ÕDà !�
˜1’ð		"ô 	‰Ñ˜z¨8°^ÕDr?   rD   r�   )r9   rŽ   r�   r¾   r>   rÎ   r   r‘   rÑ   r   rE   Ú__classcell__)r8   s   @r=   rÀ   rÀ   š  si   ø„ ñõ*ð sð °hð À4ó ð4 %)Ø$ñ	Eà#ðEð ˜T‘/ðEð ð	Eð
 
÷Eñ Er?   rÀ   r@   r]   Ústrictr5   c           	      ó  — g }	 | j                  «       D ]æ  \  }}||j                  vr|rt        d|› d�«      ‚Œ&|j                  |   }t        |t        «      rVt        |dd «      �I|j                  |j                  «       k7  r,t        d|j                  › d|j                  «       › d|› �«      ‚t        |t        «      r,|j                  j                  «       €ŒÆ|t        |||«      z  }Œ×|t        |||«      z  }Œè t        |«      S )Nz&Missing key in checkpoint state_dict: rÇ   r×   zSize mismatch between saved z and current: z for )rÔ   r    ÚRuntimeErrorrÕ   r   Úgetattrr×   rZ   r%   Údevice_meshÚget_coordinater    r   )r@   r]   rÜ   Úrequestsr¯   ÚobjÚmds          r=   r+   r+   Ý  s  € ð €Hðð ×$Ñ$Ó&ò 9‰ˆˆSà�h×2Ñ2Ñ2ÙÜ"Ð%KÈCÈ5ÐPQÐ#RÓSÐSàà×)Ñ)¨#Ñ.ˆä�rÔ0Ô1Ü˜˜V TÓ*Ð6Ø—‘˜3Ÿ8™8›:Ò%äØ.¨r¯w©w¨i°~ÀcÇhÁhÃjÀ\ÐQVÐWZÐV[Ð\óð ô
 �cœ7Ô#Ø�‰×-Ñ-Ó/Ñ;ØÔ.¨s°B¸Ó<Ñ<‘àÔ*¨3°°CÓ8Ñ8‰Hð/9ô2 �HÓÐr?   rR   c                 ó   — | S )z¼
    Create global load plan used by DefaultLoadPlanner.

    The default load behavior involved no global coordination and this function
    currently doesn't change the local plans.
    r•   )rR   s    r=   r,   r,     s
   € ð Ðr?   rB   c                 óà   — g }| j                  «       D ]O  \  }}t        |t        «      r+|j                  j	                  «       €Œ1|t        ||«      z  }ŒA|t        ||«      z  }ŒQ t        |«      S )a  
    Create the ``SavePlan`` used by DefaultSavePlanner.

    On non-coordinator ranks, this function ignores tensors and non-tensor objects,
    only producing writes for ShardedTensor objects.

    On the coordinator rank, produce writes for all values.
    )rÔ   rÕ   r%   rà   rá   r!   r   )r@   rB   râ   r¯   rã   s        r=   r-   r-     sw   € ð €HØ×$Ñ$Ó&ò 
6‰ˆˆSô �cœ7Ô#Ø�‰×-Ñ-Ó/Ñ;ØÔ/°°SÓ9Ñ9‘ð
 Ô+¨C°Ó5Ñ5‰Hð
6ô �HÓÐr?   Úrewrite_index_hintsc                 óZ  — i }g }| D �]  }g }|j                   D �]Ú  }|j                  t        j                  k7  r#|j                  j
                  |v rt        d«      ‚|j                  t        j                  k(  r3t        «       ||j                  j
                  <   |j                  |«       Œ”|j                  €t        d«      ‚t        t        |j                  |j                  j
                  t        |j                  j                  |j                  j                  g ¬«      «      «      }|}|rKt!        j"                  |j                  t%        |j&                  «      ¬«      }	t!        j"                  ||	¬«      }|j                  |«       |j                  j(                  €#t        d|j                  j
                  › d�«      ‚|j&                  j                  |j                  j(                  «       �ŒÝ |j                  t!        j"                  ||¬«      «       �Œ |t+        |«      fS )a6  
    Create the global plan and metadata used by DefaultSavePlanner.

    Metadata is produced by concatenating the metadata of all ``WriteItem`` from the supplied plans.

    The only global planning change is to update index hints in all ``MetadataIndex`` objects if
    ``rewrite_index_hints`` is True.
    zitem.index.fqn not in mdzitem.tensor_data is not None)rØ   r×   Úchunks)r|   zZ
                    Cannot create MD for tensor without bounds.
                    FQN: z
                )rÔ   )rÔ   r†   r   ÚSHARDr|   r¯   r�   r‡   r   ri   Útensor_datar   r   Ú
setdefaultrØ   r×   rK   rL   rY   ré   Úchunkr   )
rR   rç   rä   Ú	new_plansrM   Ú	new_itemsÚitemÚ	tensor_mdÚnew_itemÚ	new_indexs
             r=   r.   r.   .  sá  € ð $&€BØ€IØó &EˆØˆ	Ø—J‘Jó #	@ˆDØ�y‰yœM×/Ñ/Ò/Ø—:‘:—>‘> RÑ'Ü(Ð)CÓDÐDà�y‰yœM×1Ñ1Ò1Ü%9Ó%;��4—:‘:—>‘>Ñ"Ø× Ñ  Õ&à×#Ñ#Ð+Ü(Ð)GÓHÐHÜ Ü)Ø—M‘MØŸ
™
Ÿ™Ü-Ø'+×'7Ñ'7×'BÑ'BØ!%×!1Ñ!1×!6Ñ!6Ø#%ôóó
�	ð  �Ù&Ü +× 3Ñ 3ØŸ
™
¬#¨i×.>Ñ.>Ó*?ô!�Iô  +×2Ñ2°4¸yÔI�HØ× Ñ  Ô*à×#Ñ#×)Ñ)Ð1Ü(ð .àŸ*™*Ÿ.™.Ð)ð *ð*ó ð ð × Ñ ×'Ñ'¨×(8Ñ(8×(>Ñ(>Ö?ðG#	@ðH 	×Ñœ×,Ñ,¨T¸ÔCÖDðM&EðN ”x “|Ð$Ð$r?   c                 ó:   — t        | «      }t        |g«      \  }}|S )zTReturn the ``Metadata`` if DefaultSavePlanner was used to checkpoint ``state_dict``.)r   r.   )r@   rM   Ú_rä   s       r=   Ú_create_default_local_metadatarö   f  s!   € ä-¨jÓ9€DÜ+¨T¨FÓ3�E€A€rØ€Ir?   Úbox0Úbox1c                 ó  — t        | j                  «      }t        |«      D ]d  }| j                  |   |j                  |   |j                  |   z   k\  r y|j                  |   | j                  |   | j                  |   z   k\  sŒd y y)z9Check if two boxes overlap. Tuples are (offset, lengths).FT)rY   ÚoffsetsÚrangeÚsizes)r÷   rø   ÚndimsÚis       r=   Ú_check_box_overlaprÿ   m  sz   € ô �—‘Ó€EÜ�5‹\ò ˆØ�<‰<˜‰?˜dŸl™l¨1™o°·
±
¸1±Ñ=Ò=ÙØ�<‰<˜‰?˜dŸl™l¨1™o°·
±
¸1±Ñ=Ó=Ùð	ð r?   Úouter_box_sizeÚ	inner_boxc                 óÔ   — t        t        | «      «      D ]Q  }|j                  |   dk  r y|j                  |   dk  r y|j                  |   |j                  |   z   | |   kD  sŒQ y y)Nr   FT)rû   rY   rú   rü   )r   r  rþ   s      r=   Ú_check_box_boundsr  }  su   € ô ”3�~Ó&Ó'ò ˆØ×Ñ˜QÑ !Ò#ÙØ�?‰?˜1Ñ Ò!ÙØ×Ñ˜QÑ )§/¡/°!Ñ"4Ñ4°~ÀaÑ7HÓHÙðð r?   r\   c           	      óª  ‡‡‡‡— g }|j                   j                  «       D �].  \  }Št        ‰t        «      rŒt	        ‰j
                  «      dk(  rŒ1‰j                  Šd}‰D ]u  }t        ‰j
                  |«      s;d|› d‰j
                  › d|› �}t        j                  |«       |j                  |«       |t        j                  |j                  «      z  }Œw t	        ‰«      dkD  �r t	        ‰j
                  «      Št        t        ‰«      dˆfd„¬«      Št!        t        t	        ‰«      «      ˆˆˆfd„¬	«      }g }|D ]¦  }	‰|	   }
|
j"                  ‰   }||
j                  ‰   z   }t%        ||t&        j(                  f«      }|r|d
|…= |D ]H  \  }}‰|   }t+        |
|«      sŒd|› d|
› d|› �}t        j                  |«       |j                  |«       ŒJ t-        |||	f«       Œ¨ t        j                  ‰j
                  «      }t	        | «      dkD  s�Œ÷||k7  s�Œþd|› d|› d|› �}t        j                  |«       |j                  |«       �Œ1 |S )zNValidate the global plan and return a list of error messages (empty if valid).r   zkey:z& has out of bounds chunk: tensor-size:z chunk: r&   c                 ó"   •— ‰j                   |    S rD   )r×   )Údr«   s    €r=   ú<lambda>z'_validate_global_plan.<locals>.<lambda>¢  s   ø€ À%Ç*Á*ÈQÁ-€ r?   )ÚdefaultrÅ   c                 óX   •‡ — ‰‰    j                   ‰   gˆˆ fd„t        ‰«      D «       ¢­S )Nc              3   óB   •K  — | ]  }‰‰   j                   |   –— Œ y ­wrD   )rú   )rÊ   r  ré   Úidxs     €€r=   rÌ   z:_validate_global_plan.<locals>.<lambda>.<locals>.<genexpr>§  s    øè ø€ ÒB°�f˜S‘k×)Ñ)¨!Õ,ÑBùs   ƒ)rú   rû   )r  ré   ÚdimsÚ	sweep_dims   `€€€r=   r  z'_validate_global_plan.<locals>.<lambda>¥  s-   ù€ Ø˜3‘K×'Ñ'¨	Ñ2ð!äB´e¸D³kÔBñ!€ r?   )rÅ   Nz has overlapping chunks: ú z invalid fill tensor-volume: z chunks-volume: )r    rÔ   rÕ   r   rY   r×   ré   r  r(   r7   ri   ÚmathÚprodrü   Úmaxrû   Úsortedrú   r   ÚsysÚmaxsizerÿ   r   )r\   r]   ÚerrorsrÅ   Úchunks_volumerí   ÚmsgÚsorted_indicesÚactiver  ÚcurrentÚstartÚendÚcutoffrõ   Ú	other_idxÚotherÚtensor_volumeré   r  r  r«   s                     @@@@r=   rW   rW   ‹  sK  û€ à€FØ×2Ñ2×8Ñ8Ó:ó 7‰
ˆˆUÜ�eÔ1Ô2ØÜˆu�z‰z‹?˜aÒØØ—‘ˆØˆØò 		4ˆEä$ U§Z¡Z°Ô7à˜3˜%ð  #Ø#(§:¡: ,¨h°u°gð?ð ô —‘˜sÔ#Ø—‘˜cÔ"ØœTŸY™Y u§{¡{Ó3Ñ3‰Mð		4ô ˆv‹;˜‹?Ü�u—z‘z“?ˆDÜœE $›K°Ó8OÔPˆIÜ#Ü”c˜&“kÓ"õôˆNð -/ˆFØ%ò +�Ø  ™+�ØŸ™¨	Ñ2�Ø˜gŸm™m¨IÑ6Ñ6�ä% f¨u´c·k±kÐ.BÓC�ÙØ˜w ˜w˜à$*ò +‘L�A�yØ" 9Ñ-�EÜ)¨'°5Õ9Ø $ S EÐ)BÀ7À)È1ÈUÈGÐT˜ÜŸ™ sÔ+ØŸ™ cÕ*ð+ô �v  S˜zÕ*ð!+ô& Ÿ	™	 %§*¡*Ó-ˆÜˆ{Ó˜aÔ M°]Ô$Bà�s�eÐ8Ø �/Ð!1°-°ðBð ô �N‰N˜3ÔØ�M‰M˜#Öðo7ðr €Mr?   )T)OrK   rˆ   Úloggingr  r  Úbisectr   r   Úcollectionsr   Útypingr   r   rŠ   Útorch.distributed._shard._utilsr   Ú.torch.distributed.checkpoint._dedup_save_plansr	   Ú)torch.distributed.checkpoint._nested_dictr
   r   Ú2torch.distributed.checkpoint._sharded_tensor_utilsr   Ú&torch.distributed.checkpoint._traverser   Ú%torch.distributed.checkpoint.metadatar   r   r   r   r   r   r   r   Ú$torch.distributed.checkpoint.plannerr   r   r   r   r   r   r   Ú,torch.distributed.checkpoint.planner_helpersr   r   r   r    r!   r"   r#   Ú"torch.distributed.checkpoint.utilsr$   Útorch.distributed.tensorr%   Ú r'   Ú	getLoggerr9   r(   ÚLoggerr�   Ú__all__r)   r*   rÀ   rV   rÎ   r‘   r+   r’   r,   r-   r“   r.   rö   rÿ   ÚSizer  rW   r•   r?   r=   ú<module>r4     sç  ðô Û 	Û Û Û 
ß 'Ý  ß ã Ý BÝ K÷õ XÝ >÷	÷ 	ó 	÷÷ ñ ÷÷ ñ õ FÝ ,å ð +˜×*Ñ*¨8Ó4€ˆ�‰Ó 4ò€ôZ˜ô ZôztY˜ô tYôn@EÐ!3ô @EðH DHñ'Ø�S˜#�X‘ð'Ø*2ð'Ø<@ð'àó'ðT	Ø�H‰~ð	à	ˆ(�^ó	ðØ�S˜#�X‘ðØ04ðàóð: !%ñ5%Ø�H‰~ð5%àð5%ð ˆ4�‰>˜8Ð#Ñ$ó5%ðp¨ð À8ó ðÐ1ð Ð9Mð ÐRVó ð Ø—J‘JðØ+?ðà	óð< t¨H¡~ð <Àð <ÈdÐSVÉiô <r?   