Ë
    m«i¥  ã                   ó¸   — d Z ddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ  ej                   e«      Zdadad„ Zdd	„Zd
„ Zd„ Zdd„Zde	dœd„Zy)z Distributed training utilities.
é    N)ÚDistributedSampler)Ú
DataLoaderÚSubset)ÚDistributedDataParallel)Údistribé   c                  ó¸   — t         j                  j                  «       st        j                  «        t        j
                  «       at        j                  «       ay )N)ÚtorchÚdistributedÚis_initializedÚdora_distribÚinitÚrankÚ
world_size© ó    úH/var/www/stems/demucs_env/lib/python3.12/site-packages/demucs/distrib.pyr   r      s<   € ä×Ñ×+Ñ+Ô-Ü×ÑÔÜ×ÑÓ€DÜ×(Ñ(Ó*Jr   c                 ó  — t        | t        «      rCt        t        | j	                  «       «      Ž \  }}t        ||«      }t        t        ||«      «      S t        dk(  r| S t        j                  t        | «      dgz   dt        j                  ¬«      }||z  }t        j                  j                  |t        j                  j                  j                  ¬«       |d d |d   z  j                  «       j!                  «       j#                  «       S )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Ô ÜœF 7§=¡=£?Ó3Ð4‰ˆˆfÜ˜ Ó'ˆÜ”C˜˜fÓ%Ó&Ð&ÜQ‚ØˆÜ\‰\œ$˜w›-¨1¨#Ñ-°fÄEÇMÁMÔR€FØ
ˆeO€FÜ	×Ñ× Ñ  ¬E×,=Ñ,=×,FÑ,F×,JÑ,JÐ ÔKØ3BˆK˜& ™*Ñ$×)Ñ)Ó+×1Ñ1Ó3×:Ñ:Ó<Ð<r   c                 ó¦   — t         dk(  r| S t        | t        j                  j	                  «       gt        j                  j	                  «       ¬«      S )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                  óT   — t         dkD  rt        j                  j                  «        y y )Nr   )r   r
   r   Úbarrierr   r   r   r5   r5   8   s    € ÜA‚~Ü×Ñ×!Ñ!Õ#ð r   c                 ó@  — t         dk(  r| S t        j                  ddt        j                  ¬«      }t        |k(  r#t        j                  | «      }t        |«      |d<   t        j                  j                  ||¬«       t        |k(  rUt        j                  t        j                  t        j                  ¬«      j                  «       «      j                  «       }n7t        j                  |d   j!                  «       dt        j                  ¬«      }t        j                  j                  ||¬«       t        |k7  r?t        j"                  |j%                  «       j'                  «       j)                  «       «      } t*        j-                  dt        |«      › «       | S )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 ¬u¯z©zÔ:€DÜˆs‚{Ü|‰|˜CÓ ˆÜd“)ˆˆQ‰Ü	×Ñ×Ñ ¨#ÐÔ.ô ˆs‚{Ü×!Ñ!¤"§-¡-°¼B¿H¹HÔ"E×"JÑ"JÓ"LÓM×RÑRÓT‰ä—‘˜T !™WŸ\™\›^°FÄ%Ç+Á+ÔNˆÜ	×Ñ×Ñ ¨CÐÔ0ô ˆs‚{Ül‰l˜6Ÿ:™:›<×-Ñ-Ó/×7Ñ7Ó9Ó:ˆÜ
‡LLÐ)¬#¨f«+¨Ð7Ô8Ø€Jr   F)ÚshuffleÚklassc                óè   — t         dk(  r || g|¢­d|i|¤ŽS |rt        | «      } || g|¢­i |¤d|i¤ŽS t        | t        t	        t
        t        | «      t         «      «      «      }  || g|¢­d|i|¤ŽS )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Ò?Ð?ô ˜¤$¤u¬T´3°w³<ÄÓ'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^      sd   ðñã Û ã Û Ý ;ß /Ý Aå (à	ˆ×	Ñ	˜8Ó	$€Ø€Ø€
ò+ó
=ò7ò$ó
ð. $)°
õ @r   