
    mi                         d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZddl	m
Z
  ej                  e      Z edd      Zd Zd Zdd	Zd
 Zd Zd Zy)    )
namedtupleN   )get_xpDistribSpecz5rank world_size local_rank node_rank num_nodes sourcec                     t               } | j                  dk(  rydt        j                  vrdt        j                  v sJ d       t        j                  d   }t	        j
                  dj                         |gz   dd      j                  j                         j                         }|d	   }|t        j                  d<   d
t        j                  vr}t               }|j                  }	 t        j                         }||j                  z  }t        j                   |      }|j#                  dd      }t%        |      t        j                  d
<   dt        j                  vrst%        | j                        t        j                  d<   t%        | j&                        t        j                  d<   t%        | j(                        t        j                  d<   yy# t        $ r Y w xY w)a  Calling this function will set the distributed environement
    including the master addr, master port etc. You shouldn't call
    this if you call `dora.distrib.init`, but it can be useful if you need to let
    some other framework handle the distributed initialization.
    r   NMASTER_ADDRSLURM_JOB_NODELISTzcase not handledzscontrol show hostnamesT)capture_outputcheckr   MASTER_PORTi N  i`  
WORLD_SIZERANK
LOCAL_RANK)get_distrib_spec
world_sizeosenvironsprunsplitstdoutdecoder   sigsubmititJobEnvironmentjob_idRuntimeErrorrandomRandomrandintstrrank
local_rank)	specnodelistnodesmaster_nodexpseedenvrngmaster_ports	            F/var/www/stems/demucs_env/lib/python3.12/site-packages/dora/distrib.pyset_distrib_envr.      sz    D!BJJ&#rzz1E3EE1::230668H:E&*$88>vvx 	Ah$/

=!BJJ&X vv	))+C CJJDmmD!kk%/$'$4

=!2::%#&t#7

<  ^

6#&t#7

<  &  		s   *G 	G"!G"c                     dt         j                  v rpt        t         j                  d         } t        t         j                  d         }dt         j                  v rt        t         j                  d         }n| }d}d}d}nS	 t        j                         }|j
                  } |j                  }|j                  }|j                  }|j                  }d}t        | |||||      S # t        $ r d} d}d}d}d}d}Y 'w xY w)	zReturn information on the distributed setup, i.e. world size, rank etc.
    This can be used even before distributed training is initialized, which is useful for
    PytorchLightning for instance.
    r   r   r   r   r   r*   r   empty)r   r   intr   r   global_rank	num_tasksr#   node	num_nodesr   r   )r"   r   r#   	node_rankr5   sourcer*   s          r-   r   r   >   s    
 rzz!2::f%&L12
2::%RZZ56JJ			 ))+C ??DJJIIFtZY	6RR  	DJJIIF	s   C& &C>=C>c                    t         j                  j                         ryt               }|j                  dk(  rt
        j                  d       yt               }t         j                  j                         r*t         j                  j                  |j                         n| dk7  sJ |j                  j                  r-dt        j                  j!                  |j"                        z   }nt%                d}t         j                  j'                  | ||j                  |j(                         t
        j                  d|j(                  |j                  |j                  |j*                         |j                  j                  rGt         j                  j-                          t)               d	k(  r|j"                  j/                          yyy)
z
    Initialize DDP.
    Nr   zworld_size is 1, skipping init.ncclzfile://zenv://)backendinit_methodr   r"   z*Distributed init: %d/%d (local %d) from %sr   )torchdistributedis_initializedr   r   loggerinfor   cudais_available
set_devicer#   dorause_rendezvousr   pathabspathrendezvous_filer.   init_process_groupr"   r7   barrierunlink)r:   r$   r(   r;   s       r-   initrL   a   sK    '')D!56	Bzz 

doo.&   	ww"''//"2D2D"EE	((??YY	 ) 
 KK4		4??DOOT[[B 
ww!!#6Q;%%'      c                      t               dk(  S Nr   )r"    rM   r-   	is_masterrQ      s    6Q;rM   c                  |    t         j                  j                         rt         j                  j                         S yrO   )r<   r=   r>   get_rankrP   rM   r-   r"   r"      s,    '')  ))++rM   c                  |    t         j                  j                         rt         j                  j                         S y)Nr   )r<   r=   r>   get_world_sizerP   rM   r-   r   r      s,    '')  //11rM   )r9   )collectionsr   loggingr   r   
subprocessr   r   r<   r(   r   	getLogger__name__r?   r   r.   r   rL   rQ   r"   r   rP   rM   r-   <module>r[      sf    #  	     			8	$ JL"8J SF!(HrM   