o
    pi                     @  s   d dl mZ d dlZd dlZd dlZddlmZ ddlmZ ddl	m
Z
 eejZi ai ai adad	ad
adZg dZdd Zdd Zdd ddZ	d!ddZejdd Zdd ZdS )"    )annotationsN   )
get_logger   )#retrieve_unique_id_for_process_mesh)_get_idx_in_axisF*       )      %   I   c                   C  s   t S )N_enable_random_control r   r   n/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddle/distributed/auto_parallel/random.pyis_enable_auto_rand_ctrl'   s   r   c                   C  s   da d S )NTr   r   r   r   r   enable_auto_rand_ctrl,   s   r   seedintnamestrreturnNonec                 C  s   t   | a|adS )a  Enable auto parallel random control.
    Random control maintain the randomness when tensor is distributed across devices on a Mesh(any order).
        * Independency: If tensor is **Sharded** on a Mesh dimension, Devices along that Mesh dimension should have Different randomness.

        * Consistency:  Meanwhile if the tensor is **Replicated** on another Mesh dimension, randomness of Devices along that Mesh dimension should be Consistent.

    For instance: rank0 ~ rank7 consist a Mesh of shape of [2, 4]; A 2D tensor is distributed in that Mesh using dims_mapping [-1, 1].
    Randomness for rank0-rank1-rank2-rank3 (rank4-rank5-rank6-rank7) should be Independent;
    Randomness for rank0 and rank4 (rank1 and rank5, ...) should be Consistent.

    This function should be called only once before auto parallel compiles the computation graph (e.g. auto_parallel.engine.prepare() or fit()).

    This seed only affects how randomness-relative **operators** (dropout, fuse op with dropout inside, etc) are execute among mesh, and would NOT affect other process like Parameter initialization.

    Examples:
        # seed relative to training step
        auto_parallel_random_seed((step + 13) * 257)
        ...
        engine.prepare()
    N)r   _basic_seed_basic_name)r   r   r   r   r   parallel_manual_seed1   s   r   c                 C  s  |d usJ d|d us|d usJ d|d ur |d ur J dt |jdkr.td| t}t}|r8|d7 }t|j|j}|d|  }|t|d  7 }tt |jD ]4}|d ur_||vsi|d url|| 	 sld	}	n	t
|j|j|| }	|d
| d|	 7 }|t| |	d  7 }qU|tv rt| |ksJ |S |t vsJ d| d| dt |t|< t rt }
t| t t|< t|
 |S )NzMust provide process meshz/Must provide one of dims mapping or placements.z8Cannot provide dims mapping and placements at same time.   zGAuto Parallel Random Control for Mesh's rank > 4 is NOT supported! Got _zmesh:r   Z_dim:zSeed Conflict! current seed: z, current sharding expr: z, generated seed: )lenshapeNotImplementedErrorr   r   r   Zprocess_ids_mesh_offsetrangeZis_shardr   _dim_offsets_rng_name_to_seedvaluespaddleZin_dynamic_modeget_rng_stater   _rng_name_to_statesset_rng_state)ZrankZdims_mappingprocess_meshZ
placementsZseed_Zname_	unique_idZsharding_expriZrelative_idxorig_rng_stater   r   r   determinate_rngN   sZ   

r2   c              	   c  sl    | t v sJ d|  dt }tt |   zd V  W t t | < t| d S t t | < t| w )NzThe rng state name z haven't been init. )r,   r*   r+   r-   )r   r1   r   r   r   	rng_state   s   

r3   c                  C  sh   t  sd S t D ](\} }| tv rt|  |ksJ q	td|  d|  tjj	| | |t| < q	d S )NzInit Auto Parallel RNG: z, with seed )
r   r(   items_inited_rng_name_to_seed_loggerinfor*   Z	frameworkrandomZset_random_seed_generator)Zrng_namer   r   r   r   init_auto_parallel_rng   s   
r9   )r	   )r   r   r   r   r   r   )NNN)
__future__r   
contextlibloggingr*   Zutils.log_utilsr   r.   r   Zstatic.utilsr   INFOr6   r(   r,   r5   r   r   r   r%   r'   r   r   r   r2   contextmanagerr3   r9   r   r   r   r   <module>   s0   

C
