
    sg              
           d dl m Z  d dlmZmZ d dlZd dlmc mc mZ	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d dlmZ dgZd	ej*                  d
edeeeeef   f   dej*                  fdZy)    fnmatch)DictUnionN)
DeviceMesh)is_rng_supported_meshTensorParallelRNGTracker)_validate_tp_mesh_dim)ParallelStyleparallelize_modulemoduledevice_meshparallelize_planreturnc                 J  
 t         j                  j                  d       t        |       t	        |      rrt        t        j                  t              sTt        |j                        t        _        t        j                  j                  |d       dt        j                  _        t        |t              r|j                  | |      S t        |t              r|j                         D ]  \  }}|j!                  d      }t#        |      dk(  rt%        d      |s3|j'                  d      
t)        
fd| j+                               }|D ]5  \  }}|r!dj-                  |      }	t/        |||	|i       )t/        |||       7 |rk | S t1        d	t3        |       d
      )a  
    Apply Tensor Parallelism in PyTorch by parallelizing modules or sub-modules based on a user-specified plan.

    We parallelize module or sub_modules based on a parallelize_plan. The parallelize_plan contains
    :class:`ParallelStyle`, which indicates how user wants the module or sub_module
    to be parallelized.

    User can also specify different parallel style per module fully qualified name (FQN).

    Note that ``parallelize_module`` only accepts a 1-D :class:`DeviceMesh`, if you have a 2-D or N-D :class:`DeviceMesh`,
    slice the DeviceMesh to a 1-D sub DeviceMesh first then pass to this API(i.e. ``device_mesh["tp"]``)

    Args:
        module (:class:`nn.Module`):
            Module to be parallelized.
        device_mesh (:class:`DeviceMesh`):
            Object which describes the mesh topology
            of devices for the DTensor.
        parallelize_plan (Union[:class:`ParallelStyle`, Dict[str, :class:`ParallelStyle`]]):
            The plan used to parallelize the module. It can be either a
            :class:`ParallelStyle` object which contains how
            we prepare input/output for Tensor Parallelism or it can be a
            dict of module FQN and its corresponding :class:`ParallelStyle` object.
    Return:
        A :class:`nn.Module` object parallelized.

    Example::
        >>> # xdoctest: +SKIP("distributed")
        >>> from torch.distributed.tensor.parallel import parallelize_module, ColwiseParallel
        >>> from torch.distributed.device_mesh import init_device_mesh
        >>>
        >>> # Define the module.
        >>> m = Model(...)
        >>> tp_mesh = init_device_mesh("cuda", (8,))
        >>> m = parallelize_module(m, tp_mesh, {"w1": ColwiseParallel(), "w2": RowwiseParallel()})
        >>>

    .. note:: For complex module architecture like Attention, MLP layers, we recommend composing
        different ParallelStyles together (i.e. ``ColwiseParallel`` and ``RowwiseParallel``) and pass
        as a parallelize_plan, to achieves the desired sharding computation.
    z4torch.distributed.tensor.parallel.parallelize_modulei  )	base_seedF.r   z9Expect module path to be non-empty, but got empty string!c                 "    t        | d         S )Nr   r   )tatoms    X/var/www/html/venv/lib/python3.12/site-packages/torch/distributed/tensor/parallel/api.py<lambda>z$parallelize_module.<locals>.<lambda>a   s    gadD1     zLExpect Union[ParallelStyle, Dict[str, ParallelStyle]] for parallelize_plan, z found!)torch_C_log_api_usage_oncer
   r   
isinstancerandom_rng_trackerr	   device_type_manual_seeddistribute_region_enabledr   _applydictitemssplitlen
ValueErrorpopfilternamed_childrenjoinr   	TypeErrortype)r   r   r   module_pathparallelize_stylepath_splitsmatched_children_	submodule	leaf_pathr   s             @r   r   r      s   \ 
HH  !WX+& [)*53 7{7N7NO(((E 9>5"M2&&v{;;	$d	+.>.D.D.F 	V*K*%++C0K;1$ O  "q)#)1))+$  %5 VLAy"$'HH'%	 +%{Y@Q4R
 +9kCTUV 	V4 ""&'7"8!9B
 	
r   )r   typingr   r   r    torch.distributed.tensor._randomdistributedtensor_randomr   torch.nnnntorch.distributed.tensorr   r   r	   (torch.distributed.tensor.parallel._utilsr
   'torch.distributed.tensor.parallel.styler   __all__Modulestrr    r   r   <module>rD      s~       1 1  / K A 
`
II`
`
 M4]0B+CCD`
 YY	`
r   