
    Vhm                        d dl Z d dlmZmZ d dl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)IterableIterator)Union)groupProcessGroup)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acceleratoris_availablesynchronize
all_reducenumelview_astype_as)r   r   group_to_use
params_it1
params_it2pflat_paramsoffsets           b/home/dcms/DCMS/lib/python3.12/site-packages/torch/distributed/algorithms/model_averaging/utils.pyr   r      s     %2$==5;;L|,&]]62J
 ))DAQVV^^B/DEK4&&|44K%%'%%'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
    Return a list of parameters that need to average.

    This 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	   6   s     O eUXX//0J*&&z2t$#Ho 7
??.#**:67 &*4;-7HI      c                 @    t        t        t        |             |       y)zCAverages parameters of a model or parameter groups of an optimizer.N)r   iterr	   )r   r   s     r&   r
   r
   V   s     t1&9:MJr3   )r   collections.abcr   r   typingr   r   torch.distributeddistributedr   r   r   __all__r)   r*   r   r-   strr	   r
    r3   r&   <module>r=      s     .    
 2UXX''(9E>##$c588---./	1@K##$htC9K9K4K/L&MMK  	Kr3   