
    RЦi                         S r SSKrSSKrSSKJr  SSKrSSKJr  SSKJ	r	  \R                  " \5      rS rSS jrS	 rS
 rSS jrS rS rS r   SS\S\\   S\\   4S jjrg)zYDistributed training/validation utils

Hacked together by / Copyright 2020 Ross Wightman
    N)Optional)distributed   )unwrap_modelc                     U R                  5       n[        R                  " U[        R                  R                  S9  X!-  nU$ )Nop)clonedist
all_reduceReduceOpSUM)tensornrts      U/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/utils/distributed.pyreduce_tensorr      s1    	BOOB4==,,-GBI    c                 <   [        U 5      R                  SS9 H  u  p4SU;   d  SU;   d  M  U(       aF  [        R                  R	                  U[
        R                  R                  S9  U[        U5      -  nM`  [        R                  R                  US5        M     g )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g%=G+C!!,,V8I8I,J%
++ !!++FA6 Kr   c                      U R                   S:H  $ Nr   )rankargss    r   is_global_primaryr(   %   s    99>r   c                      U R                   S:H  $ r$   )
local_rankr&   s    r   is_local_primaryr+   )   s    ??ar   c                 <    U(       a  [        U 5      $ [        U 5      $ )N)r+   r(   )r'   locals     r   
is_primaryr.   -   s    %*D!G0A$0GGr   c                      S[         R                  ;   a  [        [         R                  S   5      S:  $ S[         R                  ;   a  [        [         R                  S   5      S:  $ g)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                  x   Sn S H5  nU[         R                  ;   d  M  [        [         R                  U   5      n   O   SnS H5  nU[         R                  ;   d  M  [        [         R                  U   5      n  O   SnS H5  nU[         R                  ;   d  M  [        [         R                  U   5      n  O   XU4$ )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
 JO

?RZZ]+J P
 J..r   c           	      :   SU l         SU l        SU l        SU l        [	        [        U SS5      [        U SS 5      [        U SS 5      S9nUS   U l        US	   U l        US
   U l        US   U l        US   U l         [        R                  " U R                  5      nU$ )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                 j   SnSnSnSnU R                  SSS9tpxUc  SSSSS	.n	U	R                  US
5      nU=(       d    Sn[        5       (       Ga   S[        R                  ;   a  [        5       u  pen[        U5      [        R                  S'   [        U5      [        R                  S'   [        U5      [        R                  S'   [        R                  R                  UUUUS9  Oh[        5       u  n  n
[        R                  R                  UUS9  [        R                  R                  5       n[        R                  R                  5       nSnUS:X  a.  [        R                  R                  5       (       d   SU  S35       eUS:X  a.  [        R                  R                  5       (       d   SU  S35       eU(       a3  U S:w  a-  U(       a  [        R!                  SUS    SU  S35        U SU 3n U R#                  S5      (       a  [        R                  R%                  U 5        ['        U UUUUS9$ )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/JZ'*: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   