
    kh                         d Z ddlZddlZddlmZ ddlZddlmZ ddlm	Z	  ej                  e      Zd ZddZd	 Zd
 ZddZd Zd Zd Z	 	 	 ddedee   dee   fdZy)zZ Distributed training/validation utils

Hacked together by / Copyright 2020 Ross Wightman
    N)Optional)distributed   )unwrap_modelc                     | j                         }t        j                  |t        j                  j                         ||z  }|S )Nop)clonedist
all_reduceReduceOpSUM)tensornrts      R/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/utils/distributed.pyreduce_tensorr      s3    	BOOB4==,,-!GBI    c                 0   t        |       j                  d      D ]x  \  }}d|v sd|v s|rHt        j                  j	                  |t
        j                  j                         |t        |      z  }Yt        j                  j                  |d       z y )NT)recurserunning_meanrunning_varr   r   )
r   named_bufferstorchr   r   r   r   r   float	broadcast)model
world_sizereducebn_namebn_bufs        r   distribute_bnr"      s    '.<<T<J 7g%=G+C!!,,V8I8I,J%
++ !!++FA67r   c                      | j                   dk(  S Nr   )rankargss    r   is_global_primaryr(   %   s    99>r   c                      | j                   dk(  S r$   )
local_rankr&   s    r   is_local_primaryr+   )   s    ??ar   c                 2    |rt        |       S t        |       S )N)r+   r(   )r'   locals     r   
is_primaryr.   -   s    %*D!G0A$0GGr   c                      dt         j                  v rt        t         j                  d         dkD  S dt         j                  v rt        t         j                  d         dkD  S y)N
WORLD_SIZEr   SLURM_NTASKSFosenvironint r   r   is_distributed_envr7   1   sO    rzz!2::l+,q00#2::n-.22r   c                  b   d} dD ]2  }|t         j                  v st        t         j                  |         }  n d}dD ]2  }|t         j                  v st        t         j                  |         } n d}dD ]2  }|t         j                  v st        t         j                  |         } n | ||fS )Nr   )
LOCAL_RANKMPI_LOCALRANKIDSLURM_LOCALIDOMPI_COMM_WORLD_LOCAL_RANK)RANKPMI_RANKSLURM_PROCIDOMPI_COMM_WORLD_RANKr   )r0   PMI_SIZEr1   OMPI_COMM_WORLD_SIZEr2   )r*   vglobal_rankr   s       r   world_info_from_envrE   9   s    J] 

?RZZ]+J
 KI 

?bjjm,K
 JO 

?RZZ]+J
 {J..r   c           	      >   d| _         d| _        d| _        d| _        t	        t        | dd      t        | dd       t        | dd             }|d   | _        |d	   | _        |d
   | _        |d   | _        |d   | _         t        j                  | j                        }|S )NFr   r   devicecudadist_backenddist_url)rG   rI   rJ   r   rD   r*   r   )r   r   r%   r*   init_distributed_device_sogetattrrG   r   )r'   resultrG   s      r   init_distributed_devicerN   O   s     DDODIDO'tXv.T>48z40F
 "DK\*DO}%DI\*DOm,D\\$++&FMr   rG   rI   rJ   c                 4   d}d}d}d}| j                  dd      ^}}|ddddd	}	|	j                  |d
      }|xs d}t               rdt        j                  v rt               \  }}}t        |      t        j                  d<   t        |      t        j                  d<   t        |      t        j                  d<   t        j                  j                  ||||       nkt               \  }}
}
t        j                  j                  ||       t        j                  j                         }t        j                  j                         }d}|dk(  r)t        j                  j                         sJ d|  d       |dk(  r)t        j                  j                         sJ d|  d       |r-| dk7  r(|rt        j!                  d|d    d|  d       | d| } | j#                  d      rt        j                  j%                  |        t'        | ||||      S )NFr   r   :)maxsplitcclhcclnccl)xpuhpurH   npugloozenv://r?   r9   r=   r0   )backendinit_methodr   r%   )rY   rZ   TrH   zCUDA is not available but z was specified.rW   z Ascend NPU is not available but cpuzdevice index z removed from specified (z).zcuda:)rG   rD   r*   r   r   )splitgetr7   r3   r4   rE   strr   r   init_process_groupget_world_sizeget_rankrH   is_availablerW   _loggerwarning
startswith
set_devicedict)rG   rI   rJ   r   r   rD   r*   device_type
device_idxdist_backends_s              r   rK   rK   d   s    KJKJ%||C!|<K* 	
 %((f=#8H RZZ'2E2G/JZ'*:BJJ|$!$[!1BJJv'*:BJJ|$00$$% 	 1   34J100$$ 1  **99;J++446Kfzz&&(^,Fvho*^^(eyy%%'c+KF8Sb)cc'v OOmJqM?:STZS[[]^_=*.!

f% r   )F)rH   NN)__doc__loggingr3   typingr   r   r   r   r   r   	getLogger__name__rc   r   r"   r(   r+   r.   r7   rE   rN   r^   rK   r6   r   r   <module>rq      s     	   % 
'

H
%
7 H/,, &*"&RRsmR 3-Rr   