
    Ph                        d dl Z d dlmZmZmZmZ d dlZd dlmZ	 d dlm
Z
mZ g dZdeej                  j                     de
fdZdeeej                  j                     eeeej                  j                  f      f   fdZdeeej                  j                     eeeej                  j                  f      f   de
fd	Zy)
    N)UnionIterableDictIterator)ProcessGroupgroup)average_parametersget_params_to_average&average_parameters_or_parameter_groupsparamsprocess_groupc                    ||nt         j                  }t        j                  |      ryt	        j
                  |       \  }}t        j                  |D cg c]  }|j                  j                  d       c}      }|t        j                  |      z  }t        j                  j                         rt        j                  j                          t        j                  ||       d}|D ]N  }||||j                         z    j!                  |      j#                  |      |_        ||j                         z  }P yc c}w )z
    Averages all the given parameters.
    For allreduce efficiency, all the parameters are flattened into a contiguous buffer.
    Thus, it requires extra memory of the same size as the given parameters.
    N)r   r   )r   WORLDdist_rank_not_in_group	itertoolsteetorchcatdatareshapeget_world_sizecudais_availablesynchronize
all_reducenumelview_astype_as)r   r   group_to_use
params_it1
params_it2pflat_paramsoffsets           }C:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/distributed/algorithms/model_averaging/utils.pyr	   r	      s     %2$==5;;L|,&]]62J
 ))DAQVV^^B/DEK4&&|44Kzz 

 OOK|4FVfqwwy&89AA!DLLQO!'')  Es   "E c                 B   g }| D ]  }t        |t        j                  j                        r!|}|j                  6|j                  |       Ht        |t              r)|d   D ]   }|j                  |j                  |       " t        dt        |       d       |S )z
    Returns a list of parameters that need to average, which filters out the parameters that do not contain any gradients.
    Args:
        params: The parameters of a model or parameter groups of an optimizer.
    r   zParameter input of type z is not supported)	
isinstancer   nn	ParametergradappenddictNotImplementedErrortype)r   filtered_paramsparam
param_datas       r'   r
   r
   ,   s     OeUXX//0J*&&z2t$#Ho
??.#**:6 . &(@eM^&_``      c                 @    t        t        t        |             |       y)zM
    Averages parameters of a model or parameter groups of an optimizer.
    N)r	   iterr
   )r   r   s     r'   r   r   C   s     t1&9:MJr4   )r   typingr   r   r   r   r   torch.distributeddistributedr   r   r   __all__r*   r+   r	   strr
   r    r4   r'   <module>r=      s     2 2    2
cUXX''(9E<%1C1C(DhtTWY^YaYaYkYkTkOlFm(m"n .K5%((BTBT9UW_`dehjojrjrj|j|e|`}W~9~3 K  Q] Kr4   