ó
    ‡Ž¡j92  ã                  óR  • S SK Jr  S SKrS SKJr  S SKJrJr  SSKJ	r	J
r
JrJr  \R                  " \5      r\(       a  S SKJr  SS	KJr  \	" 5       (       a  S SKrSS
 jrSS jrSS jrSS jrSS jrSSS jjrS r S   SS jjrSS jr  SS jrS S jrS!S jr S!S jr!S!S jr"g)"é    )ÚannotationsN)Ú	timedelta)ÚTYPE_CHECKINGÚ	TypeGuardé   )Úis_torch_availableÚis_torch_distributed_availableÚis_torch_greater_or_equalÚlogging©ÚDTensoré   )ÚDistributedConfigc                 ó^   • [        5       (       d  g[        R                  R                  5       $ )NF)r	   ÚtorchÚdistributedÚis_initialized© ó    Ú¬C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\transformers/distributed/utils.pyÚ!_is_torch_distributed_initializedr   $   s#   € Ü)×+Ñ+ØÜ×Ñ×+Ñ+Ó-Ð-r   c                óD   • [        5       (       d  gSSKJn  [        X5      $ )NFr   r   )r	   Útorch.distributed.tensorr   Ú
isinstance)Úobjr   s     r   Ú
is_dtensorr   *   s   € Ü)×+Ñ+ØÝ0ä�cÓ#Ð#r   c                 ó^   • [        5       (       d  g[        R                  R                  5       $ )Nr   )r   r   r   Úget_rankr   r   r   Ú_get_torch_distributed_rankr   2   s#   € Ü,×.Ñ.ØÜ×Ñ×%Ñ%Ó'Ð'r   c                 ó^   • [        5       (       d  g[        R                  R                  5       $ )Nr   )r   r   r   Úget_world_sizer   r   r   Ú!_get_torch_distributed_world_sizer"   8   s#   € Ü,×.Ñ.ØÜ×Ñ×+Ñ+Ó-Ð-r   c                 ó|   • [        5       =(       a,    [        [        R                  R	                  SS5      5      S:H  $ )NÚ
LOCAL_RANKz-1r   )r   ÚintÚosÚenvironÚgetr   r   r   Úis_local_dist_rank_0r)   >   s+   € Ü,Ó.×_´3´r·z±z·~±~ÀlÐTXÓ7YÓ3ZÐ^_Ñ3_Ð_r   c           
     óÂ  • [         R                  R                  5       (       Gd  U c(  [         R                  R	                  5       R
                  n U S:X  a  [        R                  S5        Sn  [        [        R                  S   5      n[        [        R                  S   5      n[        [        R                  S   5      nSS	S
SSSS.nUR                  U 5      nSnU S:w  a5  [        [         U 5      R                  U5        [         R                  " X5      n[         R                  R                  UUUU[!        SS9S9  gg! ["         a  n[%        S5      UeSnAff = f)z†Initialize torch.distributed if not already initialized.

If `device_type` is not given, it is detected from the current accelerator.
NÚmpsú^PyTorch's built-in DeviceMesh/DTensor stack does not support an MPS mesh. Falling back to CPU.ÚcpuÚRANKr$   Ú
WORLD_SIZEÚncclÚglooÚxcclÚhcclÚneuronÚtpu_dist)Úcudar-   ÚxpuÚhpur4   Útpur   )Úhours)ÚbackendÚrankÚ
world_sizeÚ	device_idÚtimeoutz‘We tried to initialize torch.distributed for you, but it failed. Make sure you init torch distributed in your script to use distributed training.)r   r   r   Ú_CÚ_get_acceleratorÚtypeÚloggerÚwarning_oncer%   r&   r'   r(   ÚgetattrÚ
set_deviceÚdeviceÚinit_process_groupr   Ú	ExceptionÚOSError)Údevice_typer<   Ú
local_rankr=   Úbackend_mapr;   r>   Úes           r   Ú_ensure_torch_distributedrO   B   sO  € ô
 ×Ñ×+Ñ+×-Ò-ØÑÜŸ(™(×3Ñ3Ó5×:Ñ:ˆKØ˜%ÓÜ×ÑØpôð  ˆKð"	Ü”r—z‘z &Ñ)Ó*ˆDÜœRŸZ™Z¨Ñ5Ó6ˆJÜœRŸZ™Z¨Ñ5Ó6ˆJð ØØØØ"Ø!ñˆKð "—o‘o kÓ2ˆGð
 ˆIØ˜eÓ#Üœ˜{Ó+×6Ñ6°zÔBÜ!ŸLšL¨ÓA�	Ü×Ñ×0Ñ0ØØØ%Ø#ä!¨Ñ*ð 1ò ð= .øôL ó 	Üð^óð ðûð	ús   Á.CE Å
EÅEÅEc                 ó2  • [        5       (       d  g[        R                  R                  5       R                  n U S:w  a;  [        R
                  R                  [        [        U 5      R                  5       /S9  g[        R
                  R                  5         g)u#  Barrier bound to the current accelerator device.

Passing `device_ids` is required when the process group was initialized without a
`device_id`; with it, the call is a no-op compared to plain `barrier()`. Safe to call
when torch.distributed has not been initialized â€” returns immediately.
Nr-   )Ú
device_ids)	r   r   r@   rA   rB   r   ÚbarrierrE   Úcurrent_device)rK   s    r   Ú_distributed_barrierrT   t   sl   € ô -×.Ñ.ØÜ—(‘(×+Ñ+Ó-×2Ñ2€KØ�eÓÜ×Ñ×!Ñ!¬g´e¸[Ó.I×.XÑ.XÓ.ZÐ-[Ð!Ò\ä×Ñ×!Ñ!Õ#r   c                ód  • Ub  U c  [        S5      eU b  Ub  [        S5      eUGc  [        S5      (       d  [        S5      e[        R                  R                  5       R                  nUS:X  a  [        R                  S5        Sn[        [        U5      nUS:w  aT  UR                  [        [        R                  S   5      5        UR                  5       n[        R                  " XF5      nUnO![        R                  " U5      nU=(       d    0 n[        R                   R#                  UR                  U45      nX24$ UR$                  S	:”  a   S
UR&                  ;  a  [        S5      eUS
   n[        R                  " UR(                   S[        [        R                  S   5       35      nX24$ )z 
Sets up the device mesh and initialized the backend for tensor parallelism.
This function is called when the model is loaded and the TP plan is set to 'auto'.
z-tp_plan has to be set when tp_size is passed.zY`tp_plan` and `device_map` are mutually exclusive. Choose either one for parallelization.ú2.5z3Tensor parallel is only supported for `torch>=2.5`.r+   r,   r-   r$   r   ÚtpzsWhen using `tp_plan` and n-d `device_mesh`, it must contain a 'tp' dimension. Please provide a valid `device_mesh`.Ú:)Ú
ValueErrorr
   rJ   r   r@   rA   rB   rC   rD   rE   rF   r%   r&   r'   rS   rG   r   Úinit_device_meshÚndimÚmesh_dim_namesrK   )Útp_planÚtp_sizeÚdevice_meshÚ
device_maprK   rS   ÚindexÚ	tp_devices           r   Úinitialize_tensor_parallelismrc   …   sŽ  € ð Ñ˜w™ÜÐHÓIÐIØÑ˜zÑ5ÜÐtÓuÐuØÒÜ(¨×/Ñ/ÜÐOÓPÐPô —h‘h×/Ñ/Ó1×6Ñ6ˆØ˜%ÓÜ×ÑØpôð  ˆKÜ ¤¨Ó4ˆà˜%ÓØ×%Ñ%¤c¬"¯*©*°\Ñ*BÓ&CÔDØ"×1Ñ1Ó3ˆEÜŸš [Ó8ˆIØ"‰JäŸš [Ó1ˆIØ$×*¨ˆJä×'Ñ'×8Ñ8¸¿¹È'ÈÓTˆð Ð"Ð"ð ×Ñ˜aÓØ˜;×5Ñ5Ó5Ü ð<óð ð & dÑ+ˆKÜ—\’\ [×%<Ñ%<Ð$=¸Q¼sÄ2Ç:Á:ÈlÑC[Ó?\Ð>]Ð"^Ó_ˆ
àÐ"Ð"r   c                óÒ  • U R                   S:”  a  [        S5      (       d  [        S5      e[        R                  R                  5       R                  nUS:w  a_  [        [        R                  R                  SS5      5      n[        [        U5      R                  U5        [        R                  " X5      nO[        R                  " U5      nU R                   n/ / peUS:”  a"  UR                  U5        UR                  S5        [        R                  R!                  U[#        U5      [#        U5      S9n[%        U5      S:”  a   UR'                  S	R)                  U5      5        X74$ )
Nr   ú2.7z?FSDP2 requires `torch>=2.7` (distributed checkpoint save/load).r-   r$   r   Úfsdp©r\   Ú_)Ú	fsdp_sizer
   rJ   r   r@   rA   rB   r%   r&   r'   r(   rE   rF   rG   Úappendr   rZ   ÚtupleÚlenÚ_flattenÚjoin)Údistributed_configrK   rL   r`   ri   ÚdimsÚnamesÚmeshs           r   Ú)initialize_fully_sharded_data_parallelismrs   ´   s  € ð ×#Ñ# aÓ'Ô0IÈ%×0PÑ0PÜÐWÓXÐXä—(‘(×+Ñ+Ó-×2Ñ2€Kà�eÓÜœŸ™Ÿ™¨°aÓ8Ó9ˆ
Ü”�{Ó#×.Ñ.¨zÔ:Ü—\’\ +Ó:‰
ä—\’\ +Ó.ˆ
à"×,Ñ,€Ià�bˆ%Ø�1ƒ}Ø�‰�IÔØ�‰�VÔô ×Ñ×-Ñ-¨k¼5À»;ÔW\Ð]bÓWcÐ-Ðd€Dä
ˆ4ƒy�1ƒ}Ø�‰�c—h‘h˜u“oÔ&àÐÐr   c                ó€  • [        S5      (       d  [        S5      e[        R                  R	                  5       R
                  n[        U5        [        R                  R                  5       nU R                  nX#:w  a  [        SU SU S35      eUS:w  a_  [        [        R                  R                  SS5      5      n[        [        U5      R!                  U5        [        R"                  " X5      nO[        R"                  " U5      nX#:X  d   SU SU S35       e[        R                  R%                  X4S	S
9nXV4$ )NrV   zBPipeline parallelism with DistributedConfig requires `torch>=2.5`.zworld_size (z) must be equal to pp_size (Ú)r-   r$   r   )Úpprg   )r
   rJ   r   r@   rA   rB   rO   r   r!   Úpp_sizeÚRuntimeErrorr%   r&   r'   r(   rE   rF   rG   rZ   )ro   rK   r=   rw   rL   r`   rr   s          r   Úinitialize_pipeline_parallelismry   Ó   s  € ô % U×+Ñ+ÜÐZÓ[Ð[ä—(‘(×+Ñ+Ó-×2Ñ2€KÜ˜kÔ*ä×"Ñ"×1Ñ1Ó3€JØ ×(Ñ(€GØÓÜ˜\¨*¨Ð5QÐRYÐQZÐZ[Ð\Ó]Ð]à�eÓÜœŸ™Ÿ™¨°aÓ8Ó9ˆ
Ü”�{Ó#×.Ñ.¨zÔ:Ü—\’\ +Ó:‰
ä—\’\ +Ó.ˆ
àÓ Ðc L°°Ð<XÐY`ÐXaÐabÐ"cÓcÐ Ü×Ñ×-Ñ-¨k¸:ÐV]Ð-Ð^€DàÐÐr   c                ó†   • [        S5      (       d  [        S5      eSSKJnJn  U" SSS9nU" XS9n[        5       S:X  a  U$ 0 $ )zvGather FSDP-sharded params to full plain CPU tensors.

Only rank 0 accumulates the result; other ranks return ``{}``.
re   ú0Distributed checkpointing requires `torch>=2.7`.r   )ÚStateDictOptionsÚget_model_state_dictT)Úfull_state_dictÚcpu_offload)Úoptions)r
   rJ   Ú'torch.distributed.checkpoint.state_dictr|   r}   r   )Úmodelr|   r}   r€   r~   s        r   Úgather_full_state_dictrƒ   î   sM   € ô
 % U×+Ñ+ÜÐHÓIÐI÷ _á¨tÀÑF€GÙ*¨5ÑB€OÜ"Ó$¨Ó)ØÐØ€Ir   c           	     ó´   • [        S5      (       d  [        S5      eSSKJs  Jn  SSKJn  SSKJn  U" U 5      nUR                  UU" USSS9S	9  [        5         g)
uÌ  Save model parameters as standard HF-format sharded safetensors using
DCP + HuggingFaceStorageWriter with consolidation enabled.

Every rank first writes its own shard in parallel under
`<checkpoint_dir>/sharded/`, then a consolidation pass reads those shards
and emits HF-compatible `model-*-of-N.safetensors` (+ index) at
`<checkpoint_dir>/`. The result is a directory `from_pretrained` reads
through its normal path â€” no special flag needed at load time.
re   r{   r   N)ÚHuggingFaceStorageWriter)r}   T)ÚpathÚsave_distributedÚenable_consolidation)Ústorage_writer)r
   rJ   Útorch.distributed.checkpointr   Ú
checkpointÚ'torch.distributed.checkpoint.hf_storager…   r�   r}   ÚsaverT   )r‚   Úcheckpoint_dirÚdcpr…   r}   Ú
state_dicts         r   Ú!save_model_checkpoint_distributedr‘     s`   € ô % U×+Ñ+ÜÐHÓIÐI÷ /Ð.ÝPÝLá% eÓ,€JØ‡H�HØÙ/ØØ!Ø!%ñ
ð ñ ô Õr   c                óŒ   • [        S5      (       d  [        S5      eSSKJs  Jn  SSKJn  U" X5      nUR                  SU0US9  g)zSave optimizer state via DCP.re   r{   r   N)Úget_optimizer_state_dictÚ	optimizer©Úcheckpoint_id)r
   rJ   rŠ   r   r‹   r�   r“   r�   )r‚   r”   rŽ   r�   r“   Úoptimizer_state_dicts         r   Úsave_optimizer_distributedr˜   "  sE   € ä$ U×+Ñ+ÜÐHÓIÐI÷ /Ð.ÝPá3°EÓEÐØ‡H�HˆkÐ/Ð0À€HÒOr   c                ó¢   • [        S5      (       d  [        S5      eSSKJs  Jn  SSKJnJn  U" X5      nUR                  SU0US9  U" XU5        g)zLoad optimizer state via DCP.re   r{   r   N)r“   Úset_optimizer_state_dictr”   r•   )	r
   rJ   rŠ   r   r‹   r�   r“   rš   Úload)r‚   r”   rŽ   r�   r“   rš   r—   s          r   Úload_optimizer_distributedrœ   0  sP   € ä$ U×+Ñ+ÜÐHÓIÐI÷ /Ð.ßjá3°EÓEÐØ‡H�HˆkÐ/Ð0À€HÑOÙ˜UÐ/CÕDr   )ÚreturnÚbool)r   Úobjectr�   zTypeGuard[DTensor])r�   r%   )N)rK   z
str | None)NNN)r]   zstr | dict[str, str] | Noner^   z
int | None)ro   r   )r�   zdict[str, torch.Tensor])rŽ   Ústrr�   ÚNone)#Ú
__future__r   r&   Údatetimer   Útypingr   r   Úutilsr   r	   r
   r   Ú
get_loggerÚ__name__rC   r   r   Úconfiguration_utilsr   r   r   r   r   r"   r)   rO   rT   rc   rs   ry   rƒ   r‘   r˜   rœ   r   r   r   Ú<module>r©      s¯   ðõ #ã 	Ý ß +ç jÓ jð 
×	Ò	˜HÓ	%€ö Ý0å6ñ ×ÑÛô.ô$ô(ô.ô`ö/òd$ð$ dhð,#Ø(ð,#Ø3=õ,#ô^ð>Ø)ôô6ô&ôBPõEr   