U
    Jc                     @   s   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 dddgZeejj e
dddZeeejj eeeejjf  f d	d
dZeeejj eeeejjf  f e
dddZdS )    N)UnionIterableDictIterator)ProcessGroupgroupaverage_parametersget_params_to_average&average_parameters_or_parameter_groupsparamsprocess_groupc                 C   s   |dk	r|nt j}t|r dS t| \}}tdd |D }|t| }tj	
 rdtj	  tj||d d}|D ]2}||||   |||_|| 7 }qzdS )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.
    Nc                 S   s   g | ]}|j d qS ))dataZreshape).0p r   V/tmp/pip-unpacked-wheel-gikjz4vx/torch/distributed/algorithms/model_averaging/utils.py
<listcomp>   s     z&average_parameters.<locals>.<listcomp>)r   r   )r   ZWORLDdistZ_rank_not_in_group	itertoolsteetorchcatZget_world_sizeZcudaZis_availableZsynchronizeZ
all_reduceZnumelZview_asZtype_asr   )r   r   Zgroup_to_useZ
params_it1Z
params_it2Zflat_paramsoffsetr   r   r   r   r      s    


")r   c                 C   s|   g }| D ]n}t |tjjr4|}|jdk	rv|| qt |trb|d D ]}|jdk	rF|| qFqtdt| dq|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.
    Nr   zParameter input of type z is not supported)	
isinstancer   nn	ParameterZgradappenddictNotImplementedErrortype)r   Zfiltered_paramsparamZ
param_datar   r   r   r	   ,   s    


c                 C   s   t tt| | dS )zM
    Averages parameters of a model or parameter groups of an optimizer.
    N)r   iterr	   r   r   r   r   r
   C   s    )r   typingr   r   r   r   r   Ztorch.distributedZdistributedr   r   r   __all__r   r   r   strr	   r
   r   r   r   r   <module>   s   

 .