
    zj,                       d dl mZ d dlZd dlmZmZ d dlZd dlmZ	 d dlm
Z
 er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$dZd%d&dZd'd(dZd Zd'dZ	 d)d*d Zd%d&d!Zd%d+d#ZdS ),    )annotationsN)TYPE_CHECKINGLiteral)	framework)Tensor)ProcessGroupc                      e Zd ZdZ	 	 d d!dZed"d            Zed#d            Zed"d            Zed$d            Z	ed%d            Z
ed"d            Zed&d            Zed"d            Zd'dZd(dZd(dZd&dZdS ))Groupz/
    The abstract representation of group.
    Nrank_in_groupintidranks	list[int]pgProcessGroup | Nonename
str | NonereturnNonec                    || _         |dk    rt          |          nd| _        || _        || _        || _        || _        d S )Nr   )_rank_in_grouplen_world_size_id_ranks_pg_name)selfr   r   r   r   r   s         v/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/distributed/communication/group.py__init__zGroup.__init__"   sH     ,)6!););3u:::


    c                    | j         S N)r   r   s    r    rankz
Group.rank1   s    ""r"   c                    | j         S r$   )r   r%   s    r    r   zGroup.ranks5   s
    {r"   c                *    t          | j                  S r$   )r   r   r%   s    r    nrankszGroup.nranks9   s    4;r"   c                    | j         S r$   )r   r%   s    r    r   z
Group.name=   s
    zr"   r   c                    | j         S r$   )r   r%   s    r    process_groupzGroup.process_groupA   	    xr"   c                    | j         S r$   )r   r%   s    r    
world_sizezGroup.world_sizeE   s    r"   strc                4    | j                                         S r$   )r   r   r%   s    r    backendzGroup.backendI   s    x}}r"   c                    | j         S r$   )r   r%   s    r    r   zGroup.idM   r-   r"   boolc                :    | j         dk     rdS | j        dk     rdS dS )Nr   F   T)r&   r)   r%   s    r    	is_memberzGroup.is_memberQ   s'    9q==5;??5tr"   r&   int | Literal[-1]c                b    |                                  r| j                            |          S dS )Nr   )r7   r   indexr   r&   s     r    get_group_rankzGroup.get_group_rankX   s/    >> 	:##D)))2r"   c                H    |                                  r| j        |         S dS )a#  
        Get the global rank of a process within a group.

        Args:
            rank (int): The local rank within the group.

        Returns:
            If the current process is a member of the group, returns the corresponding global rank;
            otherwise returns -1.

        r   )r7   r   r;   s     r    get_global_rankzGroup.get_global_rank^   s(     >> 	:d##2r"   c                    d| j          d| j         d| j         d}|d                    t	          t
          | j                            z  }|dz  }|| j        r| j        ndz  }|S )Nzrank: z
, nranks: z, id: z	, ranks: z, z; name: r   )r&   r)   r   joinmapr0   r   r   )r   	debug_strs     r    __repr__zGroup.__repr__o   sv    OTYOO$+OOTWOOO 	 	TYYs3
33444	Z	$)7TYY7	r"   )NN)r   r   r   r   r   r   r   r   r   r   r   r   )r   r   )r   r   )r   r   )r   r   )r   r0   r   r4   )r&   r   r   r8   )__name__
__module____qualname____doc__r!   propertyr&   r   r)   r   r,   r/   r2   r   r7   r<   r>   rC    r"   r    r
   r
      s         #'     # # # X#    X       X     X    X       X     X    X         "     r"   r
   c                      e Zd ZdZi ZdS )_GroupManagerr   N)rE   rF   rG   global_group_idgroup_map_by_idrJ   r"   r    rL   rL   y   s        OOOOr"   rL   c                     t           j        t           j        vrt          d          t           j        t           j                 S )Nz$The global group is not initialized.)rL   rM   rN   RuntimeErrorrJ   r"   r    _get_global_grouprQ   ~   s3    $M,IIIABBB()FGGr"   c                    | j         t          j        v rt          d| j          d          | t          j        | j         <   d S )NzThe group with id z already exist.)r   rL   rN   rP   groups    r    _add_new_grouprU      sC    x=000IIIIJJJ.3M!%(+++r"   c                ,    | j         t          j        k    S r$   )r   rL   rM   rS   s    r    _is_global_grouprW      s    8}444r"   c                    t          j                    }| r5|                                 s!t          j        d| d| j                    dS dS )NzCurrent global rank z is not in group TF)distget_rankr7   warningswarnr   )rT   global_ranks     r    _warn_cur_rank_not_in_groupr^      s[    -//K U__&& M;MMMM	
 	
 	
 t5r"   c                f    |                     |           }|dk    sJ d|  d|j                     |S )Nr   zThe input rank z# can not be found inside the group )r<   r   )r]   rT   
group_ranks      r    _get_or_throw_group_rankra      sF    %%k22J???V+VV%*VV ?? r"   r   r4   c                 2    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

    )rL   rM   rN   rJ   r"   r    is_initializedrc      s    2 (M,IIIr"   rT   Group | Noner   c                    | t                      n| } | j        t          j        v sJ d| j         d            t	          |           r t          j                                         dS t          j        | j        = dS )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.)rQ   r   rL   rN   rW   clearrS   s    r    destroy_process_grouprg      s    @ $)=eE8}44447777 544  4%++-----)%(333r"   r   r   c                v    | t           j        v rt           j        |          S t          j        d|  d           dS )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)rL   rN   r[   r\   )r   s    r    	get_groupri      sA    0 
]***,R00M323334444r"   c                    t          j                    rt          j                            |           S d}t          j        |fi t                      }|                    |d| gid| gi           d S )Nc_sync_calc_streamXOut)typeinputsoutputs)r   in_dynamic_modepaddle_C_opssync_calc_streamLayerHelperlocals	append_op)tensorop_typehelpers      r    _sync_calc_streamr{     s     "" 	
}--f555&&w;;&((;;&?VH% 	 	
 	
 	
 	
 	
r"   c                    t          j                    r!t          j                            | g|          S d}t          j        |fi t                      }|                    |d| gid| gid|i           d S )Nc_sync_comm_streamrl   rm   ring_idrn   ro   rp   attrs)r   rq   rr   rs   sync_comm_streamru   rv   rw   )rx   r~   ry   rz   s       r    _sync_comm_streamr     s     "" 

}--vh@@@&&w;;&((;;&?VH%g&	 	 	
 	
 	
 	
 	
r"   Trx   r   use_calc_streamc                    ||                                 sdS |rt          |            dS |dn|j        }t          | |           dS )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): Whether 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   )r7   r{   r   r   )rx   rT   r   r~   s       r    waitr     s_    8 !2!2 +&!!!!!}!!%(&'*****r"   c                Z   | |                                  sdS t          j                    r| t                      n| } t          j                    }t          |t          j                  r| j                                        }n.|	                                }| j                            |          }|
                                 dS | dn| j        }t          j        dgdd          }t          j                    rGt          j        j                                        s"t          j                            ||d|          S dS d}t          |t"                    st%          d          t          j        |fi t)                      }|                    |d	|gid
|gid|i           dS )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(f'gpu:{paddle.distributed.ParallelEnv().dev_id}')
            >>> init_parallel_env()
            >>> paddle.distributed.barrier()
    Nr      int32)dtyper~   barrierz,The type of 'group' for barrier must be int.rl   rm   r   )r7   r   rq   rQ   _current_expected_place
isinstanceCPUPlacer,   r   get_device_idr   r   rr   fullcoreis_compiled_with_xpu_legacy_C_opsr   
ValueErrorru   rv   rw   )rT   placetask	device_idr~   barrier_tensorry   rz   s           r    r   r   E  s   , !2!2 "" 	',}!###%133eY/00 	:&..00DD++--I&..y99D		=aaehG[!aw777N "" 
$99;; 	'//	7  	 	
 '3'' 	MKLLL&w;;&((;;.)*^,-g&	 	 	
 	
 	
 	
 	
r"   r0   c                p    t          |           rt          d          | t                      n| } | 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)r^   rP   rQ   r2   rS   s    r    get_backendr     s@    ( #5)) 64555#(=eE=r"   rD   r$   )rT   rd   r   r   )r   )r   r   r   r
   )NT)rx   r   rT   rd   r   r4   r   r   )rT   rd   r   r0   )
__future__r   r[   typingr   r   rr   paddle.distributeddistributedrY   r   r   paddle.base.corer   r
   rL   rQ   rU   rW   r^   ra   rc   rg   ri   r{   r   r   r   r   rJ   r"   r    <module>r      s   # " " " " "  ) ) ) ) ) ) ) )  ! ! ! ! ! !       .------Y Y Y Y Y Y Y Yx       
H H H4 4 45 5 5    J J J J8'4 '4 '4 '4 '4T    <

 

 


 
 
 
 IM#+ #+ #+ #+ #+L7
 7
 7
 7
 7
t      r"   