o
    * i*5                     @  s  U d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	Z	d dl
mZ d dlmZ ddlmZmZmZ dd	lmZmZmZmZmZmZmZmZmZmZmZmZmZ ereed
 Z de!d< d dl"m#Z# g Z$da%dd Z&i a'd Z(i a)i a*da+g dZ,da-da.ej/ddZ0d a1dd Z2dd Z3dd Z4dd Z5dd Z6dd Z7d d! Z8d"d# Z9d$d% Z:d&d' Z;	 	 	dNd(d)Z<da=d*d+ Z>dde0d dfdOd8d9Z?dPd;d<Z@dQd>d?ZAi aBd@dA ZCdBdC ZDdDdE ZEdFdG ZFdRdSdJdKZGdRdSdLdMZHdS )T    )annotationsN)TYPE_CHECKINGLiteral)	TypeAlias)core)in_dynamic_mode   )Group_add_new_groupis_initialized)	_c_concat_c_identity_c_lookup_table_c_softmax_with_cross_entropy)_c_softmax_with_multi_label_cross_entropy_c_split_Linear_linear_mp_allreduce_parallel_embedding_parallel_linear_set_var_distributedsplit)glooncclxcclbkclflagcxr   _BackendList)
NCCLConfigc                   C  s   t stj a t S N)_global_envpaddledistributedZParallelEnv r$   r$   i/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/paddle/distributed/collective.py_get_global_env:   s   
r&   Z_default_pg)r   r   heterr   r   r   i  )secondsc                 C     | a d S r    )_default_backend)backendr$   r$   r%   _set_default_backendX      r,   c                 C  r)   r    )_default_store)storer$   r$   r%   _set_default_store]   r-   r0   c                  C  s.   t tvrt } t| jdtt| jtt < tS )Nr   )_global_env_gid
_group_mapr&   r	   ranklistrange
world_sizegenvr$   r$   r%   _get_group_mapb   s   r9   c                   C  s
   t  t S r    )r9   r1   r$   r$   r$   r%   _get_global_groupl   s   
r:   c                   C     t S r    _group_map_by_namer$   r$   r$   r%   _get_group_map_by_namep      r>   c                   C  s   t  sJ dt t S )NzZCall paddle.distributed.init_parallel_env first to initialize the distributed environment.)r   r>   _default_group_namer$   r$   r$   r%   _get_default_groupu   s   
rA   c                 C     | t vsJ |t | < d S r    )r2   )gidgroupr$   r$   r%   _set_group_map~      rE   c                 C  rB   r    r<   )namerD   r$   r$   r%   _set_group_map_by_name   rF   rH   c                 C  rB   r    )_group_map_backend)rD   r+   r$   r$   r%   _set_group_map_backend   rF   rJ   c                   C  s8   t  rtd7 attt jd S tt tt jd S )Nr   	   )r   _start_ring_idmaxr&   nringslenr9   r$   r$   r$   r%   _new_ring_id   s   rP   c	              	   C  s   d }	t  }
| tv sJ d|  d| dkr tj||||}	|	S | dkr3tj|||||
j||}	|	S | dkrDtj||
j|||}	|	S | dkrStj	||||}	|	S | dkrctj
|||||
j|}	|	S )NzUnsupported backend: .r   r   r   r   r   )r&   _valid_backend_listr   ZProcessGroupGloocreateZProcessGroupNCCLZ
pg_timeoutZProcessGroupCustomdevice_typeZProcessGroupBKCLZProcessGroupFlagcx)r+   r/   r3   r6   
group_name
pg_optionsgroup_idnccl_comm_init_optionnccl_configpgr8   r$   r$   r%   _new_process_group_impl   sF   
r[   c                 C  r)   r    )_custom_gid)rC   r$   r$   r%   _set_custom_gid   r-   r]   rankslist[int] | Noner+   Literal['nccl'] | Nonetimeoutdatetime.timedeltarX   intrY   NCCLConfig | Nonereturnr	   c                   sp  t  rtrtnt }tt| }|dkrA| du st| dkrAt }|j}|j}	|du r-t	n|}| du r5|	} t| t|	ksAJ dt| }
t
| } |
dkrj|| v rj|dkrWdn| |}t|t||
|d|||d	}nd}d}t||| ||d}|t|< |t|< |t|< t| |S |sd	}|d	ksJ d
t   j}t }|| vrtd|| }|t|< nft
| } | |}t| }t||| }|t|< |dkrt }||_||_ fdd| D |_ j|_d|_t rt j}t||| nt  rt! j}t"||| nt#d|S t  rt$j%dgddnt$j&dgddd}t$j'j(|dd t$j')| |S )a  

    Creates a new distributed communication group.

    Args:
        ranks (list): The global ranks of group members.
        backend (str): The backend used to create group, only nccl is supported now.
        timeout (datetime.timedelta, optional): The waiting timeout for store relevant options, default is 30 minutes.

    Returns:
        Group: The group instance.

    Examples:
        .. code-block:: python

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

            >>> paddle.distributed.init_parallel_env()
            >>> tindata = paddle.randn(shape=[2, 3])
            >>> gp = paddle.distributed.new_group([2, 4, 6])
            >>> paddle.distributed.all_reduce(tindata, group=gp, sync_op=False)

    r'   Nr   zQSize of new group must be less than or equal to that of the default global group.r   )rV   rW   rX   rY   )rZ   rG   r   z,backend other than nccl is not supported yet   c                   s   g | ]} j | qS r$   )trainer_endpoints).0ir7   r$   r%   
<listcomp>3  s    
znew_group.<locals>.<listcomp>zno cuda device foundZint32)ZdtypeT)Zsync_op)*r   r\   rP   r@   strrO   rA   r3   r^   r*   sortedindexr[   r.   r	   r=   r2   rI   r
   r&   r   ZParallelStrategyZnranksZ
local_rankrh   Zcurrent_endpointrN   Zis_compiled_with_cudaZ	CUDAPlace	device_idZNCCLParallelContextZinit_with_ring_idZis_compiled_with_xpuZXPUPlaceZBKCLParallelContextAssertionErrorr"   Z	to_tensorfullr#   Z
all_reducewait)r^   r+   ra   rX   rY   rC   rU   Zglobal_groupZglobal_rankZglobal_rankssizer3   rZ   rD   Zring_idgpZ
group_rankZ
group_sizeZstrategyZplacetmpr$   r7   r%   	new_group   s   !




rv   boolc                   C  s   t  S )a!  
    Check whether the distributed package is available.

    Returns:
        Returns True if the distributed package is available, otherwise False.

    Examples:
        .. code-block:: python

            >>> import paddle
            >>> print(paddle.distributed.is_available())

    )r   Zis_compiled_with_distr$   r$   r$   r%   is_availableT  s   rx   Nonec           
      C  sN  t  }t }|j}|j}|j}| dkrt j|d|| d S | dkrSd}|jD ]}||7 }q(|d	d7 }t
|jdd }t j| t j|d||| d S | dkrq|j}	tj|	 d	|  t j|d|||	 d S | d
krd}|jD ]}||7 }qz|d	d7 }t
|jdd }t j| t j|d||| d S d S )Nr   0r    z
ring_id:{}zUTF-8)encodingr   :r   )r   Zcreate_or_get_global_tcp_storer&   r3   r6   ro   ZCommContextManagerZcreate_gloo_comm_contextrh   formathashlibmd5encode	hexdigestZset_device_idZcreate_nccl_comm_contextrT   r"   ZdeviceZ
set_deviceZcreate_xccl_comm_contextZcreate_bkcl_comm_context)
r+   r/   Z
global_envr3   r6   Zdev_idZendpoints_strZendpointZendpoints_str_hashZdev_typer$   r$   r%   _init_parallel_enve  sX   








r   c                   C  r;   r    _shutdown_group_map_by_namer$   r$   r$   r%   _get_shutdown_group_map_by_name  r?   r   c                 C  s   |t | < d S r    r   )pg_namerD   r$   r$   r%   "_update_shutdown_group_map_by_name     r   c                 C  s
   t | = d S r    r   )r   r$   r$   r%   "_delete_shutdown_group_map_by_name  s   
r   c                   C  s   t   d S r    )r   clearr$   r$   r$   r%   !_clear_shutdown_group_map_by_name  r   r   rD   Group | Nonec                 C  s   t  }| d u r*t  D ]\}}|jd ur'||vr'|tkr'|j  t|| qd S | jd urA| j|vrC| j  t| j|  d S d S d S r    )r   r>   itemsprocess_groupr@   shutdownr   rG   )rD   shutdown_groupsr   rZ   r$   r$   r%   shutdown_process_group  s    






r   c                 C  sd   t  }| d u r| D ]}|j  qt  d S | jd ur.| j|v r0| j  t| j d S d S d S r    )r   valuesr   Zrestartr   rG   r   )rD   r   rZ   r$   r$   r%   restart_process_group  s   

r   )r   r   N)r^   r_   r+   r`   ra   rb   rX   rc   rY   rd   re   r	   )re   rw   )r+   r   re   ry   r    )rD   r   re   ry   )I
__future__r   datetimer   typingr   r   Ztyping_extensionsr   r"   Zpaddle.baser   Zpaddle.frameworkr   Zcommunication.groupr	   r
   r   Zfleet.layers.mpu.mp_opsr   r   r   r   r   r   r   r   r   r   r   r   r   r   __annotations__Zpaddle.base.libpaddler   __all__r!   r&   r2   r1   r=   rI   r@   rR   r.   r*   	timedeltaZ_default_timeoutrL   r,   r0   r9   r:   r>   rA   rE   rH   rJ   rP   r[   r\   r]   rv   rx   r   r   r   r   r   r   r   r   r$   r$   r$   r%   <module>   st   <	
	
/ 

+