
    ]i                         S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrSSK	J
r
  \R                  " \5      r\" SS5      rS rS rSS	 jrS
 rS rS rg)    )
namedtupleN   )get_xpDistribSpecz5rank world_size local_rank node_rank num_nodes sourcec                     [        5       n U R                  S:X  a  gS[        R                  ;  a  S[        R                  ;   d   S5       e[        R                  S   n[        R
                  " SR                  5       U/-   SSS9R                  R                  5       R                  5       nUS	   nU[        R                  S'   S
[        R                  ;  a~  [        5       nUR                  n [        R                  " 5       nXVR                  -  n[        R                   " U5      nUR#                  SS5      n[%        U5      [        R                  S
'   S[        R                  ;  as  [%        U R                  5      [        R                  S'   [%        U R&                  5      [        R                  S'   [%        U R(                  5      [        R                  S'   gg! [         a     Nf = f)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	            I/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/dora/distrib.pyset_distrib_envr.      sx    D!BJJ&#rzz1E3EE1::230668H:E&*$88>vvx 	Ah$/

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

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

<  ^

6#&t#7

<  &  		s   /G 
G+*G+c                     S[         R                  ;   ar  [        [         R                  S   5      n [        [         R                  S   5      nS[         R                  ;   a  [        [         R                  S   5      nOU nSnSnSnOT [        R                  " 5       nUR
                  n UR                  nUR                  nUR                  nUR                  nSn[        XX#XE5      $ ! [         a    Sn SnSnSnSnSn N%f = f)	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t	RR  	DJJIIF	s   C( (D Dc                    [         R                  R                  5       (       a  g[        5       nUR                  S:X  a  [
        R                  S5        g[        5       n[         R                  R                  5       (       a*  [         R                  R                  UR                  5        OU S:w  d   eUR                  R                  (       a-  S[        R                  R!                  UR"                  5      -   nO[%        5         Sn[         R                  R'                  U UUR                  UR(                  S9  [
        R                  SUR(                  UR                  UR                  UR*                  5        UR                  R                  (       aH  [         R                  R-                  5         [)        5       S	:X  a  UR"                  R/                  5         ggg)
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   sQ    ''))D!56	Bzz  

doo.&   	ww"''//"2D2D"EE	((??YY	 ) 
 KK4		4??DOOT[[B 
ww!!#6Q;%%'      c                      [        5       S:H  $ Nr   )r"    rM   r-   	is_masterrQ      s    6Q;rM   c                      [         R                  R                  5       (       a  [         R                  R                  5       $ grO   )r<   r=   r>   get_rankrP   rM   r-   r"   r"      s/    ''))  ))++rM   c                      [         R                  R                  5       (       a  [         R                  R                  5       $ g)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[      sd    #  	     			8	$ JL"8J SF!(HrM   