§
    [�’j+$  ã                  óÆ   — d dl mZ d dlZd dlmZ ddlmZmZmZ erddl	m
Z
  e¦   «         rd dlZdd
„Zdd„Zd d„Zd d„Zdd„Zd!d"d„Zd„ Zd#d„Zd$d„Zd%d„Zd%d„Zd%d„ZdS )&é    )ÚannotationsN)ÚTYPE_CHECKINGé   )Úis_torch_availableÚis_torch_distributed_availableÚis_torch_greater_or_equalé   )ÚDistributedConfigÚreturnÚboolc                 ó^   — t          ¦   «         sdS t          j                             ¦   «         S )NF)r   ÚtorchÚdistributedÚis_initialized© ó    úLC:\Projects\DSCons\.venv\Lib\site-packages\transformers\distributed\utils.pyÚ!_is_torch_distributed_initializedr      s*   € Ý)Ñ+Ô+ð ØˆuÝÔ×+Ò+Ñ-Ô-Ð-r   c                óN   — t          ¦   «         sdS ddlm} t          | |¦  «        S )NFr   )ÚDTensor)r   Útorch.distributed.tensorr   Ú
isinstance)Úobjr   s     r   Ú
is_dtensorr   $   s7   € Ý)Ñ+Ô+ð ØˆuØ0Ð0Ð0Ð0Ð0Ð0å�c˜7Ñ#Ô#Ð#r   Úintc                 ó^   — t          ¦   «         sdS t          j                             ¦   «         S )Nr   )r   r   r   Úget_rankr   r   r   Ú_get_torch_distributed_rankr   ,   s*   € Ý,Ñ.Ô.ð ØˆqÝÔ×%Ò%Ñ'Ô'Ð'r   c                 ó^   — t          ¦   «         sdS t          j                             ¦   «         S )Nr	   )r   r   r   Úget_world_sizer   r   r   Ú!_get_torch_distributed_world_sizer!   2   s*   € Ý,Ñ.Ô.ð ØˆqÝÔ×+Ò+Ñ-Ô-Ð-r   c                 ó€   — t          ¦   «         o0t          t          j                             dd¦  «        ¦  «        dk    S )NÚ
LOCAL_RANKz-1r   )r   r   ÚosÚenvironÚgetr   r   r   Úis_local_dist_rank_0r'   8   s2   € Ý,Ñ.Ô.Ð_µ3µr´z·~²~ÀlÐTXÑ7YÔ7YÑ3ZÔ3ZÐ^_Ò3_Ð_r   Údevice_typeú
str | Nonec                óž  — t           j                             ¦   «         �s-| €#t           j                             ¦   «         j        } 	 t          t          j        d         ¦  «        }t          t          j        d         ¦  «        }t          t          j        d         ¦  «        }ddddd	d
dœ}| 	                    | ¦  «        }d}| dk    r=t          t           | ¦  «                             |¦  «         t          j        | |¦  «        }t           j                             ||||¬¦  «         dS # t          $ r}t          d¦  «        |‚d}~ww xY wdS )zŽInitialize torch.distributed if not already initialized.

    If `device_type` is not given, it is detected from the current accelerator.
    NÚRANKr#   Ú
WORLD_SIZEÚncclÚglooÚxcclÚhcclÚneuronÚtpu_dist)ÚcudaÚcpuÚxpuÚhpur1   Útpur4   )ÚbackendÚrankÚ
world_sizeÚ	device_idz‘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Útyper   r$   r%   r&   ÚgetattrÚ
set_deviceÚdeviceÚinit_process_groupÚ	ExceptionÚOSError)r(   r9   Ú
local_rankr:   Úbackend_mapr8   r;   Úes           r   Ú_ensure_torch_distributedrH   <   sg  € õ
 Ô×+Ò+Ñ-Ô-ñ  ØÐÝœ(×3Ò3Ñ5Ô5Ô:ˆKð	Ý•r”z &Ô)Ñ*Ô*ˆDÝ�RœZ¨Ô5Ñ6Ô6ˆJÝ�RœZ¨Ô5Ñ6Ô6ˆJð ØØØØ"Ø!ðð ˆKð "—o’o kÑ2Ô2ˆGð
 ˆIØ˜eÒ#Ð#Ý�˜{Ñ+Ô+×6Ò6°zÑBÔBÐBÝ!œL¨°jÑAÔA�	ÝÔ×0Ò0Ø d°zÈYð 1ñ ô ð ð ð øõ ð 	ð 	ð 	Ýð^ñô ð ðøøøøð	øøøð9 ð  s   ÁC#D+ Ä+
E
Ä5EÅE
c                 óD  — t          ¦   «         sdS t          j                             ¦   «         j        } | dk    rHt          j                             t          t          | ¦  «                             ¦   «         g¬¦  «         dS t          j                             ¦   «          dS )u3  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.
    Nr4   )Ú
device_ids)	r   r   r<   r=   r>   r   Úbarrierr?   Úcurrent_device)r(   s    r   Ú_distributed_barrierrM   d   sŒ   € õ -Ñ.Ô.ð ØˆÝ”(×+Ò+Ñ-Ô-Ô2€KØ�eÒÐÝÔ×!Ò!­gµe¸[Ñ.IÔ.I×.XÒ.XÑ.ZÔ.ZÐ-[Ð!Ñ\Ô\Ð\Ð\Ð\åÔ×!Ò!Ñ#Ô#Ð#Ð#Ð#r   Údistributed_configr
   c                ó  — | j         dk    rt          d¦  «        st          d¦  «        ‚t          j                             ¦   «         j        }|dk    rkt          t          j	         
                    dd¦  «        ¦  «        }t          t          |¦  «                             |¦  «         t          j        ||¦  «        }nt          j        |¦  «        }| j         }g g }}|dk    r*|                     |¦  «         |                     d¦  «         t          j                             |t#          |¦  «        t#          |¦  «        ¬¦  «        }t%          |¦  «        dk    r(|                     d	                     |¦  «        ¦  «         ||fS )
Nr	   ú2.7z?FSDP2 requires `torch>=2.7` (distributed checkpoint save/load).r4   r#   r   Úfsdp)Úmesh_dim_namesÚ_)Ú	fsdp_sizer   rD   r   r<   r=   r>   r   r$   r%   r&   r?   r@   rA   Úappendr   Úinit_device_meshÚtupleÚlenÚ_flattenÚjoin)rN   r(   rE   Ú
device_maprT   ÚdimsÚnamesÚmeshs           r   Ú)initialize_fully_sharded_data_parallelismr_   t   sP  € ð Ô# aÒ'Ð'Õ0IÈ%Ñ0PÔ0PÐ'ÝÐWÑXÔXÐXå”(×+Ò+Ñ-Ô-Ô2€Kà�eÒÐÝ�œŸš¨°aÑ8Ô8Ñ9Ô9ˆ
Ý•�{Ñ#Ô#×.Ò.¨zÑ:Ô:Ð:Ý”\ +¨zÑ:Ô:ˆ
ˆ
å”\ +Ñ.Ô.ˆ
à"Ô,€Ià�bˆ%€DØ�1‚}€}Ø�Š�IÑÔÐØ�Š�VÑÔÐõ Ô×-Ò-¨k½5À¹;¼;ÕW\Ð]bÑWcÔWcÐ-ÑdÔd€Då
ˆ4�y„y�1‚}€}Ø�Š�c—h’h˜u‘o”oÑ&Ô&Ð&à�tÐÐr   údict[str, torch.Tensor]c                ó®   — t          d¦  «        st          d¦  «        ‚ddlm}m}  |dd¬¦  «        } || |¬¦  «        }t          ¦   «         dk    r|S i S )z~Gather FSDP-sharded params to full plain CPU tensors.

    Only rank 0 accumulates the result; other ranks return ``{}``.
    rP   ú0Distributed checkpointing requires `torch>=2.7`.r   )ÚStateDictOptionsÚget_model_state_dictT)Úfull_state_dictÚcpu_offload)Úoptions)r   rD   Ú'torch.distributed.checkpoint.state_dictrc   rd   r   )Úmodelrc   rd   rg   re   s        r   Úgather_full_state_dictrj   “   s…   € õ
 % UÑ+Ô+ð JÝÐHÑIÔIÐIð _Ð^Ð^Ð^Ð^Ð^Ð^Ð^àÐ¨tÀÐFÑFÔF€GØ*Ð*¨5¸'ÐBÑBÔB€OÝ"Ñ$Ô$¨Ò)Ð)ØÐØ€Ir   Úcheckpoint_dirÚstrÚNonec                óä   — t          d¦  «        st          d¦  «        ‚ddlmc m} ddlm} ddlm}  || ¦  «        }| 	                    | ||dd¬¦  «        ¬	¦  «         t          ¦   «          dS )
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.
    rP   rb   r   N)ÚHuggingFaceStorageWriter)rd   T)ÚpathÚsave_distributedÚenable_consolidation)Ústorage_writer)r   rD   Útorch.distributed.checkpointr   Ú
checkpointÚ'torch.distributed.checkpoint.hf_storagero   rh   rd   ÚsaverM   )ri   rk   Údcpro   rd   Ú
state_dicts         r   Ú!save_model_checkpoint_distributedrz   ¦   sÅ   € õ % UÑ+Ô+ð JÝÐHÑIÔIÐIð /Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØPÐPÐPÐPÐPÐPØLÐLÐLÐLÐLÐLà%Ð% eÑ,Ô,€JØ‡H‚HØØ/Ð/ØØ!Ø!%ð
ñ 
ô 
ð ñ ô ð õ ÑÔÐÐÐr   c                óª   — t          d¦  «        st          d¦  «        ‚ddlmc m} ddlm}  || |¦  «        }|                     d|i|¬¦  «         dS )zSave optimizer state via DCP.rP   rb   r   N)Úget_optimizer_state_dictÚ	optimizer©Úcheckpoint_id)r   rD   rt   r   ru   rh   r|   rw   )ri   r}   rk   rx   r|   Úoptimizer_state_dicts         r   Úsave_optimizer_distributedr�   Ç   s†   € å$ UÑ+Ô+ð JÝÐHÑIÔIÐIð /Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØPÐPÐPÐPÐPÐPà3Ð3°E¸9ÑEÔEÐØ‡H‚HˆkÐ/Ð0À€HÑOÔOÐOÐOÐOr   c                óÈ   — t          d¦  «        st          d¦  «        ‚ddlmc m} ddlm}m}  || |¦  «        }|                     d|i|¬¦  «          || ||¦  «         dS )zLoad optimizer state via DCP.rP   rb   r   N)r|   Úset_optimizer_state_dictr}   r~   )	r   rD   rt   r   ru   rh   r|   rƒ   Úload)ri   r}   rk   rx   r|   rƒ   r€   s          r   Úload_optimizer_distributedr…   Õ   s¢   € å$ UÑ+Ô+ð JÝÐHÑIÔIÐIð /Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØjÐjÐjÐjÐjÐjÐjÐjà3Ð3°E¸9ÑEÔEÐØ‡H‚HˆkÐ/Ð0À€HÑOÔOÐOØÐ˜U IÐ/CÑDÔDÐDÐDÐDr   )r   r   )r   r   )N)r(   r)   )rN   r
   )r   r`   )rk   rl   r   rm   )Ú
__future__r   r$   Útypingr   Úutilsr   r   r   Úconfiguration_utilsr
   r   r   r   r   r!   r'   rH   rM   r_   rj   rz   r�   r…   r   r   r   ú<module>rŠ      s”  ðð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø  Ð  Ð  Ð  Ð  Ð  à aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ að ð 7Ø6Ð6Ð6Ð6Ð6Ð6ð ÐÑÔð Ø€L€L€Lð.ð .ð .ð .ð$ð $ð $ð $ð(ð (ð (ð (ð.ð .ð .ð .ð`ð `ð `ð `ð%ð %ð %ð %ð %ðP$ð $ð $ð ð ð ð ð>ð ð ð ð&ð ð ð ðBPð Pð Pð PðEð Eð Eð Eð Eð Er   