o
    TiL                     @   s   d dl Z d dlmZ d dlmZ d dlZd dlZd dlmZ d dl	m
Z d dlmZ d dlmZ dd	 Zejjd
ee defddZeG dd dZ		dddZdddZdd ZdS )    N)	dataclass)List)Tensor)comm)get_accelerator)loggerc                 C   s   t  dkrt|  d S d S )Nr   )distget_rankr   info)msg r   U/home/ubuntu/.local/lib/python3.10/site-packages/deepspeed/runtime/zero/mics_utils.py
_log_rank0   s   r   tensorsscalec                 C   s   | D ]}| | qd S )N)div_)r   r   tr   r   r   scale_tensors   s   r   c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdS )MiCS_CommGroups N)__name__
__module____qualname____doc__param_shard_groupparam_shard_sizeparam_shard_rankparam_repli_groupparam_repli_sizeparam_repli_rankparam_intra_node_groupparam_inter_node_shard_groupr   r   r   r   r   !   s    r   Fc                    s  t tjdt  }td|  t }|dur"|| ks"J t	
 }t	 }t||| d}|d }	|d }
t|
dkrVt|	dksIJ d|	d D ]}|
|g qMt|
s^J d	t|	sfJ d
tdd |	D t	
 kswJ dt|	dkrt|	t|
d ksJ dt	 }|	D ],}t	|}||v r||_t||_t	||_td| d|j dt	j
|d  q|
D ]F}t|dkrt	|}||v r||_t||_t	j|d|_td| d|j dt	j
|d  qd|_d|_d|_td| d q|jt|	d ksJ |r|d }|dks#J dt|	d | dks0J t|	d | }g }g }|	D ]>}g }tdt||D ] ||  |   qJg }t|D ]  fdd|D }|| q_|| || q>td|  td|  |D ]}|D ]}t	|}||v r||_td|  qq|D ]}|D ]}t	|}||v r||_td|  qq|S )z
    create shard-group, replicate-group from config_file
    TODO: consider broadcast the config from rank0

    Returns:
        MiCS_CommGroups
    NDEV_PER_NODEz=creating MiCS communication groups with per node device size N   shard_groupsreplicate_groupsr   z6replicate groups are empty only for single shard groupz(replicate groups must have the same sizez$shard groups must have the same sizec                 S   s   g | ]}t |qS r   len).0gr   r   r   
<listcomp>V       z+create_mics_comm_groups.<locals>.<listcomp>zall sharded ranks zEnumber of shard groups must equal to the size of each replicate groupzrank z, shard group /)groupz replicate group z replicate group 0/1
span_nodesz>sharding spans on single node, no need for hierarchy allgatherc                    s   g | ]}|  qS r   r   )r)   _gir   r   r+      r,   z4create for hierarchy all-gather groups: intra nodes z4create for hierarchy all-gather groups: inter nodes z"create group for intra node ranks z"create group for inter node ranks )intosenvirongetr   device_countr   r   get_data_parallel_groupr   get_world_sizer	   _generate_mics_configr(   append_sizes_all_samesum	new_groupr   r   r   r   r
   r   r   r    ranger!   r"   )
shard_sizedp_grouphierarchical_allgathermpundevices_per_nodegroups
world_sizeglobal_rankconfigranks_of_shard_groupranks_of_repli_grouprshard_ranks_grouprepli_ranksn_span_nodesn_gpu_per_nodeintra_node_ranks_groupinter_node_ranks_groupshard_group_intra_node_ranks_inter_node_ranks_ranksintra_node_ranksinter_node_ranksr   r1   r   create_mics_comm_groups0   s   "










rY   r$   c           	         s   | | dksJ | | | dksJ d|  d| d| di }t | d|}g }t|D ]%}|dd|f  t}||  | fdd	td| D  q/||d
< | |d< t|d | |d< |S )a  Generating the configuration for sharding This shard config generation assume
    that the pipeline stages are partitioned in order, i.e., first ranks
    hold the stage0, etc.

    Args:

        shard_size (int): zero3 data-parallel shard size, FIXME:
        change the name later

        pp_size (int): pipeline parallel size, currently, only work with
        pipeline parallelism + zero

    r   z>dp group size is not dividable by dp_shard_size,  (world_size z
, pp_size z, dp_shard_size )r   Nc                    s   g | ]
}||   qS r   r   )r)   jreplicate_sizesame_shard_ranksr   r   r+      s    z)_generate_mics_config.<locals>.<listcomp>r&   r%   r/   )nparangereshaper?   tolistr(   extend)	rF   ndev_per_noder@   pp_sizerH   r%   r&   r2   n_ranksr   r\   r   r:      s,   $r:   c                 C   s,   d}| D ]}t |t | d kr dS q|S )zall groups have same lengthTr   Fr'   )rE   all_samer*   r   r   r   r<      s   r<   )FN)r$   )r4   dataclassesr   typingr   numpyr_   torchr   	deepspeedr   r   deepspeed.acceleratorr   deepspeed.utilsr   r   jitscriptr3   r   r   rY   r:   r<   r   r   r   r   <module>   s&   

s"