
    ]i                         S r SSKrSSKrSSKrSSKrSSKJr  SSKJ	r	J
r
  SSKJr  SSKJr  \R                   " \5      rSqSqS rSS	 jrS
 rS rSS jrS\	S.S jrg)z Distributed training utilities.
    N)DistributedSampler)
DataLoaderSubset)DistributedDataParallel)distrib   c                      [         R                  R                  5       (       d  [        R                  " 5         [        R
                  " 5       q[        R                  " 5       qg )N)torchdistributedis_initializeddora_distribinitrank
world_size     K/mnt/rpi/tmp/demucs-venv-sys/lib/python3.13/site-packages/demucs/distrib.pyr   r      s?    ++--D((*Jr   c                    [        U [        5      (       a@  [        [        U R	                  5       5      6 u  p#[        X15      n[        [        X#5      5      $ [        S:X  a  U $ [        R                  " [        U 5      S/-   S[        R                  S9nXA-  n[        R                  R                  U[        R                  R                  R                  S9  US S US   -  R                  5       R!                  5       R#                  5       $ )Nr   cudadevicedtype)op)
isinstancedictzipsorteditemsaverager   r
   tensorlistfloat32r   
all_reduceReduceOpSUMcpunumpytolist)metricscountkeysvaluesr!   s        r   r    r        s    '4  F7==?34'C%&&Q\\$w-1#-fEMMRF
OF	  E,=,=,F,F,J,J K3BK&*$))+113::<<r   c                     [         S:X  a  U $ [        U [        R                  R	                  5       /[        R                  R	                  5       S9$ )Nr   )
device_idsoutput_device)r   r   r
   r   current_device)models    r   wrapr3   -   sA    Q&

1134**335	7 	7r   c                  V    [         S:  a  [        R                  R                  5         g g )Nr   )r   r
   r   barrierr   r   r   r5   r5   8   s     A~!!# r   c                 2   [         S:X  a  U $ [        R                  " SS[        R                  S9n[        U:X  a$  [
        R                  " U 5      n[        U5      US'   [        R                  R                  X!S9  [        U:X  aT  [        R                  " [        R                  " W[        R                  S9R                  5       5      R                  5       nO5[        R                  " US   R!                  5       S[        R                  S9n[        R                  R                  XAS9  [        U:w  a@  [
        R"                  " UR%                  5       R'                  5       R)                  5       5      n [*        R-                  S[        U5       35        U $ )Nr   r   r   r   )src)r   zShared object of size )r   r
   emptylongr   pickledumpslenr   	broadcast
from_numpynp
frombufferuint8copyr   itemloadsr'   r(   tobytesloggerdebug)objr7   sizedumpbuffers        r   sharerL   =   s   Q
;;quzz:Ds{||C d)Q	. s{!!"--BHH"E"J"J"LMRRTT!W\\^F%++N	0 s{ll6::<--/779:
LL)#f+78Jr   F)shuffleklassc                    [         S:X  a  U" U /UQ7SU0UD6$ U(       a  [        U 5      nU" U /UQ70 UDSU0D6$ [        U [        [	        [
        [        U 5      [         5      5      5      n U" U /UQ7SU0UD6$ )z
Create a dataloader properly in case of distributed training.
If a gradient is going to be computed you must set `shuffle=True`.
r   rM   sampler)r   r   r   r"   ranger   r<   )datasetrM   rN   argskwargsrP   s         r   loaderrU   T   s    
 QW?t?W???$W-W?t?v?w?? $uT3w<'L"MNW?t?W???r   )g      ?)Nr   )__doc__loggingr:   r(   r?   r
   torch.utils.data.distributedr   torch.utils.datar   r   torch.nn.parallel.distributedr   dorar   r   	getLogger__name__rF   r   r   r   r    r3   r5   rL   rU   r   r   r   <module>r^      sb        ; / A (			8	$
+
=7$
. $)
 @r   