Ë
    ëÓ^jÍ  ã            
       óä   — d Z ddlZddlmZ ddlZddlmZ defd„Z	de
fd„Zde
fd„Zdefd„Zd	ed
edededdf
d„Zdedee   fd„Zddeeej&                  f   dedeeej&                  f   fd„Zy)zIDistributed-training helpers (world-size, rank, all_gather, reduce_dict).é    N)ÚAnyÚreturnc                  óX   — t        j                  «       syt        j                  «       syy)zGReturn True if torch.distributed is available and has been initialised.FT)ÚdistÚis_availableÚis_initialized© ó    úg/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/rfdetr/utilities/distributed.pyÚis_dist_avail_and_initializedr      s#   € ä×ÑÔØÜ×ÑÔ ØØr
   c                  ó@   — t        «       syt        j                  «       S )z@Return the number of processes in the current distributed group.é   )r   r   Úget_world_sizer	   r
   r   r   r      s   € ä(Ô*ØÜ×ÑÓ Ð r
   c                  ó@   — t        «       syt        j                  «       S )z@Return the rank of the current process in the distributed group.r   )r   r   Úget_rankr	   r
   r   r   r   &   s   € ä(Ô*ØÜ�=‰=‹?Ðr
   c                  ó   — t        «       dk(  S )z-Return True if the current process is rank 0.r   )r   r	   r
   r   Úis_main_processr   -   s   € ä‹:˜‰?Ðr
   ÚobjÚfÚargsÚkwargsc                 óN   — t        «       rt        j                  | |g|¢­i |¤Ž yy)a†  Save *obj* to *f* only on the main process (rank 0).

    Safely saves objects, removing any callbacks that cannot be pickled.

    Args:
        obj: Object to save.
        f: File path or file-like object passed to ``torch.save``.
        *args: Additional positional arguments forwarded to ``torch.save``. **kwargs: Additional keyword arguments
        forwarded to ``torch.save``.
    N)r   ÚtorchÚsave)r   r   r   r   s       r   Úsave_on_masterr   2   s'   € ô ÔÜ�
‰
�3˜Ð+˜DÒ+ FÓ+ð r
   Údatac                 óv  — t        «       }|dk(  r| gS t        j                  t        j                  j	                  «       rdnd«      }t        j                  | «      }t        j                  t        |«      t        j                  |¬«      }|j                  «       }t        j                  |g|¬«      }t        |«      D �cg c]  }t        j                  dg|¬«      ‘Œ }}t        j                  ||«       |D �	cg c]  }	t        |	j                  «       «      ‘Œ }}	t!        |«      }
g }|D ]8  }|j#                  t        j$                  |
ft        j                  |¬«      «       Œ: ||
k7  rCt        j$                  |
|z
  ft        j                  |¬«      }t        j&                  ||fd¬«      }t        j                  ||«       g }t)        ||«      D ]X  \  }	}|j+                  «       j-                  «       j/                  «       d	|	 }|j#                  t        j0                  |«      «       ŒZ |S c c}w c c}	w )
zµRun all_gather on arbitrary picklable data (not necessarily tensors).

    Args:
        data: Any picklable object.

    Returns:
        List of data gathered from each rank.
    r   ÚcudaÚcpu)ÚdtypeÚdevice)r!   r   )Úsizer    r!   ©ÚdimN)r   r   r!   r   r   ÚpickleÚdumpsÚtensorÚ	bytearrayÚuint8ÚnumelÚranger   Ú
all_gatherÚintÚitemÚmaxÚappendÚemptyÚcatÚzipr   ÚnumpyÚtobytesÚloads)r   Ú
world_sizer!   Úbufferr'   Ú
local_sizeÚlocal_size_tensorÚ_Ú	size_listr"   Úmax_sizeÚtensor_listÚpaddingÚ	data_lists                 r   r,   r,   A   sÍ  € ô  Ó!€JØ�Q‚Øˆvˆô �\‰\¤E§J¡J×$;Ñ$;Ô$=™&À5ÓI€FÜ�\‰\˜$Ó€FÜ�\‰\œ) FÓ+´5·;±;ÀvÔN€Fð —‘“€JÜŸ™ j \¸&ÔAÐÜ;@ÀÓ;LÖM°a”—‘˜q˜c¨&Ö1ÐM€IÐMÜ‡O�O�IÐ0Ô1Ø.7Ö8 d”�T—Y‘Y“[Õ!Ð8€IÐ8Ü�9‹~€Hð
 €KØò WˆØ×Ñœ5Ÿ;™;¨ {¼%¿+¹+ÈfÔUÕVðWà�XÒÜ—+‘+ H¨zÑ$9Ð#;Ä5Ç;Á;ÐW]Ô^ˆÜ—‘˜F GÐ,°!Ô4ˆÜ‡O�O�K Ô(à€IÜ˜I {Ó3ò /‰ˆˆfØ—‘“×#Ñ#Ó%×-Ñ-Ó/°°Ð6ˆØ×ÑœŸ™ fÓ-Õ.ð/ð Ðùò+ Nùâ8s   ÃH1Ã< H6Ú
input_dictÚaveragec                 óº  — t        «       }|dk  r| S t        j                  «       5  g }g }t        | j	                  «       «      D ]'  }|j                  |«       |j                  | |   «       Œ) t        j                  |d¬«      }t        j                  |«       |r||z  }t        ||«      D ��ci c]  \  }}||“Œ
 }}}ddd«       |S c c}}w # 1 sw Y   S xY w)a7  Reduce values in *input_dict* across all processes.

    Args:
        input_dict: Dict whose values will be reduced.
        average: If True, compute the mean across ranks; otherwise compute the sum.

    Returns:
        Dict with the same keys as *input_dict*, with values averaged/summed across ranks.
    é   r   r#   N)
r   r   Úno_gradÚsortedÚkeysr0   Ústackr   Ú
all_reducer3   )rA   rB   r7   ÚnamesÚvaluesÚkÚvÚreduced_dicts           r   Úreduce_dictrO   n   sÔ   € ô  Ó!€JØ�A‚~ØÐÜ	�‰‹ñ =ØˆØˆä˜
Ÿ™Ó)Ó*ò 	)ˆAØ�L‰L˜ŒOØ�M‰M˜* Q™-Õ(ð	)ô —‘˜V¨Ô+ˆÜ�‰˜ÔÙØ�jÑ ˆFÜ),¨U°FÓ);×<¡  A˜˜1™Ð<ˆÑ<÷=ð Ðùó =÷=ð Ðús   ¦B
CÂ0C
Â=CÃ
CÃC)T)Ú__doc__r%   Útypingr   r   Útorch.distributedÚdistributedr   Úboolr   r-   r   r   r   r   Úlistr,   ÚdictÚstrÚTensorrO   r	   r
   r   ú<module>rY      sÁ   ðñ Pã Ý ã Ý  ð tó ð!˜ó !ð�#ó ð˜ó ð
,˜ð , ð ,¨Cð ,¸3ð ,À4ó ,ð*�Sð *˜T #™Yó *ñZ˜D  e§l¡lÐ!2Ñ3ð ¸dð ÈdÐSVÐX]×XdÑXdÐSdÑNeô r
   