Ë
    g^(hÿ`  ã            	       ó¶  — 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 d dlmZ d dl	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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/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eCfd,„ZNy).é    N)ÚChainMap)Úreduce)ÚAnyÚcastÚOptionalÚUnion)Ú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Ú"_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                   óv  — e Zd ZU eed<   	 	 	 	 	 ddededee   dededdfd	„Z	 	 dd
edee	   deddfd„Z
d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ej0                  ej4                  f   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         új/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/distributed/checkpoint/default_planner.pyÚ__init__zDefaultSavePlanner.__init__H   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                  r‚| j                  t        j                  v rIt        |t        j                  | j                     «      r"t        j                  d«       t        g d¬«      S |t        j                  | j                  <   | 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   )r<   rM   s     r=   Úcreate_local_planz$DefaultSavePlanner.create_local_planj   s»   € Ü-¨d¯o©o¸t×?RÑ?RÓSˆØ×"Ò"Ü×&Ñ& t¸$¿-¹-ÔHˆDØˆŒ	à×$Ò$ð ×&Ñ&¬+×*GÑ*GÑGÜ'Øœ+×7Ñ7¸×8NÑ8NÑOôô —‘Ø_ôô   ¨5Ô1Ð1àHL”×-Ñ-¨d×.DÑ.DÑEà�y‰yÐr?   Ú	all_plansc                 ó$  — t        || j                  «      }t        |«      \  }}| j                  rA|D �cg c]  }|j                  ‘Œ }}t        t        |Ž «      }t        j                  ||¬«      }t        ||«      st        d«      ‚||fS c c}w )NrG   zFailed to validate global plan)r
   r3   r.   r   rH   Údictr   rK   rL   Ú_validate_global_planÚ
ValueError)r<   rQ   Úglobal_planÚmetadataÚpÚplanner_data_dictÚmerged_mappingss          r=   Ú_create_global_planz&DefaultSavePlanner._create_global_plan�   s’   € ô % Y°×0NÑ0NÓOˆ	ä ?À	Ó JÑˆ�Xà×"Ò"ð
 :EÖ E°A §£Ð EÐÐ EÜ"¤8Ð->Ð#?Ó@ˆOÜ"×*Ñ*¨8À/ÔRˆHä$ [°(Ô;ÜÐ=Ó>Ð>à˜HÐ$Ð$ùò !Fs   µBc                 ó&  — g }| j                   t        j                  vrft        j                  |«      t        j                  | j                   <   | j                  |«      \  }}|t        j                  | j                   <   |||fS t        t        j                  | j                      |«      }t        j                  |«      t        j                  | j                   <   | j                  |«      \  }}| j                   | j                  v rit        t        j                  | j                      |«      D ]?  \  }}t        ||«      r|j                  t        g d¬«      «       Œ/|j                  |«       ŒA |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_plansÚcopyÚdeepcopyr[   Ú_cached_global_planr#   Úzipr   Úappendr   )r<   rQ   Úglobal_plan_deltarV   rW   Úmerged_plansÚcached_planÚnew_plans           r=   Ú _create_global_plan_with_cachingz3DefaultSavePlanner._create_global_plan_with_caching–   sv  € ð -/Ðà×!Ñ!¬×)FÑ)FÑFäDHÇMÁMØóEŒK×)Ñ)¨$×*@Ñ*@ÑAð %)×$<Ñ$<¸YÓ$GÑ!ˆK˜ØFQŒK×+Ñ+¨D×,BÑ,BÑCà ¨XÐ5Ð5ô 0Ü×)Ñ)¨$×*@Ñ*@ÑAÀ9ó
ˆô AEÇÁØóA
Œ×%Ñ% d×&<Ñ&<Ñ=ð !%× 8Ñ 8¸Ó FÑˆ�Xà×!Ñ! T×%=Ñ%=Ñ=Ü),Ü×/Ñ/°×0FÑ0FÑGÈó*ò 7Ñ%�˜Xô ' {°HÔ=Ø%×,Ñ,¬X°bÀÔ-GÕHà%×,Ñ,¨XÕ6ð7ð CNŒ×'Ñ'¨×(>Ñ(>Ñ?ð ! +¨xÐ7Ð7r?   c                 ó®   — g }| j                   r| j                  |«      \  }}}n| j                  |«      \  }}|}|| _        || _        || j                  fS rD   )r;   rg   r[   rV   rW   )r<   rQ   rc   rV   rW   s        r=   Úcreate_global_planz%DefaultSavePlanner.create_global_planÄ   sl   € ð -/ÐØ×$Ò$ð ×5Ñ5°iÓ@ñ	Ø!ØÙð %)×$<Ñ$<¸YÓ$GÑ!ˆK˜à +Ðà&ˆÔØ ˆŒà  $§-¡-Ð/Ð/r?   rf   c                 óž   — |}|j                   st        j                  | j                     }|S |}|t        j                  | j                  <   |S rD   )rJ   r   Ú_cached_final_save_planr:   ©r<   rf   Ú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                 óf   — |}| j                   r| j                  |«      }|| _        | j                  S rD   )r;   rn   rM   rl   s      r=   Úfinish_planzDefaultSavePlanner.finish_planä   s1   € Ø"*ˆà×$Ò$Ø ×:Ñ:¸8ÓDˆMà!ˆŒ	Ø�y‰yÐr?   Ú
write_itemc                 ó\   — | j                  |j                  «      }| j                  ||«      S rD   )Úlookup_objectÚindexÚtransform_object)r<   rq   Úobjects      r=   Úresolve_datazDefaultSavePlanner.resolve_dataí   s+   € Ø×#Ñ# J×$4Ñ$4Ó5ˆØ×$Ñ$ Z°Ó8Ð8r?   rt   c                 ó.   — t        | j                  |«      S ©zSExtension from the planner interface to make it easy to extend the default planner.©r$   r@   ©r<   rt   s     r=   rs   z DefaultSavePlanner.lookup_objectñ   ó   € ä% d§o¡o°uÓ=Ð=r?   rv   c                 ó˜   — |j                   t        j                  k(  r,t        j                  «       }t        j                  ||«       |}|S ry   )Útyper   ÚBYTE_IOÚioÚBytesIOÚtorchÚsave)r<   rq   rv   Úbytess       r=   ru   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   r   rE   r   rP   ÚlistÚtupler   r[   rg   ri   rn   rp   r   r   r‚   ÚTensorr€   r�   rw   r   r   rs   ru   © r?   r=   r)   r)   E   s�  … ØÓð $(Ø(,Ø37Ø*/Ø$)ñ8à ð8ð "&ð8ð #+¨4¡.ð	8ð
 $(ð8ð "ð8ð 
ó8ð0 /3Ø$ñ	-à#ð-ð ˜{Ñ+ð-ð ð	-ð
 
ó-ð 8ó ð.%Ø˜h™ð%à	ˆt�H‰~˜xÐ'Ñ	(ó%ð*,8Ø˜h™ð,8à	ˆt�H‰~˜t H™~¨xÐ7Ñ	8ó,8ð\0Ø˜h™ð0à	ˆt�H‰~˜xÐ'Ñ	(ó0ð,°(ð ¸xó ð Hð °ó ð9 yð 9°U¸5¿<¹<ÈÏÉÐ;SÑ5Tó 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	e
   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__  s+   € ð #5ˆÔØ'>ˆÔ$Ø#%ˆÔ ØˆŒØ"4ˆÕr?   r@   rW   rB   c                 ó¾   — t        |«       || _        | j                  rt        |«      }| j                  rt	        |«      \  }| _        || _        || _        || _        y rD   )	r"   r�   r1   r   r   r0   r@   rW   rB   )r<   r@   rW   rB   s       r=   rE   z!DefaultLoadPlanner.set_up_planner  sW   € ô 	˜Ô$Ø#-ˆÔ à×'Ò'Ü1°*Ó=ˆJà×"Ò"Ü(:¸:Ó(FÑ%ˆJ˜œà$ˆŒØ ˆŒØ,ˆÕr?   c                 óò  — | j                   €J ‚| 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 )NÚ2_3)rW   r   Ú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=   rP   z$DefaultLoadPlanner.create_local_plan+  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?   rV   c                 ó   — t        |«      S rD   )r,   )r<   rV   s     r=   ri   z%DefaultLoadPlanner.create_global_planR  s   € Ü.¨{Ó;Ð;r?   rf   c                 ó   — |S rD   r�   )r<   rf   s     r=   rp   zDefaultLoadPlanner.finish_planU  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_bytesX  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_tensord  s+   € Ø×#Ñ# I×$8Ñ$8Ó9ˆØ×$Ñ$ Y°Ó7Ð7r?   r­   c                  ó   — y rD   r�   r¬   s      r=   Úcommit_tensorz DefaultLoadPlanner.commit_tensorh  s   € Ør?   rt   c                 ó.   — t        | j                  |«      S ry   rz   r{   s     r=   rª   z DefaultLoadPlanner.lookup_tensork  r|   r?   c                 óD   — t        ||j                  |j                  «      S ry   )r	   Údest_offsetsÚlengthsr¬   s      r=   r«   z#DefaultLoadPlanner.transform_tensoro  s   € ä% f¨i×.DÑ.DÀi×FWÑFWÓXÐXr?   )TTFr…   )r9   r†   r‡   Ú__doc__r   rˆ   r   r‰   r>   r   r   rE   r   rP   rŠ   ri   rp   r   r€   r�   r¨   r®   r‚   rŒ   r°   r   rª   r«   r�   r?   r=   r*   r*   þ   s7  … ñð )Ó(ØÓð $(Ø(,Ø#(ñ	
5à ð
5ð "&ð
5ð !ð	
5ð
 
ó
5ð (,Ø$ñ	-à#ð-ð ˜8Ñ$ð-ð ð	-ð
 
ó-ð&%
 8ó %
ðN<¨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
e   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?   ÚkeyrW   r5   c           	      ó4  ‡ — ‰ j                   €y|‰ j                   v r	 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   Úgetrb   ÚjoinÚstrÚany)r<   r¼   rW   Ú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J ‚|€J ‚|j                   j                  «       D ]‹  \  }}| j                  ||«      sŒt        |t        «      r5t        j                  |j                  |j                  j                  ¬«      }||j                  v rt        ||j                  |   |«       Œ‡|||<   Œ� t        ‰| �5  |||«       y )N)Údtype)r—   ÚitemsrÉ   Ú
isinstancer   r‚   ÚemptyÚsizeÚ
propertiesrË   rH   r   r¹   rE   )r<   r@   rW   rB   ÚkÚvr8   s         €r=   rE   z)_EmptyStateDictLoadPlanner.set_up_planner�  sº   ø€ ñ Ðˆ~ØÐ#Ð#Ð#ð ×0Ñ0×6Ñ6Ó8ò 		"‰DˆAˆqØ×+Ñ+¨A¨xÔ8Øä˜!Ô2Ô3Ü—K‘K §¡¨a¯l©l×.@Ñ.@ÔA�Ø�H×)Ñ)Ñ)Ü˜J¨×(=Ñ(=¸aÑ(@À!ÕDà !�
˜1’ð		"ô 	‰Ñ˜z¨8°^ÕDr?   rD   r…   )r9   r†   r‡   rµ   r>   rÆ   r   r‰   rÉ   r   r   rE   Ú__classcell__)r8   s   @r=   r·   r·   t  sj   ø„ ñõ*ð sð °hð À4ó ð4 (,Ø$ñ	Eà#ðEð ˜8Ñ$ðEð ð	Eð
 
÷Eñ Er?   r·   r@   rW   Ú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Ï   rU   r%   Údevice_meshÚget_coordinater    r   )r@   rW   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?   rQ   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�   )rQ   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                 ó.  — i }g }| D �]ÿ  }g }|j                   D �]Ä  }|j                  t        j                  k(  s|j                  j
                  |vsJ ‚|j                  t        j                  k(  r3t        «       ||j                  j
                  <   |j                  |«       Œ‹|j                  €J ‚t        t        |j                  |j                  j
                  t        |j                  j                  |j                  j                  g ¬«      «      «      }|}|rKt        j                   |j                  t#        |j$                  «      ¬«      }	t        j                   ||	¬«      }|j                  |«       |j                  j&                  €J 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.
    )rÐ   rÏ   Úchunks)rt   zZ
                    Cannot create MD for tensor without bounds.
                    FQN: z
                )rÌ   )rÌ   r~   r   ÚSHARDrt   r¦   r   r   rb   Útensor_datar   r   Ú
setdefaultrÐ   rÏ   rK   rL   Úlenrá   Úchunkr   )
rQ   rß   rÜ   Ú	new_plansrM   Ú	new_itemsÚitemÚ	tensor_mdÚnew_itemÚ	new_indexs
             r=   r.   r.     sÖ  € ð $&€BØ€IØó #EˆØˆ	Ø—J‘Jó  	@ˆDØ—9‘9¤× 3Ñ 3Ò3Ø—z‘z—~‘~¨RÑ/Ð/Ð/à�y‰yœM×1Ñ1Ò1Ü%9Ó%;��4—:‘:—>‘>Ñ"Ø× Ñ  Õ&à×'Ñ'Ð3Ð3Ð3Ü Ü)Ø—M‘MØŸ
™
Ÿ™Ü-Ø'+×'7Ñ'7×'BÑ'BØ!%×!1Ñ!1×!6Ñ!6Ø#%ôóó
�	ð  �Ù&Ü +× 3Ñ 3ØŸ
™
¬#¨i×.>Ñ.>Ó*?ô!�Iô  +×2Ñ2°4¸yÔI�HØ× Ñ  Ô*à×'Ñ'×-Ñ-Ð9ð ð @àŸ*™*Ÿ.™.Ð)ð *ð<ó Ð9ð × Ñ ×'Ñ'¨×(8Ñ(8×(>Ñ(>Ö?ðA 	@ðB 	×Ñœ×,Ñ,¨T¸ÔCÖDðG#EðH ”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ï   ;  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)rå   ÚoffsetsÚrangeÚsizes)rð   rñ   ÚndimsÚis       r=   Ú_check_box_overlaprø   B  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ô   rå   ró   rõ   )rù   rú   r÷   s      r=   Ú_check_box_boundsrü   R  su   € ô ”3�~Ó&Ó'ò ˆØ×Ñ˜QÑ !Ò#ÙØ�?‰?˜1Ñ Ò!ÙØ×Ñ˜QÑ )§/¡/°!Ñ"4Ñ4°~ÀaÑ7HÓHÙðð r?   rV   c           	      ó°  — d}|j                   j                  «       D �]5  \  }}t        |t        «      rŒt	        |j
                  «      dk(  rŒ1d}t        |j                  «      D ]¥  \  }}t        |j
                  |«      s$t        j                  d||j
                  |«       d}|t        t        j                  |j                  d«      z  }|j                  |dz   d  D ])  }t        ||«      sŒt        j                  d|||«       d}Œ+ Œ§ t        t        j                  |j
                  d«      }	||	k7  s�Œt        j                  d||	|«       d}�Œ8 |S )NTr   z~
                        key:%s has out of bounds chunk:
                        tensor-size:%s chunk: %s
                    Fr&   z$key:%s has overlapping chunks: %s %szq
                    key:%s invalid fill tensor-volume:
                    %s chunks-volume: %s
                )r—   rÌ   rÍ   r   rå   rÏ   Ú	enumeraterá   rü   r(   r7   r   ÚoperatorÚmulrõ   rø   )
rV   rW   Úall_goodr¼   r¢   Úchunks_volumeÚ	chunk_idxÚchunk0Úchunk1Útensor_volumes
             r=   rT   rT   `  sN  € Ø€HØ×2Ñ2×8Ñ8Ó:ó )‰
ˆˆUÜ�eÔ1Ô2ØÜˆu�z‰z‹?˜aÒØØˆÜ!*¨5¯<©<Ó!8ò 	%ÑˆI�vä$ U§Z¡Z°Ô8Ü—‘ðð Ø—J‘JØôð !�ØœV¤H§L¡L°&·,±,ÀÓBÑBˆMð  Ÿ,™, y°1¡} Ð7ò %�Ü% f¨fÕ5Ü—N‘NØ>ÀÀVÈVôð  %‘Hñ%ð!	%ô0 œxŸ|™|¨U¯Z©Z¸Ó;ˆØ˜MÔ)Ü�N‰Nðð ØØôð ŠHðS)ðV €Or?   )T)Or^   rK   r€   Úloggingrÿ   Úcollectionsr   Ú	functoolsr   Útypingr   r   r   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#   Ú"torch.distributed.checkpoint.utilsr$   Útorch.distributed.tensorr%   Ú r'   Ú	getLoggerr9   r(   ÚLoggerrˆ   Ú__all__r)   r*   r·   rS   rÆ   r‰   r+   rŠ   r,   r-   r‹   r.   rï   rø   ÚSizerü   rT   r�   r?   r=   ú<module>r     sÞ  ðô Û Û 	Û Û Ý  Ý ß -Ó -ã Ý BÝ K÷õ XÝ >÷	÷ 	ó 	÷÷ ñ ÷÷ õ FÝ ,å ð +˜×*Ñ*¨8Ó4€ˆ�‰Ó 4ò€ôv˜ô vôrsY˜ô sYôl>EÐ!3ô >EðD DHñ'Ø�S˜#�X‘ð'Ø*2ð'Ø<@ð'àó'ðT	Ø�H‰~ð	à	ˆ(�^ó	ðØ�S˜#�X‘ðØ04ðàóð: !%ñ2%Ø�H‰~ð2%àð2%ð ˆ4�‰>˜8Ð#Ñ$ó2%ðj¨ð À8ó ðÐ1ð Ð9Mð ÐRVó ð Ø—J‘JðØ+?ðà	óð- t¨H¡~ð -Àð -Èdô -r?   