Ë
    ‡\;jS)  ã                   ó®   — d dl Z d dlZd dlmZ d dlmZ  G d„ d«      Z G d„ d«      Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zdd„Zdd„Zd„ Zdd„Zdd„Zdd„Zdd„Zy)é    N)Ú	frameworkc                   óª   — e Zd ZdZdd„Zed„ «       Zed„ «       Zed„ «       Zed„ «       Z	ed„ «       Z
ed	„ «       Zed
„ «       Zed„ «       Zd„ Zd„ Zd„ Zy)ÚGroupz/
    The abstract representation of group.
    Nc                 óx   — || _         |dk\  rt        |«      nd| _        || _        || _        || _        || _        y )Nr   éÿÿÿÿ)Ú_rank_in_groupÚlenÚ_world_sizeÚ_idÚ_ranksÚ_pgÚ_name)ÚselfÚrank_in_groupÚidÚranksÚpgÚnames         úoG:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/distributed/communication/group.pyÚ__init__zGroup.__init__   s;   € Ø+ˆÔØ)6¸!Ò);œ3˜uœ:ÀˆÔØˆŒØˆŒØˆŒØˆ�
ó    c                 ó   — | j                   S ©N)r   ©r   s    r   Úrankz
Group.rank#   s   € à×"Ñ"Ð"r   c                 ó   — | j                   S r   )r   r   s    r   r   zGroup.ranks'   s   € à�{‰{Ðr   c                 ó,   — t        | j                  «      S r   )r	   r   r   s    r   ÚnrankszGroup.nranks+   s   € ä�4—;‘;ÓÐr   c                 ó   — | j                   S r   )r   r   s    r   r   z
Group.name/   s   € à�z‰zÐr   c                 ó   — | j                   S r   )r   r   s    r   Úprocess_groupzGroup.process_group3   ó   € à�x‰xˆr   c                 ó   — | j                   S r   )r
   r   s    r   Ú
world_sizezGroup.world_size7   s   € à×ÑÐr   c                 ó6   — | j                   j                  «       S r   )r   r   r   s    r   ÚbackendzGroup.backend;   s   € à�x‰x�}‰}‹Ðr   c                 ó   — | j                   S r   )r   r   s    r   r   zGroup.id?   r"   r   c                 óD   — | j                   dk  ry| j                  dk  ryy)Nr   Fé   T)r   r   r   s    r   Ú	is_memberzGroup.is_memberC   s!   € Ø�9‰9�qŠ=ØØ�;‰;˜Š?ØØr   c                 óZ   — | j                  «       r| j                  j                  |«      S y)Nr   )r*   r   Úindex)r   r   s     r   Úget_group_rankzGroup.get_group_rankJ   s$   € Ø�>‰>ÔØ—:‘:×#Ñ# DÓ)Ð)àr   c                 óþ   — d| j                   › d| j                  › d| j                  › d�}|dj                  t	        t
        | j                  «      «      z  }|dz  }|| j                  r| j                  z  }|S dz  }|S )Nzrank: z
, nranks: z, id: z	, ranks: z, z; name: ÚNone)r   r   r   ÚjoinÚmapÚstrr   r   )r   Ú	debug_strs     r   Ú__repr__zGroup.__repr__P   s   € à�T—Y‘Y�K˜z¨$¯+©+¨°f¸T¿W¹W¸IÀYÐOð 	ð 	�T—Y‘Yœs¤3¨¯
©
Ó3Ó4Ñ4ˆ	Ø�ZÑˆ	Ø $§)¢)�T—Y‘YÑ7ˆ	ØÐð 28Ñ7ˆ	ØÐr   )NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r   r   r!   r$   r&   r   r*   r-   r4   © r   r   r   r      s»   „ ñóð ñ#ó ð#ð ñó ðð ñ ó ð ð ñó ðð ñó ðð ñ ó ð ð ñó ðð ñó ðòòór   r   c                   ó   — e Zd ZdZi Zy)Ú_GroupManagerr   N)r5   r6   r7   Úglobal_group_idÚgroup_map_by_idr:   r   r   r<   r<   Z   s   „ Ø€OØ�Or   r<   c                  óš   — t         j                  t         j                  vrt        d«      ‚t         j                  t         j                     S )Nz$The global group is not initialized.)r<   r=   r>   ÚRuntimeErrorr:   r   r   Ú_get_global_grouprA   _   s9   € Ü×$Ñ$¬M×,IÑ,IÑIÜÐAÓBÐBÜ×(Ñ(¬×)FÑ)FÑGÐGr   c                 ó¨   — | j                   t        j                  v rt        d| j                   › d�«      ‚| t        j                  | j                   <   y )NzThe group with id z already exist.)r   r<   r>   r@   ©Úgroups    r   Ú_add_new_grouprE   e   sA   € Ø‡x�x”=×0Ñ0Ñ0ÜÐ/°·±¨z¸ÐIÓJÐJØ.3„M×!Ñ! %§(¡(Ò+r   c                 ó<   — | j                   t        j                  k(  S r   )r   r<   r=   rC   s    r   Ú_is_global_grouprG   k   s   € Ø�8‰8”}×4Ñ4Ñ4Ð4r   c                 óœ   — t        j                  «       }| r6| j                  «       s&t        j                  d|› d| j
                  › �«       yy)NzCurrent global rank z is not in group TF)ÚdistÚget_rankr*   ÚwarningsÚwarnr   )rD   Úglobal_ranks     r   Ú_warn_cur_rank_not_in_grouprN   o   sB   € Ü—-‘-“/€KÙ�U—_‘_Ô&Ü�‰Ø" ; -Ð/@ÀÇÁÀÐMô	
ð Ør   c                 ó`   — |j                  | «      }|dk\  sJ d| › d|j                  › �«       ‚|S )Nr   zThe input rank z# can not be found inside the group )r-   r   )rM   rD   Ú
group_ranks      r   Ú_get_or_throw_group_rankrQ   y   sC   € Ø×%Ñ% kÓ2€Jà�aŠðVà	˜˜Ð%HÈÏÉÈÐUóVØàÐr   c                  óB   — t         j                  t         j                  v S )a@  

    Check whether the distributed environment has been initialized

    Returns:
        `True` if distributed environment has been initialized, otherwise `False`.

    Warning:
        This API only supports the dygraph mode.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle

            >>> print(paddle.distributed.is_initialized())
            False

            >>> paddle.distributed.init_parallel_env()
            >>> print(paddle.distributed.is_initialized())
            True

    )r<   r=   r>   r:   r   r   Úis_initializedrS   �   s   € ô2 ×(Ñ(¬M×,IÑ,IÐIÐIr   c                 ó  — | €
t        «       n| } | j                  t        j                  v sJ d| j                  › d�«       ‚t	        | «      rt        j                  j                  «        yt        j                  | j                  = y)a…  
    Destroy a given group for communication

    Args:
        group (Group, optional): The group to be destroyed. All of process groups, including
                                        the default group, will be destroyed and the distributed
                                        environment will be deinitialized.

    Returns : None

    Warning:
        This API only supports the dygraph mode.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle
            >>> import paddle.distributed as dist

            >>> dist.init_parallel_env()
            >>> group = dist.new_group([0, 1])

            >>> dist.destroy_process_group(group)
            >>> print(dist.is_initialized())
            True
            >>> dist.destroy_process_group()
            >>> print(dist.is_initialized())
            False

    NzDestroy group with id z is invalid.)rA   r   r<   r>   rG   ÚclearrC   s    r   Údestroy_process_grouprV   �   so   € ð@ $) =ÔÔ°e€Eà�‰”M×1Ñ1Ñ1ð7à	 §¡˜z¨Ð6ó7Ø1ä˜ÔÜ×%Ñ%×+Ñ+Õ-ä×)Ñ)¨%¯(©(Ñ3r   c                 ó€   — | t         j                  v rt         j                  |    S t        j                  d| › d�«       y)aì  

    Get group instance by group id.

    Args:
        id (int): the group id. Default value is 0.

    Returns:
        Group: the group instance.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle
            >>> import paddle.distributed as dist

            >>> dist.init_parallel_env()
            >>> gid = paddle.distributed.new_group([2,4,6])
            >>> paddle.distributed.get_group(gid.id)

    zGroup z is not initialized.N)r<   r>   rK   rL   )r   s    r   Ú	get_grouprX   Ç   s<   € ð0 
Œ]×*Ñ*Ñ*Ü×,Ñ,¨RÑ0Ð0Ü‡M�M�F˜2˜$Ð2Ð3Ô4Ør   c                 óà   — t        j                  «       r t        j                  j	                  | | «      S d}t        j
                  |fi t        «       ¤Ž}|j                  |d| gid| gi¬«       y )NÚc_sync_calc_streamÚXÚOut)ÚtypeÚinputsÚoutputs)r   Úin_dynamic_modeÚpaddleÚ_legacy_C_opsrZ   ÚLayerHelperÚlocalsÚ	append_op)ÚtensorÚop_typeÚhelpers      r   Ú_sync_calc_streamri   å   sl   € Ü× Ñ Ô"Ü×#Ñ#×6Ñ6°v¸vÓFÐFà&ˆÜ×&Ñ& wÑ;´&³(Ñ;ˆØ×ÑØØ˜&˜�?Ø˜V˜HÐ%ð 	õ 	
r   c                 óî   — t        j                  «       r$t        j                  j	                  | g| gd|«      S d}t        j
                  |fi t        «       ¤Ž}|j                  |d| gid| gid|i¬«       y )NÚring_idÚc_sync_comm_streamr[   r\   ©r]   r^   r_   Úattrs)r   r`   ra   rb   rl   rc   rd   re   )rf   rk   rg   rh   s       r   Ú_sync_comm_streamro   ò   sƒ   € Ü× Ñ Ô"Ü×#Ñ#×6Ñ6ØˆH�v�h 	¨7ó
ð 	
ð 'ˆÜ×&Ñ& wÑ;´&³(Ñ;ˆØ×ÑØØ˜&˜�?Ø˜V˜HÐ%Ø˜gÐ&ð	 	õ 	
r   c                 ó~   — |�|j                  «       sy|rt        | «       y|€dn|j                  }t        | |«       y)a¯  

    wait to sync stream for group.

    Args:
        tensor (Tensor): The Tensor used before sync.
        group (Group): The Group instance to perform sync.
        use_calc_stream (bool): Wether to use calculation stream (True) or communication stream (False).
            Default to True.

    Returns:
        None.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle

            >>> paddle.distributed.init_parallel_env()
            >>> tindata = paddle.randn(shape=[2, 3])
            >>> paddle.distributed.all_reduce(tindata, sync_op=True)
            >>> paddle.distributed.wait(tindata)

    Nr   )r*   ri   r   ro   )rf   rD   Úuse_calc_streamrk   s       r   Úwaitrr     s:   € ð4 Ð §¡Ô!2ØáÜ˜&Õ!à�}‘!¨%¯(©(ˆÜ˜& 'Õ*r   c                 óæ  — | �| j                  «       syt        j                  «       r“| €
t        «       n| } t        j                  «       }t        |t        j                  «      r| j                  j                  «       }n+|j                  «       }| j                  j                  |«      }|j                  «        y| €dn| j                  }t        j                  dgdd¬«      }t        j                  «       r"t        j                  j                  ||d|«      S d}t        |t        «      st!        d«      ‚t        j"                  |fi t%        «       ¤Ž}|j'                  |d	|gid
|gid|i¬«       y)a*  

    Barrier among all participators in the group.

    Args:
        group (Group): The group instance return by new_group or None for global default group.

    Returns:
        None.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle
            >>> from paddle.distributed import init_parallel_env

            >>> paddle.set_device('gpu:%d'%paddle.distributed.ParallelEnv().dev_id)
            >>> init_parallel_env()
            >>> paddle.distributed.barrier()
    Nr   é   Úint32)Údtyperk   Úbarrierz,The type of 'group' for barrier must be int.r[   r\   rm   )r*   r   r`   rA   Ú_current_expected_placeÚ
isinstanceÚCPUPlacer!   rw   Úget_device_idrr   r   ra   Úfullrb   ÚintÚ
ValueErrorrc   rd   re   )rD   ÚplaceÚtaskÚ	device_idrk   Úbarrier_tensorrg   rh   s           r   rw   rw   &  sL  € ð, Ð §¡Ô!2Øä× Ñ Ô"Ø', }Ô!Ô#¸%ˆÜ×1Ñ1Ó3ˆÜ�eœY×/Ñ/Ô0Ø×&Ñ&×.Ñ.Ó0‰Dà×+Ñ+Ó-ˆIØ×&Ñ&×.Ñ.¨yÓ9ˆDØ�	‰	ŒØà�=‰a e§h¡h€Gä—[‘[ !  a¨wÔ7€NÜ× Ñ Ô"Ü×#Ñ#×+Ñ+Ø˜N¨I°wó
ð 	
ð ˆÜ˜'¤3Ô'ÜÐKÓLÐLÜ×&Ñ& wÑ;´&³(Ñ;ˆØ×ÑØØ˜.Ð)Ð*Ø˜^Ð,Ð-Ø˜gÐ&ð	 	õ 	
r   c                 óz   — t        | «      rt        d«      ‚| €t        «       } | j                  S | } | j                  S )aÃ  
    Get the backend of given group.

    Args:
        group (Group): The group to work on. Use the global group as default.

    Returns:
        Returns the name of the given group backend.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env: DISTRIBUTED)
            >>> import paddle

            >>> paddle.distributed.init_parallel_env()
            >>> paddle.distributed.get_backend()
            NCCL
    zInvalid group specified)rN   r@   rA   r&   rC   s    r   Úget_backendr„   ^  s@   € ô( # 5Ô)ÜÐ4Ó5Ð5à#( =ÔÓ€EØ�=‰=Ðð 7<€EØ�=‰=Ðr   r   )r   )NT)rK   ra   Úpaddle.distributedÚdistributedrI   r   r   r<   rA   rE   rG   rN   rQ   rS   rV   rX   ri   ro   rr   rw   r„   r:   r   r   Ú<module>r‡      sp   ðó ã Ý !Ý ÷Añ A÷Hñ ò
Hò4ò5òòòJó8'4óTò<

ó
ó !+óH5
ôpr   