o
    پi                     @   sR   d dl Z G dd dZG dd deZe Z	ddedeee  d	efd
dZdS )    Nc                       s    e Zd ZdZ fddZ  ZS )	SingletonNc                    s,   | j stt| j| g|R i || _ | j S N)	_instancesuperr   __new__)clsargskwargs	__class__ m/home/ubuntu/.local/lib/python3.10/site-packages/sglang/multimodal_gen/runtime/distributed/parallel_groups.pyr   
   s    zSingleton.__new__)__name__
__module____qualname__r   r   __classcell__r   r   r
   r   r      s    r   c                   @   s   e Zd Zdd ZdS )ProcessGroupSingletonc                 C   s   d | _ d | _d S r   )
ULYSSES_PGRING_PG)selfr   r   r   __init__   s   
zProcessGroupSingleton.__init__N)r   r   r   r   r   r   r   r   r      s    r   Trank	sp_groupsuse_ulysses_lowc                    s  ||    dks
J t  fdd|D s$J d  ddd |D  d}d}|}| }d	tt d
tt dtt fdd}	|D ]}
|rt|D ] }tt||  |d |  }|	|
|}tj|}||v rg|}qGt|D ]}tt| |}|	|
|}tj|}||v r|}qlq?t|D ] }tt|| |d | }|	|
|}tj|}||v r|}qt|D ]}tt| |}|	|
|}tj|}||v r|}qq?|t_|t_	dS )a  Create Ulysses/Ring process groups inside each SP group.

    This is required when TP>1, because SP groups are not necessarily made of
    consecutive global ranks (e.g., tp-sp order makes SP ranks strided).

    Args:
        sp_ulysses_degree: ulysses degree inside SP.
        sp_ring_degree: ring degree inside SP.
        rank: global rank of current process.
        sp_groups: list of global-rank lists for each SP group.
        use_ulysses_low: keep the same semantics as the original function.
    r   c                 3   s    | ]	}t | kV  qd S r   len.0g	sp_degreer   r   	<genexpr>.   s    
z3set_seq_parallel_pg_by_sp_groups.<locals>.<genexpr>zEach SP group must have size z, got sizes c                 S   s   g | ]}t |qS r   r   r   r   r   r   
<listcomp>0       z4set_seq_parallel_pg_by_sp_groups.<locals>.<listcomp>Nranksindicesreturnc                    s    fdd|D S )Nc                    s   g | ]} | qS r   r   )r   ir$   r   r   r"   9   r#   zSset_seq_parallel_pg_by_sp_groups.<locals>._map_indices_to_ranks.<locals>.<listcomp>r   )r$   r%   r   r(   r   _map_indices_to_ranks8   s   z?set_seq_parallel_pg_by_sp_groups.<locals>._map_indices_to_ranks   )
alllistintrangetorchdistributed	new_groupPROCESS_GROUPr   r   )sp_ulysses_degreesp_ring_degreer   r   r   ulyssess_pgring_pgnum_ulysses_pgsnum_ring_pgsr)   sp_ranksr'   idxulysses_ranksgroup
ring_ranksr   r   r    set_seq_parallel_pg_by_sp_groups   s\   
"




r>   )T)r/   r   r   r2   r-   r,   boolr>   r   r   r   r   <module>   s   	
